Merge remote-tracking branch 'origin/4.14' into 4.15
diff --git a/.travis.yml b/.travis.yml
index 18564f9..8b2859a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,10 +27,14 @@
 python:
   - "2.7"
 
+node_js:
+  - 12
+
 cache:
   directories:
     - $HOME/.m2
   timeout: 500
+  npm: false
 
 notifications:
   email: false
diff --git a/INSTALL.md b/INSTALL.md
index 90a5196..6fc022b 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -28,6 +28,12 @@
     # echo export PATH=/usr/local/maven/bin:${PATH} >> ~/.bashrc # or .zshrc or .profile
     # source ~/.bashrc
 
+Setup up NodeJS (LTS):
+
+    # curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
+    # sudo yum install nodejs
+    # sudo npm install -g @vue/cli npm-check-updates
+
 Start the MySQL service:
 
     $ service mysqld start
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
index c56bc98..858f100 100644
--- a/PULL_REQUEST_TEMPLATE.md
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -1,5 +1,7 @@
-## Description
-<!--- Describe your changes in detail -->
+### Description
+
+This PR...
+<!--- Describe your changes in DETAIL - And how has behaviour functionally changed. -->
 
 <!-- For new features, provide link to FS, dev ML discussion etc. -->
 <!-- In case of bug fix, the expected and actual behaviours, steps to reproduce. -->
@@ -8,17 +10,39 @@
 <!-- For addressing multiple issues/PRs, use multiple "Fixes: #<id>" -->
 <!-- Fixes: # -->
 
-## Types of changes
-<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
+<!--- ********************************************************************************* -->
+<!--- NOTE: AUTOMATATION USES THE DESCRIPTIONS TO SET LABELS AND PRODUCE DOCUMENTATION. -->
+<!--- PLEASE PUT AN 'X' in only **ONE** box -->
+<!--- ********************************************************************************* -->
+
+### Types of changes
+
 - [ ] Breaking change (fix or feature that would cause existing functionality to change)
 - [ ] New feature (non-breaking change which adds functionality)
 - [ ] Bug fix (non-breaking change which fixes an issue)
 - [ ] Enhancement (improves an existing feature and functionality)
 - [ ] Cleanup (Code refactoring and cleanup, that may add test cases)
 
-## Screenshots (if appropriate):
+### Feature/Enhancement Scale or Bug Severity
 
-## How Has This Been Tested?
+#### Feature/Enhancement Scale
+
+- [ ] Major
+- [ ] Minor
+
+#### Bug Severity
+
+- [ ] BLOCKER
+- [ ] Critical
+- [ ] Major
+- [ ] Minor
+- [ ] Trivial
+
+
+### Screenshots (if appropriate):
+
+
+### How Has This Been Tested?
 <!-- Please describe in detail how you tested your changes. -->
 <!-- Include details of your testing environment, and the tests you ran to -->
 <!-- see how your change affects other areas of the code, etc. -->
diff --git a/agent/bindir/cloud-guest-tool.in b/agent/bindir/cloud-guest-tool.in
index c1a0b00..fcfbc22 100755
--- a/agent/bindir/cloud-guest-tool.in
+++ b/agent/bindir/cloud-guest-tool.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # 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
@@ -78,7 +78,7 @@
         info['network'] = 'guest-network-get-interfaces'
 
         result = dict()
-        for key, cmd in info.items():
+        for key, cmd in list(info.items()):
             result[key] = self.virt.agent_command(self.dom, cmd)
 
         return result, 0
diff --git a/agent/bindir/cloud-setup-agent.in b/agent/bindir/cloud-setup-agent.in
index 3c6203c..fd79559 100755
--- a/agent/bindir/cloud-setup-agent.in
+++ b/agent/bindir/cloud-setup-agent.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -31,34 +31,34 @@
 from optparse import OptionParser
 
 def getUserInputs():
-    print "Welcome to the CloudStack Agent Setup:"
+    print("Welcome to the CloudStack Agent Setup:")
 
     cfo = configFileOps("@AGENTSYSCONFDIR@/agent.properties")
     oldMgt = cfo.getEntry("host")
 
-    mgtSvr = raw_input("Please input the Management Server Hostname/IP-Address:[%s]"%oldMgt)
+    mgtSvr = input("Please input the Management Server Hostname/IP-Address:[%s]"%oldMgt)
     if mgtSvr == "":
         mgtSvr = oldMgt
     try:
         socket.getaddrinfo(mgtSvr, 443)
     except:
-        print "Failed to resolve %s. Please input a valid hostname or IP-Address."%mgtSvr
+        print("Failed to resolve %s. Please input a valid hostname or IP-Address."%mgtSvr)
         exit(1)
 
     oldToken = cfo.getEntry("zone")
-    zoneToken = raw_input("Please input the Zone Id:[%s]"%oldToken)
+    zoneToken = input("Please input the Zone Id:[%s]"%oldToken)
 
     if zoneToken == "":
         zoneToken = oldToken
 
     oldPod = cfo.getEntry("pod")
-    podId = raw_input("Please input the Pod Id:[%s]"%oldPod)
+    podId = input("Please input the Pod Id:[%s]"%oldPod)
 
     if podId == "":
        podId  = oldToken
 
     oldCluster = cfo.getEntry("cluster")
-    clusterId = raw_input("Please input the Cluster Id:[%s]"%oldCluster)
+    clusterId = input("Please input the Cluster Id:[%s]"%oldCluster)
     if clusterId == "":
         clusterId = oldCluster
 
@@ -66,21 +66,21 @@
     if oldHypervisor == "":
         oldHypervisor = "kvm"
 
-    hypervisor = raw_input("Please input the Hypervisor type kvm/lxc:[%s]"%oldHypervisor)
+    hypervisor = input("Please input the Hypervisor type kvm/lxc:[%s]"%oldHypervisor)
     if hypervisor == "":
         hypervisor = oldHypervisor
 
     try:
         defaultNic = networkConfig.getDefaultNetwork()
     except:
-        print "Failed to get default route. Please configure your network to have a default route"
+        print("Failed to get default route. Please configure your network to have a default route")
         exit(1)
 
     defNic = defaultNic.name
-    network = raw_input("Please choose which network used to create VM:[%s]"%defNic)
+    network = input("Please choose which network used to create VM:[%s]"%defNic)
     if network == "":
         if defNic == "":
-            print "You need to specifiy one of Nic or bridge on your system"
+            print("You need to specifiy one of Nic or bridge on your system")
             exit(1)
         elif network == "":
             network = defNic
@@ -115,7 +115,7 @@
 
     if not options.auto and options.secure:
         configureLibvirtConfig(True)
-        print "Libvirtd with TLS configured"
+        print("Libvirtd with TLS configured")
         sys.exit(0)
 
     if options.auto is None:
@@ -131,10 +131,10 @@
         if glbEnv.uuid == "":
             glbEnv.uuid = bash("uuidgen").getStdout()
     else:
-        for para, value in options.__dict__.items():
+        for para, value in list(options.__dict__.items()):
             if value is None:
-                print "Missing operand:%s"%para
-                print "Try %s --help for more information"%sys.argv[0]
+                print("Missing operand:%s"%para)
+                print("Try %s --help for more information"%sys.argv[0])
                 sys.exit(1)
 
         glbEnv.uuid = options.guid
@@ -149,14 +149,14 @@
 
     glbEnv.secure = options.secure
 
-    print "Starting to configure your system:"
+    print("Starting to configure your system:")
     syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
     try:
         syscfg.config()
-        print "CloudStack Agent setup is done!"
-    except (CloudRuntimeException,CloudInternalException), e:
-        print e
-        print "Try to restore your system:"
+        print("CloudStack Agent setup is done!")
+    except (CloudRuntimeException,CloudInternalException) as e:
+        print(e)
+        print("Try to restore your system:")
         try:
             syscfg.restore()
         except:
diff --git a/agent/bindir/cloudstack-agent-upgrade.in b/agent/bindir/cloudstack-agent-upgrade.in
index 72b0fae..cec176e 100644
--- a/agent/bindir/cloudstack-agent-upgrade.in
+++ b/agent/bindir/cloudstack-agent-upgrade.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -6,9 +6,9 @@
 # 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
@@ -32,7 +32,7 @@
     print("find physical device %s"%phyDev)
     newBrName = "br" + phyDev + "-" + vlanId
     print("new bridge name %s"%newBrName)
-    bash("ip link set %s down"%brName) 
+    bash("ip link set %s down"%brName)
     bash("ip link set %s name %s"%(brName, newBrName))
     bash("ip link set %s up" %newBrName)
     cmd = "iptables-save | grep FORWARD | grep -w " +  brName
@@ -47,16 +47,16 @@
         except:
             logging.exception("Ignoring failure to update rules for rule " + rule + " on bridge " + brName)
 if __name__ == '__main__':
-   netlib = networkConfig() 
+   netlib = networkConfig()
    bridges = netlib.listNetworks()
-   bridges = filter(isOldStyleBridge, bridges)
+   bridges = list(filter(isOldStyleBridge, bridges))
    for br in bridges:
        enslavedDev = netlib.getEnslavedDev(br, 1)
        if enslavedDev is not None:
            upgradeBridgeName(br, enslavedDev)
-   
+
    bridges = netlib.listNetworks()
-   bridges = filter(isOldStyleBridge, bridges)
+   bridges = list(filter(isOldStyleBridge, bridges))
    if len(bridges) > 0:
        print("Warning: upgrade is not finished, still some bridges have the old style name:" + str(bridges))
    else:
diff --git a/agent/bindir/libvirtqemuhook.in b/agent/bindir/libvirtqemuhook.in
index 894d68c..cf3d364 100755
--- a/agent/bindir/libvirtqemuhook.in
+++ b/agent/bindir/libvirtqemuhook.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -32,7 +32,7 @@
 logger = logging.getLogger('qemu-hook')
 
 customDir = "/etc/libvirt/hooks/custom"
-customDirPermissions = 0744
+customDirPermissions = 0o744
 timeoutSeconds = 10 * 60
 validQemuActions = ['prepare', 'start', 'started', 'stopped', 'release', 'migrate', 'restore', 'reconnect', 'attach']
 
@@ -128,9 +128,8 @@
 
 
 def getCustomScriptsFromDirectory():
-    return sorted(filter(lambda fileName: (fileName is not None) & (fileName != "") & ('_' in fileName) &
-                                          (fileName.startswith((action + '_')) | fileName.startswith(('all' + '_'))),
-                         os.listdir(customDir)), key=lambda fileName: substringAfter(fileName, '_'))
+    return sorted([fileName for fileName in os.listdir(customDir) if (fileName is not None) & (fileName != "") & ('_' in fileName) &
+                                          (fileName.startswith((action + '_')) | fileName.startswith(('all' + '_')))], key=lambda fileName: substringAfter(fileName, '_'))
 
 
 def substringAfter(s, delimiter):
diff --git a/agent/bindir/rolling-maintenance.in b/agent/bindir/rolling-maintenance.in
index 572209c..1a8cfef 100644
--- a/agent/bindir/rolling-maintenance.in
+++ b/agent/bindir/rolling-maintenance.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -43,7 +43,7 @@
 
         success = True if exitStatus == 0 or exitStatus == AVOID_MAINTENANCE_EXIT_STATUS else False
         avoid_maintenance = True if exitStatus == AVOID_MAINTENANCE_EXIT_STATUS else False
-        return {"success": success, "message": stdout.strip(), "avoidmaintenance": avoid_maintenance}
+        return {"success": success, "message": stdout.decode('utf-8').strip(), "avoidmaintenance": avoid_maintenance}
     except Exception as e:
         logger.error("Error in stage %s: %s" % (script, e))
         sys.exit(1)
diff --git a/agent/pom.xml b/agent/pom.xml
index c9f702b..317b9f5 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/agent/src/main/java/com/cloud/agent/Agent.java b/agent/src/main/java/com/cloud/agent/Agent.java
index 7e5e295..144f7ef 100644
--- a/agent/src/main/java/com/cloud/agent/Agent.java
+++ b/agent/src/main/java/com/cloud/agent/Agent.java
@@ -39,6 +39,7 @@
 
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.NumbersUtil;
 import org.apache.cloudstack.agent.lb.SetupMSListAnswer;
 import org.apache.cloudstack.agent.lb.SetupMSListCommand;
 import org.apache.cloudstack.ca.PostCertificateRenewalCommand;
@@ -51,7 +52,7 @@
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
-import org.slf4j.MDC;
+import org.apache.log4j.MDC;
 
 import com.cloud.agent.api.AgentControlAnswer;
 import com.cloud.agent.api.AgentControlCommand;
@@ -419,6 +420,19 @@
         }
     }
 
+    /**
+     * Cleanup agent zone properties.
+     *
+     * Unset zone, cluster and pod values so that host is not added back
+     * when service is restarted. This will be set to proper values
+     * when host is added back
+     */
+    protected void cleanupAgentZoneProperties() {
+        _shell.setPersistentProperty(null, "zone", "");
+        _shell.setPersistentProperty(null, "cluster", "");
+        _shell.setPersistentProperty(null, "pod", "");
+    }
+
     public synchronized void lockStartupTask(final Link link) {
         _startup = new StartupTask(link);
         _timer.schedule(_startup, _startupWait);
@@ -602,6 +616,9 @@
                         final ShutdownCommand shutdown = (ShutdownCommand)cmd;
                         s_logger.debug("Received shutdownCommand, due to: " + shutdown.getReason());
                         cancelTasks();
+                        if (shutdown.isRemoveHost()) {
+                            cleanupAgentZoneProperties();
+                        }
                         _reconnectAllowed = false;
                         answer = new Answer(cmd, true, null);
                     } else if (cmd instanceof ReadyCommand && ((ReadyCommand)cmd).getDetails() != null) {
@@ -809,6 +826,11 @@
 
     public void processReadyCommand(final Command cmd) {
         final ReadyCommand ready = (ReadyCommand)cmd;
+        // Set human readable sizes;
+        Boolean humanReadable = ready.getEnableHumanReadableSizes();
+        if (humanReadable != null){
+            NumbersUtil.enableHumanReadableSizes = humanReadable;
+        }
 
         s_logger.info("Processing agent ready command, agent id = " + ready.getHostId());
         if (ready.getHostId() != null) {
diff --git a/api/pom.xml b/api/pom.xml
index a77c20b..d1cc731 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/api/src/main/java/com/cloud/agent/api/PvlanSetupCommand.java b/api/src/main/java/com/cloud/agent/api/PvlanSetupCommand.java
index 512d1bc..dc571f0 100644
--- a/api/src/main/java/com/cloud/agent/api/PvlanSetupCommand.java
+++ b/api/src/main/java/com/cloud/agent/api/PvlanSetupCommand.java
@@ -34,6 +34,7 @@
     private String dhcpIp;
     private Type type;
     private String networkTag;
+    private String pvlanType;
 
     protected PvlanSetupCommand() {
     }
@@ -43,6 +44,7 @@
         this.op = op;
         this.primary = NetUtils.getPrimaryPvlanFromUri(uri);
         this.isolated = NetUtils.getIsolatedPvlanFromUri(uri);
+        this.pvlanType = NetUtils.getPvlanTypeFromUri(uri);
         this.networkTag = networkTag;
     }
 
@@ -116,4 +118,8 @@
     public String getNetworkTag() {
         return networkTag;
     }
+
+    public String getPvlanType() {
+        return pvlanType;
+    }
 }
diff --git a/api/src/main/java/com/cloud/agent/api/StoragePoolInfo.java b/api/src/main/java/com/cloud/agent/api/StoragePoolInfo.java
index 7d1e238..d923694 100644
--- a/api/src/main/java/com/cloud/agent/api/StoragePoolInfo.java
+++ b/api/src/main/java/com/cloud/agent/api/StoragePoolInfo.java
@@ -28,6 +28,7 @@
     StoragePoolType poolType;
     long capacityBytes;
     long availableBytes;
+    String name;
     Map<String, String> details;
 
     protected StoragePoolInfo() {
@@ -67,14 +68,34 @@
         return host;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setLocalPath(String localPath) {
+        this.localPath = localPath;
+    }
+
     public String getLocalPath() {
         return localPath;
     }
 
+    public void setHostPath(String hostPath) {
+        this.hostPath = hostPath;
+    }
+
     public String getHostPath() {
         return hostPath;
     }
 
+    public void setPoolType(StoragePoolType poolType) {
+        this.poolType = poolType;
+    }
+
     public StoragePoolType getPoolType() {
         return poolType;
     }
diff --git a/api/src/main/java/com/cloud/agent/api/storage/OVFHelper.java b/api/src/main/java/com/cloud/agent/api/storage/OVFHelper.java
index 15d6358..8d4f780 100644
--- a/api/src/main/java/com/cloud/agent/api/storage/OVFHelper.java
+++ b/api/src/main/java/com/cloud/agent/api/storage/OVFHelper.java
@@ -22,8 +22,15 @@
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
+import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Transformer;
@@ -32,15 +39,28 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import com.cloud.agent.api.to.deployasis.OVFConfigurationTO;
+import com.cloud.agent.api.to.deployasis.OVFEulaSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareItemTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareSectionTO;
 import com.cloud.configuration.Resource.ResourceType;
 import com.cloud.exception.InternalErrorException;
+import com.cloud.utils.Pair;
+import com.cloud.utils.compression.CompressionUtil;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.log4j.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.DocumentTraversal;
+import org.w3c.dom.traversal.NodeFilter;
+import org.w3c.dom.traversal.NodeIterator;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -73,10 +93,11 @@
     }
 
     /**
-     * Get the text value of a node's child with name "childNodeName", null if not present
+     * Get the text value of a node's child with name or suffix "childNodeName", null if not present
      * Example:
      * <Node>
      *    <childNodeName>Text value</childNodeName>
+     *    <rasd:childNodeName>Text value</rasd:childNodeName>
      * </Node>
      */
     private String getChildNodeValue(Node node, String childNodeName) {
@@ -84,7 +105,9 @@
             NodeList childNodes = node.getChildNodes();
             for (int i = 0; i < childNodes.getLength(); i++) {
                 Node value = childNodes.item(i);
-                if (value != null && value.getNodeName().equals(childNodeName)) {
+                // Also match if the child's name has a suffix:
+                // Example: <rasd:AllocationUnits>
+                if (value != null && (value.getNodeName().equals(childNodeName)) || value.getNodeName().endsWith(":" + childNodeName)) {
                     return value.getTextContent();
                 }
             }
@@ -93,44 +116,93 @@
     }
 
     /**
+     * Check if the attribute is present on the element, otherwise check preprending ':'
+     */
+    private String getNodeAttribute(Element element, String prefix, String attr) {
+        if (element == null) {
+            return null;
+        }
+        if (element.hasAttribute(prefix + ":" + attr)) {
+            return element.getAttribute(prefix + ":" + attr);
+        }
+        else if (element.hasAttribute(attr)) {
+            return element.getAttribute(attr);
+        }
+
+        NamedNodeMap attributes = element.getAttributes();
+        if (attributes == null || attributes.getLength() == 0) {
+            return null;
+        }
+        for (int i = 0; i < attributes.getLength(); i++) {
+            Node node = attributes.item(i);
+            if (node != null && node.getNodeName().endsWith(":" + attr)) {
+                return node.getTextContent();
+            }
+        }
+        return null;
+    }
+
+    /**
      * Create OVFProperty class from the parsed node. Note that some fields may not be present.
      * The key attribute is required
      */
-    protected OVFPropertyTO createOVFPropertyFromNode(Node node) {
-        Element property = (Element) node;
-        String key = property.getAttribute("ovf:key");
+    protected OVFPropertyTO createOVFPropertyFromNode(Node node, int index, String category) {
+        Element element = (Element) node;
+        String key = getNodeAttribute(element, "ovf","key");
         if (StringUtils.isBlank(key)) {
             return null;
         }
 
-        String value = property.getAttribute("ovf:value");
-        String type = property.getAttribute("ovf:type");
-        String qualifiers = property.getAttribute("ovf:qualifiers");
-        String userConfigurableStr = property.getAttribute("ovf:userConfigurable");
+        String value = getNodeAttribute(element, "ovf","value");
+        String type = getNodeAttribute(element, "ovf","type");
+        String qualifiers = getNodeAttribute(element, "ovf","qualifiers");
+        String userConfigurableStr = getNodeAttribute(element, "ovf","userConfigurable");
         boolean userConfigurable = StringUtils.isNotBlank(userConfigurableStr) &&
                 userConfigurableStr.equalsIgnoreCase("true");
-        String passStr = property.getAttribute("ovf:password");
+        String passStr = getNodeAttribute(element, "ovf","password");
         boolean password = StringUtils.isNotBlank(passStr) && passStr.equalsIgnoreCase("true");
         String label = getChildNodeValue(node, "Label");
         String description = getChildNodeValue(node, "Description");
-        return new OVFPropertyTO(key, type, value, qualifiers, userConfigurable, label, description, password);
+        s_logger.debug("Creating OVF property index " + index + (category == null ? "" : " for category " + category)
+                + " with key = " + key);
+        return new OVFPropertyTO(key, type, value, qualifiers, userConfigurable,
+                label, description, password, index, category);
     }
 
     /**
-     * Retrieve OVF properties from a parsed OVF file, with attribute 'ovf:userConfigurable' set to true
+     * Retrieve OVF properties from a parsed OVF file including its category (if available) and in-order,
+     * with attribute 'ovf:userConfigurable' set to true.
      */
-    private List<OVFPropertyTO> getConfigurableOVFPropertiesFromDocument(Document doc) {
+    public List<OVFPropertyTO> getConfigurableOVFPropertiesFromDocument(Document doc) {
         List<OVFPropertyTO> props = new ArrayList<>();
-        NodeList properties = doc.getElementsByTagName("Property");
-        if (properties != null) {
-            for (int i = 0; i < properties.getLength(); i++) {
-                Node node = properties.item(i);
+        if (doc == null) {
+            return props;
+        }
+        int propertyIndex = 0;
+        NodeList productSections = doc.getElementsByTagName("ProductSection");
+        if (productSections != null) {
+            String lastCategoryFound = null;
+            for (int i = 0; i < productSections.getLength(); i++) {
+                Node node = productSections.item(i);
                 if (node == null) {
                     continue;
                 }
-                OVFPropertyTO prop = createOVFPropertyFromNode(node);
-                if (prop != null && prop.isUserConfigurable()) {
-                    props.add(prop);
+                NodeList childNodes = node.getChildNodes();
+                for (int j = 0; j < childNodes.getLength(); j++) {
+                    Node child = childNodes.item(j);
+                    if (child == null) {
+                        continue;
+                    }
+                    if (child.getNodeName().equalsIgnoreCase("Category")) {
+                        lastCategoryFound = child.getTextContent();
+                        s_logger.info("Category found " + lastCategoryFound);
+                    } else if (child.getNodeName().equalsIgnoreCase("Property")) {
+                        OVFPropertyTO prop = createOVFPropertyFromNode(child, propertyIndex, lastCategoryFound);
+                        if (prop != null && prop.isUserConfigurable()) {
+                            props.add(prop);
+                            propertyIndex++;
+                        }
+                    }
                 }
             }
         }
@@ -138,128 +210,237 @@
     }
 
     /**
-     * Get properties from OVF file located on ovfFilePath
-     */
-    public List<OVFPropertyTO> getOVFPropertiesFromFile(String ovfFilePath) throws ParserConfigurationException, IOException, SAXException {
-        if (StringUtils.isBlank(ovfFilePath)) {
-            return new ArrayList<>();
-        }
-        File ovfFile = new File(ovfFilePath);
-        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(ovfFile);
-        return getConfigurableOVFPropertiesFromDocument(doc);
-    }
-
-    /**
      * Get properties from OVF XML string
      */
-    protected List<OVFPropertyTO> getOVFPropertiesXmlString(final String ovfFilePath) throws ParserConfigurationException, IOException, SAXException {
-        InputSource is = new InputSource(new StringReader(ovfFilePath));
+    protected List<OVFPropertyTO> getOVFPropertiesFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
         final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
         return getConfigurableOVFPropertiesFromDocument(doc);
     }
 
-    public List<DatadiskTO> getOVFVolumeInfo(final String ovfFilePath) {
+    protected Pair<String, String> getOperatingSystemInfoFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+        return getOperatingSystemInfoFromDocument(doc);
+    }
+
+    protected List<OVFConfigurationTO> getOVFDeploymentOptionsFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+        return getDeploymentOptionsFromDocumentTree(doc);
+    }
+
+    protected List<OVFVirtualHardwareItemTO> getOVFVirtualHardwareSectionFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+        return getVirtualHardwareItemsFromDocumentTree(doc);
+    }
+
+    protected OVFVirtualHardwareSectionTO getVirtualHardwareSectionFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+        return getVirtualHardwareSectionFromDocument(doc);
+    }
+
+    protected List<OVFEulaSectionTO> getOVFEulaSectionFromXmlString(final String ovfString) throws ParserConfigurationException, IOException, SAXException {
+        InputSource is = new InputSource(new StringReader(ovfString));
+        final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
+        return getEulaSectionsFromDocument(doc);
+    }
+
+    public List<DatadiskTO> getOVFVolumeInfoFromFile(final String ovfFilePath, final String configurationId) throws InternalErrorException {
         if (StringUtils.isBlank(ovfFilePath)) {
-            return new ArrayList<DatadiskTO>();
+            return new ArrayList<>();
         }
-        ArrayList<OVFFile> vf = new ArrayList<OVFFile>();
-        ArrayList<OVFDisk> vd = new ArrayList<OVFDisk>();
+        Document doc = getDocumentFromFile(ovfFilePath);
+
+        return getOVFVolumeInfoFromFile(ovfFilePath, doc, configurationId);
+    }
+
+    public List<DatadiskTO> getOVFVolumeInfoFromFile(String ovfFilePath, Document doc, String configurationId) throws InternalErrorException {
+        if (org.apache.commons.lang.StringUtils.isBlank(ovfFilePath)) {
+            return null;
+        }
 
         File ovfFile = new File(ovfFilePath);
+        List<OVFVirtualHardwareItemTO> hardwareItems = getVirtualHardwareItemsFromDocumentTree(doc);
+        List<OVFFile> files = extractFilesFromOvfDocumentTree(ovfFile, doc);
+        List<OVFDisk> disks = extractDisksFromOvfDocumentTree(doc);
+
+        List<OVFVirtualHardwareItemTO> diskHardwareItems = hardwareItems.stream()
+                .filter(x -> x.getResourceType() == OVFVirtualHardwareItemTO.HardwareResourceType.DiskDrive &&
+                        hardwareItemContainsConfiguration(x, configurationId))
+                .collect(Collectors.toList());
+        List<DatadiskTO> diskTOs = matchHardwareItemsToDiskAndFilesInformation(diskHardwareItems, files, disks, ovfFile.getParent());
+        return diskTOs;
+    }
+
+    private String extractDiskIdFromDiskHostResource(String hostResource) {
+        if (hostResource.startsWith("ovf:/disk/")) {
+            return hostResource.replace("ovf:/disk/", "");
+        }
+        String[] resourceParts = hostResource.split("/");
+        return resourceParts[resourceParts.length - 1];
+    }
+
+    private OVFDisk getDiskDefinitionFromDiskId(String diskId, List<OVFDisk> disks) {
+        for (OVFDisk disk : disks) {
+            if (disk._diskId.equalsIgnoreCase(diskId)) {
+                return disk;
+            }
+        }
+        return null;
+    }
+
+    private List<DatadiskTO> matchHardwareItemsToDiskAndFilesInformation(List<OVFVirtualHardwareItemTO> diskHardwareItems,
+                                                                         List<OVFFile> files, List<OVFDisk> disks,
+                                                                         String ovfParentPath) throws InternalErrorException {
+        List<DatadiskTO> diskTOs = new LinkedList<>();
+        int diskNumber = 0;
+        for (OVFVirtualHardwareItemTO diskItem : diskHardwareItems) {
+            if (StringUtils.isBlank(diskItem.getHostResource())) {
+                s_logger.error("Missing disk information for hardware item " + diskItem.getElementName() + " " + diskItem.getInstanceId());
+                continue;
+            }
+            String diskId = extractDiskIdFromDiskHostResource(diskItem.getHostResource());
+            OVFDisk diskDefinition = getDiskDefinitionFromDiskId(diskId, disks);
+            if (diskDefinition == null) {
+                s_logger.error("Missing disk definition for disk ID " + diskId);
+            }
+            OVFFile fileDefinition = getFileDefinitionFromDiskDefinition(diskDefinition._fileRef, files);
+            DatadiskTO datadiskTO = generateDiskTO(fileDefinition, diskDefinition, ovfParentPath, diskNumber, diskItem);
+            diskTOs.add(datadiskTO);
+            diskNumber++;
+        }
+        List<OVFFile> isoFiles = files.stream().filter(x -> x.isIso).collect(Collectors.toList());
+        for (OVFFile isoFile : isoFiles) {
+            DatadiskTO isoTO = generateDiskTO(isoFile, null, ovfParentPath, diskNumber, null);
+            diskTOs.add(isoTO);
+            diskNumber++;
+        }
+        return diskTOs;
+    }
+
+    private DatadiskTO generateDiskTO(OVFFile file, OVFDisk disk, String ovfParentPath, int diskNumber,
+                                      OVFVirtualHardwareItemTO diskItem) throws InternalErrorException {
+        String path = file != null ? ovfParentPath + File.separator + file._href : null;
+        if (StringUtils.isNotBlank(path)) {
+            File f = new File(path);
+            if (!f.exists() || f.isDirectory()) {
+                s_logger.error("One of the attached disk or iso does not exists " + path);
+                throw new InternalErrorException("One of the attached disk or iso as stated on OVF does not exists " + path);
+            }
+        }
+        Long capacity = disk != null ? disk._capacity : file._size;
+        Long fileSize = file != null ? file._size : 0L;
+
+        String controller = "";
+        String controllerSubType = "";
+        if (disk != null) {
+            OVFDiskController cDiskController = disk._controller;
+            controller = cDiskController == null ? "" : disk._controller._name;
+            controllerSubType = cDiskController == null ? "" : disk._controller._subType;
+        }
+
+        boolean isIso = file != null && file.isIso;
+        boolean bootable = file != null && file._bootable;
+        String diskId = disk == null ? file._id : disk._diskId;
+        String configuration = diskItem != null ? diskItem.getConfigurationIds() : null;
+        return new DatadiskTO(path, capacity, fileSize, diskId,
+                isIso, bootable, controller, controllerSubType, diskNumber, configuration);
+    }
+
+    protected List<OVFDisk> extractDisksFromOvfDocumentTree(Document doc) {
+        NodeList disks = doc.getElementsByTagName("Disk");
+        NodeList ovfDisks = doc.getElementsByTagName("ovf:Disk");
+        NodeList items = doc.getElementsByTagName("Item");
+
+        int totalDisksLength = disks.getLength() + ovfDisks.getLength();
+        ArrayList<OVFDisk> vd = new ArrayList<>();
+        for (int i = 0; i < totalDisksLength; i++) {
+            Element disk;
+            if (i >= disks.getLength()) {
+                int pos = i - disks.getLength();
+                disk = (Element) ovfDisks.item(pos);
+            } else {
+                disk = (Element) disks.item(i);
+            }
+
+            if (disk == null) {
+                continue;
+            }
+            OVFDisk od = new OVFDisk();
+            String virtualSize = getNodeAttribute(disk, "ovf", "capacity");
+            od._capacity = NumberUtils.toLong(virtualSize, 0L);
+            String allocationUnits = getNodeAttribute(disk,"ovf","capacityAllocationUnits");
+            od._diskId = getNodeAttribute(disk,"ovf","diskId");
+            od._fileRef = getNodeAttribute(disk,"ovf","fileRef");
+            od._populatedSize = NumberUtils.toLong(getNodeAttribute(disk,"ovf","populatedSize"));
+
+            if ((od._capacity != 0) && (allocationUnits != null)) {
+                long units = 1;
+                if (allocationUnits.equalsIgnoreCase("KB") || allocationUnits.equalsIgnoreCase("KiloBytes") || allocationUnits.equalsIgnoreCase("byte * 2^10")) {
+                    units = ResourceType.bytesToKiB;
+                } else if (allocationUnits.equalsIgnoreCase("MB") || allocationUnits.equalsIgnoreCase("MegaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^20")) {
+                    units = ResourceType.bytesToMiB;
+                } else if (allocationUnits.equalsIgnoreCase("GB") || allocationUnits.equalsIgnoreCase("GigaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^30")) {
+                    units = ResourceType.bytesToGiB;
+                }
+                od._capacity = od._capacity * units;
+            }
+            od._controller = getControllerType(items, od._diskId);
+            vd.add(od);
+        }
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("found %d disk definitions",vd.size()));
+        }
+        return vd;
+    }
+
+    protected List<OVFFile> extractFilesFromOvfDocumentTree(File ovfFile, Document doc) {
+        NodeList files = doc.getElementsByTagName("File");
+        ArrayList<OVFFile> vf = new ArrayList<>();
+        boolean toggle = true;
+        for (int j = 0; j < files.getLength(); j++) {
+            Element file = (Element)files.item(j);
+            OVFFile of = new OVFFile();
+            of._href = getNodeAttribute(file,"ovf","href");
+            if (of._href.endsWith("vmdk") || of._href.endsWith("iso")) {
+                of._id = getNodeAttribute(file,"ovf","id");
+                String size = getNodeAttribute(file,"ovf", "size");
+                if (StringUtils.isNotBlank(size)) {
+                    of._size = Long.parseLong(size);
+                } else {
+                    String dataDiskPath = ovfFile.getParent() + File.separator + of._href;
+                    File this_file = new File(dataDiskPath);
+                    of._size = this_file.length();
+                }
+                of.isIso = of._href.endsWith("iso");
+                if (toggle && !of.isIso) {
+                    of._bootable = true;
+                    toggle = !toggle;
+                }
+                vf.add(of);
+            }
+        }
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("found %d file definitions in %s",vf.size(), ovfFile.getPath()));
+        }
+        return vf;
+    }
+
+    public Document getDocumentFromFile(String ovfFilePath) {
+        if (org.apache.commons.lang.StringUtils.isBlank(ovfFilePath)) {
+            return null;
+        }
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newDefaultInstance();
         try {
-            final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(ovfFilePath));
-            NodeList disks = doc.getElementsByTagName("Disk");
-            NodeList files = doc.getElementsByTagName("File");
-            NodeList items = doc.getElementsByTagName("Item");
-            boolean toggle = true;
-            for (int j = 0; j < files.getLength(); j++) {
-                Element file = (Element)files.item(j);
-                OVFFile of = new OVFFile();
-                of._href = file.getAttribute("ovf:href");
-                if (of._href.endsWith("vmdk") || of._href.endsWith("iso")) {
-                    of._id = file.getAttribute("ovf:id");
-                    String size = file.getAttribute("ovf:size");
-                    if (StringUtils.isNotBlank(size)) {
-                        of._size = Long.parseLong(size);
-                    } else {
-                        String dataDiskPath = ovfFile.getParent() + File.separator + of._href;
-                        File this_file = new File(dataDiskPath);
-                        of._size = this_file.length();
-                    }
-                    of.isIso = of._href.endsWith("iso");
-                    if (toggle && !of.isIso) {
-                        of._bootable = true;
-                        toggle = !toggle;
-                    }
-                    vf.add(of);
-                }
-            }
-            for (int i = 0; i < disks.getLength(); i++) {
-                Element disk = (Element)disks.item(i);
-                OVFDisk od = new OVFDisk();
-                String virtualSize = disk.getAttribute("ovf:capacity");
-                od._capacity = NumberUtils.toLong(virtualSize, 0L);
-                String allocationUnits = disk.getAttribute("ovf:capacityAllocationUnits");
-                od._diskId = disk.getAttribute("ovf:diskId");
-                od._fileRef = disk.getAttribute("ovf:fileRef");
-                od._populatedSize = NumberUtils.toLong(disk.getAttribute("ovf:populatedSize"));
-
-                if ((od._capacity != 0) && (allocationUnits != null)) {
-
-                    long units = 1;
-                    if (allocationUnits.equalsIgnoreCase("KB") || allocationUnits.equalsIgnoreCase("KiloBytes") || allocationUnits.equalsIgnoreCase("byte * 2^10")) {
-                        units = ResourceType.bytesToKiB;
-                    } else if (allocationUnits.equalsIgnoreCase("MB") || allocationUnits.equalsIgnoreCase("MegaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^20")) {
-                        units = ResourceType.bytesToMiB;
-                    } else if (allocationUnits.equalsIgnoreCase("GB") || allocationUnits.equalsIgnoreCase("GigaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^30")) {
-                        units = ResourceType.bytesToGiB;
-                    }
-                    od._capacity = od._capacity * units;
-                }
-                od._controller = getControllerType(items, od._diskId);
-                vd.add(od);
-            }
-
+            DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();
+            return builder.parse(new File(ovfFilePath));
         } catch (SAXException | IOException | ParserConfigurationException e) {
             s_logger.error("Unexpected exception caught while parsing ovf file:" + ovfFilePath, e);
             throw new CloudRuntimeException(e);
         }
-
-        List<DatadiskTO> disksTO = new ArrayList<DatadiskTO>();
-        for (OVFFile of : vf) {
-            if (StringUtils.isBlank(of._id)){
-                s_logger.error("The ovf file info is incomplete file info");
-                throw new CloudRuntimeException("The ovf file info has incomplete file info");
-            }
-            OVFDisk cdisk = getDisk(of._id, vd);
-            if (cdisk == null && !of.isIso){
-                s_logger.error("The ovf file info has incomplete disk info");
-                throw new CloudRuntimeException("The ovf file info has incomplete disk info");
-            }
-            Long capacity = cdisk == null ? of._size : cdisk._capacity;
-            String controller = "";
-            String controllerSubType = "";
-            if (cdisk != null) {
-                OVFDiskController cDiskController = cdisk._controller;
-                controller = cDiskController == null ? "" : cdisk._controller._name;
-                controllerSubType = cDiskController == null ? "" : cdisk._controller._subType;
-            }
-
-            String dataDiskPath = ovfFile.getParent() + File.separator + of._href;
-            File f = new File(dataDiskPath);
-            if (!f.exists() || f.isDirectory()) {
-                s_logger.error("One of the attached disk or iso does not exists " + dataDiskPath);
-                throw new CloudRuntimeException("One of the attached disk or iso as stated on OVF does not exists " + dataDiskPath);
-            }
-            disksTO.add(new DatadiskTO(dataDiskPath, capacity, of._size, of._id, of.isIso, of._bootable, controller, controllerSubType));
-        }
-        //check if first disk is an iso move it to the end
-        DatadiskTO fd = disksTO.get(0);
-        if (fd.isIso()) {
-            disksTO.remove(0);
-            disksTO.add(fd);
-        }
-        return disksTO;
     }
 
     private OVFDiskController getControllerType(final NodeList itemList, final String diskId) {
@@ -330,55 +511,61 @@
         return dc;
     }
 
-    public void rewriteOVFFile(final String origOvfFilePath, final String newOvfFilePath, final String diskName) {
-        try {
-            final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(origOvfFilePath));
-            NodeList disks = doc.getElementsByTagName("Disk");
-            NodeList files = doc.getElementsByTagName("File");
-            NodeList items = doc.getElementsByTagName("Item");
-            String keepfile = null;
-            List<Element> toremove = new ArrayList<Element>();
-            for (int j = 0; j < files.getLength(); j++) {
-                Element file = (Element)files.item(j);
-                String href = file.getAttribute("ovf:href");
-                if (diskName.equals(href)) {
-                    keepfile = file.getAttribute("ovf:id");
-                } else {
-                    toremove.add(file);
-                }
+    public void rewriteOVFFileForSingleDisk(final String origOvfFilePath, final String newOvfFilePath, final String diskName) {
+        final Document doc = getDocumentFromFile(origOvfFilePath);
+
+        NodeList disks = doc.getElementsByTagName("Disk");
+        NodeList files = doc.getElementsByTagName("File");
+        NodeList items = doc.getElementsByTagName("Item");
+        String keepfile = null;
+        List<Element> toremove = new ArrayList<>();
+        for (int j = 0; j < files.getLength(); j++) {
+            Element file = (Element)files.item(j);
+            String href = getNodeAttribute(file,"ovf", "href");
+            if (diskName.equals(href)) {
+                keepfile = getNodeAttribute(file,"ovf","id");
+            } else {
+                toremove.add(file);
             }
-            String keepdisk = null;
-            for (int i = 0; i < disks.getLength(); i++) {
-                Element disk = (Element)disks.item(i);
-                String fileRef = disk.getAttribute("ovf:fileRef");
-                if (keepfile == null) {
-                    s_logger.info("FATAL: OVA format error");
-                } else if (keepfile.equals(fileRef)) {
-                    keepdisk = disk.getAttribute("ovf:diskId");
-                } else {
-                    toremove.add(disk);
-                }
+        }
+        String keepdisk = null;
+        for (int i = 0; i < disks.getLength(); i++) {
+            Element disk = (Element)disks.item(i);
+            String fileRef = getNodeAttribute(disk,"ovf","fileRef");
+            if (keepfile == null) {
+                s_logger.info("FATAL: OVA format error");
+            } else if (keepfile.equals(fileRef)) {
+                keepdisk = getNodeAttribute(disk,"ovf","diskId");
+            } else {
+                toremove.add(disk);
             }
-            for (int k = 0; k < items.getLength(); k++) {
-                Element item = (Element)items.item(k);
-                NodeList cn = item.getChildNodes();
-                for (int l = 0; l < cn.getLength(); l++) {
-                    if (cn.item(l) instanceof Element) {
-                        Element el = (Element)cn.item(l);
-                        if ("rasd:HostResource".equals(el.getNodeName())
-                                && !(el.getTextContent().contains("ovf:/file/" + keepdisk) || el.getTextContent().contains("ovf:/disk/" + keepdisk))) {
-                            toremove.add(item);
-                            break;
-                        }
+        }
+        for (int k = 0; k < items.getLength(); k++) {
+            Element item = (Element) items.item(k);
+            NodeList cn = item.getChildNodes();
+            for (int l = 0; l < cn.getLength(); l++) {
+                if (cn.item(l) instanceof Element) {
+                    Element el = (Element) cn.item(l);
+                    if ("rasd:HostResource".equals(el.getNodeName())
+                            && !(el.getTextContent().contains("ovf:/file/" + keepdisk) || el.getTextContent().contains("ovf:/disk/" + keepdisk))) {
+                        toremove.add(item);
+                        break;
                     }
                 }
             }
+        }
 
-            for (Element rme : toremove) {
-                if (rme.getParentNode() != null) {
-                    rme.getParentNode().removeChild(rme);
-                }
+        for (Element rme : toremove) {
+            if (rme.getParentNode() != null) {
+                rme.getParentNode().removeChild(rme);
             }
+        }
+
+        writeDocumentToFile(newOvfFilePath, doc);
+    }
+
+    private void writeDocumentToFile(String newOvfFilePath, Document doc) {
+        try {
 
             final StringWriter writer = new StringWriter();
             final StreamResult result = new StreamResult(writer);
@@ -389,21 +576,346 @@
             PrintWriter outfile = new PrintWriter(newOvfFilePath);
             outfile.write(writer.toString());
             outfile.close();
-        } catch (SAXException | IOException | ParserConfigurationException | TransformerException e) {
-            s_logger.info("Unexpected exception caught while removing network elements from OVF:" + e.getMessage(), e);
+        } catch (IOException | TransformerException e) {
+            s_logger.info("Unexpected exception caught while rewriting OVF:" + e.getMessage(), e);
             throw new CloudRuntimeException(e);
         }
     }
 
-    OVFDisk getDisk(String fileRef, List<OVFDisk> disks) {
-        for (OVFDisk disk : disks) {
-            if (disk._fileRef.equals(fileRef)) {
-                return disk;
+    OVFFile getFileDefinitionFromDiskDefinition(String fileRef, List<OVFFile> files) {
+        for (OVFFile file : files) {
+            if (file._id.equals(fileRef)) {
+                return file;
             }
         }
         return null;
     }
 
+    public List<OVFNetworkTO> getNetPrerequisitesFromDocument(Document doc) throws InternalErrorException {
+        if (doc == null) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("no document to parse; returning no prerequiste networks");
+            }
+            return Collections.emptyList();
+        }
+
+        Map<String, OVFNetworkTO> nets = getNetworksFromDocumentTree(doc);
+
+        checkForOnlyOneSystemNode(doc);
+
+        matchNicsToNets(nets, doc);
+
+        return new ArrayList<>(nets.values());
+    }
+
+    private void matchNicsToNets(Map<String, OVFNetworkTO> nets, Node systemElement) {
+        final DocumentTraversal traversal = (DocumentTraversal) systemElement;
+        final NodeIterator iterator = traversal.createNodeIterator(systemElement, NodeFilter.SHOW_ELEMENT, null, true);
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("starting out with %d network-prerequisites, parsing hardware",nets.size()));
+        }
+        int nicCount = 0;
+        for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
+            final Element e = (Element) n;
+            if ("rasd:Connection".equals(e.getTagName())) {
+                nicCount++;
+                String name = e.getTextContent(); // should be in our nets
+                if(nets.get(name) == null) {
+                    if(s_logger.isInfoEnabled()) {
+                        s_logger.info(String.format("found a nic definition without a network definition byname %s, adding it to the list.", name));
+                    }
+                    nets.put(name, new OVFNetworkTO());
+                }
+                OVFNetworkTO thisNet = nets.get(name);
+                if (e.getParentNode() != null) {
+                    fillNicPrerequisites(thisNet,e.getParentNode());
+                }
+            }
+        }
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("ending up with %d network-prerequisites, parsed %d nics", nets.size(), nicCount));
+        }
+    }
+
+    /**
+     * get all the stuff from parent node
+     *
+     * @param nic the object to carry through the system
+     * @param parentNode the xml container node for nic data
+     */
+    private void fillNicPrerequisites(OVFNetworkTO nic, Node parentNode) {
+        String addressOnParentStr = getChildNodeValue(parentNode, "AddressOnParent");
+        String automaticAllocationStr = getChildNodeValue(parentNode, "AutomaticAllocation");
+        String description = getChildNodeValue(parentNode, "Description");
+        String elementName = getChildNodeValue(parentNode, "ElementName");
+        String instanceIdStr = getChildNodeValue(parentNode, "InstanceID");
+        String resourceSubType = getChildNodeValue(parentNode, "ResourceSubType");
+        String resourceType = getChildNodeValue(parentNode, "ResourceType");
+
+        try {
+            int addressOnParent = Integer.parseInt(addressOnParentStr);
+            nic.setAddressOnParent(addressOnParent);
+        } catch (NumberFormatException e) {
+            s_logger.warn("Encountered element of type \"AddressOnParent\", that could not be parse to an integer number: " + addressOnParentStr);
+        }
+
+        boolean automaticAllocation = StringUtils.isNotBlank(automaticAllocationStr) && Boolean.parseBoolean(automaticAllocationStr);
+        nic.setAutomaticAllocation(automaticAllocation);
+        nic.setNicDescription(description);
+        nic.setElementName(elementName);
+
+        try {
+            int instanceId = Integer.parseInt(instanceIdStr);
+            nic.setInstanceID(instanceId);
+        } catch (NumberFormatException e) {
+            s_logger.warn("Encountered element of type \"InstanceID\", that could not be parse to an integer number: " + instanceIdStr);
+        }
+
+        nic.setResourceSubType(resourceSubType);
+        nic.setResourceType(resourceType);
+    }
+
+    private void checkForOnlyOneSystemNode(Document doc) throws InternalErrorException {
+        // get hardware VirtualSystem, for now we support only one of those
+        NodeList systemElements = doc.getElementsByTagName("VirtualSystem");
+        if (systemElements.getLength() != 1) {
+            String msg = "found " + systemElements.getLength() + " system definitions in OVA, can only handle exactly one.";
+            s_logger.warn(msg);
+            throw new InternalErrorException(msg);
+        }
+    }
+
+    private Map<String, OVFNetworkTO> getNetworksFromDocumentTree(Document doc) {
+        NodeList networkElements = doc.getElementsByTagName("Network");
+        Map<String, OVFNetworkTO> nets = new HashMap<>();
+        for (int i = 0; i < networkElements.getLength(); i++) {
+
+            Element networkElement = (Element)networkElements.item(i);
+            String networkName = getNodeAttribute(networkElement,"ovf","name");
+
+            String description = getChildNodeValue(networkElement, "Description");
+
+            OVFNetworkTO network = new OVFNetworkTO();
+            network.setName(networkName);
+            network.setNetworkDescription(description);
+
+            nets.put(networkName,network);
+        }
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("found %d networks in template", nets.size()));
+        }
+        return nets;
+    }
+
+    private boolean hardwareItemContainsConfiguration(OVFVirtualHardwareItemTO item, String configurationId) {
+        if (StringUtils.isBlank(configurationId) || StringUtils.isBlank(item.getConfigurationIds())) {
+            return true;
+        }
+        String configurationIds = item.getConfigurationIds();
+        if (StringUtils.isNotBlank(configurationIds)) {
+            String[] configurations = configurationIds.split(" ");
+            List<String> confList = Arrays.asList(configurations);
+            return confList.contains(configurationId);
+        }
+        return false;
+    }
+
+    /**
+     * Retrieve the virtual hardware section and its deployment options as configurations
+     */
+    public OVFVirtualHardwareSectionTO getVirtualHardwareSectionFromDocument(Document doc) {
+        List<OVFConfigurationTO> configurations = getDeploymentOptionsFromDocumentTree(doc);
+        List<OVFVirtualHardwareItemTO> items = getVirtualHardwareItemsFromDocumentTree(doc);
+        if (CollectionUtils.isNotEmpty(configurations)) {
+            for (OVFConfigurationTO configuration : configurations) {
+                List<OVFVirtualHardwareItemTO> confItems = items.stream().
+                        filter(x -> StringUtils.isNotBlank(x.getConfigurationIds())
+                                && hardwareItemContainsConfiguration(x, configuration.getId()))
+                        .collect(Collectors.toList());
+                configuration.setHardwareItems(confItems);
+            }
+        }
+        List<OVFVirtualHardwareItemTO> commonItems = null;
+        if (CollectionUtils.isNotEmpty(items)) {
+            commonItems = items.stream().filter(x -> StringUtils.isBlank(x.getConfigurationIds())).collect(Collectors.toList());
+        }
+        String minimumHardwareVersion = getMinimumHardwareVersionFromDocumentTree(doc);
+        return new OVFVirtualHardwareSectionTO(configurations, commonItems, minimumHardwareVersion);
+    }
+
+    private String getMinimumHardwareVersionFromDocumentTree(Document doc) {
+        String version = null;
+        if (doc != null) {
+            NodeList systemNodeList = doc.getElementsByTagName("System");
+            if (systemNodeList.getLength() != 0) {
+                Node systemItem = systemNodeList.item(0);
+                String hardwareVersions = getChildNodeValue(systemItem, "VirtualSystemType");
+                if (StringUtils.isNotBlank(hardwareVersions)) {
+                    String[] versions = hardwareVersions.split(",");
+                    // Order the hardware versions and retrieve the minimum version
+                    List<String> versionsList = Arrays.stream(versions).sorted().collect(Collectors.toList());
+                    version = versionsList.get(0);
+                }
+            }
+        }
+        return version;
+    }
+
+    private List<OVFConfigurationTO> getDeploymentOptionsFromDocumentTree(Document doc) {
+        List<OVFConfigurationTO> options = new ArrayList<>();
+        if (doc == null) {
+            return options;
+        }
+        NodeList deploymentOptionSection = doc.getElementsByTagName("DeploymentOptionSection");
+        if (deploymentOptionSection.getLength() == 0) {
+            return options;
+        }
+        Node hardwareSectionNode = deploymentOptionSection.item(0);
+        NodeList childNodes = hardwareSectionNode.getChildNodes();
+        int index = 0;
+        for (int i = 0; i < childNodes.getLength(); i++) {
+            Node node = childNodes.item(i);
+            if (node != null && node.getNodeName().equals("Configuration")) {
+                Element configuration = (Element) node;
+                String configurationId = getNodeAttribute(configuration,"ovf","id");
+                String description = getChildNodeValue(configuration, "Description");
+                String label = getChildNodeValue(configuration, "Label");
+                OVFConfigurationTO option = new OVFConfigurationTO(configurationId, label, description, index);
+                options.add(option);
+                index++;
+            }
+        }
+        return options;
+    }
+
+    private List<OVFVirtualHardwareItemTO> getVirtualHardwareItemsFromDocumentTree(Document doc) {
+        List<OVFVirtualHardwareItemTO> items = new LinkedList<>();
+        if (doc == null) {
+            return items;
+        }
+        NodeList hardwareSection = doc.getElementsByTagName("VirtualHardwareSection");
+        if (hardwareSection.getLength() == 0) {
+            return items;
+        }
+        Node hardwareSectionNode = hardwareSection.item(0);
+        NodeList childNodes = hardwareSectionNode.getChildNodes();
+        for (int i = 0; i < childNodes.getLength(); i++) {
+            Node node = childNodes.item(i);
+            if (node != null && node.getNodeName().equals("Item")) {
+                Element configuration = (Element) node;
+                String configurationIds = getNodeAttribute(configuration, "ovf", "configuration");
+                String allocationUnits = getChildNodeValue(configuration, "AllocationUnits");
+                String description = getChildNodeValue(configuration, "Description");
+                String elementName = getChildNodeValue(configuration, "ElementName");
+                String instanceID = getChildNodeValue(configuration, "InstanceID");
+                String limit = getChildNodeValue(configuration, "Limit");
+                String reservation = getChildNodeValue(configuration, "Reservation");
+                String resourceType = getChildNodeValue(configuration, "ResourceType");
+                String virtualQuantity = getChildNodeValue(configuration, "VirtualQuantity");
+                String hostResource = getChildNodeValue(configuration, "HostResource");
+                String addressOnParent = getChildNodeValue(configuration, "AddressOnParent");
+                String parent = getChildNodeValue(configuration, "Parent");
+                OVFVirtualHardwareItemTO item = new OVFVirtualHardwareItemTO();
+                item.setConfigurationIds(configurationIds);
+                item.setAllocationUnits(allocationUnits);
+                item.setDescription(description);
+                item.setElementName(elementName);
+                item.setInstanceId(instanceID);
+                item.setLimit(getLongValueFromString(limit));
+                item.setReservation(getLongValueFromString(reservation));
+                Integer resType = getIntValueFromString(resourceType);
+                if (resType != null) {
+                    item.setResourceType(OVFVirtualHardwareItemTO.getResourceTypeFromId(resType));
+                }
+                item.setVirtualQuantity(getLongValueFromString(virtualQuantity));
+                item.setHostResource(hostResource);
+                item.setAddressOnParent(addressOnParent);
+                item.setParent(parent);
+                items.add(item);
+            }
+        }
+        return items;
+    }
+
+    private Long getLongValueFromString(String value) {
+        if (StringUtils.isNotBlank(value)) {
+            try {
+                return Long.parseLong(value);
+            } catch (NumberFormatException e) {
+                s_logger.debug("Could not parse the value: " + value + ", ignoring it");
+            }
+        }
+        return null;
+    }
+
+    private Integer getIntValueFromString(String value) {
+        if (StringUtils.isNotBlank(value)) {
+            try {
+                return Integer.parseInt(value);
+            } catch (NumberFormatException e) {
+                s_logger.debug("Could not parse the value: " + value + ", ignoring it");
+            }
+        }
+        return null;
+    }
+
+    protected byte[] compressOVFEula(String license) throws IOException {
+        CompressionUtil compressionUtil = new CompressionUtil();
+        return compressionUtil.compressString(license);
+    }
+
+    public List<OVFEulaSectionTO> getEulaSectionsFromDocument(Document doc) {
+        List<OVFEulaSectionTO> eulas = new LinkedList<>();
+        if (doc == null) {
+            return eulas;
+        }
+        NodeList eulaSections = doc.getElementsByTagName("EulaSection");
+        int eulaIndex = 0;
+        if (eulaSections.getLength() > 0) {
+            for (int index = 0; index < eulaSections.getLength(); index++) {
+                Node eulaNode = eulaSections.item(index);
+                NodeList eulaChildNodes = eulaNode.getChildNodes();
+                String eulaInfo = null;
+                String eulaLicense = null;
+                for (int i = 0; i < eulaChildNodes.getLength(); i++) {
+                    Node eulaItem = eulaChildNodes.item(i);
+                    if (eulaItem.getNodeName().equalsIgnoreCase("Info")) {
+                        eulaInfo = eulaItem.getTextContent();
+                    } else if (eulaItem.getNodeName().equalsIgnoreCase("License")) {
+                        eulaLicense = eulaItem.getTextContent();
+                    }
+                }
+                byte[] compressedLicense = new byte[0];
+                try {
+                    compressedLicense = compressOVFEula(eulaLicense);
+                } catch (IOException e) {
+                    s_logger.error("Could not compress the license for info " + eulaInfo);
+                    continue;
+                }
+                OVFEulaSectionTO eula = new OVFEulaSectionTO(eulaInfo, compressedLicense, eulaIndex);
+                eulas.add(eula);
+                eulaIndex++;
+            }
+        }
+
+        return eulas;
+    }
+
+    public Pair<String, String> getOperatingSystemInfoFromDocument(Document doc) {
+        if (doc == null) {
+            return null;
+        }
+        NodeList guesOsList = doc.getElementsByTagName("OperatingSystemSection");
+        if (guesOsList.getLength() == 0) {
+            return null;
+        }
+        Node guestOsNode = guesOsList.item(0);
+        Element guestOsElement = (Element) guestOsNode;
+        String osType = getNodeAttribute(guestOsElement, "vmw", "osType");
+        String description = getChildNodeValue(guestOsNode, "Description");
+        return new Pair<>(osType, description);
+    }
+
     class OVFFile {
         // <File ovf:href="i-2-8-VM-disk2.vmdk" ovf:id="file1" ovf:size="69120" />
         public String _href;
@@ -417,7 +929,6 @@
         //<Disk ovf:capacity="50" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk2" ovf:fileRef="file2"
         //ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="43319296" />
         public Long _capacity;
-        public String _capacityUnit;
         public String _diskId;
         public String _fileRef;
         public Long _populatedSize;
diff --git a/api/src/main/java/com/cloud/agent/api/storage/OVFProperty.java b/api/src/main/java/com/cloud/agent/api/storage/OVFProperty.java
deleted file mode 100644
index ac9ae77..0000000
--- a/api/src/main/java/com/cloud/agent/api/storage/OVFProperty.java
+++ /dev/null
@@ -1,33 +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.
-//
-
-package com.cloud.agent.api.storage;
-
-public interface OVFProperty {
-
-    Long getTemplateId();
-    String getKey();
-    String getType();
-    String getValue();
-    String getQualifiers();
-    Boolean isUserConfigurable();
-    String getLabel();
-    String getDescription();
-    Boolean isPassword();
-}
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/storage/OVFPropertyTO.java b/api/src/main/java/com/cloud/agent/api/storage/OVFPropertyTO.java
deleted file mode 100644
index abf743a..0000000
--- a/api/src/main/java/com/cloud/agent/api/storage/OVFPropertyTO.java
+++ /dev/null
@@ -1,134 +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.
-//
-
-package com.cloud.agent.api.storage;
-
-import com.cloud.agent.api.LogLevel;
-
-/**
- * Used to represent travel objects like:
- * <Property ovf:key="RouteDefault" ovf:type="string" ovf:qualifiers="ValueMap{&quot;Default Route&quot;,&quot;Remote HTTP and SSH Client Routes&quot;}" ovf:value="Default Route" ovf:userConfigurable="true">
- *         <Label>Select Route Type</Label>
- *         <Description>Select the route/gateway type.
- * Choose "Default Route" to route all traffic through the Management gateway. Use this option when enabling Smart Licensing registration at initial deployment.
- * Choose "Remote HTTP and SSH Client Routes" to route only traffic destined for the management client(s), when they are on remote networks.</Description>
- *       </Property>
- */
-public class OVFPropertyTO implements OVFProperty {
-
-    private String key;
-    private String type;
-    @LogLevel(LogLevel.Log4jLevel.Off)
-    private String value;
-    private String qualifiers;
-    private Boolean userConfigurable;
-    private String label;
-    private String description;
-    private Boolean password;
-
-    public OVFPropertyTO() {
-    }
-
-    public OVFPropertyTO(String key, String value, boolean password) {
-        this.key = key;
-        this.value = value;
-        this.password = password;
-    }
-
-    public OVFPropertyTO(String key, String type, String value, String qualifiers, boolean userConfigurable,
-                       String label, String description, boolean password) {
-        this.key = key;
-        this.type = type;
-        this.value = value;
-        this.qualifiers = qualifiers;
-        this.userConfigurable = userConfigurable;
-        this.label = label;
-        this.description = description;
-        this.password = password;
-    }
-
-    @Override
-    public Long getTemplateId() {
-        return null;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String getQualifiers() {
-        return qualifiers;
-    }
-
-    public void setQualifiers(String qualifiers) {
-        this.qualifiers = qualifiers;
-    }
-
-    public Boolean isUserConfigurable() {
-        return userConfigurable;
-    }
-
-    public void setUserConfigurable(Boolean userConfigurable) {
-        this.userConfigurable = userConfigurable;
-    }
-
-    public String getLabel() {
-        return label;
-    }
-
-    public void setLabel(String label) {
-        this.label = label;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Boolean isPassword() {
-        return password;
-    }
-
-    public void setPassword(Boolean password) {
-        this.password = password;
-    }
-}
diff --git a/api/src/main/java/com/cloud/agent/api/to/DatadiskTO.java b/api/src/main/java/com/cloud/agent/api/to/DatadiskTO.java
index 1d3f91e..31a02b0 100644
--- a/api/src/main/java/com/cloud/agent/api/to/DatadiskTO.java
+++ b/api/src/main/java/com/cloud/agent/api/to/DatadiskTO.java
@@ -27,18 +27,14 @@
     private boolean isIso;
     private String diskController;
     private String diskControllerSubType;
+    private int diskNumber;
+    private String configuration;
 
     public DatadiskTO() {
     }
 
-    public DatadiskTO(String path, long virtualSize, long fileSize, boolean bootable) {
-        this.path = path;
-        this.virtualSize = virtualSize;
-        this.fileSize = fileSize;
-        this.bootable = bootable;
-    }
-
-    public DatadiskTO(String path, long virtualSize, long fileSize, String diskId, boolean isIso, boolean bootable, String controller, String controllerSubType) {
+    public DatadiskTO(String path, long virtualSize, long fileSize, String diskId, boolean isIso, boolean bootable,
+                      String controller, String controllerSubType, int diskNumber, String configuration) {
         this.path = path;
         this.virtualSize = virtualSize;
         this.fileSize = fileSize;
@@ -47,6 +43,8 @@
         this.isIso = isIso;
         this.diskController = controller;
         this.diskControllerSubType = controllerSubType;
+        this.diskNumber = diskNumber;
+        this.configuration = configuration;
     }
 
     public String getPath() {
@@ -105,4 +103,11 @@
         this.diskControllerSubType = diskControllerSubType;
     }
 
+    public int getDiskNumber() {
+        return this.diskNumber;
+    }
+
+    public String getConfiguration() {
+        return configuration;
+    }
 }
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/to/DeployAsIsInfoTO.java b/api/src/main/java/com/cloud/agent/api/to/DeployAsIsInfoTO.java
new file mode 100644
index 0000000..9400de0
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/DeployAsIsInfoTO.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 com.cloud.agent.api.to;
+
+import com.cloud.agent.api.LogLevel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * TO class sent to the hypervisor layer with the information needed to handle deploy-as-is VM deployments
+ */
+public class DeployAsIsInfoTO {
+
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private Map<String, String> properties = new HashMap<>();
+    private Map<Integer, String> nicAdapterMap = new HashMap();
+
+    public DeployAsIsInfoTO() {
+    }
+
+    public DeployAsIsInfoTO(Map<String, String> properties, Map<Integer, String> nicAdapterMap) {
+        this.properties = properties;
+        this.nicAdapterMap = nicAdapterMap;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public Map<Integer, String> getNicAdapterMap() {
+        return nicAdapterMap;
+    }
+}
diff --git a/api/src/main/java/com/cloud/agent/api/to/NfsTO.java b/api/src/main/java/com/cloud/agent/api/to/NfsTO.java
index 1cf7218..0f6511e 100644
--- a/api/src/main/java/com/cloud/agent/api/to/NfsTO.java
+++ b/api/src/main/java/com/cloud/agent/api/to/NfsTO.java
@@ -24,7 +24,7 @@
     private DataStoreRole _role;
     private String uuid;
     private static final String pathSeparator = "/";
-    private Integer nfsVersion;
+    private String nfsVersion;
 
     public NfsTO() {
 
@@ -73,11 +73,11 @@
         return pathSeparator;
     }
 
-    public Integer getNfsVersion() {
+    public String getNfsVersion() {
         return nfsVersion;
     }
 
-    public void setNfsVersion(Integer nfsVersion) {
+    public void setNfsVersion(String nfsVersion) {
         this.nfsVersion = nfsVersion;
     }
 }
diff --git a/api/src/main/java/com/cloud/agent/api/to/OVFInformationTO.java b/api/src/main/java/com/cloud/agent/api/to/OVFInformationTO.java
new file mode 100644
index 0000000..6c6c61d
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/OVFInformationTO.java
@@ -0,0 +1,98 @@
+//
+// 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.to;
+
+import com.cloud.agent.api.LogLevel;
+import com.cloud.agent.api.to.deployasis.OVFEulaSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareSectionTO;
+import com.cloud.utils.Pair;
+
+import java.util.List;
+
+/**
+ * Placeholder class for all the subclasses obtained from the OVF parsing
+ */
+public class OVFInformationTO {
+
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private List<OVFPropertyTO> properties;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private List<OVFNetworkTO> networks;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private List<DatadiskTO> disks;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private OVFVirtualHardwareSectionTO hardwareSection;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private List<OVFEulaSectionTO> eulaSections;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private Pair<String, String> guestOsInfo;
+
+    public OVFInformationTO() {
+    }
+
+    public List<OVFPropertyTO> getProperties() {
+        return properties;
+    }
+
+    public void setProperties(List<OVFPropertyTO> properties) {
+        this.properties = properties;
+    }
+
+    public List<OVFNetworkTO> getNetworks() {
+        return networks;
+    }
+
+    public void setNetworks(List<OVFNetworkTO> networks) {
+        this.networks = networks;
+    }
+
+    public List<DatadiskTO> getDisks() {
+        return disks;
+    }
+
+    public void setDisks(List<DatadiskTO> disks) {
+        this.disks = disks;
+    }
+
+    public OVFVirtualHardwareSectionTO getHardwareSection() {
+        return hardwareSection;
+    }
+
+    public void setHardwareSection(OVFVirtualHardwareSectionTO hardwareSection) {
+        this.hardwareSection = hardwareSection;
+    }
+
+    public List<OVFEulaSectionTO> getEulaSections() {
+        return eulaSections;
+    }
+
+    public void setEulaSections(List<OVFEulaSectionTO> eulaSections) {
+        this.eulaSections = eulaSections;
+    }
+
+    public Pair<String, String> getGuestOsInfo() {
+        return guestOsInfo;
+    }
+
+    public void setGuestOsInfo(Pair<String, String> guestOsInfo) {
+        this.guestOsInfo = guestOsInfo;
+    }
+}
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 40f30df..efc735c 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,10 +20,7 @@
 import java.util.Map;
 import java.util.HashMap;
 
-import com.cloud.agent.api.LogLevel;
-import com.cloud.agent.api.storage.OVFPropertyTO;
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
-import com.cloud.utils.Pair;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachine.Type;
 
@@ -65,6 +62,7 @@
     String uuid;
     String bootType;
     String bootMode;
+    boolean enterHardwareSetup;
 
     DiskTO[] disks;
     NicTO[] nics;
@@ -80,8 +78,7 @@
 
     Map<String, String> guestOsDetails = new HashMap<String, String>();
     Map<String, String> extraConfig = new HashMap<>();
-    @LogLevel(LogLevel.Log4jLevel.Off)
-    Pair<String, List<OVFPropertyTO>> ovfProperties;
+    DeployAsIsInfoTO deployAsIsInfo;
 
     public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader,
             String os, boolean enableHA, boolean limitCpuUse, String vncPassword) {
@@ -375,13 +372,6 @@
         return extraConfig;
     }
 
-    public Pair<String, List<OVFPropertyTO>> getOvfProperties() {
-        return ovfProperties;
-    }
-
-    public void setOvfProperties(Pair<String, List<OVFPropertyTO>> ovfProperties) {
-        this.ovfProperties = ovfProperties;
-    }
     public String getBootType() {
         return bootType;
     }
@@ -393,4 +383,20 @@
     public String getBootMode() { return bootMode; }
 
     public void setBootMode(String bootMode) { this.bootMode = bootMode; }
+
+    public boolean isEnterHardwareSetup() {
+        return enterHardwareSetup;
+    }
+
+    public void setEnterHardwareSetup(boolean enterHardwareSetup) {
+        this.enterHardwareSetup = enterHardwareSetup;
+    }
+
+    public DeployAsIsInfoTO getDeployAsIsInfo() {
+        return deployAsIsInfo;
+    }
+
+    public void setDeployAsIsInfo(DeployAsIsInfoTO deployAsIsInfo) {
+        this.deployAsIsInfo = deployAsIsInfo;
+    }
 }
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFConfigurationTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFConfigurationTO.java
new file mode 100644
index 0000000..aa3c603
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFConfigurationTO.java
@@ -0,0 +1,64 @@
+//
+// 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.to.deployasis;
+
+import java.util.List;
+
+/**
+ * This class represents a template deployment option (configuration) parsed from the OVF
+ */
+public class OVFConfigurationTO implements TemplateDeployAsIsInformationTO {
+
+    private final String id;
+    private final String label;
+    private final String description;
+    private List<OVFVirtualHardwareItemTO> hardwareItems;
+    private int index;
+
+    public OVFConfigurationTO(String id, String label, String description, int index) {
+        this.id = id;
+        this.label = label;
+        this.description = description;
+        this.index = index;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setHardwareItems(List<OVFVirtualHardwareItemTO> items) {
+        this.hardwareItems = items;
+    }
+
+    public List<OVFVirtualHardwareItemTO> getHardwareItems() {
+        return hardwareItems;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFEulaSectionTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFEulaSectionTO.java
new file mode 100644
index 0000000..8936617
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFEulaSectionTO.java
@@ -0,0 +1,49 @@
+//
+// 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.to.deployasis;
+
+import com.cloud.agent.api.LogLevel;
+
+/**
+ * End-user licence agreement
+ */
+public class OVFEulaSectionTO implements TemplateDeployAsIsInformationTO {
+    private String info;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private byte[] compressedLicense;
+    private int index;
+
+    public OVFEulaSectionTO(String info, byte[] license, int eulaIndex) {
+        this.info = info;
+        this.compressedLicense = license;
+        this.index = eulaIndex;
+    }
+
+    public String getInfo() {
+        return this.info;
+    }
+
+    public byte[] getCompressedLicense() {
+        return this.compressedLicense;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+}
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFNetworkTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFNetworkTO.java
new file mode 100644
index 0000000..9b05dbc
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFNetworkTO.java
@@ -0,0 +1,124 @@
+// 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.to.deployasis;
+
+/**
+ * container for the network prerequisites as found in the appliance template
+ *
+ * for OVA:
+ * {code}
+ * <Network ovf:name="Management0-0">
+ *   <Description>Management Network Interface</Description>
+ * </Network>
+ * {code}
+ * {code}
+ * <Item>
+ *   <rasd:AddressOnParent>7</rasd:AddressOnParent>
+ *   <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+ *   <rasd:Connection>Management0-0</rasd:Connection>
+ *   <rasd:Description>E1000 Ethernet adapter on "Management Network"</rasd:Description>
+ *   <rasd:ElementName>Network adapter 1</rasd:ElementName>
+ *   <rasd:InstanceID>6</rasd:InstanceID>
+ *   <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
+ *   <rasd:ResourceType>10</rasd:ResourceType>
+ * </Item>
+ * {code}
+ */
+public class OVFNetworkTO implements TemplateDeployAsIsInformationTO {
+    String name;
+    String networkDescription;
+
+    int addressOnParent;
+    boolean automaticAllocation;
+    String nicDescription;
+    String elementName;
+    int InstanceID;
+    String resourceSubType;
+    String resourceType;
+
+    public int getAddressOnParent() {
+        return addressOnParent;
+    }
+
+    public void setAddressOnParent(int addressOnParent) {
+        this.addressOnParent = addressOnParent;
+    }
+
+    public boolean isAutomaticAllocation() {
+        return automaticAllocation;
+    }
+
+    public void setAutomaticAllocation(boolean automaticAllocation) {
+        this.automaticAllocation = automaticAllocation;
+    }
+
+    public String getNicDescription() {
+        return nicDescription;
+    }
+
+    public void setNicDescription(String nicDescription) {
+        this.nicDescription = nicDescription;
+    }
+
+    public String getElementName() {
+        return elementName;
+    }
+
+    public void setElementName(String elementName) {
+        this.elementName = elementName;
+    }
+
+    public int getInstanceID() {
+        return InstanceID;
+    }
+
+    public void setInstanceID(int instanceID) {
+        InstanceID = instanceID;
+    }
+
+    public String getResourceSubType() {
+        return resourceSubType;
+    }
+
+    public void setResourceSubType(String resourceSubType) {
+        this.resourceSubType = resourceSubType;
+    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNetworkDescription() {
+        return networkDescription;
+    }
+
+    public void setNetworkDescription(String networkDescription) {
+        this.networkDescription = networkDescription;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFPropertyTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFPropertyTO.java
new file mode 100644
index 0000000..32c6255
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFPropertyTO.java
@@ -0,0 +1,139 @@
+//
+// 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.to.deployasis;
+
+import com.cloud.agent.api.LogLevel;
+
+/**
+ * Used to represent travel objects like:
+ * <Property ovf:key="RouteDefault" ovf:type="string" ovf:qualifiers="ValueMap{&quot;Default Route&quot;,&quot;Remote HTTP and SSH Client Routes&quot;}" ovf:value="Default Route" ovf:userConfigurable="true">
+ *         <Label>Select Route Type</Label>
+ *         <Description>Select the route/gateway type.
+ * Choose "Default Route" to route all traffic through the Management gateway. Use this option when enabling Smart Licensing registration at initial deployment.
+ * Choose "Remote HTTP and SSH Client Routes" to route only traffic destined for the management client(s), when they are on remote networks.</Description>
+ *       </Property>
+ */
+public class OVFPropertyTO implements TemplateDeployAsIsInformationTO {
+
+    private String key;
+    private String type;
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private String value;
+    private String qualifiers;
+    private Boolean userConfigurable;
+    private String label;
+    private String description;
+    private Boolean password;
+    private int index;
+    private String category;
+
+    public OVFPropertyTO() {
+    }
+
+    public OVFPropertyTO(String key, String type, String value, String qualifiers, boolean userConfigurable,
+                       String label, String description, boolean password, int index, String category) {
+        this.key = key;
+        this.type = type;
+        this.value = value;
+        this.qualifiers = qualifiers;
+        this.userConfigurable = userConfigurable;
+        this.label = label;
+        this.description = description;
+        this.password = password;
+        this.index = index;
+        this.category = category;
+    }
+
+    public Long getTemplateId() {
+        return null;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getQualifiers() {
+        return qualifiers;
+    }
+
+    public void setQualifiers(String qualifiers) {
+        this.qualifiers = qualifiers;
+    }
+
+    public Boolean isUserConfigurable() {
+        return userConfigurable;
+    }
+
+    public void setUserConfigurable(Boolean userConfigurable) {
+        this.userConfigurable = userConfigurable;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Boolean isPassword() {
+        return password;
+    }
+
+    public void setPassword(Boolean password) {
+        this.password = password;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+}
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareItemTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareItemTO.java
new file mode 100644
index 0000000..f178c23
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareItemTO.java
@@ -0,0 +1,371 @@
+// 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.to.deployasis;
+
+/**
+ * A hardware item class representing a hardware item read from the OVF.
+ * From: https://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData.xsd
+ */
+public class OVFVirtualHardwareItemTO implements TemplateDeployAsIsInformationTO{
+
+    /**
+     * The hardware item type
+     * From: https://schemas.dmtf.org/wbem/cim-html/2/CIM_ResourceAllocationSettingData.html
+     */
+    public enum HardwareResourceType {
+        Other("Other", 1),
+        ComputerSystem ("Computer System", 2),
+        Processor("Processor", 3),
+        Memory("Memory", 4),
+        IDEController("IDE Controller", 5),
+        ParallelSCSIHBA("Parallel SCSI HBA", 6),
+        FC_HBA("FC HBA", 7),
+        iSCSI_HBA("iSCSI HBA", 8),
+        IB_HCA("IB HCA", 9),
+        EthernetAdapter("Ethernet Adaptor", 10),
+        OtherNetworkAdapter("Other Network Adaptor", 11),
+        IO_Slot("I/O Slot", 12),
+        IO_Device("I/O Device", 13),
+        FloppyDrive("Floppy Drive", 14),
+        CD_Drive("CD Drive", 15),
+        DVD_Drive("DVD Drive", 16),
+        DiskDrive("Disk Drive", 17),
+        TapeDrive("Tape Drive", 18),
+        StorageExtent("Storage Extent", 19),
+        OtherStorageDevice("Other Storage Device", 20),
+        SerialPort("Serial Port", 21),
+        ParallelPort("Parallel Port", 22),
+        USBController("USB Controller", 23),
+        GraphicsController("Graphics Controller", 24),
+        IEEE_1394_Controller("IEEE 1394 Controller", 25),
+        PartitionableUnit("Partitionable Unit", 26),
+        BasePartitionableUnit("base Partitionable Unit", 27),
+        PowerSupply("Power", 28),
+        CoolingCapacity("Cooling Capacity", 29),
+        EthernetSwitchPort("Ethernet Switch Port", 30),
+        LogicalDisk("Logical Disk", 31),
+        StorageVolume("Storage Volume", 32),
+        EthernetConnection("Ethernet Connection", 33),
+        DMTF_reserved("DMTF Reserved", 35),
+        VendorReserved("Vendor Reserved", 32768);
+
+        private String name;
+        private int id;
+
+        HardwareResourceType(String name, int id) {
+            this.name = name;
+            this.id = id;
+        }
+
+        public String getName() {
+            return name;
+        }
+    }
+
+    public static HardwareResourceType getResourceTypeFromId(int id) {
+        if (id <= 33) {
+            for (HardwareResourceType type : HardwareResourceType.values()) {
+                if (type.id == id) {
+                    return type;
+                }
+            }
+        } else if (id <= 32767) {
+            return HardwareResourceType.DMTF_reserved;
+        }
+        return HardwareResourceType.VendorReserved;
+    }
+
+    public enum CustomerVisibility {
+        Unknown, PassedThrough, Virtualized, NotRepresented, DMTFReserved, VendorReserved;
+    }
+
+    public enum MappingBehavior {
+        Unknown, NotSupported, Dedicated, SoftAffinity, HardAffinity, DMTFReserved, VendorReserved;
+    }
+
+    private String address;
+    private String addressOnParent;
+    private String allocationUnits;
+    private boolean automaticAllocation;
+    private boolean automaticDeallocation;
+    private String caption;
+    private String changeableType;
+    private String componentSetting;
+    private String configurationName;
+    private String connection;
+    private CustomerVisibility customerVisibility;
+    private String description;
+    private String elementName;
+    private Long generation;
+    private String hostResource;
+    private String instanceId;
+    private Long limit;
+    private MappingBehavior mappingBehavior;
+    private String otherResourceType;
+    private String parent;
+    private String poolId;
+    private Long reservation;
+    private String resourceSubtype;
+    private HardwareResourceType resourceType;
+    private String soId;
+    private String soOrgId;
+    private Long virtualQuantity;
+    private String virtualQuantityUnits;
+    private int weight;
+
+    private String configurationIds;
+
+    public String getConfigurationIds() {
+        return configurationIds;
+    }
+
+    public void setConfigurationIds(String configurationIds) {
+        this.configurationIds = configurationIds;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getAddressOnParent() {
+        return addressOnParent;
+    }
+
+    public void setAddressOnParent(String addressOnParent) {
+        this.addressOnParent = addressOnParent;
+    }
+
+    public String getAllocationUnits() {
+        return allocationUnits;
+    }
+
+    public void setAllocationUnits(String allocationUnits) {
+        this.allocationUnits = allocationUnits;
+    }
+
+    public boolean isAutomaticAllocation() {
+        return automaticAllocation;
+    }
+
+    public void setAutomaticAllocation(boolean automaticAllocation) {
+        this.automaticAllocation = automaticAllocation;
+    }
+
+    public boolean isAutomaticDeallocation() {
+        return automaticDeallocation;
+    }
+
+    public void setAutomaticDeallocation(boolean automaticDeallocation) {
+        this.automaticDeallocation = automaticDeallocation;
+    }
+
+    public String getCaption() {
+        return caption;
+    }
+
+    public void setCaption(String caption) {
+        this.caption = caption;
+    }
+
+    public String getChangeableType() {
+        return changeableType;
+    }
+
+    public void setChangeableType(String changeableType) {
+        this.changeableType = changeableType;
+    }
+
+    public String getComponentSetting() {
+        return componentSetting;
+    }
+
+    public void setComponentSetting(String componentSetting) {
+        this.componentSetting = componentSetting;
+    }
+
+    public String getConfigurationName() {
+        return configurationName;
+    }
+
+    public void setConfigurationName(String configurationName) {
+        this.configurationName = configurationName;
+    }
+
+    public String getConnection() {
+        return connection;
+    }
+
+    public void setConnection(String connection) {
+        this.connection = connection;
+    }
+
+    public CustomerVisibility getCustomerVisibility() {
+        return customerVisibility;
+    }
+
+    public void setCustomerVisibility(CustomerVisibility customerVisibility) {
+        this.customerVisibility = customerVisibility;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getElementName() {
+        return elementName;
+    }
+
+    public void setElementName(String elementName) {
+        this.elementName = elementName;
+    }
+
+    public Long getGeneration() {
+        return generation;
+    }
+
+    public void setGeneration(Long generation) {
+        this.generation = generation;
+    }
+
+    public String getHostResource() {
+        return hostResource;
+    }
+
+    public void setHostResource(String hostResource) {
+        this.hostResource = hostResource;
+    }
+
+    public String getInstanceId() {
+        return instanceId;
+    }
+
+    public void setInstanceId(String instanceId) {
+        this.instanceId = instanceId;
+    }
+
+    public Long getLimit() {
+        return limit;
+    }
+
+    public void setLimit(Long limit) {
+        this.limit = limit;
+    }
+
+    public MappingBehavior getMappingBehavior() {
+        return mappingBehavior;
+    }
+
+    public void setMappingBehavior(MappingBehavior mappingBehavior) {
+        this.mappingBehavior = mappingBehavior;
+    }
+
+    public String getOtherResourceType() {
+        return otherResourceType;
+    }
+
+    public void setOtherResourceType(String otherResourceType) {
+        this.otherResourceType = otherResourceType;
+    }
+
+    public String getParent() {
+        return parent;
+    }
+
+    public void setParent(String parent) {
+        this.parent = parent;
+    }
+
+    public String getPoolId() {
+        return poolId;
+    }
+
+    public void setPoolId(String poolId) {
+        this.poolId = poolId;
+    }
+
+    public Long getReservation() {
+        return reservation;
+    }
+
+    public void setReservation(Long reservation) {
+        this.reservation = reservation;
+    }
+
+    public String getResourceSubtype() {
+        return resourceSubtype;
+    }
+
+    public void setResourceSubtype(String resourceSubtype) {
+        this.resourceSubtype = resourceSubtype;
+    }
+
+    public HardwareResourceType getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(HardwareResourceType resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public String getSoId() {
+        return soId;
+    }
+
+    public void setSoId(String soId) {
+        this.soId = soId;
+    }
+
+    public String getSoOrgId() {
+        return soOrgId;
+    }
+
+    public void setSoOrgId(String soOrgId) {
+        this.soOrgId = soOrgId;
+    }
+
+    public Long getVirtualQuantity() {
+        return virtualQuantity;
+    }
+
+    public void setVirtualQuantity(Long virtualQuantity) {
+        this.virtualQuantity = virtualQuantity;
+    }
+
+    public String getVirtualQuantityUnits() {
+        return virtualQuantityUnits;
+    }
+
+    public void setVirtualQuantityUnits(String virtualQuantityUnits) {
+        this.virtualQuantityUnits = virtualQuantityUnits;
+    }
+
+    public int getWeight() {
+        return weight;
+    }
+
+    public void setWeight(int weight) {
+        this.weight = weight;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareSectionTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareSectionTO.java
new file mode 100644
index 0000000..4cdbf68
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/OVFVirtualHardwareSectionTO.java
@@ -0,0 +1,50 @@
+//
+// 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.to.deployasis;
+
+import java.util.List;
+
+public class OVFVirtualHardwareSectionTO implements TemplateDeployAsIsInformationTO {
+
+    public OVFVirtualHardwareSectionTO() {
+    }
+
+    private String minimiumHardwareVersion;
+    private List<OVFConfigurationTO> configurations;
+    private List<OVFVirtualHardwareItemTO> commonHardwareItems;
+
+    public OVFVirtualHardwareSectionTO(List<OVFConfigurationTO> configurations, List<OVFVirtualHardwareItemTO> commonHardwareItems,
+                                       String minimumHardwareVersion) {
+        this.configurations = configurations;
+        this.commonHardwareItems = commonHardwareItems;
+        this.minimiumHardwareVersion = minimumHardwareVersion;
+    }
+
+    public List<OVFConfigurationTO> getConfigurations() {
+        return configurations;
+    }
+
+    public List<OVFVirtualHardwareItemTO> getCommonHardwareItems() {
+        return commonHardwareItems;
+    }
+
+    public String getMinimiumHardwareVersion() {
+        return minimiumHardwareVersion;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/com/cloud/agent/api/to/deployasis/TemplateDeployAsIsInformationTO.java b/api/src/main/java/com/cloud/agent/api/to/deployasis/TemplateDeployAsIsInformationTO.java
new file mode 100644
index 0000000..9080b92
--- /dev/null
+++ b/api/src/main/java/com/cloud/agent/api/to/deployasis/TemplateDeployAsIsInformationTO.java
@@ -0,0 +1,24 @@
+//
+// 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.to.deployasis;
+
+import java.io.Serializable;
+
+public interface TemplateDeployAsIsInformationTO extends Serializable {
+}
diff --git a/api/src/main/java/com/cloud/dc/VsphereStoragePolicy.java b/api/src/main/java/com/cloud/dc/VsphereStoragePolicy.java
new file mode 100644
index 0000000..ca0ed54
--- /dev/null
+++ b/api/src/main/java/com/cloud/dc/VsphereStoragePolicy.java
@@ -0,0 +1,31 @@
+// 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.dc;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface VsphereStoragePolicy extends Identity, InternalIdentity {
+
+    long getZoneId();
+
+    String getPolicyId();
+
+    String getName();
+
+    String getDescription();
+}
diff --git a/api/src/main/java/com/cloud/deploy/DeployDestination.java b/api/src/main/java/com/cloud/deploy/DeployDestination.java
index 18503fe..91b2068 100644
--- a/api/src/main/java/com/cloud/deploy/DeployDestination.java
+++ b/api/src/main/java/com/cloud/deploy/DeployDestination.java
@@ -36,6 +36,11 @@
     Host _host;
     Map<Volume, StoragePool> _storage;
 
+    /**
+     * Display volume <-> storage pool mapping by default
+     */
+    boolean displayStorage = true;
+
     public DataCenter getDataCenter() {
         return _dc;
     }
@@ -63,9 +68,10 @@
         _host = host;
     }
 
-    public DeployDestination(DataCenter dc, Pod pod, Cluster cluster, Host host, Map<Volume, StoragePool> storage) {
+    public DeployDestination(DataCenter dc, Pod pod, Cluster cluster, Host host, Map<Volume, StoragePool> storage, boolean displayStorage) {
         this(dc, pod, cluster, host);
         _storage = storage;
+        this.displayStorage = displayStorage;
     }
 
     public DeployDestination() {
@@ -139,7 +145,7 @@
         destination.append("Cluster(").append(clusterId).append(")").append("-");
         destination.append("Host(").append(hostId).append(")").append("-");
         destination.append("Storage(");
-        if (_storage != null) {
+        if (displayStorage && _storage != null) {
             StringBuffer storageBuf = new StringBuffer();
             //String storageStr = "";
             for (Volume vol : _storage.keySet()) {
@@ -160,4 +166,8 @@
         }
         return destination.append(")]").toString();
     }
+
+    public boolean isDisplayStorage() {
+        return displayStorage;
+    }
 }
diff --git a/api/src/main/java/com/cloud/deployasis/DeployAsIsConstants.java b/api/src/main/java/com/cloud/deployasis/DeployAsIsConstants.java
new file mode 100644
index 0000000..23d286f
--- /dev/null
+++ b/api/src/main/java/com/cloud/deployasis/DeployAsIsConstants.java
@@ -0,0 +1,28 @@
+// 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.deployasis;
+
+public interface DeployAsIsConstants {
+
+    String PROPERTY_PREFIX = "property-";
+    String NETWORK_PREFIX = "network-";
+    String CONFIGURATION_PREFIX = "configuration-";
+    String HARDWARE_ITEM_PREFIX = "hardware-item-";
+    String EULA_PREFIX = "eula-";
+
+    String DEFAULT_GUEST_OS_DEPLOY_AS_IS = "OVF Configured OS";
+}
diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java
index ec80890..ebe7590 100644
--- a/api/src/main/java/com/cloud/event/EventTypes.java
+++ b/api/src/main/java/com/cloud/event/EventTypes.java
@@ -22,6 +22,10 @@
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RolePermission;
 import org.apache.cloudstack.annotation.Annotation;
+import org.apache.cloudstack.api.response.ClusterResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.PodResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.config.Configuration;
 import org.apache.cloudstack.ha.HAConfig;
 import org.apache.cloudstack.usage.Usage;
@@ -66,6 +70,7 @@
 import com.cloud.server.ResourceTag;
 import com.cloud.storage.GuestOS;
 import com.cloud.storage.GuestOSHypervisor;
+import com.cloud.storage.ImageStore;
 import com.cloud.storage.Snapshot;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.Volume;
@@ -76,10 +81,6 @@
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicSecondaryIp;
 import com.cloud.vm.VirtualMachine;
-import org.apache.cloudstack.api.response.ClusterResponse;
-import org.apache.cloudstack.api.response.HostResponse;
-import org.apache.cloudstack.api.response.PodResponse;
-import org.apache.cloudstack.api.response.ZoneResponse;
 
 public class EventTypes {
 
@@ -102,6 +103,8 @@
     public static final String EVENT_VM_RESTORE = "VM.RESTORE";
     public static final String EVENT_VM_EXPUNGE = "VM.EXPUNGE";
     public static final String EVENT_VM_IMPORT = "VM.IMPORT";
+    public static final String EVENT_VM_UNMANAGE = "VM.UNMANAGE";
+    public static final String EVENT_VM_RECOVER = "VM.RECOVER";
 
     // Domain Router
     public static final String EVENT_ROUTER_CREATE = "ROUTER.CREATE";
@@ -184,10 +187,19 @@
     public static final String EVENT_ROLE_CREATE = "ROLE.CREATE";
     public static final String EVENT_ROLE_UPDATE = "ROLE.UPDATE";
     public static final String EVENT_ROLE_DELETE = "ROLE.DELETE";
+    public static final String EVENT_ROLE_IMPORT = "ROLE.IMPORT";
     public static final String EVENT_ROLE_PERMISSION_CREATE = "ROLE.PERMISSION.CREATE";
     public static final String EVENT_ROLE_PERMISSION_UPDATE = "ROLE.PERMISSION.UPDATE";
     public static final String EVENT_ROLE_PERMISSION_DELETE = "ROLE.PERMISSION.DELETE";
 
+    // Project Role events
+    public static final  String EVENT_PROJECT_ROLE_CREATE = "PROJECT.ROLE.CREATE";
+    public static final  String EVENT_PROJECT_ROLE_UPDATE = "PROJECT.ROLE.UPDATE";
+    public static final  String EVENT_PROJECT_ROLE_DELETE = "PROJECT.ROLE.DELETE";
+    public static final String EVENT_PROJECT_ROLE_PERMISSION_CREATE = "PROJECT.ROLE.PERMISSION.CREATE";
+    public static final String EVENT_PROJECT_ROLE_PERMISSION_UPDATE = "PROJECT.ROLE.PERMISSION.UPDATE";
+    public static final String EVENT_PROJECT_ROLE_PERMISSION_DELETE = "PROJECT.ROLE.PERMISSION.DELETE";
+
     // CA events
     public static final String EVENT_CA_CERTIFICATE_ISSUE = "CA.CERTIFICATE.ISSUE";
     public static final String EVENT_CA_CERTIFICATE_REVOKE = "CA.CERTIFICATE.REVOKE";
@@ -229,6 +241,7 @@
     public static final String EVENT_TEMPLATE_EXTRACT = "TEMPLATE.EXTRACT";
     public static final String EVENT_TEMPLATE_UPLOAD = "TEMPLATE.UPLOAD";
     public static final String EVENT_TEMPLATE_CLEANUP = "TEMPLATE.CLEANUP";
+    public static final String EVENT_FILE_MIGRATE = "FILE.MIGRATE";
 
     // Volume Events
     public static final String EVENT_VOLUME_CREATE = "VOLUME.CREATE";
@@ -319,6 +332,8 @@
     public static final String EVENT_STORAGE_IP_RANGE_DELETE = "STORAGE.IP.RANGE.DELETE";
     public static final String EVENT_STORAGE_IP_RANGE_UPDATE = "STORAGE.IP.RANGE.UPDATE";
 
+    public static final String EVENT_IMAGE_STORE_DATA_MIGRATE = "IMAGE.STORE.MIGRATE.DATA";
+
     // Configuration Table
     public static final String EVENT_CONFIGURATION_VALUE_EDIT = "CONFIGURATION.VALUE.EDIT";
 
@@ -397,9 +412,11 @@
     public static final String EVENT_PROJECT_ACTIVATE = "PROJECT.ACTIVATE";
     public static final String EVENT_PROJECT_SUSPEND = "PROJECT.SUSPEND";
     public static final String EVENT_PROJECT_ACCOUNT_ADD = "PROJECT.ACCOUNT.ADD";
+    public static final String EVENT_PROJECT_USER_ADD = "PROJECT.USER.ADD";
     public static final String EVENT_PROJECT_INVITATION_UPDATE = "PROJECT.INVITATION.UPDATE";
     public static final String EVENT_PROJECT_INVITATION_REMOVE = "PROJECT.INVITATION.REMOVE";
     public static final String EVENT_PROJECT_ACCOUNT_REMOVE = "PROJECT.ACCOUNT.REMOVE";
+    public static final String EVENT_PROJECT_USER_REMOVE = "PROJECT.USER.REMOVE";
 
     // Network as a Service
     public static final String EVENT_NETWORK_ELEMENT_CONFIGURE = "NETWORK.ELEMENT.CONFIGURE";
@@ -603,6 +620,9 @@
     public static final String EVENT_POD_ROLLING_MAINTENANCE = "POD.ROLLING.MAINTENANCE";
     public static final String EVENT_ZONE_ROLLING_MAINTENANCE = "ZONE.ROLLING.MAINTENANCE";
 
+    // Storage Policies
+    public static final String EVENT_IMPORT_VCENTER_STORAGE_POLICIES = "IMPORT.VCENTER.STORAGE.POLICIES";
+
     static {
 
         // TODO: need a way to force author adding event types to declare the entity details as well, with out braking
@@ -624,6 +644,7 @@
         entityEventDetails.put(EVENT_VM_RESTORE, VirtualMachine.class);
         entityEventDetails.put(EVENT_VM_EXPUNGE, VirtualMachine.class);
         entityEventDetails.put(EVENT_VM_IMPORT, VirtualMachine.class);
+        entityEventDetails.put(EVENT_VM_UNMANAGE, VirtualMachine.class);
 
         entityEventDetails.put(EVENT_ROUTER_CREATE, VirtualRouter.class);
         entityEventDetails.put(EVENT_ROUTER_DESTROY, VirtualRouter.class);
@@ -689,6 +710,7 @@
         entityEventDetails.put(EVENT_ROLE_CREATE, Role.class);
         entityEventDetails.put(EVENT_ROLE_UPDATE, Role.class);
         entityEventDetails.put(EVENT_ROLE_DELETE, Role.class);
+        entityEventDetails.put(EVENT_ROLE_IMPORT, Role.class);
         entityEventDetails.put(EVENT_ROLE_PERMISSION_CREATE, RolePermission.class);
         entityEventDetails.put(EVENT_ROLE_PERMISSION_UPDATE, RolePermission.class);
         entityEventDetails.put(EVENT_ROLE_PERMISSION_DELETE, RolePermission.class);
@@ -1007,6 +1029,10 @@
         entityEventDetails.put(EVENT_POD_ROLLING_MAINTENANCE, PodResponse.class);
         entityEventDetails.put(EVENT_CLUSTER_ROLLING_MAINTENANCE, ClusterResponse.class);
         entityEventDetails.put(EVENT_HOST_ROLLING_MAINTENANCE, HostResponse.class);
+
+        entityEventDetails.put(EVENT_IMPORT_VCENTER_STORAGE_POLICIES, "StoragePolicies");
+
+        entityEventDetails.put(EVENT_IMAGE_STORE_DATA_MIGRATE, ImageStore.class);
     }
 
     public static String getEntityForEvent(String eventName) {
diff --git a/api/src/main/java/com/cloud/network/NetworkModel.java b/api/src/main/java/com/cloud/network/NetworkModel.java
index 002271a..e933a1c 100644
--- a/api/src/main/java/com/cloud/network/NetworkModel.java
+++ b/api/src/main/java/com/cloud/network/NetworkModel.java
@@ -66,6 +66,7 @@
     String VM_ID_FILE = "vm-id";
     String PUBLIC_KEYS_FILE = "public-keys";
     String CLOUD_IDENTIFIER_FILE = "cloud-identifier";
+    String HYPERVISOR_HOST_NAME_FILE = "hypervisor-host-name";
     int CONFIGDATA_DIR = 0;
     int CONFIGDATA_FILE = 1;
     int CONFIGDATA_CONTENT = 2;
@@ -313,7 +314,7 @@
     boolean getNetworkEgressDefaultPolicy(Long networkId);
 
     List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId,
-                                  String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows);
+                                  String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows, String hostname);
 
     String getValidNetworkCidr(Network guestNetwork);
 
diff --git a/api/src/main/java/com/cloud/network/element/UserDataServiceProvider.java b/api/src/main/java/com/cloud/network/element/UserDataServiceProvider.java
index bf6d7e8..13f72a7 100644
--- a/api/src/main/java/com/cloud/network/element/UserDataServiceProvider.java
+++ b/api/src/main/java/com/cloud/network/element/UserDataServiceProvider.java
@@ -34,4 +34,15 @@
     boolean saveUserData(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException;
 
     boolean saveSSHKey(Network network, NicProfile nic, VirtualMachineProfile vm, String sshPublicKey) throws ResourceUnavailableException;
+
+    /**
+     * Saves the hypervisor hostname in configdrive ISO or in the virtual router
+     * @param profile
+     * @param network
+     * @param vm
+     * @param dest
+     * @return
+     * @throws ResourceUnavailableException
+     */
+    boolean saveHypervisorHostname(NicProfile profile, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException;
 }
diff --git a/api/src/main/java/com/cloud/projects/ProjectAccount.java b/api/src/main/java/com/cloud/projects/ProjectAccount.java
index b8cf3f1..8025732 100644
--- a/api/src/main/java/com/cloud/projects/ProjectAccount.java
+++ b/api/src/main/java/com/cloud/projects/ProjectAccount.java
@@ -23,8 +23,12 @@
 
     long getAccountId();
 
+    Long getUserId();
+
     long getProjectId();
 
+    Long getProjectRoleId();
+
     Role getAccountRole();
 
     long getProjectAccountId();
diff --git a/api/src/main/java/com/cloud/projects/ProjectInvitation.java b/api/src/main/java/com/cloud/projects/ProjectInvitation.java
index ee28222..7a8d338 100644
--- a/api/src/main/java/com/cloud/projects/ProjectInvitation.java
+++ b/api/src/main/java/com/cloud/projects/ProjectInvitation.java
@@ -41,4 +41,10 @@
 
     Long getInDomainId();
 
+    ProjectAccount.Role getAccountRole();
+
+    Long getForUserId();
+
+    Long getProjectRoleId();
+
 }
diff --git a/api/src/main/java/com/cloud/projects/ProjectService.java b/api/src/main/java/com/cloud/projects/ProjectService.java
index dc882ef..4efc000 100644
--- a/api/src/main/java/com/cloud/projects/ProjectService.java
+++ b/api/src/main/java/com/cloud/projects/ProjectService.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.projects;
 
+import java.util.List;
+
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
@@ -34,10 +36,17 @@
      *            - account name of the project owner
      * @param domainId
      *            - domainid of the project owner
+     *
+     * @param userId
+     *            - id of the user to be made as project owner
+     *
+     * @param accountId
+     *            - id of the account to which the user belongs
+     *
      * @return the project if created successfully, null otherwise
      * @throws ResourceAllocationException
      */
-    Project createProject(String name, String displayText, String accountName, Long domainId) throws ResourceAllocationException;
+    Project createProject(String name, String displayText, String accountName, Long domainId, Long userId, Long accountId) throws ResourceAllocationException;
 
     /**
      * Deletes a project
@@ -57,10 +66,12 @@
      */
     Project getProject(long id);
 
-    ProjectAccount assignAccountToProject(Project project, long accountId, Role accountRole);
+    ProjectAccount assignAccountToProject(Project project, long accountId, Role accountRole, Long userId, Long projectRoleId);
 
     Account getProjectOwner(long projectId);
 
+    List<Long> getProjectOwners(long projectId);
+
     boolean unassignAccountFromProject(long projectId, long accountId);
 
     Project findByProjectAccountId(long projectAccountId);
@@ -69,11 +80,15 @@
 
     Project updateProject(long id, String displayText, String newOwnerName) throws ResourceAllocationException;
 
-    boolean addAccountToProject(long projectId, String accountName, String email);
+    Project updateProject(long id, String displayText, String newOwnerName, Long userId, Role newRole) throws ResourceAllocationException;
+
+    boolean addAccountToProject(long projectId, String accountName, String email, Long projectRoleId, Role projectRoleType);
 
     boolean deleteAccountFromProject(long projectId, String accountName);
 
-    boolean updateInvitation(long projectId, String accountName, String token, boolean accept);
+    boolean deleteUserFromProject(long projectId, long userId);
+
+    boolean updateInvitation(long projectId, String accountName, Long userId, String token, boolean accept);
 
     Project activateProject(long projectId);
 
@@ -84,4 +99,7 @@
     boolean deleteProjectInvitation(long invitationId);
 
     Project findByProjectAccountIdIncludingRemoved(long projectAccountId);
+
+    boolean addUserToProject(Long projectId, String username, String email, Long projectRoleId, Role projectRole);
+
 }
diff --git a/api/src/main/java/com/cloud/resource/ResourceService.java b/api/src/main/java/com/cloud/resource/ResourceService.java
index 7082308..7f04d89 100644
--- a/api/src/main/java/com/cloud/resource/ResourceService.java
+++ b/api/src/main/java/com/cloud/resource/ResourceService.java
@@ -20,6 +20,7 @@
 
 import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
 import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
 import org.apache.cloudstack.api.command.admin.host.AddHostCmd;
 import org.apache.cloudstack.api.command.admin.host.AddSecondaryStorageCmd;
 import org.apache.cloudstack.api.command.admin.host.CancelMaintenanceCmd;
@@ -58,7 +59,7 @@
 
     boolean deleteCluster(DeleteClusterCmd cmd);
 
-    Cluster updateCluster(Cluster cluster, String clusterType, String hypervisor, String allocationState, String managedstate);
+    Cluster updateCluster(UpdateClusterCmd cmd);
 
     List<? extends Host> discoverHosts(AddHostCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException;
 
diff --git a/api/src/main/java/com/cloud/storage/Storage.java b/api/src/main/java/com/cloud/storage/Storage.java
index 82bc5f6..7a229b6 100644
--- a/api/src/main/java/com/cloud/storage/Storage.java
+++ b/api/src/main/java/com/cloud/storage/Storage.java
@@ -16,11 +16,11 @@
 // under the License.
 package com.cloud.storage;
 
+import org.apache.commons.lang.NotImplementedException;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.NotImplementedException;
-
 public class Storage {
     public static enum ImageFormat {
         QCOW2(true, true, false, "qcow2"),
@@ -135,7 +135,8 @@
         OCFS2(true, false),
         SMB(true, false),
         Gluster(true, false),
-        ManagedNFS(true, false);
+        ManagedNFS(true, false),
+        DatastoreCluster(true, true); // for VMware, to abstract pool of clusters
 
         private final boolean shared;
         private final boolean overprovisioning;
diff --git a/api/src/main/java/com/cloud/storage/StoragePool.java b/api/src/main/java/com/cloud/storage/StoragePool.java
index 3a2d3bd..6c65ca1 100644
--- a/api/src/main/java/com/cloud/storage/StoragePool.java
+++ b/api/src/main/java/com/cloud/storage/StoragePool.java
@@ -106,4 +106,6 @@
     Hypervisor.HypervisorType getHypervisor();
 
     boolean isManaged();
+
+    Long getParent();
 }
diff --git a/api/src/main/java/com/cloud/storage/StorageService.java b/api/src/main/java/com/cloud/storage/StorageService.java
index aebbbcd..207fc8f 100644
--- a/api/src/main/java/com/cloud/storage/StorageService.java
+++ b/api/src/main/java/com/cloud/storage/StorageService.java
@@ -102,4 +102,6 @@
      */
     ImageStore migrateToObjectStore(String name, String url, String providerName, Map<String, String> details) throws DiscoveryException;
 
+    ImageStore updateImageStoreStatus(Long id, Boolean readonly);
+
 }
diff --git a/api/src/main/java/com/cloud/storage/Volume.java b/api/src/main/java/com/cloud/storage/Volume.java
index dde9d60..5979697 100644
--- a/api/src/main/java/com/cloud/storage/Volume.java
+++ b/api/src/main/java/com/cloud/storage/Volume.java
@@ -84,6 +84,8 @@
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Resizing, Event.OperationFailed, Ready, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Allocated, Event.UploadRequested, UploadOp, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Uploaded, Event.CopyRequested, Copying, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.OperationSucceeded, Ready, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.OperationFailed, Ready, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Copying, Event.OperationSucceeded, Ready, Arrays.asList(new StateMachine2.Transition.Impact[]{StateMachine2.Transition.Impact.USAGE})));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Copying, Event.OperationFailed, Uploaded, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadOp, Event.DestroyRequested, Destroy, null));
@@ -233,4 +235,6 @@
     boolean isDisplayVolume();
 
     boolean isDisplay();
+
+    boolean isDeployAsIs();
 }
diff --git a/api/src/main/java/com/cloud/template/VirtualMachineTemplate.java b/api/src/main/java/com/cloud/template/VirtualMachineTemplate.java
index 5177e51..95d1ebf 100644
--- a/api/src/main/java/com/cloud/template/VirtualMachineTemplate.java
+++ b/api/src/main/java/com/cloud/template/VirtualMachineTemplate.java
@@ -138,4 +138,6 @@
     void incrUpdatedCount();
 
     Date getUpdated();
+
+    boolean isDeployAsIs();
 }
diff --git a/api/src/main/java/com/cloud/vm/DiskProfile.java b/api/src/main/java/com/cloud/vm/DiskProfile.java
index 2b76c68..175a92a 100644
--- a/api/src/main/java/com/cloud/vm/DiskProfile.java
+++ b/api/src/main/java/com/cloud/vm/DiskProfile.java
@@ -100,6 +100,10 @@
         return name;
     }
 
+    public void setTags(String[] tags) {
+        this.tags = tags;
+    }
+
     /**
      * @return tags for the disk. This can be used to match it to different storage pools.
      */
diff --git a/api/src/main/java/com/cloud/vm/NicProfile.java b/api/src/main/java/com/cloud/vm/NicProfile.java
index 10d126d..7ac5342 100644
--- a/api/src/main/java/com/cloud/vm/NicProfile.java
+++ b/api/src/main/java/com/cloud/vm/NicProfile.java
@@ -52,6 +52,8 @@
     Integer networkRate;
     boolean isSecurityGroupEnabled;
 
+    Integer orderIndex;
+
     // IPv4
     String iPv4Address;
     String iPv4Netmask;
@@ -385,6 +387,14 @@
         this.requestedIPv6 = requestedIPv6;
     }
 
+    public Integer getOrderIndex() {
+        return orderIndex;
+    }
+
+    public void setOrderIndex(Integer orderIndex) {
+        this.orderIndex = orderIndex;
+    }
+
     //
     // OTHER METHODS
     //
@@ -414,6 +424,8 @@
         broadcastUri = null;
         isolationUri = null;
 
+        orderIndex = null;
+
     }
 
     @Override
diff --git a/api/src/main/java/com/cloud/vm/UserVmService.java b/api/src/main/java/com/cloud/vm/UserVmService.java
index fb99bee..56a6dfd 100644
--- a/api/src/main/java/com/cloud/vm/UserVmService.java
+++ b/api/src/main/java/com/cloud/vm/UserVmService.java
@@ -519,4 +519,9 @@
                     final long accountId, final long userId, final ServiceOffering serviceOffering, final String sshPublicKey,
                     final String hostName, final HypervisorType hypervisorType, final Map<String, String> customParameters, final VirtualMachine.PowerState powerState) throws InsufficientCapacityException;
 
+    /**
+     * Unmanage a guest VM from CloudStack
+     * @return true if the VM is successfully unmanaged, false if not.
+     */
+    boolean unmanageUserVM(Long vmId);
 }
diff --git a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
index 1abc764..c17a716 100644
--- a/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/main/java/com/cloud/vm/VirtualMachineProfile.java
@@ -38,6 +38,10 @@
 
     void setVmData(List<String[]> vmData);
 
+    void setDisks(List<DiskTO> disks);
+
+    void setNics(List<NicProfile> nics);
+
     String getConfigDriveLabel();
 
     void setConfigDriveLabel(String configDriveLabel);
@@ -63,6 +67,8 @@
         public static final Param UefiFlag = new Param("UefiFlag");
         public static final Param BootMode = new Param("BootMode");
         public static final Param BootType = new Param("BootType");
+        public static final Param BootIntoSetup = new Param("enterHardwareSetup");
+        public static final Param PreserveNics = new Param("PreserveNics");
 
         private String name;
 
diff --git a/api/src/main/java/com/cloud/vm/VmDetailConstants.java b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
index 3812aa2..9991e1f 100644
--- a/api/src/main/java/com/cloud/vm/VmDetailConstants.java
+++ b/api/src/main/java/com/cloud/vm/VmDetailConstants.java
@@ -63,4 +63,6 @@
     String IP6_ADDRESS = "ip6Address";
     String DISK = "disk";
     String DISK_OFFERING = "diskOffering";
+
+    String DEPLOY_AS_IS_CONFIGURATION = "configurationId";
 }
diff --git a/api/src/main/java/com/cloud/vm/snapshot/VMSnapshotService.java b/api/src/main/java/com/cloud/vm/snapshot/VMSnapshotService.java
index e376265..84a56aa 100644
--- a/api/src/main/java/com/cloud/vm/snapshot/VMSnapshotService.java
+++ b/api/src/main/java/com/cloud/vm/snapshot/VMSnapshotService.java
@@ -52,5 +52,5 @@
      * the vm gets deleted on hypervisor (no need to delete each vm snapshot before deleting vm, just mark them as deleted on DB)
      * @param id vm id
      */
-    boolean deleteVMSnapshotsFromDB(Long vmId);
+    boolean deleteVMSnapshotsFromDB(Long vmId, boolean unmanage);
 }
diff --git a/api/src/main/java/org/apache/cloudstack/acl/ProjectRole.java b/api/src/main/java/org/apache/cloudstack/acl/ProjectRole.java
new file mode 100644
index 0000000..601c168
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/acl/ProjectRole.java
@@ -0,0 +1,26 @@
+// 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.acl;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface ProjectRole extends RoleEntity, InternalIdentity, Identity {
+
+    Long getProjectId();
+}
diff --git a/api/src/main/java/org/apache/cloudstack/acl/ProjectRolePermission.java b/api/src/main/java/org/apache/cloudstack/acl/ProjectRolePermission.java
new file mode 100644
index 0000000..ae6d78c
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/acl/ProjectRolePermission.java
@@ -0,0 +1,24 @@
+// 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.acl;
+
+public interface ProjectRolePermission extends RolePermissionEntity {
+    long getProjectRoleId();
+    long getProjectId();
+    long getSortOrder();
+}
diff --git a/api/src/main/java/org/apache/cloudstack/acl/ProjectRoleService.java b/api/src/main/java/org/apache/cloudstack/acl/ProjectRoleService.java
new file mode 100644
index 0000000..2bdc9ff
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/acl/ProjectRoleService.java
@@ -0,0 +1,118 @@
+// 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.acl;
+
+import java.util.List;
+
+import org.apache.cloudstack.api.command.admin.acl.project.CreateProjectRolePermissionCmd;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+
+public interface ProjectRoleService {
+    /**
+     * Creates a Project role in a Project to be mapped to a user/ account (all users of an account)
+     * @param projectId ID of the project where the project role is to be created
+     * @param name Name of the project role
+     * @param description description provided for the project role
+     * @return the Instance of the project role created
+     */
+    ProjectRole createProjectRole(Long projectId, String name, String description);
+
+    /**
+     * Updates a Project role created
+     * @param role Project role reference to be updated
+     * @param projectId ID of the project where the Project role exists
+     * @param name new name to be given to the project role
+     * @param description description for the project role
+     * @return the updated instance of the project role
+     */
+    ProjectRole updateProjectRole(ProjectRole role, Long projectId, String name, String description);
+
+    /**
+     *
+     * @param projectId ID of the project in which the project role is to be searched for
+     * @param roleName name/ part of a project role name
+     * @return List of Project roles matching the given name in the project
+     */
+    List<ProjectRole> findProjectRolesByName(Long projectId, String roleName);
+
+    /**
+     *
+     * @param role Project role to be deleted
+     * @param projectId ID of the project where the role is present
+     * @return success/failure of the delete operation
+     */
+    boolean deleteProjectRole(ProjectRole role, Long projectId);
+
+    /**
+     * Determines if Dynamic Roles feature is enabled , if it isn't then the project roles will not be applied
+     */
+    boolean isEnabled();
+
+    /**
+     *
+     * @param roleId Project role ID which needs to be found
+     * @param projectId ID of the project where the role is to be found
+     * @return the corresponding project role
+     */
+    ProjectRole findProjectRole(Long roleId, Long projectId);
+
+    /**
+     *
+     * @param projectId ID of the project whosr project roles are to be listed
+     * @return List of all available project roles
+     */
+    List<ProjectRole> findProjectRoles(Long projectId);
+
+    /**
+     * Creates a project role permission to be mapped to a project role.
+     * All accounts/users mapped to this project role will impose restrictions on API access
+     * to users based on the project role. This is to further limit restrictions on users in projects
+     */
+    ProjectRolePermission createProjectRolePermission(CreateProjectRolePermissionCmd cmd);
+
+    /**
+     * Updates the order of the project role permission
+     * @param projectId ID of the project where the project role permission exists
+     * @param projectRole project role to which the permission is mapped to
+     * @param rolePermissionsOrder re-arranged order of permissions
+     * @return success/failure of operation
+     */
+    boolean updateProjectRolePermission(Long projectId, ProjectRole projectRole, List<ProjectRolePermission> rolePermissionsOrder);
+
+    /**
+     *
+     * Updates the permission of the project role permission
+     */
+    boolean updateProjectRolePermission(Long projectId, ProjectRole projectRole, ProjectRolePermission projectRolePermission, Permission newPermission);
+
+    /**
+     * Finds the project role permission for the given ID
+     */
+    ProjectRolePermission findProjectRolePermission(final Long projRolePermissionId);
+
+    /**
+     * deletes the given project role
+     */
+    boolean deleteProjectRolePermission(ProjectRolePermission projectRolePermission);
+
+    /**
+     * returns list of all project role permissions mapped to the requested project role
+     */
+    List<ProjectRolePermission> findAllProjectRolePermissions(Long projectId, Long projectRoleId);
+
+}
diff --git a/api/src/main/java/org/apache/cloudstack/acl/Role.java b/api/src/main/java/org/apache/cloudstack/acl/Role.java
index b05d886..c25d7a9 100644
--- a/api/src/main/java/org/apache/cloudstack/acl/Role.java
+++ b/api/src/main/java/org/apache/cloudstack/acl/Role.java
@@ -20,8 +20,7 @@
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
 
-public interface Role extends InternalIdentity, Identity {
-    String getName();
+public interface Role extends RoleEntity, InternalIdentity, Identity {
     RoleType getRoleType();
-    String getDescription();
+    boolean isDefault();
 }
diff --git a/api/src/main/java/org/apache/cloudstack/acl/RoleEntity.java b/api/src/main/java/org/apache/cloudstack/acl/RoleEntity.java
new file mode 100644
index 0000000..dc25418
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/acl/RoleEntity.java
@@ -0,0 +1,26 @@
+// 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.acl;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface RoleEntity extends InternalIdentity, Identity {
+    String getName();
+    String getDescription();
+}
diff --git a/api/src/main/java/org/apache/cloudstack/acl/RolePermission.java b/api/src/main/java/org/apache/cloudstack/acl/RolePermission.java
index 0157a66..9cc01e9 100644
--- a/api/src/main/java/org/apache/cloudstack/acl/RolePermission.java
+++ b/api/src/main/java/org/apache/cloudstack/acl/RolePermission.java
@@ -17,15 +17,7 @@
 
 package org.apache.cloudstack.acl;
 
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
-public interface RolePermission extends InternalIdentity, Identity {
-    enum Permission {ALLOW, DENY}
-
+public interface RolePermission extends RolePermissionEntity {
     long getRoleId();
-    Rule getRule();
-    Permission getPermission();
-    String getDescription();
     long getSortOrder();
 }
diff --git a/api/src/main/java/org/apache/cloudstack/acl/RolePermissionEntity.java b/api/src/main/java/org/apache/cloudstack/acl/RolePermissionEntity.java
new file mode 100644
index 0000000..251c6b6
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/acl/RolePermissionEntity.java
@@ -0,0 +1,30 @@
+// 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.acl;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface RolePermissionEntity extends InternalIdentity, Identity {
+    public enum Permission {
+        ALLOW, DENY
+    }
+    Rule getRule();
+    Permission getPermission();
+    String getDescription();
+}
diff --git a/api/src/main/java/org/apache/cloudstack/acl/RoleService.java b/api/src/main/java/org/apache/cloudstack/acl/RoleService.java
index 86f8a77..dfc5cb1 100644
--- a/api/src/main/java/org/apache/cloudstack/acl/RoleService.java
+++ b/api/src/main/java/org/apache/cloudstack/acl/RoleService.java
@@ -18,10 +18,11 @@
 package org.apache.cloudstack.acl;
 
 import java.util.List;
+import java.util.Map;
 
 import com.cloud.utils.Pair;
 
-import org.apache.cloudstack.acl.RolePermission.Permission;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
 import org.apache.cloudstack.framework.config.ConfigKey;
 
 public interface RoleService {
@@ -41,13 +42,17 @@
 
     Role createRole(String name, RoleType roleType, String description);
 
+    Role createRole(String name, Role role, String description);
+
+    Role importRole(String name, RoleType roleType, String description, List<Map<String, Object>> rules, boolean forced);
+
     Role updateRole(Role role, String name, RoleType roleType, String description);
 
     boolean deleteRole(Role role);
 
     RolePermission findRolePermission(Long id);
 
-    RolePermission findRolePermissionByUuid(String uuid);
+    RolePermission findRolePermissionByRoleIdAndRule(Long roleId, String rule);
 
     RolePermission createRolePermission(Role role, Rule rule, Permission permission, String description);
 
@@ -85,4 +90,6 @@
     Pair<List<Role>, Integer> findRolesByType(RoleType roleType, Long startIndex, Long limit);
 
     List<RolePermission> findAllPermissionsBy(Long roleId);
+
+    Permission getRolePermission(String permission);
 }
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 cf38aba..0087fee 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java
@@ -55,6 +55,7 @@
     public static final String CERTIFICATE_CHAIN = "certchain";
     public static final String CERTIFICATE_FINGERPRINT = "fingerprint";
     public static final String CERTIFICATE_ID = "certid";
+    public static final String ENABLED_REVOCATION_CHECK = "enabledrevocationcheck";
     public static final String CONTROLLER = "controller";
     public static final String CONTROLLER_UNIT = "controllerunit";
     public static final String COPY_IMAGE_TAGS = "copyimagetags";
@@ -113,6 +114,7 @@
     public static final String DISK_IO_WRITE = "diskiowrite";
     public static final String DISK_IO_PSTOTAL = "diskiopstotal";
     public static final String DISK_SIZE = "disksize";
+    public static final String DOWNLOAD_DETAILS = "downloaddetails";
     public static final String UTILIZATION = "utilization";
     public static final String DRIVER = "driver";
     public static final String ROOT_DISK_SIZE = "rootdisksize";
@@ -183,6 +185,7 @@
     public static final String ICMP_TYPE = "icmptype";
     public static final String ID = "id";
     public static final String IDS = "ids";
+    public static final String INDEX = "index";
     public static final String PREVIOUS_ACL_RULE_ID = "previousaclruleid";
     public static final String NEXT_ACL_RULE_ID = "nextaclruleid";
     public static final String MOVE_ACL_CONSISTENCY_HASH = "aclconsistencyhash";
@@ -234,6 +237,7 @@
     public static final String MAX_MEMORY = "maxmemory";
     public static final String MIN_CPU_NUMBER = "mincpunumber";
     public static final String MIN_MEMORY = "minmemory";
+    public static final String MIGRATION_TYPE = "migrationtype";
     public static final String MEMORY = "memory";
     public static final String MODE = "mode";
     public static final String KEEPALIVE_ENABLED = "keepaliveenabled";
@@ -259,7 +263,7 @@
     public static final String OUTOFBANDMANAGEMENT_POWERSTATE = "outofbandmanagementpowerstate";
     public static final String OUTOFBANDMANAGEMENT_ENABLED = "outofbandmanagementenabled";
     public static final String OUTPUT = "output";
-    public static final String OVF_PROPERTIES = "ovfproperties";
+    public static final String PROPERTIES = "properties";
     public static final String PARAMS = "params";
     public static final String PARENT_ID = "parentid";
     public static final String PARENT_DOMAIN_ID = "parentdomainid";
@@ -347,11 +351,14 @@
     public static final String STORAGE_POLICY = "storagepolicy";
     public static final String STORAGE_MOTION_ENABLED = "storagemotionenabled";
     public static final String STORAGE_CAPABILITIES = "storagecapabilities";
+    public static final String OWNER = "owner";
+    public static final String SWAP_OWNER = "swapowner";
     public static final String SYSTEM_VM_TYPE = "systemvmtype";
     public static final String TAGS = "tags";
     public static final String TARGET_IQN = "targetiqn";
     public static final String TEMPLATE_FILTER = "templatefilter";
     public static final String TEMPLATE_ID = "templateid";
+    public static final String TEMPLATE_IDS = "templateids";
     public static final String TEMPLATE_NAME = "templatename";
     public static final String ISO_ID = "isoid";
     public static final String TIMEOUT = "timeout";
@@ -379,6 +386,7 @@
     public static final String VIRTUAL_MACHINE_NAME = "virtualmachinename";
     public static final String VIRTUAL_MACHINE_ID_IP = "vmidipmap";
     public static final String VIRTUAL_MACHINE_COUNT = "virtualmachinecount";
+    public static final String VIRTUAL_MACHINES = "virtualmachines";
     public static final String USAGE_ID = "usageid";
     public static final String USAGE_TYPE = "usagetype";
     public static final String INCLUDE_TAGS = "includetags";
@@ -473,11 +481,15 @@
     public static final String PROJECT = "project";
     public static final String ROLE = "role";
     public static final String ROLE_ID = "roleid";
+    public static final String PROJECT_ROLE_ID = "projectroleid";
+    public static final String PROJECT_ROLE_NAME = "projectrolename";
     public static final String ROLE_TYPE = "roletype";
     public static final String ROLE_NAME = "rolename";
     public static final String PERMISSION = "permission";
     public static final String RULE = "rule";
+    public static final String RULES = "rules";
     public static final String RULE_ID = "ruleid";
+    public static final String PROJECT_ROLE_PERMISSION_ID = "projectrolepermissionid";
     public static final String RULE_ORDER = "ruleorder";
     public static final String USER = "user";
     public static final String ACTIVE_ONLY = "activeonly";
@@ -712,6 +724,7 @@
     public static final String AFFINITY_GROUP_ID = "affinitygroupid";
     public static final String DEPLOYMENT_PLANNER = "deploymentplanner";
     public static final String ACL_ID = "aclid";
+    public static final String ACL_NAME = "aclname";
     public static final String NUMBER = "number";
     public static final String IS_DYNAMICALLY_SCALABLE = "isdynamicallyscalable";
     public static final String ROUTING = "isrouting";
@@ -781,6 +794,8 @@
     public static final String EXITCODE = "exitcode";
     public static final String TARGET_ID = "targetid";
     public static final String FILES = "files";
+    public static final String SRC_POOL = "srcpool";
+    public static final String DEST_POOLS = "destpools";
     public static final String VOLUME_IDS = "volumeids";
 
     public static final String ROUTER_ID = "routerid";
@@ -808,8 +823,14 @@
     public static final String NODE_ROOT_DISK_SIZE = "noderootdisksize";
     public static final String SUPPORTS_HA = "supportsha";
 
-    public static final String BOOT_TYPE ="boottype";
-    public static final String BOOT_MODE ="bootmode";
+    public static final String BOOT_TYPE = "boottype";
+    public static final String BOOT_MODE = "bootmode";
+    public static final String BOOT_INTO_SETUP = "bootintosetup";
+    public static final String DEPLOY_AS_IS = "deployasis";
+    public static final String DEPLOY_AS_IS_DETAILS = "deployasisdetails";
+    public static final String CROSS_ZONES = "crossZones";
+    public static final String TEMPLATETYPE = "templatetype";
+    public static final String SOURCETEMPLATEID = "sourcetemplateid";
 
     public enum BootType {
         UEFI, BIOS;
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java b/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
index 382b48a..1f6d3d5 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
@@ -39,8 +39,9 @@
 
     public String getSerializedApiError(ServerApiException ex, Map<String, Object[]> apiCommandParams, String responseType);
 
-    public String handleRequest(Map params, String responseType, StringBuilder auditTrailSb) throws ServerApiException;
+    public String handleRequest(Map<String, Object[]> params, String responseType, StringBuilder auditTrailSb) throws ServerApiException;
 
     public Class<?> getCmdClass(String cmdName);
 
+    public boolean isValidApiName(String apiName);
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
index 37dbeaa..c897aad 100644
--- a/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/BaseCmd.java
@@ -17,6 +17,33 @@
 
 package org.apache.cloudstack.api;
 
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.acl.ProjectRoleService;
+import org.apache.cloudstack.acl.RoleService;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.affinity.AffinityGroupService;
+import org.apache.cloudstack.alert.AlertService;
+import org.apache.cloudstack.annotation.AnnotationService;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
+import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
+import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
+import org.apache.cloudstack.query.QueryService;
+import org.apache.cloudstack.storage.ImageStoreService;
+import org.apache.cloudstack.usage.UsageService;
+import org.apache.log4j.Logger;
+
 import com.cloud.configuration.ConfigurationService;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
@@ -58,29 +85,6 @@
 import com.cloud.utils.db.UUIDManager;
 import com.cloud.vm.UserVmService;
 import com.cloud.vm.snapshot.VMSnapshotService;
-import org.apache.cloudstack.acl.RoleService;
-import org.apache.cloudstack.acl.RoleType;
-import org.apache.cloudstack.affinity.AffinityGroupService;
-import org.apache.cloudstack.alert.AlertService;
-import org.apache.cloudstack.annotation.AnnotationService;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
-import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
-import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
-import org.apache.cloudstack.query.QueryService;
-import org.apache.cloudstack.usage.UsageService;
-import org.apache.log4j.Logger;
-
-import javax.inject.Inject;
-import java.lang.reflect.Field;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
 
 public abstract class BaseCmd {
     private static final Logger s_logger = Logger.getLogger(BaseCmd.class.getName());
@@ -112,6 +116,8 @@
     @Inject
     public RoleService roleService;
     @Inject
+    public ProjectRoleService projRoleService;
+    @Inject
     public UserVmService _userVmService;
     @Inject
     public ManagementService _mgr;
@@ -126,6 +132,8 @@
     @Inject
     public TemplateApiService _templateService;
     @Inject
+    public ImageStoreService _imageStoreService;
+    @Inject
     public SecurityGroupService _securityGroupService;
     @Inject
     public SnapshotApiService _snapshotService;
@@ -264,6 +272,10 @@
      */
     public abstract long getEntityOwnerId();
 
+    public List<Long> getEntityOwnerIds() {
+        return null;
+    }
+
     public Object getResponseObject() {
         return _responseObject;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
index 074df8d..508750a 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
@@ -52,7 +52,7 @@
 
     @Parameter(name = ApiConstants.ACCOUNT,
                type = CommandType.STRING,
-               description = "Creates the user under the specified account. If no account is specified, the username will be used as the account name.")
+               description = "Name of the account to be created. The user will be added to this newly created account. If no account is specified, the username will be used as the account name.")
     private String accountName;
 
     @Parameter(name = ApiConstants.ACCOUNT_TYPE,
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
index 05b370a..d02902d 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/account/LockAccountCmd.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.account;
 
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/BaseRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/BaseRolePermissionCmd.java
new file mode 100644
index 0000000..adf514f
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/BaseRolePermissionCmd.java
@@ -0,0 +1,63 @@
+// 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.api.command.admin.acl;
+
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.acl.Rule;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+
+import com.google.common.base.Strings;
+
+public abstract class BaseRolePermissionCmd extends BaseCmd {
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.RULE, type = CommandType.STRING, required = true, description = "The API name or wildcard rule such as list*",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String rule;
+
+    @Parameter(name = ApiConstants.PERMISSION, type = CommandType.STRING, required = true, description = "The rule permission, allow or deny. Default: deny.")
+    private String permission;
+
+    @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "The description of the role permission")
+    private String description;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Rule getRule() {
+        return new Rule(rule);
+    }
+
+    public Permission getPermission() {
+        if (Strings.isNullOrEmpty(permission)) {
+            return null;
+        }
+        return Permission.valueOf(permission.toUpperCase());
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
index 87f0288..82cdcbd 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
@@ -45,13 +45,9 @@
             description = "creates a role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty})
     private String roleName;
 
-    @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, required = true,
-            description = "The type of the role, valid options are: Admin, ResourceAdmin, DomainAdmin, User",
-            validations = {ApiArgValidator.NotNullOrEmpty})
-    private String roleType;
-
-    @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "The description of the role")
-    private String roleDescription;
+    @Parameter(name = ApiConstants.ROLE_ID, type = CommandType.UUID, entityType = RoleResponse.class,
+            description = "ID of the role to be cloned from. Either roleid or type must be passed in")
+    private Long roleId;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -61,12 +57,8 @@
         return roleName;
     }
 
-    public RoleType getRoleType() {
-        return RoleType.fromString(roleType);
-    }
-
-    public String getRoleDescription() {
-        return roleDescription;
+    public Long getRoleId() {
+        return roleId;
     }
 
     /////////////////////////////////////////////////////
@@ -85,11 +77,39 @@
 
     @Override
     public void execute() {
-        CallContext.current().setEventDetails("Role: " + getRoleName() + ", type:" + getRoleType() + ", description: " + getRoleDescription());
-        final Role role = roleService.createRole(getRoleName(), getRoleType(), getRoleDescription());
+        validateRoleParameters();
+
+        Role role = null;
+        if (getRoleId() != null) {
+            Role existingRole = roleService.findRole(getRoleId());
+            if (existingRole == null) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided");
+            }
+
+            CallContext.current().setEventDetails("Role: " + getRoleName() + ", from role: " + getRoleId() + ", description: " + getRoleDescription());
+            role = roleService.createRole(getRoleName(), existingRole, getRoleDescription());
+        } else {
+            CallContext.current().setEventDetails("Role: " + getRoleName() + ", type: " + getRoleType() + ", description: " + getRoleDescription());
+            role = roleService.createRole(getRoleName(), getRoleType(), getRoleDescription());
+        }
+
         if (role == null) {
             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create role");
         }
         setupResponse(role);
     }
+
+    private void validateRoleParameters() {
+        if (getRoleType() == null && getRoleId() == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Neither role type nor role ID is provided");
+        }
+
+        if (getRoleType() != null && getRoleId() != null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Both role type and role ID should not be specified");
+        }
+
+        if (getRoleId() != null && getRoleId() < 1L) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided");
+        }
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRolePermissionCmd.java
index aeb3f4e..d7d6ef1 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRolePermissionCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/CreateRolePermissionCmd.java
@@ -17,28 +17,27 @@
 
 package org.apache.cloudstack.api.command.admin.acl;
 
-import com.cloud.user.Account;
-import com.google.common.base.Strings;
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RolePermission;
 import org.apache.cloudstack.acl.RoleType;
-import org.apache.cloudstack.acl.Rule;
 import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.ApiArgValidator;
 import org.apache.cloudstack.api.response.RolePermissionResponse;
 import org.apache.cloudstack.api.response.RoleResponse;
 import org.apache.cloudstack.context.CallContext;
 
-@APICommand(name = CreateRolePermissionCmd.APINAME, description = "Adds a API permission to a role", responseObject = RolePermissionResponse.class,
+import com.cloud.user.Account;
+
+@APICommand(name = CreateRolePermissionCmd.APINAME, description = "Adds an API permission to a role", responseObject = RolePermissionResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
         since = "4.9.0",
         authorized = {RoleType.Admin})
-public class CreateRolePermissionCmd extends BaseCmd {
+public class CreateRolePermissionCmd extends BaseRolePermissionCmd {
     public static final String APINAME = "createRolePermission";
 
     /////////////////////////////////////////////////////
@@ -49,16 +48,6 @@
             description = "ID of the role", validations = {ApiArgValidator.PositiveNumber})
     private Long roleId;
 
-    @Parameter(name = ApiConstants.RULE, type = CommandType.STRING, required = true, description = "The API name or wildcard rule such as list*",
-            validations = {ApiArgValidator.NotNullOrEmpty})
-    private String rule;
-
-    @Parameter(name = ApiConstants.PERMISSION, type = CommandType.STRING, required = true, description = "The rule permission, allow or deny. Default: deny.")
-    private String permission;
-
-    @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "The description of the role permission")
-    private String description;
-
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -67,21 +56,6 @@
         return roleId;
     }
 
-    public Rule getRule() {
-        return new Rule(rule);
-    }
-
-    public RolePermission.Permission getPermission() {
-        if (Strings.isNullOrEmpty(permission)) {
-            return null;
-        }
-        return RolePermission.Permission.valueOf(permission.toUpperCase());
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ImportRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ImportRoleCmd.java
new file mode 100644
index 0000000..3afac9f
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ImportRoleCmd.java
@@ -0,0 +1,149 @@
+// 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.api.command.admin.acl;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.acl.Rule;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ApiServerService;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.RoleResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.collections.MapUtils;
+
+import com.cloud.user.Account;
+import com.google.common.base.Strings;
+
+@APICommand(name = ImportRoleCmd.APINAME, description = "Imports a role based on provided map of rule permissions", responseObject = RoleResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.15.0",
+        authorized = {RoleType.Admin})
+public class ImportRoleCmd extends RoleCmd {
+    public static final String APINAME = "importRole";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true,
+            description = "Creates a role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty})
+    private String roleName;
+
+    @Parameter(name = ApiConstants.RULES, type = CommandType.MAP, required = true,
+            description = "Rules param list, rule and permission is must. Example: rules[0].rule=create*&rules[0].permission=allow&rules[0].description=create%20rule&rules[1].rule=list*&rules[1].permission=allow&rules[1].description=listing")
+    private Map rules;
+
+    @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN,
+            description = "Force create a role with the same name. This overrides the role type, description and rule permissions for the existing role. Default is false.")
+    private Boolean forced;
+
+    @Inject
+    ApiServerService _apiServer;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    // Returns list of rule maps. Each map corresponds to a rule with the details in the keys: rule, permission & description
+    public List<Map<String, Object>> getRules() {
+        if (MapUtils.isEmpty(rules)) {
+            return null;
+        }
+
+        List<Map<String, Object>> rulesDetails = new ArrayList<>();
+        Collection rulesCollection = rules.values();
+        Iterator iter = rulesCollection.iterator();
+        while (iter.hasNext()) {
+            HashMap<String, String> detail = (HashMap<String, String>)iter.next();
+            Map<String, Object> ruleDetails = new HashMap<>();
+            String rule = detail.get(ApiConstants.RULE);
+            if (Strings.isNullOrEmpty(rule)) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Empty rule provided in rules param");
+            }
+            if (!rule.contains("*") && !_apiServer.isValidApiName(rule)) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid api name: " + rule + " provided in rules param");
+            }
+            ruleDetails.put(ApiConstants.RULE, new Rule(rule));
+
+            String permission = detail.get(ApiConstants.PERMISSION);
+            if (Strings.isNullOrEmpty(permission)) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid permission: "+ permission + " provided in rules param");
+            }
+            ruleDetails.put(ApiConstants.PERMISSION, roleService.getRolePermission(permission));
+
+            String description = detail.get(ApiConstants.DESCRIPTION);
+            if (!Strings.isNullOrEmpty(permission)) {
+                ruleDetails.put(ApiConstants.DESCRIPTION, description);
+            }
+
+            rulesDetails.add(ruleDetails);
+        }
+        return rulesDetails;
+    }
+
+    public boolean isForced() {
+        return (forced != null) ? forced : false;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute() {
+        if (getRoleType() == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role type provided");
+        }
+
+        CallContext.current().setEventDetails("Role: " + getRoleName() + ", type: " + getRoleType() + ", description: " + getRoleDescription());
+        Role role = roleService.importRole(getRoleName(), getRoleType(), getRoleDescription(), getRules(), isForced());
+        if (role == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to import role");
+        }
+        setupResponse(role);
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
index 92156c1..1d2af11 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
@@ -98,6 +98,7 @@
             roleResponse.setRoleName(role.getName());
             roleResponse.setRoleType(role.getRoleType());
             roleResponse.setDescription(role.getDescription());
+            roleResponse.setIsDefault(role.isDefault());
             roleResponse.setObjectName("role");
             roleResponses.add(roleResponse);
         }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java
index 9054ff5..440278b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java
@@ -18,11 +18,41 @@
 package org.apache.cloudstack.api.command.admin.acl;
 
 import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.response.RoleResponse;
 
+import com.google.common.base.Strings;
+
 public abstract class RoleCmd extends BaseCmd {
 
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "The type of the role, valid options are: Admin, ResourceAdmin, DomainAdmin, User")
+    private String roleType;
+
+    @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "The description of the role")
+    private String roleDescription;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public RoleType getRoleType() {
+        if (!Strings.isNullOrEmpty(roleType)) {
+            return RoleType.fromString(roleType);
+        }
+        return null;
+    }
+
+    public String getRoleDescription() {
+        return roleDescription;
+    }
+
     protected void setupResponse(final Role role) {
         final RoleResponse response = new RoleResponse();
         response.setId(role.getUuid());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
index f9519ae..0137d1e 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
@@ -18,7 +18,6 @@
 package org.apache.cloudstack.api.command.admin.acl;
 
 import com.cloud.user.Account;
-import com.google.common.base.Strings;
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
@@ -49,9 +48,6 @@
     @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, description = "creates a role with this unique name")
     private String roleName;
 
-    @Parameter(name = ApiConstants.TYPE, type = BaseCmd.CommandType.STRING, description = "The type of the role, valid options are: Admin, ResourceAdmin, DomainAdmin, User")
-    private String roleType;
-
     @Parameter(name = ApiConstants.DESCRIPTION, type = BaseCmd.CommandType.STRING, description = "The description of the role")
     private String roleDescription;
 
@@ -67,17 +63,6 @@
         return roleName;
     }
 
-    public RoleType getRoleType() {
-        if (!Strings.isNullOrEmpty(roleType)) {
-            return RoleType.fromString(roleType);
-        }
-        return null;
-    }
-
-    public String getRoleDescription() {
-        return roleDescription;
-    }
-
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
index 045464e..9faf1b9 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
@@ -17,10 +17,12 @@
 
 package org.apache.cloudstack.api.command.admin.acl;
 
-import com.cloud.user.Account;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RolePermission;
-import org.apache.cloudstack.acl.RolePermission.Permission;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiArgValidator;
@@ -34,8 +36,7 @@
 import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.cloudstack.context.CallContext;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.cloud.user.Account;
 
 @APICommand(name = UpdateRolePermissionCmd.APINAME, description = "Updates a role permission order", responseObject = SuccessResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java
new file mode 100644
index 0000000..a3fa149
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRoleCmd.java
@@ -0,0 +1,80 @@
+// 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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.user.Account;
+
+@APICommand(name = CreateProjectRoleCmd.APINAME, description = "Creates a Project role", responseObject = ProjectRoleResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User}, since = "4.15.0")
+public class CreateProjectRoleCmd extends ProjectRoleCmd {
+    public static final String APINAME = "createProjectRole";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING, required = true,
+            description = "creates a project role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty})
+    private String projectRoleName;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getProjectRoleName() {
+        return projectRoleName;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        CallContext.current().setEventDetails("Role: " + getProjectRoleName() + ", description: " + getProjectRoleDescription());
+        ProjectRole projectRole = projRoleService.createProjectRole(getProjectId(), getProjectRoleName(), getProjectRoleDescription());
+        if (projectRole == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create project role");
+        }
+        setupProjectRoleResponse(projectRole);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java
new file mode 100644
index 0000000..f4fbcf4
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/CreateProjectRolePermissionCmd.java
@@ -0,0 +1,105 @@
+// 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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.acl.BaseRolePermissionCmd;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRolePermissionResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = CreateProjectRolePermissionCmd.APINAME, description = "Adds API permissions to a project role", responseObject = ProjectRolePermissionResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}, since = "4.15.0")
+public class CreateProjectRolePermissionCmd extends BaseRolePermissionCmd {
+    public static final String APINAME = "createProjectRolePermission";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, required = true, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRoleId;
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, required = true, entityType = ProjectResponse.class,
+            description = "ID of project where project role permission is to be created", validations = {ApiArgValidator.NotNullOrEmpty})
+    private Long projectId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        ProjectRole projectRole = projRoleService.findProjectRole(getProjectRoleId(), getProjectId());
+        if (projectRole == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid project role ID provided");
+        }
+        CallContext.current().setEventDetails("Project Role ID: " + projectRole.getId() + ", Rule:" + getRule() + ", Permission: " + getPermission() + ", Description: " + getDescription());
+        final ProjectRolePermission projectRolePermission = projRoleService.createProjectRolePermission(this);
+        if (projectRolePermission == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create project role permission");
+        }
+        setupResponse(projectRolePermission, projectRole);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final ProjectRolePermission rolePermission, final ProjectRole role) {
+        final ProjectRolePermissionResponse response = new ProjectRolePermissionResponse();
+        response.setId(rolePermission.getUuid());
+        response.setProjectId(_projectService.getProject(rolePermission.getProjectId()).getUuid());
+        response.setProjectRoleId(role.getUuid());
+        response.setRule(rolePermission.getRule());
+        response.setRulePermission(rolePermission.getPermission());
+        response.setDescription(rolePermission.getDescription());
+        response.setResponseName(getCommandName());
+        response.setObjectName("projectrolepermission");
+        setResponseObject(response);
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.java
new file mode 100644
index 0000000..c1a4d39
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRoleCmd.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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = DeleteProjectRoleCmd.APINAME, description = "Delete Project roles in CloudStack", responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.15.0", authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
+public class DeleteProjectRoleCmd extends BaseCmd {
+    public static final String APINAME = "deleteProjectRole" ;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = BaseCmd.CommandType.UUID, required = true, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role to be deleted", validations = {ApiArgValidator.PositiveNumber})
+    private Long id;
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = BaseCmd.CommandType.UUID, required = true, entityType = ProjectResponse.class,
+            description = "ID of the project from where the role is to be deleted", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectId;
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public Long getProjectId() { return projectId; }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+    @Override
+    public void execute() {
+        ProjectRole role = projRoleService.findProjectRole(getId(), getProjectId());
+        if (role == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Cannot find project role with provided id");
+        }
+        CallContext.current().setEventDetails("Deleting Project Role with id: " + role.getId());
+        boolean result = projRoleService.deleteProjectRole(role, getProjectId());
+        SuccessResponse response = new SuccessResponse(getCommandName());
+        response.setSuccess(result);
+        setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java
new file mode 100644
index 0000000..17e7482
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/DeleteProjectRolePermissionCmd.java
@@ -0,0 +1,89 @@
+// 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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRolePermissionResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = DeleteProjectRolePermissionCmd.APINAME, description = "Deletes a project role permission in the project", responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}, since = "4.15.0")
+public class DeleteProjectRolePermissionCmd extends BaseCmd {
+    public static final String APINAME = "deleteProjectRolePermission";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = BaseCmd.CommandType.UUID, required = true, entityType = ProjectResponse.class,
+            description = "ID of the project where the project role permission is to be deleted", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.ID, type = BaseCmd.CommandType.UUID, required = true, entityType = ProjectRolePermissionResponse.class,
+            description = "ID of the project role permission to be deleted", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRolePermissionId;
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public Long getProjectRolePermissionId() {
+        return projectRolePermissionId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        ProjectRolePermission rolePermission = projRoleService.findProjectRolePermission(getProjectRolePermissionId());
+        if (rolePermission == null || rolePermission.getProjectId() != getProjectId()) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role permission id provided for the project");
+        }
+        CallContext.current().setEventDetails("Deleting Project Role permission with id: " + rolePermission.getId());
+        boolean result = projRoleService.deleteProjectRolePermission(rolePermission);
+        SuccessResponse response = new SuccessResponse();
+        response.setSuccess(result);
+        setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolePermissionsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolePermissionsCmd.java
new file mode 100644
index 0000000..9038f70
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolePermissionsCmd.java
@@ -0,0 +1,113 @@
+// 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.api.command.admin.acl.project;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRolePermissionResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = ListProjectRolePermissionsCmd.APINAME, description = "Lists a project's project role permissions", responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}, since = "4.15.0")
+public class ListProjectRolePermissionsCmd extends BaseCmd {
+    public static final String APINAME = "listProjectRolePermissions";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, required = true, description = "ID of the project")
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRoleId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+    @Override
+    public void execute() {
+        List<ProjectRolePermission> projectRolePermissions = projRoleService.findAllProjectRolePermissions(getProjectId(), getProjectRoleId());
+        final ProjectRole projectRole = projRoleService.findProjectRole(getProjectRoleId(), getProjectId());
+        final ListResponse<ProjectRolePermissionResponse> response = new ListResponse<>();
+        final List<ProjectRolePermissionResponse> rolePermissionResponses = new ArrayList<>();
+        for (final ProjectRolePermission rolePermission : projectRolePermissions) {
+            ProjectRole role = projectRole;
+            if (role == null) {
+                role = projRoleService.findProjectRole(rolePermission.getProjectRoleId(), rolePermission.getProjectId());
+            }
+            rolePermissionResponses.add(setupResponse(role, rolePermission));
+        }
+        response.setResponses(rolePermissionResponses);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    private ProjectRolePermissionResponse setupResponse(ProjectRole role, ProjectRolePermission rolePermission) {
+        final ProjectRolePermissionResponse rolePermissionResponse = new ProjectRolePermissionResponse();
+        rolePermissionResponse.setProjectId(_projectService.getProject(rolePermission.getProjectId()).getUuid());
+        rolePermissionResponse.setProjectRoleId(role.getUuid());
+        rolePermissionResponse.setProjectRoleName(role.getName());
+        rolePermissionResponse.setId(rolePermission.getUuid());
+        rolePermissionResponse.setRule(rolePermission.getRule());
+        rolePermissionResponse.setRulePermission(rolePermission.getPermission());
+        rolePermissionResponse.setDescription(rolePermission.getDescription());
+        rolePermissionResponse.setObjectName("projectrolepermission");
+       return rolePermissionResponse;
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java
new file mode 100644
index 0000000..8c4be4d
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ListProjectRolesCmd.java
@@ -0,0 +1,116 @@
+// 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.api.command.admin.acl.project;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang3.StringUtils;
+
+@APICommand(name = ListProjectRolesCmd.APINAME, description = "Lists Project roles in CloudStack", responseObject = ProjectRoleResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.15.0", authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
+public class ListProjectRolesCmd extends BaseCmd {
+    public static final String APINAME = "listProjectRoles";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, entityType = ProjectRoleResponse.class, description = "List project role by project role ID.")
+    private Long projectRoleId;
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, required = true, description = "List project role by project ID.")
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "List project role by project role name.")
+    private String roleName;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+
+    public Long getProjectRoleId() { return projectRoleId; }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        List<ProjectRole> projectRoles;
+        if (getProjectId() != null && getProjectRoleId() != null) {
+            projectRoles = Collections.singletonList(projRoleService.findProjectRole(getProjectRoleId(), getProjectId()));
+        } else if (StringUtils.isNotBlank(getRoleName())) {
+            projectRoles = projRoleService.findProjectRolesByName(getProjectId(), getRoleName());
+        } else {
+            projectRoles = projRoleService.findProjectRoles(getProjectId());
+        }
+        final ListResponse<ProjectRoleResponse> response = new ListResponse<>();
+        final List<ProjectRoleResponse> roleResponses = new ArrayList<>();
+        for (ProjectRole role : projectRoles) {
+            if (role == null) {
+                continue;
+            }
+            roleResponses.add(setupProjectRoleResponse(role));
+        }
+        response.setResponses(roleResponses);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    private ProjectRoleResponse setupProjectRoleResponse(final ProjectRole role) {
+        final ProjectRoleResponse response = new ProjectRoleResponse();
+        response.setId(role.getUuid());
+        response.setProjectId(_projectService.getProject(role.getProjectId()).getUuid());
+        response.setRoleName(role.getName());
+        response.setDescription(role.getDescription());
+        response.setObjectName("projectrole");
+        return response;
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ProjectRoleCmd.java
new file mode 100644
index 0000000..f43cd3d
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/ProjectRoleCmd.java
@@ -0,0 +1,62 @@
+// 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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+
+public abstract class ProjectRoleCmd extends BaseCmd {
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, required = true, entityType = ProjectResponse.class,
+            description = "ID of project where role is being created", validations = {ApiArgValidator.NotNullOrEmpty})
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.DESCRIPTION, type = BaseCmd.CommandType.STRING, description = "The description of the Project role")
+    private String projectRoleDescription;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public String getProjectRoleDescription() {
+        return projectRoleDescription;
+    }
+
+    protected void setupProjectRoleResponse(final ProjectRole role) {
+        final ProjectRoleResponse response = new ProjectRoleResponse();
+        response.setId(role.getUuid());
+        response.setProjectId(_projectService.getProject(role.getProjectId()).getUuid());
+        response.setRoleName(role.getName());
+        response.setDescription(role.getDescription());
+        response.setResponseName(getCommandName());
+        response.setObjectName("projectrole");
+        setResponseObject(response);
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.java
new file mode 100644
index 0000000..41f6864
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRoleCmd.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.api.command.admin.acl.project;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+
+@APICommand(name = UpdateProjectRoleCmd.APINAME, description = "Creates a Project role", responseObject = ProjectRoleResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User}, since = "4.15.0")
+public class UpdateProjectRoleCmd extends ProjectRoleCmd {
+    public static final String APINAME = "updateProjectRole";
+
+    /////////////////////////////////////////////////////
+    //////////////// API Parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, required = true, entityType = ProjectRoleResponse.class,
+            description = "ID of the Project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long id;
+
+    @Parameter(name = ApiConstants.NAME, type = BaseCmd.CommandType.STRING,
+            description = "creates a project role with this unique name", validations = {ApiArgValidator.NotNullOrEmpty})
+    private String projectRoleName;
+
+    /////////////////////////////////////////////////////
+    //////////////// Accessors //////////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getProjectRoleName() {
+        return projectRoleName;
+    }
+
+    /////////////////////////////////////////////////////
+    //////////////// API Implementation /////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        ProjectRole role = projRoleService.findProjectRole(getId(), getProjectId());
+        if (role == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid project role id provided");
+        }
+        role = projRoleService.updateProjectRole(role, getProjectId(), getProjectRoleName(), getProjectRoleDescription());
+        setupProjectRoleResponse(role);
+
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return 0;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java
new file mode 100644
index 0000000..b20dc7b
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/acl/project/UpdateProjectRolePermissionCmd.java
@@ -0,0 +1,163 @@
+// 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.api.command.admin.acl.project;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRolePermissionResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang3.EnumUtils;
+
+@APICommand(name = UpdateProjectRolePermissionCmd.APINAME, description = "Updates a project role permission and/or order", responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}, since = "4.15.0")
+public class UpdateProjectRolePermissionCmd extends BaseCmd {
+    public static final String APINAME = "updateProjectRolePermission";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, required = true, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRoleId;
+
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, required = true, entityType = ProjectResponse.class,
+            description = "ID of project where project role permission is to be updated", validations = {ApiArgValidator.NotNullOrEmpty})
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = ProjectRolePermissionResponse.class,
+            description = "The parent role permission uuid, use 0 to move this rule at the top of the list")
+    private List<Long> projectRulePermissionOrder;
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_PERMISSION_ID, type = CommandType.UUID, entityType = ProjectRolePermissionResponse.class,
+            description = "Project Role permission rule id")
+    private Long projectRuleId;
+
+    @Parameter(name = ApiConstants.PERMISSION, type = CommandType.STRING,
+            description = "Rule permission, can be: allow or deny")
+    private String projectRolePermission;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public List<Long> getProjectRulePermissionOrder() {
+        return projectRulePermissionOrder;
+    }
+
+    public Long getProjectRuleId() {
+        return projectRuleId;
+    }
+
+    public Permission getProjectRolePermission() {
+        if (this.projectRolePermission == null) {
+            return null;
+        }
+
+        if (!EnumUtils.isValidEnum(Permission.class, projectRolePermission.toUpperCase())) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Values for permission parameter should be: allow or deny");
+        }
+
+        return Permission.valueOf(projectRolePermission.toUpperCase());
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////////// API Implementation //////////////
+    /////////////////////////////////////////////////////
+    @Override
+    public void execute() {
+        ProjectRole projectRole = projRoleService.findProjectRole(getProjectRoleId(), getProjectId());
+        boolean result = false;
+        if (projectRole == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided");
+        }
+        if (getProjectRulePermissionOrder() != null) {
+            if (getProjectRuleId() != null || getProjectRolePermission() != null) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Parameters permission and ruleid must be mutually exclusive with ruleorder");
+            }
+            CallContext.current().setEventDetails("Reordering permissions for role id: " + projectRole.getId());
+            result = updateProjectRolePermissionOrder(projectRole);
+
+        } else if (getProjectRuleId() != null || getProjectRolePermission() != null ) {
+            if (getProjectRulePermissionOrder() != null) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Parameters permission and ruleid must be mutually exclusive with ruleorder");
+            }
+            ProjectRolePermission rolePermission = getValidProjectRolePermission();
+            CallContext.current().setEventDetails("Updating project role permission for rule id: " + getProjectRuleId() + " to: " + getProjectRolePermission().toString());
+            result = projRoleService.updateProjectRolePermission(projectId, projectRole, rolePermission, getProjectRolePermission());
+        }
+        SuccessResponse response = new SuccessResponse(getCommandName());
+        response.setSuccess(result);
+        setResponseObject(response);
+    }
+
+    private ProjectRolePermission getValidProjectRolePermission() {
+        ProjectRolePermission rolePermission = projRoleService.findProjectRolePermission(getProjectRuleId());
+        if (rolePermission == null || rolePermission.getProjectId() != getProjectId()) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Role permission doesn't exist in the project, probably because of invalid rule id");
+        }
+        return rolePermission;
+    }
+
+    private boolean updateProjectRolePermissionOrder(ProjectRole projectRole) {
+        final List<ProjectRolePermission> rolePermissionsOrder = new ArrayList<>();
+        for (Long rolePermissionId : getProjectRulePermissionOrder()) {
+            final ProjectRolePermission rolePermission = projRoleService.findProjectRolePermission(rolePermissionId);
+            if (rolePermission == null) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Provided project role permission(s) do not exist");
+            }
+            rolePermissionsOrder.add(rolePermission);
+        }
+        return projRoleService.updateProjectRolePermission(projectId, projectRole, rolePermissionsOrder);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java
index 53d01c5..8d6faf9 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/cluster/UpdateClusterCmd.java
@@ -63,6 +63,10 @@
         return id;
     }
 
+    public void setId(Long id) {
+        this.id = id;
+    }
+
     public String getHypervisor() {
         return hypervisor;
     }
@@ -107,7 +111,7 @@
         if (cluster == null) {
             throw new InvalidParameterValueException("Unable to find the cluster by id=" + getId());
         }
-        Cluster result = _resourceService.updateCluster(cluster, getClusterType(), getHypervisor(), getAllocationState(), getManagedstate());
+        Cluster result = _resourceService.updateCluster(this);
         if (result != null) {
             ClusterResponse clusterResponse = _responseGenerator.createClusterResponse(cluster, false);
             clusterResponse.setResponseName(getCommandName());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
index aa0a690..16fc608 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
@@ -45,6 +45,9 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = HostResponse.class, required = true, description = "the ID of the host to update")
     private Long id;
 
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "Change the name of host", since = "4.15", authorized = {RoleType.Admin})
+    private String name;
+
     @Parameter(name = ApiConstants.OS_CATEGORY_ID,
                type = CommandType.UUID,
                entityType = GuestOSCategoryResponse.class,
@@ -73,6 +76,10 @@
         return id;
     }
 
+    public String getName() {
+        return name;
+    }
+
     public Long getOsCategoryId() {
         return osCategoryId;
     }
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 f0ca5fb..a830777 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
@@ -28,6 +28,7 @@
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainResponse;
+import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
@@ -151,6 +152,9 @@
             since = "4.14")
     private String cacheMode;
 
+    @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;
+
 /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -273,6 +277,9 @@
         return cacheMode;
     }
 
+    public Long getStoragePolicy() {
+        return storagePolicy;
+    }
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
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 5015f7c..3219422 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
@@ -31,6 +31,7 @@
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.cloudstack.api.response.ServiceOfferingResponse;
+import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.collections.CollectionUtils;
@@ -126,6 +127,9 @@
     @Parameter(name = ApiConstants.SERVICE_OFFERING_DETAILS, type = CommandType.MAP, description = "details for planner, used to store specific parameters")
     private Map details;
 
+    @Parameter(name = ApiConstants.ROOT_DISK_SIZE, type = CommandType.LONG, since = "4.15", description = "the Root disk size in GB.")
+    private Long rootDiskSize;
+
     @Parameter(name = ApiConstants.BYTES_READ_RATE, type = CommandType.LONG, required = false, description = "bytes read rate of the disk offering")
     private Long bytesReadRate;
 
@@ -216,6 +220,9 @@
             since = "4.13")
     private Integer minMemory;
 
+    @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;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -320,6 +327,10 @@
         return detailsMap;
     }
 
+    public Long getRootDiskSize() {
+        return rootDiskSize;
+    }
+
     public Long getBytesReadRate() {
         return bytesReadRate;
     }
@@ -418,6 +429,10 @@
         return minMemory;
     }
 
+    public Long getStoragePolicy() {
+        return storagePolicy;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java
index 9036953..5ccdc06 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/offering/UpdateDiskOfferingCmd.java
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -77,6 +78,52 @@
             since = "4.13")
     private String zoneIds;
 
+    @Parameter(name = ApiConstants.TAGS,
+            type = CommandType.STRING,
+            description = "comma-separated list of tags for the disk offering, tags should match with existing storage pool tags",
+            authorized = {RoleType.Admin},
+            since = "4.15")
+    private String tags;
+
+    @Parameter(name = ApiConstants.BYTES_READ_RATE, type = CommandType.LONG, description = "bytes read rate of the disk offering", since = "4.15")
+    private Long bytesReadRate;
+
+    @Parameter(name = ApiConstants.BYTES_READ_RATE_MAX, type = CommandType.LONG, description = "burst bytes read rate of the disk offering", since = "4.15")
+    private Long bytesReadRateMax;
+
+    @Parameter(name = ApiConstants.BYTES_READ_RATE_MAX_LENGTH, type = CommandType.LONG, description = "length (in seconds) of the burst", since = "4.15")
+    private Long bytesReadRateMaxLength;
+
+    @Parameter(name = ApiConstants.BYTES_WRITE_RATE, type = CommandType.LONG, description = "bytes write rate of the disk offering", since = "4.15")
+    private Long bytesWriteRate;
+
+    @Parameter(name = ApiConstants.BYTES_WRITE_RATE_MAX, type = CommandType.LONG, description = "burst bytes write rate of the disk offering", since = "4.15")
+    private Long bytesWriteRateMax;
+
+    @Parameter(name = ApiConstants.BYTES_WRITE_RATE_MAX_LENGTH,  type = CommandType.LONG, description = "length (in seconds) of the burst", since = "4.15")
+    private Long bytesWriteRateMaxLength;
+
+    @Parameter(name = ApiConstants.IOPS_READ_RATE, type = CommandType.LONG, description = "io requests read rate of the disk offering", since = "4.15")
+    private Long iopsReadRate;
+
+    @Parameter(name = ApiConstants.IOPS_READ_RATE_MAX, type = CommandType.LONG, description = "burst requests read rate of the disk offering", since = "4.15")
+    private Long iopsReadRateMax;
+
+    @Parameter(name = ApiConstants.IOPS_READ_RATE_MAX_LENGTH, type = CommandType.LONG, description = "length (in seconds) of the burst", since = "4.15")
+    private Long iopsReadRateMaxLength;
+
+    @Parameter(name = ApiConstants.IOPS_WRITE_RATE, type = CommandType.LONG, description = "io requests write rate of the disk offering", since = "4.15")
+    private Long iopsWriteRate;
+
+    @Parameter(name = ApiConstants.IOPS_WRITE_RATE_MAX, type = CommandType.LONG, description = "burst io requests write rate of the disk offering", since = "4.15")
+    private Long iopsWriteRateMax;
+
+    @Parameter(name = ApiConstants.IOPS_WRITE_RATE_MAX_LENGTH, type = CommandType.LONG, description = "length (in seconds) of the burst", since = "4.15")
+    private Long iopsWriteRateMaxLength;
+
+    @Parameter(name = ApiConstants.CACHE_MODE, type = CommandType.STRING, description = "the cache mode to use for this disk offering", since = "4.15")
+    private String cacheMode;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -161,7 +208,63 @@
         return validZoneIds;
     }
 
-/////////////////////////////////////////////////////
+    public String getTags() {
+        return tags;
+    }
+
+    public String getCacheMode() {
+        return cacheMode;
+    }
+
+    public Long getBytesReadRate() {
+        return bytesReadRate;
+    }
+
+    public Long getBytesReadRateMax() {
+        return bytesReadRateMax;
+    }
+
+    public Long getBytesReadRateMaxLength() {
+        return bytesReadRateMaxLength;
+    }
+
+    public Long getBytesWriteRate() {
+        return bytesWriteRate;
+    }
+
+    public Long getBytesWriteRateMax() {
+        return bytesWriteRateMax;
+    }
+
+    public Long getBytesWriteRateMaxLength() {
+        return bytesWriteRateMaxLength;
+    }
+
+    public Long getIopsReadRate() {
+        return iopsReadRate;
+    }
+
+    public Long getIopsReadRateMax() {
+        return iopsReadRateMax;
+    }
+
+    public Long getIopsReadRateMaxLength() {
+        return iopsReadRateMaxLength;
+    }
+
+    public Long getIopsWriteRate() {
+        return iopsWriteRate;
+    }
+
+    public Long getIopsWriteRateMax() {
+        return iopsWriteRateMax;
+    }
+
+    public Long getIopsWriteRateMaxLength() {
+        return iopsWriteRateMaxLength;
+    }
+
+    /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
 
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java
index 65d26cc..fedc314 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/router/UpgradeRouterTemplateCmd.java
@@ -17,7 +17,7 @@
 package org.apache.cloudstack.api.command.admin.router;
 
 import java.util.List;
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
index 8c37c78..4f7cf81 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.storage;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListCmd;
@@ -25,6 +23,7 @@
 import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.log4j.Logger;
 
 @APICommand(name = "listImageStores", description = "Lists image stores.", responseObject = ImageStoreResponse.class, since = "4.2.0",
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -52,6 +51,9 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class, description = "the ID of the storage pool")
     private Long id;
 
+    @Parameter(name = ApiConstants.READ_ONLY, type = CommandType.BOOLEAN, entityType = ImageStoreResponse.class, description = "read-only status of the image store", since = "4.15.0")
+    private Boolean readonly;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -80,6 +82,10 @@
         this.provider = provider;
     }
 
+    public Boolean getReadonly() {
+        return readonly;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java
new file mode 100644
index 0000000..9abbecf
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/MigrateSecondaryStorageDataCmd.java
@@ -0,0 +1,115 @@
+// 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.api.command.admin.storage;
+
+import java.util.List;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.api.response.MigrationResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+
+@APICommand(name = MigrateSecondaryStorageDataCmd.APINAME,
+        description = "migrates data objects from one secondary storage to destination image store(s)",
+        responseObject = MigrationResponse.class,
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        since = "4.15.0",
+        authorized = {RoleType.Admin})
+public class MigrateSecondaryStorageDataCmd extends BaseAsyncCmd {
+
+    public static final Logger LOGGER = Logger.getLogger(MigrateSecondaryStorageDataCmd.class.getName());
+
+    public static final String APINAME = "migrateSecondaryStorageData";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.SRC_POOL,
+            type = CommandType.UUID,
+            entityType = ImageStoreResponse.class,
+            description = "id of the image store from where the data is to be migrated",
+    required = true)
+    private Long id;
+
+    @Parameter(name = ApiConstants.DEST_POOLS,
+    type = CommandType.LIST,
+    collectionType = CommandType.UUID,
+    entityType = ImageStoreResponse.class,
+    description = "id(s) of the destination secondary storage pool(s) to which the templates are to be migrated",
+    required = true)
+    private List<Long> migrateTo;
+
+    @Parameter(name = ApiConstants.MIGRATION_TYPE,
+    type = CommandType.STRING,
+    description = "Balance: if you want data to be distributed evenly among the destination stores, " +
+            "Complete: If you want to migrate the entire data from source image store to the destination store(s). Default: Complete")
+    private String migrationType;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public List<Long> getMigrateTo() {
+        return migrateTo;
+    }
+
+    public String getMigrationType() {
+        return migrationType;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_IMAGE_STORE_DATA_MIGRATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Attempting to migrate files/data objects ";
+    }
+
+    @Override
+    public void execute()  {
+        MigrationResponse response = _imageStoreService.migrateData(this);
+        response.setObjectName("imagestore");
+        this.setResponseObject(response);
+        CallContext.current().setEventDetails(response.getMessage());
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateImageStoreCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateImageStoreCmd.java
new file mode 100644
index 0000000..d7dca93
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateImageStoreCmd.java
@@ -0,0 +1,89 @@
+// 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.api.command.admin.storage;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.storage.ImageStore;
+
+@APICommand(name = UpdateImageStoreCmd.APINAME, description = "Updates image store read-only status", responseObject = ImageStoreResponse.class, entityType = {ImageStore.class},
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.15.0")
+public class UpdateImageStoreCmd extends BaseCmd {
+    private static final Logger LOG = Logger.getLogger(UpdateImageStoreCmd.class.getName());
+    public static final String APINAME = "updateImageStore";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class, required = true, description = "Image Store UUID")
+    private Long id;
+
+    @Parameter(name = ApiConstants.READ_ONLY, type = CommandType.BOOLEAN, required = true, description = "If set to true, it designates the corresponding image store to read-only, " +
+            "hence not considering them during storage migration")
+    private Boolean readonly;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public Boolean getReadonly() {
+        return readonly;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        ImageStore result = _storageService.updateImageStoreStatus(getId(), getReadonly());
+        ImageStoreResponse storeResponse = null;
+        if (result != null) {
+            storeResponse = _responseGenerator.createImageStoreResponse(result);
+            storeResponse.setResponseName(getCommandName()+"response");
+            storeResponse.setObjectName("imagestore");
+            setResponseObject(storeResponse);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update Image store status");
+        }
+
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME;
+    }
+
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java
index 6bf6228..ad91c29 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/storage/UpdateStoragePoolCmd.java
@@ -45,6 +45,9 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = StoragePoolResponse.class, required = true, description = "the Id of the storage pool")
     private Long id;
 
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, entityType = StoragePoolResponse.class, description = "Change the name of the storage pool", since = "4.15")
+    private String name;
+
     @Parameter(name = ApiConstants.TAGS, type = CommandType.LIST, collectionType = CommandType.STRING, description = "comma-separated list of tags for the storage pool")
     private List<String> tags;
 
@@ -66,6 +69,10 @@
         return id;
     }
 
+    public String getName() {
+        return name;
+    }
+
     public List<String> getTags() {
         return tags;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java
index f93c6e1..5878473 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java
@@ -29,7 +29,7 @@
 import org.apache.cloudstack.api.response.UserResponse;
 
 import java.util.Map;
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 @APICommand(name = GetUserKeysCmd.APINAME,
             description = "This command allows the user to query the seceret and API keys for the account",
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
index da5f688..7b57796 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
@@ -138,8 +138,14 @@
             e.printStackTrace();
             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move vm " + e.getMessage());
+            s_logger.error("Failed to move vm due to: " + e.getStackTrace());
+            if (e.getMessage() != null) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move vm due to " + e.getMessage());
+            } else if (e.getCause() != null) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move vm due to " + e.getCause());
+            } else {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move vm");
+            }
         }
 
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ImportUnmanagedInstanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ImportUnmanagedInstanceCmd.java
index 4b367f8..5f924f2 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ImportUnmanagedInstanceCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/ImportUnmanagedInstanceCmd.java
@@ -39,6 +39,7 @@
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.vm.VmImportService;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
@@ -152,6 +153,11 @@
             description = "vm and its volumes are allowed to migrate to different host/pool when offerings passed are incompatible with current host/pool")
     private Boolean migrateAllowed;
 
+    @Parameter(name = ApiConstants.FORCED,
+            type = CommandType.BOOLEAN,
+            description = "VM is imported despite some of its NIC's MAC addresses are already present")
+    private Boolean forced;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -198,6 +204,9 @@
             for (Map<String, String> entry : (Collection<Map<String, String>>)nicNetworkList.values()) {
                 String nic = entry.get(VmDetailConstants.NIC);
                 String networkUuid = entry.get(VmDetailConstants.NETWORK);
+                if (LOGGER.isTraceEnabled()) {
+                    LOGGER.trace(String.format("nic, '%s', goes on net, '%s'", nic, networkUuid));
+                }
                 if (Strings.isNullOrEmpty(nic) || Strings.isNullOrEmpty(networkUuid) || _entityMgr.findByUuid(Network.class, networkUuid) == null) {
                     throw new InvalidParameterValueException(String.format("Network ID: %s for NIC ID: %s is invalid", networkUuid, nic));
                 }
@@ -213,11 +222,14 @@
             for (Map<String, String> entry : (Collection<Map<String, String>>)nicIpAddressList.values()) {
                 String nic = entry.get(VmDetailConstants.NIC);
                 String ipAddress = Strings.emptyToNull(entry.get(VmDetailConstants.IP4_ADDRESS));
+                if (LOGGER.isTraceEnabled()) {
+                    LOGGER.trace(String.format("nic, '%s', gets ip, '%s'", nic, ipAddress));
+                }
                 if (Strings.isNullOrEmpty(nic)) {
                     throw new InvalidParameterValueException(String.format("NIC ID: '%s' is invalid for IP address mapping", nic));
                 }
                 if (Strings.isNullOrEmpty(ipAddress)) {
-                    throw new InvalidParameterValueException(String.format("IP address '%s' for NIC ID: %s is invalid", ipAddress, nic));
+                    throw new InvalidParameterValueException(String.format("Empty address for NIC ID: %s is invalid", nic));
                 }
                 if (!Strings.isNullOrEmpty(ipAddress) && !ipAddress.equals("auto") && !NetUtils.isValidIp4(ipAddress)) {
                     throw new InvalidParameterValueException(String.format("IP address '%s' for NIC ID: %s is invalid", ipAddress, nic));
@@ -233,12 +245,15 @@
         Map<String, Long> dataDiskToDiskOfferingMap = new HashMap<>();
         if (MapUtils.isNotEmpty(dataDiskToDiskOfferingList)) {
             for (Map<String, String> entry : (Collection<Map<String, String>>)dataDiskToDiskOfferingList.values()) {
-                String nic = entry.get(VmDetailConstants.DISK);
+                String disk = entry.get(VmDetailConstants.DISK);
                 String offeringUuid = entry.get(VmDetailConstants.DISK_OFFERING);
-                if (Strings.isNullOrEmpty(nic) || Strings.isNullOrEmpty(offeringUuid) || _entityMgr.findByUuid(DiskOffering.class, offeringUuid) == null) {
-                    throw new InvalidParameterValueException(String.format("Disk offering ID: %s for disk ID: %s is invalid", offeringUuid, nic));
+                if (LOGGER.isTraceEnabled()) {
+                    LOGGER.trace(String.format("disk, '%s', gets offering, '%s'", disk, offeringUuid));
                 }
-                dataDiskToDiskOfferingMap.put(nic, _entityMgr.findByUuid(DiskOffering.class, offeringUuid).getId());
+                if (Strings.isNullOrEmpty(disk) || Strings.isNullOrEmpty(offeringUuid) || _entityMgr.findByUuid(DiskOffering.class, offeringUuid) == null) {
+                    throw new InvalidParameterValueException(String.format("Disk offering ID: %s for disk ID: %s is invalid", offeringUuid, disk));
+                }
+                dataDiskToDiskOfferingMap.put(disk, _entityMgr.findByUuid(DiskOffering.class, offeringUuid).getId());
             }
         }
         return dataDiskToDiskOfferingMap;
@@ -268,6 +283,10 @@
         return "Importing unmanaged VM";
     }
 
+    public boolean isForced() {
+        return BooleanUtils.isTrue(forced);
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java
new file mode 100644
index 0000000..f49577e
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vm/UnmanageVMInstanceCmd.java
@@ -0,0 +1,136 @@
+//
+// 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.api.command.admin.vm;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.vm.VirtualMachine;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandJobType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.UnmanageVMInstanceResponse;
+import org.apache.cloudstack.api.response.UserVmResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.vm.UnmanagedVMsManager;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+
+@APICommand(name = UnmanageVMInstanceCmd.API_NAME,
+        description = "Unmanage a guest virtual machine.",
+        entityType = {VirtualMachine.class},
+        responseObject = UnmanageVMInstanceResponse.class,
+        requestHasSensitiveInfo = false,
+        authorized = {RoleType.Admin},
+        since = "4.15.0")
+public class UnmanageVMInstanceCmd extends BaseAsyncCmd {
+
+    public static final Logger LOGGER = Logger.getLogger(UnmanageVMInstanceCmd.class);
+    public static final String API_NAME = "unmanageVirtualMachine";
+
+    @Inject
+    private UnmanagedVMsManager unmanagedVMsManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID,
+            entityType = UserVmResponse.class, required = true,
+            description = "The ID of the virtual machine to unmanage")
+    private Long vmId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getVmId() {
+        return vmId;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_VM_UNMANAGE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "unmanaging VM. VM ID = " + vmId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException,
+            ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        UnmanageVMInstanceResponse response = new UnmanageVMInstanceResponse();
+        try {
+            CallContext.current().setEventDetails("VM ID = " + vmId);
+            boolean result = unmanagedVMsManager.unmanageVMInstance(vmId);
+            response.setSuccess(result);
+            if (result) {
+                response.setDetails("VM unmanaged successfully");
+            }
+        } catch (Exception e) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
+        }
+        response.setResponseName(getCommandName());
+        response.setObjectName(getCommandName());
+        this.setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return API_NAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        UserVm vm = _responseGenerator.findUserVmById(vmId);
+        if (vm != null) {
+            return vm.getAccountId();
+        }
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public ApiCommandJobType getInstanceType() {
+        return ApiCommandJobType.VirtualMachine;
+    }
+
+    @Override
+    public Long getInstanceId() {
+        return vmId;
+    }
+
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java
index 22deb03..62cb100 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddAccountToProjectCmd.java
@@ -16,6 +16,12 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.account;
 
+import java.util.List;
+
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.commons.lang3.EnumUtils;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -31,6 +37,8 @@
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.google.common.base.Strings;
 
 @APICommand(name = "addAccountToProject", description = "Adds account to a project", responseObject = SuccessResponse.class, since = "3.0.0",
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -56,6 +64,14 @@
     @Parameter(name = ApiConstants.EMAIL, type = CommandType.STRING, description = "email to which invitation to the project is going to be sent")
     private String email;
 
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRoleId;
+
+    @Parameter(name = ApiConstants.ROLE_TYPE, type = BaseCmd.CommandType.STRING,
+            description = "Project role type to be assigned to the user - Admin/Regular; default: Regular")
+    private String roleType;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -72,6 +88,21 @@
         return email;
     }
 
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public ProjectAccount.Role getRoleType() {
+        if (!Strings.isNullOrEmpty(roleType)) {
+            String role = roleType.substring(0, 1).toUpperCase() + roleType.substring(1).toLowerCase();
+            if (!EnumUtils.isValidEnum(ProjectAccount.Role.class, role)) {
+                throw new InvalidParameterValueException("Only Admin or Regular project role types are valid");
+            }
+            return Enum.valueOf(ProjectAccount.Role.class, role);
+        }
+        return null;
+    }
+
     @Override
     public String getCommandName() {
         return s_name;
@@ -88,7 +119,7 @@
         }
 
         CallContext.current().setEventDetails("Project ID: " + projectId + "; accountName " + accountName);
-        boolean result = _projectService.addAccountToProject(getProjectId(), getAccountName(), getEmail());
+        boolean result = _projectService.addAccountToProject(getProjectId(), getAccountName(), getEmail(), getProjectRoleId(), getRoleType());
         if (result) {
             SuccessResponse response = new SuccessResponse(getCommandName());
             this.setResponseObject(response);
@@ -111,6 +142,11 @@
     }
 
     @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(projectId);
+    }
+
+    @Override
     public String getEventType() {
         return EventTypes.EVENT_PROJECT_ACCOUNT_ADD;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java
new file mode 100644
index 0000000..c8e71fe
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/AddUserToProjectCmd.java
@@ -0,0 +1,150 @@
+// 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.api.command.user.account;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang3.EnumUtils;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.projects.ProjectAccount;
+import com.google.common.base.Strings;
+
+@APICommand(name = AddUserToProjectCmd.APINAME, description = "Adds user to a project", responseObject = SuccessResponse.class, since = "4.14",
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User})
+public class AddUserToProjectCmd extends BaseAsyncCmd {
+    public static final String APINAME = "addUserToProject";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROJECT_ID,
+            type = BaseCmd.CommandType.UUID,
+            entityType = ProjectResponse.class,
+            required = true,
+            description = "ID of the project to add the user to")
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, required = true, description = "Name of the user to be added to the project")
+    private String username;
+
+    @Parameter(name = ApiConstants.EMAIL, type = CommandType.STRING, description = "email ID of user to which invitation to the project is going to be sent")
+    private String email;
+
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = BaseCmd.CommandType.UUID, entityType = ProjectRoleResponse.class,
+            description = "ID of the project role", validations = {ApiArgValidator.PositiveNumber})
+    private Long projectRoleId;
+
+    @Parameter(name = ApiConstants.ROLE_TYPE, type = BaseCmd.CommandType.STRING,
+            description = "Project role type to be assigned to the user - Admin/Regular")
+    private String roleType;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public String getEmail() { return email; }
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public ProjectAccount.Role getRoleType() {
+        if (!Strings.isNullOrEmpty(roleType)) {
+            String role = roleType.substring(0, 1).toUpperCase() + roleType.substring(1).toLowerCase();
+            if (!EnumUtils.isValidEnum(ProjectAccount.Role.class, role)) {
+                throw new InvalidParameterValueException("Only Admin or Regular project role types are valid");
+            }
+            return Enum.valueOf(ProjectAccount.Role.class, role);
+        }
+        return null;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_PROJECT_USER_ADD;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Adding user "+getUsername()+" to Project "+getProjectId();
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute()  {
+        validateInput();
+        boolean result = _projectService.addUserToProject(getProjectId(),  getUsername(), getEmail(), getProjectRoleId(), getRoleType());
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add account to the project");
+        }
+
+    }
+
+    private void validateInput() {
+        if (email == null && username == null) {
+            throw new InvalidParameterValueException("Must specify atleast username");
+        }
+        if (email != null && username == null) {
+            throw new InvalidParameterValueException("Must specify username for given email ID");
+        }
+        if (getProjectId() < 1L) {
+            throw new InvalidParameterValueException("Invalid Project ID provided");
+        }
+        if (projectRoleId != null && projectRoleId < 1L) {
+            throw new InvalidParameterValueException("Invalid Project role ID provided");
+        }
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java
index 60003b7..20d5b31 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteAccountFromProjectCmd.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.account;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -98,6 +100,11 @@
     }
 
     @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(projectId);
+    }
+
+    @Override
     public String getEventType() {
         return EventTypes.EVENT_PROJECT_ACCOUNT_REMOVE;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java
new file mode 100644
index 0000000..38cb5a2
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/DeleteUserFromProjectCmd.java
@@ -0,0 +1,118 @@
+// 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.api.command.user.account;
+
+import java.util.List;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.user.project.DeleteProjectCmd;
+import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.api.response.UserResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.projects.Project;
+
+@APICommand(name = DeleteUserFromProjectCmd.APINAME, description = "Deletes user from the project", responseObject = SuccessResponse.class, since = "4.15.0",
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User})
+public class DeleteUserFromProjectCmd extends BaseAsyncCmd {
+    public static final Logger LOGGER = Logger.getLogger(DeleteProjectCmd.class.getName());
+    public static final String APINAME = "deleteUserFromProject";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.PROJECT_ID,
+            type = BaseCmd.CommandType.UUID,
+            entityType = ProjectResponse.class,
+            required = true,
+            description = "ID of the project to remove the user from")
+    private Long projectId;
+
+    @Parameter(name = ApiConstants.USER_ID, type = BaseCmd.CommandType.UUID, entityType = UserResponse.class,
+            required = true, description = "Id of the user to be removed from the project")
+    private Long userId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_PROJECT_USER_REMOVE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Removing user " + userId + " from project: " + projectId;
+    }
+
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        Project project = _projectService.getProject(projectId);
+        if (project == null) {
+            throw new InvalidParameterValueException("Unable to find project by ID " + projectId);
+        }
+        return _projectService.getProjectOwner(projectId).getId();
+    }
+
+    @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(projectId);
+    }
+
+    @Override
+    public void execute() {
+        CallContext.current().setEventDetails("Project ID: " + projectId + "; user ID: " + userId);
+        boolean result = _projectService.deleteUserFromProject(getProjectId(), getUserId());
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete account from the project");
+        }
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java
index 3fcb198..bc10e4b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/account/ListProjectAccountsCmd.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.account;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListCmd;
@@ -25,6 +23,9 @@
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.ProjectRoleResponse;
+import org.apache.cloudstack.api.response.UserResponse;
+import org.apache.log4j.Logger;
 
 import com.cloud.user.Account;
 
@@ -45,9 +46,15 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "list accounts of the project by account name")
     private String accountName;
 
+    @Parameter(name = ApiConstants.USER_ID, type = CommandType.UUID, entityType = UserResponse.class, description = "list invitation by user ID")
+    private Long userId;
+
     @Parameter(name = ApiConstants.ROLE, type = CommandType.STRING, description = "list accounts of the project by role")
     private String role;
 
+    @Parameter(name = ApiConstants.PROJECT_ROLE_ID, type = CommandType.UUID, entityType = ProjectRoleResponse.class, description = "list accounts of the project by project role id")
+    private Long projectRoleId;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -64,6 +71,12 @@
         return role;
     }
 
+    public Long getUserId() { return userId; }
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
     @Override
     public String getCommandName() {
         return s_name;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
index 9299c3d..be5a613 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
@@ -74,10 +74,10 @@
     @Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, description = "the ending port of firewall rule")
     private Integer publicEndPort;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
-    @Parameter(name = ApiConstants.DEST_CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic to")
+    @Parameter(name = ApiConstants.DEST_CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic to. Multiple entries must be separated by a single comma character (,).")
     private List<String> destCidrList;
 
     @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the icmp message being sent")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
index 02c4255..ea5657c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
@@ -73,7 +73,7 @@
     @Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, description = "the ending port of firewall rule")
     private Integer publicEndPort;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the ICMP message being sent")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
index ff11395..c569afc 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
@@ -108,7 +108,7 @@
                 description = "the ID of the virtual machine for the port forwarding rule")
     private Long virtualMachineId;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     @Parameter(name = ApiConstants.OPEN_FIREWALL, type = CommandType.BOOLEAN, description = "if true, firewall rule for source/end public port is automatically created; "
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
index 53273fe..283da3c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java
@@ -107,7 +107,7 @@
     @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "the domain ID associated with the load balancer")
     private Long domainId;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     @Parameter(name = ApiConstants.NETWORK_ID, type = CommandType.UUID, entityType = NetworkResponse.class, description = "The guest network this "
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
index 309e43f..c206a16 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
@@ -76,6 +76,9 @@
     @Parameter(name = ApiConstants.NAME , type = CommandType.STRING, required = true, description = "Name for the uploaded certificate")
     private String name;
 
+    @Parameter(name = ApiConstants.ENABLED_REVOCATION_CHECK, type = CommandType.BOOLEAN, description = "Enables revocation checking for certificates", since = "4.15")
+    private Boolean enabledRevocationCheck = Boolean.TRUE;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -112,6 +115,10 @@
         return name;
     }
 
+    public Boolean getEnabledRevocationCheck() {
+        return enabledRevocationCheck;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
index 1b367a9..7b66bd9 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
@@ -74,7 +74,7 @@
                description = "if true, firewall rule for source/end public port is automatically created; if false - firewall rule has to be created explicitly. Has value true by default")
     private Boolean openFirewall;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to forward traffic from. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
index 2b2a3c6..3d79c22 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
@@ -59,7 +59,7 @@
     @Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, description = "the ending port of ACL")
     private Integer publicEndPort;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to allow traffic from/to")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the CIDR list to allow traffic from/to. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the ICMP message being sent")
@@ -247,4 +247,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
index 0127fac..c69fc69 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/ListNetworksCmd.java
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.cloudstack.api.response.NetworkOfferingResponse;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.acl.RoleType;
@@ -89,6 +90,9 @@
     @Parameter(name = ApiConstants.DISPLAY_NETWORK, type = CommandType.BOOLEAN, description = "list resources by display flag; only ROOT admin is eligible to pass this parameter", since = "4.4", authorized = {RoleType.Admin})
     private Boolean display;
 
+    @Parameter(name = ApiConstants.NETWORK_OFFERING_ID, type = CommandType.UUID, entityType = NetworkOfferingResponse.class, description = "list networks by network offering ID")
+    private Long networkOfferingId;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -151,6 +155,10 @@
         return forVpc;
     }
 
+    public Long getNetworkOfferingId() {
+        return networkOfferingId;
+    }
+
     @Override
     public Boolean getDisplay() {
         if (display != null) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java
index 1215f57..189ed1c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLItemCmd.java
@@ -54,7 +54,7 @@
     @Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, description = "the ending port of ACL")
     private Integer publicEndPort;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to allow traffic from/to")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to allow traffic from/to. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrlist;
 
     @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the ICMP message being sent")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListServiceOfferingsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListServiceOfferingsCmd.java
index dcb1730..91cac09 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListServiceOfferingsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/offering/ListServiceOfferingsCmd.java
@@ -65,6 +65,24 @@
             since = "4.13")
     private Long zoneId;
 
+    @Parameter(name = ApiConstants.CPU_NUMBER,
+            type = CommandType.INTEGER,
+            description = "the CPU number that listed offerings must support",
+            since = "4.15")
+    private Integer cpuNumber;
+
+    @Parameter(name = ApiConstants.MEMORY,
+            type = CommandType.INTEGER,
+            description = "the RAM memory that listed offering must support",
+            since = "4.15")
+    private Integer memory;
+
+    @Parameter(name = ApiConstants.CPU_SPEED,
+            type = CommandType.INTEGER,
+            description = "the CPU speed that listed offerings must support",
+            since = "4.15")
+    private Integer cpuSpeed;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -93,6 +111,18 @@
         return zoneId;
     }
 
+    public Integer getCpuNumber() {
+        return cpuNumber;
+    }
+
+    public Integer getMemory() {
+        return memory;
+    }
+
+    public Integer getCpuSpeed() {
+        return cpuSpeed;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ActivateProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ActivateProjectCmd.java
index 5b1b76e..58cc93f 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ActivateProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ActivateProjectCmd.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -69,6 +71,11 @@
         return _projectService.getProjectOwner(getId()).getId();
     }
 
+    @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(id);
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/CreateProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/CreateProjectCmd.java
index 2ffa142..64de9a7 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/CreateProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/CreateProjectCmd.java
@@ -16,18 +16,19 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
-import org.apache.cloudstack.api.ApiArgValidator;
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiArgValidator;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCreateCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
@@ -49,9 +50,16 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "account who will be Admin for the project")
     private String accountName;
 
+    @Parameter(name = ApiConstants.USER_ID, type = CommandType.UUID, entityType = UserResponse.class,
+            description = "user ID of the account to be assigned as owner of the project i.e., Project Admin", since = "4.15.0")
+    private Long userId;
+
     @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning a project")
     private Long domainId;
 
+    @Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.UUID, entityType = AccountResponse.class, description = "ID of the account owning a project")
+    private Long accountId;
+
     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, validations = ApiArgValidator.NotNullOrEmpty, description = "name of the project")
     private String name;
 
@@ -73,16 +81,24 @@
     public Long getDomainId() {
         if (domainId != null) {
             return domainId;
-        } else {
-            return CallContext.current().getCallingAccount().getDomainId();
         }
 
+        return CallContext.current().getCallingAccount().getDomainId();
+
     }
 
     public String getName() {
         return name;
     }
 
+    public Long getUserId() {
+        return userId;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
     public String getDisplayText() {
         return displayText;
     }
@@ -96,10 +112,13 @@
     public long getEntityOwnerId() {
         Account caller = CallContext.current().getCallingAccount();
 
-        if ((accountName != null && domainId == null) || (domainId != null && accountName == null)) {
+        if ((accountName != null && domainId == null)) {
             throw new InvalidParameterValueException("Account name and domain id must be specified together");
         }
 
+        if (userId != null && (accountId == null || domainId == null)) {
+            throw new InvalidParameterValueException("Account ID and Domain ID must be specified with userID");
+        }
         if (accountName != null) {
             return _accountService.finalizeOwner(caller, accountName, domainId, null).getId();
         }
@@ -126,7 +145,7 @@
     @Override
     public void create() throws ResourceAllocationException {
         CallContext.current().setEventDetails("Project Name: " + getName());
-        Project project = _projectService.createProject(getName(), getDisplayText(), getAccountName(), getDomainId());
+        Project project = _projectService.createProject(getName(), getDisplayText(), getAccountName(), getDomainId(), getUserId(), getAccountId());
         if (project != null) {
             this.setEntityId(project.getId());
             this.setEntityUuid(project.getUuid());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/DeleteProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/DeleteProjectCmd.java
index 3a2e48d..171d517 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/DeleteProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/DeleteProjectCmd.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -96,4 +98,9 @@
         return _projectService.getProjectOwner(id).getId();
     }
 
+    @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(id);
+    }
+
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java
index f34f422..4a85c9d 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectInvitationsCmd.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
+import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -53,6 +54,9 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ProjectInvitationResponse.class, description = "list invitations by id")
     private Long id;
 
+    @Parameter(name = ApiConstants.USER_ID, type = CommandType.UUID, entityType = UserResponse.class, description = "list invitation by user ID")
+    private Long userId;
+
     // ///////////////////////////////////////////////////
     // ///////////////// Accessors ///////////////////////
     // ///////////////////////////////////////////////////
@@ -72,6 +76,10 @@
         return id;
     }
 
+    public Long getUserId() {
+        return userId;
+    }
+
     @Override
     public String getCommandName() {
         return s_name;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java
index db77916..2c96551 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/ListProjectsCmd.java
@@ -63,6 +63,9 @@
     @Parameter(name = ApiConstants.TAGS, type = CommandType.MAP, description = "List projects by tags (key/value pairs)")
     private Map tags;
 
+    @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "List projects by username")
+    private String username;
+
     @Parameter(name = ApiConstants.DETAILS,
                type = CommandType.LIST,
                collectionType = CommandType.STRING,
@@ -89,6 +92,10 @@
         return state;
     }
 
+    public String getUsername() {
+        return username;
+    }
+
     @Override
     public String getCommandName() {
         return s_name;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/SuspendProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/SuspendProjectCmd.java
index 69a4b77..57f052b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/SuspendProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/SuspendProjectCmd.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -98,4 +100,9 @@
         return _projectService.getProjectOwner(id).getId();
     }
 
+    @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(id);
+    }
+
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectCmd.java
index 11e5e35..70aa26d 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectCmd.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
-import org.apache.log4j.Logger;
+import java.util.List;
 
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
@@ -25,12 +25,17 @@
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.ProjectResponse;
+import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang3.EnumUtils;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.google.common.base.Strings;
 
 @APICommand(name = "updateProject", description = "Updates a project", responseObject = ProjectResponse.class, since = "3.0.0",
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -52,6 +57,17 @@
     @Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, description = "display text of the project")
     private String displayText;
 
+    @Parameter(name = ApiConstants.USER_ID, type = CommandType.UUID, entityType = UserResponse.class, description = "ID of the user to be promoted/demoted")
+    private Long userId;
+
+    @Parameter(name = ApiConstants.ROLE_TYPE, type = CommandType.STRING, description = "Account level role to be assigned to the user/account : Admin/Regular")
+    private String roleType;
+
+    @Parameter(name = ApiConstants.SWAP_OWNER, type = CommandType.BOOLEAN, description = "when true, it swaps ownership with the account/ user provided. " +
+            "Ideally to be used when a single project administrator is present. In case of multiple project admins, swapowner is to be set to false," +
+            "to promote or demote the user/account based on the roleType (Regular or Admin) provided. Defaults to true")
+    private Boolean swapOwner;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -68,11 +84,34 @@
         return displayText;
     }
 
+    public Long getUserId() {
+        return userId;
+    }
+
+    public ProjectAccount.Role getRoleType(String role) {
+        String type = role.substring(0, 1).toUpperCase() + role.substring(1).toLowerCase();
+        if (!EnumUtils.isValidEnum(ProjectAccount.Role.class, type)) {
+            throw new InvalidParameterValueException("Only Admin or Regular project role types are valid");
+        }
+        return Enum.valueOf(ProjectAccount.Role.class, type);
+    }
+
+    public ProjectAccount.Role getAccountRole() {
+        if (!Strings.isNullOrEmpty(roleType)) {
+            return getRoleType(roleType);
+        }
+        return ProjectAccount.Role.Regular;
+    }
+
     @Override
     public String getCommandName() {
         return s_name;
     }
 
+    public Boolean isSwapOwner() {
+        return swapOwner != null ? swapOwner : true;
+    }
+
     @Override
     public long getEntityOwnerId() {
         Project project = _projectService.getProject(id);
@@ -84,6 +123,11 @@
         return _projectService.getProjectOwner(id).getId();
     }
 
+    @Override
+    public List<Long> getEntityOwnerIds() {
+        return _projectService.getProjectOwners(id);
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -91,7 +135,17 @@
     @Override
     public void execute() throws ResourceAllocationException {
         CallContext.current().setEventDetails("Project id: " + getId());
-        Project project = _projectService.updateProject(getId(), getDisplayText(), getAccountName());
+        if (getAccountName() != null && getUserId() != null) {
+            throw new InvalidParameterValueException("Account name and user ID are mutually exclusive. Provide either account name" +
+                    "to update account or user ID to update the user of the project");
+        }
+
+        Project project = null;
+        if (isSwapOwner()) {
+            project = _projectService.updateProject(getId(), getDisplayText(), getAccountName());
+        }  else {
+            project = _projectService.updateProject(getId(), getDisplayText(), getAccountName(), getUserId(), getAccountRole());
+        }
         if (project != null) {
             ProjectResponse response = _responseGenerator.createProjectResponse(project);
             response.setResponseName(getCommandName());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectInvitationCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectInvitationCmd.java
index 79e3f8a..53fccfe 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectInvitationCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/project/UpdateProjectInvitationCmd.java
@@ -16,17 +16,18 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.project;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.BaseAsyncCmd;
+import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
 
 import com.cloud.event.EventTypes;
 import com.cloud.user.Account;
@@ -46,6 +47,10 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "account that is joining the project")
     private String accountName;
 
+    @Parameter(name = ApiConstants.USER_ID, type = BaseCmd.CommandType.UUID, entityType = UserResponse.class,
+            description = "User UUID, required for adding account from external provisioning system")
+    private Long userId;
+
     @Parameter(name = ApiConstants.TOKEN,
                type = CommandType.STRING,
                description = "list invitations for specified account; this parameter has to be specified with domainId")
@@ -65,6 +70,8 @@
         return accountName;
     }
 
+    public Long getUserId() { return userId; }
+
     @Override
     public String getCommandName() {
         return s_name;
@@ -93,8 +100,15 @@
 
     @Override
     public void execute() {
-        CallContext.current().setEventDetails("Project id: " + projectId + "; accountName " + accountName + "; accept " + getAccept());
-        boolean result = _projectService.updateInvitation(projectId, accountName, token, getAccept());
+        String eventDetails = "Project id: " + projectId + ";";
+        if (accountName != null) {
+            eventDetails +=  " accountName: " + accountName + ";";
+        } else if (userId != null) {
+            eventDetails += " userId: " + userId + ";";
+        }
+        eventDetails += " accept " + getAccept();
+        CallContext.current().setEventDetails(eventDetails);
+        boolean result = _projectService.updateInvitation(projectId, accountName, userId, token, getAccept());
         if (result) {
             SuccessResponse response = new SuccessResponse(getCommandName());
             this.setResponseObject(response);
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
index f7339e9..79cb831 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupEgressCmd.java
@@ -73,7 +73,7 @@
     @Parameter(name = ApiConstants.ICMP_CODE, type = CommandType.INTEGER, description = "error code for this icmp message")
     private Integer icmpCode;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list associated")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list associated. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrList;
 
     @Parameter(name = ApiConstants.USER_SECURITY_GROUP_LIST, type = CommandType.MAP, description = "user to security group mapping")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
index fb66e31..3b339e4 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/securitygroup/AuthorizeSecurityGroupIngressCmd.java
@@ -73,7 +73,7 @@
     @Parameter(name = ApiConstants.ICMP_CODE, type = CommandType.INTEGER, description = "error code for this icmp message")
     private Integer icmpCode;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list associated")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list associated. Multiple entries must be separated by a single comma character (,).")
     private List<String> cidrList;
 
     @Parameter(name = ApiConstants.USER_SECURITY_GROUP_LIST, type = CommandType.MAP, description = "user to security group mapping")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
index 00e956a..b42b271 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/GetUploadParamsForTemplateCmd.java
@@ -22,6 +22,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import com.cloud.hypervisor.Hypervisor;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.AbstractGetUploadParamsCmd;
@@ -51,7 +52,8 @@
     @Parameter(name = ApiConstants.HYPERVISOR, type = CommandType.STRING, required = true, description = "the target hypervisor for the template")
     private String hypervisor;
 
-    @Parameter(name = ApiConstants.OS_TYPE_ID, type = CommandType.UUID, entityType = GuestOSResponse.class, required = true, description = "the ID of the OS Type that best represents the OS of this template.")
+    @Parameter(name = ApiConstants.OS_TYPE_ID, type = CommandType.UUID, entityType = GuestOSResponse.class, required = false,
+            description = "the ID of the OS Type that best represents the OS of this template. Not required for VMware as the guest OS is obtained from the OVF file.")
     private Long osTypeId;
 
     @Parameter(name = ApiConstants.BITS, type = CommandType.INTEGER, description = "32 or 64 bits support. 64 by default")
@@ -168,6 +170,12 @@
         if (getZoneId() <= 0) {
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "invalid zoneid");
         }
+        if (!hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && osTypeId == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Missing parameter ostypeid");
+        }
+        if (hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && osTypeId != null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid parameter ostypeid, not applicable for VMware");
+        }
     }
 
     @Override
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplateOVFProperties.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplateOVFProperties.java
deleted file mode 100644
index 2a620c9..0000000
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplateOVFProperties.java
+++ /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.
-package org.apache.cloudstack.api.command.user.template;
-
-import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.NetworkRuleConflictException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.exception.ResourceUnavailableException;
-import org.apache.cloudstack.acl.RoleType;
-import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseCmd;
-import org.apache.cloudstack.api.BaseListCmd;
-import org.apache.cloudstack.api.Parameter;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.response.ListResponse;
-import org.apache.cloudstack.api.response.TemplateOVFPropertyResponse;
-import org.apache.cloudstack.api.response.TemplateResponse;
-import org.apache.cloudstack.context.CallContext;
-
-@APICommand(name = ListTemplateOVFProperties.APINAME,
-        description = "List template OVF properties if available.",
-        responseObject = TemplateOVFPropertyResponse.class,
-        authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin, RoleType.User})
-public class ListTemplateOVFProperties extends BaseListCmd {
-
-    public static final String APINAME = "listTemplateOvfProperties";
-
-    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class,
-            description = "the template ID", required = true)
-    private Long templateId;
-
-    public Long getTemplateId() {
-        return templateId;
-    }
-
-    @Override
-    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
-        ListResponse<TemplateOVFPropertyResponse> response = _queryService.listTemplateOVFProperties(this);
-        response.setResponseName(getCommandName());
-        setResponseObject(response);
-    }
-
-    @Override
-    public String getCommandName() {
-        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
-    }
-
-    @Override
-    public long getEntityOwnerId() {
-        return CallContext.current().getCallingAccount().getId();
-    }
-}
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
index 5630d7f..5ef66c5 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
@@ -16,8 +16,12 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.template;
 
+import com.cloud.exception.InvalidParameterValueException;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 
+import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.List;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
@@ -82,10 +86,36 @@
     @Parameter(name = ApiConstants.PARENT_TEMPLATE_ID, type = CommandType.UUID, entityType = TemplateResponse.class, description = "list datadisk templates by parent template id", since = "4.4")
     private Long parentTemplateId;
 
+    @Parameter(name = ApiConstants.DETAILS,
+            type = CommandType.LIST,
+            collectionType = CommandType.STRING,
+            since = "4.15",
+            description = "comma separated list of template details requested, value can be a list of [ all, min]")
+    private List<String> viewDetails;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
+    public EnumSet<ApiConstants.DomainDetails> getDetails() throws InvalidParameterValueException {
+        EnumSet<ApiConstants.DomainDetails> dv;
+        if (CollectionUtils.isEmpty(viewDetails)) {
+            dv = EnumSet.of(ApiConstants.DomainDetails.all);
+        } else {
+            try {
+                ArrayList<ApiConstants.DomainDetails> dc = new ArrayList<>();
+                for (String detail : viewDetails) {
+                    dc.add(ApiConstants.DomainDetails.valueOf(detail));
+                }
+                dv = EnumSet.copyOf(dc);
+            } catch (IllegalArgumentException e) {
+                throw new InvalidParameterValueException("The details parameter contains a non permitted value. The allowed values are " +
+                        EnumSet.allOf(ApiConstants.DomainDetails.class));
+            }
+        }
+        return dv;
+    }
+
     public String getHypervisor() {
         return hypervisor;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
index 7e0002d..74053ee 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
@@ -86,8 +86,8 @@
     @Parameter(name = ApiConstants.OS_TYPE_ID,
                type = CommandType.UUID,
                entityType = GuestOSResponse.class,
-               required = true,
-               description = "the ID of the OS Type that best represents the OS of this template.")
+               required = false,
+               description = "the ID of the OS Type that best represents the OS of this template. Not applicable with VMware, as we honour what is defined in the template")
     private Long osTypeId;
 
     @Parameter(name = ApiConstants.PASSWORD_ENABLED,
@@ -274,6 +274,10 @@
         return directDownload == null ? false : directDownload;
     }
 
+    public Boolean isDeployAsIs() {
+        return hypervisor != null && hypervisor.equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString());
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -336,5 +340,9 @@
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
                     "Parameter directdownload is only allowed for KVM templates");
         }
+
+        if (!getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.VMware.toString()) && osTypeId == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please provide a guest OS type");
+        }
     }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index db315cc..6d7cc9c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@ -52,6 +52,7 @@
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.log4j.Logger;
 
@@ -72,6 +73,8 @@
 import com.cloud.utils.net.Dhcp;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VmDetailConstants;
+import com.google.common.base.Strings;
 
 @APICommand(name = "deployVirtualMachine", description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = true)
@@ -113,12 +116,15 @@
     @Parameter(name = ApiConstants.NETWORK_IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = NetworkResponse.class, description = "list of network ids used by virtual machine. Can't be specified with ipToNetworkList parameter")
     private List<Long> networkIds;
 
-    @Parameter(name = ApiConstants.BOOT_TYPE, type = CommandType.STRING, required = false, description = "Guest VM Boot option either custom[UEFI] or default boot [BIOS]")
+    @Parameter(name = ApiConstants.BOOT_TYPE, type = CommandType.STRING, required = false, description = "Guest VM Boot option either custom[UEFI] or default boot [BIOS]. Not applicable with VMware, as we honour what is defined in the template.", since = "4.14.0.0")
     private String bootType;
 
-    @Parameter(name = ApiConstants.BOOT_MODE, type = CommandType.STRING, required = false, description = "Boot Mode [Legacy] or [Secure] Applicable when Boot Type Selected is UEFI, otherwise Legacy By default for BIOS")
+    @Parameter(name = ApiConstants.BOOT_MODE, type = CommandType.STRING, required = false, description = "Boot Mode [Legacy] or [Secure] Applicable when Boot Type Selected is UEFI, otherwise Legacy only for BIOS. Not applicable with VMware, as we honour what is defined in the template.", since = "4.14.0.0")
     private String bootMode;
 
+    @Parameter(name = ApiConstants.BOOT_INTO_SETUP, type = CommandType.BOOLEAN, required = false, description = "Boot into hardware setup or not (ignored if startVm = false, only valid for vmware)", since = "4.15.0.0")
+    private Boolean bootIntoSetup;
+
     //DataDisk information
     @ACL
     @Parameter(name = ApiConstants.DISK_OFFERING_ID, type = CommandType.UUID, entityType = DiskOfferingResponse.class, description = "the ID of the disk offering for the virtual machine. If the template is of ISO format,"
@@ -218,10 +224,16 @@
     @Parameter(name = ApiConstants.COPY_IMAGE_TAGS, type = CommandType.BOOLEAN, since = "4.13", description = "if true the image tags (if any) will be copied to the VM, default value is false")
     private Boolean copyImageTags;
 
-    @Parameter(name = ApiConstants.OVF_PROPERTIES, type = CommandType.MAP, since = "4.13",
-            description = "used to specify the OVF properties.")
+    @Parameter(name = ApiConstants.PROPERTIES, type = CommandType.MAP, since = "4.15",
+            description = "used to specify the vApp properties.")
     @LogLevel(LogLevel.Log4jLevel.Off)
-    private Map vmOvfProperties;
+    private Map vAppProperties;
+
+    @Parameter(name = ApiConstants.NIC_NETWORK_LIST, type = CommandType.MAP, since = "4.15",
+            description = "VMware only: used to specify network mapping of a vApp VMware template registered \"as-is\"." +
+                    " Example nicnetworklist[0].ip=Nic-101&nicnetworklist[0].network=uuid")
+    @LogLevel(LogLevel.Log4jLevel.Off)
+    private Map vAppNetworks;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -253,8 +265,7 @@
         return domainId;
     }
 
-    private ApiConstants.BootType  getBootType() {
-
+    public ApiConstants.BootType  getBootType() {
         if (StringUtils.isNotBlank(bootType)) {
             try {
                 String type = bootType.trim().toUpperCase();
@@ -281,15 +292,14 @@
                 }
             }
         }
-        if(getBootType() != null){ // export to get
-            if(getBootType() == ApiConstants.BootType.UEFI) {
-                customparameterMap.put(getBootType().toString(), getBootMode().toString());
-            }
+        if (ApiConstants.BootType.UEFI.equals(getBootType())) {
+            customparameterMap.put(getBootType().toString(), getBootMode().toString());
         }
 
         if (rootdisksize != null && !customparameterMap.containsKey("rootdisksize")) {
             customparameterMap.put("rootdisksize", rootdisksize.toString());
         }
+
         return customparameterMap;
     }
 
@@ -309,11 +319,10 @@
         return null;
     }
 
-
-    public Map<String, String> getVmOVFProperties() {
+    public Map<String, String> getVmProperties() {
         Map<String, String> map = new HashMap<>();
-        if (MapUtils.isNotEmpty(vmOvfProperties)) {
-            Collection parameterCollection = vmOvfProperties.values();
+        if (MapUtils.isNotEmpty(vAppProperties)) {
+            Collection parameterCollection = vAppProperties.values();
             Iterator iterator = parameterCollection.iterator();
             while (iterator.hasNext()) {
                 HashMap<String, String> entry = (HashMap<String, String>)iterator.next();
@@ -323,6 +332,32 @@
         return map;
     }
 
+    public Map<Integer, Long> getVmNetworkMap() {
+        Map<Integer, Long> map = new HashMap<>();
+        if (MapUtils.isNotEmpty(vAppNetworks)) {
+            Collection parameterCollection = vAppNetworks.values();
+            Iterator iterator = parameterCollection.iterator();
+            while (iterator.hasNext()) {
+                HashMap<String, String> entry = (HashMap<String, String>) iterator.next();
+                Integer nic;
+                try {
+                    nic = Integer.valueOf(entry.get(VmDetailConstants.NIC));
+                } catch (NumberFormatException nfe) {
+                    nic = null;
+                }
+                String networkUuid = entry.get(VmDetailConstants.NETWORK);
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace(String.format("nic, '%s', goes on net, '%s'", nic, networkUuid));
+                }
+                if (nic == null || Strings.isNullOrEmpty(networkUuid) || _entityMgr.findByUuid(Network.class, networkUuid) == null) {
+                    throw new InvalidParameterValueException(String.format("Network ID: %s for NIC ID: %s is invalid", networkUuid, nic));
+                }
+                map.put(nic, _entityMgr.findByUuid(Network.class, networkUuid).getId());
+            }
+        }
+        return map;
+    }
+
     public String getGroup() {
         return group;
     }
@@ -372,6 +407,13 @@
     }
 
     public List<Long> getNetworkIds() {
+        if (MapUtils.isNotEmpty(vAppNetworks)) {
+            if (CollectionUtils.isNotEmpty(networkIds) || ipAddress != null || getIp6Address() != null || MapUtils.isNotEmpty(ipToNetworkList)) {
+                throw new InvalidParameterValueException(String.format("%s can't be specified along with %s, %s, %s", ApiConstants.NIC_NETWORK_LIST, ApiConstants.NETWORK_IDS, ApiConstants.IP_ADDRESS, ApiConstants.IP_NETWORK_LIST));
+            } else {
+                return new ArrayList<>();
+            }
+        }
        if (ipToNetworkList != null && !ipToNetworkList.isEmpty()) {
            if ((networkIds != null && !networkIds.isEmpty()) || ipAddress != null || getIp6Address() != null) {
                throw new InvalidParameterValueException("ipToNetworkMap can't be specified along with networkIds or ipAddress");
@@ -577,6 +619,10 @@
         return copyImageTags == null ? false : copyImageTags;
     }
 
+    public Boolean getBootIntoSetup() {
+        return bootIntoSetup;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
index 072cf6b..72839f2 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/ListVMsCmd.java
@@ -21,6 +21,7 @@
 import java.util.List;
 
 import org.apache.cloudstack.api.command.user.UserCmd;
+import org.apache.cloudstack.api.response.SecurityGroupResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.log4j.Logger;
 
@@ -134,6 +135,12 @@
     @Parameter(name = ApiConstants.USER_ID, type = CommandType.UUID, entityType = UserResponse.class, required = false, description = "the user ID that created the VM and is under the account that owns the VM")
     private Long userId;
 
+    @Parameter(name = ApiConstants.SECURITY_GROUP_ID, type = CommandType.UUID, entityType = SecurityGroupResponse.class, description = "the security group ID", since = "4.15")
+    private Long securityGroupId;
+
+    @Parameter(name = ApiConstants.HA_ENABLE, type = CommandType.BOOLEAN, description = "list by the High Availability offering; true if filtering VMs with HA enabled; false for VMs with HA disabled", since = "4.15")
+    private Boolean haEnabled;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -212,6 +219,14 @@
         return storageId;
     }
 
+    public Long getSecurityGroupId() {
+        return securityGroupId;
+    }
+
+    public Boolean getHaEnabled() {
+        return haEnabled;
+    }
+
     public EnumSet<VMDetails> getDetails() throws InvalidParameterValueException {
         EnumSet<VMDetails> dv;
         if (viewDetails == null || viewDetails.size() <= 0) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
index 6011bdb..5bdbbb6 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/RebootVMCmd.java
@@ -53,6 +53,9 @@
             required=true, description="The ID of the virtual machine")
     private Long id;
 
+    @Parameter(name = ApiConstants.BOOT_INTO_SETUP, type = CommandType.BOOLEAN, required = false, description = "Boot into hardware setup menu or not", since = "4.15.0.0")
+    private Boolean bootIntoSetup;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -61,6 +64,10 @@
         return id;
     }
 
+    public Boolean getBootIntoSetup() {
+        return bootIntoSetup;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
index 2a7f6d0..ffbce17 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vm/StartVMCmd.java
@@ -85,6 +85,9 @@
     @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin })
     private String deploymentPlanner;
 
+    @Parameter(name = ApiConstants.BOOT_INTO_SETUP, type = CommandType.BOOLEAN, required = false, description = "Boot into hardware setup menu or not", since = "4.15.0.0")
+    private Boolean bootIntoSetup;
+
     // ///////////////////////////////////////////////////
     // ///////////////// Accessors ///////////////////////
     // ///////////////////////////////////////////////////
@@ -105,6 +108,10 @@
         return clusterId;
     }
 
+    public Boolean getBootIntoSetup() {
+        return bootIntoSetup;
+    }
+
     // ///////////////////////////////////////////////////
     // ///////////// API Implementation///////////////////
     // ///////////////////////////////////////////////////
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
index e89f6cc..7cb3194 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
@@ -17,7 +17,7 @@
 
 package org.apache.cloudstack.api.command.user.vmsnapshot;
 
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 import com.cloud.vm.VirtualMachine;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
index 9076ac2..86562ad 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vmsnapshot/RevertToVMSnapshotCmd.java
@@ -16,7 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.vmsnapshot;
 
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.ACL;
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
index 304bb25..1f1bc6a 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
@@ -87,6 +87,13 @@
         this.maxIops = maxIops;
     }
 
+    public ResizeVolumeCmd(Long id, Long minIops, Long maxIops, long diskOfferingId) {
+        this.id = id;
+        this.minIops = minIops;
+        this.maxIops = maxIops;
+        this.newDiskOfferingId = diskOfferingId;
+    }
+
     //TODO use the method getId() instead of this one.
     public Long getEntityId() {
         return id;
@@ -164,14 +171,23 @@
 
     @Override
     public String getEventDescription() {
-        return "Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId()) + " to size " + getSize() + "G";
+        if (getSize() != null) {
+            return "Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId()) + " to size " + getSize() + " GB";
+        } else {
+            return "Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId());
+        }
     }
 
     @Override
     public void execute() throws ResourceAllocationException {
         Volume volume = null;
         try {
-            CallContext.current().setEventDetails("Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId()) + " to size " + getSize() + "G");
+            if (size != null) {
+                CallContext.current().setEventDetails("Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId()) + " to size " + getSize() + " GB");
+            } else {
+                CallContext.current().setEventDetails("Volume Id: " + this._uuidMgr.getUuid(Volume.class, getEntityId()));
+            }
+
             volume = _volumeService.resizeVolume(this);
         } catch (InvalidParameterValueException ex) {
             s_logger.info(ex.getMessage());
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
index 5c2cbfe..6f59175 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
@@ -48,7 +48,7 @@
     @Parameter(name = ApiConstants.GATEWAY, type = CommandType.STRING, required = true, description = "public ip address id of the customer gateway")
     private String gatewayIp;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.STRING, required = true, description = "guest cidr list of the customer gateway")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.STRING, required = true, description = "guest cidr list of the customer gateway. Multiple entries must be separated by a single comma character (,).")
     private String peerCidrList;
 
     @Parameter(name = ApiConstants.IPSEC_PSK, type = CommandType.STRING, required = true, description = "IPsec Preshared-Key of the customer gateway. Cannot contain newline or double quotes.")
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
index bb59141..d7bf5c4 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpn/UpdateVpnCustomerGatewayCmd.java
@@ -54,7 +54,7 @@
     @Parameter(name = ApiConstants.GATEWAY, type = CommandType.STRING, required = true, description = "public ip address id of the customer gateway")
     private String gatewayIp;
 
-    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.STRING, required = true, description = "guest cidr of the customer gateway")
+    @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.STRING, required = true, description = "guest cidr of the customer gateway. Multiple entries must be separated by a single comma character (,).")
     private String guestCidrList;
 
     @Parameter(name = ApiConstants.IPSEC_PSK, type = CommandType.STRING, required = true, description = "IPsec Preshared-Key of the customer gateway. Cannot contain newline or double quotes.")
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/BaseRolePermissionResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/BaseRolePermissionResponse.java
new file mode 100644
index 0000000..c39939a
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/BaseRolePermissionResponse.java
@@ -0,0 +1,64 @@
+// 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.api.response;
+
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.acl.Rule;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+public class BaseRolePermissionResponse extends BaseResponse {
+    @SerializedName(ApiConstants.RULE)
+    @Param(description = "the api name or wildcard rule")
+    private String rule;
+
+    @SerializedName(ApiConstants.PERMISSION)
+    @Param(description = "the permission type of the api name or wildcard rule, allow/deny")
+    private String rulePermission;
+
+    @SerializedName(ApiConstants.DESCRIPTION)
+    @Param(description = "the description of the role permission")
+    private String ruleDescription;
+
+    public String getRule() {
+        return rule;
+    }
+
+    public void setRule(Rule rule) {
+        if (rule != null) {
+            this.rule = rule.getRuleString();
+        }
+    }
+
+    public String getRulePermission() {
+        return rulePermission;
+    }
+
+    public void setRulePermission(Permission rulePermission) {
+        if (rulePermission != null) {
+            this.rulePermission = rulePermission.name().toLowerCase();
+        }
+    }
+
+    public void setDescription(String description) {
+        this.ruleDescription = description;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/BaseRoleResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/BaseRoleResponse.java
new file mode 100644
index 0000000..339d092
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/BaseRoleResponse.java
@@ -0,0 +1,50 @@
+// 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.api.response;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+public class BaseRoleResponse extends BaseResponse {
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the role")
+    private String id;
+
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "the name of the role")
+    private String roleName;
+
+    @SerializedName(ApiConstants.DESCRIPTION)
+    @Param(description = "the description of the role")
+    private String roleDescription;
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+
+    public void setDescription(String description) {
+        this.roleDescription = description;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/DiskOfferingResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/DiskOfferingResponse.java
index 8c0fd70..5398dd3 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/DiskOfferingResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/DiskOfferingResponse.java
@@ -151,6 +151,10 @@
     @Param(description = "whether to display the offering to the end user or not.")
     private Boolean displayOffering;
 
+    @SerializedName("vspherestoragepolicy")
+    @Param(description = "the vsphere storage policy tagged to the disk offering in case of VMware", since = "4.15")
+    private String vsphereStoragePolicy;
+
     public Boolean getDisplayOffering() {
         return displayOffering;
     }
@@ -351,4 +355,12 @@
     public void setIopsWriteRateMaxLength(Long iopsWriteRateMaxLength) {
         this.iopsWriteRateMaxLength = iopsWriteRateMaxLength;
     }
+
+    public String getVsphereStoragePolicy() {
+        return vsphereStoragePolicy;
+    }
+
+    public void setVsphereStoragePolicy(String vsphereStoragePolicy) {
+        this.vsphereStoragePolicy = vsphereStoragePolicy;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/FirewallResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/FirewallResponse.java
index eabc935..3ab4472 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/FirewallResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/FirewallResponse.java
@@ -60,7 +60,7 @@
     private String state;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "the cidr list to forward traffic from")
+    @Param(description = "the cidr list to forward traffic from. Multiple entries are separated by a single comma character (,).")
     private String cidrList;
 
     @SerializedName(ApiConstants.ICMP_TYPE)
@@ -80,7 +80,7 @@
     private Boolean forDisplay;
 
     @SerializedName(ApiConstants.DEST_CIDR_LIST)
-    @Param(description = "the cidr list to forward traffic to")
+    @Param(description = "the cidr list to forward traffic to. Multiple entries are separated by a single comma character (,).")
     private String destCidr;
 
     public void setId(String id) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/FirewallRuleResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/FirewallRuleResponse.java
index 0d11e85..1d3b665 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/FirewallRuleResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/FirewallRuleResponse.java
@@ -79,7 +79,7 @@
     private String state;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "the cidr list to forward traffic from")
+    @Param(description = "the cidr list to forward traffic from. Multiple entries are separated by a single comma character (,).")
     private String cidrList;
 
     @SerializedName(ApiConstants.TAGS)
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
index 8d7d8b3..79e3d4b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/HostResponse.java
@@ -537,14 +537,13 @@
         detailsCopy.remove("username");
         detailsCopy.remove("password");
 
-        if(detailsCopy.containsKey(Host.HOST_UEFI_ENABLE)) {
+        if (detailsCopy.containsKey(Host.HOST_UEFI_ENABLE)) {
             this.setUefiCapabilty(Boolean.parseBoolean((String) detailsCopy.get(Host.HOST_UEFI_ENABLE)));
             detailsCopy.remove(Host.HOST_UEFI_ENABLE);
         } else {
             this.setUefiCapabilty(new Boolean(false)); // in case of existing host which is not scanned for UEFI capability
         }
 
-
         this.details = detailsCopy;
     }
 
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java
index 786fddc..f66a61a 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/IPAddressResponse.java
@@ -155,6 +155,10 @@
     @Param(description = "is public ip for display to the regular user", since = "4.4", authorized = {RoleType.Admin})
     private Boolean forDisplay;
 
+    @SerializedName(ApiConstants.NETWORK_NAME)
+    @Param(description="the name of the Network where ip belongs to")
+    private String networkName;
+
     /*
         @SerializedName(ApiConstants.JOB_ID) @Param(description="shows the current pending asynchronous job ID. This tag is not returned if no current pending jobs are acting on the volume")
         private IdentityProxy jobId = new IdentityProxy("async_job");
@@ -297,4 +301,8 @@
     public void setForDisplay(Boolean forDisplay) {
         this.forDisplay = forDisplay;
     }
+
+    public void setNetworkName(String networkName) {
+        this.networkName = networkName;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ImageStoreResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ImageStoreResponse.java
index aaef652..190181e 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/ImageStoreResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ImageStoreResponse.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import com.google.gson.annotations.SerializedName;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
@@ -25,6 +23,7 @@
 import com.cloud.serializer.Param;
 import com.cloud.storage.ImageStore;
 import com.cloud.storage.ScopeType;
+import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value = ImageStore.class)
 public class ImageStoreResponse extends BaseResponse {
@@ -60,6 +59,18 @@
     @Param(description = "the scope of the image store")
     private ScopeType scope;
 
+    @SerializedName("readonly")
+    @Param(description = "defines if store is read-only")
+    private Boolean readonly;
+
+    @SerializedName("disksizetotal")
+    @Param(description = "the total disk size of the host")
+    private Long diskSizeTotal;
+
+    @SerializedName("disksizeused")
+    @Param(description = "the host's currently used disk size")
+    private Long diskSizeUsed;
+
     public ImageStoreResponse() {
     }
 
@@ -132,4 +143,17 @@
         this.protocol = protocol;
     }
 
-}
+    public Boolean getReadonly() {
+        return readonly;
+    }
+
+    public void setReadonly(Boolean readonly) { this.readonly = readonly; }
+
+    public void setDiskSizeTotal(Long diskSizeTotal) {
+        this.diskSizeTotal = diskSizeTotal;
+    }
+
+    public void setDiskSizeUsed(Long diskSizeUsed) {
+        this.diskSizeUsed = diskSizeUsed;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/LoadBalancerResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/LoadBalancerResponse.java
index 1eb8fca..d9a086c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/LoadBalancerResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/LoadBalancerResponse.java
@@ -64,7 +64,7 @@
     private String networkId;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "the cidr list to forward traffic from")
+    @Param(description = "the cidr list to forward traffic from. Multiple entries are separated by a single comma character (,).")
     private String cidrList;
 
     @SerializedName(ApiConstants.ACCOUNT)
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/MigrationResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/MigrationResponse.java
new file mode 100644
index 0000000..c67b1d2
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/MigrationResponse.java
@@ -0,0 +1,73 @@
+// 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.api.response;
+
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.serializer.Param;
+import com.cloud.storage.ImageStore;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value = ImageStore.class)
+public class MigrationResponse extends BaseResponse {
+    @SerializedName("message")
+    @Param(description = "Response message from migration of secondary storage data objects")
+    private String message;
+
+    @SerializedName("migrationtype")
+    @Param(description = "Type of migration requested for")
+    private String migrationType;
+
+    @SerializedName("success")
+    @Param(description = "true if operation is executed successfully")
+    private boolean success;
+
+    MigrationResponse() {
+    }
+
+    public MigrationResponse(String message, String migrationType, boolean success) {
+        this.message = message;
+        this.migrationType = migrationType;
+        this.success = success;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getMigrationType() {
+        return migrationType;
+    }
+
+    public void setMigrationType(String migrationType) {
+        this.migrationType = migrationType;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkACLItemResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkACLItemResponse.java
index 97f5042..f63cbbf 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkACLItemResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkACLItemResponse.java
@@ -54,7 +54,7 @@
     private String state;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "the cidr list to forward traffic from")
+    @Param(description = "the cidr list to forward traffic from. Multiple entries are separated by a single comma character (,).")
     private String cidrList;
 
     @SerializedName(ApiConstants.ICMP_TYPE)
@@ -73,6 +73,10 @@
     @Param(description = "the ID of the ACL this item belongs to")
     private String aclId;
 
+    @SerializedName(ApiConstants.ACL_NAME)
+    @Param(description = "the name of the ACL this item belongs to")
+    private String aclName;
+
     @SerializedName(ApiConstants.NUMBER)
     @Param(description = "Number of the ACL Item")
     private Integer number;
@@ -133,6 +137,10 @@
         this.aclId = aclId;
     }
 
+    public void setAclName(String aclName) {
+        this.aclName = aclName;
+    }
+
     public void setNumber(Integer number) {
         this.number = number;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
index 84a5aaa..a133714 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
@@ -190,6 +190,10 @@
     @Param(description = "VPC the network belongs to")
     private String vpcId;
 
+    @SerializedName(ApiConstants.VPC_NAME)
+    @Param(description = "Name of the VPC to which this network belongs", since = "4.15")
+    private String vpcName;
+
     @SerializedName(ApiConstants.CAN_USE_FOR_DEPLOY)
     @Param(description = "list networks available for vm deployment")
     private Boolean canUseForDeploy;
@@ -222,6 +226,10 @@
     @Param(description = "ACL Id associated with the VPC network")
     private String aclId;
 
+    @SerializedName(ApiConstants.ACL_NAME)
+    @Param(description = "ACL name associated with the VPC network")
+    private String aclName;
+
     @SerializedName(ApiConstants.STRECHED_L2_SUBNET)
     @Param(description = "true if network can span multiple zones", since = "4.4")
     private Boolean strechedL2Subnet;
@@ -439,6 +447,14 @@
         this.aclId = aclId;
     }
 
+    public String getAclName() {
+        return aclName;
+    }
+
+    public void setAclName(String aclName) {
+        this.aclName = aclName;
+    }
+
     public void setStrechedL2Subnet(Boolean strechedL2Subnet) {
         this.strechedL2Subnet = strechedL2Subnet;
     }
@@ -458,4 +474,12 @@
     public void setRedundantRouter(Boolean redundantRouter) {
         this.redundantRouter = redundantRouter;
     }
+
+    public String getVpcName() {
+        return vpcName;
+    }
+
+    public void setVpcName(String vpcName) {
+        this.vpcName = vpcName;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java
index 1040052..f511682 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/PhysicalNetworkResponse.java
@@ -47,6 +47,10 @@
     @Param(description = "zone id of the physical network")
     private String zoneId;
 
+    @SerializedName(ApiConstants.ZONE_NAME)
+    @Param(description = "zone name of the physical network")
+    private String zoneName;
+
     @SerializedName(ApiConstants.STATE)
     @Param(description = "state of the physical network")
     private String state;
@@ -85,6 +89,10 @@
         this.zoneId = zoneId;
     }
 
+    public void setZoneName(String zoneName) {
+        this.zoneName = zoneName;
+    }
+
     public void setState(String state) {
         this.state = state;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/PrivateGatewayResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/PrivateGatewayResponse.java
index be2faa7..381c7d1 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/PrivateGatewayResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/PrivateGatewayResponse.java
@@ -101,6 +101,10 @@
     @Param(description = "ACL Id set for private gateway")
     private String aclId;
 
+    @SerializedName(ApiConstants.ACL_NAME)
+    @Param(description = "ACL name set for private gateway")
+    private String aclName;
+
     @Override
     public String getObjectId() {
         return this.id;
@@ -183,4 +187,8 @@
         this.aclId = aclId;
     }
 
+    public void setAclName(String aclName) {
+        this.aclName = aclName;
+    }
+
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ProjectAccountResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ProjectAccountResponse.java
index 7afad59..b9f27d0 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/ProjectAccountResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ProjectAccountResponse.java
@@ -18,14 +18,13 @@
 
 import java.util.List;
 
-import com.google.gson.annotations.SerializedName;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
 import com.cloud.projects.ProjectAccount;
 import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value = ProjectAccount.class)
 @SuppressWarnings("unused")
@@ -46,10 +45,22 @@
     @Param(description = "the name of the account")
     private String accountName;
 
+    @SerializedName(ApiConstants.USERNAME)
+    @Param(description = "Name of the user")
+    private String username;
+
     @SerializedName(ApiConstants.ACCOUNT_TYPE)
     @Param(description = "account type (admin, domain-admin, user)")
     private Short accountType;
 
+    @SerializedName(ApiConstants.USER_ID)
+    @Param(description = "Id of the user")
+    private String userId;
+
+    @SerializedName(ApiConstants.PROJECT_ROLE_ID)
+    @Param(description = "Id of the project role associated with the account/user")
+    private String projectRoleId;
+
     @SerializedName(ApiConstants.ROLE)
     @Param(description = "account role in the project (regular,owner)")
     private String role;
@@ -99,6 +110,12 @@
         this.domainName = domainName;
     }
 
+    public void setUserId(String userId) { this.userId = userId; }
+
+    public void setProjectRoleId(String projectRoleId) {
+        this.projectRoleId = projectRoleId;
+    }
+
     public void setUsers(List<UserResponse> users) {
         this.users = users;
     }
@@ -106,4 +123,8 @@
     public void setRole(String role) {
         this.role = role;
     }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ProjectInvitationResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ProjectInvitationResponse.java
index 8768df7..4462ea9 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/ProjectInvitationResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ProjectInvitationResponse.java
@@ -16,14 +16,13 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import com.google.gson.annotations.SerializedName;
-
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
 import com.cloud.projects.ProjectInvitation;
 import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value = ProjectInvitation.class)
 @SuppressWarnings("unused")
@@ -44,6 +43,10 @@
     @Param(description = "the domain id the project belongs to")
     private String domainId;
 
+    @SerializedName(ApiConstants.USER_ID)
+    @Param(description = "the User ID")
+    private String userId;
+
     @SerializedName(ApiConstants.DOMAIN)
     @Param(description = "the domain name where the project belongs to")
     private String domainName;
@@ -89,6 +92,8 @@
         this.accountName = accountName;
     }
 
+    public void setUserId(String userId) { this.userId = userId; }
+
     public void setInvitationState(String invitationState) {
         this.invitationState = invitationState;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ProjectResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ProjectResponse.java
index 8bfa6d9..4e2497e 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/ProjectResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ProjectResponse.java
@@ -18,8 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
-import com.google.gson.annotations.SerializedName;
+import java.util.Map;
 
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
@@ -27,6 +26,7 @@
 
 import com.cloud.projects.Project;
 import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
 
 @EntityReference(value = Project.class)
 public class ProjectResponse extends BaseResponse implements ResourceLimitAndCountResponse {
@@ -55,6 +55,10 @@
     @Param(description = "the account name of the project's owner")
     private String ownerName;
 
+    @SerializedName(ApiConstants.OWNER)
+    @Param(description = "the account name of the project's owners")
+    private List<Map<String, String>> owners;
+
     @SerializedName("projectaccountname")
     @Param(description="the project account name of the project")
     private String projectAccountName;
@@ -422,4 +426,7 @@
         this.secondaryStorageAvailable = secondaryStorageAvailable;
     }
 
+    public void setOwners(List<Map<String, String>> owners) {
+        this.owners = owners;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ProjectRolePermissionResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ProjectRolePermissionResponse.java
new file mode 100644
index 0000000..91b2036
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ProjectRolePermissionResponse.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.api.response;
+
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value = ProjectRolePermission.class)
+public class ProjectRolePermissionResponse extends BaseRolePermissionResponse {
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the project role permission")
+    private String id;
+
+    @SerializedName(ApiConstants.PROJECT_ROLE_ID)
+    @Param(description = "the ID of the project role to which the role permission belongs")
+    private String projectRoleId;
+
+    @SerializedName(ApiConstants.PROJECT_ID)
+    @Param(description = "the ID of the project")
+    private String projectId;
+
+    @SerializedName(ApiConstants.PROJECT_ROLE_NAME)
+    @Param(description = "the name of the project role to which the role permission belongs")
+    private String projectRoleName;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public void setProjectRoleId(String projectRoleId) {
+        this.projectRoleId = projectRoleId;
+    }
+
+    public String getProjectRoleName() {
+        return projectRoleName;
+    }
+
+    public void setProjectRoleName(String projectRoleName) {
+        this.projectRoleName = projectRoleName;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ProjectRoleResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ProjectRoleResponse.java
new file mode 100644
index 0000000..230329f
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ProjectRoleResponse.java
@@ -0,0 +1,40 @@
+// 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.api.response;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value = ProjectRole.class)
+public class ProjectRoleResponse extends BaseRoleResponse {
+    @SerializedName(ApiConstants.PROJECT_ID)
+    @Param(description = "the id of the project")
+    private String projectId;
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/RolePermissionResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/RolePermissionResponse.java
index ac1c529..acedfd4 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/RolePermissionResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/RolePermissionResponse.java
@@ -17,16 +17,15 @@
 
 package org.apache.cloudstack.api.response;
 
-import com.cloud.serializer.Param;
-import com.google.gson.annotations.SerializedName;
 import org.apache.cloudstack.acl.RolePermission;
-import org.apache.cloudstack.acl.Rule;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
 @EntityReference(value = RolePermission.class)
-public class RolePermissionResponse extends BaseResponse {
+public class RolePermissionResponse extends BaseRolePermissionResponse {
     @SerializedName(ApiConstants.ID)
     @Param(description = "the ID of the role permission")
     private String id;
@@ -39,18 +38,6 @@
     @Param(description = "the name of the role to which the role permission belongs")
     private String roleName;
 
-    @SerializedName(ApiConstants.RULE)
-    @Param(description = "the api name or wildcard rule")
-    private String rule;
-
-    @SerializedName(ApiConstants.PERMISSION)
-    @Param(description = "the permission type of the api name or wildcard rule, allow/deny")
-    private String rulePermission;
-
-    @SerializedName(ApiConstants.DESCRIPTION)
-    @Param(description = "the description of the role permission")
-    private String ruleDescription;
-
     public String getId() {
         return id;
     }
@@ -74,28 +61,4 @@
     public void setRoleName(String roleName) {
         this.roleName = roleName;
     }
-
-    public String getRule() {
-        return rule;
-    }
-
-    public void setRule(Rule rule) {
-        if (rule != null) {
-            this.rule = rule.getRuleString();
-        }
-    }
-
-    public String getRulePermission() {
-        return rulePermission;
-    }
-
-    public void setRulePermission(RolePermission.Permission rulePermission) {
-        if (rulePermission != null) {
-            this.rulePermission = rulePermission.name().toLowerCase();
-        }
-    }
-
-    public void setDescription(String description) {
-        this.ruleDescription = description;
-    }
 }
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/RoleResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/RoleResponse.java
index fd4bf28..1861028 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/RoleResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/RoleResponse.java
@@ -17,39 +17,24 @@
 
 package org.apache.cloudstack.api.response;
 
-import com.cloud.serializer.Param;
-import com.google.gson.annotations.SerializedName;
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
-@EntityReference(value = Role.class)
-public class RoleResponse extends BaseResponse {
-    @SerializedName(ApiConstants.ID)
-    @Param(description = "the ID of the role")
-    private String id;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
 
-    @SerializedName(ApiConstants.NAME)
-    @Param(description = "the name of the role")
-    private String roleName;
+@EntityReference(value = Role.class)
+public class RoleResponse extends BaseRoleResponse {
 
     @SerializedName(ApiConstants.TYPE)
     @Param(description = "the type of the role")
     private String roleType;
 
-    @SerializedName(ApiConstants.DESCRIPTION)
-    @Param(description = "the description of the role")
-    private String roleDescription;
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public void setRoleName(String roleName) {
-        this.roleName = roleName;
-    }
+    @SerializedName(ApiConstants.IS_DEFAULT)
+    @Param(description = "true if role is default, false otherwise")
+    private Boolean isDefault;
 
     public void setRoleType(RoleType roleType) {
         if (roleType != null) {
@@ -57,7 +42,7 @@
         }
     }
 
-    public void setDescription(String description) {
-        this.roleDescription = description;
+    public void setIsDefault(Boolean isDefault) {
+        this.isDefault = isDefault;
     }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/ServiceOfferingResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/ServiceOfferingResponse.java
index 9d5e9ee..05fcfbd 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/ServiceOfferingResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/ServiceOfferingResponse.java
@@ -196,6 +196,14 @@
     @Param(description = "the cache mode to use for this disk offering. none, writeback or writethrough", since = "4.14")
     private String cacheMode;
 
+    @SerializedName("vspherestoragepolicy")
+    @Param(description = "the vsphere storage policy tagged to the service offering in case of VMware", since = "4.15")
+    private String vsphereStoragePolicy;
+
+    @SerializedName(ApiConstants.ROOT_DISK_SIZE)
+    @Param(description = "Root disk size in GB", since = "4.15")
+    private Long rootDiskSize;
+
     public ServiceOfferingResponse() {
     }
 
@@ -455,4 +463,16 @@
     public void setCacheMode(String cacheMode) {
         this.cacheMode = cacheMode;
     }
+
+    public String getVsphereStoragePolicy() {
+        return vsphereStoragePolicy;
+    }
+
+    public void setVsphereStoragePolicy(String vsphereStoragePolicy) {
+        this.vsphereStoragePolicy = vsphereStoragePolicy;
+    }
+
+    public void setRootDiskSize(Long rootDiskSize) {
+        this.rootDiskSize = rootDiskSize;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteCustomerGatewayResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteCustomerGatewayResponse.java
index 232c3f2..8128405 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteCustomerGatewayResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteCustomerGatewayResponse.java
@@ -47,7 +47,7 @@
     private String guestIp;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "guest cidr list of the customer gateway")
+    @Param(description = "guest cidr list of the customer gateway. Multiple entries are separated by a single comma character (,).")
     private String guestCidrList;
 
     @SerializedName(ApiConstants.IPSEC_PSK)
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteVpnConnectionResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteVpnConnectionResponse.java
index c5450a6..edaa1b2 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteVpnConnectionResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/Site2SiteVpnConnectionResponse.java
@@ -53,7 +53,7 @@
     private String gatewayIp;
 
     @SerializedName(ApiConstants.CIDR_LIST)
-    @Param(description = "guest cidr list of the customer gateway")
+    @Param(description = "guest cidr list of the customer gateway. Multiple entries are separated by a single comma character (,).")
     //from CustomerGateway
     private String guestCidrList;
 
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/TemplateOVFPropertyResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/TemplateOVFPropertyResponse.java
index 83455a3..ebe0d1c 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/TemplateOVFPropertyResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/TemplateOVFPropertyResponse.java
@@ -16,14 +16,14 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import com.cloud.agent.api.storage.OVFProperty;
 import com.cloud.serializer.Param;
 import com.google.gson.annotations.SerializedName;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
-import org.apache.cloudstack.api.EntityReference;
 
-@EntityReference(value = OVFProperty.class)
+/**
+ * the placeholder of parameters to fill for deployment
+ */
 public class TemplateOVFPropertyResponse extends BaseResponse {
 
     @SerializedName(ApiConstants.KEY)
@@ -58,6 +58,27 @@
     @Param(description = "the ovf property label")
     private String description;
 
+    @SerializedName(ApiConstants.INDEX)
+    @Param(description = "the ovf property index")
+    private Integer index;
+
+    @SerializedName(ApiConstants.CATEGORY)
+    @Param(description = "the ovf property category")
+    private String category;
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof TemplateOVFPropertyResponse)) {
+            return false;
+        }
+        return key != null && key.equals(((TemplateOVFPropertyResponse)other).key);
+    }
+
+    @Override
+    public int hashCode() {
+        return key.hashCode();
+    }
+
     public String getKey() {
         return key;
     }
@@ -121,4 +142,20 @@
     public void setPassword(Boolean password) {
         this.password = password;
     }
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/TemplateResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/TemplateResponse.java
index 9aeba0f..3633fa7 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/TemplateResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/TemplateResponse.java
@@ -17,7 +17,9 @@
 package org.apache.cloudstack.api.response;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -54,7 +56,7 @@
     @Param(description = "the date this template was created")
     private Date created;
 
-    @SerializedName("removed")
+    @SerializedName(ApiConstants.REMOVED)
     @Param(description = "the date this template was removed")
     private Date removed;
 
@@ -79,7 +81,7 @@
     @Param(description = "true if this template is a featured template, false otherwise")
     private boolean featured;
 
-    @SerializedName("crossZones")
+    @SerializedName(ApiConstants.CROSS_ZONES)
     @Param(description = "true if the template is managed across all Zones, false otherwise")
     private boolean crossZones;
 
@@ -121,7 +123,7 @@
     @Param(description = "the physical size of the template")
     private Long physicalSize;
 
-    @SerializedName("templatetype")
+    @SerializedName(ApiConstants.TEMPLATETYPE)
     @Param(description = "the type of the template")
     private String templateType;
 
@@ -145,7 +147,7 @@
     @Param(description = "checksum of the template")
     private String checksum;
 
-    @SerializedName("sourcetemplateid")
+    @SerializedName(ApiConstants.SOURCETEMPLATEID)
     @Param(description = "the template ID of the parent template if present")
     private String sourcetemplateId;
 
@@ -153,7 +155,7 @@
     @Param(description = "the ID of the secondary storage host for the template")
     private String hostId;
 
-    @SerializedName("hostname")
+    @SerializedName(ApiConstants.HOST_NAME)
     @Param(description = "the name of the secondary storage host for the template")
     private String hostName;
 
@@ -171,7 +173,11 @@
 
     @SerializedName(ApiConstants.DETAILS)
     @Param(description = "additional key/value details tied with template")
-    private Map details;
+    private Map<String, String> details;
+
+    @SerializedName(ApiConstants.DOWNLOAD_DETAILS)
+    @Param(description = "Lists the download progress of a template across all secondary storages")
+    private List<Map<String, String>> downloadDetails;
 
     @SerializedName(ApiConstants.BITS)
     @Param(description = "the processor bit size", since = "4.10")
@@ -189,12 +195,24 @@
     @Param(description = "KVM Only: true if template is directly downloaded to Primary Storage bypassing Secondary Storage")
     private Boolean directDownload;
 
+    @SerializedName(ApiConstants.DEPLOY_AS_IS)
+    @Param(description = "VMware only: true if template is deployed without orchestrating disks and networks but \"as-is\" defined in the template.",
+            since = "4.15")
+    private Boolean deployAsIs;
+
+    @SerializedName(ApiConstants.DEPLOY_AS_IS_DETAILS)
+    @Param(description = "VMware only: additional key/value details tied with deploy-as-is template",
+            since = "4.15")
+    private Map<String, String> deployAsIsDetails;
+
     @SerializedName("parenttemplateid")
     @Param(description = "if Datadisk template, then id of the root disk template this template belongs to")
+    @Deprecated(since = "4.15")
     private String parentTemplateId;
 
     @SerializedName("childtemplates")
     @Param(description = "if root disk template, then ids of the datas disk templates this template owns")
+    @Deprecated(since = "4.15")
     private Set<ChildTemplateResponse> childTemplates;
 
     @SerializedName(ApiConstants.REQUIRES_HVM)
@@ -259,6 +277,10 @@
         this.isPublic = isPublic;
     }
 
+    public void setDownloadProgress(List<Map<String, String>> downloadDetails) {
+        this.downloadDetails = downloadDetails;
+    }
+
     public void setCreated(Date created) {
         this.created = created;
     }
@@ -355,14 +377,21 @@
         this.projectName = projectName;
     }
 
-    public Map getDetails() {
+    public Map<String, String> getDetails() {
         return this.details;
     }
 
-    public void setDetails(Map details) {
+    public void setDetails(Map<String, String> details) {
         this.details = details;
     }
 
+    public void addDetail(String key, String value) {
+        if (this.details == null) {
+            setDetails(new HashMap<>());
+        }
+        this.details.put(key,value);
+    }
+
     public void setTags(Set<ResourceTagResponse> tags) {
         this.tags = tags;
     }
@@ -391,6 +420,10 @@
         return directDownload;
     }
 
+    public void setDeployAsIs(Boolean deployAsIs) {
+        this.deployAsIs = deployAsIs;
+    }
+
     public void setParentTemplateId(String parentTemplateId) {
         this.parentTemplateId = parentTemplateId;
     }
@@ -407,6 +440,21 @@
         this.requiresHvm = requiresHvm;
     }
 
+    public Map<String, String> getDeployAsIsDetails() {
+        return this.deployAsIsDetails;
+    }
+
+    public void setDeployAsIsDetails(Map<String, String> details) {
+        this.deployAsIsDetails = details;
+    }
+
+    public void addDeployAsIsDetail(String key, String value) {
+        if (this.deployAsIsDetails == null) {
+            setDeployAsIsDetails(new HashMap<>());
+        }
+        this.deployAsIsDetails.put(key,value);
+    }
+
     public void setUrl(String url) {
         this.url = url;
     }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UnmanageVMInstanceResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UnmanageVMInstanceResponse.java
new file mode 100644
index 0000000..2c96f93
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/UnmanageVMInstanceResponse.java
@@ -0,0 +1,58 @@
+// 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.api.response;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+public class UnmanageVMInstanceResponse extends BaseResponse {
+
+    @SerializedName(ApiConstants.RESULT)
+    @Param(description = "result of the unmanage VM operation")
+    private boolean success;
+
+    @SerializedName(ApiConstants.DETAILS)
+    @Param(description = "details of the unmanage VM operation")
+    private String details;
+
+    public UnmanageVMInstanceResponse() {
+    }
+
+    public UnmanageVMInstanceResponse(boolean success, String details) {
+        this.success = success;
+        this.details = details;
+    }
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getDetails() {
+        return details;
+    }
+
+    public void setDetails(String details) {
+        this.details = details;
+    }
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/UsageRecordResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/UsageRecordResponse.java
index cfc552d..8710790 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/UsageRecordResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/UsageRecordResponse.java
@@ -88,6 +88,10 @@
     @Param(description = "template ID")
     private String templateId;
 
+    @SerializedName(ApiConstants.OS_TYPE_ID)
+    @Param(description = "virtual machine os type id")
+    private Long osTypeId;
+
     @SerializedName("usageid")
     @Param(description = "id of the resource")
     private String usageId;
@@ -140,6 +144,10 @@
     @Param(description = "True if the resource is default")
     private Boolean isDefault;
 
+    @SerializedName("vpcid")
+    @Param(description = "id of the vpc")
+    private String vpcId;
+
     public UsageRecordResponse() {
         tags = new LinkedHashSet<ResourceTagResponse>();
     }
@@ -198,6 +206,10 @@
         this.templateId = templateId;
     }
 
+    public void setOsTypeId(Long osTypeId) {
+        this.osTypeId = osTypeId;
+    }
+
     public void setUsageId(String usageId) {
         this.usageId = usageId;
     }
@@ -268,4 +280,8 @@
     public String getDomainName(){
         return domainName;
     }
+
+    public void setVpcId(String vpcId) {
+        this.vpcId = vpcId;
+    }
 }
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VMSnapshotResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VMSnapshotResponse.java
index f5d7dbd..30709c4 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/VMSnapshotResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/VMSnapshotResponse.java
@@ -21,11 +21,11 @@
 import java.util.LinkedHashSet;
 import java.util.Set;
 
-import com.cloud.hypervisor.Hypervisor;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponseWithTagInformation;
 import org.apache.cloudstack.api.EntityReference;
 
+import com.cloud.hypervisor.Hypervisor;
 import com.cloud.serializer.Param;
 import com.cloud.vm.snapshot.VMSnapshot;
 import com.google.gson.annotations.SerializedName;
@@ -57,9 +57,17 @@
     @Param(description = "the Zone ID of the vm snapshot")
     private String zoneId;
 
+    @SerializedName(ApiConstants.ZONE_NAME)
+    @Param(description = "the Zone name of the vm snapshot", since = "4.15.1")
+    private String zoneName;
+
     @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID)
     @Param(description = "the vm ID of the vm snapshot")
-    private String virtualMachineid;
+    private String virtualMachineId;
+
+    @SerializedName(ApiConstants.VIRTUAL_MACHINE_NAME)
+    @Param(description = "the vm name of the vm snapshot", since = "4.15.1")
+    private String virtualMachineName;
 
     @SerializedName("parent")
     @Param(description = "the parent ID of the vm snapshot")
@@ -154,12 +162,28 @@
         this.zoneId = zoneId;
     }
 
-    public String getVirtualMachineid() {
-        return virtualMachineid;
+    public String getZoneName() {
+        return zoneName;
     }
 
-    public void setVirtualMachineid(String virtualMachineid) {
-        this.virtualMachineid = virtualMachineid;
+    public void setZoneName(String zoneName) {
+        this.zoneName = zoneName;
+    }
+
+    public String getVirtualMachineId() {
+        return virtualMachineId;
+    }
+
+    public void setVirtualMachineId(String virtualMachineId) {
+        this.virtualMachineId = virtualMachineId;
+    }
+
+    public String getVirtualMachineName() {
+        return virtualMachineName;
+    }
+
+    public void setVirtualMachineName(String virtualMachineName) {
+        this.virtualMachineName = virtualMachineName;
     }
 
     public void setName(String name) {
diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VsphereStoragePoliciesResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VsphereStoragePoliciesResponse.java
new file mode 100644
index 0000000..63c49f1
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/api/response/VsphereStoragePoliciesResponse.java
@@ -0,0 +1,89 @@
+// 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.api.response;
+
+import com.cloud.dc.VsphereStoragePolicy;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+
+@EntityReference(value = VsphereStoragePolicy.class)
+public class VsphereStoragePoliciesResponse extends BaseResponse {
+
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the Storage Policy")
+    private String id;
+
+    @SerializedName(ApiConstants.ZONE_ID)
+    @Param(description = "the ID of the Zone")
+    private String zoneId;
+
+    @SerializedName(ApiConstants.POLICY_ID)
+    @Param(description = "the identifier of the Storage Policy in vSphere DataCenter")
+    private String policyId;
+
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "the name of the Storage Policy")
+    private String name;
+
+    @SerializedName(ApiConstants.DESCRIPTION)
+    @Param(description = "the description of the Storage Policy")
+    private String description;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getZoneId() {
+        return zoneId;
+    }
+
+    public void setZoneId(String zoneId) {
+        this.zoneId = zoneId;
+    }
+
+    public String getPolicyId() {
+        return policyId;
+    }
+
+    public void setPolicyId(String policyId) {
+        this.policyId = policyId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+}
diff --git a/api/src/main/java/org/apache/cloudstack/context/CallContext.java b/api/src/main/java/org/apache/cloudstack/context/CallContext.java
index fb83f86..9df02dd 100644
--- a/api/src/main/java/org/apache/cloudstack/context/CallContext.java
+++ b/api/src/main/java/org/apache/cloudstack/context/CallContext.java
@@ -21,13 +21,12 @@
 import java.util.Stack;
 import java.util.UUID;
 
-import com.cloud.projects.Project;
+import org.apache.cloudstack.managed.threadlocal.ManagedThreadLocal;
 import org.apache.log4j.Logger;
 import org.apache.log4j.NDC;
 
-import org.apache.cloudstack.managed.threadlocal.ManagedThreadLocal;
-
 import com.cloud.exception.CloudAuthenticationException;
+import com.cloud.projects.Project;
 import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.utils.UuidUtils;
@@ -61,6 +60,7 @@
     private long userId;
     private final Map<Object, Object> context = new HashMap<Object, Object>();
     private Project project;
+    private String apiName;
 
     static EntityManager s_entityMgr;
 
@@ -335,6 +335,14 @@
         this.project = project;
     }
 
+    public String getApiName() {
+        return apiName;
+    }
+
+    public void setApiName(String apiName) {
+        this.apiName = apiName;
+    }
+
     /**
      * Whether to display the event to the end user.
      * @return true - if the event is to be displayed to the end user, false otherwise.
diff --git a/api/src/main/java/org/apache/cloudstack/context/LogContext.java b/api/src/main/java/org/apache/cloudstack/context/LogContext.java
index 9bc9ed7..20ea82a 100644
--- a/api/src/main/java/org/apache/cloudstack/context/LogContext.java
+++ b/api/src/main/java/org/apache/cloudstack/context/LogContext.java
@@ -21,7 +21,7 @@
 import java.util.UUID;
 
 import org.apache.log4j.Logger;
-import org.slf4j.MDC;
+import org.apache.log4j.MDC;
 
 import org.apache.cloudstack.managed.threadlocal.ManagedThreadLocal;
 
diff --git a/api/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java b/api/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
index 972d626..485911c 100644
--- a/api/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
+++ b/api/src/main/java/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
@@ -67,13 +67,23 @@
         PASSWORD
     }
 
+    /**
+     * <ul>
+     *  <li> <b>on:</b> Power up chassis.
+     *  <li> <b>off:</b> Power down chassis into soft off (S4/S5 state). WARNING: This command does not initiate a clean shutdown of the operating system prior to powering down the system.
+     *  <li> <b>cycle:</b> Provides a power off interval of at least 1 second. No action should occur if chassis power is in S4/S5 state, but it is recommended to check power state first and only issue a power cycle command if the system power is on or in lower sleep state than S4/S5.
+     *  <li> <b>reset:</b> This command will perform a hard reset.
+     *  <li> <b>soft:</b> Initiate a soft-shutdown of OS via ACPI. This can be done in a number of ways, commonly by simulating an overtemperture or by simulating a power button press. It is necessary for there to be Operating System support for ACPI and some sort of daemon watching for events for this soft power to work.
+     *  <li> <b>status:</b> Show current chassis power status.
+     *  </ul>
+     */
     enum PowerOperation {
         ON,
         OFF,
         CYCLE,
         RESET,
         SOFT,
-        STATUS,
+        STATUS
     }
 
     enum PowerState {
diff --git a/api/src/main/java/org/apache/cloudstack/query/QueryService.java b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
index 0a400ed..717af5d 100644
--- a/api/src/main/java/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/main/java/org/apache/cloudstack/query/QueryService.java
@@ -44,7 +44,6 @@
 import org.apache.cloudstack.api.command.user.resource.ListDetailOptionsCmd;
 import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
 import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
-import org.apache.cloudstack.api.command.user.template.ListTemplateOVFProperties;
 import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd;
 import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
@@ -74,7 +73,6 @@
 import org.apache.cloudstack.api.response.ServiceOfferingResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.StorageTagResponse;
-import org.apache.cloudstack.api.response.TemplateOVFPropertyResponse;
 import org.apache.cloudstack.api.response.TemplateResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
@@ -173,7 +171,5 @@
 
     ListResponse<ManagementServerResponse> listManagementServers(ListMgmtsCmd cmd);
 
-    ListResponse<TemplateOVFPropertyResponse> listTemplateOVFProperties(ListTemplateOVFProperties cmd);
-
     List<RouterHealthCheckResultResponse> listRouterHealthChecks(GetRouterHealthCheckResultsCmd cmd);
 }
diff --git a/api/src/main/java/org/apache/cloudstack/storage/ImageStoreService.java b/api/src/main/java/org/apache/cloudstack/storage/ImageStoreService.java
new file mode 100644
index 0000000..b8f14ad
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/storage/ImageStoreService.java
@@ -0,0 +1,29 @@
+// 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;
+
+import org.apache.cloudstack.api.command.admin.storage.MigrateSecondaryStorageDataCmd;
+import org.apache.cloudstack.api.response.MigrationResponse;
+
+public interface ImageStoreService {
+
+    public static enum MigrationPolicy {
+        BALANCE, COMPLETE
+    }
+    MigrationResponse migrateData(MigrateSecondaryStorageDataCmd cmd);
+}
diff --git a/api/src/main/java/org/apache/cloudstack/usage/Usage.java b/api/src/main/java/org/apache/cloudstack/usage/Usage.java
index fe35390..21618e1 100644
--- a/api/src/main/java/org/apache/cloudstack/usage/Usage.java
+++ b/api/src/main/java/org/apache/cloudstack/usage/Usage.java
@@ -63,4 +63,6 @@
     public Date getEndDate();
 
     public Long getVirtualSize();
+
+    public boolean isHidden();
 }
diff --git a/api/src/main/java/org/apache/cloudstack/vm/UnmanageVMService.java b/api/src/main/java/org/apache/cloudstack/vm/UnmanageVMService.java
new file mode 100644
index 0000000..23c006b
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanageVMService.java
@@ -0,0 +1,27 @@
+// 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.vm;
+
+public interface UnmanageVMService {
+
+    /**
+     * Unmanage a guest VM from CloudStack
+     * @return true if the VM is successfully unmanaged, false if not.
+     */
+    boolean unmanageVMInstance(long vmId);
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java
new file mode 100644
index 0000000..c43c1c3
--- /dev/null
+++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java
@@ -0,0 +1,29 @@
+// 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.vm;
+
+import com.cloud.utils.component.PluggableService;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+public interface UnmanagedVMsManager extends VmImportService, UnmanageVMService, PluggableService, Configurable {
+
+    ConfigKey<Boolean> UnmanageVMPreserveNic = new ConfigKey<>("Advanced", Boolean.class, "unmanage.vm.preserve.nics", "false",
+            "If set to true, do not remove VM nics (and its MAC addresses) when unmanaging a VM, leaving them allocated but not reserved. " +
+                    "If set to false, nics are removed and MAC addresses can be reassigned", true, ConfigKey.Scope.Zone);
+}
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/cloudstack/vm/VmImportService.java b/api/src/main/java/org/apache/cloudstack/vm/VmImportService.java
index 783a5d2..cce2847 100644
--- a/api/src/main/java/org/apache/cloudstack/vm/VmImportService.java
+++ b/api/src/main/java/org/apache/cloudstack/vm/VmImportService.java
@@ -23,9 +23,7 @@
 import org.apache.cloudstack.api.response.UnmanagedInstanceResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 
-import com.cloud.utils.component.PluggableService;
-
-public interface VmImportService extends PluggableService {
+public interface VmImportService {
     ListResponse<UnmanagedInstanceResponse> listUnmanagedInstances(ListUnmanagedInstancesCmd cmd);
     UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd);
 }
diff --git a/api/src/test/java/com/cloud/agent/api/storage/OVFHelperTest.java b/api/src/test/java/com/cloud/agent/api/storage/OVFHelperTest.java
index 8aa9852..5e7b7cf 100644
--- a/api/src/test/java/com/cloud/agent/api/storage/OVFHelperTest.java
+++ b/api/src/test/java/com/cloud/agent/api/storage/OVFHelperTest.java
@@ -16,6 +16,12 @@
 // under the License.
 package com.cloud.agent.api.storage;
 
+import com.cloud.agent.api.to.deployasis.OVFConfigurationTO;
+import com.cloud.agent.api.to.deployasis.OVFEulaSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareItemTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareSectionTO;
+import com.cloud.utils.Pair;
 import org.junit.Assert;
 import org.junit.Test;
 import org.xml.sax.SAXException;
@@ -40,16 +46,708 @@
             "</Property>" +
         "</ProductSection>";
 
+    private String ovfFileDeploymentOptionsSection =
+            "<DeploymentOptionSection>\n" +
+                    "    <Info>Deployment Configuration information</Info>\n" +
+                    "    <Configuration ovf:id=\"ASAv5\">\n" +
+                    "      <Label>100 Mbps (ASAv5)</Label>\n" +
+                    "      <Description>Use this option to deploy an ASAv with a maximum throughput of 100 Mbps (uses 1 vCPU and 2 GB of memory).</Description>\n" +
+                    "    </Configuration>\n" +
+                    "    <Configuration ovf:id=\"ASAv10\">\n" +
+                    "      <Label>1 Gbps (ASAv10)</Label>\n" +
+                    "      <Description>Use this option to deploy an ASAv with a maximum throughput of 1 Gbps (uses 1 vCPU and 2 GB of memory).</Description>\n" +
+                    "    </Configuration>\n" +
+                    "    <Configuration ovf:id=\"ASAv30\">\n" +
+                    "      <Label>2 Gbps (ASAv30)</Label>\n" +
+                    "      <Description>Use this option to deploy an ASAv with a maximum throughput of 2 Gbps (uses 4 vCPUs and 8 GB of memory).</Description>\n" +
+                    "    </Configuration>\n" +
+                    "  </DeploymentOptionSection>";
+
+    private String ovfFileVirtualHardwareSection =
+            "<VirtualSystem>\n" +
+            "<OperatingSystemSection ovf:id=\"100\" vmw:osType=\"other26xLinux64Guest\">\n" +
+            "      <Info>The kind of installed guest operating system</Info>\n" +
+            "      <Description>Other 2.6x Linux (64-bit)</Description>\n" +
+            "</OperatingSystemSection>\n" +
+            "<VirtualHardwareSection ovf:transport=\"iso\">\n" +
+            "      <Info>Virtual hardware requirements</Info>\n" +
+            "      <System>\n" +
+            "        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>\n" +
+            "        <vssd:InstanceID>0</vssd:InstanceID>\n" +
+            "        <vssd:VirtualSystemIdentifier>ASAv</vssd:VirtualSystemIdentifier>\n" +
+            "        <vssd:VirtualSystemType>vmx-08,vmx-09</vssd:VirtualSystemType>\n" +
+            "      </System>\n" +
+            "      <Item ovf:configuration=\"ASAv5 ASAv10\">\n" +
+            "        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>\n" +
+            "        <rasd:Description>Number of Virtual CPUs</rasd:Description>\n" +
+            "        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>1</rasd:InstanceID>\n" +
+            "        <rasd:Limit>5000</rasd:Limit>\n" +
+            "        <rasd:Reservation>1000</rasd:Reservation>\n" +
+            "        <rasd:ResourceType>3</rasd:ResourceType>\n" +
+            "        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>\n" +
+            "      </Item>\n" +
+            "      <Item ovf:configuration=\"ASAv30\">\n" +
+            "        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>\n" +
+            "        <rasd:Description>Number of Virtual CPUs</rasd:Description>\n" +
+            "        <rasd:ElementName>4 virtual CPU(s)</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>1</rasd:InstanceID>\n" +
+            "        <rasd:Limit>20000</rasd:Limit>\n" +
+            "        <rasd:Reservation>1000</rasd:Reservation>\n" +
+            "        <rasd:ResourceType>3</rasd:ResourceType>\n" +
+            "        <rasd:VirtualQuantity>4</rasd:VirtualQuantity>\n" +
+            "      </Item>\n" +
+            "      <Item ovf:configuration=\"ASAv5 ASAv10\">\n" +
+            "        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>\n" +
+            "        <rasd:Description>Memory Size</rasd:Description>\n" +
+            "        <rasd:ElementName>2048MB of memory</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>2</rasd:InstanceID>\n" +
+            "        <rasd:Limit>2048</rasd:Limit>\n" +
+            "        <rasd:Reservation>2048</rasd:Reservation>\n" +
+            "        <rasd:ResourceType>4</rasd:ResourceType>\n" +
+            "        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>\n" +
+            "      </Item>\n" +
+            "      <Item ovf:configuration=\"ASAv30\">\n" +
+            "        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>\n" +
+            "        <rasd:Description>Memory Size</rasd:Description>\n" +
+            "        <rasd:ElementName>8192MB of memory</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>2</rasd:InstanceID>\n" +
+            "        <rasd:Limit>8192</rasd:Limit>\n" +
+            "        <rasd:Reservation>8192</rasd:Reservation>\n" +
+            "        <rasd:ResourceType>4</rasd:ResourceType>\n" +
+            "        <rasd:VirtualQuantity>8192</rasd:VirtualQuantity>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:Address>0</rasd:Address>\n" +
+            "        <rasd:Description>SCSI Controller</rasd:Description>\n" +
+            "        <rasd:ElementName>SCSI controller 0</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>3</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>6</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:Address>0</rasd:Address>\n" +
+            "        <rasd:Description>IDE Controller</rasd:Description>\n" +
+            "        <rasd:ElementName>IDE 0</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>4</rasd:InstanceID>\n" +
+            "        <rasd:ResourceType>5</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item ovf:required=\"false\">\n" +
+            "        <rasd:AddressOnParent>0</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:ElementName>CD/DVD Drive</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>5</rasd:InstanceID>\n" +
+            "        <rasd:Parent>4</rasd:Parent>\n" +
+            "        <rasd:ResourceType>15</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item ovf:required=\"false\">\n" +
+            "        <rasd:AddressOnParent>1</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:ElementName>CD/DVD Drive</rasd:ElementName>\n" +
+            "        <rasd:HostResource>ovf:/file/file3</rasd:HostResource>\n" +
+            "        <rasd:InstanceID>18</rasd:InstanceID>\n" +
+            "        <rasd:Parent>4</rasd:Parent>\n" +
+            "        <rasd:ResourceType>15</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>7</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>Management0-0</rasd:Connection>\n" +
+            "        <rasd:Description>E1000 Ethernet adapter on \"Management Network\"</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 1</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>6</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>0</rasd:AddressOnParent>\n" +
+            "        <rasd:ElementName>Hard disk 1</rasd:ElementName>\n" +
+            "        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>\n" +
+            "        <rasd:InstanceID>7</rasd:InstanceID>\n" +
+            "        <rasd:Parent>3</rasd:Parent>\n" +
+            "        <rasd:ResourceType>17</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>1</rasd:AddressOnParent>\n" +
+            "        <rasd:ElementName>Hard disk 2</rasd:ElementName>\n" +
+            "        <rasd:HostResource>ovf:/disk/vmdisk2</rasd:HostResource>\n" +
+            "        <rasd:InstanceID>8</rasd:InstanceID>\n" +
+            "        <rasd:Parent>3</rasd:Parent>\n" +
+            "        <rasd:ResourceType>17</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>8</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-0</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 2</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>9</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>9</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-1</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 3</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>10</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>10</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-2</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 4</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>11</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>11</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-3</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 5</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>12</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>12</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-4</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 6</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>13</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>13</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-5</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 7</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>14</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>14</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-6</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 8</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>15</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>15</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-7</rasd:Connection>\n" +
+            "        <rasd:Description>General purpose E1000 Ethernet adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 9</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>16</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <Item>\n" +
+            "        <rasd:AddressOnParent>16</rasd:AddressOnParent>\n" +
+            "        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>\n" +
+            "        <rasd:Connection>GigabitEthernet0-8</rasd:Connection>\n" +
+            "        <rasd:Description>Default HA failover E1000 Ethernet adapter, or additional standalone general purpose adapter</rasd:Description>\n" +
+            "        <rasd:ElementName>Network adapter 10</rasd:ElementName>\n" +
+            "        <rasd:InstanceID>17</rasd:InstanceID>\n" +
+            "        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>\n" +
+            "        <rasd:ResourceType>10</rasd:ResourceType>\n" +
+            "      </Item>\n" +
+            "      <vmw:ExtraConfig vmw:key=\"monitor_control.pseudo_perfctr\" vmw:value=\"TRUE\"></vmw:ExtraConfig>\n" +
+            "    </VirtualHardwareSection>\n" +
+            "</VirtualSystem>";
+
+    private String eulaSections =
+            "<VirtualSystem>\n" +
+            "<EulaSection>\n" +
+            "      <Info>end-user license agreement</Info>\n" +
+            "      <License>END USER LICENSE AGREEMENT\n" +
+            "\n" +
+            "IMPORTANT: PLEASE READ THIS END USER LICENSE AGREEMENT CAREFULLY. IT IS VERY IMPORTANT THAT YOU CHECK THAT YOU ARE PURCHASING CISCO SOFTWARE OR EQUIPMENT FROM AN APPROVED SOURCE AND THAT YOU, OR THE ENTITY YOU REPRESENT (COLLECTIVELY, THE \"CUSTOMER\") HAVE BEEN REGISTERED AS THE END USER FOR THE PURPOSES OF THIS CISCO END USER LICENSE AGREEMENT. IF YOU ARE NOT REGISTERED AS THE END USER YOU HAVE NO LICENSE TO USE THE SOFTWARE AND THE LIMITED WARRANTY IN THIS END USER LICENSE AGREEMENT DOES NOT APPLY. ASSUMING YOU HAVE PURCHASED FROM AN APPROVED SOURCE, DOWNLOADING, INSTALLING OR USING CISCO OR CISCO-SUPPLIED SOFTWARE CONSTITUTES ACCEPTANCE OF THIS AGREEMENT.\n" +
+            "\n" +
+            "CISCO SYSTEMS, INC. OR ITS AFFILIATE LICENSING THE SOFTWARE (\"CISCO\") IS WILLING TO LICENSE THIS SOFTWARE TO YOU ONLY UPON THE CONDITION THAT YOU PURCHASED THE SOFTWARE FROM AN APPROVED SOURCE AND THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS END USER LICENSE AGREEMENT PLUS ANY ADDITIONAL LIMITATIONS ON THE LICENSE SET FORTH IN A SUPPLEMENTAL LICENSE AGREEMENT ACCOMPANYING THE PRODUCT, MADE AVAILABLE AT THE TIME OF YOUR ORDER, OR POSTED ON THE CISCO WEBSITE AT www.cisco.com/go/terms (COLLECTIVELY THE \"AGREEMENT\"). TO THE EXTENT OF ANY CONFLICT BETWEEN THE TERMS OF THIS END USER LICENSE AGREEMENT AND ANY SUPPLEMENTAL LICENSE AGREEMENT, THE SUPPLEMENTAL LICENSE AGREEMENT SHALL APPLY. BY DOWNLOADING, INSTALLING, OR USING THE SOFTWARE, YOU ARE REPRESENTING THAT YOU PURCHASED THE SOFTWARE FROM AN APPROVED SOURCE AND BINDING YOURSELF TO THE AGREEMENT. IF YOU DO " +
+                    "NOT AGREE TO ALL OF THE TERMS OF THE AGREEMENT, THEN CISCO IS UNWILLING TO LICENSE THE SOFTWARE TO YOU AND (A) YOU MAY NOT DOWNLOAD, INSTALL OR USE THE SOFTWARE, AND (B) YOU MAY RETURN THE SOFTWARE (INCLUDING ANY UNOPENED CD PACKAGE AND ANY WRITTEN MATERIALS) FOR A FULL REFUND, OR, IF THE SOFTWARE AND WRITTEN MATERIALS ARE SUPPLIED AS PART OF ANOTHER PRODUCT, YOU MAY RETURN THE ENTIRE PRODUCT FOR A FULL REFUND. YOUR RIGHT TO RETURN AND REFUND EXPIRES 30 DAYS AFTER PURCHASE FROM AN APPROVED SOURCE, AND APPLIES ONLY IF YOU ARE THE ORIGINAL AND REGISTERED END USER PURCHASER. FOR THE PURPOSES OF THIS END USER LICENSE AGREEMENT, AN \"APPROVED SOURCE\" MEANS (A) CISCO; OR (B) A DISTRIBUTOR OR SYSTEMS INTEGRATOR AUTHORIZED BY CISCO TO DISTRIBUTE / SELL CISCO EQUIPMENT, SOFTWARE AND SERVICES WITHIN YOUR TERRITORY TO END " +
+                    "USERS; OR (C) A RESELLER AUTHORIZED BY ANY SUCH DISTRIBUTOR OR SYSTEMS INTEGRATOR IN ACCORDANCE WITH THE TERMS OF THE DISTRIBUTOR'S AGREEMENT WITH CISCO TO DISTRIBUTE / SELL THE CISCO EQUIPMENT, SOFTWARE AND SERVICES WITHIN YOUR TERRITORY TO END USERS.\n" +
+            "\n" +
+            "THE FOLLOWING TERMS OF THE AGREEMENT GOVERN CUSTOMER'S USE OF THE SOFTWARE (DEFINED BELOW), EXCEPT TO THE EXTENT: (A) THERE IS A SEPARATE SIGNED CONTRACT BETWEEN CUSTOMER AND CISCO GOVERNING CUSTOMER'S USE OF THE SOFTWARE, OR (B) THE SOFTWARE INCLUDES A SEPARATE \"CLICK-ACCEPT\" LICENSE AGREEMENT OR THIRD PARTY LICENSE AGREEMENT AS PART OF THE INSTALLATION OR DOWNLOAD PROCESS GOVERNING CUSTOMER'S USE OF THE SOFTWARE. TO THE EXTENT OF A CONFLICT BETWEEN THE PROVISIONS OF THE FOREGOING DOCUMENTS, THE ORDER OF PRECEDENCE SHALL BE (1)THE SIGNED CONTRACT, (2) THE CLICK-ACCEPT AGREEMENT OR THIRD PARTY LICENSE AGREEMENT, AND (3) THE AGREEMENT. FOR PURPOSES OF THE AGREEMENT, \"SOFTWARE\" SHALL MEAN COMPUTER PROGRAMS, INCLUDING FIRMWARE AND COMPUTER PROGRAMS EMBEDDED IN CISCO EQUIPMENT, AS PROVIDED TO CUSTOMER BY AN APPROVED SOURCE, AND ANY UPGRADES, UPDATES, BUG FIXES " +
+                    "OR MODIFIED VERSIONS THERETO (COLLECTIVELY, \"UPGRADES\"), ANY OF THE SAME WHICH HAS BEEN RELICENSED UNDER THE CISCO SOFTWARE TRANSFER AND RE-LICENSING POLICY (AS MAY BE AMENDED BY CISCO FROM TIME TO TIME) OR BACKUP COPIES OF ANY OF THE FOREGOING.\n" +
+            "\n" +
+            "License. Conditioned upon compliance with the terms and conditions of the Agreement, Cisco grants to Customer a nonexclusive and nontransferable license to use for Customer's internal business purposes the Software and the Documentation for which Customer has paid the required license fees to an Approved Source. \"Documentation\" means written information (whether contained in user or technical manuals, training materials, specifications or otherwise) pertaining to the Software and made available by an Approved Source with the Software in any manner (including on CD-Rom, or on-line). In order to use the Software, Customer may be required to input a registration number or product authorization key and register Customer's copy of the Software online at Cisco's website to obtain the necessary license key or license file.\n" +
+            "\n" +
+            "Customer's license to use the Software shall be limited to, and Customer shall not use the Software in excess of, a single hardware chassis or card or such other limitations as are set forth in the applicable Supplemental License Agreement or in the applicable purchase order which has been accepted by an Approved Source and for which Customer has paid to an Approved Source the required license fee (the \"Purchase Order\").\n" +
+            "\n" +
+            "Unless otherwise expressly provided in the Documentation or any applicable Supplemental License Agreement, Customer shall use the Software solely as embedded in, for execution on, or (where the applicable Documentation permits installation on non-Cisco equipment) for communication with Cisco equipment owned or leased by Customer and used for Customer's internal business purposes. No other licenses are granted by implication, estoppel or otherwise.\n" +
+            "\n" +
+            "For evaluation or beta copies for which Cisco does not charge a license fee, the above requirement to pay license fees does not apply.\n" +
+            "\n" +
+            "General Limitations. This is a license, not a transfer of title, to the Software and Documentation, and Cisco retains ownership of all copies of the Software and Documentation. Customer acknowledges that the Software and Documentation contain trade secrets of Cisco or its suppliers or licensors, including but not limited to the specific internal design and structure of individual programs and associated interface information. Except as otherwise expressly provided under the Agreement, Customer shall only use the Software in connection with the use of Cisco equipment purchased by the Customer from an Approved Source and Customer shall have no right, and Customer specifically agrees not to:\n" +
+            "\n" +
+            "(i) transfer, assign or sublicense its license rights to any other person or entity (other than in compliance with any Cisco relicensing/transfer policy then in force), or use the Software on Cisco equipment not purchased by the Customer from an Approved Source or on secondhand Cisco equipment, and Customer acknowledges that any attempted transfer, assignment, sublicense or use shall be void;\n" +
+            "\n" +
+            "(ii) make error corrections to or otherwise modify or adapt the Software or create derivative works based upon the Software, or permit third parties to do the same;\n" +
+            "\n" +
+            "(iii) reverse engineer or decompile, decrypt, disassemble or otherwise reduce the Software to human-readable form, except to the extent otherwise expressly permitted under applicable law notwithstanding this restriction or except to the extent that Cisco is legally required to permit such specific activity pursuant to any applicable open source license;\n" +
+            "\n" +
+            "(iv) publish any results of benchmark tests run on the Software;\n" +
+            "\n" +
+            "(v) use or permit the Software to be used to perform services for third parties, whether on a service bureau or time sharing basis or otherwise, without the express written authorization of Cisco; or\n" +
+            "\n" +
+            "(vi) disclose, provide, or otherwise make available trade secrets contained within the Software and Documentation in any form to any third party without the prior written consent of Cisco. Customer shall implement reasonable security measures to protect such trade secrets.\n" +
+            "\n" +
+            "To the extent required by applicable law, and at Customer's written request, Cisco shall provide Customer with the interface information needed to achieve interoperability between the Software and another independently created program, on payment of Cisco's applicable fee, if any. Customer shall observe strict obligations of confidentiality with respect to such information and shall use such information in compliance with any applicable terms and conditions upon which Cisco makes such information available.\n" +
+            "\n" +
+            "Software, Upgrades and Additional Copies. NOTWITHSTANDING ANY OTHER PROVISION OF THE AGREEMENT: (1) CUSTOMER HAS NO LICENSE OR RIGHT TO MAKE OR USE ANY ADDITIONAL COPIES OR UPGRADES UNLESS CUSTOMER, AT THE TIME OF MAKING OR ACQUIRING SUCH COPY OR UPGRADE, ALREADY HOLDS A VALID LICENSE TO THE ORIGINAL SOFTWARE AND HAS PAID THE APPLICABLE FEE TO AN APPROVED SOURCE FOR THE UPGRADE OR ADDITIONAL COPIES; (2) USE OF UPGRADES IS LIMITED TO CISCO EQUIPMENT SUPPLIED BY AN APPROVED SOURCE FOR WHICH CUSTOMER IS THE ORIGINAL END USER PURCHASER OR LESSEE OR OTHERWISE HOLDS A VALID LICENSE TO USE THE SOFTWARE WHICH IS BEING UPGRADED; AND (3) THE MAKING AND USE OF ADDITIONAL COPIES IS LIMITED TO NECESSARY BACKUP PURPOSES ONLY.\n" +
+            "\n" +
+            "Proprietary Notices. Customer agrees to maintain and reproduce all copyright, proprietary, and other notices on all copies, in any form, of the Software in the same form and manner that such copyright and other proprietary notices are included on the Software. Except as expressly authorized in the Agreement, Customer shall not make any copies or duplicates of any Software without the prior written permission of Cisco.\n" +
+            "\n" +
+            "Term and Termination. The Agreement and the license granted herein shall remain effective until terminated. Customer may terminate the Agreement and the license at any time by destroying all copies of Software and any Documentation. Customer's rights under the Agreement will terminate immediately without notice from Cisco if Customer fails to comply with any provision of the Agreement. Upon termination, Customer shall destroy all copies of Software and Documentation in its possession or control. All confidentiality obligations of Customer, all restrictions and limitations imposed on the Customer under the section titled \"General Limitations\" and all limitations of liability and disclaimers and restrictions of warranty shall survive termination of this Agreement. In addition, the provisions of the sections titled \"U.S. Government End User Purchasers\" and \"General Terms Applicable to the Limited Warranty Statement " +
+                    "and End User License Agreement\" shall survive termination of the Agreement.\n" +
+            "\n" +
+            "Customer Records. Customer grants to Cisco and its independent accountants the right to examine Customer's books, records and accounts during Customer's normal business hours to verify compliance with this Agreement. In the event such audit discloses non-compliance with this Agreement, Customer shall promptly pay to Cisco the appropriate license fees, plus the reasonable cost of conducting the audit.\n" +
+            "\n" +
+            "Export, Re-Export, Transfer and Use Controls. The Software, Documentation and technology or direct products thereof (hereafter referred to as Software and Technology), supplied by Cisco under the Agreement are subject to export controls under the laws and regulations of the United States (\"U.S.\") and any other applicable countries' laws and regulations. Customer shall comply with such laws and regulations governing export, re-export, import, transfer and use of Cisco Software and Technology and will obtain all required U.S. and local authorizations, permits, or licenses. Cisco and Customer each agree to provide the other information, support documents, and assistance as may reasonably be required by the other in connection with securing authorizations or licenses. Information regarding compliance with export, re-export, transfer and use may be located at the following URL: " +
+                    "www.cisco.com/web/about/doing_business/legal/global_export_trade/general_export/contract_compliance.html\n" +
+            "\n" +
+            "U.S. Government End User Purchasers. The Software and Documentation qualify as \"commercial items,\" as that term is defined at Federal Acquisition Regulation (\"FAR\") (48 C.F.R.) 2.101, consisting of \"commercial computer software\" and \"commercial computer software documentation\" as such terms are used in FAR 12.212. Consistent with FAR 12.212 and DoD FAR Supp. 227.7202-1 through 227.7202-4, and notwithstanding any other FAR or other contractual clause to the contrary in any agreement into which the Agreement may be incorporated, Customer may provide to Government end user or, if the Agreement is direct, Government end user will acquire, the Software and Documentation with only those rights set forth in the Agreement. Use of either the Software or Documentation or both constitutes agreement by the Government that the Software and Documentation are \"commercial computer software\" and \"commercial computer " +
+                    "software documentation,\" and constitutes acceptance of the rights and restrictions herein.\n" +
+            "\n" +
+            "Identified Components; Additional Terms. The Software may contain or be delivered with one or more components, which may include third-party components, identified by Cisco in the Documentation, readme.txt file, third-party click-accept or elsewhere (e.g. on www.cisco.com) (the \"Identified Component(s)\") as being subject to different license agreement terms, disclaimers of warranties, limited warranties or other terms and conditions (collectively, \"Additional Terms\") than those set forth herein. You agree to the applicable Additional Terms for any such Identified Component(s).\n" +
+            "\n" +
+            "Limited Warranty\n" +
+            "\n" +
+            "Subject to the limitations and conditions set forth herein, Cisco warrants that commencing from the date of shipment to Customer (but in case of resale by an Approved Source other than Cisco, commencing not more than ninety (90) days after original shipment by Cisco), and continuing for a period of the longer of (a) ninety (90) days or (b) the warranty period (if any) expressly set forth as applicable specifically to software in the warranty card accompanying the product of which the Software is a part (the \"Product\") (if any): (a) the media on which the Software is furnished will be free of defects in materials and workmanship under normal use; and (b) the Software substantially conforms to the Documentation. The date of shipment of a Product by Cisco is set forth on the packaging material in which the Product is shipped. Except for the foregoing, the Software is provided \"AS IS\". This limited warranty extends only to the " +
+                    "Software purchased from an Approved Source by a Customer who is the first registered end user. Customer's sole and exclusive remedy and the entire liability of Cisco and its suppliers under this limited warranty will be (i) replacement of defective media and/or (ii) at Cisco's option, repair, replacement, or refund of the purchase price of the Software, in both cases subject to the condition that any error or defect constituting a breach of this limited warranty is reported to the Approved Source supplying the Software to Customer, within the warranty period. Cisco or the Approved Source supplying the Software to Customer may, at its option, require return of the Software and/or Documentation as a condition to the remedy. In no event does Cisco warrant that the Software is error free or that Customer will be able to operate the Software without problems or interruptions. In addition, due to the continual development of new " +
+                    "techniques for intruding upon and attacking networks, Cisco does not warrant that the Software or any equipment, system or network on which the Software is used will be free of vulnerability to intrusion or attack.\n" +
+            "\n" +
+            "Restrictions. This warranty does not apply if the Software, Product or any other equipment upon which the Software is authorized to be used (a) has been altered, except by Cisco or its authorized representative, (b) has not been installed, operated, repaired, or maintained in accordance with instructions supplied by Cisco, (c) has been subjected to abnormal physical or electrical stress, abnormal environmental conditions, misuse, negligence, or accident; or (d) is licensed for beta, evaluation, testing or demonstration purposes. The Software warranty also does not apply to (e) any temporary Software modules; (f) any Software not posted on Cisco's Software Center; (g) any Software that Cisco expressly provides on an \"AS IS\" basis on Cisco's Software Center; (h) any Software for which an Approved Source does not receive a license fee; and (i) Software supplied by any third party which is not an Approved Source.\n" +
+            "\n" +
+            "DISCLAIMER OF WARRANTY\n" +
+            "\n" +
+            "EXCEPT AS SPECIFIED IN THIS WARRANTY SECTION, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS, AND WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OR CONDITION OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, SATISFACTORY QUALITY, NON-INTERFERENCE, ACCURACY OF INFORMATIONAL CONTENT, OR ARISING FROM A COURSE OF DEALING, LAW, USAGE, OR TRADE PRACTICE, ARE HEREBY EXCLUDED TO THE EXTENT ALLOWED BY APPLICABLE LAW AND ARE EXPRESSLY DISCLAIMED BY CISCO, ITS SUPPLIERS AND LICENSORS. TO THE EXTENT THAT ANY OF THE SAME CANNOT BE EXCLUDED, SUCH IMPLIED CONDITION, REPRESENTATION AND/OR WARRANTY IS LIMITED IN DURATION TO THE EXPRESS WARRANTY PERIOD REFERRED TO IN THE \"LIMITED WARRANTY\" SECTION ABOVE. BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATIONS ON HOW LONG AN IMPLIED WARRANTY LASTS, THE ABOVE LIMITATION MAY NOT APPLY IN SUCH STATES. THIS WARRANTY GIVES CUSTOMER SPECIFIC LEGAL RIGHTS, " +
+                    "AND CUSTOMER MAY ALSO HAVE OTHER RIGHTS WHICH VARY FROM JURISDICTION TO JURISDICTION. This disclaimer and exclusion shall apply even if the express warranty set forth above fails of its essential purpose.\n" +
+            "\n" +
+            "Disclaimer of Liabilities-Limitation of Liability. IF YOU ACQUIRED THE SOFTWARE IN THE UNITED STATES, LATIN AMERICA, CANADA, JAPAN OR THE CARIBBEAN, NOTWITHSTANDING ANYTHING ELSE IN THE AGREEMENT TO THE CONTRARY, ALL LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS COLLECTIVELY, TO CUSTOMER, WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF WARRANTY OR OTHERWISE, SHALL NOT EXCEED THE PRICE PAID BY CUSTOMER TO ANY APPROVED SOURCE FOR THE SOFTWARE THAT GAVE RISE TO THE CLAIM OR IF THE SOFTWARE IS PART OF ANOTHER PRODUCT, THE PRICE PAID FOR SUCH OTHER PRODUCT. THIS LIMITATION OF LIABILITY FOR SOFTWARE IS CUMULATIVE AND NOT PER INCIDENT (I.E. THE EXISTENCE OF TWO OR MORE CLAIMS WILL NOT ENLARGE THIS LIMIT).\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN EUROPE, THE MIDDLE EAST, AFRICA, ASIA OR OCEANIA, NOTWITHSTANDING ANYTHING ELSE IN THE AGREEMENT TO THE CONTRARY, ALL LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS COLLECTIVELY, TO CUSTOMER, WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF WARRANTY OR OTHERWISE, SHALL NOT EXCEED THE PRICE PAID BY CUSTOMER TO CISCO FOR THE SOFTWARE THAT GAVE RISE TO THE CLAIM OR IF THE SOFTWARE IS PART OF ANOTHER PRODUCT, THE PRICE PAID FOR SUCH OTHER PRODUCT. THIS LIMITATION OF LIABILITY FOR SOFTWARE IS CUMULATIVE AND NOT PER INCIDENT (I.E. THE EXISTENCE OF TWO OR MORE CLAIMS WILL NOT ENLARGE THIS LIMIT). NOTHING IN THE AGREEMENT SHALL LIMIT (I) THE LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS TO CUSTOMER FOR PERSONAL INJURY OR DEATH CAUSED BY THEIR NEGLIGENCE, (II) CISCO'S LIABILITY FOR FRAUDULENT" +
+            " MISREPRESENTATION, OR (III) ANY LIABILITY OF CISCO WHICH CANNOT BE EXCLUDED UNDER APPLICABLE LAW.\n" +
+            "\n" +
+            "Disclaimer of Liabilities-Waiver of Consequential Damages and Other Losses. IF YOU ACQUIRED THE SOFTWARE IN THE UNITED STATES, LATIN AMERICA, THE CARIBBEAN OR CANADA, REGARDLESS OF WHETHER ANY REMEDY SET FORTH HEREIN FAILS OF ITS ESSENTIAL PURPOSE OR OTHERWISE, IN NO EVENT WILL CISCO OR ITS SUPPLIERS BE LIABLE FOR ANY LOST REVENUE, PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE OR OTHERWISE AND EVEN IF CISCO OR ITS SUPPLIERS OR LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN JAPAN, EXCEPT FOR LIABILITY ARISING OUT OF OR IN CONNECTION WITH DEATH OR PERSONAL INJURY, FRAUDULENT MISREPRESENTATION, AND REGARDLESS OF WHETHER ANY REMEDY SET FORTH HEREIN FAILS OF ITS ESSENTIAL PURPOSE OR OTHERWISE, IN NO EVENT WILL CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE OR OTHERWISE AND EVEN IF CISCO OR ANY APPROVED SOURCE OR THEIR SUPPLIERS OR LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN EUROPE, THE MIDDLE EAST, AFRICA, ASIA OR OCEANIA, IN NO EVENT WILL CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS, BE LIABLE FOR ANY LOST REVENUE, LOST PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES, HOWSOEVER ARISING, INCLUDING, WITHOUT LIMITATION, IN CONTRACT, TORT (INCLUDING NEGLIGENCE) OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF, IN EACH CASE, CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS, HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT FULLY APPLY TO YOU. THE FOREGOING EXCLUSION SHALL NOT APPLY TO ANY LIABILITY ARISING OUT OF OR IN " +
+            "CONNECTION WITH: (I) DEATH OR PERSONAL INJURY, (II) FRAUDULENT MISREPRESENTATION, OR (III) CISCO'S LIABILITY IN CONNECTION WITH ANY TERMS THAT CANNOT BE EXCLUDED UNDER APPLICABLE LAW.\n" +
+            "\n" +
+            "Customer acknowledges and agrees that Cisco has set its prices and entered into the Agreement in reliance upon the disclaimers of warranty and the limitations of liability set forth herein, that the same reflect an allocation of risk between the parties (including the risk that a contract remedy may fail of its essential purpose and cause consequential loss), and that the same form an essential basis of the bargain between the parties.\n" +
+            "\n" +
+            "Controlling Law, Jurisdiction. If you acquired, by reference to the address on the purchase order accepted by the Approved Source, the Software in the United States, Latin America, or the Caribbean, the Agreement and warranties (\"Warranties\") are controlled by and construed under the laws of the State of California, United States of America, notwithstanding any conflicts of law provisions; and the state and federal courts of California shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in Canada, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the Province of Ontario, Canada, notwithstanding any conflicts of law provisions; and the courts of the Province of Ontario shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in " +
+            "Europe, the Middle East, Africa, Asia or Oceania (excluding Australia), unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of England, notwithstanding any conflicts of law provisions; and the English courts shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. In addition, if the Agreement is controlled by the laws of England, no person who is not a party to the Agreement shall be entitled to enforce or take the benefit of any of its terms under the Contracts (Rights of Third Parties) Act 1999. If you acquired the Software in Japan, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of Japan, notwithstanding any conflicts of law provisions; and the Tokyo District Court of Japan shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. " +
+            "If you acquired the Software in Australia, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the State of New South Wales, Australia, notwithstanding any conflicts of law provisions; and the State and federal courts of New South Wales shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in any other country, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the State of California, United States of America, notwithstanding any conflicts of law provisions; and the state and federal courts of California shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties.\n" +
+            "\n" +
+            "For all countries referred to above, the parties specifically disclaim the application of the UN Convention on Contracts for the International Sale of Goods. Notwithstanding the foregoing, either party may seek interim injunctive relief in any court of appropriate jurisdiction with respect to any alleged breach of such party's intellectual property or proprietary rights. If any portion hereof is found to be void or unenforceable, the remaining provisions of the Agreement and Warranties shall remain in full force and effect. Except as expressly provided herein, the Agreement constitutes the entire agreement between the parties with respect to the license of the Software and Documentation and supersedes any conflicting or additional terms contained in any Purchase Order or elsewhere, all of which terms are excluded. The Agreement has been written in the English language, and the parties agree that the English version will govern.\n" +
+            "\n" +
+            "Product warranty terms and other information applicable to Cisco products are available at the following URL: www.cisco.com/go/warranty\n" +
+            "\n" +
+            "Cisco and the Cisco logo are trademarks or registered trademarks of Cisco and/or its affiliates in the U.S. and other countries. To view a list of Cisco trademarks, go to this URL: www.cisco.com/go/trademarks. Third-party trademarks mentioned are the property of their respective owners. The use of the word partner does not imply a partnership relationship between Cisco and any other company. (1110R)\n" +
+            "\n" +
+            "© 1998, 2001, 2003, 2008-2014 Cisco Systems, Inc. All rights reserved.</License>\n" +
+            "</EulaSection>\n" +
+            "<EulaSection>\n" +
+            "      <Info>supplemental end-user license agreement</Info>\n" +
+            "      <License>SUPPLEMENTAL END USER LICENSE AGREEMENT FOR VIRTUAL SOFTWARE PRODUCTS\n" +
+            "\n" +
+            "IMPORTANT: READ CAREFULLY\n" +
+            "\n" +
+            "This Supplemental End User License Agreement (\"SEULA\") contains additional terms and conditions for the Software licensed under the End User License Agreement (\"EULA\") between you and Cisco (collectively, the \"Agreement\"). Capitalized terms used in this SEULA but not defined will have the meanings assigned to them in the EULA. To the extent that there is a conflict between the terms and conditions of the EULA and this SEULA, the terms and conditions of this SEULA will take precedence. In addition to the limitations set forth in the EULA on your access and use of the Software, you agree to comply at all times with the terms and conditions provided in this SEULA.\n" +
+            "\n" +
+            "DOWNLOADING, INSTALLING, OR USING THE SOFTWARE CONSTITUTES ACCEPTANCE OF THE AGREEMENT, AND YOU ARE BINDING YOURSELF AND THE BUSINESS ENTITY THAT YOU REPRESENT (COLLECTIVELY, \"CUSTOMER\") TO THE AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS OF THE AGREEMENT, THEN CISCO IS UNWILLING TO LICENSE THE SOFTWARE TO YOU AND (A) YOU MAY NOT DOWNLOAD, INSTALL OR USE THE SOFTWARE, AND (B) YOU MAY RETURN THE SOFTWARE (INCLUDING ANY UNOPENED CD PACKAGE AND ANY WRITTEN MATERIALS) FOR A FULL REFUND, OR, IF THE SOFTWARE AND WRITTEN MATERIALS ARE SUPPLIED AS PART OF ANOTHER PRODUCT, YOU MAY RETURN THE ENTIRE PRODUCT FOR A FULL REFUND. YOUR RIGHT TO RETURN AND REFUND EXPIRES 30 DAYS AFTER PURCHASE FROM CISCO OR AN AUTHORIZED CISCO RESELLER, AND APPLIES ONLY IF YOU ARE THE ORIGINAL END USER PURCHASER.\n" +
+            "\n" +
+            "Definitions\n" +
+            "\"CPU\" means a central processing unit that encompasses part of a Server.\n" +
+            "\"Failover Pair\"  means a primary Instance and a standby Instance with the same Software configuration where the standby Instance can take over in case of failure of the primary Instance.\n" +
+            "\"Instance\" means a single copy of the Software. Each copy of the Software loaded into memory is an Instance.\n" +
+            "\"Server\" means a single physical computer or device on a network that manages or provides network resources for multiple users.\n" +
+            "\"Service Provider\" means a company that provides information technology services to  external end user customers.\n" +
+            "\"Software\" means Cisco's Adaptive Security Virtual Appliance (\"ASAv\"), Adaptive Security Appliance 1000V Cloud Firewall Software (\"ASA 1000V\"), Nexus 1000V series switch products, Virtual Security Gateway products, or other Cisco virtual software products that Cisco includes under this SEULA.\n" +
+            "\"vCPU\" means a virtual central processing resource assigned to the VM by the underlying virtualization technology.\n" +
+            "\"Virtual Machine\" or \"VM\" means a software container that can run its own operating system and execute applications like a Server.\n" +
+            "\n" +
+            "Additional License Terms and Conditions\n" +
+            "1. Cisco hereby grants Customer the right to install and use the Software on single or multiple Cisco or non-Cisco Servers or on Virtual Machines. In order to use the Software Customer may be required to input a registration number or product activation key and register each Instance online at Cisco's website in order to obtain the necessary entitlements.\n" +
+            "2. Customer shall pay a unit license fee to Cisco or an authorized Cisco reseller, as applicable, for each Instance installed on a Cisco or non-Cisco Server CPU, vCPU or Virtual Machine, as determined by Cisco.\n" +
+            "3. For the ASA 1000V, Customer is licensed the number of Instances equal to the number of CPUs covered by the unit license fee. If Customer deploys a Failover Pair, then the fee for the additional standby Instance is included in the fee for each primary Instance.\n" +
+            "4. If Customer is a Service Provider, Customer may use the Software under the terms of this Agreement for the purpose of delivering hosted information technology services to Customer's end user customers, subject to payment of the required license fee(s).\n" +
+            "5. Customer may also use the Software under the terms of this Agreement to deliver hosted information technology services to Customer affiliates, subject to payment of the required license fee(s).\n" +
+            "6. If the Software is subject to Cisco's Smart Licensing program, Cisco will be able to assess if Customer is using the Software within the limits and entitlements paid for by Customer. If the Smart Licensing program is applicable, Customer will be required to enter into a separate terms of service agreement relating to Smart Licensing.</License>\n" +
+            "</EulaSection>\n" +
+            "</VirtualSystem>";
+
+    private String productSectionWithCategories =
+            "<VirtualSystem ovf:id=\"VMware-vCenter-Server-Appliance\">\n" +
+            "<ProductSection ovf:required=\"false\">\n" +
+            "      <Info>Appliance ISV branding information</Info>\n" +
+            "      <Product>VMware vCenter Server Appliance</Product>\n" +
+            "      <Vendor>VMware Inc.</Vendor>\n" +
+            "      <!--\n" +
+            "            Version is the actual product version in the\n" +
+            "            form X.X.X.X where X is an unsigned 16-bit integer.\n" +
+            "\n" +
+            "            FullVersion is a descriptive version string\n" +
+            "            including, for example, alpha or beta designations\n" +
+            "            and other release criteria.\n" +
+            "        -->\n" +
+            "\n" +
+            "\n" +
+            "      <Version>6.7.0.44000</Version>\n" +
+            "      <FullVersion>6.7.0.44000 build 16046470</FullVersion>\n" +
+            "      <ProductUrl/>\n" +
+            "      <VendorUrl>http://www.vmware.com</VendorUrl>\n" +
+            "      <AppUrl>https://${vami.ip0.VMware_vCenter_Server_Appliance}:5480/</AppUrl>\n" +
+            "      <Category>Application</Category>\n" +
+            "      <Category vmw:uioptional=\"false\">Networking Configuration</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.addr.family\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network IP Address Family</Label>\n" +
+            "        <Description>Network IP address family (i.e., &apos;ipv4&apos; or &apos;ipv6&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.mode\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network Mode</Label>\n" +
+            "        <Description>Network mode (i.e., &apos;static&apos;, &apos;dhcp&apos;, or &apos;autoconf&apos; (IPv6 only).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.addr\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network IP Address</Label>\n" +
+            "        <Description>Network IP address.  Only provide this when mode is &apos;static&apos;.  Can be IPv4 or IPv6 based on specified address family.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.prefix\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network Prefix</Label>\n" +
+            "        <Description>Network prefix length.  Only provide this when mode is &apos;static&apos;.  0-32 for IPv4.  0-128 for IPv6.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.gateway\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network Default Gateway</Label>\n" +
+            "        <Description>IP address of default gateway.  Can be &apos;default&apos; when using IPv6.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.dns.servers\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network DNS Servers</Label>\n" +
+            "        <Description>Comma separated list of IP addresses of DNS servers.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.pnid\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Host Network Identity</Label>\n" +
+            "        <Description>Network identity (IP address or fully-qualified domain name) services should use when advertising themselves.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.net.ports\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"{}\">\n" +
+            "        <Label>Custom Network Ports</Label>\n" +
+            "        <Description>A string encoding a JSON object mapping port names to port numbers.</Description>\n" +
+            "      </Property>\n" +
+            "      <Category vmw:uioptional=\"false\">SSO Configuration</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.username\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"administrator@vsphere.local\">\n" +
+            "        <Label>Directory Username</Label>\n" +
+            "        <Description>For the first instance of the identity domain, this is the username with Administrator privileges. Otherwise, this is the username of the replication partner.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"true\">\n" +
+            "        <Label>Directory Password</Label>\n" +
+            "        <Description>For the first instance of the identity domain, this is the password given to the Administrator account.  Otherwise, this is the password of the Administrator account of the replication partner.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.domain-name\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"vsphere.local\">\n" +
+            "        <Label>Directory Domain Name</Label>\n" +
+            "        <Description>For the first instance of the identity domain, this is the name of the newly created domain.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.site-name\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"Default-First-Site\">\n" +
+            "        <Label>Site Name</Label>\n" +
+            "        <Description>Name of site.  Use &apos;Default-First-Site&apos; to define a new site.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.first-instance\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"True\">\n" +
+            "        <Label>New Identity Domain</Label>\n" +
+            "        <Description>If this parameter is set to True, the VMware directory instance is setup as the first instance of a new identity domain. Otherwise, the instance is setup as a replication partner.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vmdir.replication-partner-hostname\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Directory Replication Partner</Label>\n" +
+            "        <Description>The hostname of the VMware directory replication partner.  This value is ignored for the first instance of the identity domain.</Description>\n" +
+            "      </Property>\n" +
+            "      <Category vmw:uioptional=\"false\">Database Configuration</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.type\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"embedded\">\n" +
+            "        <Label>Database Type</Label>\n" +
+            "        <Description>String indicating whether the database is &apos;embedded&apos; or &apos;external&apos;.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.user\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database User</Label>\n" +
+            "        <Description>String naming the account to use when connecting to external database (ignored when db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database Password</Label>\n" +
+            "        <Description>String providing the password to use when connecting to external database (ignored when db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.servername\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database Server</Label>\n" +
+            "        <Description>String naming the the hostname of the server on which the external database is running (ignored when db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.serverport\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database Port</Label>\n" +
+            "        <Description>String describing the port on the host on which the external database is running (ignored when db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.provider\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database Provider</Label>\n" +
+            "        <Description>String describing the external database provider. The only supported value is &apos;oracle&apos; (ignored when the db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.db.instance\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Database Instance</Label>\n" +
+            "        <Description>String describing the external database instance. Values could be anything depending on what the database instance name the DBA creates in the external db. (ignored when the db.type is &apos;embedded&apos;).</Description>\n" +
+            "      </Property>\n" +
+            "      <Category vmw:uioptional=\"false\">System Configuration</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.root.passwd\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"true\">\n" +
+            "        <Label>Root Password</Label>\n" +
+            "        <Description>Password to assign to root account.  If blank, password can be set on the console.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.root.shell\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Root Shell</Label>\n" +
+            "        <Description>This property is not changeable.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.ssh.enabled\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"False\">\n" +
+            "        <Label>SSH Enabled</Label>\n" +
+            "        <Description>Set whether SSH-based remote login is enabled.  This configuration can be changed after deployment.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.time.tools-sync\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"False\">\n" +
+            "        <Label>Tools-based Time Synchronization Enabled</Label>\n" +
+            "        <Description>Set whether VMware tools based time synchronization should be used. This parameter is ignored if appliance.ntp.servers is not empty.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.appliance.ntp.servers\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>NTP Servers</Label>\n" +
+            "        <Description>A comma-seperated list of hostnames or IP addresses of NTP Servers</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.deployment.node.type\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"embedded\">\n" +
+            "        <Label>Deployment Type</Label>\n" +
+            "        <Description>Type of appliance to deploy (i.e. &apos;embedded&apos;, &apos;infrastructure&apos; or &apos;management&apos;).</Description>\n" +
+            "        <Value ovf:configuration=\"management-xlarge\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-large\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-medium\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-small\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-tiny\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-xlarge-lstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-large-lstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-medium-lstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-small-lstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-tiny-lstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-xlarge-xlstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-large-xlstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-medium-xlstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-small-xlstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"management-tiny-xlstorage\" ovf:value=\"management\"/>\n" +
+            "        <Value ovf:configuration=\"infrastructure\" ovf:value=\"infrastructure\"/>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.system.vm0.hostname\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Platform Services Controller</Label>\n" +
+            "        <Description>When deploying a vCenter Server Node, please provide the FQDN or IP address of a Platform Services Controller (leave blank otherwise).  The choice of FQDN versus IP address is decided based on the Platform Services Controller&apos;s own notion of its network identity.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.system.vm0.port\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"443\">\n" +
+            "        <Label>HTTPS Port on Platform Services Controller</Label>\n" +
+            "        <Description>When deploying a vCenter Server pointing to an external platform services controller, please provide the HTTPS port of the external platform services controller if a custom port number is being used. The default HTTPS port number is 443.</Description>\n" +
+            "      </Property>\n" +
+            "      <Category vmw:uioptional=\"true\">Upgrade Configuration</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.vpxd.ip\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Source Hostname</Label>\n" +
+            "        <Description>IP/hostname of the appliance to upgrade. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.ma.port\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"9123\">\n" +
+            "        <Label>Migration Assistant Port</Label>\n" +
+            "        <Description>Port used by Migration Assistant on source vCenter Server.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.vpxd.user\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Source vCenter Username</Label>\n" +
+            "        <Description>vCenter username for the appliance to upgrade. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.vpxd.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Source vCenter Password</Label>\n" +
+            "        <Description>vCenter password for the appliance to upgrade. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.guest.user\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Source OS Username</Label>\n" +
+            "        <Description>Username for the appliance operating system to upgrade.  Usually root. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.guest.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Source OS Password</Label>\n" +
+            "        <Description>Password for the appliance operating system to upgrade. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.guestops.host.addr\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Management Host Hostname</Label>\n" +
+            "        <Description>URL that consists of the IP address or FQDN and https port of the vCenter Server instance or ESXi host that manages the appliance to upgrade. Https port is an optional parameter which by default is 443. Example: 10.10.10.10, //10.10.10.10:444, //[2001:db8:a0b:12f0::1]:444. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.guestops.host.user\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Management Host Username</Label>\n" +
+            "        <Description>Username for the host that manages appliance to upgrade.  Can be  either vCenter or ESX host.  Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.guestops.host.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Management Host Password</Label>\n" +
+            "        <Description>Password for the host that manages appliance to upgrade.  Can be  either vCenter or ESX host.  Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.ssl.thumbprint\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Management Host Thumbprint</Label>\n" +
+            "        <Description>Thumbprint for the SSL certificate of the host that manages the appliance to upgrade. Set only for upgrade.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.platform\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"linux\">\n" +
+            "        <Label>Upgrade Source Platform</Label>\n" +
+            "        <Description>Source host platform. Optional. Set only for upgrade</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.source.export.directory\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"/var/tmp\">\n" +
+            "        <Label>Upgrade Source Export Folder</Label>\n" +
+            "        <Description>Folder on the source appliance, where to store migrate data. Optional. Set only for upgrade</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.import.directory\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"/storage/seat/cis-export-folder\">\n" +
+            "        <Label>Upgrade Destination Export Folder</Label>\n" +
+            "        <Description>Folder where exported source data will be stored in the appliance. Optional. Set only for upgrade</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.upgrade.user.options\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Upgrade Advanced Options</Label>\n" +
+            "        <Description>Advanced upgrade settings specified in json format. Optional. Set only for upgrade</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.ad.domain-name\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Active Directory domain name</Label>\n" +
+            "        <Description>Active Directory domain to join.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.ad.domain.username\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Active Directory domain admin user</Label>\n" +
+            "        <Description>Active Directory domain admin user. This username will be used to join the machine to the domain.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.ad.domain.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Active Directory domain admin user password</Label>\n" +
+            "        <Description>Active Directory domain admin user password. This password will be used to join the machine to the domain.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.management.addr\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>vCenter Server managing target appliance</Label>\n" +
+            "        <Description>FQDN or IP address of the vCenter Server managing that target appliance. Used when upgrading a source appliance in VCHA cluster.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.management.port\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"443\">\n" +
+            "        <Label>Port of the vCenter Server managing target appliance</Label>\n" +
+            "        <Description>Https port of the vCenter Server managing that target appliance. Used when upgrading a source appliance in VCHA cluster. If not specified, port 443 will be used by default.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.management.user\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Username for the vCenter Server managing target appliance</Label>\n" +
+            "        <Description>User able to authenticate in vCenter Server managing that target appliance. The user must have the privilege Global.VCServer. Used when upgrading a source appliance in VCHA cluster.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.management.password\" ovf:password=\"true\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Password for the vCenter Server managing target appliance</Label>\n" +
+            "        <Description>Password for administrator user authenticating to the vCenter Server managing target appliance. Used when upgrading a source appliance in VCHA cluster.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.management.thumbprint\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Thumbprint for the SSL certificate of the vCenter Server managing target appliance</Label>\n" +
+            "        <Description>Thumbprint for the SSL certificate of the host that manages the appliance to upgrade. Used when upgrading a source appliance in VCHA cluster.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.ha.placement\" ovf:type=\"string\" ovf:userConfigurable=\"true\" ovf:value=\"\">\n" +
+            "        <Label>Path to the compute resource where target appliance will be deployed on management vCenter Server</Label>\n" +
+            "        <Description>Path to host/cluster/resource pool where target appliance will be deployed on management vCenter Server. Used when upgrading a source appliance in VCHA cluster. Example: /my_datacenter/my_folder/my_host_or_cluster/my_resource_pool</Description>\n" +
+            "      </Property>\n" +
+            "      <Category vmw:uioptional=\"true\">Miscellaneous</Category>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.netdump.enabled\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"True\">\n" +
+            "        <Label>ESXi Dump Collector Enabled</Label>\n" +
+            "        <Description>Set whether ESXi Dump Collector service is enabled.  This configuration can be changed after deployment.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.silentinstall\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"False\">\n" +
+            "        <Label>Do Silent Install</Label>\n" +
+            "        <Description>If this parameter is set to True, no questions will be posted during install or upgrade. Otherwise, the install process will wait for a reply if there is a pending question.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.clientlocale\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"en\">\n" +
+            "        <Label>The Client Locale</Label>\n" +
+            "        <Description>This parameter specifies the client locale. Supported locales are en, fr, ja, ko, zh_CN and zh_TW. English is assumed if locale is unknown.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.feature.states\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>Feature switch states</Label>\n" +
+            "        <Description>Specify feature switch states which need to be added or modified in feature switch state config file. Format: key1=value1, key2=value2</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.ceip_enabled\" ovf:type=\"boolean\" ovf:userConfigurable=\"true\" ovf:value=\"False\">\n" +
+            "        <Label>CEIP enabled</Label>\n" +
+            "        <Description>VMware’s Customer Experience Improvement Program (&quot;CEIP&quot;) provides VMware with information that enables VMware to improve its products and services, to fix problems, and to advise you on how best to deploy and use our products. As part of the CEIP, VMware collects technical information about your organization’s use of VMware products and services on a regular basis in association with your organization’s VMware license key(s). This information does not personally identify any individual. For more details about the Program and how VMware uses the information it collects through CEIP, please see the product documentation at http://www.vmware.com/info?id=1399. If you want to participate in VMware’s CEIP for this product, set this property to True. You may join or leave VMware’s CEIP for this product at any time.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.deployment.autoconfig\" ovf:type=\"boolean\" ovf:userConfigurable=\"false\" ovf:value=\"False\">\n" +
+            "        <Label>Auto Start Services</Label>\n" +
+            "        <Description>If this parameter is set to True, the appliance will be configured after deployment using the specified OVF configuration parameters. If set to False, the appliance should be configured post-deployment using the VMware Appliance Management Interface.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.mac-allocation-scheme.prefix\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>MAC address allocation scheme prefix</Label>\n" +
+            "        <Description>If a valid MAC address prefix is provided, then all MAC addresses assigned by vCenter Server will begin with this prefix instead of the VMware OUI. This property cannot co-exist with mac-allocation-scheme.ranges</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.mac-allocation-scheme.prefix-length\" ovf:type=\"uint8\" ovf:userConfigurable=\"false\" ovf:value=\"0\">\n" +
+            "        <Label>MAC address allocation scheme prefix length</Label>\n" +
+            "        <Description>This property is mandatory whenever a custom MAC prefix is provided.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"guestinfo.cis.vpxd.mac-allocation-scheme.ranges\" ovf:type=\"string\" ovf:userConfigurable=\"false\" ovf:value=\"\">\n" +
+            "        <Label>MAC address allocation scheme ranges</Label>\n" +
+            "        <Description>If valid MAC address range is provided, then vCenter Server will assign MAC addresses from this range instead of allocating VMware OUI based MAC address. The address range must be provided in the format &quot;BeginAddress1-EndAddress1,...,BeginAddressN-EndAddressN&quot;. This property cannot co-exist with mac-allocation-scheme.prefix.</Description>\n" +
+            "      </Property>\n" +
+            "</ProductSection>\n" +
+            "<ProductSection ovf:class=\"vami\" ovf:instance=\"VMware-vCenter-Server-Appliance\" ovf:required=\"false\">\n" +
+            "      <Info>VAMI Properties</Info>\n" +
+            "      <Category>Networking Properties</Category>\n" +
+            "      <Property ovf:key=\"domain\" ovf:type=\"string\" ovf:userConfigurable=\"true\">\n" +
+            "        <Label>Domain Name</Label>\n" +
+            "        <Description>The domain name of this VM. Leave blank if DHCP is desired.</Description>\n" +
+            "      </Property>\n" +
+            "      <Property ovf:key=\"searchpath\" ovf:type=\"string\" ovf:userConfigurable=\"true\">\n" +
+            "        <Label>Domain Search Path</Label>\n" +
+            "        <Description>The domain search path (comma or space separated domain names) for this VM. Leave blank if DHCP is desired.</Description>\n" +
+            "      </Property>\n" +
+            "</ProductSection>\n" +
+            "<ProductSection ovf:class=\"vm\" ovf:required=\"false\">\n" +
+            "      <Info>VM specific properties</Info>\n" +
+            "      <Property ovf:key=\"vmname\" ovf:type=\"string\" ovf:value=\"VMware-vCenter-Server-Appliance\"/>\n" +
+            "</ProductSection>\n" +
+            "</VirtualSystem>";
+
     private OVFHelper ovfHelper = new OVFHelper();
 
     @Test
     public void testGetOVFPropertiesValidOVF() throws IOException, SAXException, ParserConfigurationException {
-        List<OVFPropertyTO> props = ovfHelper.getOVFPropertiesXmlString(ovfFileProductSection);
+        List<OVFPropertyTO> props = ovfHelper.getOVFPropertiesFromXmlString(ovfFileProductSection);
         Assert.assertEquals(2, props.size());
     }
 
     @Test(expected = SAXParseException.class)
     public void testGetOVFPropertiesInvalidOVF() throws IOException, SAXException, ParserConfigurationException {
-        ovfHelper.getOVFPropertiesXmlString(ovfFileProductSection + "xxxxxxxxxxxxxxxxx");
+        ovfHelper.getOVFPropertiesFromXmlString(ovfFileProductSection + "xxxxxxxxxxxxxxxxx");
+    }
+
+    @Test
+    public void testGetOVFDeploymentOptionsValidOVF() throws IOException, SAXException, ParserConfigurationException {
+        List<OVFConfigurationTO> options = ovfHelper.getOVFDeploymentOptionsFromXmlString(ovfFileDeploymentOptionsSection);
+        Assert.assertEquals(3, options.size());
+    }
+
+    @Test
+    public void testGetOVFVirtualHardwareSectionValidOVF() throws IOException, SAXException, ParserConfigurationException {
+        List<OVFVirtualHardwareItemTO> items = ovfHelper.getOVFVirtualHardwareSectionFromXmlString(ovfFileVirtualHardwareSection);
+        Assert.assertEquals(20, items.size());
+    }
+
+    @Test
+    public void testGetOVFEulaSectionValidOVF() throws IOException, SAXException, ParserConfigurationException {
+        List<OVFEulaSectionTO> eulas = ovfHelper.getOVFEulaSectionFromXmlString(eulaSections);
+        Assert.assertEquals(2, eulas.size());
+    }
+
+    @Test
+    public void testGetOVFPropertiesWithCategories() throws IOException, SAXException, ParserConfigurationException {
+        List<OVFPropertyTO> props = ovfHelper.getOVFPropertiesFromXmlString(productSectionWithCategories);
+        Assert.assertEquals(18, props.size());
+    }
+
+    @Test
+    public void testGetOperatingSystemInfo() throws IOException, SAXException, ParserConfigurationException {
+        Pair<String, String> guestOsPair = ovfHelper.getOperatingSystemInfoFromXmlString(ovfFileVirtualHardwareSection);
+        Assert.assertEquals("other26xLinux64Guest", guestOsPair.first());
+        Assert.assertEquals("Other 2.6x Linux (64-bit)", guestOsPair.second());
+    }
+
+    @Test
+    public void testGetMinimumHardwareVersion() throws IOException, SAXException, ParserConfigurationException {
+        OVFVirtualHardwareSectionTO hardwareSection = ovfHelper.getVirtualHardwareSectionFromXmlString(ovfFileVirtualHardwareSection);
+        Assert.assertEquals("vmx-08", hardwareSection.getMinimiumHardwareVersion());
     }
 }
diff --git a/api/src/test/java/com/cloud/storage/StorageTest.java b/api/src/test/java/com/cloud/storage/StorageTest.java
index 332a806..61909e7 100644
--- a/api/src/test/java/com/cloud/storage/StorageTest.java
+++ b/api/src/test/java/com/cloud/storage/StorageTest.java
@@ -45,6 +45,7 @@
         Assert.assertTrue(StoragePoolType.SMB.isShared());
         Assert.assertTrue(StoragePoolType.Gluster.isShared());
         Assert.assertTrue(StoragePoolType.ManagedNFS.isShared());
+        Assert.assertTrue(StoragePoolType.DatastoreCluster.isShared());
     }
 
     @Test
@@ -66,5 +67,6 @@
         Assert.assertFalse(StoragePoolType.SMB.supportsOverProvisioning());
         Assert.assertFalse(StoragePoolType.Gluster.supportsOverProvisioning());
         Assert.assertFalse(StoragePoolType.ManagedNFS.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.DatastoreCluster.supportsOverProvisioning());
     }
 }
diff --git a/api/src/test/java/org/apache/cloudstack/api/command/test/CreateRoleCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/test/CreateRoleCmdTest.java
new file mode 100644
index 0000000..a910de7
--- /dev/null
+++ b/api/src/test/java/org/apache/cloudstack/api/command/test/CreateRoleCmdTest.java
@@ -0,0 +1,102 @@
+// 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.api.command.test;
+
+import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RoleService;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.command.admin.acl.CreateRoleCmd;
+import org.apache.cloudstack.api.response.RoleResponse;
+import org.apache.cloudstack.api.ServerApiException;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.mockito.Mockito.when;
+
+public class CreateRoleCmdTest {
+    private CreateRoleCmd createRoleCmd;
+    private RoleService roleService;
+    private Role role;
+
+    @Before
+    public void setUp() {
+        roleService = Mockito.spy(RoleService.class);
+        createRoleCmd = new CreateRoleCmd();
+        ReflectionTestUtils.setField(createRoleCmd,"roleService",roleService);
+        ReflectionTestUtils.setField(createRoleCmd,"roleName","testuser");
+        ReflectionTestUtils.setField(createRoleCmd,"roleDescription","User test");
+        role = Mockito.mock(Role.class);
+    }
+
+    @Test
+    public void testCreateRoleWithRoleType() {
+        ReflectionTestUtils.setField(createRoleCmd,"roleType", "User");
+        when(role.getId()).thenReturn(1L);
+        when(role.getUuid()).thenReturn("12345-abcgdkajd");
+        when(role.getDescription()).thenReturn("User test");
+        when(role.getName()).thenReturn("testuser");
+        when(role.getRoleType()).thenReturn(RoleType.User);
+        when(roleService.createRole(createRoleCmd.getRoleName(), createRoleCmd.getRoleType(), createRoleCmd.getRoleDescription())).thenReturn(role);
+        createRoleCmd.execute();
+        RoleResponse response = (RoleResponse) createRoleCmd.getResponseObject();
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleName"), role.getName());
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleDescription"), role.getDescription());
+    }
+
+    @Test
+    public void testCreateRoleWithExistingRole() {
+        ReflectionTestUtils.setField(createRoleCmd,"roleId",1L);
+        when(roleService.findRole(createRoleCmd.getRoleId())).thenReturn(role);
+        Role newRole = Mockito.mock(Role.class);
+        when(newRole.getId()).thenReturn(2L);
+        when(newRole.getUuid()).thenReturn("67890-xyztestid");
+        when(newRole.getDescription()).thenReturn("User test");
+        when(newRole.getName()).thenReturn("testuser");
+        when(newRole.getRoleType()).thenReturn(RoleType.User);
+        when(roleService.createRole(createRoleCmd.getRoleName(), role, createRoleCmd.getRoleDescription())).thenReturn(newRole);
+        createRoleCmd.execute();
+        RoleResponse response = (RoleResponse) createRoleCmd.getResponseObject();
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleName"), newRole.getName());
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleDescription"), newRole.getDescription());
+    }
+
+    @Test(expected = ServerApiException.class)
+    public void testCreateRoleWithNonExistingRole() {
+        ReflectionTestUtils.setField(createRoleCmd,"roleId",1L);
+        when(roleService.findRole(createRoleCmd.getRoleId())).thenReturn(null);
+        createRoleCmd.execute();
+        Assert.fail("An exception should have been thrown: " + ServerApiException.class);
+    }
+
+    @Test(expected = ServerApiException.class)
+    public void testCreateRoleValidateNeitherRoleIdNorTypeParameters() {
+        createRoleCmd.execute();
+        Assert.fail("An exception should have been thrown: " + ServerApiException.class);
+    }
+
+    @Test(expected = ServerApiException.class)
+    public void testCreateRoleValidateBothRoleIdAndTypeParameters() {
+        ReflectionTestUtils.setField(createRoleCmd,"roleId",1L);
+        ReflectionTestUtils.setField(createRoleCmd,"roleType", "User");
+        createRoleCmd.execute();
+        Assert.fail("An exception should have been thrown: " + ServerApiException.class);
+    }
+}
diff --git a/api/src/test/java/org/apache/cloudstack/api/command/test/ImportRoleCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/test/ImportRoleCmdTest.java
new file mode 100644
index 0000000..8de0148
--- /dev/null
+++ b/api/src/test/java/org/apache/cloudstack/api/command/test/ImportRoleCmdTest.java
@@ -0,0 +1,131 @@
+// 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.api.command.test;
+
+import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RoleService;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.command.admin.acl.ImportRoleCmd;
+import org.apache.cloudstack.api.response.RoleResponse;
+import org.apache.cloudstack.api.ServerApiException;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyCollection;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.cloud.exception.InvalidParameterValueException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+
+public class ImportRoleCmdTest {
+    private ImportRoleCmd importRoleCmd;
+    private RoleService roleService;
+    private Role role;
+
+    @Before
+    public void setUp() {
+        roleService = Mockito.spy(RoleService.class);
+        importRoleCmd = new ImportRoleCmd();
+        ReflectionTestUtils.setField(importRoleCmd,"roleService",roleService);
+        ReflectionTestUtils.setField(importRoleCmd,"roleName","Test User");
+        ReflectionTestUtils.setField(importRoleCmd,"roleType", "User");
+        ReflectionTestUtils.setField(importRoleCmd,"roleDescription","test user imported");
+        role = Mockito.mock(Role.class);
+    }
+
+    @Test
+    public void testImportRoleSuccess() {
+        Map<String, Map<String, String>> rules = new HashMap<String, Map<String, String>>();
+
+        //Rule 1
+        Map<String, String> rule1 = new HashMap<String, String>();
+        rule1.put(ApiConstants.RULE, "list*");
+        rule1.put(ApiConstants.PERMISSION, "allow");
+        rule1.put(ApiConstants.DESCRIPTION, "listing apis");
+        rules.put("key1", rule1);
+
+        //Rule 2
+        Map<String, String> rule2 = new HashMap<String, String>();
+        rule2.put(ApiConstants.RULE, "update*");
+        rule2.put(ApiConstants.PERMISSION, "deny");
+        rule2.put(ApiConstants.DESCRIPTION, "no update allowed");
+        rules.put("key2", rule2);
+
+        //Rule 3
+        Map<String, String> rule3 = new HashMap<String, String>();
+        rule3.put(ApiConstants.RULE, "get*");
+        rule3.put(ApiConstants.PERMISSION, "allow");
+        rule3.put(ApiConstants.DESCRIPTION, "get details");
+        rules.put("key3", rule3);
+
+        ReflectionTestUtils.setField(importRoleCmd,"rules",rules);
+
+        when(role.getUuid()).thenReturn("12345-abcgdkajd");
+        when(role.getDescription()).thenReturn("test user imported");
+        when(role.getName()).thenReturn("Test User");
+        when(role.getRoleType()).thenReturn(RoleType.User);
+        when(roleService.importRole(anyString(),any(), anyString(), any(), anyBoolean())).thenReturn(role);
+
+        importRoleCmd.execute();
+        RoleResponse response = (RoleResponse) importRoleCmd.getResponseObject();
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleName"), role.getName());
+        Assert.assertEquals((String) ReflectionTestUtils.getField(response, "roleDescription"), role.getDescription());
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void testImportRoleInvalidRule() {
+        Map<String, Map<String, String>> rules = new HashMap<String, Map<String, String>>();
+        Map<String, String> rule = new HashMap<String, String>();
+        rule.put(ApiConstants.RULE, "*?+test*");
+        rule.put(ApiConstants.PERMISSION, "allow");
+        rule.put(ApiConstants.DESCRIPTION, "listing apis");
+        rules.put("key1", rule);
+        ReflectionTestUtils.setField(importRoleCmd,"rules",rules);
+
+        importRoleCmd.execute();
+        Assert.fail("An exception should have been thrown: " + InvalidParameterValueException.class);
+    }
+
+    @Test(expected = ServerApiException.class)
+    public void testImportRoleInvalidPermission() {
+        Map<String, Map<String, String>> rules = new HashMap<String, Map<String, String>>();
+        Map<String, String> rule = new HashMap<String, String>();
+        rule.put(ApiConstants.RULE, "list*");
+        rule.put(ApiConstants.PERMISSION, "pass");
+        rule.put(ApiConstants.DESCRIPTION, "listing apis");
+        rules.put("key1", rule);
+        ReflectionTestUtils.setField(importRoleCmd,"rules",rules);
+
+        importRoleCmd.execute();
+        Assert.fail("An exception should have been thrown: " + ServerApiException.class);
+    }
+}
diff --git a/client/bindir/cloud-setup-management.in b/client/bindir/cloud-setup-management.in
index 94a08cb..96b9121 100755
--- a/client/bindir/cloud-setup-management.in
+++ b/client/bindir/cloud-setup-management.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -35,26 +35,27 @@
     if options.https:
         glbEnv.svrMode = "HttpsServer"
     if options.tomcat7:
-        print "The --tomcat7 option is deprecated, CloudStack now uses embedded Jetty server."
+        print("The --tomcat7 option is deprecated, CloudStack now uses embedded Jetty server.")
     if options.nostart:
         glbEnv.noStart = True
 
     glbEnv.mode = "Server"
 
-    print "Starting to configure CloudStack Management Server:"
+    print("Starting to configure CloudStack Management Server:")
     try:
         syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
     except UnknownSystemException:
-        print >>sys.stderr, ("Error: CloudStack failed to detect your "
-                "operating system. Exiting.")
+        print("Error: CloudStack failed to detect your "
+                "operating system. Exiting.", file=sys.stderr)
         sys.exit(1)
     try:
-    	syscfg.registerService(cloudManagementConfig)
+        syscfg.registerService(cloudManagementConfig)
         syscfg.config()
-        print "CloudStack Management Server setup is Done!"
-    except (CloudRuntimeException, CloudInternalException), e:
-        print e
-        print "Try to restore your system:"
+        print("CloudStack Management Server setup is Done!")
+        print("Please ensure the following ports are open for the management server to function properly : 8080 8250 8443 9090")
+    except (CloudRuntimeException, CloudInternalException) as e:
+        print(e)
+        print("Try to restore your system:")
         try:
             syscfg.restore()
         except:
diff --git a/client/bindir/cloud-update-xenserver-licenses.in b/client/bindir/cloud-update-xenserver-licenses.in
index 9db5078..9ce1898 100755
--- a/client/bindir/cloud-update-xenserver-licenses.in
+++ b/client/bindir/cloud-update-xenserver-licenses.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python -W ignore::DeprecationWarning
+#!/usr/bin/python3 -W ignore::DeprecationWarning
 # -*- coding: utf-8 -*-
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -65,7 +65,7 @@
 	usernames = dict(cur.fetchall())
 	cur.execute("SELECT h.private_ip_address,d.value FROM cloud.host h inner join cloud.host_details d on (h.id = d.host_id) where d.name = 'password' and setup = 1")
 	passwords = dict(cur.fetchall())
-	creds = dict( [ [x,(usernames[x],passwords[x])] for x in usernames.keys() ] )
+	creds = dict( [ [x,(usernames[x],passwords[x])] for x in list(usernames.keys()) ] )
 	cur.close()
 	conn.close()
 	return creds
@@ -121,7 +121,7 @@
 			if self.retval != 0: self.state = 'failed'
 			else: self.state = 'finished'
 			
-		except Exception,e:
+		except Exception as e:
 			self.state = 'failed'
 			self.retval = e
 			#raise
@@ -144,7 +144,7 @@
 	if len(args) != 0: e("IP addresses cannot be specified if -a is specified")
 	config = read_properties(cfg)
 	creds = getknownhosts(config["db.cloud.host"],config["db.cloud.username"],config["db.cloud.password"])
-	hosts = creds.keys()
+	hosts = list(creds.keys())
 else:
 	if not args: e("You must specify at least one IP address, or -a")
 	hosts = args
@@ -152,31 +152,31 @@
 
 try:
 	keyfiledata = file(licensefile).read(-1)
-except OSError,e:
+except OSError as e:
 	sys.stderr.write("The file %s cannot be opened"%licensefile)
 	sys.exit(1)
 
 configurators = []
-for host,(user,password) in creds.items():
+for host,(user,password) in list(creds.items()):
 	configurators.append ( XenServerConfigurator(host,user,password,keyfiledata ) )
 
 
 for c in configurators: c.start()
 	
 for c in configurators:
-	print c.host + "...",
+	print(c.host + "...", end=' ')
 	c.join()
 	if c.state == 'failed':
 		if c.retval:
 			msg = "failed with return code %s: %s%s"%(c.retval,c.stdout,c.stderr)
 			msg = msg.strip()
-			print msg
-		else: print "failed: %s"%c.retval
+			print(msg)
+		else: print("failed: %s"%c.retval)
 	else:
-		print "done"
+		print("done")
 
 successes = len( [ a for a in configurators if not a.state == 'failed' ] )
 failures = len( [ a for a in configurators if a.state == 'failed' ] )
 
-print "%3s successes"%successes
-print "%3s failures"%failures
+print("%3s successes"%successes)
+print("%3s failures"%failures)
diff --git a/client/conf/commons-logging.properties.in b/client/conf/commons-logging.properties.in
deleted file mode 100644
index febd7ba..0000000
--- a/client/conf/commons-logging.properties.in
+++ /dev/null
@@ -1,30 +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.
-#
-
-# This is the logging properties that goes to the war, there are two logging conf kept at the
-# svn, one for developement (one at src/test-resources) and other for producation
-
-# Uncomment the next line to disable all logging.
-#org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
-
-# Uncomment the next line to enable the simple log based logging
-#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
-
-# Uncomment the next line to enable log4j based logging
-org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
diff --git a/client/conf/db.properties.in b/client/conf/db.properties.in
index 7ef25af..f94631c 100644
--- a/client/conf/db.properties.in
+++ b/client/conf/db.properties.in
@@ -39,7 +39,7 @@
 db.cloud.timeBetweenEvictionRunsMillis=40000
 db.cloud.minEvictableIdleTimeMillis=240000
 db.cloud.poolPreparedStatements=false
-db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&serverTimezone=UTC
+db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'&serverTimezone=UTC
 
 # CloudStack database SSL settings
 db.cloud.useSSL=false
diff --git a/client/pom.xml b/client/pom.xml
index 5ca75a5..ba7f755 100644
--- a/client/pom.xml
+++ b/client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <repositories>
         <repository>
@@ -104,6 +104,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-acl-project-role-based</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-plugin-ca-rootca</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -305,6 +310,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-plugin-outofbandmanagement-driver-redfish</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-mom-rabbitmq</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -596,7 +606,10 @@
                                     </fileset>
                                 </copy>
                                 <copy todir="${project.build.directory}/classes/META-INF/webapp">
-                                    <fileset dir="${basedir}/../ui" />
+                                    <fileset dir="${basedir}/../ui">
+                                        <include name="index.html"/>
+                                        <include name="legacy/**"/>
+                                    </fileset>
                                 </copy>
                                 <copy overwrite="true" todir="${basedir}/target/utilities/bin">
                                     <fileset dir="${basedir}/../setup/bindir">
diff --git a/client/src/main/java/org/apache/cloudstack/ServerDaemon.java b/client/src/main/java/org/apache/cloudstack/ServerDaemon.java
index 6e719ef..b4cbb62 100644
--- a/client/src/main/java/org/apache/cloudstack/ServerDaemon.java
+++ b/client/src/main/java/org/apache/cloudstack/ServerDaemon.java
@@ -46,8 +46,7 @@
 import org.eclipse.jetty.util.thread.QueuedThreadPool;
 import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler;
 import org.eclipse.jetty.webapp.WebAppContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import com.cloud.utils.PropertiesUtil;
 import com.google.common.base.Strings;
@@ -58,7 +57,7 @@
  * Configuration parameters are read from server.properties file available on the classpath.
  */
 public class ServerDaemon implements Daemon {
-    private static final Logger LOG = LoggerFactory.getLogger(ServerDaemon.class);
+    private static final Logger LOG = Logger.getLogger(ServerDaemon.class);
     private static final String WEB_XML = "META-INF/webapp/WEB-INF/web.xml";
 
     /////////////////////////////////////////////////////
diff --git a/cloud-cli/bindir/cloud-tool b/cloud-cli/bindir/cloud-tool
index 4fcc834..410681a 100755
--- a/cloud-cli/bindir/cloud-tool
+++ b/cloud-cli/bindir/cloud-tool
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
diff --git a/cloud-cli/cloudapis/cloud.py b/cloud-cli/cloudapis/cloud.py
index a0e8880..4891183 100644
--- a/cloud-cli/cloudapis/cloud.py
+++ b/cloud-cli/cloudapis/cloud.py
@@ -21,15 +21,15 @@
 
 
 from cloudtool.utils import describe
-import urllib
-import urllib2
+import urllib.request, urllib.parse, urllib.error
+import urllib.request, urllib.error, urllib.parse
 import os
 import xml.dom.minidom
 import re
 import base64
 import hmac
 import hashlib
-import httplib
+import http.client
 
 class CloudAPI:
 
@@ -51,30 +51,30 @@
         requests["command"] = command
         requests["apiKey"] = self.apiKey
         requests["response"] = "xml"
-        requests = zip(requests.keys(), requests.values())
+        requests = list(zip(list(requests.keys()), list(requests.values())))
         requests.sort(key=lambda x: str.lower(x[0]))
 
-        requestUrl = "&".join(["=".join([request[0], urllib.quote_plus(str(request[1]))]) for request in requests])
-        hashStr = "&".join(["=".join([str.lower(request[0]), urllib.quote_plus(str.lower(str(request[1])))]) for request in requests])
+        requestUrl = "&".join(["=".join([request[0], urllib.parse.quote_plus(str(request[1]))]) for request in requests])
+        hashStr = "&".join(["=".join([str.lower(request[0]), urllib.parse.quote_plus(str.lower(str(request[1])))]) for request in requests])
 
-        sig = urllib.quote_plus(base64.encodestring(hmac.new(self.securityKey, hashStr, hashlib.sha1).digest()).strip())
+        sig = urllib.parse.quote_plus(base64.encodestring(hmac.new(self.securityKey, hashStr, hashlib.sha1).digest()).strip())
 
         requestUrl += "&signature=%s"%sig
         return requestUrl
 
 
     def _make_request_with_auth(self, command, requests):
-        self.connection = httplib.HTTPConnection("%s"%(self.server))
+        self.connection = http.client.HTTPConnection("%s"%(self.server))
         requests["command"] = command
         requests["apiKey"] = self.apiKey
         requests["response"] = self.responseformat
-        requests = zip(requests.keys(), requests.values())
+        requests = list(zip(list(requests.keys()), list(requests.values())))
         requests.sort(key=lambda x: str.lower(x[0]))
 
-        requestUrl = "&".join(["=".join([request[0], urllib.quote(str(request[1],""))]) for request in requests])
-        hashStr = "&".join(["=".join([str.lower(request[0]), urllib.quote(str.lower(str(request[1])),"")]) for request in requests])
+        requestUrl = "&".join(["=".join([request[0], urllib.parse.quote(str(request[1],""))]) for request in requests])
+        hashStr = "&".join(["=".join([str.lower(request[0]), urllib.parse.quote(str.lower(str(request[1])),"")]) for request in requests])
 
-        sig = urllib.quote_plus(base64.encodestring(hmac.new(self.securityKey, str.lower(hashStr), hashlib.sha1).digest()).strip())
+        sig = urllib.parse.quote_plus(base64.encodestring(hmac.new(self.securityKey, str.lower(hashStr), hashlib.sha1).digest()).strip())
 
         requestUrl += "&signature=%s"%sig
 
@@ -99,11 +99,11 @@
         else:
             parameters["command"] = command
             parameters["response"] = self.responseformat
-            querystring = urllib.urlencode(parameters)
+            querystring = urllib.parse.urlencode(parameters)
 
         url += querystring
 
-        f = urllib2.urlopen(url)
+        f = urllib.request.urlopen(url)
         data = f.read()
         if self.stripxml == "true":
             data=re.sub("<\?.*\?>", "\n", data);
@@ -149,7 +149,7 @@
             required = getText(param.getElementsByTagName('required')[0].childNodes).strip()
             if required == 'true': required = True
             elif required == 'false': required = False
-            else: raise AssertionError, "Not reached"
+            else: raise AssertionError("Not reached")
             if required: arguments.append(argname)
             options.append(argname)
 
@@ -179,7 +179,7 @@
         """%(name,funcparams,description,arguments,name)
 
         namespace = {}
-        exec code.strip() in namespace
+        exec(code.strip(), namespace)
 
         func = namespace[name]
         for argname,description in descriptions:
diff --git a/cloud-cli/cloudtool/__init__.py b/cloud-cli/cloudtool/__init__.py
index c4b479e..dd7c46c 100644
--- a/cloud-cli/cloudtool/__init__.py
+++ b/cloud-cli/cloudtool/__init__.py
@@ -55,7 +55,7 @@
     
     try:
         api = apis(**api_optionsdict)
-    except utils.OptParseError,e:
+    except utils.OptParseError as e:
         parser.error(str(e))
     
     command = utils.lookup_command_in_api(api,args[0])
@@ -64,7 +64,7 @@
     args = args[2:]
 
     try: return command(*args,**cmd_optionsdict)
-    except TypeError,e: parser.error(str(e))
+    except TypeError as e: parser.error(str(e))
 
 
 if __name__ == '__main__':
diff --git a/cloud-cli/cloudtool/utils.py b/cloud-cli/cloudtool/utils.py
index e123434..1f3d329 100644
--- a/cloud-cli/cloudtool/utils.py
+++ b/cloud-cli/cloudtool/utils.py
@@ -109,7 +109,7 @@
         assert len(api_arguments) is 0 # no mandatory arguments for class initializers
         
     if cmd_callable:
-        cmd_name = cmd_callable.func_name.replace("_","-")
+        cmd_name = cmd_callable.__name__.replace("_","-")
         cmd_arguments,cmd_options = get_arguments_and_options(cmd_callable)
         if cmd_arguments:
             arguments   = " " + " ".join( [ s[0].upper() for s in cmd_arguments ] )
diff --git a/core/pom.xml b/core/pom.xml
index 84baafd..6738dcd 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
@@ -51,9 +51,5 @@
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-compress</artifactId>
-        </dependency>
     </dependencies>
 </project>
diff --git a/core/src/main/java/com/cloud/agent/api/GetStorageStatsCommand.java b/core/src/main/java/com/cloud/agent/api/GetStorageStatsCommand.java
index 94a574c..9e7f171 100644
--- a/core/src/main/java/com/cloud/agent/api/GetStorageStatsCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/GetStorageStatsCommand.java
@@ -55,7 +55,7 @@
         this.store = store;
     }
 
-    public GetStorageStatsCommand(DataStoreTO store, Integer nfsVersion) {
+    public GetStorageStatsCommand(DataStoreTO store, String nfsVersion) {
         super(nfsVersion);
         this.store = store;
     }
diff --git a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
index 6e6dadc..be84cce 100644
--- a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
+++ b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java
@@ -19,6 +19,8 @@
 
 package com.cloud.agent.api;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import com.cloud.storage.template.TemplateProp;
@@ -27,6 +29,8 @@
     private StoragePoolInfo poolInfo;
     private Map<String, TemplateProp> templateInfo;
     private String localDatastoreName;
+    private String poolType;
+    private List<ModifyStoragePoolAnswer> datastoreClusterChildren = new ArrayList<>();;
 
     public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, long capacityBytes, long availableBytes, Map<String, TemplateProp> tInfo) {
         super(cmd);
@@ -61,4 +65,20 @@
     public String getLocalDatastoreName() {
         return localDatastoreName;
     }
+
+    public String getPoolType() {
+        return poolType;
+    }
+
+    public void setPoolType(String poolType) {
+        this.poolType = poolType;
+    }
+
+    public List<ModifyStoragePoolAnswer> getDatastoreClusterChildren() {
+        return datastoreClusterChildren;
+    }
+
+    public void setDatastoreClusterChildren(List<ModifyStoragePoolAnswer> datastoreClusterChildren) {
+        this.datastoreClusterChildren = datastoreClusterChildren;
+    }
 }
diff --git a/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceAnswer.java b/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceAnswer.java
new file mode 100644
index 0000000..2fd515a
--- /dev/null
+++ b/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceAnswer.java
@@ -0,0 +1,27 @@
+// 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;
+
+public class PrepareUnmanageVMInstanceAnswer extends Answer {
+
+    public PrepareUnmanageVMInstanceAnswer() {
+    }
+
+    public PrepareUnmanageVMInstanceAnswer(PrepareUnmanageVMInstanceCommand cmd, boolean result, String details) {
+        super(cmd, result, details);
+    }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceCommand.java b/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceCommand.java
new file mode 100644
index 0000000..8a78885
--- /dev/null
+++ b/core/src/main/java/com/cloud/agent/api/PrepareUnmanageVMInstanceCommand.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 com.cloud.agent.api;
+
+public class PrepareUnmanageVMInstanceCommand extends Command {
+
+    private String instanceName;
+
+    public PrepareUnmanageVMInstanceCommand() {
+    }
+
+    public String getInstanceName() {
+        return instanceName;
+    }
+
+    public void setInstanceName(String instanceName) {
+        this.instanceName = instanceName;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/agent/api/ReadyCommand.java b/core/src/main/java/com/cloud/agent/api/ReadyCommand.java
index 06a435a..637e4f5 100644
--- a/core/src/main/java/com/cloud/agent/api/ReadyCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/ReadyCommand.java
@@ -33,15 +33,17 @@
     private List<String> msHostList;
     private String lbAlgorithm;
     private Long lbCheckInterval;
+    private Boolean enableHumanReadableSizes;
 
     public ReadyCommand(Long dcId) {
         super();
         this.dcId = dcId;
     }
 
-    public ReadyCommand(final Long dcId, final Long hostId) {
+    public ReadyCommand(final Long dcId, final Long hostId, boolean enableHumanReadableSizes) {
         this(dcId);
         this.hostId = hostId;
+        this.enableHumanReadableSizes = enableHumanReadableSizes;
     }
 
     public void setDetails(String details) {
@@ -88,4 +90,8 @@
     public void setLbCheckInterval(Long lbCheckInterval) {
         this.lbCheckInterval = lbCheckInterval;
     }
+
+    public Boolean getEnableHumanReadableSizes() {
+        return enableHumanReadableSizes;
+    }
 }
diff --git a/core/src/main/java/com/cloud/agent/api/ShutdownCommand.java b/core/src/main/java/com/cloud/agent/api/ShutdownCommand.java
index 3c0571c..d36621d 100644
--- a/core/src/main/java/com/cloud/agent/api/ShutdownCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/ShutdownCommand.java
@@ -30,6 +30,7 @@
 
     private String reason;
     private String detail;
+    private boolean removeHost;
 
     protected ShutdownCommand() {
         super();
@@ -41,6 +42,13 @@
         this.detail = detail;
     }
 
+    public ShutdownCommand(String reason, String detail, boolean removeHost) {
+        super();
+        this.reason = reason;
+        this.detail = detail;
+        this.removeHost = removeHost;
+    }
+
     /**
      * @return return the reason the agent shutdown.  If Unknown, call getDetail() for any details.
      */
@@ -52,6 +60,10 @@
         return detail;
     }
 
+    public boolean isRemoveHost() {
+        return removeHost;
+    }
+
     @Override
     public boolean executeInSequence() {
         return true;
diff --git a/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java b/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java
new file mode 100644
index 0000000..d1d1393
--- /dev/null
+++ b/core/src/main/java/com/cloud/agent/api/ValidateVcenterDetailsCommand.java
@@ -0,0 +1,40 @@
+// 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;
+
+public class ValidateVcenterDetailsCommand extends Command {
+
+    String vCenterServerAddress;
+
+    public ValidateVcenterDetailsCommand(String vCenterServerAddress) {
+        this.vCenterServerAddress = vCenterServerAddress;
+    }
+
+    public String getvCenterServerAddress() {
+        return vCenterServerAddress;
+    }
+
+    public void setvCenterServerAddress(String vCenterServerAddress) {
+        this.vCenterServerAddress = vCenterServerAddress;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+}
diff --git a/core/src/main/java/com/cloud/agent/api/routing/VmDataCommand.java b/core/src/main/java/com/cloud/agent/api/routing/VmDataCommand.java
index c74c7cf..dfcdcfd 100644
--- a/core/src/main/java/com/cloud/agent/api/routing/VmDataCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/routing/VmDataCommand.java
@@ -72,5 +72,4 @@
     public void addVmData(String folder, String file, String contents) {
         vmData.add(new String[] {folder, file, contents});
     }
-
 }
diff --git a/core/src/main/java/com/cloud/agent/api/storage/DownloadAnswer.java b/core/src/main/java/com/cloud/agent/api/storage/DownloadAnswer.java
index 9859c3f..0c63731 100644
--- a/core/src/main/java/com/cloud/agent/api/storage/DownloadAnswer.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/DownloadAnswer.java
@@ -20,11 +20,11 @@
 package com.cloud.agent.api.storage;
 
 import java.io.File;
-import java.util.List;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.LogLevel;
+import com.cloud.agent.api.to.OVFInformationTO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
 
@@ -38,8 +38,9 @@
     private long templateSize = 0L;
     private long templatePhySicalSize = 0L;
     private String checkSum;
+
     @LogLevel(LogLevel.Log4jLevel.Off)
-    private List<OVFPropertyTO> ovfProperties;
+    private OVFInformationTO ovfInformationTO;
 
     public String getCheckSum() {
         return checkSum;
@@ -150,11 +151,11 @@
         return templatePhySicalSize;
     }
 
-    public List<OVFPropertyTO> getOvfProperties() {
-        return ovfProperties;
+    public OVFInformationTO getOvfInformationTO() {
+        return ovfInformationTO;
     }
 
-    public void setOvfProperties(List<OVFPropertyTO> ovfProperties) {
-        this.ovfProperties = ovfProperties;
+    public void setOvfInformationTO(OVFInformationTO ovfInformationTO) {
+        this.ovfInformationTO = ovfInformationTO;
     }
 }
diff --git a/core/src/main/java/com/cloud/agent/api/storage/GetDatadisksCommand.java b/core/src/main/java/com/cloud/agent/api/storage/GetDatadisksCommand.java
index 0e22ea2..a6dfbfe 100644
--- a/core/src/main/java/com/cloud/agent/api/storage/GetDatadisksCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/GetDatadisksCommand.java
@@ -21,10 +21,12 @@
 
 public final class GetDatadisksCommand extends Command {
     private DataTO data;
+    private String configurationId;
 
-    public GetDatadisksCommand(DataTO data) {
+    public GetDatadisksCommand(DataTO data, String configurationId) {
         super();
         this.data = data;
+        this.configurationId = configurationId;
     }
 
     protected GetDatadisksCommand() {
@@ -40,4 +42,7 @@
         return data;
     }
 
+    public String getConfigurationId() {
+        return configurationId;
+    }
 }
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/agent/api/storage/ListTemplateCommand.java b/core/src/main/java/com/cloud/agent/api/storage/ListTemplateCommand.java
index 6f60933..aff879d 100644
--- a/core/src/main/java/com/cloud/agent/api/storage/ListTemplateCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/ListTemplateCommand.java
@@ -31,7 +31,7 @@
         this.store = store;
     }
 
-    public ListTemplateCommand(DataStoreTO store, Integer nfsVersion) {
+    public ListTemplateCommand(DataStoreTO store, String nfsVersion) {
         super(nfsVersion);
         this.store = store;
     }
diff --git a/core/src/main/java/com/cloud/agent/api/storage/StorageCommand.java b/core/src/main/java/com/cloud/agent/api/storage/StorageCommand.java
index 429755c..4f17f30 100644
--- a/core/src/main/java/com/cloud/agent/api/storage/StorageCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/StorageCommand.java
@@ -24,7 +24,7 @@
         super();
     }
 
-    protected StorageCommand(Integer nfsVersion){
+    protected StorageCommand(String nfsVersion){
         super(nfsVersion);
     }
 
diff --git a/core/src/main/java/com/cloud/agent/api/storage/StorageNfsVersionCommand.java b/core/src/main/java/com/cloud/agent/api/storage/StorageNfsVersionCommand.java
index b99713d..58cf888 100755
--- a/core/src/main/java/com/cloud/agent/api/storage/StorageNfsVersionCommand.java
+++ b/core/src/main/java/com/cloud/agent/api/storage/StorageNfsVersionCommand.java
@@ -26,18 +26,18 @@
         super();
     }
 
-    protected StorageNfsVersionCommand(Integer nfsVersion){
+    protected StorageNfsVersionCommand(String nfsVersion){
         super();
         this.nfsVersion = nfsVersion;
     }
 
-    private Integer nfsVersion;
+    private String nfsVersion;
 
-    public Integer getNfsVersion() {
+    public String getNfsVersion() {
         return nfsVersion;
     }
 
-    public void setNfsVersion(Integer nfsVersion) {
+    public void setNfsVersion(String nfsVersion) {
         this.nfsVersion = nfsVersion;
     }
 
diff --git a/core/src/main/java/com/cloud/agent/transport/Request.java b/core/src/main/java/com/cloud/agent/transport/Request.java
index 09f6bd4..79c3384 100644
--- a/core/src/main/java/com/cloud/agent/transport/Request.java
+++ b/core/src/main/java/com/cloud/agent/transport/Request.java
@@ -32,6 +32,7 @@
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
+import com.cloud.utils.HumanReadableJson;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 
@@ -417,6 +418,7 @@
                 assert false : "More gson errors on " + buff.toString();
                 return "";
             }
+            content = new StringBuilder(HumanReadableJson.getHumanReadableBytesJson(content.toString()));
             if (content.length() <= (1 + _cmds.length * 3)) {
                 return null;
             }
diff --git a/core/src/main/java/com/cloud/resource/ServerResource.java b/core/src/main/java/com/cloud/resource/ServerResource.java
index 9030db7..16ac00e 100644
--- a/core/src/main/java/com/cloud/resource/ServerResource.java
+++ b/core/src/main/java/com/cloud/resource/ServerResource.java
@@ -31,6 +31,7 @@
  * ServerResource is a generic container to execute commands sent
  */
 public interface ServerResource extends Manager {
+
     /**
      * @return Host.Type type of the computing server we have.
      */
diff --git a/core/src/main/java/com/cloud/storage/resource/StorageProcessor.java b/core/src/main/java/com/cloud/storage/resource/StorageProcessor.java
index f940e22..d86a1a6 100644
--- a/core/src/main/java/com/cloud/storage/resource/StorageProcessor.java
+++ b/core/src/main/java/com/cloud/storage/resource/StorageProcessor.java
@@ -21,6 +21,7 @@
 
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.storage.command.AttachCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
@@ -33,6 +34,9 @@
 import com.cloud.agent.api.Answer;
 
 public interface StorageProcessor {
+
+    String REQUEST_TEMPLATE_RELOAD = "request template reload";
+
     public Answer copyTemplateToPrimaryStorage(CopyCommand cmd);
 
     public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd);
@@ -76,4 +80,6 @@
     public Answer handleDownloadTemplateToPrimaryStorage(DirectDownloadCommand cmd);
 
     Answer copyVolumeFromPrimaryToPrimary(CopyCommand cmd);
+
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd);
 }
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 17b9b70..910eb3d 100644
--- a/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java
+++ b/core/src/main/java/com/cloud/storage/resource/StorageSubsystemCommandHandlerBase.java
@@ -21,6 +21,7 @@
 
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.storage.command.AttachCommand;
@@ -71,6 +72,8 @@
             return processor.resignature((ResignatureCommand) command);
         } else if (command instanceof DirectDownloadCommand) {
             return processor.handleDownloadTemplateToPrimaryStorage((DirectDownloadCommand) command);
+        } else if (command instanceof CheckDataStoreStoragePolicyComplainceCommand) {
+            return processor.CheckDataStoreStoragePolicyComplaince((CheckDataStoreStoragePolicyComplainceCommand) command);
         }
 
         return new Answer((Command)command, false, "not implemented yet");
diff --git a/core/src/main/java/com/cloud/storage/template/HttpTemplateDownloader.java b/core/src/main/java/com/cloud/storage/template/HttpTemplateDownloader.java
index 3572627..1662a1d 100755
--- a/core/src/main/java/com/cloud/storage/template/HttpTemplateDownloader.java
+++ b/core/src/main/java/com/cloud/storage/template/HttpTemplateDownloader.java
@@ -52,6 +52,8 @@
 import com.cloud.utils.UriUtils;
 import com.cloud.utils.net.Proxy;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 /**
  * Download a template file using HTTP
  *
@@ -205,7 +207,7 @@
             ) {
                 out.seek(localFileSize);
 
-                s_logger.info("Starting download from " + downloadUrl + " to " + toFile + " remoteSize=" + remoteSize + " , max size=" + maxTemplateSizeInBytes);
+                s_logger.info("Starting download from " + downloadUrl + " to " + toFile + " remoteSize=" + toHumanReadableSize(remoteSize) + " , max size=" + toHumanReadableSize(maxTemplateSizeInBytes));
 
                 if (copyBytes(file, in, out)) return 0;
 
@@ -268,14 +270,14 @@
         String downloaded = "(incomplete download)";
         if (totalBytes >= remoteSize) {
             status = Status.DOWNLOAD_FINISHED;
-            downloaded = "(download complete remote=" + remoteSize + "bytes)";
+            downloaded = "(download complete remote=" + toHumanReadableSize(remoteSize) + " bytes)";
         }
-        errorString = "Downloaded " + totalBytes + " bytes " + downloaded;
+        errorString = "Downloaded " + toHumanReadableSize(totalBytes) + " bytes " + downloaded;
     }
 
     private boolean canHandleDownloadSize() {
         if (remoteSize > maxTemplateSizeInBytes) {
-            s_logger.info("Remote size is too large: " + remoteSize + " , max=" + maxTemplateSizeInBytes);
+            s_logger.info("Remote size is too large: " + toHumanReadableSize(remoteSize) + " , max=" + toHumanReadableSize(maxTemplateSizeInBytes));
             status = Status.UNRECOVERABLE_ERROR;
             errorString = "Download file size is too large";
             return false;
@@ -344,7 +346,7 @@
         long localFileSize = 0;
         if (file.exists() && resume) {
             localFileSize = file.length();
-            s_logger.info("Resuming download to file (current size)=" + localFileSize);
+            s_logger.info("Resuming download to file (current size)=" + toHumanReadableSize(localFileSize));
         }
         return localFileSize;
     }
diff --git a/core/src/main/java/com/cloud/storage/template/OVAProcessor.java b/core/src/main/java/com/cloud/storage/template/OVAProcessor.java
index d771c67..8315ff4 100644
--- a/core/src/main/java/com/cloud/storage/template/OVAProcessor.java
+++ b/core/src/main/java/com/cloud/storage/template/OVAProcessor.java
@@ -20,14 +20,23 @@
 package com.cloud.storage.template;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
 import javax.naming.ConfigurationException;
 import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
 
-import com.cloud.agent.api.storage.OVFPropertyTO;
+import com.cloud.agent.api.to.OVFInformationTO;
+import com.cloud.agent.api.to.deployasis.OVFConfigurationTO;
+import com.cloud.agent.api.to.deployasis.OVFEulaSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareItemTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -41,9 +50,13 @@
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.script.Script;
+import org.xml.sax.SAXException;
 
+/**
+ * processes the content of an OVA for registration of a template
+ */
 public class OVAProcessor extends AdapterBase implements Processor {
-    private static final Logger s_logger = Logger.getLogger(OVAProcessor.class);
+    private static final Logger LOGGER = Logger.getLogger(OVAProcessor.class);
     StorageLayer _storage;
 
     @Override
@@ -53,73 +66,150 @@
 
     @Override
     public FormatInfo process(String templatePath, ImageFormat format, String templateName, long processTimeout) throws InternalErrorException {
-        if (format != null) {
-            if (s_logger.isInfoEnabled()) {
-                s_logger.info("We currently don't handle conversion from " + format + " to OVA.");
-            }
+        if (! conversionChecks(format)){
             return null;
         }
 
-        s_logger.info("Template processing. templatePath: " + templatePath + ", templateName: " + templateName);
+        LOGGER.info("Template processing. templatePath: " + templatePath + ", templateName: " + templateName);
         String templateFilePath = templatePath + File.separator + templateName + "." + ImageFormat.OVA.getFileExtension();
         if (!_storage.exists(templateFilePath)) {
-            if (s_logger.isInfoEnabled()) {
-                s_logger.info("Unable to find the vmware template file: " + templateFilePath);
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("Unable to find the vmware template file: " + templateFilePath);
             }
             return null;
         }
 
-        s_logger.info("Template processing - untar OVA package. templatePath: " + templatePath + ", templateName: " + templateName);
+        String templateFileFullPath = unpackOva(templatePath, templateName, processTimeout);
+
+        setFileSystemAccessRights(templatePath);
+
+        FormatInfo info = createFormatInfo(templatePath, templateName, templateFilePath, templateFileFullPath);
+
+        return info;
+    }
+
+    private FormatInfo createFormatInfo(String templatePath, String templateName, String templateFilePath, String templateFileFullPath) throws InternalErrorException {
+        FormatInfo info = new FormatInfo();
+        info.format = ImageFormat.OVA;
+        info.filename = templateName + "." + ImageFormat.OVA.getFileExtension();
+        info.size = _storage.getSize(templateFilePath);
+        info.virtualSize = getTemplateVirtualSize(templatePath, info.filename);
+        validateOva(templateFileFullPath, info);
+
+        return info;
+    }
+
+    /**
+     * side effect; properties are added to the info
+     *
+     * @throws InternalErrorException on an invalid ova contents
+     */
+    private void validateOva(String templateFileFullPath, FormatInfo info) throws InternalErrorException {
+        String ovfFilePath = getOVFFilePath(templateFileFullPath);
+        OVFHelper ovfHelper = new OVFHelper();
+        Document doc = ovfHelper.getDocumentFromFile(ovfFilePath);
+
+        OVFInformationTO ovfInformationTO = createOvfInformationTO(ovfHelper, doc, ovfFilePath);
+        info.ovfInformationTO = ovfInformationTO;
+    }
+
+    private OVFInformationTO createOvfInformationTO(OVFHelper ovfHelper, Document doc, String ovfFilePath) throws InternalErrorException {
+        OVFInformationTO ovfInformationTO = new OVFInformationTO();
+
+        List<DatadiskTO> disks = ovfHelper.getOVFVolumeInfoFromFile(ovfFilePath, doc, null);
+        if (CollectionUtils.isNotEmpty(disks)) {
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format("Found %d disks in template %s", disks.size(), ovfFilePath));
+            }
+            ovfInformationTO.setDisks(disks);
+        }
+        List<OVFNetworkTO> nets = ovfHelper.getNetPrerequisitesFromDocument(doc);
+        if (CollectionUtils.isNotEmpty(nets)) {
+            LOGGER.info("Found " + nets.size() + " prerequisite networks");
+            ovfInformationTO.setNetworks(nets);
+        } else if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace(String.format("no net prerequisites found in template %s", ovfFilePath));
+        }
+        List<OVFPropertyTO> ovfProperties = ovfHelper.getConfigurableOVFPropertiesFromDocument(doc);
+        if (CollectionUtils.isNotEmpty(ovfProperties)) {
+            LOGGER.info("Found " + ovfProperties.size() + " configurable OVF properties");
+            ovfInformationTO.setProperties(ovfProperties);
+        } else if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace(String.format("no ovf properties found in template %s", ovfFilePath));
+        }
+        OVFVirtualHardwareSectionTO hardwareSection = ovfHelper.getVirtualHardwareSectionFromDocument(doc);
+        List<OVFConfigurationTO> configurations = hardwareSection.getConfigurations();
+        if (CollectionUtils.isNotEmpty(configurations)) {
+            LOGGER.info("Found " + configurations.size() + " deployment option configurations");
+        }
+        List<OVFVirtualHardwareItemTO> hardwareItems = hardwareSection.getCommonHardwareItems();
+        if (CollectionUtils.isNotEmpty(hardwareItems)) {
+            LOGGER.info("Found " + hardwareItems.size() + " virtual hardware items");
+        }
+        if (StringUtils.isNotBlank(hardwareSection.getMinimiumHardwareVersion())) {
+            LOGGER.info("Found minimum hardware version " + hardwareSection.getMinimiumHardwareVersion());
+        }
+        ovfInformationTO.setHardwareSection(hardwareSection);
+        List<OVFEulaSectionTO> eulaSections = ovfHelper.getEulaSectionsFromDocument(doc);
+        if (CollectionUtils.isNotEmpty(eulaSections)) {
+            LOGGER.info("Found " + eulaSections.size() + " license agreements");
+            ovfInformationTO.setEulaSections(eulaSections);
+        }
+        Pair<String, String> guestOsPair = ovfHelper.getOperatingSystemInfoFromDocument(doc);
+        if (guestOsPair != null) {
+            LOGGER.info("Found guest OS information: " + guestOsPair.first() + " - " + guestOsPair.second());
+            ovfInformationTO.setGuestOsInfo(guestOsPair);
+        }
+        return ovfInformationTO;
+    }
+
+    private void setFileSystemAccessRights(String templatePath) {
+        Script command;
+        String result;
+
+        command = new Script("chmod", 0, LOGGER);
+        command.add("-R");
+        command.add("666", templatePath);
+        result = command.execute();
+        if (result != null) {
+            LOGGER.warn("Unable to set permissions for files in " + templatePath + " due to " + result);
+        }
+        command = new Script("chmod", 0, LOGGER);
+        command.add("777", templatePath);
+        result = command.execute();
+        if (result != null) {
+            LOGGER.warn("Unable to set permissions for " + templatePath + " due to " + result);
+        }
+    }
+
+    private String unpackOva(String templatePath, String templateName, long processTimeout) throws InternalErrorException {
+        LOGGER.info("Template processing - untar OVA package. templatePath: " + templatePath + ", templateName: " + templateName);
         String templateFileFullPath = templatePath + File.separator + templateName + "." + ImageFormat.OVA.getFileExtension();
         File templateFile = new File(templateFileFullPath);
-        Script command = new Script("tar", processTimeout, s_logger);
+        Script command = new Script("tar", processTimeout, LOGGER);
         command.add("--no-same-owner");
         command.add("--no-same-permissions");
         command.add("-xf", templateFileFullPath);
         command.setWorkDir(templateFile.getParent());
         String result = command.execute();
         if (result != null) {
-            s_logger.info("failed to untar OVA package due to " + result + ". templatePath: " + templatePath + ", templateName: " + templateName);
+            LOGGER.info("failed to untar OVA package due to " + result + ". templatePath: " + templatePath + ", templateName: " + templateName);
             throw new InternalErrorException("failed to untar OVA package");
         }
+        return templateFileFullPath;
+    }
 
-        command = new Script("chmod", 0, s_logger);
-        command.add("-R");
-        command.add("666", templatePath);
-        result = command.execute();
-        if (result != null) {
-            s_logger.warn("Unable to set permissions for files in " + templatePath + " due to " + result);
-        }
-        command = new Script("chmod", 0, s_logger);
-        command.add("777", templatePath);
-        result = command.execute();
-        if (result != null) {
-            s_logger.warn("Unable to set permissions for " + templatePath + " due to " + result);
-        }
-
-        FormatInfo info = new FormatInfo();
-        info.format = ImageFormat.OVA;
-        info.filename = templateName + "." + ImageFormat.OVA.getFileExtension();
-        info.size = _storage.getSize(templateFilePath);
-        info.virtualSize = getTemplateVirtualSize(templatePath, info.filename);
-
-        //vaidate ova
-        String ovfFile = getOVFFilePath(templateFileFullPath);
-        try {
-            OVFHelper ovfHelper = new OVFHelper();
-            List<DatadiskTO> disks = ovfHelper.getOVFVolumeInfo(ovfFile);
-            List<OVFPropertyTO> ovfProperties = ovfHelper.getOVFPropertiesFromFile(ovfFile);
-            if (CollectionUtils.isNotEmpty(ovfProperties)) {
-                s_logger.info("Found " + ovfProperties.size() + " configurable OVF properties");
-                info.ovfProperties = ovfProperties;
+    private boolean conversionChecks(ImageFormat format) {
+        if (format != null) {
+            if (LOGGER.isInfoEnabled()) {
+                LOGGER.info("We currently don't handle conversion from " + format + " to OVA.");
             }
-        } catch (Exception e) {
-            s_logger.info("The ovf file " + ovfFile + " is invalid ", e);
-            throw new InternalErrorException("OVA package has bad ovf file " + e.getMessage(), e);
+            return false;
         }
-        // delete original OVA file
-        // templateFile.delete();
-        return info;
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace("We are handling format " + format + ".");
+        }
+        return true;
     }
 
     @Override
@@ -128,34 +218,43 @@
             long size = getTemplateVirtualSize(file.getParent(), file.getName());
             return size;
         } catch (Exception e) {
-            s_logger.info("[ignored]"
+            LOGGER.info("[ignored]"
                     + "failed to get virtual template size for ova: " + e.getLocalizedMessage());
         }
         return file.length();
     }
 
+    /**
+     * gets the virtual size from the OVF file meta data.
+     *
+     * @return the accumulative virtual size of the disk definitions in the OVF
+     * @throws InternalErrorException
+     */
     public long getTemplateVirtualSize(String templatePath, String templateName) throws InternalErrorException {
-        // get the virtual size from the OVF file meta data
         long virtualSize = 0;
         String templateFileFullPath = templatePath.endsWith(File.separator) ? templatePath : templatePath + File.separator;
         templateFileFullPath += templateName.endsWith(ImageFormat.OVA.getFileExtension()) ? templateName : templateName + "." + ImageFormat.OVA.getFileExtension();
         String ovfFileName = getOVFFilePath(templateFileFullPath);
         if (ovfFileName == null) {
             String msg = "Unable to locate OVF file in template package directory: " + templatePath;
-            s_logger.error(msg);
+            LOGGER.error(msg);
             throw new InternalErrorException(msg);
         }
         try {
             Document ovfDoc = null;
             ovfDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(ovfFileName));
-            Element disk = (Element)ovfDoc.getElementsByTagName("Disk").item(0);
-            virtualSize = Long.parseLong(disk.getAttribute("ovf:capacity"));
-            String allocationUnits = disk.getAttribute("ovf:capacityAllocationUnits");
-            virtualSize = OVFHelper.getDiskVirtualSize(virtualSize, allocationUnits, ovfFileName);
+            NodeList diskElements = ovfDoc.getElementsByTagName("Disk");
+            for (int i = 0; i < diskElements.getLength(); i++) {
+                Element disk = (Element)diskElements.item(i);
+                long diskSize = Long.parseLong(disk.getAttribute("ovf:capacity"));
+                String allocationUnits = disk.getAttribute("ovf:capacityAllocationUnits");
+                diskSize = OVFHelper.getDiskVirtualSize(diskSize, allocationUnits, ovfFileName);
+                virtualSize += diskSize;
+            }
             return virtualSize;
-        } catch (Exception e) {
+        } catch (InternalErrorException | IOException | NumberFormatException | ParserConfigurationException | SAXException e) {
             String msg = "getTemplateVirtualSize: Unable to parse OVF XML document " + templatePath + " to get the virtual disk " + templateName + " size due to " + e;
-            s_logger.error(msg);
+            LOGGER.error(msg);
             throw new InternalErrorException(msg);
         }
     }
@@ -187,9 +286,9 @@
                 }
             }
             return new Pair<Long, Long>(virtualSize, fileSize);
-        } catch (Exception e) {
+        } catch (InternalErrorException | IOException | NumberFormatException | ParserConfigurationException | SAXException e) {
             String msg = "getDiskDetails: Unable to parse OVF XML document " + ovfFilePath + " to get the virtual disk " + diskName + " size due to " + e;
-            s_logger.error(msg);
+            LOGGER.error(msg);
             throw new InternalErrorException(msg);
         }
     }
@@ -218,4 +317,4 @@
 
         return true;
     }
-}
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/cloud/storage/template/Processor.java b/core/src/main/java/com/cloud/storage/template/Processor.java
index 4bb714a..d8c0dfb 100644
--- a/core/src/main/java/com/cloud/storage/template/Processor.java
+++ b/core/src/main/java/com/cloud/storage/template/Processor.java
@@ -21,9 +21,8 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.List;
 
-import com.cloud.agent.api.storage.OVFPropertyTO;
+import com.cloud.agent.api.to.OVFInformationTO;
 import com.cloud.exception.InternalErrorException;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.utils.component.Adapter;
@@ -48,13 +47,13 @@
 
     FormatInfo process(String templatePath, ImageFormat format, String templateName, long processTimeout) throws InternalErrorException;
 
-    public static class FormatInfo {
+    class FormatInfo {
         public ImageFormat format;
         public long size;
         public long virtualSize;
         public String filename;
         public boolean isCorrupted;
-        public List<OVFPropertyTO> ovfProperties;
+        public OVFInformationTO ovfInformationTO;
     }
 
     long getVirtualSize(File file) throws IOException;
diff --git a/core/src/main/java/com/cloud/storage/template/S3TemplateDownloader.java b/core/src/main/java/com/cloud/storage/template/S3TemplateDownloader.java
index 0506dab..9ece388 100644
--- a/core/src/main/java/com/cloud/storage/template/S3TemplateDownloader.java
+++ b/core/src/main/java/com/cloud/storage/template/S3TemplateDownloader.java
@@ -45,6 +45,7 @@
 import java.io.InputStream;
 import java.util.Date;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 import static com.cloud.utils.StringUtils.join;
 import static java.util.Arrays.asList;
 
@@ -168,7 +169,7 @@
             return 0;
         }
 
-        LOGGER.info("Starting download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " and size " + remoteSize + " bytes");
+        LOGGER.info("Starting download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " and size " + toHumanReadableSize(remoteSize) + " bytes");
 
         // Time the upload starts.
         final Date start = new Date();
@@ -197,7 +198,7 @@
                 // Record the amount of bytes transferred.
                 totalBytes += progressEvent.getBytesTransferred();
 
-                LOGGER.trace("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + totalBytes + " in " + ((new Date().getTime() - start.getTime()) / 1000) + " seconds");
+                LOGGER.trace("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + toHumanReadableSize(totalBytes) + " in " + ((new Date().getTime() - start.getTime()) / 1000) + " seconds");
 
                 if (progressEvent.getEventType() == ProgressEventType.TRANSFER_STARTED_EVENT) {
                     status = Status.IN_PROGRESS;
@@ -222,9 +223,9 @@
         downloadTime = new Date().getTime() - start.getTime();
 
         if (status == Status.DOWNLOAD_FINISHED) {
-            LOGGER.info("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + totalBytes + " in " + (downloadTime / 1000) + " seconds, completed successfully!");
+             LOGGER.info("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + toHumanReadableSize(totalBytes) + " in " + (downloadTime / 1000) + " seconds, completed successfully!");
         } else {
-            LOGGER.warn("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + totalBytes + " in " + (downloadTime / 1000) + " seconds, completed with status " + status.toString());
+             LOGGER.warn("Template download from " + downloadUrl + " to S3 bucket " + s3TO.getBucketName() + " transferred  " + toHumanReadableSize(totalBytes) + " in " + (downloadTime / 1000) + " seconds, completed with status " + status.toString());
         }
 
         // Close input stream
diff --git a/core/src/main/java/com/cloud/storage/template/TemplateLocation.java b/core/src/main/java/com/cloud/storage/template/TemplateLocation.java
index c10acc1..99360ee 100644
--- a/core/src/main/java/com/cloud/storage/template/TemplateLocation.java
+++ b/core/src/main/java/com/cloud/storage/template/TemplateLocation.java
@@ -37,6 +37,8 @@
 import com.cloud.storage.template.Processor.FormatInfo;
 import com.cloud.utils.NumbersUtil;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class TemplateLocation {
     private static final Logger s_logger = Logger.getLogger(TemplateLocation.class);
     public final static String Filename = "template.properties";
@@ -199,7 +201,7 @@
 
         if (!checkFormatValidity(newInfo)) {
             s_logger.warn("Format is invalid");
-            s_logger.debug("Format: " + newInfo.format + " size: " + newInfo.size + " virtualsize: " + newInfo.virtualSize + " filename: " + newInfo.filename);
+            s_logger.debug("Format: " + newInfo.format + " size: " + toHumanReadableSize(newInfo.size) + " virtualsize: " + toHumanReadableSize(newInfo.virtualSize) + " filename: " + newInfo.filename);
             s_logger.debug("format, filename cannot be null and size, virtual size should be  > 0 ");
             return false;
         }
diff --git a/core/src/main/java/com/cloud/storage/template/VmdkProcessor.java b/core/src/main/java/com/cloud/storage/template/VmdkProcessor.java
index ee50b27..927515f 100644
--- a/core/src/main/java/com/cloud/storage/template/VmdkProcessor.java
+++ b/core/src/main/java/com/cloud/storage/template/VmdkProcessor.java
@@ -37,6 +37,8 @@
 import com.cloud.storage.StorageLayer;
 import com.cloud.utils.component.AdapterBase;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class VmdkProcessor extends AdapterBase implements Processor {
     private static final Logger s_logger = Logger.getLogger(VmdkProcessor.class);
 
@@ -114,7 +116,7 @@
             throw new InternalErrorException(msg);
         }
 
-        s_logger.debug("vmdk file had size="+virtualSize);
+        s_logger.debug("vmdk file had size=" + toHumanReadableSize(virtualSize));
         return virtualSize;
     }
 
diff --git a/core/src/main/java/org/apache/cloudstack/storage/command/CheckDataStoreStoragePolicyComplainceCommand.java b/core/src/main/java/org/apache/cloudstack/storage/command/CheckDataStoreStoragePolicyComplainceCommand.java
new file mode 100644
index 0000000..f9544b8
--- /dev/null
+++ b/core/src/main/java/org/apache/cloudstack/storage/command/CheckDataStoreStoragePolicyComplainceCommand.java
@@ -0,0 +1,61 @@
+//
+// 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.command;
+
+import com.cloud.agent.api.to.StorageFilerTO;
+
+public class CheckDataStoreStoragePolicyComplainceCommand extends StorageSubSystemCommand {
+
+    String storagePolicyId;
+    private StorageFilerTO storagePool;
+
+    public CheckDataStoreStoragePolicyComplainceCommand(String storagePolicyId, StorageFilerTO storagePool) {
+        super();
+
+        this.storagePolicyId = storagePolicyId;
+        this.storagePool = storagePool;
+    }
+
+    @Override
+    public void setExecuteInSequence(boolean inSeq) {
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        return false;
+    }
+
+
+    public String getStoragePolicyId() {
+        return storagePolicyId;
+    }
+
+    public void setStoragePolicyId(String storagePolicyId) {
+        this.storagePolicyId = storagePolicyId;
+    }
+
+    public StorageFilerTO getStoragePool() {
+        return storagePool;
+    }
+
+    public void setStoragePool(StorageFilerTO storagePool) {
+        this.storagePool = storagePool;
+    }
+}
diff --git a/core/src/main/java/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java b/core/src/main/java/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java
index 965d303..6cba5f2 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommand.java
@@ -55,7 +55,7 @@
 
     private long accountId;
 
-    private Integer nfsVersion;
+    private String nfsVersion;
 
     public TemplateOrVolumePostUploadCommand(long entityId, String entityUUID, String absolutePath, String checksum, String type, String name, String imageFormat, String dataTo,
             String dataToRole) {
@@ -201,11 +201,11 @@
         return accountId;
     }
 
-    public Integer getNfsVersion() {
+    public String getNfsVersion() {
         return nfsVersion;
     }
 
-    public void setNfsVersion(Integer nfsVersion) {
+    public void setNfsVersion(String nfsVersion) {
         this.nfsVersion = nfsVersion;
     }
 
diff --git a/core/src/main/java/org/apache/cloudstack/storage/command/UploadStatusAnswer.java b/core/src/main/java/org/apache/cloudstack/storage/command/UploadStatusAnswer.java
index 1825b5a..5c880c3 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/command/UploadStatusAnswer.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/command/UploadStatusAnswer.java
@@ -20,6 +20,7 @@
 package org.apache.cloudstack.storage.command;
 
 import com.cloud.agent.api.Answer;
+import com.cloud.utils.Pair;
 
 public class UploadStatusAnswer extends Answer {
     public static enum UploadStatus {
@@ -31,6 +32,8 @@
     private long physicalSize = 0;
     private String installPath = null;
     private int downloadPercent = 0;
+    private Pair<String, String> guestOsInfo;
+    private String minimumHardwareVersion;
 
     protected UploadStatusAnswer() {
     }
@@ -85,4 +88,20 @@
     public void setDownloadPercent(int downloadPercent) {
         this.downloadPercent = downloadPercent;
     }
+
+    public Pair<String, String> getGuestOsInfo() {
+        return guestOsInfo;
+    }
+
+    public void setGuestOsInfo(Pair<String, String> guestOsInfo) {
+        this.guestOsInfo = guestOsInfo;
+    }
+
+    public void setMinimumHardwareVersion(String minimumHardwareVersion) {
+        this.minimumHardwareVersion = minimumHardwareVersion;
+    }
+
+    public String getMinimumHardwareVersion() {
+        return minimumHardwareVersion;
+    }
 }
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 1572efe..7dab8d9 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
@@ -39,7 +39,7 @@
     public static final String REMOVE_AFTER_COPY = PrimaryDataStore.REMOVE_AFTER_COPY;
     public static final String VOLUME_SIZE = PrimaryDataStore.VOLUME_SIZE;
 
-    private final String uuid;
+    private String uuid;
     private final String name;
     private String type;
     private final long id;
@@ -75,6 +75,10 @@
         return this.uuid;
     }
 
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
     @Override
     public String getUrl() {
         return this.url;
diff --git a/core/src/main/java/org/apache/cloudstack/storage/to/TemplateObjectTO.java b/core/src/main/java/org/apache/cloudstack/storage/to/TemplateObjectTO.java
index cc2eaad..b184a74 100644
--- a/core/src/main/java/org/apache/cloudstack/storage/to/TemplateObjectTO.java
+++ b/core/src/main/java/org/apache/cloudstack/storage/to/TemplateObjectTO.java
@@ -47,6 +47,8 @@
     private boolean bootable;
     private String uniqueName;
     private boolean directDownload;
+    private boolean deployAsIs;
+    private String deployAsIsConfiguration;
 
     public TemplateObjectTO() {
 
@@ -82,6 +84,8 @@
             this.imageDataStore = template.getDataStore().getTO();
         }
         this.hypervisorType = template.getHypervisorType();
+        this.deployAsIs = template.isDeployAsIs();
+        this.deployAsIsConfiguration = template.getDeployAsIsConfiguration();
     }
 
     @Override
@@ -244,6 +248,18 @@
         this.directDownload = directDownload;
     }
 
+    public boolean isDeployAsIs() {
+        return deployAsIs;
+    }
+
+    public String getDeployAsIsConfiguration() {
+        return deployAsIsConfiguration;
+    }
+
+    public void setDeployAsIsConfiguration(String deployAsIsConfiguration) {
+        this.deployAsIsConfiguration = deployAsIsConfiguration;
+    }
+
     @Override
     public String toString() {
         return new StringBuilder("TemplateTO[id=").append(id).append("|origUrl=").append(origUrl).append("|name").append(name).append("]").toString();
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 e47d13e..6cd27b1 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
@@ -62,6 +62,9 @@
     private Hypervisor.HypervisorType hypervisorType;
     private MigrationOptions migrationOptions;
     private boolean directDownload;
+    private boolean deployAsIs;
+    private String updatedDataStoreUUID;
+    private String vSphereStoragePolicyId;
 
     public VolumeObjectTO() {
 
@@ -102,6 +105,8 @@
         setDeviceId(volume.getDeviceId());
         this.migrationOptions = volume.getMigrationOptions();
         this.directDownload = volume.isDirectDownload();
+        this.deployAsIs = volume.isDeployAsIs();
+        this.vSphereStoragePolicyId = volume.getvSphereStoragePolicyId();
     }
 
     public String getUuid() {
@@ -313,4 +318,24 @@
     public boolean isDirectDownload() {
         return directDownload;
     }
+
+    public boolean isDeployAsIs() {
+        return deployAsIs;
+    }
+
+    public String getUpdatedDataStoreUUID() {
+        return updatedDataStoreUUID;
+    }
+
+    public void setUpdatedDataStoreUUID(String updatedDataStoreUUID) {
+        this.updatedDataStoreUUID = updatedDataStoreUUID;
+    }
+
+    public String getvSphereStoragePolicyId() {
+        return vSphereStoragePolicyId;
+    }
+
+    public void setvSphereStoragePolicyId(String vSphereStoragePolicyId) {
+        this.vSphereStoragePolicyId = vSphereStoragePolicyId;
+    }
 }
diff --git a/core/src/test/java/com/cloud/agent/api/storage/DownloadAnswerTest.java b/core/src/test/java/com/cloud/agent/api/storage/DownloadAnswerTest.java
new file mode 100644
index 0000000..ded45f8
--- /dev/null
+++ b/core/src/test/java/com/cloud/agent/api/storage/DownloadAnswerTest.java
@@ -0,0 +1,62 @@
+// 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.storage;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.to.OVFInformationTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.serializer.GsonHelper;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.google.gson.Gson;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DownloadAnswerTest {
+    Gson gson = GsonHelper.getGson();
+
+    VMTemplateStorageResourceAssoc.Status status = VMTemplateStorageResourceAssoc.Status.DOWNLOADED;
+    DownloadAnswer answer = new DownloadAnswer("nothin wrong", status);
+
+    @Test
+    public void redeserialise ()
+    {
+        String json = gson.toJson(answer);
+        DownloadAnswer received = gson.fromJson(json, DownloadAnswer.class);
+        Assert.assertEquals(received,answer);
+    }
+    @Test
+    public void properties ()
+    {
+        List<OVFPropertyTO> properties = new ArrayList<>();
+        properties.add(new OVFPropertyTO());
+        List<OVFNetworkTO> networks = new ArrayList<>();
+        networks.add(new OVFNetworkTO());
+
+        OVFInformationTO informationTO = new OVFInformationTO();
+        informationTO.setProperties(properties);
+        informationTO.setNetworks(networks);
+        answer.setOvfInformationTO(informationTO);
+
+        String json = gson.toJson(answer);
+        Answer received = gson.fromJson(json, Answer.class);
+        Assert.assertEquals(received,answer);
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java b/core/src/test/java/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
index edc90aa..4bdef10 100644
--- a/core/src/test/java/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
+++ b/core/src/test/java/org/apache/cloudstack/api/agent/test/BackupSnapshotCommandTest.java
@@ -138,6 +138,11 @@
         public boolean isManaged() { return false; }
 
         @Override
+        public Long getParent() {
+            return 0L;
+        }
+
+        @Override
         public Long getPodId() {
             return 0L;
         }
diff --git a/core/src/test/java/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java b/core/src/test/java/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java
index 4d49c99..8b25501 100644
--- a/core/src/test/java/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java
+++ b/core/src/test/java/org/apache/cloudstack/api/agent/test/CheckNetworkAnswerTest.java
@@ -177,6 +177,11 @@
             public boolean isManaged() { return false; }
 
             @Override
+            public Long getParent() {
+                return 0L;
+            }
+
+            @Override
             public Long getPodId() {
                 return 0L;
             }
diff --git a/core/src/test/java/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java b/core/src/test/java/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
index 576419a..e134a94 100644
--- a/core/src/test/java/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
+++ b/core/src/test/java/org/apache/cloudstack/api/agent/test/SnapshotCommandTest.java
@@ -139,6 +139,11 @@
         public boolean isManaged() { return false; }
 
         @Override
+        public Long getParent() {
+            return 0L;
+        }
+
+        @Override
         public Long getPodId() {
             return 0L;
         }
diff --git a/debian/changelog b/debian/changelog
index b92b686..e6f2333 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,30 +1,30 @@
-cloudstack (4.14.2.0-SNAPSHOT) unstable; urgency=low
+cloudstack (4.15.1.0-SNAPSHOT) unstable; urgency=low
 
-  * Update the version to 4.14.2.0-SNAPSHOT
+  * Update the version to 4.15.1.0-SNAPSHOT
 
- -- the Apache CloudStack project <dev@cloudstack.apache.org>  Tue, 2 Mar 2021 15:03:14 +0100
+ -- the Apache CloudStack project <dev@cloudstack.apache.org>  Tue, 11 Jan 2021 10:51:02 +0000
 
-cloudstack (4.14.1.0) unstable; urgency=low
+cloudstack (4.15.0.0) unstable; urgency=low
 
-  * Update the version to 4.14.1.0
+  * Update the version to 4.15.0.0
 
- -- the Apache CloudStack project <dev@cloudstack.apache.org>  Mon, 08 Feb 2021 16:24:09 +0530
+ -- the Apache CloudStack project <dev@cloudstack.apache.org>  Wed, 23 Dec 2020 16:32:25 +0000
 
-cloudstack (4.14.1.0-SNAPSHOT) unstable; urgency=low
+cloudstack (4.15.0.0-SNAPSHOT) unstable; urgency=low
 
-  * Update the version to 4.14.1.0-SNAPSHOT
+  * Update the version to 4.15.0.0-SNAPSHOT
 
  -- the Apache CloudStack project <dev@cloudstack.apache.org>  Mon, 11 May 2020 15:03:14 +0100
 
-cloudstack (4.14.1.0-SNAPSHOT-SNAPSHOT) unstable; urgency=low
+cloudstack (4.15.0.0-SNAPSHOT-SNAPSHOT) unstable; urgency=low
 
-  * Update the version to 4.14.1.0-SNAPSHOT-SNAPSHOT
+  * Update the version to 4.15.0.0-SNAPSHOT-SNAPSHOT
 
  -- the Apache CloudStack project <dev@cloudstack.apache.org>  Thu, 14 Mar 2019 10:11:46 -0300
 
-cloudstack (4.14.1.0-SNAPSHOT-SNAPSHOT-SNAPSHOT) unstable; urgency=low
+cloudstack (4.15.0.0-SNAPSHOT-SNAPSHOT-SNAPSHOT) unstable; urgency=low
 
-  * Update the version to 4.14.1.0-SNAPSHOT-SNAPSHOT-SNAPSHOT
+  * Update the version to 4.15.0.0-SNAPSHOT-SNAPSHOT-SNAPSHOT
 
  -- the Apache CloudStack project <dev@cloudstack.apache.org>  Mon, 15 Jan 2018 17:42:30 +0530
 
diff --git a/debian/cloudstack-agent.install b/debian/cloudstack-agent.install
index 60f4237..58715e0 100644
--- a/debian/cloudstack-agent.install
+++ b/debian/cloudstack-agent.install
@@ -24,5 +24,6 @@
 /usr/bin/cloudstack-setup-agent
 /usr/bin/cloudstack-ssh
 /usr/bin/cloudstack-agent-upgrade
+/usr/bin/cloudstack-guest-tool
 /usr/share/cloudstack-agent/lib/*
 /usr/share/cloudstack-agent/plugins
diff --git a/debian/cloudstack-common.postinst b/debian/cloudstack-common.postinst
new file mode 100644
index 0000000..360f3bd
--- /dev/null
+++ b/debian/cloudstack-common.postinst
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+# 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.
+
+set -e
+CLOUDUTILS_DIR="/usr/share/pyshared/"
+DIST_DIR=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")
+
+if which pycompile >/dev/null 2>&1; then
+    pycompile -p cloudstack-common
+fi
+
+if which pycompile >/dev/null 2>&1; then
+    pycompile -p cloudstack-common /usr/share/cloudstack-common
+fi
+
+cp $CLOUDUTILS_DIR/cloud_utils.py $DIST_DIR
+cp -R $CLOUDUTILS_DIR/cloudutils $DIST_DIR
+python3 -m py_compile $DIST_DIR/cloud_utils.py
+python3 -m compileall $DIST_DIR/cloudutils
\ No newline at end of file
diff --git a/debian/cloudstack-management.install b/debian/cloudstack-management.install
index 289a495..e637541 100644
--- a/debian/cloudstack-management.install
+++ b/debian/cloudstack-management.install
@@ -21,6 +21,7 @@
 /etc/cloudstack/management/server.properties
 /etc/cloudstack/management/java.security.ciphers
 /etc/cloudstack/management/log4j-cloud.xml
+/etc/cloudstack/management/config.json
 /etc/default/cloudstack-management
 /etc/security/limits.d/cloudstack-limits.conf
 /etc/sudoers.d/cloudstack
diff --git a/debian/cloudstack-ui.install b/debian/cloudstack-ui.install
new file mode 100644
index 0000000..391c7b5
--- /dev/null
+++ b/debian/cloudstack-ui.install
@@ -0,0 +1,19 @@
+# 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.
+
+/etc/cloudstack/ui/config.json
+/usr/share/cloudstack-ui/*
diff --git a/debian/cloudstack-usage.postinst b/debian/cloudstack-usage.postinst
index e51a305..61fac83 100755
--- a/debian/cloudstack-usage.postinst
+++ b/debian/cloudstack-usage.postinst
@@ -24,6 +24,7 @@
      
         # Linking usage server db.properties to management server db.properties
         if [ -f "/etc/cloudstack/management/db.properties" ]; then
+            echo "Replacing usage server's db.properties with a link to the management server's db.properties"
             rm -f /etc/cloudstack/usage/db.properties
             ln -s /etc/cloudstack/management/db.properties /etc/cloudstack/usage/db.properties
         fi
@@ -35,6 +36,7 @@
 
         # Replacing key with management server key
         if [ -f "/etc/cloudstack/management/key" ]; then
+            echo "Replacing usage server's key with a link to the management server's key"
             rm -f /etc/cloudstack/usage/key
             ln -s /etc/cloudstack/management/key /etc/cloudstack/usage/key
         fi
diff --git a/debian/control b/debian/control
index 91c5ed6..15d3fb5 100644
--- a/debian/control
+++ b/debian/control
@@ -3,26 +3,26 @@
 Priority: extra
 Maintainer: Wido den Hollander <wido@widodh.nl>
 Build-Depends: debhelper (>= 9), openjdk-11-jdk | java11-sdk | java11-jdk | zulu-11, genisoimage,
- python-mysql.connector, maven (>= 3) | maven3, python (>= 2.7), python3 (>= 3), lsb-release, dh-systemd, python-setuptools
+ python-mysql.connector | python3-mysql.connector, maven (>= 3) | maven3, python (>= 2.7), python3 (>= 3), nodejs (>= 12), lsb-release, dh-systemd, python-setuptools
 Standards-Version: 3.8.1
 Homepage: http://www.cloudstack.org/
 
 Package: cloudstack-common
 Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, genisoimage, nfs-common
+Depends: ${misc:Depends}, ${python3:Depends}, genisoimage, nfs-common, python3-pip, python3-distutils | python3-distutils-extra, python3-netaddr, uuid-runtime
 Conflicts: cloud-scripts, cloud-utils, cloud-system-iso, cloud-console-proxy, cloud-daemonize, cloud-deps, cloud-python, cloud-setup
 Description: A common package which contains files which are shared by several CloudStack packages
 
 Package: cloudstack-management
 Architecture: all
-Depends: ${python:Depends}, openjdk-11-jre-headless | java11-runtime-headless | java11-runtime | openjdk-11-jre-headless | zulu-11, cloudstack-common (= ${source:Version}), sudo, python-mysql.connector, augeas-tools, mysql-client | mariadb-client, adduser, bzip2, ipmitool, file, gawk, iproute2, qemu-utils, python-dnspython, lsb-release, init-system-helpers (>= 1.14~)
+Depends: ${python3:Depends}, openjdk-11-jre-headless | java11-runtime-headless | java11-runtime | openjdk-11-jre-headless | zulu-11, cloudstack-common (= ${source:Version}), sudo, python3-mysql.connector, augeas-tools, mysql-client | mariadb-client, adduser, bzip2, ipmitool, file, gawk, iproute2, qemu-utils, python3-dnspython, lsb-release, init-system-helpers (>= 1.14~), python3-setuptools
 Conflicts: cloud-server, cloud-client, cloud-client-ui
 Description: CloudStack server library
  The CloudStack management server
 
 Package: cloudstack-agent
 Architecture: all
-Depends: ${python:Depends}, openjdk-11-jre-headless | java11-runtime-headless | java11-runtime | openjdk-11-jre-headless | zulu-11, cloudstack-common (= ${source:Version}), lsb-base (>= 9), openssh-client, qemu-kvm (>= 2.5), libvirt-bin (>= 1.3) | libvirt-daemon-system (>= 3.0), uuid-runtime, iproute2, ebtables, vlan, ipset, python3-libvirt, ethtool, iptables, lsb-release, aria2
+Depends: ${python:Depends}, ${python3:Depends}, openjdk-11-jre-headless | java11-runtime-headless | java11-runtime | openjdk-11-jre-headless | zulu-11, cloudstack-common (= ${source:Version}), lsb-base (>= 9), openssh-client, qemu-kvm (>= 2.5), libvirt-bin (>= 1.3) | libvirt-daemon-system (>= 3.0), iproute2, ebtables, vlan, ipset, python3-libvirt, ethtool, iptables, lsb-release, aria2, ufw, apparmor
 Recommends: init-system-helpers
 Conflicts: cloud-agent, cloud-agent-libs, cloud-agent-deps, cloud-agent-scripts
 Description: CloudStack agent
@@ -37,6 +37,11 @@
  The CloudStack usage monitor provides usage accounting across the entire cloud for
  cloud operators to charge based on usage parameters.
 
+Package: cloudstack-ui
+Architecture: all
+Depends: ${misc:Depends}
+Description: The CloudStack UI
+
 Package: cloudstack-docs
 Architecture: all
 Depends: ${misc:Depends}
diff --git a/debian/rules b/debian/rules
index 408a255..de45255 100755
--- a/debian/rules
+++ b/debian/rules
@@ -6,7 +6,7 @@
 DESTDIR = "debian/tmp"
 
 %:
-	dh $@ --with python2,systemd
+	dh $@ --with systemd
 
 override_dh_auto_configure:
 	cp packaging/debian/replace.properties replace.properties.tmp
@@ -93,6 +93,20 @@
 	install -m0644 packaging/systemd/$(PACKAGE)-management.service debian/$(PACKAGE)-management/lib/systemd/system/$(PACKAGE)-management.service
 	install -m0644 packaging/systemd/$(PACKAGE)-management.default $(DESTDIR)/$(SYSCONFDIR)/default/$(PACKAGE)-management
 
+	# cloudstack-ui
+	mkdir $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/ui
+	mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-ui
+	cd ui && npm install && npm run build && cd ..
+	cp -r ui/dist/config.json $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/ui/
+	cp -r ui/dist/* $(DESTDIR)/usr/share/$(PACKAGE)-ui/
+	rm -f $(DESTDIR)/usr/share/$(PACKAGE)-ui/config.json
+	ln -s /$(SYSCONFDIR)/$(PACKAGE)/ui/config.json $(DESTDIR)/usr/share/$(PACKAGE)-ui/config.json
+	# copy ui to cloudstack-management
+	cp -r ui/dist/config.json $(DESTDIR)/$(SYSCONFDIR)/$(PACKAGE)/management/
+	cp -r ui/dist/* $(DESTDIR)/usr/share/$(PACKAGE)-management/webapp/
+	rm -f $(DESTDIR)/usr/share/$(PACKAGE)-management/webapp/config.json
+	ln -s /$(SYSCONFDIR)/$(PACKAGE)/management/config.json $(DESTDIR)/usr/share/$(PACKAGE)-management/webapp/config.json
+
 	# cloudstack-common
 	mkdir -p $(DESTDIR)/usr/share/$(PACKAGE)-common
 	mkdir $(DESTDIR)/usr/share/$(PACKAGE)-common/scripts
diff --git a/deps/install-non-oss.sh b/deps/install-non-oss.sh
index a387050..c6b91e0 100755
--- a/deps/install-non-oss.sh
+++ b/deps/install-non-oss.sh
@@ -39,3 +39,9 @@
 
 # From https://my.vmware.com/group/vmware/details?downloadGroup=WEBCLIENTSDK67U2&productId=742
 mvn install:install-file -Dfile=vim25_67.jar        -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim25    -Dversion=6.7   -Dpackaging=jar
+
+# From https://my.vmware.com/group/vmware/get-download?downloadGroup=VS-MGMT-SDK65
+mvn install:install-file -Dfile=pbm_65.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-pbm -Dversion=6.5 -Dpackaging=jar
+
+# From https://my.vmware.com/group/vmware/downloads/get-download?downloadGroup=VS-MGMT-SDK67
+mvn install:install-file -Dfile=pbm_67.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-pbm -Dversion=6.7 -Dpackaging=jar
diff --git a/developer/pom.xml b/developer/pom.xml
index 382eeb3..df1be35 100644
--- a/developer/pom.xml
+++ b/developer/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/engine/api/pom.xml b/engine/api/pom.xml
index 5b6a043..d2474f8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/api/src/main/java/com/cloud/vm/VirtualMachineGuru.java b/engine/api/src/main/java/com/cloud/vm/VirtualMachineGuru.java
index 9c3f421..d6d123c 100644
--- a/engine/api/src/main/java/com/cloud/vm/VirtualMachineGuru.java
+++ b/engine/api/src/main/java/com/cloud/vm/VirtualMachineGuru.java
@@ -58,4 +58,6 @@
      * @return
      */
     void prepareStop(VirtualMachineProfile profile);
+
+    void finalizeUnmanage(VirtualMachine vm);
 }
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 1921e51..49b13e1 100644
--- a/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/main/java/com/cloud/vm/VirtualMachineManager.java
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.ConfigKey;
 
 import com.cloud.agent.api.to.NicTO;
@@ -41,6 +42,7 @@
 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;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -62,6 +64,28 @@
     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);
 
+    ConfigKey<Boolean> AllowExposeHypervisorHostnameAccountLevel = new ConfigKey<Boolean>("Advanced", Boolean.class, "account.allow.expose.host.hostname",
+            "false", "If set to true, it allows the hypervisor host name on which the VM is spawned on to be exposed to the VM", true, ConfigKey.Scope.Account);
+
+    ConfigKey<Boolean> AllowExposeHypervisorHostname = new ConfigKey<Boolean>("Advanced", Boolean.class, "global.allow.expose.host.hostname",
+            "false", "If set to true, it allows the hypervisor host name on which the VM is spawned on to be exposed to the VM", true, ConfigKey.Scope.Global);
+
+    static final ConfigKey<Integer> VmServiceOfferingMaxCPUCores = new ConfigKey<Integer>("Advanced",
+            Integer.class,
+            "vm.serviceoffering.cpu.cores.max",
+            "0",
+            "Maximum CPU cores for vm service offering. If 0 - no limitation",
+            true
+    );
+
+    static final ConfigKey<Integer> VmServiceOfferingMaxRAMSize = new ConfigKey<Integer>("Advanced",
+            Integer.class,
+            "vm.serviceoffering.ram.size.max",
+            "0",
+            "Maximum RAM size in MB for vm service offering. If 0 - no limitation",
+            true
+    );
+
     interface Topics {
         String VM_POWER_STATE = "vm.powerstate";
     }
@@ -179,6 +203,8 @@
      */
     boolean removeNicFromVm(VirtualMachine vm, Nic nic) throws ConcurrentOperationException, ResourceUnavailableException;
 
+    Boolean updateDefaultNicForVM(VirtualMachine vm, Nic nic, Nic defaultNic);
+
     /**
      * @param vm
      * @param network
@@ -208,12 +234,25 @@
     VirtualMachine reConfigureVm(String vmUuid, ServiceOffering oldServiceOffering, ServiceOffering newServiceOffering, Map<String, String> customParameters, boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException,
             InsufficientServerCapacityException;
 
-    void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException,
+    void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, Map<String, String> customParameters, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException;
 
     void migrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long newSvcOfferingId) throws ResourceUnavailableException, ConcurrentOperationException;
 
     boolean getExecuteInSequence(HypervisorType hypervisorType);
 
+    static String getHypervisorHostname(String name) {
+        final Account caller = CallContext.current().getCallingAccount();
+        String destHostname = (AllowExposeHypervisorHostname.value() && AllowExposeHypervisorHostnameAccountLevel.valueIn(caller.getId())) ? name : null;
+        return destHostname;
+    }
+
+    /**
+     * Unmanage a VM from CloudStack:
+     * - Remove the references of the VM and its volumes, nics, IPs from database
+     * - Keep the VM as it is on the hypervisor
+     */
+    boolean unmanage(String vmUuid);
+
     UserVm restoreVirtualMachine(long vmId, Long newTemplateId) throws ResourceUnavailableException, InsufficientCapacityException;
 }
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 183606d..06c3a94 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
@@ -294,6 +294,16 @@
 
     void finalizeUpdateInSequence(Network network, boolean success);
 
+    /**
+     * Adds hypervisor hostname to a file - hypervisor-host-name if the userdata
+     * service provider is ConfigDrive or VirtualRouter
+     * @param vm holds the details of the Virtual Machine
+     * @param dest holds information of the destination
+     * @param migrationSuccessful
+     * @throws ResourceUnavailableException in case Datastore or agent to which a command is to be sent is unavailable
+     */
+    void setHypervisorHostname(VirtualMachineProfile vm, DeployDestination dest, boolean migrationSuccessful) throws ResourceUnavailableException;
+
     List<NetworkGuru> getNetworkGurus();
 
     /**
@@ -317,5 +327,7 @@
      */
     void cleanupNicDhcpDnsEntry(Network network, VirtualMachineProfile vmProfile, NicProfile nicProfile);
 
-    Pair<NicProfile, Integer> importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException;
+    Pair<NicProfile, Integer> importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses, boolean forced) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException;
+
+    void unmanageNics(VirtualMachineProfile vm);
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/StorageOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/StorageOrchestrationService.java
new file mode 100644
index 0000000..7bf845d
--- /dev/null
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/StorageOrchestrationService.java
@@ -0,0 +1,27 @@
+// 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.engine.orchestration.service;
+
+import java.util.List;
+
+import org.apache.cloudstack.api.response.MigrationResponse;
+import org.apache.cloudstack.storage.ImageStoreService.MigrationPolicy;
+
+public interface StorageOrchestrationService {
+    MigrationResponse migrateData(Long srcDataStoreId, List<Long> destDatastores, MigrationPolicy migrationPolicy);
+}
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 a769a34..44e993f 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
@@ -18,6 +18,7 @@
  */
 package org.apache.cloudstack.engine.orchestration.service;
 
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -84,6 +85,8 @@
 
     String getVmNameOnVolume(Volume volume);
 
+    StoragePool findChildDataStoreInDataStoreCluster(DataCenter dc, Pod pod, Long clusterId, Long hostId, VirtualMachine vm, Long datastoreClusterId);
+
     VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, UserVm vm) throws StorageUnavailableException;
 
     Volume migrateVolume(Volume volume, StoragePool destPool) throws StorageUnavailableException;
@@ -117,8 +120,11 @@
 
     boolean canVmRestartOnAnotherServer(long vmId);
 
-    DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm,
-        Account owner);
+    /**
+     * Allocate a volume or multiple volumes in case of template is registered with the 'deploy-as-is' option, allowing multiple disks
+     */
+    List<DiskProfile> allocateTemplatedVolumes(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm,
+                                               Account owner);
 
     String getVmNameFromVolumeId(long volumeId);
 
@@ -128,7 +134,7 @@
 
     StoragePool findStoragePool(DiskProfile dskCh, DataCenter dc, Pod pod, Long clusterId, Long hostId, VirtualMachine vm, Set<StoragePool> avoid);
 
-    void updateVolumeDiskChain(long volumeId, String path, String chainInfo);
+    void updateVolumeDiskChain(long volumeId, String path, String chainInfo, String updatedDataStoreUUID);
 
     /**
      * Imports an existing volume for a VM into database. Useful while ingesting an unmanaged VM.
@@ -149,4 +155,9 @@
      */
     DiskProfile importVolume(Type type, String name, DiskOffering offering, Long size, Long minIops, Long maxIops, VirtualMachine vm, VirtualMachineTemplate template,
                              Account owner, Long deviceId, Long poolId, String path, String chainInfo);
+
+    /**
+     * Unmanage VM volumes
+     */
+    void unmanageVolumes(long vmId);
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/service/api/OrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/service/api/OrchestrationService.java
index 5a18b3c..82c3dd1 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/service/api/OrchestrationService.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/service/api/OrchestrationService.java
@@ -55,7 +55,7 @@
      * @param memory memory to allocate in bytes
      * @param computeTags tags for the compute
      * @param rootDiskTags tags for the root disk
-     * @param networks networks that this VM should join
+     * @param networkNicMap map networks to nic profiles that this VM should join
      * @param rootDiskSize size the root disk in case of templates.
      * @return VirtualMachineEntity
      */
@@ -65,7 +65,7 @@
         @QueryParam("host-name") String hostName, @QueryParam("display-name") String displayName, @QueryParam("hypervisor") String hypervisor,
         @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, @QueryParam("disk-size") Long diskSize,
         @QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
-        @QueryParam("network-nic-map") Map<String, NicProfile> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan,
+        @QueryParam("network-nic-map") Map<String, List<NicProfile>> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan,
         @QueryParam("root-disk-size") Long rootDiskSize, @QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap,
         @QueryParam("datadisktemplate-diskoffering-map") Map<Long, DiskOffering> datadiskTemplateToDiskOfferingMap) throws InsufficientCapacityException;
 
@@ -74,7 +74,7 @@
         @QueryParam("host-name") String hostName, @QueryParam("display-name") String displayName, @QueryParam("hypervisor") String hypervisor,
         @QueryParam("os") String os, @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, @QueryParam("disk-size") Long diskSize,
         @QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
-        @QueryParam("network-nic-map") Map<String, NicProfile> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan, @QueryParam("extra-dhcp-option-map") Map<String,  Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException;
+        @QueryParam("network-nic-map") Map<String, List<NicProfile>> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan, @QueryParam("extra-dhcp-option-map") Map<String,  Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException;
 
     @POST
     NetworkEntity createNetwork(String id, String name, String domainName, String cidr, String gateway);
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
index ad5b162..80e3ce1 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java
@@ -33,10 +33,16 @@
 
     List<DataStore> getImageStoresByScope(ZoneScope scope);
 
+    List<DataStore> getImageStoresByScopeExcludingReadOnly(ZoneScope scope);
+
     DataStore getRandomImageStore(long zoneId);
 
+    DataStore getRandomUsableImageStore(long zoneId);
+
     DataStore getImageStoreWithFreeCapacity(long zoneId);
 
+    DataStore getImageStoreWithFreeCapacity(List<DataStore> imageStores);
+
     List<DataStore> listImageStoresWithFreeCapacity(long zoneId);
 
     List<DataStore> getImageCacheStores(Scope scope);
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
index 0613a11..ec27250 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/EndPointSelector.java
@@ -33,6 +33,8 @@
 
     List<EndPoint> selectAll(DataStore store);
 
+    List<EndPoint> findAllEndpointsForScope(DataStore store);
+
     EndPoint select(Scope scope, Long storeId);
 
     EndPoint select(DataStore store, String downloadUrl);
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/ObjectInDataStoreStateMachine.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/ObjectInDataStoreStateMachine.java
index 204cab0..611d124 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/ObjectInDataStoreStateMachine.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/ObjectInDataStoreStateMachine.java
@@ -29,6 +29,7 @@
         Ready("Template downloading is accomplished"),
         Copying("The object is being coping"),
         Migrating("The object is being migrated"),
+        Migrated("The object has been migrated"),
         Destroying("Template is destroying"),
         Destroyed("Template is destroyed"),
         Failed("Failed to download template");
@@ -49,12 +50,16 @@
         DestroyRequested,
         OperationSuccessed,
         OperationFailed,
+        CopyRequested,
         CopyingRequested,
         MigrationRequested,
+        MigrationSucceeded,
+        MigrationFailed,
         MigrationCopyRequested,
         MigrationCopySucceeded,
         MigrationCopyFailed,
         ResizeRequested,
-        ExpungeRequested
+        ExpungeRequested,
+        MigrateDataRequested
     }
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java
index a399758..5546571 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStore.java
@@ -23,7 +23,9 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 
 public interface PrimaryDataStore extends DataStore, PrimaryDataStoreInfo {
-    DataObject create(DataObject dataObject, boolean createEntryInTempSpoolRef);
+    DataObject create(DataObject dataObject, String configuration);
+
+    DataObject create(DataObject dataObject, boolean createEntryInTempSpoolRef, String configuration);
 
     VolumeInfo getVolume(long id);
 
@@ -31,7 +33,7 @@
 
     boolean exists(DataObject data);
 
-    TemplateInfo getTemplate(long templateId);
+    TemplateInfo getTemplate(long templateId, String configuration);
 
     SnapshotInfo getSnapshot(long snapshotId);
 
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
index 7f2f4dc..3e072e8 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
@@ -58,4 +58,6 @@
     Map<String, String> getDetails();
 
     PrimaryDataStoreLifeCycle getLifeCycle();
+
+    Long getParent();
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SecondaryStorageService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SecondaryStorageService.java
new file mode 100644
index 0000000..07828fd
--- /dev/null
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SecondaryStorageService.java
@@ -0,0 +1,43 @@
+// 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.engine.subsystem.api.storage;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.framework.async.AsyncCallFuture;
+import org.apache.cloudstack.storage.command.CommandResult;
+
+import com.cloud.utils.Pair;
+
+public interface SecondaryStorageService {
+    class DataObjectResult extends CommandResult {
+        private final DataObject data;
+
+        public DataObjectResult(DataObject data) {
+            super();
+            this.data = data;
+        }
+
+        public DataObject getData() {
+            return this.data;
+        }
+
+    }
+    AsyncCallFuture<DataObjectResult> migrateData(DataObject srcDataObject, DataStore srcDatastore, DataStore destDatastore, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChain);
+}
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotInfo.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotInfo.java
index ef72afc..58a82ac 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotInfo.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/SnapshotInfo.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import java.util.List;
+
 import com.cloud.storage.Snapshot;
 import com.cloud.utils.exception.CloudRuntimeException;
 
@@ -26,6 +28,8 @@
 
     SnapshotInfo getChild();
 
+    List<SnapshotInfo> getChildren();
+
     VolumeInfo getBaseVolume();
 
     void addPayload(Object data);
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java
index dfdbd8a..c8fcf5f 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/StoragePoolAllocator.java
@@ -29,6 +29,12 @@
  */
 public interface StoragePoolAllocator extends Adapter {
     /**
+     * Overloaded method calls allocateToPool with bypassStorageTypeCheck = false
+     * and returns a list of pools suitable.
+     **/
+    List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo);
+
+    /**
      * Determines which storage pools are suitable for the guest virtual machine
      * and returns a list of pools suitable.
      *
@@ -45,10 +51,14 @@
      * @param ExcludeList
      *            avoid
      * @param int returnUpTo (use -1 to return all possible pools)
+     * @param boolean bypassStorageTypeCheck allows bypassing useLocalStorage check for provided DiskProfile when true
      * @return List<StoragePool> List of storage pools that are suitable for the
      *         VM
      **/
-    List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo);
+    List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck);
+
 
     static int RETURN_UPTO_ALL = -1;
+
+    List<StoragePool> reorderPools(List<StoragePool> pools, VirtualMachineProfile vmProfile, DeploymentPlan plan);
 }
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 b213625..4d258f3 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
@@ -27,7 +27,7 @@
 
     TemplateInfo getReadyTemplateOnImageStore(long templateId, Long zoneId);
 
-    TemplateInfo getTemplate(DataObject obj, DataStore store);
+    TemplateInfo getTemplate(DataObject obj, DataStore store, String configuration);
 
     TemplateInfo getTemplate(long templateId, DataStoreRole storeRole);
 
@@ -40,4 +40,6 @@
     TemplateInfo getReadyBypassedTemplateOnPrimaryStore(long templateId, 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 0f7cc6f..1e4a1b7 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
@@ -27,4 +27,8 @@
     String getInstallPath();
 
     boolean isDirectDownload();
+
+    boolean isDeployAsIs();
+
+    String getDeployAsIsConfiguration();
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
index f70a781..df13f95 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java
@@ -18,6 +18,7 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
+import com.cloud.agent.api.to.DatadiskTO;
 import org.apache.cloudstack.framework.async.AsyncCallFuture;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.storage.command.CommandResult;
@@ -25,6 +26,8 @@
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.StoragePool;
 
+import java.util.List;
+
 public interface TemplateService {
 
     class TemplateApiResult extends CommandResult {
@@ -47,7 +50,7 @@
 
     AsyncCallFuture<TemplateApiResult> createTemplateFromVolumeAsync(VolumeInfo volume, TemplateInfo template, DataStore store);
 
-    boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate);
+    boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate, boolean deployAsIs);
 
     AsyncCallFuture<TemplateApiResult> deleteTemplateAsync(TemplateInfo template);
 
@@ -72,4 +75,6 @@
     void associateCrosszoneTemplatesToZone(long dcId);
 
     AsyncCallFuture<TemplateApiResult> createDatadiskTemplateAsync(TemplateInfo parentTemplate, TemplateInfo dataDiskTemplate, String path, String diskId, long fileSize, boolean bootable);
+
+    List<DatadiskTO> getTemplateDatadisksOnImageStore(TemplateInfo templateInfo, String configurationId);
 }
diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
index 38f633a..a009a94 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/engine/subsystem/api/storage/VMSnapshotStrategy.java
@@ -35,5 +35,5 @@
      * @param vmSnapshot vm snapshot to be marked as deleted.
      * @return true if vm snapshot removed from DB, false if not.
      */
-    boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot);
+    boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage);
 }
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 f4a7381..b138122 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
@@ -83,4 +83,10 @@
     boolean isDirectDownload();
 
     void setDirectDownload(boolean directDownload);
+
+    boolean isDeployAsIs();
+
+    String getDeployAsIsConfiguration();
+
+    public String getvSphereStoragePolicyId();
 }
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 c56fef7..e8b533d 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
@@ -93,4 +93,6 @@
     SnapshotInfo takeSnapshot(VolumeInfo volume);
 
     VolumeInfo updateHypervisorSnapshotReserveForVolume(DiskOffering diskOffering, long volumeId, HypervisorType hyperType);
+
+    void unmanageVolume(long volumeId);
 }
\ No newline at end of file
diff --git a/engine/api/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java b/engine/api/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java
index 5a0be95..88d908d 100644
--- a/engine/api/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java
+++ b/engine/api/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreEntity.java
@@ -51,7 +51,7 @@
 
     void deleteExtractUrl(String installPath, String url, Upload.Type volume);
 
-    List<DatadiskTO> getDataDiskTemplates(DataObject obj);
+    List<DatadiskTO> getDataDiskTemplates(DataObject obj, String configurationId);
 
     Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, long fileSize, boolean bootable, AsyncCompletionCallback<CreateCmdResult> callback);
 }
diff --git a/engine/components-api/pom.xml b/engine/components-api/pom.xml
index b7f9690..26f22a7 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
index 8827ca4..d23002b 100644
--- a/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
+++ b/engine/components-api/src/main/java/com/cloud/capacity/CapacityManager.java
@@ -76,9 +76,9 @@
                     "If set to true, creates VMs as full clones on ESX hypervisor",
                     true,
                     ConfigKey.Scope.StoragePool);
-    static final ConfigKey<Integer> ImageStoreNFSVersion =
-            new ConfigKey<Integer>(
-                    Integer.class,
+    static final ConfigKey<String> ImageStoreNFSVersion =
+            new ConfigKey<String>(
+                    String.class,
                     "secstorage.nfs.version",
                     "Advanced",
                     null,
diff --git a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
index b583065..ec305fe 100644
--- a/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
+++ b/engine/components-api/src/main/java/com/cloud/event/UsageEventUtils.java
@@ -116,8 +116,8 @@
     }
 
     public static void publishUsageEvent(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType,
-        boolean isSystem, String entityType, String entityUUID) {
-        saveUsageEvent(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem);
+        boolean isSystem, boolean usageHidden, String entityType, String entityUUID) {
+        saveUsageEvent(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem, usageHidden);
         publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
     }
 
@@ -182,8 +182,12 @@
     }
 
     public static void saveUsageEvent(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType,
-        boolean isSystem) {
-        s_usageEventDao.persist(new UsageEventVO(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem));
+        boolean isSystem, boolean usageHidden) {
+        final UsageEventVO usageEventVO = new UsageEventVO(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem);
+        s_usageEventDao.persist(usageEventVO);
+        if (usageHidden) {
+            s_usageEventDao.saveDetails(usageEventVO.getId(), Map.of("hidden", "true"));
+        }
     }
 
     public static void saveUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId,
diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java
index e9f4d9c..b62a8e9 100644
--- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java
+++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java
@@ -206,5 +206,7 @@
     public boolean isIpEqualsGatewayOrNetworkOfferingsEmpty(Network network, String requestedIp);
 
     void releasePodIp(Long id) throws CloudRuntimeException;
+
+    boolean isUsageHidden(IPAddressVO address);
 }
 
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 62a241b..7455f22 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
@@ -112,6 +112,12 @@
     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);
 
+    ConfigKey<Integer>  SecStorageMaxMigrateSessions = new ConfigKey<Integer>("Advanced", Integer.class, "secstorage.max.migrate.sessions", "2",
+            "The max number of concurrent copy command execution sessions that an SSVM can handle", false, ConfigKey.Scope.Global);
+
+    ConfigKey<Integer> MaxDataMigrationWaitTime = new ConfigKey<Integer>("Advanced", Integer.class, "max.data.migration.wait.time", "15",
+            "Maximum wait time for a data migration task before spawning a new SSVM", false, ConfigKey.Scope.Global);
+
     /**
      * Returns a comma separated list of tags for the specified storage pool
      * @param poolId
@@ -206,6 +212,8 @@
 
     boolean storagePoolHasEnoughSpaceForResize(StoragePool pool, long currentSize, long newSiz);
 
+    boolean isStoragePoolComplaintWithStoragePolicy(List<Volume> volumes, StoragePool pool) throws StorageUnavailableException;
+
     boolean registerHostListener(String providerUuid, HypervisorHostListener listener);
 
     void connectHostToSharedPool(long hostId, long poolId) throws StorageUnavailableException, StorageConflictException;
@@ -230,4 +238,6 @@
 
     DiskTO getDiskWithThrottling(DataTO volTO, Volume.Type volumeType, long deviceId, String path, long offeringId, long diskOfferingId);
 
+    boolean isStoragePoolDatastoreClusterParent(StoragePool pool);
+
 }
diff --git a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
index 2dc6296..35fed56 100644
--- a/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
+++ b/engine/components-api/src/main/java/com/cloud/template/TemplateManager.java
@@ -18,7 +18,9 @@
 
 import java.util.List;
 
+import com.cloud.agent.api.to.DatadiskTO;
 import com.cloud.deploy.DeployDestination;
+import com.cloud.storage.DataStoreRole;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -133,4 +135,5 @@
     public static final String MESSAGE_REGISTER_PUBLIC_TEMPLATE_EVENT = "Message.RegisterPublicTemplate.Event";
     public static final String MESSAGE_RESET_TEMPLATE_PERMISSION_EVENT = "Message.ResetTemplatePermission.Event";
 
+    List<DatadiskTO> getTemplateDisksOnImageStore(Long templateId, DataStoreRole role, String configurationId);
 }
diff --git a/engine/network/pom.xml b/engine/network/pom.xml
index 39b4c61..e8888c7 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml
index 5111794..846d48e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java
index 6bfc3de..f69f54c 100644
--- a/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/AgentManagerImpl.java
@@ -38,6 +38,7 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.NumbersUtil;
 import org.apache.cloudstack.agent.lb.IndirectAgentLB;
 import org.apache.cloudstack.ca.CAManager;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -49,7 +50,7 @@
 import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.apache.log4j.Logger;
-import org.slf4j.MDC;
+import org.apache.log4j.MDC;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -388,8 +389,9 @@
                 cmd.setContextParam("job", "job-" + job.getId());
             }
         }
-        if (MDC.get("logcontextid") != null && !MDC.get("logcontextid").isEmpty()) {
-            cmd.setContextParam("logid", MDC.get("logcontextid"));
+        String logcontextid = (String) MDC.get("logcontextid");
+        if (!Strings.isNullOrEmpty(logcontextid)) {
+            cmd.setContextParam("logid", logcontextid);
         }
     }
 
@@ -584,7 +586,7 @@
         }
 
         final Long dcId = host.getDataCenterId();
-        final ReadyCommand ready = new ReadyCommand(dcId, host.getId());
+        final ReadyCommand ready = new ReadyCommand(dcId, host.getId(), NumbersUtil.enableHumanReadableSizes);
         final Answer answer = easySend(hostId, ready);
         if (answer == null || !answer.getResult()) {
             // this is tricky part for secondary storage
@@ -1094,7 +1096,7 @@
 
             final HostVO host = _resourceMgr.createHostVOForConnectedAgent(startup);
             if (host != null) {
-                ready = new ReadyCommand(host.getDataCenterId(), host.getId());
+                ready = new ReadyCommand(host.getDataCenterId(), host.getId(), NumbersUtil.enableHumanReadableSizes);
 
                 if (!indirectAgentLB.compareManagementServerList(host.getId(), host.getDataCenterId(), agentMSHostList, lbAlgorithm)) {
                     final List<String> newMSList = indirectAgentLB.getManagementServerList(host.getId(), host.getDataCenterId(), null);
diff --git a/engine/orchestration/src/main/java/com/cloud/agent/manager/DirectAgentAttache.java b/engine/orchestration/src/main/java/com/cloud/agent/manager/DirectAgentAttache.java
index be4d029..6514685 100644
--- a/engine/orchestration/src/main/java/com/cloud/agent/manager/DirectAgentAttache.java
+++ b/engine/orchestration/src/main/java/com/cloud/agent/manager/DirectAgentAttache.java
@@ -26,7 +26,7 @@
 import org.apache.log4j.Logger;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
-import org.slf4j.MDC;
+import org.apache.log4j.MDC;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
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 2fb0a62..f1ab9cd 100755
--- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -40,6 +40,7 @@
 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;
@@ -74,8 +75,10 @@
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
+import org.apache.cloudstack.vm.UnmanagedVMsManager;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
@@ -213,6 +216,7 @@
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionCallbackWithException;
 import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionLegacy;
@@ -341,6 +345,8 @@
     private NetworkDetailsDao networkDetailsDao;
     @Inject
     private SecurityGroupManager _securityGroupManager;
+    @Inject
+    private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
 
     VmWorkJobHandlerProxy _jobHandlerProxy = new VmWorkJobHandlerProxy(this);
 
@@ -411,6 +417,8 @@
             final LinkedHashMap<? extends Network, List<? extends NicProfile>> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType, final Map<String, Map<Integer, String>> extraDhcpOptions, final Map<Long, DiskOffering> datadiskTemplateToDiskOfferingMap)
                     throws InsufficientCapacityException {
 
+        s_logger.info(String.format("allocating virtual machine from template:%s with hostname:%s and %d networks", template.getUuid(), vmInstanceName, auxiliaryNetworks.size()));
+
         final VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName);
         final Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
 
@@ -452,7 +460,7 @@
                 } else if (template.getFormat() == ImageFormat.BAREMETAL) {
                     // Do nothing
                 } else {
-                    volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOfferingInfo.getDiskOffering(), rootDiskOfferingInfo.getSize(),
+                    volumeMgr.allocateTemplatedVolumes(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOfferingInfo.getDiskOffering(), rootDiskOfferingInfo.getSize(),
                             rootDiskOfferingInfo.getMinIops(), rootDiskOfferingInfo.getMaxIops(), template, vmFinal, owner);
                 }
 
@@ -589,6 +597,9 @@
         //remove the overcommit details from the uservm details
         userVmDetailsDao.removeDetails(vm.getId());
 
+        // Remove deploy as-is (if any)
+        userVmDeployAsIsDetailsDao.removeDetails(vm.getId());
+
         // send hypervisor-dependent commands before removing
         final List<Command> finalizeExpungeCommands = hvGuru.finalizeExpunge(vm);
         if (finalizeExpungeCommands != null && finalizeExpungeCommands.size() > 0) {
@@ -893,6 +904,11 @@
 
         final AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
         if ( jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace(String.format("start parameter value of %s == %s during dispatching",
+                        VirtualMachineProfile.Param.BootIntoSetup.getName(),
+                        (params == null?"<very null>":params.get(VirtualMachineProfile.Param.BootIntoSetup))));
+            }
             // avoid re-entrance
             VmWorkJobVO placeHolder = null;
             final VirtualMachine vm = _vmDao.findByUuid(vmUuid);
@@ -905,6 +921,11 @@
                 }
             }
         } else {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace(String.format("start parameter value of %s == %s during processing of queued job",
+                        VirtualMachineProfile.Param.BootIntoSetup.getName(),
+                        (params == null?"<very null>":params.get(VirtualMachineProfile.Param.BootIntoSetup))));
+            }
             final Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy, planner);
 
             try {
@@ -1068,12 +1089,7 @@
                 }
 
                 final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, owner, params);
-                if (params != null) {
-                    s_logger.info(" Uefi params " + "UefiFlag: " + params.get(VirtualMachineProfile.Param.UefiFlag)
-                            + " Boot Type: " + params.get(VirtualMachineProfile.Param.BootType)
-                            + " Boot Mode: " + params.get(VirtualMachineProfile.Param.BootMode)
-                    );
-                }
+                logBootModeParameters(params);
                 DeployDestination dest = null;
                 try {
                     dest = _dpMgr.planDeployment(vmProfile, plan, avoids, planner);
@@ -1096,7 +1112,9 @@
 
                 if (dest != null) {
                     avoids.addHost(dest.getHost().getId());
-                    journal.record("Deployment found ", vmProfile, dest);
+                    if (!template.isDeployAsIs()) {
+                        journal.record("Deployment found ", vmProfile, dest);
+                    }
                 }
 
                 long destHostId = dest.getHost().getId();
@@ -1128,7 +1146,7 @@
 
                 try {
                     resetVmNicsDeviceId(vm.getId());
-                    _networkMgr.prepare(vmProfile, new DeployDestination(dest.getDataCenter(), dest.getPod(), null, null, dest.getStorageForDisks()), ctx);
+                    _networkMgr.prepare(vmProfile, new DeployDestination(dest.getDataCenter(), dest.getPod(), null, null, dest.getStorageForDisks(), dest.isDisplayStorage()), ctx);
                     if (vm.getHypervisorType() != HypervisorType.BareMetal) {
                         volumeMgr.prepare(vmProfile, dest);
                     }
@@ -1143,6 +1161,8 @@
 
                     final VirtualMachineTO vmTO = hvGuru.implement(vmProfile);
 
+                    checkAndSetEnterSetupMode(vmTO, params);
+
                     handlePath(vmTO.getDisks(), vm.getHypervisorType());
 
                     cmds = new Commands(Command.OnError.Stop);
@@ -1321,6 +1341,33 @@
         }
     }
 
+    private void logBootModeParameters(Map<VirtualMachineProfile.Param, Object> params) {
+        if (params == null) {
+          return;
+        }
+        StringBuffer msgBuf = new StringBuffer("Uefi params ");
+        boolean log = false;
+        if (params.get(VirtualMachineProfile.Param.UefiFlag) != null) {
+            msgBuf.append(String.format("UefiFlag: %s ", params.get(VirtualMachineProfile.Param.UefiFlag)));
+            log = true;
+        }
+        if (params.get(VirtualMachineProfile.Param.BootType) != null) {
+            msgBuf.append(String.format("Boot Type: %s ", params.get(VirtualMachineProfile.Param.BootType)));
+            log = true;
+        }
+        if (params.get(VirtualMachineProfile.Param.BootMode) != null) {
+            msgBuf.append(String.format("Boot Mode: %s ", params.get(VirtualMachineProfile.Param.BootMode)));
+            log = true;
+        }
+        if (params.get(VirtualMachineProfile.Param.BootIntoSetup) != null) {
+            msgBuf.append(String.format("Boot into Setup: %s ", params.get(VirtualMachineProfile.Param.BootIntoSetup)));
+            log = true;
+        }
+        if (log) {
+            s_logger.info(msgBuf.toString());
+        }
+    }
+
     private void resetVmNicsDeviceId(Long vmId) {
         final List<NicVO> nics = _nicsDao.listByVmId(vmId);
         Collections.sort(nics, new Comparator<NicVO>() {
@@ -1431,14 +1478,18 @@
             if (disk.getType() != Volume.Type.ISO) {
                 final VolumeObjectTO vol = (VolumeObjectTO)disk.getData();
                 final VolumeVO volume = _volsDao.findById(vol.getId());
+                if (vmSpec.getDeployAsIsInfo() != null && StringUtils.isNotBlank(vol.getPath())) {
+                    volume.setPath(vol.getPath());
+                    _volsDao.update(volume.getId(), volume);
+                }
 
                 // Use getPath() from VolumeVO to get a fresh copy of what's in the DB.
                 // Before doing this, in a certain situation, getPath() from VolumeObjectTO
                 // returned null instead of an actual path (because it was out of date with the DB).
                 if(vol.getPath() != null) {
-                    volumeMgr.updateVolumeDiskChain(vol.getId(), vol.getPath(), vol.getChainInfo());
+                    volumeMgr.updateVolumeDiskChain(vol.getId(), vol.getPath(), vol.getChainInfo(), vol.getUpdatedDataStoreUUID());
                 } else {
-                    volumeMgr.updateVolumeDiskChain(vol.getId(), volume.getPath(), vol.getChainInfo());
+                    volumeMgr.updateVolumeDiskChain(vol.getId(), volume.getPath(), vol.getChainInfo(), vol.getUpdatedDataStoreUUID());
                 }
             }
         }
@@ -1479,6 +1530,88 @@
         }
     }
 
+    @Override
+    public boolean unmanage(String vmUuid) {
+        VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
+        if (vm == null || vm.getRemoved() != null) {
+            throw new CloudRuntimeException("Could not find VM with id = " + vmUuid);
+        }
+
+        final List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(VirtualMachine.Type.Instance, vm.getId());
+        if (CollectionUtils.isNotEmpty(pendingWorkJobs) || _haMgr.hasPendingHaWork(vm.getId())) {
+            String msg = "There are pending jobs or HA tasks working on the VM with id: " + vm.getId() + ", can't unmanage the VM.";
+            s_logger.info(msg);
+            throw new ConcurrentOperationException(msg);
+        }
+
+        Boolean result = Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("Unmanaging vm " + vm);
+                }
+
+                final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+                final HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType());
+                final VirtualMachineGuru guru = getVmGuru(vm);
+
+                try {
+                    unmanageVMSnapshots(vm);
+                    unmanageVMNics(profile, vm);
+                    unmanageVMVolumes(vm);
+
+                    guru.finalizeUnmanage(vm);
+                } catch (Exception e) {
+                    s_logger.error("Error while unmanaging VM " + vm, e);
+                    return false;
+                }
+
+                return true;
+            }
+        });
+
+        return BooleanUtils.isTrue(result);
+    }
+
+    /**
+     * Clean up VM snapshots (if any) from DB
+     */
+    private void unmanageVMSnapshots(VMInstanceVO vm) {
+        _vmSnapshotMgr.deleteVMSnapshotsFromDB(vm.getId(), true);
+    }
+
+    /**
+     * Clean up volumes for a VM to be unmanaged from CloudStack
+     */
+    private void unmanageVMVolumes(VMInstanceVO vm) {
+        final Long hostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId();
+        if (hostId != null) {
+            volumeMgr.revokeAccess(vm.getId(), hostId);
+        }
+        volumeMgr.unmanageVolumes(vm.getId());
+
+        List<Map<String, String>> targets = getTargets(hostId, vm.getId());
+        if (hostId != null && CollectionUtils.isNotEmpty(targets)) {
+            removeDynamicTargets(hostId, targets);
+        }
+    }
+
+    /**
+     * Clean up NICs for a VM to be unmanaged from CloudStack:
+     * - If 'unmanage.vm.preserve.nics' = true: then the NICs are not removed but still Allocated, to preserve MAC addresses
+     * - If 'unmanage.vm.preserve.nics' = false: then the NICs are removed while unmanaging
+     */
+    private void unmanageVMNics(VirtualMachineProfile profile, VMInstanceVO vm) {
+        s_logger.debug("Cleaning up NICs");
+        Boolean preserveNics = UnmanagedVMsManager.UnmanageVMPreserveNic.valueIn(vm.getDataCenterId());
+        if (BooleanUtils.isTrue(preserveNics)) {
+            s_logger.debug("Preserve NICs configuration enabled");
+            profile.setParameter(VirtualMachineProfile.Param.PreserveNics, true);
+        }
+        _networkMgr.unmanageNics(profile);
+    }
+
     private List<Map<String, String>> getVolumesToDisconnect(VirtualMachine vm) {
         List<Map<String, String>> volumesToDisconnect = new ArrayList<>();
 
@@ -1539,6 +1672,14 @@
                 }
 
                 guru.finalizeStop(profile, answer);
+
+                final UserVmVO userVm = _userVmDao.findById(vm.getId());
+                if (vm.getType() == VirtualMachine.Type.User) {
+                    if (userVm != null){
+                        userVm.setPowerState(PowerState.PowerOff);
+                        _userVmDao.update(userVm.getId(), userVm);
+                    }
+                }
             } else {
                 s_logger.error("Invalid answer received in response to a StopCommand for " + vm.getInstanceName());
                 return false;
@@ -1969,7 +2110,7 @@
         }
         else {
             if (expunge) {
-                _vmSnapshotMgr.deleteVMSnapshotsFromDB(vm.getId());
+                _vmSnapshotMgr.deleteVMSnapshotsFromDB(vm.getId(), false);
             }
         }
     }
@@ -2338,7 +2479,7 @@
 
     protected void migrate(final VMInstanceVO vm, final long srcHostId, final DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException {
         s_logger.info("Migrating " + vm + " to " + dest);
-
+        final UserVmVO userVm = _userVmDao.findById(vm.getId());
         final long dstHostId = dest.getHost().getId();
         final Host fromHost = _hostDao.findById(srcHostId);
         if (fromHost == null) {
@@ -2346,7 +2487,7 @@
             throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId);
         }
 
-        if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) {
+        if (fromHost.getClusterId().longValue() != dest.getCluster().getId() && vm.getHypervisorType() != HypervisorType.VMware) {
             final List<VolumeVO> volumes = _volsDao.findCreatedByInstance(vm.getId());
             for (final VolumeVO volume : volumes) {
                 if (!_storagePoolDao.findById(volume.getPoolId()).getScope().equals(ScopeType.ZONE)) {
@@ -2488,7 +2629,6 @@
             } catch (final OperationTimedoutException e) {
                 s_logger.debug("Error while checking the vm " + vm + " on host " + dstHostId, e);
             }
-
             migrated = true;
         } finally {
             if (!migrated) {
@@ -2503,7 +2643,7 @@
                 } catch (final AgentUnavailableException ae) {
                     s_logger.info("Looks like the destination Host is unavailable for cleanup");
                 }
-
+                _networkMgr.setHypervisorHostname(profile, dest, false);
                 try {
                     stateTransitTo(vm, Event.OperationFailed, srcHostId);
                 } catch (final NoTransitionException e) {
@@ -2511,6 +2651,7 @@
                 }
             } else {
                 _networkMgr.commitNicForMigration(vmSrc, profile);
+                _networkMgr.setHypervisorHostname(profile, dest, true);
             }
 
             work.setStep(Step.Done);
@@ -2812,6 +2953,7 @@
         vm.setLastHostId(srcHostId);
         vm.setPodIdToDeployIn(destHost.getPodId());
         moveVmToMigratingState(vm, destHostId, work);
+        List<String[]> vmData = null;
 
         boolean migrated = false;
         try {
@@ -2822,7 +2964,6 @@
 
             Nic defaultNic = _networkModel.getDefaultNic(vm.getId());
 
-            List<String[]> vmData = null;
             if (defaultNic != null) {
                 UserVmVO userVm = _userVmDao.findById(vm.getId());
                 Map<String, String> details = userVmDetailsDao.listDetailsKeyPairs(vm.getId());
@@ -2832,9 +2973,9 @@
                 if (_networkModel.isSharedNetworkWithoutServices(network.getId())) {
                     final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
                     boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-
                     vmData = _networkModel.generateVmData(userVm.getUserData(), serviceOffering, vm.getDataCenterId(), vm.getInstanceName(), vm.getHostName(), vm.getId(),
-                            vm.getUuid(), defaultNic.getMacAddress(), userVm.getDetail("SSH.PublicKey"), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
+                            vm.getUuid(), defaultNic.getMacAddress(), userVm.getDetail("SSH.PublicKey"), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows,
+                            VirtualMachineManager.getHypervisorHostname(destination.getHost() != null ? destination.getHost().getName() : ""));
                     String vmName = vm.getInstanceName();
                     String configDriveIsoRootFolder = "/tmp";
                     String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso";
@@ -2852,7 +2993,6 @@
                         s_logger.debug("TIme out occured while exeuting command AttachOrDettachConfigDrive " + e.getMessage());
 
                     }
-
                 }
             }
 
@@ -2876,7 +3016,6 @@
             } catch (final OperationTimedoutException e) {
                 s_logger.warn("Error while checking the vm " + vm + " is on host " + destHost, e);
             }
-
             migrated = true;
         } finally {
             if (!migrated) {
@@ -2893,6 +3032,9 @@
                 } catch (final NoTransitionException e) {
                     s_logger.error("Error while transitioning vm from migrating to running state.", e);
                 }
+                _networkMgr.setHypervisorHostname(profile, destination, false);
+            } else {
+                _networkMgr.setHypervisorHostname(profile, destination, true);
             }
 
             work.setStep(Step.Done);
@@ -3120,6 +3262,10 @@
             final VirtualMachine vm = _vmDao.findByUuid(vmUuid);
             placeHolder = createPlaceHolderWork(vm.getId());
             try {
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace(String.format("reboot parameter value of %s == %s at orchestration", VirtualMachineProfile.Param.BootIntoSetup.getName(),
+                            (params == null? "<very null>":params.get(VirtualMachineProfile.Param.BootIntoSetup))));
+                }
                 orchestrateReboot(vmUuid, params);
             } finally {
                 if (placeHolder != null) {
@@ -3127,6 +3273,10 @@
                 }
             }
         } else {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace(String.format("reboot parameter value of %s == %s through job-queue", VirtualMachineProfile.Param.BootIntoSetup.getName(),
+                        (params == null? "<very null>":params.get(VirtualMachineProfile.Param.BootIntoSetup))));
+            }
             final Outcome<VirtualMachine> outcome = rebootVmThroughJobQueue(vmUuid, params);
 
             try {
@@ -3176,7 +3326,9 @@
 
             final Commands cmds = new Commands(Command.OnError.Stop);
             RebootCommand rebootCmd = new RebootCommand(vm.getInstanceName(), getExecuteInSequence(vm.getHypervisorType()));
-            rebootCmd.setVirtualMachine(getVmTO(vm.getId()));
+            VirtualMachineTO vmTo = getVmTO(vm.getId());
+            checkAndSetEnterSetupMode(vmTo, params);
+            rebootCmd.setVirtualMachine(vmTo);
             cmds.addCommand(rebootCmd);
             _agentMgr.send(host.getId(), cmds);
 
@@ -3196,6 +3348,17 @@
         }
     }
 
+    private void checkAndSetEnterSetupMode(VirtualMachineTO vmTo, Map<VirtualMachineProfile.Param, Object> params) {
+        Boolean enterSetup = null;
+        if (params != null) {
+            enterSetup = (Boolean) params.get(VirtualMachineProfile.Param.BootIntoSetup);
+        }
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("orchestrating VM reboot for '%s' %s set to %s", vmTo.getName(), VirtualMachineProfile.Param.BootIntoSetup, enterSetup));
+        }
+        vmTo.setEnterHardwareSetup(enterSetup == null ? false : enterSetup);
+    }
+
     protected VirtualMachineTO getVmTO(Long vmId) {
         final VMInstanceVO vm = _vmDao.findById(vmId);
         final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
@@ -3616,6 +3779,7 @@
             try {
                 result = plugNic(network, nicTO, vmTO, context, dest);
                 if (result) {
+                    _userVmMgr.setupVmForPvlan(true, vm.getHostId(), nic);
                     s_logger.debug("Nic is plugged successfully for vm " + vm + " in network " + network + ". Vm  is a part of network now");
                     final long isDefault = nic.isDefaultNic() ? 1 : 0;
                     // insert nic's Id into DB as resource_name
@@ -3723,6 +3887,7 @@
             s_logger.debug("Un-plugging nic " + nic + " for vm " + vm + " from network " + network);
             final boolean result = unplugNic(network, nicTO, vmTO, context, dest);
             if (result) {
+                _userVmMgr.setupVmForPvlan(false, vm.getHostId(), nicProfile);
                 s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network);
                 final long isDefault = nic.isDefaultNic() ? 1 : 0;
                 UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
@@ -3841,15 +4006,19 @@
     }
 
     @Override
-    public void findHostAndMigrate(final String vmUuid, final Long newSvcOfferingId, final ExcludeList excludes) throws InsufficientCapacityException, ConcurrentOperationException,
+    public void findHostAndMigrate(final String vmUuid, final Long newSvcOfferingId, final Map<String, String> customParameters, final ExcludeList excludes) throws InsufficientCapacityException, ConcurrentOperationException,
     ResourceUnavailableException {
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         if (vm == null) {
             throw new CloudRuntimeException("Unable to find " + vmUuid);
         }
-
-        final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+        ServiceOfferingVO newServiceOffering = _offeringDao.findById(newSvcOfferingId);
+        if (newServiceOffering.isDynamic()) {
+            newServiceOffering.setDynamicFlag(true);
+            newServiceOffering = _offeringDao.getComputeOffering(newServiceOffering, customParameters);
+        }
+        final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, null, newServiceOffering, null, null);
 
         final Long srcHostId = vm.getHostId();
         final Long oldSvcOfferingId = vm.getServiceOfferingId();
@@ -4085,12 +4254,14 @@
                 } catch (final AgentUnavailableException ae) {
                     s_logger.info("Looks like the destination Host is unavailable for cleanup");
                 }
-
+                _networkMgr.setHypervisorHostname(profile, dest, false);
                 try {
                     stateTransitTo(vm, Event.OperationFailed, srcHostId);
                 } catch (final NoTransitionException e) {
                     s_logger.warn(e.getMessage());
                 }
+            } else {
+                _networkMgr.setHypervisorHostname(profile, dest, true);
             }
 
             work.setStep(Step.Done);
@@ -4348,7 +4519,8 @@
         return new ConfigKey<?>[] {ClusterDeltaSyncInterval, StartRetry, VmDestroyForcestop, VmOpCancelInterval, VmOpCleanupInterval, VmOpCleanupWait,
             VmOpLockStateRetry,
             VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel, VmConfigDriveOnPrimaryPool, HaVmRestartHostUp,
-            ResoureCountRunningVMsonly };
+            ResoureCountRunningVMsonly, AllowExposeHypervisorHostname, AllowExposeHypervisorHostnameAccountLevel,
+            VmServiceOfferingMaxCPUCores, VmServiceOfferingMaxRAMSize };
     }
 
     public List<StoragePoolAllocator> getStoragePoolAllocators() {
@@ -5283,6 +5455,11 @@
         }
         assert vm != null;
 
+        Boolean enterSetup = (Boolean)work.getParams().get(VirtualMachineProfile.Param.BootIntoSetup);
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("orchestrating VM start for '%s' %s set to %s", vm.getInstanceName(), VirtualMachineProfile.Param.BootIntoSetup, enterSetup));
+        }
+
         try{
             orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), _dpMgr.getDeploymentPlannerByName(work.getDeploymentPlanner()));
         }
@@ -5588,4 +5765,116 @@
         return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(passwordMap));
     }
 
+    @Override
+    public Boolean updateDefaultNicForVM(final VirtualMachine vm, final Nic nic, final Nic defaultNic) {
+
+        final AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
+        if (jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
+            VmWorkJobVO placeHolder = null;
+            placeHolder = createPlaceHolderWork(vm.getId());
+            try {
+                return orchestrateUpdateDefaultNicForVM(vm, nic, defaultNic);
+            } finally {
+                if (placeHolder != null) {
+                    _workJobDao.expunge(placeHolder.getId());
+                }
+            }
+        } else {
+            final Outcome<VirtualMachine> outcome = updateDefaultNicForVMThroughJobQueue(vm, nic, defaultNic);
+
+            try {
+                outcome.get();
+            } catch (final InterruptedException e) {
+                throw new RuntimeException("Operation is interrupted", e);
+            } catch (final java.util.concurrent.ExecutionException e) {
+                throw new RuntimeException("Execution exception", e);
+            }
+
+            final Object jobResult = _jobMgr.unmarshallResultObject(outcome.getJob());
+            if (jobResult != null) {
+                if (jobResult instanceof Boolean) {
+                    return (Boolean)jobResult;
+                }
+            }
+
+            throw new RuntimeException("Unexpected job execution result");
+        }
+    }
+
+    private Boolean orchestrateUpdateDefaultNicForVM(final VirtualMachine vm, final Nic nic, final Nic defaultNic) {
+
+        s_logger.debug("Updating default nic of vm " + vm + " from nic " + defaultNic.getUuid() + " to nic " + nic.getUuid());
+        Integer chosenID = nic.getDeviceId();
+        Integer existingID = defaultNic.getDeviceId();
+        NicVO nicVO = _nicsDao.findById(nic.getId());
+        NicVO defaultNicVO = _nicsDao.findById(defaultNic.getId());
+
+        nicVO.setDefaultNic(true);
+        nicVO.setDeviceId(existingID);
+        defaultNicVO.setDefaultNic(false);
+        defaultNicVO.setDeviceId(chosenID);
+
+        _nicsDao.persist(nicVO);
+        _nicsDao.persist(defaultNicVO);
+        return true;
+    }
+
+    public Outcome<VirtualMachine> updateDefaultNicForVMThroughJobQueue(final VirtualMachine vm, final Nic nic, final Nic defaultNic) {
+
+        final CallContext context = CallContext.current();
+        final User user = context.getCallingUser();
+        final Account account = context.getCallingAccount();
+
+        final List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+                VirtualMachine.Type.Instance, vm.getId(),
+                VmWorkUpdateDefaultNic.class.getName());
+
+        VmWorkJobVO workJob = null;
+        if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+            assert pendingWorkJobs.size() == 1;
+            workJob = pendingWorkJobs.get(0);
+        } else {
+
+            workJob = new VmWorkJobVO(context.getContextId());
+
+            workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+            workJob.setCmd(VmWorkUpdateDefaultNic.class.getName());
+
+            workJob.setAccountId(account.getId());
+            workJob.setUserId(user.getId());
+            workJob.setVmType(VirtualMachine.Type.Instance);
+            workJob.setVmInstanceId(vm.getId());
+            workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
+
+            final VmWorkUpdateDefaultNic workInfo = new VmWorkUpdateDefaultNic(user.getId(), account.getId(), vm.getId(),
+                    VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, nic.getId(), defaultNic.getId());
+            workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+            _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+        }
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(workJob.getId());
+
+        return new VmJobVirtualMachineOutcome(workJob, vm.getId());
+    }
+
+    @ReflectionUse
+    private Pair<JobInfo.Status, String> orchestrateUpdateDefaultNic(final VmWorkUpdateDefaultNic work) throws Exception {
+        final VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, work.getVmId());
+        if (vm == null) {
+            s_logger.info("Unable to find vm " + work.getVmId());
+        }
+        assert vm != null;
+        final NicVO nic = _entityMgr.findById(NicVO.class, work.getNicId());
+        if (nic == null) {
+            throw new CloudRuntimeException("Unable to find nic " + work.getNicId());
+        }
+        final NicVO defaultNic = _entityMgr.findById(NicVO.class, work.getDefaultNicId());
+        if (defaultNic == null) {
+            throw new CloudRuntimeException("Unable to find default nic " + work.getDefaultNicId());
+        }
+        final boolean result = orchestrateUpdateDefaultNicForVM(vm, nic, defaultNic);
+        return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+                _jobMgr.marshallResultObject(result));
+    }
+
 }
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index a8a71b4..815206a 100644
--- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -80,7 +80,7 @@
 
             if (_instanceDao.updatePowerState(entry.getKey(), hostId, entry.getValue(), DateUtil.currentGMTTime())) {
                 if (s_logger.isInfoEnabled()) {
-                    s_logger.info("VM state report is updated. host: " + hostId + ", vm id: " + entry.getKey() + ", power state: " + entry.getValue());
+                    s_logger.debug("VM state report is updated. host: " + hostId + ", vm id: " + entry.getKey() + ", power state: " + entry.getValue());
                 }
 
                 _messageBus.publish(null, VirtualMachineManager.Topics.VM_POWER_STATE, PublishScope.GLOBAL, entry.getKey());
@@ -139,7 +139,7 @@
 
                 if (s_logger.isInfoEnabled()) {
                     String lastTime = new SimpleDateFormat("yyyy/MM/dd'T'HH:mm:ss.SSS'Z'").format(vmStateUpdateTime);
-                    s_logger.info(
+                    s_logger.debug(
                             String.format("Detected missing VM. host: %d, vm id: %d(%s), power state: %s, last state update: %s"
                                     , hostId
                                     , instance.getId()
@@ -189,7 +189,7 @@
             if (vm != null) {
                 map.put(vm.getId(), entry.getValue().getState());
             } else {
-                s_logger.info("Unable to find matched VM in CloudStack DB. name: " + entry.getKey());
+                s_logger.debug("Unable to find matched VM in CloudStack DB. name: " + entry.getKey());
             }
         }
 
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VmWorkMigrate.java b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkMigrate.java
index 5bcea9a..1d7deca 100644
--- a/engine/orchestration/src/main/java/com/cloud/vm/VmWorkMigrate.java
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkMigrate.java
@@ -64,14 +64,19 @@
 
         Map<Volume, StoragePool> vols = null;
 
+        boolean displayStorage = true;
         if (storage != null) {
             vols = new HashMap<Volume, StoragePool>(storage.size());
             for (Map.Entry<String, String> entry : storage.entrySet()) {
-                vols.put(s_entityMgr.findByUuid(Volume.class, entry.getKey()), s_entityMgr.findByUuid(StoragePool.class, entry.getValue()));
+                Volume volume = s_entityMgr.findByUuid(Volume.class, entry.getKey());
+                if (displayStorage && volume.isDeployAsIs()) {
+                    displayStorage = false;
+                }
+                vols.put(volume, s_entityMgr.findByUuid(StoragePool.class, entry.getValue()));
             }
         }
 
-        DeployDestination dest = new DeployDestination(zone, pod, cluster, host, vols);
+        DeployDestination dest = new DeployDestination(zone, pod, cluster, host, vols, displayStorage);
         return dest;
     }
 
diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VmWorkUpdateDefaultNic.java b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkUpdateDefaultNic.java
new file mode 100644
index 0000000..14f3239
--- /dev/null
+++ b/engine/orchestration/src/main/java/com/cloud/vm/VmWorkUpdateDefaultNic.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 com.cloud.vm;
+
+public class VmWorkUpdateDefaultNic extends VmWork {
+    private static final long serialVersionUID = -4265657031064437934L;
+
+    Long nicId;
+    Long defaultNicId;
+
+    public VmWorkUpdateDefaultNic(long userId, long accountId, long vmId, String handlerName, Long nicId, Long defaultNicId) {
+        super(userId, accountId, vmId, handlerName);
+
+        this.nicId = nicId;
+        this.defaultNicId = defaultNicId;
+    }
+
+    public Long getNicId() {
+        return nicId;
+    }
+
+    public Long getDefaultNicId() {
+        return defaultNicId;
+    }
+}
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java
index 91e9b6f..c6f8e41 100644
--- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java
@@ -20,7 +20,6 @@
 
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -156,7 +155,7 @@
 
     @Override
     public VirtualMachineEntity createVirtualMachine(String id, String owner, String templateId, String hostName, String displayName, String hypervisor, int cpu,
-        int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, NicProfile> networkNicMap, DeploymentPlan plan,
+        int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, List<NicProfile>> networkNicMap, DeploymentPlan plan,
         Long rootDiskSize, Map<String, Map<Integer, String>> extraDhcpOptionMap, Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException {
 
         // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks,
@@ -166,7 +165,7 @@
         for (String uuid : networkNicMap.keySet()) {
             NetworkVO network = _networkDao.findByUuid(uuid);
             if(network != null){
-                networkIpMap.put(network, new ArrayList<NicProfile>(Arrays.asList(networkNicMap.get(uuid))));
+                networkIpMap.put(network, networkNicMap.get(uuid));
             }
         }
 
@@ -255,7 +254,7 @@
 
     @Override
     public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os,
-        int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, NicProfile> networkNicMap, DeploymentPlan plan, Map<String, Map<Integer, String>> extraDhcpOptionMap)
+        int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, List<NicProfile>> networkNicMap, DeploymentPlan plan, Map<String, Map<Integer, String>> extraDhcpOptionMap)
         throws InsufficientCapacityException {
 
         // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager);
@@ -307,7 +306,7 @@
         for (String uuid : networkNicMap.keySet()) {
             NetworkVO network = _networkDao.findByUuid(uuid);
             if(network != null){
-                networkIpMap.put(network, new ArrayList<NicProfile>(Arrays.asList(networkNicMap.get(uuid))));
+                networkIpMap.put(network, networkNicMap.get(uuid));
             }
         }
 
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
new file mode 100644
index 0000000..dd451f5
--- /dev/null
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/DataMigrationUtility.java
@@ -0,0 +1,265 @@
+// 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.engine.orchestration;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+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.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.TemplateDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.ImageStoreService;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
+
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.SecondaryStorageVmVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
+
+public class DataMigrationUtility {
+    @Inject
+    SecondaryStorageVmDao secStorageVmDao;
+    @Inject
+    TemplateDataStoreDao templateDataStoreDao;
+    @Inject
+    SnapshotDataStoreDao snapshotDataStoreDao;
+    @Inject
+    VolumeDataStoreDao volumeDataStoreDao;
+    @Inject
+    VMTemplateDao templateDao;
+    @Inject
+    VolumeDataFactory volumeFactory;
+    @Inject
+    TemplateDataFactory templateFactory;
+    @Inject
+    SnapshotDataFactory snapshotFactory;
+    @Inject
+    HostDao hostDao;
+    @Inject
+    SnapshotDao snapshotDao;
+    /**
+     *  This function verifies if the given image store contains data objects that are not in any of the following states:
+     *  "Ready" "Allocated", "Destroying", "Destroyed", "Failed". If this is the case, and if the migration policy is complete,
+     *  the migration is terminated.
+     */
+    private boolean filesReadyToMigrate(Long srcDataStoreId) {
+        String[] validStates = new String[]{"Ready", "Allocated", "Destroying", "Destroyed", "Failed"};
+        boolean isReady = true;
+        List<TemplateDataStoreVO> templates = templateDataStoreDao.listByStoreId(srcDataStoreId);
+        for (TemplateDataStoreVO template : templates) {
+            isReady &= (Arrays.asList(validStates).contains(template.getState().toString()));
+        }
+        List<SnapshotDataStoreVO> snapshots = snapshotDataStoreDao.listByStoreId(srcDataStoreId, DataStoreRole.Image);
+        for (SnapshotDataStoreVO snapshot : snapshots) {
+            isReady &= (Arrays.asList(validStates).contains(snapshot.getState().toString()));
+        }
+        List<VolumeDataStoreVO> volumes = volumeDataStoreDao.listByStoreId(srcDataStoreId);
+        for (VolumeDataStoreVO volume : volumes) {
+            isReady &= (Arrays.asList(validStates).contains(volume.getState().toString()));
+        }
+        return isReady;
+    }
+
+    protected void checkIfCompleteMigrationPossible(ImageStoreService.MigrationPolicy policy, Long srcDataStoreId) {
+        if (policy == ImageStoreService.MigrationPolicy.COMPLETE) {
+            if (!filesReadyToMigrate(srcDataStoreId)) {
+                throw new CloudRuntimeException("Complete migration failed as there are data objects which are not Ready - i.e, they may be in Migrating, creating, copying, etc. states");
+            }
+        }
+        return;
+    }
+
+    protected Long getFileSize(DataObject file, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChain) {
+        Long size = file.getSize();
+        Pair<List<SnapshotInfo>, Long> chain = snapshotChain.get(file);
+        if (file instanceof SnapshotInfo && chain.first() != null && !chain.first().isEmpty()) {
+            size = chain.second();
+        }
+        return size;
+    }
+
+    /**
+     * Sorts the datastores in decreasing order of their free capacities, so as to make
+     * an informed decision of picking the datastore with maximum free capactiy for migration
+     */
+    protected List<Long> sortDataStores(Map<Long, Pair<Long, Long>> storageCapacities) {
+        List<Map.Entry<Long, Pair<Long, Long>>> list =
+                new LinkedList<Map.Entry<Long, Pair<Long, Long>>>((storageCapacities.entrySet()));
+
+        Collections.sort(list, new Comparator<Map.Entry<Long, Pair<Long, Long>>>() {
+            @Override
+            public int compare(Map.Entry<Long, Pair<Long, Long>> e1, Map.Entry<Long, Pair<Long, Long>> e2) {
+                return e2.getValue().first() > e1.getValue().first() ? 1 : -1;
+            }
+        });
+        HashMap<Long, Pair<Long, Long>> temp = new LinkedHashMap<>();
+        for (Map.Entry<Long, Pair<Long, Long>> value : list) {
+            temp.put(value.getKey(), value.getValue());
+        }
+
+        return new ArrayList<>(temp.keySet());
+    }
+
+    protected List<DataObject> getSortedValidSourcesList(DataStore srcDataStore, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains) {
+        List<DataObject> files = new ArrayList<>();
+        files.addAll(getAllReadyTemplates(srcDataStore));
+        files.addAll(getAllReadySnapshotsAndChains(srcDataStore, snapshotChains));
+        files.addAll(getAllReadyVolumes(srcDataStore));
+
+        files = sortFilesOnSize(files, snapshotChains);
+
+        return files;
+    }
+
+    protected List<DataObject> sortFilesOnSize(List<DataObject> files, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains) {
+        Collections.sort(files, new Comparator<DataObject>() {
+            @Override
+            public int compare(DataObject o1, DataObject o2) {
+                Long size1 = o1.getSize();
+                Long size2 = o2.getSize();
+                if (o1 instanceof SnapshotInfo) {
+                    size1 = snapshotChains.get(o1).second();
+                }
+                if (o2 instanceof  SnapshotInfo) {
+                    size2 = snapshotChains.get(o2).second();
+                }
+                return size2 > size1 ? 1 : -1;
+            }
+        });
+        return files;
+    }
+
+    protected List<DataObject> getAllReadyTemplates(DataStore srcDataStore) {
+
+        List<DataObject> files = new LinkedList<>();
+        List<TemplateDataStoreVO> templates = templateDataStoreDao.listByStoreId(srcDataStore.getId());
+        for (TemplateDataStoreVO template : templates) {
+            VMTemplateVO templateVO = templateDao.findById(template.getTemplateId());
+            if (template.getState() == ObjectInDataStoreStateMachine.State.Ready && templateVO != null && !templateVO.isPublicTemplate() &&
+                    templateVO.getHypervisorType() != Hypervisor.HypervisorType.Simulator) {
+                files.add(templateFactory.getTemplate(template.getTemplateId(), srcDataStore));
+            }
+        }
+        return files;
+    }
+
+    /** Returns parent snapshots and snapshots that do not have any children; snapshotChains comprises of the snapshot chain info
+     * for each parent snapshot and the cumulative size of the chain - this is done to ensure that all the snapshots in a chain
+     * are migrated to the same datastore
+     */
+    protected List<DataObject> getAllReadySnapshotsAndChains(DataStore srcDataStore, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains) {
+        List<SnapshotInfo> files = new LinkedList<>();
+        List<SnapshotDataStoreVO> snapshots = snapshotDataStoreDao.listByStoreId(srcDataStore.getId(), DataStoreRole.Image);
+        for (SnapshotDataStoreVO snapshot : snapshots) {
+            SnapshotVO snapshotVO = snapshotDao.findById(snapshot.getSnapshotId());
+            if (snapshot.getState() == ObjectInDataStoreStateMachine.State.Ready &&
+                    snapshotVO != null && snapshotVO.getHypervisorType() != Hypervisor.HypervisorType.Simulator
+                    && snapshot.getParentSnapshotId() == 0 ) {
+                SnapshotInfo snap = snapshotFactory.getSnapshot(snapshotVO.getSnapshotId(), DataStoreRole.Image);
+                files.add(snap);
+            }
+        }
+
+        for (SnapshotInfo parent : files) {
+            List<SnapshotInfo> chain = new ArrayList<>();
+            chain.add(parent);
+            for (int i =0; i< chain.size(); i++) {
+                SnapshotInfo child = chain.get(i);
+                List<SnapshotInfo> children = child.getChildren();
+                if (children != null) {
+                    chain.addAll(children);
+                }
+            }
+            snapshotChains.put(parent, new Pair<List<SnapshotInfo>, Long>(chain, getSizeForChain(chain)));
+        }
+
+        return (List<DataObject>) (List<?>) files;
+    }
+
+    protected Long getSizeForChain(List<SnapshotInfo> chain) {
+        Long size = 0L;
+        for (SnapshotInfo snapshot : chain) {
+            size += snapshot.getSize();
+        }
+        return size;
+    }
+
+
+    protected List<DataObject> getAllReadyVolumes(DataStore srcDataStore) {
+        List<DataObject> files = new LinkedList<>();
+        List<VolumeDataStoreVO> volumes = volumeDataStoreDao.listByStoreId(srcDataStore.getId());
+        for (VolumeDataStoreVO volume : volumes) {
+            if (volume.getState() == ObjectInDataStoreStateMachine.State.Ready) {
+                VolumeInfo volumeInfo = volumeFactory.getVolume(volume.getVolumeId(), srcDataStore);
+                if (volumeInfo != null && volumeInfo.getHypervisorType() != Hypervisor.HypervisorType.Simulator) {
+                    files.add(volumeInfo);
+                }
+            }
+        }
+        return files;
+    }
+
+    /** Returns the count of active SSVMs - SSVM with agents in connected state, so as to dynamically increase the thread pool
+     * size when SSVMs scale
+     */
+    protected int activeSSVMCount(DataStore dataStore) {
+        long datacenterId = dataStore.getScope().getScopeId();
+        List<SecondaryStorageVmVO> ssvms =
+                secStorageVmDao.getSecStorageVmListInStates(null, datacenterId, VirtualMachine.State.Running, VirtualMachine.State.Migrating);
+        int activeSSVMs = 0;
+        for (SecondaryStorageVmVO vm : ssvms) {
+            String name = "s-"+vm.getId()+"-VM";
+            HostVO ssHost = hostDao.findByName(name);
+            if (ssHost != null) {
+                if (ssHost.getState() == Status.Up) {
+                    activeSSVMs++;
+                }
+            }
+        }
+        return activeSSVMs;
+    }
+}
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 560ca50..aa904b3 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
@@ -16,12 +16,14 @@
 // under the License.
 package org.apache.cloudstack.engine.orchestration;
 
+import static org.apache.commons.lang.StringUtils.isNotBlank;
 
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -38,10 +40,10 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.network.dao.NetworkDetailVO;
-import com.cloud.network.dao.NetworkDetailsDao;
+import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.api.ApiConstants;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.cloud.entity.api.db.VMNetworkMapVO;
 import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao;
@@ -53,6 +55,7 @@
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.PublishScope;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.commons.lang.BooleanUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
@@ -85,6 +88,8 @@
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.domain.Domain;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ConnectionException;
 import com.cloud.exception.InsufficientAddressCapacityException;
@@ -126,6 +131,8 @@
 import com.cloud.network.dao.NetworkAccountDao;
 import com.cloud.network.dao.NetworkAccountVO;
 import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDetailVO;
+import com.cloud.network.dao.NetworkDetailsDao;
 import com.cloud.network.dao.NetworkDomainDao;
 import com.cloud.network.dao.NetworkDomainVO;
 import com.cloud.network.dao.NetworkServiceMapDao;
@@ -139,6 +146,7 @@
 import com.cloud.network.dao.RemoteAccessVpnDao;
 import com.cloud.network.dao.RemoteAccessVpnVO;
 import com.cloud.network.element.AggregatedCommandExecutor;
+import com.cloud.network.element.ConfigDriveNetworkElement;
 import com.cloud.network.element.DhcpServiceProvider;
 import com.cloud.network.element.DnsServiceProvider;
 import com.cloud.network.element.IpDeployer;
@@ -147,6 +155,7 @@
 import com.cloud.network.element.RedundantResource;
 import com.cloud.network.element.StaticNatServiceProvider;
 import com.cloud.network.element.UserDataServiceProvider;
+import com.cloud.network.element.VirtualRouterElement;
 import com.cloud.network.guru.NetworkGuru;
 import com.cloud.network.guru.NetworkGuruAdditionalFunctions;
 import com.cloud.network.lb.LoadBalancingRulesManager;
@@ -209,6 +218,7 @@
 import com.cloud.vm.NicVO;
 import com.cloud.vm.ReservationContext;
 import com.cloud.vm.ReservationContextImpl;
+import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
@@ -225,8 +235,6 @@
 import com.cloud.vm.dao.VMInstanceDao;
 import com.google.common.base.Strings;
 
-import static org.apache.commons.lang.StringUtils.isNotBlank;
-
 /**
  * NetworkManagerImpl implements NetworkManager.
  */
@@ -293,6 +301,10 @@
     RemoteAccessVpnDao _remoteAccessVpnDao;
     @Inject
     VpcVirtualNetworkApplianceService _routerService;
+    @Inject
+    UserVmManager _userVmMgr;
+    @Inject
+    TemplateDeployAsIsDetailsDao templateDeployAsIsDetailsDao;
 
     List<NetworkGuru> networkGurus;
 
@@ -637,8 +649,8 @@
     @Override
     @DB
     public List<? extends Network> setupNetwork(final Account owner, final NetworkOffering offering, final Network predefined, final DeploymentPlan plan, final String name,
-            final String displayText, final boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId,
-            final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
+                                                final String displayText, final boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId,
+                                                final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
 
         final Account locked = _accountDao.acquireInLockTable(owner.getId());
         if (locked == null) {
@@ -648,8 +660,8 @@
         try {
             if (predefined == null
                     || offering.getTrafficType() != TrafficType.Guest && predefined.getCidr() == null && predefined.getBroadcastUri() == null && !(predefined
-                            .getBroadcastDomainType() == BroadcastDomainType.Vlan || predefined.getBroadcastDomainType() == BroadcastDomainType.Lswitch || predefined
-                            .getBroadcastDomainType() == BroadcastDomainType.Vxlan)) {
+                    .getBroadcastDomainType() == BroadcastDomainType.Vlan || predefined.getBroadcastDomainType() == BroadcastDomainType.Lswitch || predefined
+                    .getBroadcastDomainType() == BroadcastDomainType.Vxlan)) {
                 final List<NetworkVO> configs = _networksDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId());
                 if (configs.size() > 0) {
                     if (s_logger.isDebugEnabled()) {
@@ -739,12 +751,129 @@
     @Override
     @DB
     public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, List<? extends NicProfile>> networks, final Map<String, Map<Integer, String>> extraDhcpOptions) throws InsufficientCapacityException,
-    ConcurrentOperationException {
+            ConcurrentOperationException {
 
         Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
             @Override
             public void doInTransactionWithoutResult(final TransactionStatus status) throws InsufficientCapacityException {
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace(String.format("allocating networks for %s(template %s); %d networks",vm.getInstanceName(), vm.getTemplate().getUuid(), networks.size()));
+                }
                 int deviceId = 0;
+                int size;
+                size = determineNumberOfNicsRequired();
+
+                final boolean[] deviceIds = new boolean[size];
+                Arrays.fill(deviceIds, false);
+
+                List<Pair<Network, NicProfile>> profilesList = getOrderedNetworkNicProfileMapping(networks);
+                final List<NicProfile> nics = new ArrayList<NicProfile>(size);
+                NicProfile defaultNic = null;
+                Network nextNetwork = null;
+                for (Pair <Network, NicProfile> networkNicPair : profilesList) {
+                    nextNetwork = networkNicPair.first();
+                    Pair<NicProfile, Integer> newDeviceInfo = addRequestedNicToNicListWithDeviceNumberAndRetrieveDefaultDevice(networkNicPair.second(), deviceIds, deviceId, nextNetwork, nics, defaultNic);
+                    defaultNic = newDeviceInfo.first();
+                    deviceId = newDeviceInfo.second();
+                }
+                createExtraNics(size, nics, nextNetwork);
+
+                if (nics.size() == 1) {
+                    nics.get(0).setDefaultNic(true);
+                }
+            }
+
+            /**
+             * private transaction method to check and add devices to the nic list and update the info
+             */
+            Pair<NicProfile,Integer> addRequestedNicToNicListWithDeviceNumberAndRetrieveDefaultDevice(NicProfile requested, boolean[] deviceIds, int deviceId, Network nextNetwork, List<NicProfile> nics, NicProfile defaultNic)
+                    throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapacityException {
+                Pair<NicProfile, Integer> rc = new Pair<>(null,null);
+                Boolean isDefaultNic = false;
+                if (vm != null && requested != null && requested.isDefaultNic()) {
+                    isDefaultNic = true;
+                }
+
+                while (deviceIds[deviceId] && deviceId < deviceIds.length) {
+                    deviceId++;
+                }
+
+                final Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, nextNetwork, isDefaultNic, deviceId, vm);
+                NicProfile vmNic = null;
+                if (vmNicPair != null) {
+                    vmNic = vmNicPair.first();
+                    if (vmNic == null) {
+                        return rc;
+                    }
+                    deviceId = vmNicPair.second();
+                }
+
+                final int devId = vmNic.getDeviceId();
+                if (devId >= deviceIds.length) {
+                    throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
+                }
+                if (deviceIds[devId]) {
+                    throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
+                }
+
+                deviceIds[devId] = true;
+
+                if (vmNic.isDefaultNic()) {
+                    if (defaultNic != null) {
+                        throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
+                    }
+                    defaultNic = vmNic;
+                }
+
+                nics.add(vmNic);
+                vm.addNic(vmNic);
+                saveExtraDhcpOptions(nextNetwork.getUuid(), vmNic.getId(), extraDhcpOptions);
+                rc.first(defaultNic);
+                rc.second(deviceId);
+                return rc;
+            }
+
+            /**
+             * private transaction method to get oredered list of Network and NicProfile pair
+             * @return ordered list of Network and NicProfile pair
+             * @param networks the map od networks to nic profiles list
+             */
+            private List<Pair<Network, NicProfile>> getOrderedNetworkNicProfileMapping(final LinkedHashMap<? extends Network, List<? extends NicProfile>> networks) {
+                List<Pair<Network, NicProfile>> profilesList = new ArrayList<>();
+                for (final Map.Entry<? extends Network, List<? extends NicProfile>> network : networks.entrySet()) {
+                    List<? extends NicProfile> requestedProfiles = network.getValue();
+                    if (requestedProfiles == null) {
+                        requestedProfiles = new ArrayList<NicProfile>();
+                    }
+                    if (requestedProfiles.isEmpty()) {
+                        requestedProfiles.add(null);
+                    }
+                    for (final NicProfile requested : requestedProfiles) {
+                        profilesList.add(new Pair<Network, NicProfile>(network.getKey(), requested));
+                    }
+                }
+                profilesList.sort(new Comparator<Pair<Network, NicProfile>>() {
+                    @Override
+                    public int compare(Pair<Network, NicProfile> pair1, Pair<Network, NicProfile> pair2) {
+                        int profile1Order = Integer.MAX_VALUE;
+                        int profile2Order = Integer.MAX_VALUE;
+                        if (pair1 != null && pair1.second() != null && pair1.second().getOrderIndex() != null) {
+                            profile1Order = pair1.second().getOrderIndex();
+                        }
+                        if (pair2 != null && pair2.second() != null && pair2.second().getOrderIndex() != null) {
+                            profile2Order = pair2.second().getOrderIndex();
+                        }
+                        return profile1Order - profile2Order;
+                    }
+                });
+                return profilesList;
+            }
+
+            /**
+             * private transaction method to run over the objects and determine nic requirements
+             * @return the total numer of nics required
+             */
+            private int determineNumberOfNicsRequired() {
                 int size = 0;
                 for (final Network ntwk : networks.keySet()) {
                     final List<? extends NicProfile> profiles = networks.get(ntwk);
@@ -755,71 +884,35 @@
                     }
                 }
 
-                final boolean[] deviceIds = new boolean[size];
-                Arrays.fill(deviceIds, false);
-
-                final List<NicProfile> nics = new ArrayList<NicProfile>(size);
-                NicProfile defaultNic = null;
-
-                for (final Map.Entry<? extends Network, List<? extends NicProfile>> network : networks.entrySet()) {
-                    final Network config = network.getKey();
-                    List<? extends NicProfile> requestedProfiles = network.getValue();
-                    if (requestedProfiles == null) {
-                        requestedProfiles = new ArrayList<NicProfile>();
-                    }
-                    if (requestedProfiles.isEmpty()) {
-                        requestedProfiles.add(null);
-                    }
-
-                    for (final NicProfile requested : requestedProfiles) {
-                        Boolean isDefaultNic = false;
-                        if (vm != null && requested != null && requested.isDefaultNic()) {
-                            isDefaultNic = true;
-                        }
-
-                        while (deviceIds[deviceId] && deviceId < deviceIds.length) {
-                            deviceId++;
-                        }
-
-                        final Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
-                        NicProfile vmNic = null;
-                        if (vmNicPair != null) {
-                            vmNic = vmNicPair.first();
-                            if (vmNic == null) {
-                                continue;
-                            }
-                            deviceId = vmNicPair.second();
-                        }
-
-                        final int devId = vmNic.getDeviceId();
-                        if (devId >= deviceIds.length) {
-                            throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
-                        }
-                        if (deviceIds[devId]) {
-                            throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
-                        }
-
-                        deviceIds[devId] = true;
-
-                        if (vmNic.isDefaultNic()) {
-                            if (defaultNic != null) {
-                                throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
-                            }
-                            defaultNic = vmNic;
-                        }
-
-                        nics.add(vmNic);
-                        vm.addNic(vmNic);
-                        saveExtraDhcpOptions(config.getUuid(), vmNic.getId(), extraDhcpOptions);
-                    }
+                List<OVFNetworkTO> netprereqs = templateDeployAsIsDetailsDao.listNetworkRequirementsByTemplateId(vm.getTemplate().getId());
+                if (size < netprereqs.size()) {
+                    size = netprereqs.size();
                 }
+                return size;
+            }
+
+            /**
+             * private transaction method to add nics as required
+             * @param size the number needed
+             * @param nics the list of nics present
+             * @param finalNetwork the network to add the nics to
+             * @throws InsufficientVirtualNetworkCapacityException great
+             * @throws InsufficientAddressCapacityException also magnificent, as the name sugests
+             */
+            private void createExtraNics(int size, List<NicProfile> nics, Network finalNetwork) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
                 if (nics.size() != size) {
                     s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested nics " + size);
-                    throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + size);
-                }
-
-                if (nics.size() == 1) {
-                    nics.get(0).setDefaultNic(true);
+                    if (nics.size() > size) {
+                        throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + size);
+                    } else {
+                        if (finalNetwork == null) {
+                            throw new CloudRuntimeException(String.format("can not assign network to %d remaining required NICs", size - nics.size()));
+                        }
+                        // create extra
+                        for ( int extraNicNum = nics.size() ; extraNicNum < size; extraNicNum ++) {
+                            final Pair<NicProfile, Integer> vmNicPair = allocateNic(new NicProfile(), finalNetwork, false, extraNicNum, vm);
+                        }
+                    }
                 }
             }
         });
@@ -1077,7 +1170,7 @@
     }
 
     Pair<NetworkGuru, NetworkVO> implementNetwork(final long networkId, final DeployDestination dest, final ReservationContext context, final boolean isRouter) throws ConcurrentOperationException,
-    ResourceUnavailableException, InsufficientCapacityException {
+            ResourceUnavailableException, InsufficientCapacityException {
         Pair<NetworkGuru, NetworkVO> implemented = null;
         if (!isRouter) {
             implemented = implementNetwork(networkId, dest, context);
@@ -1097,7 +1190,7 @@
     @Override
     @DB
     public Pair<NetworkGuru, NetworkVO> implementNetwork(final long networkId, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException,
-    ResourceUnavailableException, InsufficientCapacityException {
+            ResourceUnavailableException, InsufficientCapacityException {
         final Pair<NetworkGuru, NetworkVO> implemented = new Pair<NetworkGuru, NetworkVO>(null, null);
 
         NetworkVO network = _networksDao.findById(networkId);
@@ -1388,7 +1481,7 @@
     }
 
     protected boolean prepareElement(final NetworkElement element, final Network network, final NicProfile profile, final VirtualMachineProfile vmProfile, final DeployDestination dest,
-            final ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+                                     final ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
         element.prepare(network, profile, vmProfile, dest, context);
         if (vmProfile.getType() == Type.User && element.getProvider() != null) {
             if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)
@@ -1574,11 +1667,11 @@
                 if (element instanceof RedundantResource) {
                     resourceCount= ((RedundantResource) element).getResourceCount(network);
                     break;
-                    }
                 }
             }
-        return resourceCount;
         }
+        return resourceCount;
+    }
 
     @Override
     public void configureExtraDhcpOptions(Network network, long nicId, Map<Integer, String> extraDhcpOptions) {
@@ -1610,6 +1703,26 @@
         }
     }
 
+    @Override
+    public void setHypervisorHostname(VirtualMachineProfile vm, DeployDestination dest, boolean migrationSuccessful) throws ResourceUnavailableException {
+        final List<NicVO> nics = _nicDao.listByVmId(vm.getId());
+        for (final NicVO nic : nics) {
+            final NetworkVO network = _networksDao.findById(nic.getNetworkId());
+            final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId());
+            final NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network),
+                    _networkModel.getNetworkTag(vm.getHypervisorType(), network));
+            for (final NetworkElement element : networkElements) {
+                if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) && element instanceof UserDataServiceProvider) {
+                    if (element instanceof ConfigDriveNetworkElement && !migrationSuccessful || element instanceof VirtualRouterElement && migrationSuccessful) {
+                        final UserDataServiceProvider sp = (UserDataServiceProvider) element;
+                        if (!sp.saveHypervisorHostname(profile, network, vm, dest)) {
+                            throw new CloudRuntimeException("Failed to Add hypervisor hostname");
+                        }
+                    }
+                }
+            }
+        }
+    }
 
     @DB
     protected void updateNic(final NicVO nic, final long networkId, final int count) {
@@ -1633,7 +1746,7 @@
 
     @Override
     public void prepare(final VirtualMachineProfile vmProfile, final DeployDestination dest, final ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException,
-    ResourceUnavailableException {
+            ResourceUnavailableException {
         final List<NicVO> nics = _nicDao.listByVmId(vmProfile.getId());
 
         // we have to implement default nics first - to ensure that default network elements start up first in multiple
@@ -1745,7 +1858,6 @@
                 .collect(Collectors.toMap(NicExtraDhcpOptionVO::getCode, NicExtraDhcpOptionVO::getValue));
     }
 
-
     @Override
     public void prepareNicForMigration(final VirtualMachineProfile vm, final DeployDestination dest) {
         if(vm.getType().equals(VirtualMachine.Type.DomainRouter) && (vm.getHypervisorType().equals(HypervisorType.KVM) || vm.getHypervisorType().equals(HypervisorType.VMware))) {
@@ -1767,6 +1879,11 @@
                     s_logger.error("NetworkGuru " + guru + " prepareForMigration failed."); // XXX: Transaction error
                 }
             }
+
+            if (network.getGuestType() == Network.GuestType.L2 && vm.getType() == VirtualMachine.Type.User) {
+                _userVmMgr.setupVmForPvlan(false, vm.getVirtualMachine().getHostId(), profile);
+            }
+
             final List<Provider> providersToImplement = getNetworkProviders(network.getId());
             for (final NetworkElement element : networkElements) {
                 if (providersToImplement.contains(element.getProvider())) {
@@ -1887,6 +2004,11 @@
             if (guru instanceof NetworkMigrationResponder) {
                 ((NetworkMigrationResponder)guru).commitMigration(nicSrc, network, src, src_context, dst_context);
             }
+
+            if (network.getGuestType() == Network.GuestType.L2 && src.getType() == VirtualMachine.Type.User) {
+                _userVmMgr.setupVmForPvlan(true, src.getVirtualMachine().getHostId(), nicSrc);
+            }
+
             final List<Provider> providersToImplement = getNetworkProviders(network.getId());
             for (final NetworkElement element : networkElements) {
                 if (providersToImplement.contains(element.getProvider())) {
@@ -1918,6 +2040,11 @@
             if (guru instanceof NetworkMigrationResponder) {
                 ((NetworkMigrationResponder)guru).rollbackMigration(nicDst, network, dst, src_context, dst_context);
             }
+
+            if (network.getGuestType() == Network.GuestType.L2 && src.getType() == VirtualMachine.Type.User) {
+                _userVmMgr.setupVmForPvlan(true, dst.getVirtualMachine().getHostId(), nicDst);
+            }
+
             final List<Provider> providersToImplement = getNetworkProviders(network.getId());
             for (final NetworkElement element : networkElements) {
                 if (providersToImplement.contains(element.getProvider())) {
@@ -2057,8 +2184,12 @@
             }
         }
 
-        nic.setState(Nic.State.Deallocating);
-        _nicDao.update(nic.getId(), nic);
+        Boolean preserveNics = (Boolean) vm.getParameter(VirtualMachineProfile.Param.PreserveNics);
+        if (BooleanUtils.isNotTrue(preserveNics)) {
+            nic.setState(Nic.State.Deallocating);
+            _nicDao.update(nic.getId(), nic);
+        }
+
         final NicProfile profile = new NicProfile(nic, network, null, null, null, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(
                 vm.getHypervisorType(), network));
 
@@ -2113,7 +2244,9 @@
 
         final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, network.getGuruName());
         guru.deallocate(network, profile, vm);
-        _nicDao.remove(nic.getId());
+        if (BooleanUtils.isNotTrue(preserveNics)) {
+            _nicDao.remove(nic.getId());
+        }
 
         s_logger.debug("Removed nic id=" + nic.getId());
         //remove the secondary ip addresses corresponding to to this nic
@@ -2198,9 +2331,9 @@
 
     @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 {
+                                       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 NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
         final DataCenterVO zone = _dcDao.findById(zoneId);
@@ -2219,7 +2352,7 @@
         // Validate network offering
         if (ntwkOff.getState() != NetworkOffering.State.Enabled) {
             // see NetworkOfferingVO
-            final InvalidParameterValueException ex = new InvalidParameterValueException("Can't use specified network offering id as its stat is not " + NetworkOffering.State.Enabled);
+            final InvalidParameterValueException ex = new InvalidParameterValueException("Can't use specified network offering id as its state is not " + NetworkOffering.State.Enabled);
             ex.addProxyObject(ntwkOff.getUuid(), "networkOfferingId");
             throw ex;
         }
@@ -2316,12 +2449,12 @@
             URI secondaryUri = isNotBlank(isolatedPvlan) ? BroadcastDomainType.fromString(isolatedPvlan) : null;
             //don't allow to specify vlan tag used by physical network for dynamic vlan allocation
             if (!(bypassVlanOverlapCheck && ntwkOff.getGuestType() == GuestType.Shared) && _dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(uri)).size() > 0) {
-                throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone "
+                throw new InvalidParameterValueException("The VLAN tag to use for new guest network, " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone "
                         + zone.getName());
             }
             if (secondaryUri != null && !(bypassVlanOverlapCheck && ntwkOff.getGuestType() == GuestType.Shared) &&
                     _dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(secondaryUri)).size() > 0) {
-                throw new InvalidParameterValueException("The VLAN tag " + isolatedPvlan + " is already being used for dynamic vlan allocation for the guest network in zone "
+                throw new InvalidParameterValueException("The VLAN tag for isolated PVLAN " + isolatedPvlan + " is already being used for dynamic vlan allocation for the guest network in zone "
                         + zone.getName());
             }
             if (! UuidUtils.validateUUID(vlanId)){
@@ -2470,6 +2603,12 @@
                         } else {
                             uri = encodeVlanIdIntoBroadcastUri(vlanIdFinal, pNtwk);
                         }
+
+                        if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString()).size() > 0) {
+                            throw new InvalidParameterValueException("Network with vlan " + vlanIdFinal +
+                                " already exists or overlaps with other network pvlans in zone " + zoneId);
+                        }
+
                         userNetwork.setBroadcastUri(uri);
                         if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
                             userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
@@ -2480,7 +2619,7 @@
                         if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
                             throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
                         }
-                        URI uri = NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan);
+                        URI uri = NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan, isolatedPvlanType.toString());
                         if (_networksDao.listByPhysicalNetworkPvlan(physicalNetworkId, uri.toString(), isolatedPvlanType).size() > 0) {
                             throw new InvalidParameterValueException("Network with primary vlan " + vlanIdFinal +
                                     " and secondary vlan " + isolatedPvlan + " type " + isolatedPvlanType +
@@ -2554,7 +2693,7 @@
     return bypassVlanOverlapCheck && (ntwkOff.getGuestType() != GuestType.Isolated || isPrivateNetwork);
   }
 
-  /**
+    /**
      * Checks for L2 network offering services. Only 2 cases allowed:
      * - No services
      * - User Data service only, provided by ConfigDrive
@@ -2982,7 +3121,7 @@
 
     @Override
     public boolean startNetwork(final long networkId, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
-    InsufficientCapacityException {
+            InsufficientCapacityException {
 
         // Check if network exists
         final NetworkVO network = _networksDao.findById(networkId);
@@ -3005,7 +3144,7 @@
 
     @Override
     public boolean restartNetwork(final Long networkId, final Account callerAccount, final User callerUser, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException,
-    InsufficientCapacityException {
+            InsufficientCapacityException {
         boolean status = true;
         boolean restartRequired = false;
         final NetworkVO network = _networksDao.findById(networkId);
@@ -3257,10 +3396,10 @@
         final NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId);
         if (networkOffering.getGuestType() == Network.GuestType.Shared
                 && (_networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.SourceNat)
-                        || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.StaticNat)
-                        || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Firewall)
-                        || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.PortForwarding) || _networkModel.areServicesSupportedByNetworkOffering(
-                                networkOfferingId, Service.Lb))) {
+                || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.StaticNat)
+                || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.Firewall)
+                || _networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.PortForwarding) || _networkModel.areServicesSupportedByNetworkOffering(
+                networkOfferingId, Service.Lb))) {
             return true;
         }
         return false;
@@ -4024,7 +4163,7 @@
 
     @DB
     @Override
-    public Pair<NicProfile, Integer> importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses)
+    public Pair<NicProfile, Integer> importNic(final String macAddress, int deviceId, final Network network, final Boolean isDefaultNic, final VirtualMachine vm, final Network.IpAddresses ipAddresses, final boolean forced)
             throws ConcurrentOperationException, InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
         s_logger.debug("Allocating nic for vm " + vm.getUuid() + " in network " + network + " during import");
         String guestIp = null;
@@ -4046,6 +4185,17 @@
         final NicVO vo = Transaction.execute(new TransactionCallback<NicVO>() {
             @Override
             public NicVO doInTransaction(TransactionStatus status) {
+                NicVO existingNic = _nicDao.findByNetworkIdAndMacAddress(network.getId(), macAddress);
+                if (existingNic != null) {
+                    if (!forced) {
+                        throw new CloudRuntimeException("NIC with MAC address = " + macAddress + " exists on network with ID = " + network.getId() +
+                                " and forced flag is disabled");
+                    }
+                    s_logger.debug("Removing existing NIC with MAC address = " + macAddress + " on network with ID = " + network.getId());
+                    existingNic.setState(Nic.State.Deallocating);
+                    existingNic.setRemoved(new Date());
+                    _nicDao.update(existingNic.getId(), existingNic);
+                }
                 NicVO vo = new NicVO(network.getGuruName(), vm.getId(), network.getId(), vm.getType());
                 vo.setMacAddress(macAddress);
                 vo.setAddressFormat(Networks.AddressFormat.Ip4);
@@ -4088,6 +4238,24 @@
     }
 
     @Override
+    public void unmanageNics(VirtualMachineProfile vm) {
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Unmanaging NICs for VM: " + vm.getId());
+        }
+
+        VirtualMachine virtualMachine = vm.getVirtualMachine();
+        final List<NicVO> nics = _nicDao.listByVmId(vm.getId());
+        for (final NicVO nic : nics) {
+            removeNic(vm, nic);
+            NetworkVO network = _networksDao.findById(nic.getNetworkId());
+            if (virtualMachine.getState() != VirtualMachine.State.Stopped) {
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, virtualMachine.getAccountId(), virtualMachine.getDataCenterId(), virtualMachine.getId(),
+                        Long.toString(nic.getId()), network.getNetworkOfferingId(), null, 0L, virtualMachine.getClass().getName(), virtualMachine.getUuid(), virtualMachine.isDisplay());
+            }
+        }
+    }
+
+    @Override
     public String getConfigComponentName() {
         return NetworkOrchestrationService.class.getSimpleName();
     }
@@ -4103,4 +4271,4 @@
                 GuestDomainSuffix, NetworkThrottlingRate, MinVRVersion,
                 PromiscuousMode, MacAddressChanges, ForgedTransmits, RollingRestartEnabled};
     }
-}
+}
\ No newline at end of file
diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/StorageOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/StorageOrchestrator.java
new file mode 100644
index 0000000..ab53fd4
--- /dev/null
+++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/StorageOrchestrator.java
@@ -0,0 +1,451 @@
+// 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.engine.orchestration;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.api.response.MigrationResponse;
+import org.apache.cloudstack.engine.orchestration.service.StorageOrchestrationService;
+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.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.SecondaryStorageService;
+import org.apache.cloudstack.engine.subsystem.api.storage.SecondaryStorageService.DataObjectResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
+import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
+import org.apache.cloudstack.framework.async.AsyncCallFuture;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.ImageStoreService.MigrationPolicy;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
+import org.apache.commons.math3.stat.descriptive.moment.Mean;
+import org.apache.commons.math3.stat.descriptive.moment.StandardDeviation;
+import org.apache.log4j.Logger;
+
+import com.cloud.server.StatsCollector;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.StorageManager;
+import com.cloud.storage.StorageService;
+import com.cloud.storage.StorageStats;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.utils.Pair;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class StorageOrchestrator extends ManagerBase implements StorageOrchestrationService, Configurable {
+
+    private static final Logger s_logger = Logger.getLogger(StorageOrchestrator.class);
+    @Inject
+    SnapshotDataStoreDao snapshotDataStoreDao;
+    @Inject
+    SnapshotDao snapshotDao;
+    @Inject
+    SnapshotDataFactory snapshotFactory;
+    @Inject
+    DataStoreManager dataStoreManager;
+    @Inject
+    StatsCollector statsCollector;
+    @Inject
+    public StorageService storageService;
+    @Inject
+    ConfigurationDao configDao;
+    @Inject
+    private SecondaryStorageService secStgSrv;
+    @Inject
+    TemplateDataStoreDao templateDataStoreDao;
+    @Inject
+    VolumeDataStoreDao volumeDataStoreDao;
+    @Inject
+    DataMigrationUtility migrationHelper;
+
+    ConfigKey<Double> ImageStoreImbalanceThreshold = new ConfigKey<>("Advanced", Double.class,
+            "image.store.imbalance.threshold",
+            "0.3",
+            "The storage imbalance threshold that is compared with the standard deviation percentage for a storage utilization metric. " +
+                    "The value is a percentage in decimal format.",
+            true, ConfigKey.Scope.Global);
+
+    Integer numConcurrentCopyTasksPerSSVM = 2;
+    private double imageStoreCapacityThreshold = 0.90;
+
+    @Override
+    public String getConfigComponentName() {
+        return StorageOrchestrationService.class.getName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[]{ImageStoreImbalanceThreshold};
+    }
+
+    static class MigrateBlockingQueue<T> extends ArrayBlockingQueue<T> {
+
+        MigrateBlockingQueue(int size) {
+            super(size);
+        }
+
+        public boolean offer(T task) {
+            try {
+                this.put(task);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+            return true;
+        }
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        numConcurrentCopyTasksPerSSVM = StorageManager.SecStorageMaxMigrateSessions.value();
+        return true;
+    }
+
+    @Override
+    public MigrationResponse migrateData(Long srcDataStoreId, List<Long> destDatastores, MigrationPolicy migrationPolicy) {
+        List<DataObject> files = new LinkedList<>();
+        boolean success = true;
+        String message = null;
+
+        migrationHelper.checkIfCompleteMigrationPossible(migrationPolicy, srcDataStoreId);
+        DataStore srcDatastore = dataStoreManager.getDataStore(srcDataStoreId, DataStoreRole.Image);
+        Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains = new HashMap<>();
+        files = migrationHelper.getSortedValidSourcesList(srcDatastore, snapshotChains);
+
+        if (files.isEmpty()) {
+            return new MigrationResponse("No files in Image store "+srcDatastore.getId()+ " to migrate", migrationPolicy.toString(), true);
+        }
+        Map<Long, Pair<Long, Long>> storageCapacities = new Hashtable<>();
+        for (Long storeId : destDatastores) {
+            storageCapacities.put(storeId, new Pair<>(null, null));
+        }
+        storageCapacities.put(srcDataStoreId, new Pair<>(null, null));
+        if (migrationPolicy == MigrationPolicy.COMPLETE) {
+            s_logger.debug("Setting source image store "+srcDatastore.getId()+ " to read-only");
+            storageService.updateImageStoreStatus(srcDataStoreId, true);
+        }
+
+        storageCapacities = getStorageCapacities(storageCapacities, srcDataStoreId);
+        double meanstddev = getStandardDeviation(storageCapacities);
+        double threshold = ImageStoreImbalanceThreshold.value();
+        MigrationResponse response = null;
+        ThreadPoolExecutor executor = new ThreadPoolExecutor(numConcurrentCopyTasksPerSSVM , numConcurrentCopyTasksPerSSVM, 30,
+                TimeUnit.MINUTES, new MigrateBlockingQueue<>(numConcurrentCopyTasksPerSSVM));
+        Date start = new Date();
+        if (meanstddev < threshold && migrationPolicy == MigrationPolicy.BALANCE) {
+            s_logger.debug("mean std deviation of the image stores is below threshold, no migration required");
+            response = new MigrationResponse("Migration not required as system seems balanced", migrationPolicy.toString(), true);
+            return response;
+        }
+
+        List<Future<AsyncCallFuture<DataObjectResult>>> futures = new ArrayList<>();
+        while (true) {
+            DataObject chosenFileForMigration = null;
+            if (files.size() > 0) {
+                chosenFileForMigration = files.remove(0);
+            }
+
+            storageCapacities = getStorageCapacities(storageCapacities, srcDataStoreId);
+            List<Long> orderedDS = migrationHelper.sortDataStores(storageCapacities);
+            Long destDatastoreId = orderedDS.get(0);
+
+            if (chosenFileForMigration == null || destDatastoreId == null || (destDatastoreId == srcDatastore.getId() && migrationPolicy == MigrationPolicy.BALANCE) ) {
+                Pair<String, Boolean> result = migrateCompleted(destDatastoreId, srcDatastore, files, migrationPolicy);
+                message = result.first();
+                success = result.second();
+                break;
+            }
+
+            if (migrationPolicy == MigrationPolicy.COMPLETE && destDatastoreId == srcDatastore.getId()) {
+                destDatastoreId = orderedDS.get(1);
+            }
+
+            if (chosenFileForMigration.getSize() > storageCapacities.get(destDatastoreId).first()) {
+                s_logger.debug("file: " + chosenFileForMigration.getId() + " too large to be migrated to " + destDatastoreId);
+                continue;
+            }
+
+            if (shouldMigrate(chosenFileForMigration, srcDatastore.getId(), destDatastoreId, storageCapacities, snapshotChains, migrationPolicy)) {
+                storageCapacities = migrateAway(chosenFileForMigration, storageCapacities, snapshotChains, srcDatastore, destDatastoreId, executor, futures);
+            } else {
+                if (migrationPolicy == MigrationPolicy.BALANCE) {
+                    continue;
+                }
+                message = "Complete migration failed. Please set the source Image store to read-write mode if you want to continue using it";
+                success = false;
+                break;
+            }
+        }
+        Date end = new Date();
+        handleSnapshotMigration(srcDataStoreId, start, end, migrationPolicy, futures, storageCapacities, executor);
+        return handleResponse(futures, migrationPolicy, message, success);
+    }
+
+    protected Pair<String, Boolean> migrateCompleted(Long destDatastoreId, DataStore srcDatastore, List<DataObject> files, MigrationPolicy migrationPolicy) {
+        String message = "";
+        boolean success = true;
+        if (destDatastoreId == srcDatastore.getId() && !files.isEmpty()) {
+            if (migrationPolicy == MigrationPolicy.BALANCE) {
+                s_logger.debug("Migration completed : data stores have been balanced ");
+                if (destDatastoreId == srcDatastore.getId()) {
+                    message = "Seems like source datastore has more free capacity than the destination(s)";
+                }
+                message += "Image stores have been attempted to be balanced";
+                success = true;
+            } else {
+                message = "Files not completely migrated from "+ srcDatastore.getId() + ". Datastore (source): " + srcDatastore.getId() + "has equal or more free space than destination."+
+                        " If you want to continue using the Image Store, please change the read-only status using 'update imagestore' command";
+                success = false;
+            }
+        } else {
+            message = "Migration completed";
+        }
+        return new Pair<String, Boolean>(message, success);
+    }
+
+    protected Map<Long, Pair<Long, Long>> migrateAway(DataObject chosenFileForMigration, Map<Long, Pair<Long, Long>> storageCapacities,
+                               Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains, DataStore srcDatastore, Long destDatastoreId, ThreadPoolExecutor executor,
+    List<Future<AsyncCallFuture<DataObjectResult>>> futures) {
+        Long fileSize = migrationHelper.getFileSize(chosenFileForMigration, snapshotChains);
+        storageCapacities = assumeMigrate(storageCapacities, srcDatastore.getId(), destDatastoreId, fileSize);
+        long activeSsvms = migrationHelper.activeSSVMCount(srcDatastore);
+        long totalJobs = activeSsvms * numConcurrentCopyTasksPerSSVM;
+        // Increase thread pool size with increase in number of SSVMs
+        if ( totalJobs > executor.getCorePoolSize()) {
+            executor.setMaximumPoolSize((int) (totalJobs));
+            executor.setCorePoolSize((int) (totalJobs));
+        }
+
+        MigrateDataTask task = new MigrateDataTask(chosenFileForMigration, srcDatastore, dataStoreManager.getDataStore(destDatastoreId, DataStoreRole.Image));
+        if (chosenFileForMigration instanceof SnapshotInfo ) {
+            task.setSnapshotChains(snapshotChains);
+        }
+        futures.add((executor.submit(task)));
+        s_logger.debug("Migration of file  " + chosenFileForMigration.getId() + " is initiated");
+        return storageCapacities;
+    }
+
+
+
+    private MigrationResponse handleResponse(List<Future<AsyncCallFuture<DataObjectResult>>> futures, MigrationPolicy migrationPolicy, String message, boolean success) {
+        int successCount = 0;
+        for (Future<AsyncCallFuture<DataObjectResult>> future : futures) {
+            try {
+                AsyncCallFuture<DataObjectResult> res = future.get();
+                if (res.get().isSuccess()) {
+                    successCount++;
+                }
+            } catch ( InterruptedException | ExecutionException e) {
+                s_logger.warn("Failed to get result");
+                continue;
+            }
+        }
+        message += ". successful migrations: "+successCount;
+        return new MigrationResponse(message, migrationPolicy.toString(), success);
+    }
+
+    private void handleSnapshotMigration(Long srcDataStoreId, Date start, Date end, MigrationPolicy policy,
+                                          List<Future<AsyncCallFuture<DataObjectResult>>> futures, Map<Long, Pair<Long, Long>> storageCapacities, ThreadPoolExecutor executor) {
+        DataStore srcDatastore = dataStoreManager.getDataStore(srcDataStoreId, DataStoreRole.Image);
+        List<SnapshotDataStoreVO> snaps = snapshotDataStoreDao.findSnapshots(srcDataStoreId, start, end);
+        if (!snaps.isEmpty()) {
+            for (SnapshotDataStoreVO snap : snaps) {
+                SnapshotVO snapshotVO = snapshotDao.findById(snap.getSnapshotId());
+                SnapshotInfo snapshotInfo = snapshotFactory.getSnapshot(snapshotVO.getSnapshotId(), DataStoreRole.Image);
+                SnapshotInfo parentSnapshot = snapshotInfo.getParent();
+
+                if (parentSnapshot == null && policy == MigrationPolicy.COMPLETE) {
+                    List<Long> dstores = migrationHelper.sortDataStores(storageCapacities);
+                    Long storeId = dstores.get(0);
+                    if (storeId.equals(srcDataStoreId)) {
+                        storeId = dstores.get(1);
+                    }
+                    DataStore datastore =  dataStoreManager.getDataStore(storeId, DataStoreRole.Image);
+                    futures.add(executor.submit(new MigrateDataTask(snapshotInfo, srcDatastore, datastore)));
+                }
+                if (parentSnapshot != null) {
+                    DataStore parentDS = dataStoreManager.getDataStore(parentSnapshot.getDataStore().getId(), DataStoreRole.Image);
+                    if (parentDS.getId() != snapshotInfo.getDataStore().getId()) {
+                        futures.add(executor.submit(new MigrateDataTask(snapshotInfo, srcDatastore, parentDS)));
+                    }
+                }
+            }
+        }
+    }
+
+    private Map<Long, Pair<Long, Long>> getStorageCapacities(Map<Long, Pair<Long, Long>> storageCapacities, Long srcDataStoreId) {
+        Map<Long, Pair<Long, Long>> capacities = new Hashtable<>();
+        for (Long storeId : storageCapacities.keySet()) {
+            StorageStats stats = statsCollector.getStorageStats(storeId);
+            if (stats != null) {
+                if (storageCapacities.get(storeId) == null || storageCapacities.get(storeId).first() == null || storageCapacities.get(storeId).second() == null) {
+                    capacities.put(storeId, new Pair<>(stats.getCapacityBytes() - stats.getByteUsed(), stats.getCapacityBytes()));
+                } else {
+                    long totalCapacity = stats.getCapacityBytes();
+                    Long freeCapacity = totalCapacity - stats.getByteUsed();
+                    if (storeId.equals(srcDataStoreId) || freeCapacity < storageCapacities.get(storeId).first()) {
+                        capacities.put(storeId, new Pair<>(freeCapacity, totalCapacity));
+                    } else {
+                        capacities.put(storeId, storageCapacities.get(storeId));
+                    }
+                }
+            } else {
+                throw new CloudRuntimeException("Stats Collector hasn't yet collected metrics from the Image store, kindly try again later");
+            }
+        }
+        return capacities;
+    }
+
+
+    /**
+     *
+     * @param storageCapacities Map comprising the metrics(free and total capacities) of the images stores considered
+     * @return mean standard deviation
+     */
+    private double getStandardDeviation(Map<Long, Pair<Long, Long>> storageCapacities) {
+        double[] freeCapacities = storageCapacities.values().stream().mapToDouble(x -> ((double) x.first() / x.second())).toArray();
+        double mean = calculateStorageMean(freeCapacities);
+        return (calculateStorageStandardDeviation(freeCapacities, mean) / mean);
+    }
+
+    /**
+     *
+     * @param storageCapacities Map comprising the metrics(free and total capacities) of the images stores considered
+     * @param srcDsId source image store ID from where data is to be migrated
+     * @param destDsId destination image store ID to where data is to be migrated
+     * @param fileSize size of the data object to be migrated so as to recompute the storage metrics
+     * @return a map - Key: Datastore ID ;  Value: Pair<Free Capacity , Total Capacity>
+     */
+    private Map<Long, Pair<Long, Long>> assumeMigrate(Map<Long, Pair<Long, Long>> storageCapacities, Long srcDsId, Long destDsId, Long fileSize) {
+        Map<Long, Pair<Long, Long>> modifiedCapacities = new Hashtable<>();
+        modifiedCapacities.putAll(storageCapacities);
+        Pair<Long, Long> srcDSMetrics = storageCapacities.get(srcDsId);
+        Pair<Long, Long> destDSMetrics = storageCapacities.get(destDsId);
+        modifiedCapacities.put(srcDsId, new Pair<>(srcDSMetrics.first() + fileSize, srcDSMetrics.second()));
+        modifiedCapacities.put(destDsId, new Pair<>(destDSMetrics.first() - fileSize, destDSMetrics.second()));
+        return modifiedCapacities;
+    }
+
+    /**
+     * This function determines if migration should in fact take place or not :
+     *  - For Balanced migration - the mean standard deviation is calculated before and after (supposed) migration
+     *      and a decision is made if migration is afterall beneficial
+     *  - For Complete migration - We check if the destination image store has sufficient capacity i.e., below the threshold of (90%)
+     *      and then proceed with the migration
+     * @param chosenFile file for migration
+     * @param srcDatastoreId source image store ID from where data is to be migrated
+     * @param destDatastoreId destination image store ID to where data is to be migrated
+     * @param storageCapacities Map comprising the metrics(free and total capacities) of the images stores considered
+     * @param snapshotChains Map containing details of chain of snapshots and their cumulative size
+     * @param migrationPolicy determines whether a "Balance" or "Complete" migration operation is to be performed
+     * @return
+     */
+    private boolean shouldMigrate(DataObject chosenFile, Long srcDatastoreId, Long destDatastoreId, Map<Long, Pair<Long, Long>> storageCapacities,
+                                  Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChains, MigrationPolicy migrationPolicy) {
+
+        if (migrationPolicy == MigrationPolicy.BALANCE) {
+            double meanStdDevCurrent = getStandardDeviation(storageCapacities);
+
+            Long fileSize = migrationHelper.getFileSize(chosenFile, snapshotChains);
+            Map<Long, Pair<Long, Long>> proposedCapacities = assumeMigrate(storageCapacities, srcDatastoreId, destDatastoreId, fileSize);
+            double meanStdDevAfter = getStandardDeviation(proposedCapacities);
+
+            if (meanStdDevAfter > meanStdDevCurrent) {
+                s_logger.debug("migrating the file doesn't prove to be beneficial, skipping migration");
+                return false;
+            }
+
+            Double threshold = ImageStoreImbalanceThreshold.value();
+            if (meanStdDevCurrent > threshold && storageCapacityBelowThreshold(storageCapacities, destDatastoreId)) {
+                return true;
+            }
+        } else {
+            if (storageCapacityBelowThreshold(storageCapacities, destDatastoreId)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean storageCapacityBelowThreshold(Map<Long, Pair<Long, Long>> storageCapacities, Long destStoreId) {
+        Pair<Long, Long> imageStoreCapacity = storageCapacities.get(destStoreId);
+        long usedCapacity = imageStoreCapacity.second() - imageStoreCapacity.first();
+        if (imageStoreCapacity != null && (usedCapacity / (imageStoreCapacity.second() * 1.0)) <= imageStoreCapacityThreshold) {
+            s_logger.debug("image store: " + destStoreId + " has sufficient capacity to proceed with migration of file");
+            return true;
+        }
+        s_logger.debug("Image store capacity threshold exceeded, migration not possible");
+        return false;
+    }
+
+    private double calculateStorageMean(double[] storageMetrics) {
+        return new Mean().evaluate(storageMetrics);
+    }
+
+    private double calculateStorageStandardDeviation(double[] metricValues, double mean) {
+        StandardDeviation standardDeviation = new StandardDeviation(false);
+        return standardDeviation.evaluate(metricValues, mean);
+    }
+
+    private class MigrateDataTask implements Callable<AsyncCallFuture<DataObjectResult>> {
+        private DataObject file;
+        private DataStore srcDataStore;
+        private DataStore destDataStore;
+        private Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChain;
+        public MigrateDataTask(DataObject file, DataStore srcDataStore, DataStore destDataStore) {
+            this.file = file;
+            this.srcDataStore = srcDataStore;
+            this.destDataStore = destDataStore;
+        }
+
+        public void setSnapshotChains(Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChain) {
+            this.snapshotChain = snapshotChain;
+        }
+
+        public Map<DataObject, Pair<List<SnapshotInfo>, Long>> getSnapshotChain() {
+            return snapshotChain;
+        }
+        public DataObject getFile() {
+            return file;
+        }
+
+        @Override
+        public AsyncCallFuture<DataObjectResult> call() throws Exception {
+            return secStgSrv.migrateData(file, srcDataStore, destDataStore, snapshotChain);
+        }
+    }
+}
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 9e2168e..e4cb893 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
@@ -19,6 +19,7 @@
 package org.apache.cloudstack.engine.orchestration;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -26,10 +27,20 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 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;
+import com.cloud.vm.VmDetailConstants;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
+import com.cloud.vm.dao.UserVmDetailsDao;
 import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd;
 import org.apache.cloudstack.api.command.admin.volume.MigrateVolumeCmdByAdmin;
 import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
@@ -51,6 +62,7 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
 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.TemplateService;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService;
@@ -68,6 +80,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.CollectionUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.to.DataTO;
@@ -139,6 +152,9 @@
 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;
 
 public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrationService, Configurable {
 
@@ -196,6 +212,14 @@
     protected UserVmCloneSettingDao _vmCloneSettingDao;
     @Inject
     StorageStrategyFactory _storageStrategyFactory;
+    @Inject
+    VMTemplateDetailsDao templateDetailsDao;
+    @Inject
+    TemplateService templateService;
+    @Inject
+    UserVmDetailsDao userVmDetailsDao;
+    @Inject
+    private SecondaryStorageVmDao secondaryStorageVmDao;
 
     private final StateMachine2<Volume.State, Volume.Event, Volume> _volStateMachine;
     protected List<StoragePoolAllocator> _storagePoolAllocators;
@@ -295,6 +319,34 @@
         return null;
     }
 
+    @Override
+    public StoragePool findChildDataStoreInDataStoreCluster(DataCenter dc, Pod pod, Long clusterId, Long hostId, VirtualMachine vm, Long datastoreClusterId) {
+        Long podId = null;
+        if (pod != null) {
+            podId = pod.getId();
+        } else if (clusterId != null) {
+            Cluster cluster = _entityMgr.findById(Cluster.class, clusterId);
+            if (cluster != null) {
+                podId = cluster.getPodId();
+            }
+        }
+        List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(datastoreClusterId);
+        List<StoragePool> suitablePools = new ArrayList<StoragePool>();
+
+        for (StoragePoolVO childDatastore: childDatastores)
+            suitablePools.add((StoragePool)dataStoreMgr.getDataStore(childDatastore.getId(), DataStoreRole.Primary));
+
+        VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+        for (StoragePoolAllocator allocator : _storagePoolAllocators) {
+            DataCenterDeployment plan = new DataCenterDeployment(dc.getId(), podId, clusterId, hostId, null, null);
+            final List<StoragePool> poolList = allocator.reorderPools(suitablePools, profile, plan);
+
+            if (poolList != null && !poolList.isEmpty()) {
+                return (StoragePool)dataStoreMgr.getDataStore(poolList.get(0).getId(), DataStoreRole.Primary);
+            }
+        }
+        return null;
+    }
     public Pair<Pod, Long> findPod(VirtualMachineTemplate template, ServiceOffering offering, DataCenter dc, long accountId, Set<Long> avoids) {
         for (PodAllocator allocator : _podAllocators) {
             final Pair<Pod, Long> pod = allocator.allocateTo(template, offering, dc, accountId, avoids);
@@ -483,7 +535,7 @@
 
     @DB
     public VolumeInfo copyVolumeFromSecToPrimary(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering,
-            DiskOffering diskOffering, List<StoragePool> avoids, long size, HypervisorType hyperType) throws NoTransitionException {
+                                                 DiskOffering diskOffering, List<StoragePool> avoids, long size, HypervisorType hyperType) throws NoTransitionException {
 
         final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
         DiskProfile dskCh = createDiskCharacteristics(volume, template, dc, diskOffering);
@@ -516,7 +568,7 @@
 
     @DB
     public VolumeInfo createVolume(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering, DiskOffering diskOffering,
-            List<StoragePool> avoids, long size, HypervisorType hyperType) {
+                                   List<StoragePool> avoids, long size, HypervisorType hyperType) {
         // update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage)
         volume = volService.updateHypervisorSnapshotReserveForVolume(diskOffering, volume.getId(), hyperType);
 
@@ -562,7 +614,7 @@
             try {
                 VolumeApiResult result = future.get();
                 if (result.isFailed()) {
-                    if (result.getResult().contains("request template reload") && (i == 0)) {
+                    if (result.getResult().contains(REQUEST_TEMPLATE_RELOAD) && (i == 0)) {
                         s_logger.debug("Retry template re-deploy for vmware");
                         continue;
                     } else {
@@ -658,7 +710,7 @@
 
     @Override
     public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offering, Long size, Long minIops, Long maxIops, VirtualMachine vm, VirtualMachineTemplate template, Account owner,
-            Long deviceId) {
+                                         Long deviceId) {
         if (size == null) {
             size = offering.getDiskSize();
         } else {
@@ -705,19 +757,23 @@
         return toDiskProfile(vol, offering);
     }
 
-    @Override
-    public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm,
-            Account owner) {
+    private DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm,
+                                                Account owner, long deviceId, String configurationId) {
         assert (template.getFormat() != ImageFormat.ISO) : "ISO is not a template really....";
 
         Long size = _tmpltMgr.getTemplateSize(template.getId(), vm.getDataCenterId());
         if (rootDisksize != null) {
-            rootDisksize = rootDisksize * 1024 * 1024 * 1024;
-            if (rootDisksize > size) {
-                s_logger.debug("Using root disk size of " + rootDisksize + " Bytes for volume " + name);
+            if (template.isDeployAsIs()) {
+                // Volume size specified from template deploy-as-is
                 size = rootDisksize;
             } else {
-                s_logger.debug("Using root disk size of " + size + " Bytes for volume " + name + "since specified root disk size of " + rootDisksize + " Bytes is smaller than template");
+                rootDisksize = rootDisksize * 1024 * 1024 * 1024;
+                if (rootDisksize > size) {
+                    s_logger.debug("Using root disk size of " + toHumanReadableSize(rootDisksize) + " Bytes for volume " + name);
+                    size = rootDisksize;
+                } else {
+                    s_logger.debug("Using root disk size of " + toHumanReadableSize(rootDisksize) + " Bytes for volume " + name + "since specified root disk size of " + rootDisksize + " Bytes is smaller than template");
+                }
             }
         }
 
@@ -731,13 +787,9 @@
         }
         vol.setTemplateId(template.getId());
 
-        if (type.equals(Type.ROOT)) {
-            vol.setDeviceId(0l);
-            if (!vm.getType().equals(VirtualMachine.Type.User)) {
-                vol.setRecreatable(true);
-            }
-        } else {
-            vol.setDeviceId(1l);
+        vol.setDeviceId(deviceId);
+        if (type.equals(Type.ROOT) && !vm.getType().equals(VirtualMachine.Type.User)) {
+            vol.setRecreatable(true);
         }
 
         if (vm.getType() == VirtualMachine.Type.User) {
@@ -747,6 +799,11 @@
 
         vol = _volsDao.persist(vol);
 
+        if (StringUtils.isNotBlank(configurationId)) {
+            VolumeDetailVO deployConfigurationDetail = new VolumeDetailVO(vol.getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION, configurationId, false);
+            _volDetailDao.persist(deployConfigurationDetail);
+        }
+
         // Create event and update resource count for volumes if vm is a user vm
         if (vm.getType() == VirtualMachine.Type.User) {
 
@@ -765,6 +822,78 @@
         return toDiskProfile(vol, offering);
     }
 
+    @Override
+    public List<DiskProfile> allocateTemplatedVolumes(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm,
+                                                      Account owner) {
+        int volumesNumber = 1;
+        List<DatadiskTO> templateAsIsDisks = null;
+        String configurationId = null;
+        boolean deployVmAsIs = false;
+        if (template.isDeployAsIs() && vm.getType() != VirtualMachine.Type.SecondaryStorageVm) {
+            List<SecondaryStorageVmVO> runningSSVMs = secondaryStorageVmDao.getSecStorageVmListInStates(null, vm.getDataCenterId(), State.Running);
+            if (CollectionUtils.isEmpty(runningSSVMs)) {
+                s_logger.info("Could not find a running SSVM in datacenter " + vm.getDataCenterId() + " for deploying VM as is, " +
+                        "not deploying VM " + vm.getInstanceName() + " as-is");
+            } else {
+                UserVmDetailVO configurationDetail = userVmDetailsDao.findDetail(vm.getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION);
+                if (configurationDetail != null) {
+                    configurationId = configurationDetail.getValue();
+                }
+                templateAsIsDisks = _tmpltMgr.getTemplateDisksOnImageStore(template.getId(), DataStoreRole.Image, configurationId);
+                if (CollectionUtils.isNotEmpty(templateAsIsDisks)) {
+                    templateAsIsDisks = templateAsIsDisks.stream()
+                            .filter(x -> !x.isIso())
+                            .sorted(Comparator.comparing(DatadiskTO::getDiskNumber))
+                            .collect(Collectors.toList());
+                }
+                volumesNumber = templateAsIsDisks.size();
+                deployVmAsIs = true;
+            }
+        }
+
+        if (volumesNumber < 1) {
+            throw new CloudRuntimeException("Unable to create any volume from template " + template.getName());
+        }
+
+        List<DiskProfile> profiles = new ArrayList<>();
+
+        for (int number = 0; number < volumesNumber; number++) {
+            String volumeName = name;
+            Long volumeSize = rootDisksize;
+            long deviceId = type.equals(Type.ROOT) ? 0L : 1L;
+            if (deployVmAsIs) {
+                int volumeNameSuffix = templateAsIsDisks.get(number).getDiskNumber();
+                volumeName = String.format("%s-%d", volumeName, volumeNameSuffix);
+                volumeSize = templateAsIsDisks.get(number).getVirtualSize();
+                deviceId = templateAsIsDisks.get(number).getDiskNumber();
+            }
+            s_logger.info(String.format("adding disk object %s to %s", volumeName, vm.getInstanceName()));
+            DiskProfile diskProfile = allocateTemplatedVolume(type, volumeName, offering, volumeSize, minIops, maxIops,
+                    template, vm, owner, deviceId, configurationId);
+            profiles.add(diskProfile);
+        }
+
+        handleRootDiskControllerTpeForDeployAsIs(templateAsIsDisks, vm);
+        return profiles;
+    }
+
+    private void handleRootDiskControllerTpeForDeployAsIs(List<DatadiskTO> disksAsIs, VirtualMachine vm) {
+        if (CollectionUtils.isNotEmpty(disksAsIs)) {
+            String diskControllerSubType = disksAsIs.get(0).getDiskControllerSubType();
+            if (StringUtils.isNotBlank(diskControllerSubType)) {
+                long vmId = vm.getId();
+                UserVmDetailVO detail = userVmDetailsDao.findDetail(vmId, VmDetailConstants.ROOT_DISK_CONTROLLER);
+                if (detail != null) {
+                    detail.setValue(diskControllerSubType);
+                    userVmDetailsDao.update(detail.getId(), detail);
+                } else {
+                    detail = new UserVmDetailVO(vmId, VmDetailConstants.ROOT_DISK_CONTROLLER, diskControllerSubType, false);
+                    userVmDetailsDao.persist(detail);
+                }
+            }
+        }
+    }
+
     private ImageFormat getSupportedImageFormatForCluster(HypervisorType hyperType) {
         if (hyperType == HypervisorType.XenServer) {
             return ImageFormat.VHD;
@@ -795,7 +924,7 @@
     }
 
     private VolumeInfo copyVolume(StoragePool rootDiskPool, VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate rootDiskTmplt, DataCenter dcVO, Pod pod, DiskOffering diskVO,
-            ServiceOffering svo, HypervisorType rootDiskHyperType) throws NoTransitionException {
+                                  ServiceOffering svo, HypervisorType rootDiskHyperType) throws NoTransitionException {
 
         if (!isSupportedImageFormatForCluster(volume, rootDiskHyperType)) {
             throw new InvalidParameterValueException("Failed to attach volume to VM since volumes format " + volume.getFormat().getFileExtension() + " is not compatible with the vm hypervisor type");
@@ -1140,9 +1269,15 @@
         details.put(DiskTO.MOUNT_POINT, volumeInfo.get_iScsiName());
 
         VolumeVO volume = _volumeDao.findById(volumeInfo.getId());
-
         details.put(DiskTO.PROTOCOL_TYPE, (volume.getPoolType() != null) ? volume.getPoolType().toString() : null);
 
+         if (volume.getPoolId() != null) {
+            StoragePoolVO poolVO = _storagePoolDao.findById(volume.getPoolId());
+            if (poolVO.getParent() != 0L) {
+                details.put(DiskTO.PROTOCOL_TYPE, Storage.StoragePoolType.DatastoreCluster.toString());
+            }
+        }
+
         ChapInfo chapInfo = volService.getChapInfo(volumeInfo, dataStore);
 
         if (chapInfo != null) {
@@ -1327,7 +1462,7 @@
             try {
                 result = future.get();
                 if (result.isFailed()) {
-                    if (result.getResult().contains("request template reload") && (i == 0)) {
+                    if (result.getResult().contains(REQUEST_TEMPLATE_RELOAD) && (i == 0)) {
                         s_logger.debug("Retry template re-deploy for vmware");
                         continue;
                     } else {
@@ -1606,7 +1741,7 @@
     }
 
     @Override
-    public void updateVolumeDiskChain(long volumeId, String path, String chainInfo) {
+    public void updateVolumeDiskChain(long volumeId, String path, String chainInfo, String updatedDataStoreUUID) {
         VolumeVO vol = _volsDao.findById(volumeId);
         boolean needUpdate = false;
         // Volume path is not getting updated in the DB, need to find reason and fix the issue.
@@ -1621,10 +1756,20 @@
             needUpdate = true;
         }
 
+        if (updatedDataStoreUUID != null) {
+            needUpdate = true;
+        }
+
         if (needUpdate) {
             s_logger.info("Update volume disk chain info. vol: " + vol.getId() + ", " + vol.getPath() + " -> " + path + ", " + vol.getChainInfo() + " -> " + chainInfo);
             vol.setPath(path);
             vol.setChainInfo(chainInfo);
+            if (updatedDataStoreUUID != null) {
+                StoragePoolVO pool = _storagePoolDao.findByUuid(updatedDataStoreUUID);
+                if (pool != null) {
+                    vol.setPoolId(pool.getId());
+                }
+            }
             _volsDao.update(volumeId, vol);
         }
     }
@@ -1680,4 +1825,27 @@
         vol = _volsDao.persist(vol);
         return toDiskProfile(vol, offering);
     }
-}
+
+    @Override
+    public void unmanageVolumes(long vmId) {
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Unmanaging storage for vm: " + vmId);
+        }
+        final List<VolumeVO> volumesForVm = _volsDao.findByInstance(vmId);
+
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (VolumeVO vol : volumesForVm) {
+                    boolean volumeAlreadyDestroyed = (vol.getState() == Volume.State.Destroy || vol.getState() == Volume.State.Expunged
+                            || vol.getState() == Volume.State.Expunging);
+                    if (volumeAlreadyDestroyed) {
+                        s_logger.debug("Skipping destroy for the volume " + vol + " as its in state " + vol.getState().toString());
+                    } else {
+                        volService.unmanageVolume(vol.getId());
+                    }
+                }
+            }
+        });
+    }
+}
\ No newline at end of file
diff --git a/engine/orchestration/src/main/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml b/engine/orchestration/src/main/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
index 3ded395..66335a6 100644
--- a/engine/orchestration/src/main/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
+++ b/engine/orchestration/src/main/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
@@ -44,6 +44,11 @@
             value="#{storagePoolAllocatorsRegistry.registered}" />
     </bean>
 
+    <bean id="storageOrchestrator"
+          class="org.apache.cloudstack.engine.orchestration.StorageOrchestrator"/>
+    <bean id="dataMigrationHelper"
+          class="org.apache.cloudstack.engine.orchestration.DataMigrationUtility"/>
+
     <bean id="clusteredVirtualMachineManagerImpl" class="com.cloud.vm.ClusteredVirtualMachineManagerImpl">
         <property name="hostAllocators" value="#{hostAllocatorsRegistry.registered}" />
         <property name="storagePoolAllocators"
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 0e7579e..1725a41 100644
--- a/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
+++ b/engine/orchestration/src/test/java/com/cloud/vm/VirtualMachineManagerImplTest.java
@@ -150,7 +150,7 @@
         when(vmInstanceDaoMock.findById(anyLong())).thenReturn(vmInstanceMock);
         when(vmInstanceDaoMock.findByUuid(any(String.class))).thenReturn(vmInstanceMock);
         DeploymentPlanner.ExcludeList excludeHostList = new DeploymentPlanner.ExcludeList();
-        virtualMachineManagerImpl.findHostAndMigrate(vmInstanceMock.getUuid(), 2l, excludeHostList);
+        virtualMachineManagerImpl.findHostAndMigrate(vmInstanceMock.getUuid(), 2l, null, excludeHostList);
     }
 
     @Test
diff --git a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
index ed5265c..ff0a6fa 100644
--- a/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
+++ b/engine/orchestration/src/test/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java
@@ -467,6 +467,25 @@
     }
 
     @Test
+    public void testDontReleaseNicWhenPreserveNicsSettingEnabled() {
+        VirtualMachineProfile vm = mock(VirtualMachineProfile.class);
+        NicVO nic = mock(NicVO.class);
+        NetworkVO network = mock(NetworkVO.class);
+
+        when(vm.getType()).thenReturn(Type.User);
+        when(network.getGuruName()).thenReturn(guruName);
+        when(testOrchastrator._networksDao.findById(nic.getNetworkId())).thenReturn(network);
+
+        Long nicId = 1L;
+        when(nic.getId()).thenReturn(nicId);
+        when(vm.getParameter(VirtualMachineProfile.Param.PreserveNics)).thenReturn(true);
+
+        testOrchastrator.removeNic(vm, nic);
+
+        verify(nic, never()).setState(Nic.State.Deallocating);
+        verify(testOrchastrator._nicDao, never()).remove(nicId);
+    }
+
     public void encodeVlanIdIntoBroadcastUriTestVxlan() {
         encodeVlanIdIntoBroadcastUriPrepareAndTest("123", "VXLAN", "vxlan", "vxlan://123");
     }
diff --git a/engine/pom.xml b/engine/pom.xml
index 9add60f..e81b09d 100644
--- a/engine/pom.xml
+++ b/engine/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml
index 0c54da8..da91749 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/schema/src/main/java/com/cloud/dc/VsphereStoragePolicyVO.java b/engine/schema/src/main/java/com/cloud/dc/VsphereStoragePolicyVO.java
new file mode 100644
index 0000000..5324de6
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/dc/VsphereStoragePolicyVO.java
@@ -0,0 +1,126 @@
+// 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.dc;
+
+import com.cloud.utils.DateUtil;
+import com.cloud.utils.db.GenericDao;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import java.util.Date;
+import java.util.UUID;
+
+@Entity
+@Table(name = "vsphere_storage_policy")
+public class VsphereStoragePolicyVO implements VsphereStoragePolicy {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "zone_id")
+    private long zoneId;
+
+    @Column(name = "policy_id")
+    private String policyId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "update_time", updatable = true)
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updateTime;
+
+    @Column(name = GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    public VsphereStoragePolicyVO(long zoneId, String policyId, String name, String description) {
+        this.uuid = UUID.randomUUID().toString();
+        this.zoneId = zoneId;
+        this.policyId = policyId;
+        this.name = name;
+        this.description = description;
+        this.updateTime = DateUtil.currentGMTTime();
+    }
+
+    public VsphereStoragePolicyVO() {
+        uuid = UUID.randomUUID().toString();
+    }
+    public VsphereStoragePolicyVO(long id) {
+        this.id = id;
+        uuid = UUID.randomUUID().toString();
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public long getZoneId() {
+        return zoneId;
+    }
+
+    @Override
+    public String getPolicyId() {
+        return policyId;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public Date getRemoved() {
+        return removed;
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDao.java b/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDao.java
new file mode 100644
index 0000000..6e79b5e
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDao.java
@@ -0,0 +1,30 @@
+// 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.dc.dao;
+
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.utils.db.GenericDao;
+
+import java.util.List;
+
+public interface VsphereStoragePolicyDao extends GenericDao<VsphereStoragePolicyVO, Long> {
+
+    public VsphereStoragePolicyVO findByPolicyId(Long zoneId, String policyId);
+
+    public List<VsphereStoragePolicyVO> findByZoneId(Long zoneId);
+
+}
diff --git a/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDaoImpl.java b/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDaoImpl.java
new file mode 100644
index 0000000..0cdb6ad
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/dc/dao/VsphereStoragePolicyDaoImpl.java
@@ -0,0 +1,64 @@
+// 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.dc.dao;
+
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class VsphereStoragePolicyDaoImpl extends GenericDaoBase<VsphereStoragePolicyVO, Long> implements VsphereStoragePolicyDao {
+
+    protected static final Logger LOGGER = Logger.getLogger(VsphereStoragePolicyDaoImpl.class);
+
+    private final SearchBuilder<VsphereStoragePolicyVO> zoneSearch;
+    private final SearchBuilder<VsphereStoragePolicyVO> policySearch;
+
+    public VsphereStoragePolicyDaoImpl() {
+        super();
+
+        zoneSearch = createSearchBuilder();
+        zoneSearch.and("zoneId", zoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ);
+        zoneSearch.done();
+
+        policySearch = createSearchBuilder();
+        policySearch.and("zoneId", policySearch.entity().getZoneId(), SearchCriteria.Op.EQ);
+        policySearch.and("policyId", policySearch.entity().getPolicyId(), SearchCriteria.Op.EQ);
+        policySearch.done();
+    }
+
+    @Override
+    public VsphereStoragePolicyVO findByPolicyId(Long zoneId, String policyId) {
+        SearchCriteria<VsphereStoragePolicyVO> sc = policySearch.create();
+        sc.setParameters("zoneId", zoneId);
+        sc.setParameters("policyId", policyId);
+        return findOneBy(sc);
+    }
+
+    @Override
+    public List<VsphereStoragePolicyVO> findByZoneId(Long zoneId) {
+        SearchCriteria<VsphereStoragePolicyVO> sc = zoneSearch.create();
+        sc.setParameters("zoneId", zoneId);
+
+        return listBy(sc);
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/TemplateDeployAsIsDetailVO.java b/engine/schema/src/main/java/com/cloud/deployasis/TemplateDeployAsIsDetailVO.java
new file mode 100644
index 0000000..047d985
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/TemplateDeployAsIsDetailVO.java
@@ -0,0 +1,94 @@
+// 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.deployasis;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+@Entity
+@Table(name = "template_deploy_as_is_details")
+public class TemplateDeployAsIsDetailVO implements ResourceDetail {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "template_id")
+    private long resourceId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Lob
+    @Column(name = "value", length = 65535)
+    private String value;
+
+    public TemplateDeployAsIsDetailVO() {
+    }
+
+    public TemplateDeployAsIsDetailVO(long templateId, String name, String value) {
+        this.resourceId = templateId;
+        this.name = name;
+        this.value = value;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public long getResourceId() {
+        return resourceId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public boolean isDisplay() {
+        return true;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setResourceId(long resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/UserVmDeployAsIsDetailVO.java b/engine/schema/src/main/java/com/cloud/deployasis/UserVmDeployAsIsDetailVO.java
new file mode 100644
index 0000000..b56b4a4
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/UserVmDeployAsIsDetailVO.java
@@ -0,0 +1,94 @@
+// 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.deployasis;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+import org.apache.cloudstack.api.ResourceDetail;
+
+@Entity
+@Table(name = "user_vm_deploy_as_is_details")
+public class UserVmDeployAsIsDetailVO implements ResourceDetail {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "vm_id")
+    private long resourceId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Lob
+    @Column(name = "value", length = 65535)
+    private String value;
+
+    public UserVmDeployAsIsDetailVO() {
+    }
+
+    public UserVmDeployAsIsDetailVO(long vmId, String name, String value) {
+        this.resourceId = vmId;
+        this.name = name;
+        this.value = value;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public long getResourceId() {
+        return resourceId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public boolean isDisplay() {
+        return true;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public void setResourceId(long resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDao.java b/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDao.java
new file mode 100644
index 0000000..ebbc1ea
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDao.java
@@ -0,0 +1,32 @@
+// 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.deployasis.dao;
+
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
+import java.util.List;
+
+public interface TemplateDeployAsIsDetailsDao extends GenericDao<TemplateDeployAsIsDetailVO, Long>, ResourceDetailsDao<TemplateDeployAsIsDetailVO> {
+
+    OVFPropertyTO findPropertyByTemplateAndKey(long templateId, String key);
+    List<TemplateDeployAsIsDetailVO> listDetailsByTemplateIdMatchingPrefix(long templateId, String prefix);
+    List<OVFNetworkTO> listNetworkRequirementsByTemplateId(long templateId);
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDaoImpl.java
new file mode 100644
index 0000000..198ef6d
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/dao/TemplateDeployAsIsDetailsDaoImpl.java
@@ -0,0 +1,83 @@
+// 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.deployasis.dao;
+
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.deployasis.DeployAsIsConstants;
+import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
+import com.cloud.utils.db.SearchCriteria;
+import com.google.gson.Gson;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+@Component
+public class TemplateDeployAsIsDetailsDaoImpl extends ResourceDetailsDaoBase<TemplateDeployAsIsDetailVO> implements TemplateDeployAsIsDetailsDao {
+
+    private Gson gson = new Gson();
+
+    public TemplateDeployAsIsDetailsDaoImpl() {
+    }
+
+    @Override
+    public void addDetail(long resourceId, String key, String value, boolean display) {
+        super.addDetail(new TemplateDeployAsIsDetailVO(resourceId, key, value));
+    }
+
+    @Override
+    public OVFPropertyTO findPropertyByTemplateAndKey(long templateId, String key) {
+        SearchCriteria<TemplateDeployAsIsDetailVO> sc = createSearchCriteria();
+        sc.addAnd("resourceId", SearchCriteria.Op.EQ, templateId);
+        sc.addAnd("name", SearchCriteria.Op.EQ, key.startsWith(DeployAsIsConstants.PROPERTY_PREFIX) ? key : DeployAsIsConstants.PROPERTY_PREFIX + key);
+        OVFPropertyTO property = null;
+        TemplateDeployAsIsDetailVO detail = findOneBy(sc);
+        if (detail != null) {
+            property = gson.fromJson(detail.getValue(), OVFPropertyTO.class);
+        }
+        return property;
+    }
+
+    @Override
+    public List<TemplateDeployAsIsDetailVO> listDetailsByTemplateIdMatchingPrefix(long templateId, String prefix) {
+        SearchCriteria<TemplateDeployAsIsDetailVO> ssc = createSearchCriteria();
+        ssc.addAnd("resourceId", SearchCriteria.Op.EQ, templateId);
+        ssc.addAnd("name", SearchCriteria.Op.LIKE, prefix + "%");
+
+        return search(ssc, null);
+    }
+
+    @Override
+    public List<OVFNetworkTO> listNetworkRequirementsByTemplateId(long templateId) {
+        List<TemplateDeployAsIsDetailVO> networkDetails = listDetailsByTemplateIdMatchingPrefix(templateId, DeployAsIsConstants.NETWORK_PREFIX);
+        List<OVFNetworkTO> networkPrereqs = new ArrayList<>();
+        for (TemplateDeployAsIsDetailVO property : networkDetails) {
+            OVFNetworkTO ovfPropertyTO = gson.fromJson(property.getValue(), OVFNetworkTO.class);
+            networkPrereqs.add(ovfPropertyTO);
+        }
+        networkPrereqs.sort(new Comparator<OVFNetworkTO>() {
+            @Override
+            public int compare(OVFNetworkTO o1, OVFNetworkTO o2) {
+                return o1.getInstanceID() - o2.getInstanceID();
+            }
+        });
+        return networkPrereqs;
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDao.java b/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDao.java
new file mode 100644
index 0000000..4366e46
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDao.java
@@ -0,0 +1,24 @@
+// 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.deployasis.dao;
+
+import com.cloud.deployasis.UserVmDeployAsIsDetailVO;
+import com.cloud.utils.db.GenericDao;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
+
+public interface UserVmDeployAsIsDetailsDao extends GenericDao<UserVmDeployAsIsDetailVO, Long>, ResourceDetailsDao<UserVmDeployAsIsDetailVO> {
+}
diff --git a/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDaoImpl.java
new file mode 100644
index 0000000..8dc5f4a
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/deployasis/dao/UserVmDeployAsIsDetailsDaoImpl.java
@@ -0,0 +1,30 @@
+// 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.deployasis.dao;
+
+import com.cloud.deployasis.UserVmDeployAsIsDetailVO;
+import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
+import org.springframework.stereotype.Component;
+
+@Component
+public class UserVmDeployAsIsDetailsDaoImpl extends ResourceDetailsDaoBase<UserVmDeployAsIsDetailVO> implements UserVmDeployAsIsDetailsDao {
+
+    @Override
+    public void addDetail(long resourceId, String key, String value, boolean display) {
+        super.addDetail(new UserVmDeployAsIsDetailVO(resourceId, key, value));
+    }
+}
diff --git a/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java b/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
index ced19ce..3d76c8b 100644
--- a/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
+++ b/engine/schema/src/main/java/com/cloud/host/dao/HostDao.java
@@ -39,6 +39,8 @@
 
     Integer countAllByType(final Host.Type type);
 
+    Integer countAllByTypeInZone(long zoneId, final Host.Type type);
+
     /**
      * Mark all hosts associated with a certain management server
      * as disconnected.
@@ -97,6 +99,12 @@
 
     List<HostVO> listByType(Type type);
 
+    /**
+     * Finds a host by ip address, excludes removed hosts.
+     *
+     * @param ip The ip address to match on
+     * @return One matched host
+     */
     HostVO findByIp(String ip);
 
     /**
@@ -115,4 +123,6 @@
     List<HostVO> listByHostCapability(Host.Type type, Long clusterId, Long podId, long dcId, String hostCapabilty);
 
     List<HostVO> listByClusterAndHypervisorType(long clusterId, HypervisorType hypervisorType);
+
+    HostVO findByName(String name);
 }
diff --git a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
index ec4573f..e931f65 100644
--- a/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/host/dao/HostDaoImpl.java
@@ -90,7 +90,7 @@
     protected SearchBuilder<HostVO> DcPrivateIpAddressSearch;
     protected SearchBuilder<HostVO> DcStorageIpAddressSearch;
     protected SearchBuilder<HostVO> PublicIpAddressSearch;
-    protected SearchBuilder<HostVO> AnyIpAddressSearch;
+    protected SearchBuilder<HostVO> UnremovedIpAddressSearch;
 
     protected SearchBuilder<HostVO> GuidSearch;
     protected SearchBuilder<HostVO> DcSearch;
@@ -107,6 +107,7 @@
     protected SearchBuilder<HostVO> UnmanagedApplianceSearch;
     protected SearchBuilder<HostVO> MaintenanceCountSearch;
     protected SearchBuilder<HostVO> HostTypeCountSearch;
+    protected SearchBuilder<HostVO> HostTypeZoneCountSearch;
     protected SearchBuilder<HostVO> ClusterStatusSearch;
     protected SearchBuilder<HostVO> TypeNameZoneSearch;
     protected SearchBuilder<HostVO> AvailHypevisorInZone;
@@ -164,9 +165,14 @@
 
         HostTypeCountSearch = createSearchBuilder();
         HostTypeCountSearch.and("type", HostTypeCountSearch.entity().getType(), SearchCriteria.Op.EQ);
-        HostTypeCountSearch.and("removed", HostTypeCountSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
         HostTypeCountSearch.done();
 
+        HostTypeZoneCountSearch = createSearchBuilder();
+        HostTypeZoneCountSearch.and("type", HostTypeZoneCountSearch.entity().getType(), SearchCriteria.Op.EQ);
+        HostTypeZoneCountSearch.and("dc", HostTypeZoneCountSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
+        HostTypeZoneCountSearch.and("removed", HostTypeZoneCountSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
+        HostTypeZoneCountSearch.done();
+
         TypePodDcStatusSearch = createSearchBuilder();
         HostVO entity = TypePodDcStatusSearch.entity();
         TypePodDcStatusSearch.and("type", entity.getType(), SearchCriteria.Op.EQ);
@@ -227,10 +233,12 @@
         PublicIpAddressSearch.and("publicIpAddress", PublicIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ);
         PublicIpAddressSearch.done();
 
-        AnyIpAddressSearch = createSearchBuilder();
-        AnyIpAddressSearch.or("publicIpAddress", AnyIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ);
-        AnyIpAddressSearch.or("privateIpAddress", AnyIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ);
-        AnyIpAddressSearch.done();
+        UnremovedIpAddressSearch = createSearchBuilder();
+        UnremovedIpAddressSearch.and("removed", UnremovedIpAddressSearch.entity().getRemoved(), Op.NULL); // We don't want any removed hosts
+        UnremovedIpAddressSearch.and().op("publicIpAddress", UnremovedIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ);
+        UnremovedIpAddressSearch.or("privateIpAddress", UnremovedIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ);
+        UnremovedIpAddressSearch.cp();
+        UnremovedIpAddressSearch.done();
 
         GuidSearch = createSearchBuilder();
         GuidSearch.and("guid", GuidSearch.entity().getGuid(), SearchCriteria.Op.EQ);
@@ -308,12 +316,6 @@
         UnmanagedDirectConnectSearch.and("lastPinged", UnmanagedDirectConnectSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ);
         UnmanagedDirectConnectSearch.and("resourceStates", UnmanagedDirectConnectSearch.entity().getResourceState(), SearchCriteria.Op.NIN);
         UnmanagedDirectConnectSearch.and("clusterIn", UnmanagedDirectConnectSearch.entity().getClusterId(), SearchCriteria.Op.IN);
-        /*
-         * UnmanagedDirectConnectSearch.op(SearchCriteria.Op.OR, "managementServerId",
-         * UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ);
-         * UnmanagedDirectConnectSearch.and("lastPinged", UnmanagedDirectConnectSearch.entity().getLastPinged(),
-         * SearchCriteria.Op.LTEQ); UnmanagedDirectConnectSearch.cp(); UnmanagedDirectConnectSearch.cp();
-         */
         try {
             HostTransferSearch = _hostTransferDao.createSearchBuilder();
         } catch (Throwable e) {
@@ -452,6 +454,14 @@
     }
 
     @Override
+    public Integer countAllByTypeInZone(long zoneId, Type type) {
+        SearchCriteria<HostVO> sc = HostTypeCountSearch.create();
+        sc.setParameters("type", type);
+        sc.setParameters("dc", zoneId);
+        return getCount(sc);
+    }
+
+    @Override
     public List<HostVO> listByDataCenterId(long id) {
         SearchCriteria<HostVO> sc = DcSearch.create();
         sc.setParameters("dc", id);
@@ -1116,7 +1126,7 @@
 
     @Override
     public HostVO findByIp(final String ipAddress) {
-        SearchCriteria<HostVO> sc = AnyIpAddressSearch.create();
+        SearchCriteria<HostVO> sc = UnremovedIpAddressSearch.create();
         sc.setParameters("publicIpAddress", ipAddress);
         sc.setParameters("privateIpAddress", ipAddress);
         return findOneBy(sc);
@@ -1265,6 +1275,13 @@
         return listBy(sc);
     }
 
+    @Override
+    public HostVO findByName(String name) {
+        SearchCriteria<HostVO> sc = NameSearch.create();
+        sc.setParameters("name", name);
+        return findOneBy(sc);
+    }
+
     private ResultSet executeSqlGetResultsetForMethodFindHostInZoneToExecuteCommand(HypervisorType hypervisorType, long zoneId, TransactionLegacy tx, String sql) throws SQLException {
         PreparedStatement pstmt = tx.prepareAutoCloseStatement(sql);
         pstmt.setString(1, Objects.toString(hypervisorType));
diff --git a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java
index 24a3c10..410d40b 100644
--- a/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/network/as/dao/AutoScaleVmGroupVmMapDaoImpl.java
@@ -33,7 +33,7 @@
 
         SearchCriteria<AutoScaleVmGroupVmMapVO> sc = createSearchCriteria();
         sc.addAnd("vmGroupId", SearchCriteria.Op.EQ, vmGroupId);
-        return getCount(sc);
+        return getCountIncludingRemoved(sc);
     }
 
     @Override
diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
index a84e4d5..c82e4e7 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDao.java
@@ -126,4 +126,6 @@
     List<NetworkVO> listByAccountIdNetworkName(long accountId, String name);
 
     List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri, Network.PVlanType pVlanType);
+
+    List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri);
 }
diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
index eeee3d1..2578a14 100644
--- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkDaoImpl.java
@@ -740,6 +740,7 @@
      *      - The requested exact PVLAN pair exists
      *      - The requested secondary VLAN ID is secondary VLAN ID of an existing PVLAN pair
      *      - The requested secondary VLAN ID is primary VLAN ID of an existing PVLAN pair
+     *      - The requested primary VLAN ID is secondary VLAN ID of an existing PVLAN pair
      */
     protected boolean isNetworkOverlappingRequestedPvlan(Integer existingPrimaryVlan, Integer existingSecondaryVlan, Network.PVlanType existingPvlanType,
                                                          Integer requestedPrimaryVlan, Integer requestedSecondaryVlan, Network.PVlanType requestedPvlanType) {
@@ -749,6 +750,7 @@
         }
         boolean exactMatch = existingPrimaryVlan.equals(requestedPrimaryVlan) && existingSecondaryVlan.equals(requestedSecondaryVlan);
         boolean secondaryVlanUsed = requestedPvlanType != Network.PVlanType.Promiscuous && requestedSecondaryVlan.equals(existingPrimaryVlan) || requestedSecondaryVlan.equals(existingSecondaryVlan);
+        boolean primaryVlanUsed = existingPvlanType != Network.PVlanType.Promiscuous && requestedPrimaryVlan.equals(existingSecondaryVlan);
         boolean isolatedMax = false;
         boolean promiscuousMax = false;
         if (requestedPvlanType == Network.PVlanType.Isolated && existingPrimaryVlan.equals(requestedPrimaryVlan) && existingPvlanType.equals(Network.PVlanType.Isolated)) {
@@ -756,7 +758,12 @@
         } else if (requestedPvlanType == Network.PVlanType.Promiscuous && existingPrimaryVlan.equals(requestedPrimaryVlan) && existingPvlanType == Network.PVlanType.Promiscuous) {
             promiscuousMax = true;
         }
-        return exactMatch || secondaryVlanUsed || isolatedMax || promiscuousMax;
+        return exactMatch || secondaryVlanUsed || primaryVlanUsed || isolatedMax || promiscuousMax;
+    }
+
+    // True when a VLAN ID overlaps with an existing PVLAN primary or secondary ID
+    protected boolean isNetworkOverlappingRequestedPvlan(Integer existingPrimaryVlan, Integer existingSecondaryVlan, Integer requestedVlan) {
+        return requestedVlan.equals(existingPrimaryVlan) || requestedVlan.equals(existingSecondaryVlan);
     }
 
     protected Network.PVlanType getNetworkPvlanType(long networkId, List<Integer> existingPvlan) {
@@ -771,6 +778,38 @@
     }
 
     @Override
+    public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri) {
+        final URI searchUri = BroadcastDomainType.fromString(broadcastUri);
+        if (!searchUri.getScheme().equalsIgnoreCase("vlan")) {
+            throw new CloudRuntimeException("VLAN requested but URI is not in the expected format: " + searchUri.toString());
+        }
+        final String searchRange = BroadcastDomainType.getValue(searchUri);
+        final List<Integer> searchVlans = UriUtils.expandVlanUri(searchRange);
+        final List<NetworkVO> overlappingNetworks = new ArrayList<>();
+
+        final SearchCriteria<NetworkVO> sc = PhysicalNetworkSearch.create();
+        sc.setParameters("physicalNetworkId", physicalNetworkId);
+
+        for (final NetworkVO network : listBy(sc)) {
+            if (network.getBroadcastUri() == null || !network.getBroadcastUri().getScheme().equalsIgnoreCase("pvlan")) {
+                continue;
+            }
+            // Ensure existing and proposed VLAN don't overlap
+            final String networkVlanRange = BroadcastDomainType.getValue(network.getBroadcastUri());
+            if (networkVlanRange == null || networkVlanRange.isEmpty()) {
+                continue;
+            }
+            List<Integer> existingPvlan = UriUtils.expandPvlanUri(networkVlanRange);
+            if (isNetworkOverlappingRequestedPvlan(existingPvlan.get(0), existingPvlan.get(1), searchVlans.get(0))) {
+                overlappingNetworks.add(network);
+                break;
+            }
+        }
+
+        return overlappingNetworks;
+    }
+
+    @Override
     public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri, Network.PVlanType pVlanType) {
         final URI searchUri = BroadcastDomainType.fromString(broadcastUri);
         if (!searchUri.getScheme().equalsIgnoreCase("pvlan")) {
diff --git a/engine/schema/src/main/java/com/cloud/projects/ProjectAccountVO.java b/engine/schema/src/main/java/com/cloud/projects/ProjectAccountVO.java
index 8a337d6..4710a81 100644
--- a/engine/schema/src/main/java/com/cloud/projects/ProjectAccountVO.java
+++ b/engine/schema/src/main/java/com/cloud/projects/ProjectAccountVO.java
@@ -46,6 +46,9 @@
     @Column(name = "account_id")
     private long accountId;
 
+    @Column(name="user_id")
+    private Long userId;
+
     @Column(name = "account_role")
     @Enumerated(value = EnumType.STRING)
     private Role accountRole = Role.Regular;
@@ -53,17 +56,26 @@
     @Column(name = "project_account_id")
     long projectAccountId;
 
+    @Column(name = "project_role_id")
+    private Long projectRoleId;
+
     @Column(name = GenericDao.CREATED_COLUMN)
     private Date created;
 
     protected ProjectAccountVO() {
     }
 
-    public ProjectAccountVO(Project project, long accountId, Role accountRole) {
+    public ProjectAccountVO(Project project, long accountId, Role accountRole, Long userId, Long projectRoleId) {
         this.accountId = accountId;
-        this.accountRole = accountRole;
+        if (accountRole != null) {
+            this.accountRole = accountRole;
+        } else {
+            this.accountRole = Role.Regular;
+        }
         this.projectId = project.getId();
         this.projectAccountId = project.getProjectAccountId();
+        this.userId = userId;
+        this.projectRoleId = projectRoleId;
     }
 
     @Override
@@ -82,6 +94,13 @@
     }
 
     @Override
+    public Long getUserId() { return userId; }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    @Override
     public Role getAccountRole() {
         return accountRole;
     }
@@ -91,6 +110,13 @@
         return projectAccountId;
     }
 
+    public void setProjectRoleId(Long projectRoleId) {
+        this.projectRoleId = projectRoleId;
+    }
+
+    @Override
+    public Long getProjectRoleId() { return projectRoleId; }
+
     public void setAccountRole(Role accountRole) {
         this.accountRole = accountRole;
     }
diff --git a/engine/schema/src/main/java/com/cloud/projects/ProjectInvitationVO.java b/engine/schema/src/main/java/com/cloud/projects/ProjectInvitationVO.java
index 9775135..4f794a8 100644
--- a/engine/schema/src/main/java/com/cloud/projects/ProjectInvitationVO.java
+++ b/engine/schema/src/main/java/com/cloud/projects/ProjectInvitationVO.java
@@ -47,6 +47,13 @@
     @Column(name = "domain_id")
     private Long inDomainId;
 
+    @Column(name = "account_role")
+    @Enumerated(value = EnumType.STRING)
+    private ProjectAccount.Role accountRole = ProjectAccount.Role.Regular;
+
+    @Column(name = "project_role_id")
+    private Long projectRoleId;
+
     @Column(name = "token")
     private String token;
 
@@ -63,6 +70,9 @@
     @Column(name = "uuid")
     private String uuid;
 
+    @Column(name = "user_id")
+    private Long forUserId;
+
     protected ProjectInvitationVO() {
         uuid = UUID.randomUUID().toString();
     }
@@ -128,6 +138,24 @@
     }
 
     @Override
+    public ProjectAccount.Role getAccountRole() {
+        return accountRole;
+    }
+
+    public void setAccountRole(ProjectAccount.Role accountRole) {
+        this.accountRole = accountRole;
+    }
+
+    @Override
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public void setProjectRoleId(Long projectRoleId) {
+        this.projectRoleId = projectRoleId;
+    }
+
+    @Override
     public String getUuid() {
         return uuid;
     }
@@ -147,6 +175,15 @@
     }
 
     @Override
+    public Long getForUserId() {
+        return forUserId == null ? -1 : forUserId;
+    }
+
+    public void setForUserId(Long forUserId) {
+        this.forUserId = forUserId;
+    }
+
+    @Override
     public Class<?> getEntityType() {
         return ProjectInvitation.class;
     }
diff --git a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDao.java b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDao.java
index 8a251a6..730182a 100644
--- a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDao.java
+++ b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDao.java
@@ -25,10 +25,16 @@
 public interface ProjectAccountDao extends GenericDao<ProjectAccountVO, Long> {
     ProjectAccountVO getProjectOwner(long projectId);
 
+    List<ProjectAccountVO> getProjectOwners(long projectId);
+
     List<ProjectAccountVO> listByProjectId(long projectId);
 
     ProjectAccountVO findByProjectIdAccountId(long projectId, long accountId);
 
+    ProjectAccountVO findByProjectIdUserId(long projectId, long accountId, long userId);
+
+    boolean canUserAccessProjectAccount(long accountId, long userId, long projectAccountId);
+
     boolean canAccessProjectAccount(long accountId, long projectAccountId);
 
     boolean canModifyProjectAccount(long accountId, long projectAccountId);
@@ -40,4 +46,8 @@
     Long countByAccountIdAndRole(long accountId, ProjectAccount.Role role);
 
     void removeAccountFromProjects(long accountId);
+
+    boolean canUserModifyProject(long projectId, long accountId, long userId);
+
+    List<ProjectAccountVO> listUsersOrAccountsByRole(long id);
 }
diff --git a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDaoImpl.java b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDaoImpl.java
index ecf1aab..ea60472 100644
--- a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectAccountDaoImpl.java
@@ -18,7 +18,6 @@
 
 import java.util.List;
 
-
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -34,9 +33,11 @@
 @Component
 public class ProjectAccountDaoImpl extends GenericDaoBase<ProjectAccountVO, Long> implements ProjectAccountDao {
     protected final SearchBuilder<ProjectAccountVO> AllFieldsSearch;
+    protected final SearchBuilder<ProjectAccountVO> ProjectAccountSearch;
     final GenericSearchBuilder<ProjectAccountVO, Long> AdminSearch;
-    final GenericSearchBuilder<ProjectAccountVO, Long> ProjectAccountSearch;
+    final GenericSearchBuilder<ProjectAccountVO, Long> ProjectAccountsSearch;
     final GenericSearchBuilder<ProjectAccountVO, Long> CountByRoleSearch;
+
     public static final Logger s_logger = Logger.getLogger(ProjectAccountDaoImpl.class.getName());
 
     protected ProjectAccountDaoImpl() {
@@ -45,18 +46,27 @@
         AllFieldsSearch.and("projectId", AllFieldsSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("projectAccountId", AllFieldsSearch.entity().getProjectAccountId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("userId", AllFieldsSearch.entity().getUserId(), Op.EQ);
+        AllFieldsSearch.and("projectRoleId", AllFieldsSearch.entity().getProjectRoleId(), Op.EQ);
         AllFieldsSearch.done();
 
+        ProjectAccountSearch = createSearchBuilder();
+        ProjectAccountSearch.and("projectId", ProjectAccountSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
+        ProjectAccountSearch.and("accountId", ProjectAccountSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
+        ProjectAccountSearch.and("userId", ProjectAccountSearch.entity().getUserId(), Op.NULL);
+        ProjectAccountSearch.done();
+
+
         AdminSearch = createSearchBuilder(Long.class);
         AdminSearch.selectFields(AdminSearch.entity().getProjectId());
         AdminSearch.and("role", AdminSearch.entity().getAccountRole(), Op.EQ);
         AdminSearch.and("accountId", AdminSearch.entity().getAccountId(), Op.EQ);
         AdminSearch.done();
 
-        ProjectAccountSearch = createSearchBuilder(Long.class);
-        ProjectAccountSearch.selectFields(ProjectAccountSearch.entity().getProjectAccountId());
-        ProjectAccountSearch.and("accountId", ProjectAccountSearch.entity().getAccountId(), Op.EQ);
-        ProjectAccountSearch.done();
+        ProjectAccountsSearch = createSearchBuilder(Long.class);
+        ProjectAccountsSearch.selectFields(ProjectAccountsSearch.entity().getProjectAccountId());
+        ProjectAccountsSearch.and("accountId", ProjectAccountsSearch.entity().getAccountId(), Op.EQ);
+        ProjectAccountsSearch.done();
 
         CountByRoleSearch = createSearchBuilder(Long.class);
         CountByRoleSearch.select(null, Func.COUNT, CountByRoleSearch.entity().getId());
@@ -74,6 +84,14 @@
         return findOneBy(sc);
     }
 
+    public List<ProjectAccountVO> getProjectOwners(long projectId) {
+        SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
+        sc.setParameters("role", ProjectAccount.Role.Admin);
+        sc.setParameters("projectId", projectId);
+
+        return listBy(sc);
+    }
+
     @Override
     public List<ProjectAccountVO> listByProjectId(long projectId) {
         SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
@@ -84,14 +102,37 @@
 
     @Override
     public ProjectAccountVO findByProjectIdAccountId(long projectId, long accountId) {
+        SearchCriteria<ProjectAccountVO> sc = ProjectAccountSearch.create();
+        sc.setParameters("projectId", projectId);
+        sc.setParameters("accountId", accountId);
+        return findOneBy(sc);
+    }
+
+    @Override
+    public ProjectAccountVO findByProjectIdUserId(long projectId, long accountId, long userId) {
         SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
         sc.setParameters("projectId", projectId);
+        sc.setParameters("userId", userId);
         sc.setParameters("accountId", accountId);
 
         return findOneBy(sc);
     }
 
     @Override
+    public boolean canUserAccessProjectAccount(long accountId, long userId, long projectAccountId) {
+        SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
+        sc.setParameters("accountId", accountId);
+        sc.setParameters("userId", userId);
+        sc.setParameters("projectAccountId", projectAccountId);
+
+        if (findOneBy(sc) != null) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
     public boolean canAccessProjectAccount(long accountId, long projectAccountId) {
         SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
         sc.setParameters("accountId", accountId);
@@ -120,7 +161,7 @@
 
     @Override
     public List<Long> listPermittedAccountIds(long accountId) {
-        SearchCriteria<Long> sc = ProjectAccountSearch.create();
+        SearchCriteria<Long> sc = ProjectAccountsSearch.create();
         sc.setParameters("accountId", accountId);
         return customSearch(sc, null);
     }
@@ -152,4 +193,23 @@
         }
     }
 
+    @Override
+    public boolean canUserModifyProject(long projectId, long accountId, long userId) {
+        SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
+        sc.setParameters("role",  ProjectAccount.Role.Admin);
+        sc.setParameters("projectId",projectId);
+        sc.setParameters("accountId", accountId);
+        sc.setParameters("userId", userId);
+        if (findOneBy(sc) != null) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public List<ProjectAccountVO> listUsersOrAccountsByRole(long id) {
+        SearchCriteria<ProjectAccountVO> sc = AllFieldsSearch.create();
+        sc.setParameters("projectRoleId", id);
+        return listBy(sc);
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDao.java b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDao.java
index 3788641..976d539 100644
--- a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDao.java
+++ b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDao.java
@@ -25,6 +25,8 @@
 public interface ProjectInvitationDao extends GenericDao<ProjectInvitationVO, Long> {
     ProjectInvitationVO findByAccountIdProjectId(long accountId, long projectId, State... inviteState);
 
+    ProjectInvitationVO findByUserIdProjectId(long userId, long accountId, long projectId, State... inviteState);
+
     List<ProjectInvitationVO> listExpiredInvitations();
 
     boolean expirePendingInvitations(long timeOut);
diff --git a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDaoImpl.java b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDaoImpl.java
index 2fc74b9..f8d1537 100644
--- a/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/projects/dao/ProjectInvitationDaoImpl.java
@@ -19,7 +19,6 @@
 import java.sql.Date;
 import java.util.List;
 
-
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -35,11 +34,13 @@
     private static final Logger s_logger = Logger.getLogger(ProjectInvitationDaoImpl.class);
     protected final SearchBuilder<ProjectInvitationVO> AllFieldsSearch;
     protected final SearchBuilder<ProjectInvitationVO> InactiveSearch;
+    protected final SearchBuilder<ProjectInvitationVO> ProjectAccountInviteSearch;
 
     protected ProjectInvitationDaoImpl() {
         AllFieldsSearch = createSearchBuilder();
         AllFieldsSearch.and("accountId", AllFieldsSearch.entity().getForAccountId(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("projectId", AllFieldsSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
+        AllFieldsSearch.and("userId", AllFieldsSearch.entity().getForUserId(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("created", AllFieldsSearch.entity().getCreated(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("projectAccountId", AllFieldsSearch.entity().getState(), SearchCriteria.Op.EQ);
         AllFieldsSearch.and("state", AllFieldsSearch.entity().getState(), SearchCriteria.Op.IN);
@@ -48,6 +49,12 @@
         AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), SearchCriteria.Op.EQ);
         AllFieldsSearch.done();
 
+        ProjectAccountInviteSearch = createSearchBuilder();
+        ProjectAccountInviteSearch.and("accountId", ProjectAccountInviteSearch.entity().getForAccountId(), SearchCriteria.Op.EQ);
+        ProjectAccountInviteSearch.and("projectId", ProjectAccountInviteSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
+        ProjectAccountInviteSearch.and("userId", ProjectAccountInviteSearch.entity().getForUserId(), SearchCriteria.Op.NULL);
+        ProjectAccountInviteSearch.done();
+
         InactiveSearch = createSearchBuilder();
         InactiveSearch.and("id", InactiveSearch.entity().getId(), SearchCriteria.Op.EQ);
         InactiveSearch.and("accountId", InactiveSearch.entity().getForAccountId(), SearchCriteria.Op.EQ);
@@ -59,7 +66,7 @@
 
     @Override
     public ProjectInvitationVO findByAccountIdProjectId(long accountId, long projectId, State... inviteState) {
-        SearchCriteria<ProjectInvitationVO> sc = AllFieldsSearch.create();
+        SearchCriteria<ProjectInvitationVO> sc = ProjectAccountInviteSearch.create();
         sc.setParameters("accountId", accountId);
         sc.setParameters("projectId", projectId);
         if (inviteState != null && inviteState.length > 0) {
@@ -70,6 +77,21 @@
     }
 
     @Override
+    public ProjectInvitationVO findByUserIdProjectId(long userId, long accountId, long projectId, State... inviteState) {
+        SearchCriteria<ProjectInvitationVO> sc = AllFieldsSearch.create();
+        sc.setParameters("userId", userId);
+        sc.setParameters("accountId", accountId);
+        if (projectId != -1) {
+            sc.setParameters("projectId", projectId);
+        }
+        if (inviteState != null && inviteState.length > 0) {
+            sc.setParameters("state", (Object[])inviteState);
+        }
+
+        return findOneBy(sc);
+    }
+
+    @Override
     public List<ProjectInvitationVO> listExpiredInvitations() {
         SearchCriteria<ProjectInvitationVO> sc = AllFieldsSearch.create();
         sc.setParameters("state", State.Expired);
diff --git a/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDao.java b/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDao.java
index fb57563..98fc8c8 100644
--- a/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDao.java
+++ b/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDao.java
@@ -22,4 +22,5 @@
 
 public interface CommandExecLogDao extends GenericDao<CommandExecLogVO, Long> {
     public void expungeExpiredRecords(Date cutTime);
+    public Integer getCopyCmdCountForSSVM(Long id);
 }
diff --git a/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDaoImpl.java b/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDaoImpl.java
index ac438b0..f89a1bb 100644
--- a/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/secstorage/CommandExecLogDaoImpl.java
@@ -17,7 +17,7 @@
 package com.cloud.secstorage;
 
 import java.util.Date;
-
+import java.util.List;
 
 import org.springframework.stereotype.Component;
 
@@ -30,11 +30,16 @@
 public class CommandExecLogDaoImpl extends GenericDaoBase<CommandExecLogVO, Long> implements CommandExecLogDao {
 
     protected final SearchBuilder<CommandExecLogVO> ExpungeSearch;
+    protected final SearchBuilder<CommandExecLogVO> CommandSearch;
 
     public CommandExecLogDaoImpl() {
         ExpungeSearch = createSearchBuilder();
         ExpungeSearch.and("created", ExpungeSearch.entity().getCreated(), Op.LT);
         ExpungeSearch.done();
+
+        CommandSearch = createSearchBuilder();
+        CommandSearch.and("host_id", CommandSearch.entity().getHostId(), Op.EQ);
+        CommandSearch.and("command_name", CommandSearch.entity().getCommandName(), Op.EQ);
     }
 
     @Override
@@ -43,4 +48,13 @@
         sc.setParameters("created", cutTime);
         expunge(sc);
     }
+
+    @Override
+    public Integer getCopyCmdCountForSSVM(Long id) {
+        SearchCriteria<CommandExecLogVO> sc = CommandSearch.create();
+        sc.setParameters("host_id", id);
+        sc.setParameters("command_name", "CopyCommand");
+        List<CommandExecLogVO> copyCmds = customSearch(sc, null);
+        return copyCmds.size();
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java
index f905ab9..10ba8d5 100644
--- a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java
+++ b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDao.java
@@ -26,4 +26,5 @@
 public interface ServiceOfferingDetailsDao extends GenericDao<ServiceOfferingDetailsVO, Long>, ResourceDetailsDao<ServiceOfferingDetailsVO> {
     List<Long> findDomainIds(final long resourceId);
     List<Long> findZoneIds(final long resourceId);
+    String getDetail(Long diskOfferingId, String key);
 }
\ No newline at end of file
diff --git a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index 7684026..0080174 100644
--- a/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -58,4 +58,13 @@
         return zoneIds;
     }
 
+    @Override
+    public String getDetail(Long serviceOfferingId, String key) {
+        String detailValue = null;
+        ServiceOfferingDetailsVO serviceOfferingDetail = findDetail(serviceOfferingId, key);
+        if (serviceOfferingDetail != null) {
+            detailValue = serviceOfferingDetail.getValue();
+        }
+        return detailValue;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/DiskOfferingVO.java b/engine/schema/src/main/java/com/cloud/storage/DiskOfferingVO.java
index 7f91537..952d301 100644
--- a/engine/schema/src/main/java/com/cloud/storage/DiskOfferingVO.java
+++ b/engine/schema/src/main/java/com/cloud/storage/DiskOfferingVO.java
@@ -364,7 +364,7 @@
         return created;
     }
 
-    protected void setTags(String tags) {
+    public void setTags(String tags) {
         this.tags = tags;
     }
 
diff --git a/engine/schema/src/main/java/com/cloud/storage/TemplateOVFPropertyVO.java b/engine/schema/src/main/java/com/cloud/storage/TemplateOVFPropertyVO.java
deleted file mode 100644
index 425b1f2..0000000
--- a/engine/schema/src/main/java/com/cloud/storage/TemplateOVFPropertyVO.java
+++ /dev/null
@@ -1,167 +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.
-
-package com.cloud.storage;
-
-import com.cloud.agent.api.storage.OVFProperty;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "template_ovf_properties")
-public class TemplateOVFPropertyVO implements OVFProperty {
-
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "id")
-    private long id;
-
-    @Column(name = "template_id")
-    private Long templateId;
-
-    @Column(name = "key")
-    private String key;
-
-    @Column(name = "type")
-    private String type;
-
-    @Column(name = "value")
-    private String value;
-
-    @Column(name = "qualifiers")
-    private String qualifiers;
-
-    @Column(name = "password")
-    private Boolean password;
-
-    @Column(name = "user_configurable")
-    private Boolean userConfigurable;
-
-    @Column(name = "label")
-    private String label;
-
-    @Column(name = "description")
-    private String description;
-
-    public TemplateOVFPropertyVO() {
-    }
-
-    public TemplateOVFPropertyVO(Long templateId, String key, String type, String value, String qualifiers,
-                                 Boolean userConfigurable, String label, String description, Boolean password) {
-        this.templateId = templateId;
-        this.key = key;
-        this.type = type;
-        this.value = value;
-        this.qualifiers = qualifiers;
-        this.userConfigurable = userConfigurable;
-        this.label = label;
-        this.description = description;
-        this.password = password;
-    }
-
-    public long getId() {
-        return id;
-    }
-
-    public void setId(long id) {
-        this.id = id;
-    }
-
-    public Long getTemplateId() {
-        return templateId;
-    }
-
-    public void setTemplateId(Long templateId) {
-        this.templateId = templateId;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    public String getQualifiers() {
-        return qualifiers;
-    }
-
-    public void setQualifiers(String qualifiers) {
-        this.qualifiers = qualifiers;
-    }
-
-    @Override
-    public Boolean isUserConfigurable() {
-        return userConfigurable;
-    }
-
-    public void setUserConfigurable(Boolean userConfigurable) {
-        this.userConfigurable = userConfigurable;
-    }
-
-    public String getLabel() {
-        return label;
-    }
-
-    public void setLabel(String label) {
-        this.label = label;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public Boolean isPassword() {
-        return password;
-    }
-
-    public void setPassword(Boolean password) {
-        this.password = password;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("PROP - templateId=%s> key=%s value=%s type=%s qual=%s conf=%s label=%s desc=%s password=%s",
-                templateId, key, value, type, qualifiers, userConfigurable, label, description, password);
-    }
-}
diff --git a/engine/schema/src/main/java/com/cloud/storage/VMTemplateStoragePoolVO.java b/engine/schema/src/main/java/com/cloud/storage/VMTemplateStoragePoolVO.java
index 6dfe6eb..69c9c85 100644
--- a/engine/schema/src/main/java/com/cloud/storage/VMTemplateStoragePoolVO.java
+++ b/engine/schema/src/main/java/com/cloud/storage/VMTemplateStoragePoolVO.java
@@ -95,6 +95,9 @@
     @Enumerated(EnumType.STRING)
     ObjectInDataStoreStateMachine.State state;
 
+    @Column(name = "deployment_option")
+    private String deploymentOption;
+
     @Override
     public String getInstallPath() {
         return installPath;
@@ -168,17 +171,18 @@
         return downloadState;
     }
 
-    public VMTemplateStoragePoolVO(long poolId, long templateId) {
+    public VMTemplateStoragePoolVO(long poolId, long templateId, String configuration) {
         super();
         this.poolId = poolId;
         this.templateId = templateId;
         this.downloadState = Status.NOT_DOWNLOADED;
         this.state = ObjectInDataStoreStateMachine.State.Allocated;
         this.markedForGC = false;
+        this.deploymentOption = configuration;
     }
 
     public VMTemplateStoragePoolVO(long poolId, long templateId, Date lastUpdated, int downloadPercent, Status downloadState, String localDownloadPath,
-            String errorString, String jobId, String installPath, long templateSize) {
+            String errorString, String jobId, String installPath, long templateSize, String configuration) {
         super();
         this.poolId = poolId;
         this.templateId = templateId;
@@ -190,6 +194,7 @@
         this.jobId = jobId;
         this.installPath = installPath;
         this.templateSize = templateSize;
+        this.deploymentOption = configuration;
     }
 
     protected VMTemplateStoragePoolVO() {
@@ -300,4 +305,11 @@
         return this.state;
     }
 
+    public String getDeploymentOption() {
+        return deploymentOption;
+    }
+
+    public void setDeploymentOption(String deploymentOption) {
+        this.deploymentOption = deploymentOption;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/VMTemplateVO.java b/engine/schema/src/main/java/com/cloud/storage/VMTemplateVO.java
index af04099..61df40e 100644
--- a/engine/schema/src/main/java/com/cloud/storage/VMTemplateVO.java
+++ b/engine/schema/src/main/java/com/cloud/storage/VMTemplateVO.java
@@ -152,6 +152,9 @@
     @Column(name = "parent_template_id")
     private Long parentTemplateId;
 
+    @Column(name = "deploy_as_is")
+    private boolean deployAsIs;
+
     @Override
     public String getUniqueName() {
         return uniqueName;
@@ -192,9 +195,9 @@
         uuid = UUID.randomUUID().toString();
     }
 
-    public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url,
-            boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable,
-            HypervisorType hyperType, String templateTag, Map<String, String> details, boolean sshKeyEnabled, boolean isDynamicallyScalable, boolean directDownload) {
+    public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable,
+                        HypervisorType hyperType, String templateTag, Map<String, String> details, boolean sshKeyEnabled, boolean isDynamicallyScalable, boolean directDownload,
+                        boolean deployAsIs) {
         this(id,
             name,
             format,
@@ -219,6 +222,7 @@
         dynamicallyScalable = isDynamicallyScalable;
         state = State.Active;
         this.directDownload = directDownload;
+        this.deployAsIs = deployAsIs;
     }
 
     public static VMTemplateVO createPreHostIso(Long id, String uniqueName, String name, ImageFormat format, boolean isPublic, boolean featured, TemplateType type,
@@ -637,4 +641,11 @@
         this.parentTemplateId = parentTemplateId;
     }
 
+    @Override public boolean isDeployAsIs() {
+        return deployAsIs;
+    }
+
+    public void setDeployAsIs(boolean deployAsIs) {
+        this.deployAsIs = deployAsIs;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java b/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java
index d8323e9..b766483 100644
--- a/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java
+++ b/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java
@@ -166,6 +166,9 @@
     @Column(name = "hv_ss_reserve")
     private Integer hypervisorSnapshotReserve;
 
+    @Transient
+    private boolean deployAsIs;
+
     // Real Constructor
     public VolumeVO(Type type, String name, long dcId, long domainId,
             long accountId, long diskOfferingId, Storage.ProvisioningType provisioningType, long size,
@@ -261,6 +264,7 @@
         format = that.getFormat();
         provisioningType = that.getProvisioningType();
         uuid = UUID.randomUUID().toString();
+        deployAsIs = that.isDeployAsIs();
     }
 
     @Override
@@ -572,6 +576,11 @@
         return displayVolume;
     }
 
+    @Override
+    public boolean isDeployAsIs() {
+        return deployAsIs;
+    }
+
     public void setDisplay(boolean display){
         this.displayVolume = display;
     }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDao.java
index 61fec36..d98ef23 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDao.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDao.java
@@ -21,4 +21,5 @@
 
 public interface GuestOSCategoryDao extends GenericDao<GuestOSCategoryVO, Long> {
 
+    GuestOSCategoryVO findByCategoryName(String categoryName);
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDaoImpl.java
index 8ffb54a..6fad6c5 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSCategoryDaoImpl.java
@@ -16,7 +16,8 @@
 // under the License.
 package com.cloud.storage.dao;
 
-
+import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.SearchCriteria;
 import org.springframework.stereotype.Component;
 
 import com.cloud.storage.GuestOSCategoryVO;
@@ -29,4 +30,10 @@
 
     }
 
+    @Override
+    public GuestOSCategoryVO findByCategoryName(String categoryName) {
+        final QueryBuilder<GuestOSCategoryVO> sc = QueryBuilder.create(GuestOSCategoryVO.class);
+        sc.and(sc.entity().getName(), SearchCriteria.Op.EQ, categoryName);
+        return sc.find();
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDao.java
index cd00703..41b9571 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDao.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDao.java
@@ -20,6 +20,8 @@
 import com.cloud.storage.GuestOSHypervisorVO;
 import com.cloud.utils.db.GenericDao;
 
+import java.util.List;
+
 public interface GuestOSHypervisorDao extends GenericDao<GuestOSHypervisorVO, Long> {
 
     HypervisorType findHypervisorTypeByGuestOsId(long guestOsId);
@@ -31,4 +33,9 @@
     GuestOSHypervisorVO findByOsIdAndHypervisorAndUserDefined(long guestOsId, String hypervisorType, String hypervisorVersion, boolean isUserDefined);
 
     GuestOSHypervisorVO findByOsNameAndHypervisor(String guestOsName, String hypervisorType, String hypervisorVersion);
+
+    List<GuestOSHypervisorVO> listByOsNameAndHypervisorMinimumVersion(String guestOsName, String hypervisorType,
+                                                                      String minHypervisorVersion);
+
+    List<String> listHypervisorSupportedVersionsFromMinimumVersion(String hypervisorType, String hypervisorVersion);
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDaoImpl.java
index 699ce0b..add4bfc 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/GuestOSHypervisorDaoImpl.java
@@ -16,9 +16,11 @@
 // under the License.
 package com.cloud.storage.dao;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import com.cloud.utils.db.QueryBuilder;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.stereotype.Component;
 
@@ -36,6 +38,7 @@
     protected final SearchBuilder<GuestOSHypervisorVO> mappingSearch;
     protected final SearchBuilder<GuestOSHypervisorVO> userDefinedMappingSearch;
     protected final SearchBuilder<GuestOSHypervisorVO> guestOsNameSearch;
+    protected final SearchBuilder<GuestOSHypervisorVO> availableHypervisorVersionSearch;
 
     protected GuestOSHypervisorDaoImpl() {
         guestOsSearch = createSearchBuilder();
@@ -60,6 +63,15 @@
         guestOsNameSearch.and("hypervisor_type", guestOsNameSearch.entity().getHypervisorType(), SearchCriteria.Op.EQ);
         guestOsNameSearch.and("hypervisor_version", guestOsNameSearch.entity().getHypervisorVersion(), SearchCriteria.Op.EQ);
         guestOsNameSearch.done();
+
+        availableHypervisorVersionSearch = createSearchBuilder();
+        availableHypervisorVersionSearch.and("hypervisor_type",
+                availableHypervisorVersionSearch.entity().getHypervisorType(), SearchCriteria.Op.EQ);
+        availableHypervisorVersionSearch.and("hypervisor_version",
+                availableHypervisorVersionSearch.entity().getHypervisorVersion(), SearchCriteria.Op.GTEQ);
+        availableHypervisorVersionSearch.select(null, SearchCriteria.Func.DISTINCT,
+                availableHypervisorVersionSearch.entity().getHypervisorVersion());
+        availableHypervisorVersionSearch.done();
     }
 
     @Override
@@ -121,4 +133,29 @@
         return CollectionUtils.isNotEmpty(results) ? results.get(0) : null;
     }
 
+    @Override
+    public List<GuestOSHypervisorVO> listByOsNameAndHypervisorMinimumVersion(String guestOsName, String hypervisorType,
+                                                                             String minHypervisorVersion) {
+        final QueryBuilder<GuestOSHypervisorVO> sc = QueryBuilder.create(GuestOSHypervisorVO.class);
+        sc.and(sc.entity().getGuestOsName(), SearchCriteria.Op.EQ, guestOsName);
+        sc.and(sc.entity().getHypervisorType(), SearchCriteria.Op.EQ, hypervisorType);
+        sc.and(sc.entity().getHypervisorVersion(), SearchCriteria.Op.GTEQ, minHypervisorVersion);
+        sc.and(sc.entity().getHypervisorVersion(), SearchCriteria.Op.NEQ, "default");
+        return sc.list();
+    }
+
+    @Override
+    public List<String> listHypervisorSupportedVersionsFromMinimumVersion(String hypervisorType, String hypervisorVersion) {
+        List<String> versions = new ArrayList<>();
+        SearchCriteria<GuestOSHypervisorVO> sc = availableHypervisorVersionSearch.create();
+        sc.setParameters("hypervisor_type", hypervisorType);
+        sc.setParameters("hypervisor_version", hypervisorVersion);
+        Filter filter = new Filter(GuestOSHypervisorVO.class, "hypervisorVersion", true, null, null);
+        List<GuestOSHypervisorVO> mappings = listBy(sc, filter);
+        for (GuestOSHypervisorVO mapping : mappings) {
+            versions.add(mapping.getHypervisorVersion());
+        }
+        return versions;
+    }
+
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index 1e74d25..0c39a8c 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -21,11 +21,19 @@
 import org.apache.cloudstack.framework.config.ConfigKey.Scope;
 import org.apache.cloudstack.framework.config.ScopedConfigStorage;
 import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
+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 javax.inject.Inject;
+import java.util.List;
 
 public class StoragePoolDetailsDaoImpl extends ResourceDetailsDaoBase<StoragePoolDetailVO> implements StoragePoolDetailsDao, ScopedConfigStorage {
 
+    @Inject
+    PrimaryDataStoreDao _storagePoolDao;
+
     public StoragePoolDetailsDaoImpl() {
     }
 
@@ -42,6 +50,10 @@
 
     @Override
     public void addDetail(long resourceId, String key, String value, boolean display) {
+        List<StoragePoolVO> ChildPools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(resourceId);
+        for(StoragePoolVO childPool : ChildPools) {
+            super.addDetail(new StoragePoolDetailVO(childPool.getId(), key, value, display));
+        }
         super.addDetail(new StoragePoolDetailVO(resourceId, key, value, display));
     }
 }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDao.java
deleted file mode 100644
index eb78f20..0000000
--- a/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDao.java
+++ /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.
-
-package com.cloud.storage.dao;
-
-import com.cloud.storage.TemplateOVFPropertyVO;
-import com.cloud.utils.db.GenericDao;
-
-import java.util.List;
-
-public interface TemplateOVFPropertiesDao extends GenericDao<TemplateOVFPropertyVO, Long> {
-
-    boolean existsOption(long templateId, String key);
-    TemplateOVFPropertyVO findByTemplateAndKey(long templateId, String key);
-    void saveOptions(List<TemplateOVFPropertyVO> opts);
-    List<TemplateOVFPropertyVO> listByTemplateId(long templateId);
-}
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDaoImpl.java
deleted file mode 100644
index cf6a280..0000000
--- a/engine/schema/src/main/java/com/cloud/storage/dao/TemplateOVFPropertiesDaoImpl.java
+++ /dev/null
@@ -1,78 +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.
-
-package com.cloud.storage.dao;
-
-import com.cloud.storage.TemplateOVFPropertyVO;
-import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.SearchBuilder;
-import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.TransactionLegacy;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-@Component
-public class TemplateOVFPropertiesDaoImpl extends GenericDaoBase<TemplateOVFPropertyVO, Long> implements TemplateOVFPropertiesDao {
-
-    private final static Logger s_logger = Logger.getLogger(TemplateOVFPropertiesDaoImpl.class);
-
-    SearchBuilder<TemplateOVFPropertyVO> OptionsSearchBuilder;
-
-    public TemplateOVFPropertiesDaoImpl() {
-        super();
-        OptionsSearchBuilder = createSearchBuilder();
-        OptionsSearchBuilder.and("templateid", OptionsSearchBuilder.entity().getTemplateId(), SearchCriteria.Op.EQ);
-        OptionsSearchBuilder.and("key", OptionsSearchBuilder.entity().getKey(), SearchCriteria.Op.EQ);
-        OptionsSearchBuilder.done();
-    }
-
-    @Override
-    public boolean existsOption(long templateId, String key) {
-        return findByTemplateAndKey(templateId, key) != null;
-    }
-
-    @Override
-    public TemplateOVFPropertyVO findByTemplateAndKey(long templateId, String key) {
-        SearchCriteria<TemplateOVFPropertyVO> sc = OptionsSearchBuilder.create();
-        sc.setParameters("templateid", templateId);
-        sc.setParameters("key", key);
-        return findOneBy(sc);
-    }
-
-    @Override
-    public void saveOptions(List<TemplateOVFPropertyVO> opts) {
-        if (CollectionUtils.isEmpty(opts)) {
-            return;
-        }
-        TransactionLegacy txn = TransactionLegacy.currentTxn();
-        txn.start();
-        for (TemplateOVFPropertyVO opt : opts) {
-            persist(opt);
-        }
-        txn.commit();
-    }
-
-    @Override
-    public List<TemplateOVFPropertyVO> listByTemplateId(long templateId) {
-        SearchCriteria<TemplateOVFPropertyVO> sc = OptionsSearchBuilder.create();
-        sc.setParameters("templateid", templateId);
-        return listBy(sc);
-    }
-}
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
index 6caef20..a3bebfa 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@ -376,6 +376,7 @@
         tmpltTypeHyperSearch2.and("templateType", tmpltTypeHyperSearch2.entity().getTemplateType(), SearchCriteria.Op.EQ);
         tmpltTypeHyperSearch2.and("hypervisorType", tmpltTypeHyperSearch2.entity().getHypervisorType(), SearchCriteria.Op.EQ);
         tmpltTypeHyperSearch2.and("templateName", tmpltTypeHyperSearch2.entity().getName(), SearchCriteria.Op.EQ);
+        tmpltTypeHyperSearch2.and("state", tmpltTypeHyperSearch2.entity().getState(), SearchCriteria.Op.EQ);
 
         tmpltTypeSearch = createSearchBuilder();
         tmpltTypeSearch.and("state", tmpltTypeSearch.entity().getState(), SearchCriteria.Op.EQ);
@@ -897,6 +898,7 @@
         SearchCriteria<VMTemplateVO> sc = tmpltTypeHyperSearch2.create();
         sc.setParameters("templateType", TemplateType.ROUTING);
         sc.setParameters("hypervisorType", hType);
+        sc.setParameters("state", VirtualMachineTemplate.State.Active.toString());
         if (templateName != null) {
             sc.setParameters("templateName", templateName);
         }
@@ -911,6 +913,7 @@
             sc = tmpltTypeHyperSearch2.create();
             sc.setParameters("templateType", TemplateType.SYSTEM);
             sc.setParameters("hypervisorType", hType);
+            sc.setParameters("state", VirtualMachineTemplate.State.Active.toString());
             if (templateName != null) {
                 sc.setParameters("templateName", templateName);
             }
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 3e7072f..60e583b 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -30,4 +30,4 @@
     public void addDetail(long resourceId, String key, String value, boolean display) {
         super.addDetail(new VMTemplateDetailVO(resourceId, key, value, display));
     }
-}
+}
\ No newline at end of file
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDao.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDao.java
index 05afad6..d00eece 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDao.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDao.java
@@ -27,27 +27,27 @@
 
 public interface VMTemplatePoolDao extends GenericDao<VMTemplateStoragePoolVO, Long>,
         StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, DataObjectInStore> {
-    public List<VMTemplateStoragePoolVO> listByPoolId(long id);
+    List<VMTemplateStoragePoolVO> listByPoolId(long id);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateId(long templateId);
+    List<VMTemplateStoragePoolVO> listByTemplateId(long templateId);
 
-    public VMTemplateStoragePoolVO findByPoolTemplate(long poolId, long templateId);
+    VMTemplateStoragePoolVO findByPoolTemplate(long poolId, long templateId, String configuration);
 
-    public List<VMTemplateStoragePoolVO> listByPoolIdAndState(long poolId, ObjectInDataStoreStateMachine.State state);
+    List<VMTemplateStoragePoolVO> listByPoolIdAndState(long poolId, ObjectInDataStoreStateMachine.State state);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState);
+    List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState, long poolId);
+    List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, VMTemplateStoragePoolVO.Status downloadState, long poolId);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, VMTemplateStoragePoolVO.Status downloadState);
+    List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, VMTemplateStoragePoolVO.Status downloadState);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, long podId, VMTemplateStoragePoolVO.Status downloadState);
+    List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, long podId, VMTemplateStoragePoolVO.Status downloadState);
 
-    public List<VMTemplateStoragePoolVO> listByTemplateStates(long templateId, VMTemplateStoragePoolVO.Status... states);
+    List<VMTemplateStoragePoolVO> listByTemplateStates(long templateId, VMTemplateStoragePoolVO.Status... states);
 
     boolean templateAvailable(long templateId, long poolId);
 
-    public VMTemplateStoragePoolVO findByHostTemplate(Long hostId, Long templateId);
+    VMTemplateStoragePoolVO findByHostTemplate(Long hostId, Long templateId, String configuration);
 
     VMTemplateStoragePoolVO findByPoolPath(Long poolId, String path);
 
diff --git a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
index 3287470..998df5e 100644
--- a/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
@@ -28,6 +28,7 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -73,7 +74,7 @@
 
     protected static final String HOST_TEMPLATE_SEARCH =
         "SELECT * FROM template_spool_ref tp, storage_pool_host_ref ph, host h where tp.pool_id = ph.pool_id and ph.host_id = h.id and h.id=? "
-            + " and tp.template_id=? ";
+            + " and tp.template_id=? and tp.deployment_option ";
 
     public VMTemplatePoolDaoImpl() {
         PoolSearch = createSearchBuilder();
@@ -87,6 +88,7 @@
         PoolTemplateSearch = createSearchBuilder();
         PoolTemplateSearch.and("pool_id", PoolTemplateSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
         PoolTemplateSearch.and("template_id", PoolTemplateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
+        PoolTemplateSearch.and("configuration", PoolTemplateSearch.entity().getDeploymentOption(), SearchCriteria.Op.EQ);
         PoolTemplateSearch.done();
 
         TemplateStatusSearch = createSearchBuilder();
@@ -138,10 +140,13 @@
     }
 
     @Override
-    public VMTemplateStoragePoolVO findByPoolTemplate(long poolId, long templateId) {
+    public VMTemplateStoragePoolVO findByPoolTemplate(long poolId, long templateId, String configuration) {
         SearchCriteria<VMTemplateStoragePoolVO> sc = PoolTemplateSearch.create();
         sc.setParameters("pool_id", poolId);
         sc.setParameters("template_id", templateId);
+        if (StringUtils.isNotBlank(configuration)) {
+            sc.setParameters("configuration", configuration);
+        }
         return findOneIncludingRemovedBy(sc);
     }
 
@@ -219,13 +224,17 @@
 
     }
 
-    public List<VMTemplateStoragePoolVO> listByHostTemplate(long hostId, long templateId) {
+    public List<VMTemplateStoragePoolVO> listByHostTemplate(long hostId, long templateId, String configuration) {
         TransactionLegacy txn = TransactionLegacy.currentTxn();
         List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
         String sql = HOST_TEMPLATE_SEARCH;
+        sql += StringUtils.isBlank(configuration) ? "IS NULL" : "= ?";
         try(PreparedStatement pstmt = txn.prepareStatement(sql);) {
             pstmt.setLong(1, hostId);
             pstmt.setLong(2, templateId);
+            if (StringUtils.isNotBlank(configuration)) {
+                pstmt.setString(3, configuration);
+            }
             try(ResultSet rs = pstmt.executeQuery();) {
                 while (rs.next()) {
                     // result.add(toEntityBean(rs, false)); TODO: this is buggy in
@@ -245,7 +254,7 @@
 
     @Override
     public boolean templateAvailable(long templateId, long hostId) {
-        VMTemplateStorageResourceAssoc tmpltPool = findByPoolTemplate(hostId, templateId);
+        VMTemplateStorageResourceAssoc tmpltPool = findByPoolTemplate(hostId, templateId, null);
         if (tmpltPool == null)
             return false;
 
@@ -262,9 +271,9 @@
     }
 
     @Override
-    public VMTemplateStoragePoolVO findByHostTemplate(Long hostId, Long templateId) {
-        List<VMTemplateStoragePoolVO> result = listByHostTemplate(hostId, templateId);
-        return (result.size() == 0) ? null : result.get(1);
+    public VMTemplateStoragePoolVO findByHostTemplate(Long hostId, Long templateId, String configuration) {
+        List<VMTemplateStoragePoolVO> result = listByHostTemplate(hostId, templateId, configuration);
+        return (result.size() == 0) ? null : result.get(0);
     }
 
     @Override
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java
index 2281e1d..7bf5cf6 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseCreator.java
@@ -104,8 +104,10 @@
             List<String> queries = new ArrayList<String>();
             queries.add(String.format("drop database if exists `%s`", dbName));
             queries.add(String.format("create database `%s`", dbName));
-            queries.add(String.format("GRANT ALL ON %s.* to '%s'@`localhost` identified by '%s'", dbName, username, password));
-            queries.add(String.format("GRANT ALL ON %s.* to '%s'@`%%` identified by '%s'", dbName, username, password));
+            queries.add(String.format("CREATE USER IF NOT EXISTS %s@`localhost` identified by '%s'", username, password));
+            queries.add(String.format("CREATE USER IF NOT EXISTS %s@`%%` identified by '%s'", username, password));
+            queries.add(String.format("GRANT ALL ON %s.* to '%s'@`localhost`", dbName, username));
+            queries.add(String.format("GRANT ALL ON %s.* to '%s'@`%%`", dbName, username));
 
             for (String query : queries) {
                 runQuery(host, port, rootPassword, query, dryRun);
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 43ecbde..8c719a3 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/DatabaseUpgradeChecker.java
@@ -34,6 +34,7 @@
 import org.apache.log4j.Logger;
 
 import com.cloud.upgrade.dao.DbUpgrade;
+import com.cloud.upgrade.dao.DbUpgradeSystemVmTemplate;
 import com.cloud.upgrade.dao.Upgrade217to218;
 import com.cloud.upgrade.dao.Upgrade218to22;
 import com.cloud.upgrade.dao.Upgrade218to224DomainVlans;
@@ -68,7 +69,8 @@
 import com.cloud.upgrade.dao.Upgrade41200to41300;
 import com.cloud.upgrade.dao.Upgrade41300to41310;
 import com.cloud.upgrade.dao.Upgrade41310to41400;
-import com.cloud.upgrade.dao.Upgrade41400to41410;
+import com.cloud.upgrade.dao.Upgrade41400to41500;
+import com.cloud.upgrade.dao.Upgrade41500to41510;
 import com.cloud.upgrade.dao.Upgrade420to421;
 import com.cloud.upgrade.dao.Upgrade421to430;
 import com.cloud.upgrade.dao.Upgrade430to440;
@@ -192,7 +194,9 @@
                 .next("4.12.0.0", new Upgrade41200to41300())
                 .next("4.13.0.0", new Upgrade41300to41310())
                 .next("4.13.1.0", new Upgrade41310to41400())
-                .next("4.14.0.0", new Upgrade41400to41410())
+                .next("4.14.0.0", new Upgrade41400to41500())
+                .next("4.14.1.0", new Upgrade41400to41500())
+                .next("4.15.0.0", new Upgrade41500to41510())
                 .build();
     }
 
@@ -232,11 +236,42 @@
 
     }
 
+    private void updateSystemVmTemplates(DbUpgrade[] upgrades) {
+        for (int i = upgrades.length - 1; i >= 0; i--) {
+            DbUpgrade upgrade = upgrades[i];
+            if (upgrade instanceof DbUpgradeSystemVmTemplate) {
+                TransactionLegacy txn = TransactionLegacy.open("Upgrade");
+                txn.start();
+                try {
+                    Connection conn;
+                    try {
+                        conn = txn.getConnection();
+                    } catch (SQLException e) {
+                        String errorMessage = "Unable to upgrade the database";
+                        s_logger.error(errorMessage, e);
+                        throw new CloudRuntimeException(errorMessage, e);
+                    }
+                    ((DbUpgradeSystemVmTemplate)upgrade).updateSystemVmTemplates(conn);
+                    txn.commit();
+                    break;
+                } catch (CloudRuntimeException e) {
+                    String errorMessage = "Unable to upgrade the database";
+                    s_logger.error(errorMessage, e);
+                    throw new CloudRuntimeException(errorMessage, e);
+                } finally {
+                    txn.close();
+                }
+            }
+        }
+    }
+
     protected void upgrade(CloudStackVersion dbVersion, CloudStackVersion currentVersion) {
         s_logger.info("Database upgrade must be performed from " + dbVersion + " to " + currentVersion);
 
         final DbUpgrade[] upgrades = calculateUpgradePath(dbVersion, currentVersion);
 
+        updateSystemVmTemplates(upgrades);
+
         for (DbUpgrade upgrade : upgrades) {
             VersionVO version;
             s_logger.debug("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeSystemVmTemplate.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeSystemVmTemplate.java
new file mode 100644
index 0000000..4211898
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/DbUpgradeSystemVmTemplate.java
@@ -0,0 +1,25 @@
+// 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.sql.Connection;
+
+public interface DbUpgradeSystemVmTemplate {
+
+    void updateSystemVmTemplates(Connection conn);
+}
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41310to41400.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41310to41400.java
index 583feea..f1a333e 100644
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41310to41400.java
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41310to41400.java
@@ -19,17 +19,9 @@
 
 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 Upgrade41310to41400 implements DbUpgrade {
@@ -64,175 +56,6 @@
 
     @Override
     public void performDataMigration(Connection conn) {
-        updateSystemVmTemplates(conn);
-    }
-
-    @SuppressWarnings("serial")
-    private 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.14.0");
-                put(Hypervisor.HypervisorType.VMware, "systemvm-vmware-4.14.0");
-                put(Hypervisor.HypervisorType.XenServer, "systemvm-xenserver-4.14.0");
-                put(Hypervisor.HypervisorType.Hyperv, "systemvm-hyperv-4.14.0");
-                put(Hypervisor.HypervisorType.LXC, "systemvm-lxc-4.14.0");
-                put(Hypervisor.HypervisorType.Ovm3, "systemvm-ovm3-4.14.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.14/systemvmtemplate-4.14.0-kvm.qcow2.bz2");
-                put(Hypervisor.HypervisorType.VMware, "https://download.cloudstack.org/systemvm/4.14/systemvmtemplate-4.14.0-vmware.ova");
-                put(Hypervisor.HypervisorType.XenServer, "https://download.cloudstack.org/systemvm/4.14/systemvmtemplate-4.14.0-xen.vhd.bz2");
-                put(Hypervisor.HypervisorType.Hyperv, "https://download.cloudstack.org/systemvm/4.14/systemvmtemplate-4.14.0-hyperv.vhd.zip");
-                put(Hypervisor.HypervisorType.LXC, "https://download.cloudstack.org/systemvm/4.14/systemvmtemplate-4.14.0-kvm.qcow2.bz2");
-                put(Hypervisor.HypervisorType.Ovm3, "https://download.cloudstack.org/systemvm/4.14/systemvmtemplate-4.14.0-ovm.raw.bz2");
-            }
-        };
-
-        final Map<Hypervisor.HypervisorType, String> newTemplateChecksum = new HashMap<Hypervisor.HypervisorType, String>() {
-            {
-                put(Hypervisor.HypervisorType.KVM, "4978e6e6140d167556f201496549a498");
-                put(Hypervisor.HypervisorType.XenServer, "2e3078de2ccce760d537e06fd9b4c7c7");
-                put(Hypervisor.HypervisorType.VMware, "33cad72f858aef11c95df486b0f21938");
-                put(Hypervisor.HypervisorType.Hyperv, "cf58913fb5cc830749760895dc9f406f");
-                put(Hypervisor.HypervisorType.LXC, "4978e6e6140d167556f201496549a498");
-                put(Hypervisor.HypervisorType.Ovm3, "3b8df36a9dc8b87ae3892da61d8e2679");
-            }
-        };
-
-        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 4.11 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.14.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.14.0: " + e.getMessage());
-                        throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.14.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
diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41410.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41410.java
deleted file mode 100644
index 600b3a8..0000000
--- a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41410.java
+++ /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.
-package com.cloud.upgrade.dao;
-
-import java.io.InputStream;
-import java.sql.Connection;
-
-public class Upgrade41400to41410 implements DbUpgrade {
-    @Override
-    public String[] getUpgradableVersionRange() {
-        return new String[] {"4.14.0.0", "4.14.1.0"};
-    }
-
-    @Override
-    public String getUpgradedVersion() {
-        return "4.14.1.0";
-    }
-
-    @Override
-    public boolean supportsRollingUpgrade() {
-        return false;
-    }
-
-    @Override
-    public InputStream[] getPrepareScripts() {
-        return new InputStream[0];
-    }
-
-    @Override
-    public void performDataMigration(Connection conn) {
-
-    }
-
-    @Override
-    public InputStream[] getCleanupScripts() {
-        return new InputStream[0];
-    }
-}
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
new file mode 100644
index 0000000..0ee9bab
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41400to41500.java
@@ -0,0 +1,534 @@
+// 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.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 {
+
+    final static Logger LOG = Logger.getLogger(Upgrade41400to41500.class);
+
+    @Override
+    public String[] getUpgradableVersionRange() {
+        return new String[] {"4.14.0.0", "4.15.0.0"};
+    }
+
+    @Override
+    public String getUpgradedVersion() {
+        return "4.15.0.0";
+    }
+
+    @Override
+    public boolean supportsRollingUpgrade() {
+        return false;
+    }
+
+    @Override
+    public InputStream[] getPrepareScripts() {
+        final String scriptFile = "META-INF/db/schema-41400to41500.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) {
+        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);
+        addRolePermissionsForSupportAdmin(conn);
+        addRolePermissionsForSupportUser(conn);
+    }
+
+    private void addRolePermissionsForReadOnlyAdmin(final Connection conn) {
+        LOG.debug("Adding role permissions for new read-only admin role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Read-Only Admin - Default' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long readOnlyAdminRoleId = rs.getLong(1);
+                int readOnlyAdminSortOrder = 0;
+                Map<String, String> readOnlyAdminRules = new LinkedHashMap<>();
+                readOnlyAdminRules.put("list*", "ALLOW");
+                readOnlyAdminRules.put("getUploadParamsFor*", "DENY");
+                readOnlyAdminRules.put("get*", "ALLOW");
+                readOnlyAdminRules.put("cloudianIsEnabled", "ALLOW");
+                readOnlyAdminRules.put("queryAsyncJobResult", "ALLOW");
+                readOnlyAdminRules.put("quotaIsEnabled", "ALLOW");
+                readOnlyAdminRules.put("quotaTariffList", "ALLOW");
+                readOnlyAdminRules.put("quotaSummary", "ALLOW");
+                readOnlyAdminRules.put("*", "DENY");
+
+                for (Map.Entry<String, String> readOnlyAdminRule : readOnlyAdminRules.entrySet()) {
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, ?, ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, readOnlyAdminRoleId);
+                    pstmt.setString(2, readOnlyAdminRule.getKey());
+                    pstmt.setString(3, readOnlyAdminRule.getValue());
+                    pstmt.setLong(4, readOnlyAdminSortOrder++);
+                    pstmt.executeUpdate();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new read-only admin role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for read-only admin role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role permissions for read-only admin role: " + e.getMessage(), e);
+        }
+    }
+
+    private void addRolePermissionsForReadOnlyUser(final Connection conn) {
+        LOG.debug("Adding role permissions for new read-only user role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Read-Only User - Default' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long readOnlyUserRoleId = rs.getLong(1);
+                int readOnlyUserSortOrder = 0;
+
+                pstmt = conn.prepareStatement("SELECT rule FROM `cloud`.`role_permissions` WHERE role_id = 4 AND permission = 'ALLOW' AND rule LIKE 'list%' ORDER BY sort_order");
+                ResultSet rsRolePermissions = pstmt.executeQuery();
+
+                while (rsRolePermissions.next()) {
+                    String rule = rsRolePermissions.getString(1);
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setString(2, rule);
+                    pstmt.setLong(3, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                pstmt = conn.prepareStatement("SELECT rule FROM `cloud`.`role_permissions` WHERE role_id = 4 AND permission = 'ALLOW' AND rule LIKE 'get%' AND rule NOT LIKE 'getUploadParamsFor%' ORDER BY sort_order");
+                rsRolePermissions = pstmt.executeQuery();
+
+                while (rsRolePermissions.next()) {
+                    String rule = rsRolePermissions.getString(1);
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setString(2, rule);
+                    pstmt.setLong(3, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                List<String> readOnlyUserRulesAllowed = new ArrayList<>();
+                readOnlyUserRulesAllowed.add("cloudianIsEnabled");
+                readOnlyUserRulesAllowed.add("queryAsyncJobResult");
+                readOnlyUserRulesAllowed.add("quotaIsEnabled");
+                readOnlyUserRulesAllowed.add("quotaTariffList");
+                readOnlyUserRulesAllowed.add("quotaSummary");
+
+                for(String readOnlyUserRule : readOnlyUserRulesAllowed) {
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    pstmt.setString(2, readOnlyUserRule);
+                    pstmt.setLong(3, readOnlyUserSortOrder++);
+                    pstmt.executeUpdate();
+                }
+
+                pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, '*', 'DENY', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                pstmt.setLong(1, readOnlyUserRoleId);
+                pstmt.setLong(2, readOnlyUserSortOrder);
+                pstmt.executeUpdate();
+
+                if (rsRolePermissions != null && !rsRolePermissions.isClosed())  {
+                    rsRolePermissions.close();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new read-only user role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for read-only user role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role permissions for read-only user role: " + e.getMessage(), e);
+        }
+    }
+
+    private void addRolePermissionsForSupportAdmin(final Connection conn) {
+        LOG.debug("Adding role permissions for new support admin role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Support Admin - Default' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long supportAdminRoleId = rs.getLong(1);
+                int supportAdminSortOrder = 0;
+
+                pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Read-Only Admin - Default' AND is_default = 1");
+                ResultSet rsReadOnlyAdmin = pstmt.executeQuery();
+                if (rsReadOnlyAdmin.next()) {
+                    long readOnlyAdminRoleId = rsReadOnlyAdmin.getLong(1);
+                    pstmt = conn.prepareStatement("SELECT rule FROM `cloud`.`role_permissions` WHERE role_id = ? AND permission = 'ALLOW' ORDER BY sort_order");
+                    pstmt.setLong(1, readOnlyAdminRoleId);
+                    ResultSet rsRolePermissions = pstmt.executeQuery();
+
+                    while (rsRolePermissions.next()) {
+                        String rule = rsRolePermissions.getString(1);
+                        pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                        pstmt.setLong(1, supportAdminRoleId);
+                        pstmt.setString(2, rule);
+                        pstmt.setLong(3, supportAdminSortOrder++);
+                        pstmt.executeUpdate();
+                    }
+
+                    List<String> supportAdminRulesAllowed = new ArrayList<>();
+                    supportAdminRulesAllowed.add("prepareHostForMaintenance");
+                    supportAdminRulesAllowed.add("cancelHostMaintenance");
+                    supportAdminRulesAllowed.add("enableStorageMaintenance");
+                    supportAdminRulesAllowed.add("cancelStorageMaintenance");
+                    supportAdminRulesAllowed.add("createServiceOffering");
+                    supportAdminRulesAllowed.add("createDiskOffering");
+                    supportAdminRulesAllowed.add("createNetworkOffering");
+                    supportAdminRulesAllowed.add("createVPCOffering");
+                    supportAdminRulesAllowed.add("startVirtualMachine");
+                    supportAdminRulesAllowed.add("stopVirtualMachine");
+                    supportAdminRulesAllowed.add("rebootVirtualMachine");
+                    supportAdminRulesAllowed.add("startKubernetesCluster");
+                    supportAdminRulesAllowed.add("stopKubernetesCluster");
+                    supportAdminRulesAllowed.add("createVolume");
+                    supportAdminRulesAllowed.add("attachVolume");
+                    supportAdminRulesAllowed.add("detachVolume");
+                    supportAdminRulesAllowed.add("uploadVolume");
+                    supportAdminRulesAllowed.add("attachIso");
+                    supportAdminRulesAllowed.add("detachIso");
+                    supportAdminRulesAllowed.add("registerTemplate");
+                    supportAdminRulesAllowed.add("registerIso");
+
+                    for(String supportAdminRule : supportAdminRulesAllowed) {
+                        pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                        pstmt.setLong(1, supportAdminRoleId);
+                        pstmt.setString(2, supportAdminRule);
+                        pstmt.setLong(3, supportAdminSortOrder++);
+                        pstmt.executeUpdate();
+                    }
+
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, '*', 'DENY', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, supportAdminRoleId);
+                    pstmt.setLong(2, supportAdminSortOrder);
+                    pstmt.executeUpdate();
+
+                    if (rsRolePermissions != null && !rsRolePermissions.isClosed())  {
+                        rsRolePermissions.close();
+                    }
+                }
+
+                if (rsReadOnlyAdmin != null && !rsReadOnlyAdmin.isClosed())  {
+                    rsReadOnlyAdmin.close();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new support admin role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for support admin role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role permissions for support admin role: " + e.getMessage(), e);
+        }
+    }
+
+    private void addRolePermissionsForSupportUser(final Connection conn) {
+        LOG.debug("Adding role permissions for new support user role");
+        try {
+            PreparedStatement pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Support User - Default' AND is_default = 1");
+            ResultSet rs = pstmt.executeQuery();
+            if (rs.next()) {
+                long supportUserRoleId = rs.getLong(1);
+                int supportUserSortOrder = 0;
+
+                pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`roles` WHERE name = 'Read-Only User - Default' AND is_default = 1");
+                ResultSet rsReadOnlyUser = pstmt.executeQuery();
+                if (rsReadOnlyUser.next()) {
+                    long readOnlyUserRoleId = rsReadOnlyUser.getLong(1);
+                    pstmt = conn.prepareStatement("SELECT rule FROM `cloud`.`role_permissions` WHERE role_id = ? AND permission = 'ALLOW' ORDER BY sort_order");
+                    pstmt.setLong(1, readOnlyUserRoleId);
+                    ResultSet rsRolePermissions = pstmt.executeQuery();
+                    while (rsRolePermissions.next()) {
+                        String rule = rsRolePermissions.getString(1);
+                        pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                        pstmt.setLong(1, supportUserRoleId);
+                        pstmt.setString(2, rule);
+                        pstmt.setLong(3, supportUserSortOrder++);
+                        pstmt.executeUpdate();
+                    }
+
+                    List<String> supportUserRulesAllowed = new ArrayList<>();
+                    supportUserRulesAllowed.add("startVirtualMachine");
+                    supportUserRulesAllowed.add("stopVirtualMachine");
+                    supportUserRulesAllowed.add("rebootVirtualMachine");
+                    supportUserRulesAllowed.add("startKubernetesCluster");
+                    supportUserRulesAllowed.add("stopKubernetesCluster");
+                    supportUserRulesAllowed.add("createVolume");
+                    supportUserRulesAllowed.add("attachVolume");
+                    supportUserRulesAllowed.add("detachVolume");
+                    supportUserRulesAllowed.add("uploadVolume");
+                    supportUserRulesAllowed.add("attachIso");
+                    supportUserRulesAllowed.add("detachIso");
+                    supportUserRulesAllowed.add("registerTemplate");
+                    supportUserRulesAllowed.add("registerIso");
+                    supportUserRulesAllowed.add("getUploadParamsFor*");
+
+                    for(String supportUserRule : supportUserRulesAllowed) {
+                        pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, ?, 'ALLOW', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                        pstmt.setLong(1, supportUserRoleId);
+                        pstmt.setString(2, supportUserRule);
+                        pstmt.setLong(3, supportUserSortOrder++);
+                        pstmt.executeUpdate();
+                    }
+
+                    pstmt = conn.prepareStatement("INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) VALUES (UUID(), ?, '*', 'DENY', ?) ON DUPLICATE KEY UPDATE rule=rule");
+                    pstmt.setLong(1, supportUserRoleId);
+                    pstmt.setLong(2, supportUserSortOrder);
+                    pstmt.executeUpdate();
+
+                    if (rsRolePermissions != null && !rsRolePermissions.isClosed())  {
+                        rsRolePermissions.close();
+                    }
+                }
+
+                if (rsReadOnlyUser != null && !rsReadOnlyUser.isClosed())  {
+                    rsReadOnlyUser.close();
+                }
+            }
+
+            if (rs != null && !rs.isClosed())  {
+                rs.close();
+            }
+            if (pstmt != null && !pstmt.isClosed())  {
+                pstmt.close();
+            }
+            LOG.debug("Successfully added role permissions for new support user role");
+        } catch (final SQLException e) {
+            LOG.error("Exception while adding role permissions for support user role: " + e.getMessage());
+            throw new CloudRuntimeException("Exception while adding role permissions for support user role: " + e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public InputStream[] getCleanupScripts() {
+        final String scriptFile = "META-INF/db/schema-41400to41500-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/upgrade/dao/Upgrade41500to41510.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41500to41510.java
new file mode 100644
index 0000000..6ef5def
--- /dev/null
+++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41500to41510.java
@@ -0,0 +1,71 @@
+// 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 org.apache.log4j.Logger;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class Upgrade41500to41510 implements DbUpgrade {
+
+    final static Logger LOG = Logger.getLogger(Upgrade41500to41510.class);
+
+    @Override
+    public String[] getUpgradableVersionRange() {
+        return new String[] {"4.15.0.0", "4.15.1.0"};
+    }
+
+    @Override
+    public String getUpgradedVersion() {
+        return "4.15.1.0";
+    }
+
+    @Override
+    public boolean supportsRollingUpgrade() {
+        return false;
+    }
+
+    @Override
+    public InputStream[] getPrepareScripts() {
+        final String scriptFile = "META-INF/db/schema-41500to41510.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
+    public InputStream[] getCleanupScripts() {
+        final String scriptFile = "META-INF/db/schema-41500to41510-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/usage/UsageIPAddressVO.java b/engine/schema/src/main/java/com/cloud/usage/UsageIPAddressVO.java
index 4c26d6a..5e4dc65 100644
--- a/engine/schema/src/main/java/com/cloud/usage/UsageIPAddressVO.java
+++ b/engine/schema/src/main/java/com/cloud/usage/UsageIPAddressVO.java
@@ -58,10 +58,13 @@
     @Temporal(value = TemporalType.TIMESTAMP)
     private Date released = null;
 
+    @Column(name = "is_hidden")
+    private boolean isHidden = false;
+
     protected UsageIPAddressVO() {
     }
 
-    public UsageIPAddressVO(long id, long accountId, long domainId, long zoneId, String address, boolean isSourceNat, boolean isSystem, Date assigned, Date released) {
+    public UsageIPAddressVO(long id, long accountId, long domainId, long zoneId, String address, boolean isSourceNat, boolean isSystem, Date assigned, Date released, boolean isHidden) {
         this.id = id;
         this.accountId = accountId;
         this.domainId = domainId;
@@ -71,6 +74,7 @@
         this.isSystem = isSystem;
         this.assigned = assigned;
         this.released = released;
+        this.isHidden = isHidden;
     }
 
     public UsageIPAddressVO(long accountId, String address, Date assigned, Date released) {
@@ -120,4 +124,8 @@
     public void setReleased(Date released) {
         this.released = released;
     }
+
+    public boolean isHidden() {
+        return isHidden;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/usage/UsageVO.java b/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
index cc90d71..45ceeea 100644
--- a/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
+++ b/engine/schema/src/main/java/com/cloud/usage/UsageVO.java
@@ -106,6 +106,9 @@
     @Column(name = "quota_calculated")
     private Integer quotaCalculated = 0;
 
+    @Column(name = "is_hidden")
+    private boolean isHidden = false;
+
     public Integer getQuotaCalculated() {
         return quotaCalculated;
     }
@@ -215,7 +218,7 @@
 
     //IPAddress Usage
     public UsageVO(Long zoneId, Long accountId, Long domainId, String description, String usageDisplay, int usageType, Double rawUsage, Long usageId, long size,
-            String type, Date startDate, Date endDate) {
+            String type, Date startDate, Date endDate, boolean isHidden) {
         this.zoneId = zoneId;
         this.accountId = accountId;
         this.domainId = domainId;
@@ -228,6 +231,7 @@
         this.type = type;
         this.startDate = startDate  == null ? null : new Date(startDate.getTime());
         this.endDate = endDate  == null ? null : new Date(endDate.getTime());
+        this.isHidden = isHidden;
     }
 
     @Override
@@ -340,6 +344,11 @@
         return endDate  == null ? null : new Date(endDate.getTime());
     }
 
+    @Override
+    public boolean isHidden() {
+        return isHidden;
+    }
+
     public void setId(Long id) {
         this.id = id;
     }
@@ -383,4 +392,8 @@
     public void setVirtualSize(Long virtualSize) {
         this.virtualSize = virtualSize;
     }
+
+    public void setHidden(boolean hidden) {
+        this.isHidden = hidden;
+    }
 }
diff --git a/engine/schema/src/main/java/com/cloud/usage/dao/UsageIPAddressDaoImpl.java b/engine/schema/src/main/java/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
index a1e64e4..41f573f 100644
--- a/engine/schema/src/main/java/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
@@ -40,16 +40,20 @@
 
     protected static final String UPDATE_RELEASED = "UPDATE usage_ip_address SET released = ? WHERE account_id = ? AND public_ip_address = ? and released IS NULL";
     protected static final String GET_USAGE_RECORDS_BY_ACCOUNT =
-        "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released " + "FROM usage_ip_address "
+        "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released, is_hidden "
+            + "FROM usage_ip_address "
             + "WHERE account_id = ? AND ((released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR "
             + "      (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?)))";
     protected static final String GET_USAGE_RECORDS_BY_DOMAIN =
-        "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released " + "FROM usage_ip_address "
+        "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released, is_hidden "
+            + "FROM usage_ip_address "
             + "WHERE domain_id = ? AND ((released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR "
             + "      (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?)))";
-    protected static final String GET_ALL_USAGE_RECORDS = "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released "
-        + "FROM usage_ip_address " + "WHERE (released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR "
-        + "      (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?))";
+    protected static final String GET_ALL_USAGE_RECORDS =
+        "SELECT id, account_id, domain_id, zone_id, public_ip_address, is_source_nat, is_system, assigned, released, is_hidden "
+            + "FROM usage_ip_address "
+            + "WHERE (released IS NULL AND assigned <= ?) OR (assigned BETWEEN ? AND ?) OR "
+            + "      (released BETWEEN ? AND ?) OR ((assigned <= ?) AND (released >= ?))";
 
     public UsageIPAddressDaoImpl() {
     }
@@ -128,6 +132,7 @@
                 Date releasedDate = null;
                 String assignedTS = rs.getString(8);
                 String releasedTS = rs.getString(9);
+                Boolean isHidden = Boolean.valueOf(rs.getBoolean(10));
 
                 if (assignedTS != null) {
                     assignedDate = DateUtil.parseDateString(s_gmtTimeZone, assignedTS);
@@ -136,7 +141,7 @@
                     releasedDate = DateUtil.parseDateString(s_gmtTimeZone, releasedTS);
                 }
 
-                usageRecords.add(new UsageIPAddressVO(id, acctId, dId, zId, addr, isSourceNat, isSystem, assignedDate, releasedDate));
+                usageRecords.add(new UsageIPAddressVO(id, acctId, dId, zId, addr, isSourceNat, isSystem, assignedDate, releasedDate, isHidden));
             }
         } catch (Exception e) {
             txn.rollback();
diff --git a/engine/schema/src/main/java/com/cloud/user/dao/UserDao.java b/engine/schema/src/main/java/com/cloud/user/dao/UserDao.java
index 6f0f6cf..14b0742 100644
--- a/engine/schema/src/main/java/com/cloud/user/dao/UserDao.java
+++ b/engine/schema/src/main/java/com/cloud/user/dao/UserDao.java
@@ -27,6 +27,8 @@
 public interface UserDao extends GenericDao<UserVO, Long> {
     UserVO getUser(String username, String password);
 
+    UserVO getUserByName(String username, Long domainId);
+
     UserVO getUser(String username);
 
     UserVO getUser(long userId);
diff --git a/engine/schema/src/main/java/com/cloud/user/dao/UserDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/UserDaoImpl.java
index e15cf80..8baf732 100644
--- a/engine/schema/src/main/java/com/cloud/user/dao/UserDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/user/dao/UserDaoImpl.java
@@ -19,6 +19,8 @@
 import java.util.List;
 
 
+import javax.inject.Inject;
+
 import org.springframework.stereotype.Component;
 
 import com.cloud.user.UserVO;
@@ -38,6 +40,9 @@
     protected SearchBuilder<UserVO> SecretKeySearch;
     protected SearchBuilder<UserVO> RegistrationTokenSearch;
 
+    @Inject
+    private AccountDao accountDao;
+
     protected UserDaoImpl() {
         UsernameSearch = createSearchBuilder();
         UsernameSearch.and("username", UsernameSearch.entity().getUsername(), SearchCriteria.Op.EQ);
@@ -78,6 +83,17 @@
     }
 
     @Override
+    public UserVO getUserByName(String username, Long domainId) {
+        List<UserVO> users = findUsersByName(username);
+        for (UserVO u : users) {
+           if (accountDao.findActiveAccountById(u.getAccountId(), domainId) != null) {
+               return u;
+           }
+        }
+        return null;
+    }
+
+    @Override
     public List<UserVO> listByAccount(long accountId) {
         SearchCriteria<UserVO> sc = AccountIdSearch.create();
         sc.setParameters("account", accountId);
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
index 17f0ffd..135f96f 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -189,7 +189,6 @@
     public Integer countAllByRole(final Role role) {
         final SearchCriteria<DomainRouterVO> sc = createSearchCriteria();
         sc.addAnd("role", SearchCriteria.Op.EQ, role);
-        sc.addAnd("removed", Op.NULL);
         return getCount(sc);
     }
 
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/main/java/com/cloud/vm/dao/UserVmDaoImpl.java
index 6ed31a1..25479d6 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/UserVmDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/UserVmDaoImpl.java
@@ -365,8 +365,10 @@
 
     @Override
     public void loadDetails(UserVmVO vm) {
-        Map<String, String> details = _detailsDao.listDetailsKeyPairs(vm.getId());
-        vm.setDetails(details);
+        if (vm != null ) {
+            Map<String, String> details = _detailsDao.listDetailsKeyPairs(vm.getId());
+            vm.setDetails(details);
+        }
     }
 
     @Override
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRolePermissionVO.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRolePermissionVO.java
new file mode 100644
index 0000000..c700f84
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRolePermissionVO.java
@@ -0,0 +1,72 @@
+// 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.acl;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "project_role_permissions")
+public class ProjectRolePermissionVO extends RolePermissionBaseVO implements ProjectRolePermission {
+
+    @Column(name = "project_id")
+    private long projectId;
+
+    @Column(name = "project_role_id")
+    private long projectRoleId;
+
+    @Column(name = "sort_order")
+    private long sortOrder = 0;
+
+    public ProjectRolePermissionVO() {
+        super();
+    }
+
+    public ProjectRolePermissionVO(final long projectId, final long projectRoleId, final String rule, final Permission permission, final String description) {
+        super(rule, permission, description);
+        this.projectId = projectId;
+        this.projectRoleId = projectRoleId;
+    }
+
+    @Override
+    public long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public void setProjectRoleId(long projectRoleId) {
+        this.projectRoleId = projectRoleId;
+    }
+
+    @Override
+    public long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(long projectId) {
+        this.projectId = projectId;
+    }
+
+    public long getSortOrder() {
+        return sortOrder;
+    }
+
+    public void setSortOrder(long sortOrder) {
+        this.sortOrder = sortOrder;
+    }
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRoleVO.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRoleVO.java
new file mode 100644
index 0000000..6ab2e7d
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/ProjectRoleVO.java
@@ -0,0 +1,100 @@
+// 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.acl;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "project_role")
+@SuppressWarnings("unused")
+public class ProjectRoleVO implements ProjectRole {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "project_id")
+    private Long projectId;
+
+    @Column(name = GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    public ProjectRoleVO() {
+        this.uuid = UUID.randomUUID().toString();
+    }
+
+    public ProjectRoleVO(final String name, final String description, final Long projectId) {
+        this();
+        this.name = name;
+        this.description = description;
+        this.projectId = projectId;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public Long getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(Long projectId) {
+        this.projectId = projectId;
+    }
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionBaseVO.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionBaseVO.java
new file mode 100644
index 0000000..f3347ab
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionBaseVO.java
@@ -0,0 +1,96 @@
+// 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.acl;
+
+
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public class RolePermissionBaseVO implements RolePermissionEntity {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "rule")
+    private String rule;
+
+    @Column(name = "permission", nullable = false)
+    @Enumerated(value = EnumType.STRING)
+    private Permission permission = Permission.DENY;
+
+    @Column(name = "description")
+    private String description;
+
+    public RolePermissionBaseVO() { this.uuid = UUID.randomUUID().toString(); }
+
+    public RolePermissionBaseVO(final String rule, final Permission permission, final String description) {
+        this();
+        this.rule = rule;
+        this.permission = permission;
+        this.description = description;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public Rule getRule() {
+        return new Rule(rule);
+    }
+
+    public void setRule(String rule) {
+        this.rule = rule;
+    }
+
+    @Override
+    public Permission getPermission() {
+        return permission;
+    }
+
+    public void setPermission(Permission permission) {
+        this.permission = permission;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionVO.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionVO.java
index a81cebb..dc5ce20 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/RolePermissionVO.java
@@ -19,61 +19,23 @@
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
 import javax.persistence.Table;
-import java.util.UUID;
 
 @Entity
 @Table(name = "role_permissions")
-public class RolePermissionVO implements RolePermission {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "id")
-    private long id;
-
-    @Column(name = "uuid")
-    private String uuid;
+public class RolePermissionVO extends RolePermissionBaseVO implements RolePermission {
 
     @Column(name = "role_id")
     private long roleId;
 
-    @Column(name = "rule")
-    private String rule;
-
-    @Column(name = "permission", nullable = false)
-    @Enumerated(value = EnumType.STRING)
-    private Permission permission = RolePermission.Permission.DENY;
-
-    @Column(name = "description")
-    private String description;
-
     @Column(name = "sort_order")
     private long sortOrder = 0;
 
-    public RolePermissionVO() {
-        this.uuid = UUID.randomUUID().toString();
-    }
+    public RolePermissionVO() { super(); }
 
-    public RolePermissionVO(final long roleId, final String rule, final Permission permission, final String description) {
-        this();
+    public RolePermissionVO(final Long roleId, final String rule, final Permission permission, final String description) {
+        super(rule, permission, description);
         this.roleId = roleId;
-        this.rule = rule;
-        this.permission = permission;
-        this.description = description;
-    }
-
-    @Override
-    public long getId() {
-        return id;
-    }
-
-    @Override
-    public String getUuid() {
-        return uuid;
     }
 
     public long getRoleId() {
@@ -84,32 +46,6 @@
         this.roleId = roleId;
     }
 
-    @Override
-    public Rule getRule() {
-        return new Rule(rule);
-    }
-
-    public void setRule(String rule) {
-        this.rule = rule;
-    }
-
-    @Override
-    public Permission getPermission() {
-        return permission;
-    }
-
-    public void setPermission(Permission permission) {
-        this.permission = permission;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
     public long getSortOrder() {
         return sortOrder;
     }
@@ -117,4 +53,5 @@
     public void setSortOrder(long sortOrder) {
         this.sortOrder = sortOrder;
     }
+
 }
\ No newline at end of file
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/RoleVO.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/RoleVO.java
index f3404ab..823dc69 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/RoleVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/RoleVO.java
@@ -51,6 +51,9 @@
     @Column(name = "description")
     private String description;
 
+    @Column(name = "is_default")
+    private boolean isDefault = false;
+
     @Column(name = GenericDao.REMOVED_COLUMN)
     private Date removed;
 
@@ -75,6 +78,10 @@
         return uuid;
     }
 
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
     @Override
     public long getId() {
         return id;
@@ -103,4 +110,8 @@
     public void setDescription(String description) {
         this.description = description;
     }
+
+    public boolean isDefault() {
+        return isDefault;
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDao.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDao.java
new file mode 100644
index 0000000..89f93f6
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDao.java
@@ -0,0 +1,29 @@
+// 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.acl.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.acl.ProjectRoleVO;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface ProjectRoleDao extends GenericDao<ProjectRoleVO, Long> {
+    List<ProjectRoleVO> findByName(String name, Long projectId);
+    List<ProjectRoleVO> findAllRoles(Long projectId);
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDaoImpl.java
new file mode 100644
index 0000000..b153826
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRoleDaoImpl.java
@@ -0,0 +1,61 @@
+// 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.acl.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.acl.ProjectRoleVO;
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.google.common.base.Strings;
+
+public class ProjectRoleDaoImpl extends GenericDaoBase<ProjectRoleVO, Long>  implements ProjectRoleDao{
+    private final SearchBuilder<ProjectRoleVO>  ProjectRoleSearch;
+
+    public ProjectRoleDaoImpl() {
+        super();
+
+        ProjectRoleSearch = createSearchBuilder();
+        ProjectRoleSearch.and("name", ProjectRoleSearch.entity().getName(), SearchCriteria.Op.LIKE);
+        ProjectRoleSearch.and("project_id", ProjectRoleSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
+        ProjectRoleSearch.done();
+
+    }
+    @Override
+    public List<ProjectRoleVO> findByName(String name, Long projectId) {
+        SearchCriteria<ProjectRoleVO> sc = ProjectRoleSearch.create();
+        if (!Strings.isNullOrEmpty(name)) {
+            sc.setParameters("name", "%" + name + "%");
+        }
+        if (projectId != null) {
+            sc.setParameters("project_id", projectId);
+        }
+        return listBy(sc);
+    }
+
+    @Override
+    public List<ProjectRoleVO> findAllRoles(Long projectId) {
+        SearchCriteria<ProjectRoleVO> sc = ProjectRoleSearch.create();
+        if (projectId != null) {
+            sc.setParameters("project_id", projectId);
+        }
+        return listBy(sc);
+    }
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDao.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDao.java
new file mode 100644
index 0000000..dd4b035
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDao.java
@@ -0,0 +1,34 @@
+// 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.acl.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.ProjectRolePermissionVO;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface ProjectRolePermissionsDao extends GenericDao<ProjectRolePermissionVO, Long> {
+    List<ProjectRolePermissionVO> findAllByRoleIdSorted(Long roleId, Long projectId);
+    boolean update(final ProjectRole role, final Long projectId, final List<ProjectRolePermission> newOrder);
+    boolean update(final ProjectRole role, ProjectRolePermission rolePermission, Permission permission);
+    ProjectRolePermissionVO persist(final ProjectRolePermissionVO projectRolePermissionVO);
+}
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDaoImpl.java
new file mode 100644
index 0000000..1eae8f3
--- /dev/null
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/ProjectRolePermissionsDaoImpl.java
@@ -0,0 +1,147 @@
+// 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.acl.dao;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.ProjectRolePermissionVO;
+import org.apache.log4j.Logger;
+
+import com.cloud.utils.db.Attribute;
+import com.cloud.utils.db.Filter;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+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.db.UpdateBuilder;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class ProjectRolePermissionsDaoImpl  extends GenericDaoBase<ProjectRolePermissionVO, Long>  implements  ProjectRolePermissionsDao{
+
+    private static final Logger LOGGER = Logger.getLogger(ProjectRolePermissionsDaoImpl.class);
+    private final SearchBuilder<ProjectRolePermissionVO> ProjectRolePermissionsSearch;
+    private Attribute sortOrderAttribute;
+
+    public ProjectRolePermissionsDaoImpl() {
+        super();
+
+        ProjectRolePermissionsSearch = createSearchBuilder();
+        ProjectRolePermissionsSearch.and("uuid", ProjectRolePermissionsSearch.entity().getUuid(), SearchCriteria.Op.EQ);
+        ProjectRolePermissionsSearch.and("projectRoleId", ProjectRolePermissionsSearch.entity().getProjectRoleId(), SearchCriteria.Op.EQ);
+        ProjectRolePermissionsSearch.and("projectId", ProjectRolePermissionsSearch.entity().getProjectId(), SearchCriteria.Op.EQ);
+        ProjectRolePermissionsSearch.and("sortOrder", ProjectRolePermissionsSearch.entity().getSortOrder(), SearchCriteria.Op.EQ);
+        ProjectRolePermissionsSearch.done();
+
+        sortOrderAttribute = _allAttributes.get("sortOrder");
+
+        assert (sortOrderAttribute != null) : "Couldn't find one of these attributes";
+    }
+
+    @Override
+    public List<ProjectRolePermissionVO> findAllByRoleIdSorted(Long roleId, Long projectId) {
+        final SearchCriteria<ProjectRolePermissionVO> sc = ProjectRolePermissionsSearch.create();
+        if (roleId != null && roleId > 0L) {
+            sc.setParameters("projectRoleId", roleId);
+        }
+        if (projectId != null && projectId > 0L) {
+            sc.setParameters("projectId", projectId);
+        }
+        final Filter searchBySorted = new Filter(ProjectRolePermissionVO.class, "sortOrder", true, null, null);
+        final List<ProjectRolePermissionVO> projectRolePermissionList = listBy(sc, searchBySorted);
+        if (projectRolePermissionList == null) {
+            return Collections.emptyList();
+        }
+        return projectRolePermissionList;
+    }
+
+    @Override
+    public boolean update(ProjectRole role, Long projectId, List<ProjectRolePermission> newOrder) {
+        if (role == null || newOrder == null || newOrder.isEmpty()) {
+            return false;
+        }
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                final String failMsg = "Project role's rule permissions list has changed while you were making updates, aborted re-ordering of rules. Please try again.";
+                final List<ProjectRolePermissionVO> currentOrder = findAllByRoleIdSorted(role.getId(), projectId);
+                if (role.getId() < 1L || newOrder.size() != currentOrder.size()) {
+                    throw new CloudRuntimeException(failMsg);
+                }
+                Set<Long> newOrderSet = new HashSet<>();
+                newOrderSet = newOrder.stream().map(perm -> perm.getId()).collect(Collectors.toSet());
+
+                Set<Long> currOrderSet = new HashSet<>();
+                currOrderSet = currentOrder.stream().map(perm -> perm.getId()).collect(Collectors.toSet());
+
+                long sortOrder = 0L;
+                if (!newOrderSet.equals(currOrderSet)) {
+                    throw new CloudRuntimeException(failMsg);
+                }
+                for (ProjectRolePermission projectRolePermission : newOrder) {
+                    final SearchCriteria<ProjectRolePermissionVO> sc = ProjectRolePermissionsSearch.create();
+                    sc.setParameters("uuid", projectRolePermission.getUuid());
+                    sc.setParameters("projectRoleId", role.getId());
+                    sc.setParameters("projectId", role.getProjectId());
+                    sc.setParameters("sortOrder", projectRolePermission.getSortOrder());
+
+                    final UpdateBuilder ub = getUpdateBuilder(projectRolePermission);
+                    ub.set(projectRolePermission, sortOrderAttribute, sortOrder);
+                    final int result = update(ub, sc, null);
+                    if (result < 1) {
+                        throw new CloudRuntimeException(failMsg);
+                    }
+                    sortOrder++;
+                }
+                return true;
+            }
+        });
+    }
+
+    @Override
+    public boolean update(ProjectRole role, ProjectRolePermission rolePermission, Permission permission) {
+        if (role == null || rolePermission == null || permission == null) {
+            return false;
+        }
+        ProjectRolePermissionVO projectRolePermissionVO = findById(rolePermission.getId());
+        if (projectRolePermissionVO == null) {
+            return false;
+        }
+        projectRolePermissionVO.setPermission(permission);
+        return update(rolePermission.getId(), projectRolePermissionVO);
+    }
+
+    @Override
+    public ProjectRolePermissionVO persist(final ProjectRolePermissionVO item) {
+        item.setSortOrder(0);
+        final List<ProjectRolePermissionVO> permissionsList = findAllByRoleIdSorted(item.getProjectRoleId(), item.getProjectId());
+        if (permissionsList != null && permissionsList.size() > 0) {
+            ProjectRolePermission lastRule = permissionsList.get(permissionsList.size() - 1);
+            item.setSortOrder(lastRule.getSortOrder() + 1);
+        }
+        return super.persist(item);
+    }
+}
\ No newline at end of file
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java
index 06c07ba..ec1051b 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDao.java
@@ -19,6 +19,7 @@
 
 import com.cloud.utils.Pair;
 import com.cloud.utils.db.GenericDao;
+
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.acl.RoleVO;
 
@@ -30,6 +31,8 @@
     Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long offset, Long limit);
 
     List<RoleVO> findAllByRoleType(RoleType type);
+    List<RoleVO> findByName(String roleName);
+    RoleVO findByNameAndType(String roleName, RoleType type);
 
     Pair<List<RoleVO>, Integer> findAllByRoleType(RoleType type, Long offset, Long limit);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java
index b220049..dda836a 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RoleDaoImpl.java
@@ -22,6 +22,7 @@
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
+
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.acl.RoleVO;
 import org.springframework.stereotype.Component;
@@ -32,6 +33,7 @@
 public class RoleDaoImpl extends GenericDaoBase<RoleVO, Long> implements RoleDao {
     private final SearchBuilder<RoleVO> RoleByNameSearch;
     private final SearchBuilder<RoleVO> RoleByTypeSearch;
+    private final SearchBuilder<RoleVO> RoleByNameAndTypeSearch;
 
     public RoleDaoImpl() {
         super();
@@ -43,6 +45,11 @@
         RoleByTypeSearch = createSearchBuilder();
         RoleByTypeSearch.and("roleType", RoleByTypeSearch.entity().getRoleType(), SearchCriteria.Op.EQ);
         RoleByTypeSearch.done();
+
+        RoleByNameAndTypeSearch = createSearchBuilder();
+        RoleByNameAndTypeSearch.and("roleName", RoleByNameAndTypeSearch.entity().getName(), SearchCriteria.Op.EQ);
+        RoleByNameAndTypeSearch.and("roleType", RoleByNameAndTypeSearch.entity().getRoleType(), SearchCriteria.Op.EQ);
+        RoleByNameAndTypeSearch.done();
     }
 
     @Override
@@ -67,4 +74,19 @@
         sc.setParameters("roleType", type);
         return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit));
     }
+
+    @Override
+    public List<RoleVO> findByName(String roleName) {
+        SearchCriteria<RoleVO> sc = RoleByNameSearch.create();
+        sc.setParameters("roleName", roleName);
+        return listBy(sc);
+    }
+
+    @Override
+    public RoleVO findByNameAndType(String roleName, RoleType type) {
+        SearchCriteria<RoleVO> sc = RoleByNameAndTypeSearch.create();
+        sc.setParameters("roleName", roleName);
+        sc.setParameters("roleType", type);
+        return findOneBy(sc);
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDao.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDao.java
index c9aeba1..d99f8d6 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDao.java
@@ -17,13 +17,14 @@
 
 package org.apache.cloudstack.acl.dao;
 
-import com.cloud.utils.db.GenericDao;
+import java.util.List;
+
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RolePermission;
-import org.apache.cloudstack.acl.RolePermission.Permission;
+import org.apache.cloudstack.acl.RolePermissionEntity;
 import org.apache.cloudstack.acl.RolePermissionVO;
 
-import java.util.List;
+import com.cloud.utils.db.GenericDao;
 
 public interface RolePermissionsDao extends GenericDao<RolePermissionVO, Long> {
     /**
@@ -48,7 +49,7 @@
      * @param permission permission
      * @return true on success, false if not
      */
-    boolean update(final Role role, final RolePermission rolePermission, final Permission permission);
+    boolean update(final Role role, final RolePermission rolePermission, final RolePermissionEntity.Permission permission);
 
     /**
      * Returns ordered linked-list of role permission for a given role
@@ -56,4 +57,12 @@
      * @return returns list of role permissions
      */
     List<RolePermissionVO> findAllByRoleIdSorted(Long roleId);
+
+    /**
+     * Returns role permission for a given role and rule
+     * @param roleId the ID of the role
+     * @param roleId rule for the role
+     * @return returns role permission
+     */
+    RolePermissionVO findByRoleIdAndRule(Long roleId, String rule);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java
index 68b6abf..b63dd50 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java
@@ -17,6 +17,19 @@
 
 package org.apache.cloudstack.acl.dao;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.cloudstack.acl.Role;
+import org.apache.cloudstack.acl.RolePermission;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.acl.RolePermissionVO;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
 import com.cloud.utils.db.Attribute;
 import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.GenericDaoBase;
@@ -27,29 +40,23 @@
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.UpdateBuilder;
 import com.cloud.utils.exception.CloudRuntimeException;
-import org.apache.cloudstack.acl.Role;
-import org.apache.cloudstack.acl.RolePermission;
-import org.apache.cloudstack.acl.RolePermission.Permission;
-import org.apache.cloudstack.acl.RolePermissionVO;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
 
 @Component
 public class RolePermissionsDaoImpl extends GenericDaoBase<RolePermissionVO, Long> implements RolePermissionsDao {
     protected static final Logger LOGGER = Logger.getLogger(RolePermissionsDaoImpl.class);
 
+    private final SearchBuilder<RolePermissionVO> RolePermissionsSearchByRoleAndRule;
     private final SearchBuilder<RolePermissionVO> RolePermissionsSearch;
     private Attribute sortOrderAttribute;
 
     public RolePermissionsDaoImpl() {
         super();
 
+        RolePermissionsSearchByRoleAndRule = createSearchBuilder();
+        RolePermissionsSearchByRoleAndRule.and("roleId", RolePermissionsSearchByRoleAndRule.entity().getRoleId(), SearchCriteria.Op.EQ);
+        RolePermissionsSearchByRoleAndRule.and("rule", RolePermissionsSearchByRoleAndRule.entity().getRule(), SearchCriteria.Op.EQ);
+        RolePermissionsSearchByRoleAndRule.done();
+
         RolePermissionsSearch = createSearchBuilder();
         RolePermissionsSearch.and("uuid", RolePermissionsSearch.entity().getUuid(), SearchCriteria.Op.EQ);
         RolePermissionsSearch.and("roleId", RolePermissionsSearch.entity().getRoleId(), SearchCriteria.Op.EQ);
@@ -174,4 +181,12 @@
         }
         return rolePermissionList;
     }
+
+    @Override
+    public RolePermissionVO findByRoleIdAndRule(final Long roleId, final String rule) {
+        final SearchCriteria<RolePermissionVO> sc = RolePermissionsSearchByRoleAndRule.create();
+        sc.setParameters("roleId", roleId);
+        sc.setParameters("rule", rule);
+        return findOneBy(sc);
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java b/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java
index 8a4ee36..0d4ea14 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java
@@ -19,13 +19,16 @@
 
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
+
 import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement;
 import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementVO;
 
 import java.util.List;
 
-public interface OutOfBandManagementDao extends GenericDao<OutOfBandManagementVO, Long>, StateDao<OutOfBandManagement.PowerState, OutOfBandManagement.PowerState.Event, OutOfBandManagement> {
+public interface OutOfBandManagementDao extends GenericDao<OutOfBandManagementVO, Long>,
+        StateDao<OutOfBandManagement.PowerState, OutOfBandManagement.PowerState.Event, OutOfBandManagement> {
     OutOfBandManagement findByHost(long hostId);
+    OutOfBandManagementVO findByHostAddress(String address);
     List<OutOfBandManagementVO> findAllByManagementServer(long serverId);
     void expireServerOwnership(long serverId);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java
index 3cdd28f..af16432 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java
@@ -87,6 +87,12 @@
     }
 
     @Override
+    public OutOfBandManagementVO findByHostAddress(String address) {
+        SearchCriteria<OutOfBandManagementVO> sc = HostSearch.create("address", address);
+        return findOneBy(sc);
+    }
+
+    @Override
     public List<OutOfBandManagementVO> findAllByManagementServer(long serverId) {
         SearchCriteria<OutOfBandManagementVO> sc = OutOfBandManagementOwnerSearch.create();
         sc.setParameters("server", serverId);
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDao.java b/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDao.java
index e201ae2..815f169 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDao.java
@@ -26,4 +26,5 @@
 public interface DiskOfferingDetailsDao extends GenericDao<DiskOfferingDetailVO, Long>, ResourceDetailsDao<DiskOfferingDetailVO> {
     List<Long> findDomainIds(final long resourceId);
     List<Long> findZoneIds(final long resourceId);
+    String getDetail(Long diskOfferingId, String key);
 }
\ No newline at end of file
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDaoImpl.java
index da0ec5b..5408f2d 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/resourcedetail/dao/DiskOfferingDetailsDaoImpl.java
@@ -56,4 +56,14 @@
         }
         return zoneIds;
     }
+
+    @Override
+    public String getDetail(Long diskOfferingId, String key) {
+        String detailValue = null;
+        DiskOfferingDetailVO diskOfferingDetail = findDetail(diskOfferingId, key);
+        if (diskOfferingDetail != null) {
+            detailValue = diskOfferingDetail.getValue();
+        }
+        return detailValue;
+    }
 }
\ No newline at end of file
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
index 1861b21..71609a9 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDao.java
@@ -29,7 +29,7 @@
 
     List<ImageStoreVO> findByProvider(String provider);
 
-    List<ImageStoreVO> findByScope(ZoneScope scope);
+    List<ImageStoreVO> findByZone(ZoneScope scope, Boolean readonly);
 
     List<ImageStoreVO> findRegionImageStores();
 
@@ -40,4 +40,6 @@
     List<ImageStoreVO> listImageStores();
 
     List<ImageStoreVO> listImageCacheStores();
+
+    List<ImageStoreVO> listStoresByZoneId(long zoneId);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
index 38124ea..44ae961 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java
@@ -77,9 +77,12 @@
     }
 
     @Override
-    public List<ImageStoreVO> findByScope(ZoneScope scope) {
+    public List<ImageStoreVO> findByZone(ZoneScope scope, Boolean readonly) {
         SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
         sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image);
+        if (readonly != null) {
+            sc.addAnd("readonly", SearchCriteria.Op.EQ, readonly);
+        }
         if (scope.getScopeId() != null) {
             SearchCriteria<ImageStoreVO> scc = createSearchCriteria();
             scc.addOr("scope", SearchCriteria.Op.EQ, ScopeType.REGION);
@@ -114,7 +117,6 @@
     public Integer countAllImageStores() {
         SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
         sc.addAnd("role", SearchCriteria.Op.EQ, DataStoreRole.Image);
-        sc.addAnd("removed", SearchCriteria.Op.NULL);
         return getCount(sc);
     }
 
@@ -132,4 +134,10 @@
         return listBy(sc);
     }
 
+    @Override
+    public List<ImageStoreVO> listStoresByZoneId(long zoneId) {
+        SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
+        sc.addAnd("dcId", SearchCriteria.Op.EQ, zoneId);
+        return listBy(sc);
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java
index 2c70677..d245827 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java
@@ -74,6 +74,9 @@
     @Enumerated(value = EnumType.STRING)
     private DataStoreRole role;
 
+    @Column(name = "readonly")
+    private boolean readonly = false;
+
     @Column(name = "parent")
     private String parent;
 
@@ -165,6 +168,14 @@
         return created;
     }
 
+    public void setReadonly(boolean readonly) {
+        this.readonly = readonly;
+    }
+
+    public boolean isReadonly() {
+        return readonly;
+    }
+
     public void setCreated(Date created) {
         this.created = created;
     }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
index 2398e91..3375c6f 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java
@@ -122,5 +122,12 @@
 
     List<StoragePoolVO> listLocalStoragePoolByPath(long datacenterId, String path);
 
+    List<StoragePoolVO> findPoolsInClusters(List<Long> clusterIds);
+
     void deletePoolTags(long poolId);
+
+    List<StoragePoolVO> listChildStoragePoolsInDatastoreCluster(long poolId);
+
+    Integer countAll();
+
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
index fee9dc2..dfe1a69 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
@@ -56,6 +56,7 @@
     private final SearchBuilder<StoragePoolVO> DeleteLvmSearch;
     private final SearchBuilder<StoragePoolVO> DcLocalStorageSearch;
     private final GenericSearchBuilder<StoragePoolVO, Long> StatusCountSearch;
+    private final SearchBuilder<StoragePoolVO> ClustersSearch;
 
     @Inject
     private StoragePoolDetailsDao _detailsDao;
@@ -132,6 +133,11 @@
         DcLocalStorageSearch.and("path", DcLocalStorageSearch.entity().getPath(), SearchCriteria.Op.EQ);
         DcLocalStorageSearch.and("scope", DcLocalStorageSearch.entity().getScope(), SearchCriteria.Op.EQ);
         DcLocalStorageSearch.done();
+
+        ClustersSearch = createSearchBuilder();
+        ClustersSearch.and("clusterIds", ClustersSearch.entity().getClusterId(), Op.IN);
+        ClustersSearch.and("status", ClustersSearch.entity().getStatus(), Op.EQ);
+
     }
 
     @Override
@@ -552,4 +558,27 @@
     public void deletePoolTags(long poolId) {
         _tagsDao.deleteTags(poolId);
     }
+
+    @Override
+    public List<StoragePoolVO> listChildStoragePoolsInDatastoreCluster(long poolId) {
+        QueryBuilder<StoragePoolVO> sc = QueryBuilder.create(StoragePoolVO.class);
+        sc.and(sc.entity().getParent(), Op.EQ, poolId);
+        return sc.list();
+    }
+
+    @Override
+    public Integer countAll() {
+        SearchCriteria<StoragePoolVO> sc = createSearchCriteria();
+        sc.addAnd("parent", SearchCriteria.Op.EQ, 0);
+        sc.addAnd("removed", SearchCriteria.Op.NULL);
+        return getCount(sc);
+    }
+
+    @Override
+    public List<StoragePoolVO> findPoolsInClusters(List<Long> clusterIds) {
+        SearchCriteria<StoragePoolVO> sc = ClustersSearch.create();
+        sc.setParameters("clusterIds", clusterIds.toArray());
+        sc.setParameters("status", StoragePoolStatus.Up);
+        return listBy(sc);
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
index 91ea07c..3263cbb 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.db;
 
+import java.util.Date;
 import java.util.List;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
@@ -42,6 +43,8 @@
 
     SnapshotDataStoreVO findBySnapshot(long snapshotId, DataStoreRole role);
 
+    SnapshotDataStoreVO findBySourceSnapshot(long snapshotId, DataStoreRole role);
+
     List<SnapshotDataStoreVO> listDestroyed(long storeId);
 
     List<SnapshotDataStoreVO> findBySnapshotId(long snapshotId);
@@ -72,5 +75,7 @@
 
     List<SnapshotDataStoreVO> listByState(ObjectInDataStoreStateMachine.State... states);
 
+    List<SnapshotDataStoreVO> findSnapshots(Long storeId, Date start, Date end);
+
     SnapshotDataStoreVO findDestroyedReferenceBySnapshot(long snapshotId, DataStoreRole role);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
index 75b1d75..f362169 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreVO.java
@@ -291,4 +291,8 @@
     public void setVolumeId(Long volumeId) {
         this.volumeId = volumeId;
     }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
index 24fcaa0..926b8a5 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java
@@ -119,6 +119,9 @@
     @Enumerated(value = EnumType.STRING)
     private HypervisorType hypervisor;
 
+    @Column(name = "parent")
+    private Long parent = 0L;
+
     @Override
     public long getId() {
         return id;
@@ -195,6 +198,10 @@
         return updateTime;
     }
 
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
     @Override
     public long getDataCenterId() {
         return dataCenterId;
@@ -373,6 +380,14 @@
         return !isShared();
     }
 
+    public Long getParent() {
+        return parent;
+    }
+
+    public void setParent(Long parent) {
+        this.parent = parent;
+    }
+
     @Override
     public boolean isInMaintenance() {
         return status == StoragePoolStatus.PrepareForMaintenance || status == StoragePoolStatus.Maintenance || status == StoragePoolStatus.ErrorInMaintenance ||
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
index a6e609e..77e88a9 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java
@@ -66,6 +66,8 @@
 
     List<TemplateDataStoreVO> listByTemplate(long templateId);
 
+    List<TemplateDataStoreVO> listByTemplateNotBypassed(long templateId);
+
     TemplateDataStoreVO findByTemplateZoneReady(long templateId, Long zoneId);
 
     void duplicateCacheRecordsOnRegionStore(long storeId);
@@ -89,4 +91,6 @@
     TemplateDataStoreVO getReadyBypassedTemplate(long templateId);
 
     boolean isTemplateMarkedForDirectDownload(long templateId);
+
+    List<TemplateDataStoreVO> listTemplateDownloadUrlsByStoreId(long storeId);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
index 024f056..8647e96 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java
@@ -402,4 +402,7 @@
         this.extractUrlCreated = extractUrlCreated;
     }
 
+    public void setCreated(Date created) {
+        this.created = created;
+    }
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
index fb98441..0e4e380 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java
@@ -53,4 +53,6 @@
     List<VolumeDataStoreVO> listByVolumeState(Volume.State... states);
 
     boolean updateVolumeId(long srcVolId, long destVolId);
+
+    List<VolumeDataStoreVO> listVolumeDownloadUrlsByZoneId(long zoneId);
 }
diff --git a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
index 68baab2..bb21abb 100644
--- a/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
+++ b/engine/schema/src/main/java/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreVO.java
@@ -381,4 +381,8 @@
     public void setExtractUrlCreated(Date extractUrlCreated) {
         this.extractUrlCreated = extractUrlCreated;
     }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
 }
diff --git a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
index 7faf85c..67b4010 100644
--- a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
+++ b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml
@@ -41,6 +41,8 @@
   <bean id="dedicatedResourceDaoImpl" class="com.cloud.dc.dao.DedicatedResourceDaoImpl" />
   <bean id="roleDaoImpl" class="org.apache.cloudstack.acl.dao.RoleDaoImpl" />
   <bean id="rolePermissionsDaoImpl" class="org.apache.cloudstack.acl.dao.RolePermissionsDaoImpl" />
+  <bean id="projectRoleDaoImpl" class="org.apache.cloudstack.acl.dao.ProjectRoleDaoImpl"/>
+  <bean id="projectRolePermissionsDaoImpl" class="org.apache.cloudstack.acl.dao.ProjectRolePermissionsDaoImpl" />
   <bean id="accountDaoImpl" class="com.cloud.user.dao.AccountDaoImpl" />
   <bean id="accountDetailsDaoImpl" class="com.cloud.user.AccountDetailsDaoImpl" />
   <bean id="accountJoinDaoImpl" class="com.cloud.api.query.dao.AccountJoinDaoImpl" />
@@ -291,6 +293,8 @@
   <bean id="backupDaoImpl" class="org.apache.cloudstack.backup.dao.BackupDaoImpl" />
   <bean id="directDownloadCertificateDaoImpl" class="org.apache.cloudstack.direct.download.DirectDownloadCertificateDaoImpl" />
   <bean id="directDownloadCertificateHostMapDaoImpl" class="org.apache.cloudstack.direct.download.DirectDownloadCertificateHostMapDaoImpl" />
-  <bean id="templateOVFPropertiesDaoImpl" class="com.cloud.storage.dao.TemplateOVFPropertiesDaoImpl" />
   <bean id="routerHealthCheckResultsDaoImpl" class="com.cloud.network.dao.RouterHealthCheckResultDaoImpl" />
+  <bean id="VsphereStoragePolicyDaoImpl" class="com.cloud.dc.dao.VsphereStoragePolicyDaoImpl" />
+  <bean id="TemplateDeployAsIsDetailsDaoImpl" class="com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDaoImpl" />
+  <bean id="UserVmDeployAsIsDetailsDaoImpl" class="com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDaoImpl" />
 </beans>
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41400to41500-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41400to41500-cleanup.sql
new file mode 100644
index 0000000..e9df02a
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41400to41500-cleanup.sql
@@ -0,0 +1,23 @@
+-- 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.14.0.0 to 4.15.0.0
+--;
+
+-- remove the old NetApp storage APIs (unsupported since 4.12) from role_permissions
+DELETE from `cloud`.`role_permissions` WHERE rule IN ('createPool', 'modifyPool', 'deletePool', 'listPools', 'associateLun', 'dissociateLun', 'createLunOnFiler', 'destroyLunOnFiler', 'listLunsOnFiler', 'createVolumeOnFiler', 'destroyVolumeOnFiler', 'listVolumesOnFiler');
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41400to41500.sql b/engine/schema/src/main/resources/META-INF/db/schema-41400to41500.sql
new file mode 100644
index 0000000..9ead785
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41400to41500.sql
@@ -0,0 +1,845 @@
+-- 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.14.0.0 to 4.15.0.0
+--;
+
+-- Project roles
+CREATE TABLE IF NOT EXISTS `cloud`.`project_role` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `uuid` varchar(255) UNIQUE,
+  `name` varchar(255) COMMENT 'unique name of the dynamic project role',
+  `removed` datetime COMMENT 'date removed',
+  `description` text COMMENT 'description of the project role',
+  `project_id` bigint(20) unsigned COMMENT 'Id of the project to which the role belongs',
+  PRIMARY KEY (`id`),
+  KEY `i_project_role__name` (`name`),
+  UNIQUE KEY (`name`, `project_id`),
+  CONSTRAINT `fk_project_role__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- Project role permissions table
+CREATE TABLE IF NOT EXISTS `cloud`.`project_role_permissions` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `uuid` varchar(255) UNIQUE,
+  `project_id` bigint(20) unsigned NOT NULL COMMENT 'id of the role',
+  `project_role_id` bigint(20) unsigned NOT NULL COMMENT 'id of the role',
+  `rule` varchar(255) NOT NULL COMMENT 'rule for the role, api name or wildcard',
+  `permission` varchar(255) NOT NULL COMMENT 'access authority, allow or deny',
+  `description` text COMMENT 'description of the rule',
+  `sort_order` bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT 'permission sort order',
+  PRIMARY KEY (`id`),
+  KEY `fk_project_role_permissions__project_role_id` (`project_role_id`),
+  KEY `i_project_role_permissions__sort_order` (`sort_order`),
+  UNIQUE KEY (`project_role_id`, `rule`),
+  CONSTRAINT `fk_project_role_permissions__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE,
+  CONSTRAINT `fk_project_role_permissions__project_role_id` FOREIGN KEY (`project_role_id`) REFERENCES `project_role` (`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- Alter project accounts table to include user_id and project_role_id for role based users in projects
+ALTER TABLE `cloud`.`project_account`
+ ADD COLUMN `user_id` bigint unsigned COMMENT 'ID of user to be added to the project' AFTER `account_id`,
+ ADD CONSTRAINT `fk_project_account__user_id` FOREIGN KEY `fk_project_account__user_id`(`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE,
+ ADD COLUMN `project_role_id` bigint unsigned COMMENT 'Project role id' AFTER `project_account_id`,
+ ADD CONSTRAINT `fk_project_account__project_role_id` FOREIGN KEY (`project_role_id`) REFERENCES `project_role` (`id`) ON DELETE SET NULL,
+ DROP FOREIGN KEY `fk_project_account__account_id`,
+ DROP INDEX `account_id`;
+
+ALTER TABLE `cloud`.`project_account`
+ ADD CONSTRAINT `fk_project_account__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE ,
+ ADD CONSTRAINT `uc_project_account__project_id_account_id_user_id` UNIQUE (`project_id`, `account_id`, `user_id`) ;
+
+-- Alter project invitations table to include user_id for invites sent to specific users of an account
+ALTER TABLE `cloud`.`project_invitations`
+    ADD COLUMN `user_id` bigint unsigned COMMENT 'ID of user to be added to the project' AFTER `account_id`,
+    ADD COLUMN `account_role` varchar(255) NOT NULL DEFAULT 'Regular' COMMENT 'Account role in the project (Owner or Regular)' AFTER `domain_id`,
+    ADD COLUMN `project_role_id` bigint unsigned COMMENT 'Project role id' AFTER `account_role`,
+    ADD CONSTRAINT `fk_project_invitations__user_id` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE,
+    ADD CONSTRAINT `fk_project_invitations__project_role_id` FOREIGN KEY (`project_role_id`) REFERENCES `project_role` (`id`) ON DELETE SET NULL,
+    DROP INDEX `project_id`,
+    ADD CONSTRAINT `uc_project_invitations__project_id_account_id_user_id` UNIQUE (`project_id`, `account_id`,`user_id`);
+
+-- Alter project_invitation_view to incorporate user_id as a field
+DROP VIEW IF EXISTS `cloud`.`project_invitation_view`;
+CREATE VIEW `cloud`.`project_invitation_view` AS
+    select
+        project_invitations.id,
+        project_invitations.uuid,
+        project_invitations.email,
+        project_invitations.created,
+        project_invitations.state,
+        project_invitations.project_role_id,
+        projects.id project_id,
+        projects.uuid project_uuid,
+        projects.name project_name,
+        account.id account_id,
+        account.uuid account_uuid,
+        account.account_name,
+        account.type account_type,
+        user.id user_id,
+        domain.id domain_id,
+        domain.uuid domain_uuid,
+        domain.name domain_name,
+        domain.path domain_path
+    from
+        `cloud`.`project_invitations`
+            left join
+        `cloud`.`account` ON project_invitations.account_id = account.id
+            left join
+        `cloud`.`domain` ON project_invitations.domain_id = domain.id
+            left join
+        `cloud`.`projects` ON projects.id = project_invitations.project_id
+            left join
+        `cloud`.`user` ON project_invitations.user_id = user.id;
+
+-- Alter project_account_view to incorporate user id
+DROP VIEW IF EXISTS `cloud`.`project_account_view`;
+CREATE VIEW `cloud`.`project_account_view` AS
+    select
+        project_account.id,
+        account.id account_id,
+        account.uuid account_uuid,
+        account.account_name,
+        account.type account_type,
+        user.id user_id,
+        user.uuid user_uuid,
+        user.username user_name,
+        project_account.account_role,
+        project_role.id project_role_id,
+        project_role.uuid project_role_uuid,
+        projects.id project_id,
+        projects.uuid project_uuid,
+        projects.name project_name,
+        domain.id domain_id,
+        domain.uuid domain_uuid,
+        domain.name domain_name,
+        domain.path domain_path
+    from
+        `cloud`.`project_account`
+            inner join
+        `cloud`.`account` ON project_account.account_id = account.id
+            inner join
+        `cloud`.`domain` ON account.domain_id = domain.id
+            inner join
+        `cloud`.`projects` ON projects.id = project_account.project_id
+            left join
+        `cloud`.`project_role` ON project_account.project_role_id = project_role.id
+            left join
+        `cloud`.`user` ON (project_account.user_id = user.id);
+
+-- Alter project_view to incorporate user id
+DROP VIEW IF EXISTS `cloud`.`project_view`;
+CREATE VIEW `cloud`.`project_view` AS
+    select
+        projects.id,
+        projects.uuid,
+        projects.name,
+        projects.display_text,
+        projects.state,
+        projects.removed,
+        projects.created,
+        projects.project_account_id,
+        account.account_name owner,
+        pacct.account_id,
+        pacct.user_id,
+        domain.id domain_id,
+        domain.uuid domain_uuid,
+        domain.name domain_name,
+        domain.path domain_path
+    from
+        `cloud`.`projects`
+            inner join
+        `cloud`.`domain` ON projects.domain_id = domain.id
+            inner join
+        `cloud`.`project_account` ON projects.id = project_account.project_id
+            and project_account.account_role = 'Admin'
+            inner join
+        `cloud`.`account` ON account.id = project_account.account_id
+            left join
+        `cloud`.`project_account` pacct ON projects.id = pacct.project_id;
+
+-- Fix Debian 10 32-bit hypervisor mappings on VMware, debian10-32bit OS ID in guest_os table is 292, not 282
+UPDATE `cloud`.`guest_os_hypervisor` SET guest_os_id=292 WHERE guest_os_id=282 AND hypervisor_type="VMware" AND guest_os_name="debian10Guest";
+-- Fix CentOS 32-bit mapping for VMware 5.5 which does not have a centos6Guest but only centosGuest and centos64Guest
+UPDATE `cloud`.`guest_os_hypervisor` SET guest_os_name='centosGuest' where hypervisor_type="VMware" and hypervisor_version="5.5" and guest_os_name="centos6Guest";
+
+ALTER TABLE `cloud`.`roles` ADD COLUMN `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'is this a default role';
+UPDATE `cloud`.`roles` SET `is_default` = 1 WHERE id IN (1, 2, 3, 4);
+
+-- Updated Default CloudStack roles with read-only and support admin and user roles
+INSERT INTO `cloud`.`roles` (`uuid`, `name`, `role_type`, `description`, `is_default`) VALUES (UUID(), 'Read-Only Admin - Default', 'Admin', 'Default read-only admin role', 1);
+INSERT INTO `cloud`.`roles` (`uuid`, `name`, `role_type`, `description`, `is_default`) VALUES (UUID(), 'Read-Only User - Default', 'User', 'Default read-only user role', 1);
+INSERT INTO `cloud`.`roles` (`uuid`, `name`, `role_type`, `description`, `is_default`) VALUES (UUID(), 'Support Admin - Default', 'Admin', 'Default support admin role', 1);
+INSERT INTO `cloud`.`roles` (`uuid`, `name`, `role_type`, `description`, `is_default`) VALUES (UUID(), 'Support User - Default', 'User', 'Default support user role', 1);
+
+-- mysql8 nics table fix for newer distributions
+ALTER TABLE `cloud`.`nics` MODIFY COLUMN update_time timestamp DEFAULT CURRENT_TIMESTAMP;
+
+-- Change guest OS name to support default CentOS 5 template in XenServer8.0
+UPDATE `cloud`.`guest_os_hypervisor` SET guest_os_name='CentOS 7' where guest_os_id=(SELECT guest_os_id from `cloud`.`vm_template` WHERE unique_name='centos56-x86_64-xen') AND hypervisor_type='Xenserver' AND hypervisor_version='8.0.0';
+
+-- Add XenServer 8.1 hypervisor capabilities
+INSERT INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, max_hosts_per_cluster, storage_motion_supported) values (UUID(), 'XenServer', '8.1.0', 1000, 253, 64, 1);
+
+-- Copy XenServer 8.0 hypervisor guest OS mappings to XenServer8.1
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', '8.1.0', guest_os_name, guest_os_id, now(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='8.0.0';
+
+CREATE TABLE IF NOT EXISTS `cloud`.`vsphere_storage_policy` (
+  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+  `uuid` varchar(255) UNIQUE,
+  `zone_id` bigint(20) unsigned NOT NULL COMMENT 'id of the zone',
+  `policy_id` varchar(255) NOT NULL COMMENT 'the identifier of the Storage Policy in vSphere DataCenter',
+  `name` varchar(255) NOT NULL COMMENT 'name of the storage policy',
+  `description` text COMMENT 'description of the storage policy',
+  `update_time` datetime COMMENT 'last updated when policy imported',
+  `removed` datetime COMMENT 'date removed',
+  PRIMARY KEY (`id`),
+  KEY `fk_vsphere_storage_policy__zone_id` (`zone_id`),
+  UNIQUE KEY (`zone_id`, `policy_id`),
+  CONSTRAINT `fk_vsphere_storage_policy__zone_id` FOREIGN KEY (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+ALTER TABLE `cloud`.`storage_pool` ADD COLUMN `parent` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT 'ID of the Datastore cluster (storage pool) if this is a child in that Datastore cluster';
+
+-- Added parent column to support datastore clusters in vmware vsphere
+DROP VIEW IF EXISTS `cloud`.`storage_pool_view`;
+CREATE VIEW `cloud`.`storage_pool_view` AS
+    SELECT
+        `storage_pool`.`id` AS `id`,
+        `storage_pool`.`uuid` AS `uuid`,
+        `storage_pool`.`name` AS `name`,
+        `storage_pool`.`status` AS `status`,
+        `storage_pool`.`path` AS `path`,
+        `storage_pool`.`pool_type` AS `pool_type`,
+        `storage_pool`.`host_address` AS `host_address`,
+        `storage_pool`.`created` AS `created`,
+        `storage_pool`.`removed` AS `removed`,
+        `storage_pool`.`capacity_bytes` AS `capacity_bytes`,
+        `storage_pool`.`capacity_iops` AS `capacity_iops`,
+        `storage_pool`.`scope` AS `scope`,
+        `storage_pool`.`hypervisor` AS `hypervisor`,
+        `storage_pool`.`storage_provider_name` AS `storage_provider_name`,
+        `storage_pool`.`parent` AS `parent`,
+        `cluster`.`id` AS `cluster_id`,
+        `cluster`.`uuid` AS `cluster_uuid`,
+        `cluster`.`name` AS `cluster_name`,
+        `cluster`.`cluster_type` AS `cluster_type`,
+        `data_center`.`id` AS `data_center_id`,
+        `data_center`.`uuid` AS `data_center_uuid`,
+        `data_center`.`name` AS `data_center_name`,
+        `data_center`.`networktype` AS `data_center_type`,
+        `host_pod_ref`.`id` AS `pod_id`,
+        `host_pod_ref`.`uuid` AS `pod_uuid`,
+        `host_pod_ref`.`name` AS `pod_name`,
+        `storage_pool_tags`.`tag` AS `tag`,
+        `op_host_capacity`.`used_capacity` AS `disk_used_capacity`,
+        `op_host_capacity`.`reserved_capacity` AS `disk_reserved_capacity`,
+        `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
+        ((((((`storage_pool`
+        LEFT JOIN `cluster` ON ((`storage_pool`.`cluster_id` = `cluster`.`id`)))
+        LEFT JOIN `data_center` ON ((`storage_pool`.`data_center_id` = `data_center`.`id`)))
+        LEFT JOIN `host_pod_ref` ON ((`storage_pool`.`pod_id` = `host_pod_ref`.`id`)))
+        LEFT JOIN `storage_pool_tags` ON (((`storage_pool_tags`.`pool_id` = `storage_pool`.`id`))))
+        LEFT JOIN `op_host_capacity` ON (((`storage_pool`.`id` = `op_host_capacity`.`host_id`)
+            AND (`op_host_capacity`.`capacity_type` IN (3 , 9)))))
+        LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `storage_pool`.`id`)
+            AND (`async_job`.`instance_type` = 'StoragePool')
+            AND (`async_job`.`job_status` = 0))));
+
+-- Add passthrough instruction for appliance deployments
+ALTER TABLE `cloud`.`vm_template` ADD COLUMN `deploy_as_is` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'True if the template should be deployed with disks and networks as defined by OVF';
+
+-- Changes to template_view for both deploying multidisk OVA/vApp as is
+DROP VIEW IF EXISTS `cloud`.`template_view`;
+CREATE VIEW `cloud`.`template_view` AS
+     SELECT
+         `vm_template`.`id` AS `id`,
+         `vm_template`.`uuid` AS `uuid`,
+         `vm_template`.`unique_name` AS `unique_name`,
+         `vm_template`.`name` AS `name`,
+         `vm_template`.`public` AS `public`,
+         `vm_template`.`featured` AS `featured`,
+         `vm_template`.`type` AS `type`,
+         `vm_template`.`hvm` AS `hvm`,
+         `vm_template`.`bits` AS `bits`,
+         `vm_template`.`url` AS `url`,
+         `vm_template`.`format` AS `format`,
+         `vm_template`.`created` AS `created`,
+         `vm_template`.`checksum` AS `checksum`,
+         `vm_template`.`display_text` AS `display_text`,
+         `vm_template`.`enable_password` AS `enable_password`,
+         `vm_template`.`dynamically_scalable` AS `dynamically_scalable`,
+         `vm_template`.`state` AS `template_state`,
+         `vm_template`.`guest_os_id` AS `guest_os_id`,
+         `guest_os`.`uuid` AS `guest_os_uuid`,
+         `guest_os`.`display_name` AS `guest_os_name`,
+         `vm_template`.`bootable` AS `bootable`,
+         `vm_template`.`prepopulate` AS `prepopulate`,
+         `vm_template`.`cross_zones` AS `cross_zones`,
+         `vm_template`.`hypervisor_type` AS `hypervisor_type`,
+         `vm_template`.`extractable` AS `extractable`,
+         `vm_template`.`template_tag` AS `template_tag`,
+         `vm_template`.`sort_key` AS `sort_key`,
+         `vm_template`.`removed` AS `removed`,
+         `vm_template`.`enable_sshkey` AS `enable_sshkey`,
+         `parent_template`.`id` AS `parent_template_id`,
+         `parent_template`.`uuid` AS `parent_template_uuid`,
+         `source_template`.`id` AS `source_template_id`,
+         `source_template`.`uuid` AS `source_template_uuid`,
+         `account`.`id` AS `account_id`,
+         `account`.`uuid` AS `account_uuid`,
+         `account`.`account_name` AS `account_name`,
+         `account`.`type` AS `account_type`,
+         `domain`.`id` AS `domain_id`,
+         `domain`.`uuid` AS `domain_uuid`,
+         `domain`.`name` AS `domain_name`,
+         `domain`.`path` AS `domain_path`,
+         `projects`.`id` AS `project_id`,
+         `projects`.`uuid` AS `project_uuid`,
+         `projects`.`name` AS `project_name`,
+         `data_center`.`id` AS `data_center_id`,
+         `data_center`.`uuid` AS `data_center_uuid`,
+         `data_center`.`name` AS `data_center_name`,
+         `launch_permission`.`account_id` AS `lp_account_id`,
+         `template_store_ref`.`store_id` AS `store_id`,
+         `image_store`.`scope` AS `store_scope`,
+         `template_store_ref`.`state` AS `state`,
+         `template_store_ref`.`download_state` AS `download_state`,
+         `template_store_ref`.`download_pct` AS `download_pct`,
+         `template_store_ref`.`error_str` AS `error_str`,
+         `template_store_ref`.`size` AS `size`,
+         `template_store_ref`.physical_size AS `physical_size`,
+         `template_store_ref`.`destroyed` AS `destroyed`,
+         `template_store_ref`.`created` AS `created_on_store`,
+         `vm_template_details`.`name` AS `detail_name`,
+         `vm_template_details`.`value` AS `detail_value`,
+         `resource_tags`.`id` AS `tag_id`,
+         `resource_tags`.`uuid` AS `tag_uuid`,
+         `resource_tags`.`key` AS `tag_key`,
+         `resource_tags`.`value` AS `tag_value`,
+         `resource_tags`.`domain_id` AS `tag_domain_id`,
+         `domain`.`uuid` AS `tag_domain_uuid`,
+         `domain`.`name` AS `tag_domain_name`,
+         `resource_tags`.`account_id` AS `tag_account_id`,
+         `account`.`account_name` AS `tag_account_name`,
+         `resource_tags`.`resource_id` AS `tag_resource_id`,
+         `resource_tags`.`resource_uuid` AS `tag_resource_uuid`,
+         `resource_tags`.`resource_type` AS `tag_resource_type`,
+         `resource_tags`.`customer` AS `tag_customer`,
+          CONCAT(`vm_template`.`id`,
+                 '_',
+                 IFNULL(`data_center`.`id`, 0)) AS `temp_zone_pair`,
+          `vm_template`.`direct_download` AS `direct_download`,
+          `vm_template`.`deploy_as_is` AS `deploy_as_is`
+     FROM
+         (((((((((((((`vm_template`
+         JOIN `guest_os` ON ((`guest_os`.`id` = `vm_template`.`guest_os_id`)))
+         JOIN `account` ON ((`account`.`id` = `vm_template`.`account_id`)))
+         JOIN `domain` ON ((`domain`.`id` = `account`.`domain_id`)))
+         LEFT JOIN `projects` ON ((`projects`.`project_account_id` = `account`.`id`)))
+         LEFT JOIN `vm_template_details` ON ((`vm_template_details`.`template_id` = `vm_template`.`id`)))
+         LEFT JOIN `vm_template` `source_template` ON ((`source_template`.`id` = `vm_template`.`source_template_id`)))
+         LEFT JOIN `template_store_ref` ON (((`template_store_ref`.`template_id` = `vm_template`.`id`)
+             AND (`template_store_ref`.`store_role` = 'Image')
+             AND (`template_store_ref`.`destroyed` = 0))))
+         LEFT JOIN `vm_template` `parent_template` ON ((`parent_template`.`id` = `vm_template`.`parent_template_id`)))
+         LEFT JOIN `image_store` ON ((ISNULL(`image_store`.`removed`)
+             AND (`template_store_ref`.`store_id` IS NOT NULL)
+             AND (`image_store`.`id` = `template_store_ref`.`store_id`))))
+         LEFT JOIN `template_zone_ref` ON (((`template_zone_ref`.`template_id` = `vm_template`.`id`)
+             AND ISNULL(`template_store_ref`.`store_id`)
+             AND ISNULL(`template_zone_ref`.`removed`))))
+         LEFT JOIN `data_center` ON (((`image_store`.`data_center_id` = `data_center`.`id`)
+             OR (`template_zone_ref`.`zone_id` = `data_center`.`id`))))
+         LEFT JOIN `launch_permission` ON ((`launch_permission`.`template_id` = `vm_template`.`id`)))
+         LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_template`.`id`)
+             AND ((`resource_tags`.`resource_type` = 'Template')
+             OR (`resource_tags`.`resource_type` = 'ISO')))));
+
+-- Add mincpu, maxcpu, minmemory and maxmemory to the view supporting constrained offerings
+DROP VIEW IF EXISTS `cloud`.`service_offering_view`;
+CREATE VIEW `cloud`.`service_offering_view` AS
+    SELECT
+        `service_offering`.`id` AS `id`,
+        `disk_offering`.`uuid` AS `uuid`,
+        `disk_offering`.`name` AS `name`,
+        `disk_offering`.`display_text` AS `display_text`,
+        `disk_offering`.`provisioning_type` AS `provisioning_type`,
+        `disk_offering`.`created` AS `created`,
+        `disk_offering`.`tags` AS `tags`,
+        `disk_offering`.`removed` AS `removed`,
+        `disk_offering`.`use_local_storage` AS `use_local_storage`,
+        `disk_offering`.`system_use` AS `system_use`,
+        `disk_offering`.`customized_iops` AS `customized_iops`,
+        `disk_offering`.`min_iops` AS `min_iops`,
+        `disk_offering`.`max_iops` AS `max_iops`,
+        `disk_offering`.`hv_ss_reserve` AS `hv_ss_reserve`,
+        `disk_offering`.`bytes_read_rate` AS `bytes_read_rate`,
+        `disk_offering`.`bytes_read_rate_max` AS `bytes_read_rate_max`,
+        `disk_offering`.`bytes_read_rate_max_length` AS `bytes_read_rate_max_length`,
+        `disk_offering`.`bytes_write_rate` AS `bytes_write_rate`,
+        `disk_offering`.`bytes_write_rate_max` AS `bytes_write_rate_max`,
+        `disk_offering`.`bytes_write_rate_max_length` AS `bytes_write_rate_max_length`,
+        `disk_offering`.`iops_read_rate` AS `iops_read_rate`,
+        `disk_offering`.`iops_read_rate_max` AS `iops_read_rate_max`,
+        `disk_offering`.`iops_read_rate_max_length` AS `iops_read_rate_max_length`,
+        `disk_offering`.`iops_write_rate` AS `iops_write_rate`,
+        `disk_offering`.`iops_write_rate_max` AS `iops_write_rate_max`,
+        `disk_offering`.`iops_write_rate_max_length` AS `iops_write_rate_max_length`,
+        `disk_offering`.`cache_mode` AS `cache_mode`,
+        `disk_offering`.`disk_size` AS `root_disk_size`,
+        `service_offering`.`cpu` AS `cpu`,
+        `service_offering`.`speed` AS `speed`,
+        `service_offering`.`ram_size` AS `ram_size`,
+        `service_offering`.`nw_rate` AS `nw_rate`,
+        `service_offering`.`mc_rate` AS `mc_rate`,
+        `service_offering`.`ha_enabled` AS `ha_enabled`,
+        `service_offering`.`limit_cpu_use` AS `limit_cpu_use`,
+        `service_offering`.`host_tag` AS `host_tag`,
+        `service_offering`.`default_use` AS `default_use`,
+        `service_offering`.`vm_type` AS `vm_type`,
+        `service_offering`.`sort_key` AS `sort_key`,
+        `service_offering`.`is_volatile` AS `is_volatile`,
+        `service_offering`.`deployment_planner` AS `deployment_planner`,
+        `vsphere_storage_policy`.`value` AS `vsphere_storage_policy`,
+        GROUP_CONCAT(DISTINCT(domain.id)) AS domain_id,
+        GROUP_CONCAT(DISTINCT(domain.uuid)) AS domain_uuid,
+        GROUP_CONCAT(DISTINCT(domain.name)) AS domain_name,
+        GROUP_CONCAT(DISTINCT(domain.path)) AS domain_path,
+        GROUP_CONCAT(DISTINCT(zone.id)) AS zone_id,
+        GROUP_CONCAT(DISTINCT(zone.uuid)) AS zone_uuid,
+        GROUP_CONCAT(DISTINCT(zone.name)) AS zone_name,
+        IFNULL(`min_compute_details`.`value`, `cpu`) AS min_cpu,
+        IFNULL(`max_compute_details`.`value`, `cpu`) AS max_cpu,
+        IFNULL(`min_memory_details`.`value`, `ram_size`) AS min_memory,
+        IFNULL(`max_memory_details`.`value`, `ram_size`) AS max_memory
+    FROM
+        `cloud`.`service_offering`
+            INNER JOIN
+        `cloud`.`disk_offering_view` AS `disk_offering` ON service_offering.id = disk_offering.id
+            LEFT JOIN
+        `cloud`.`service_offering_details` AS `domain_details` ON `domain_details`.`service_offering_id` = `disk_offering`.`id` AND `domain_details`.`name`='domainid'
+            LEFT JOIN
+        `cloud`.`domain` AS `domain` ON FIND_IN_SET(`domain`.`id`, `domain_details`.`value`)
+            LEFT JOIN
+        `cloud`.`service_offering_details` AS `zone_details` ON `zone_details`.`service_offering_id` = `disk_offering`.`id` AND `zone_details`.`name`='zoneid'
+            LEFT JOIN
+        `cloud`.`data_center` AS `zone` ON FIND_IN_SET(`zone`.`id`, `zone_details`.`value`)
+			LEFT JOIN
+		`cloud`.`service_offering_details` AS `min_compute_details` ON `min_compute_details`.`service_offering_id` = `disk_offering`.`id`
+				AND `min_compute_details`.`name` = 'mincpunumber'
+			LEFT JOIN
+		`cloud`.`service_offering_details` AS `max_compute_details` ON `max_compute_details`.`service_offering_id` = `disk_offering`.`id`
+				AND `max_compute_details`.`name` = 'maxcpunumber'
+			LEFT JOIN
+		`cloud`.`service_offering_details` AS `min_memory_details` ON `min_memory_details`.`service_offering_id` = `disk_offering`.`id`
+				AND `min_memory_details`.`name` = 'minmemory'
+			LEFT JOIN
+		`cloud`.`service_offering_details` AS `max_memory_details` ON `max_memory_details`.`service_offering_id` = `disk_offering`.`id`
+				AND `max_memory_details`.`name` = 'maxmemory'
+			LEFT JOIN
+		`cloud`.`service_offering_details` AS `vsphere_storage_policy` ON `vsphere_storage_policy`.`service_offering_id` = `disk_offering`.`id`
+				AND `vsphere_storage_policy`.`name` = 'storagepolicy'
+    WHERE
+        `disk_offering`.`state`='Active'
+    GROUP BY
+        `service_offering`.`id`;
+
+DROP VIEW IF EXISTS `cloud`.`disk_offering_view`;
+CREATE VIEW `cloud`.`disk_offering_view` AS
+    SELECT
+        `disk_offering`.`id` AS `id`,
+        `disk_offering`.`uuid` AS `uuid`,
+        `disk_offering`.`name` AS `name`,
+        `disk_offering`.`display_text` AS `display_text`,
+        `disk_offering`.`provisioning_type` AS `provisioning_type`,
+        `disk_offering`.`disk_size` AS `disk_size`,
+        `disk_offering`.`min_iops` AS `min_iops`,
+        `disk_offering`.`max_iops` AS `max_iops`,
+        `disk_offering`.`created` AS `created`,
+        `disk_offering`.`tags` AS `tags`,
+        `disk_offering`.`customized` AS `customized`,
+        `disk_offering`.`customized_iops` AS `customized_iops`,
+        `disk_offering`.`removed` AS `removed`,
+        `disk_offering`.`use_local_storage` AS `use_local_storage`,
+        `disk_offering`.`system_use` AS `system_use`,
+        `disk_offering`.`hv_ss_reserve` AS `hv_ss_reserve`,
+        `disk_offering`.`bytes_read_rate` AS `bytes_read_rate`,
+        `disk_offering`.`bytes_read_rate_max` AS `bytes_read_rate_max`,
+        `disk_offering`.`bytes_read_rate_max_length` AS `bytes_read_rate_max_length`,
+        `disk_offering`.`bytes_write_rate` AS `bytes_write_rate`,
+        `disk_offering`.`bytes_write_rate_max` AS `bytes_write_rate_max`,
+        `disk_offering`.`bytes_write_rate_max_length` AS `bytes_write_rate_max_length`,
+        `disk_offering`.`iops_read_rate` AS `iops_read_rate`,
+        `disk_offering`.`iops_read_rate_max` AS `iops_read_rate_max`,
+        `disk_offering`.`iops_read_rate_max_length` AS `iops_read_rate_max_length`,
+        `disk_offering`.`iops_write_rate` AS `iops_write_rate`,
+        `disk_offering`.`iops_write_rate_max` AS `iops_write_rate_max`,
+        `disk_offering`.`iops_write_rate_max_length` AS `iops_write_rate_max_length`,
+        `disk_offering`.`cache_mode` AS `cache_mode`,
+        `disk_offering`.`sort_key` AS `sort_key`,
+        `disk_offering`.`type` AS `type`,
+        `disk_offering`.`display_offering` AS `display_offering`,
+        `disk_offering`.`state` AS `state`,
+        `vsphere_storage_policy`.`value` AS `vsphere_storage_policy`,
+        GROUP_CONCAT(DISTINCT(domain.id)) AS domain_id,
+        GROUP_CONCAT(DISTINCT(domain.uuid)) AS domain_uuid,
+        GROUP_CONCAT(DISTINCT(domain.name)) AS domain_name,
+        GROUP_CONCAT(DISTINCT(domain.path)) AS domain_path,
+        GROUP_CONCAT(DISTINCT(zone.id)) AS zone_id,
+        GROUP_CONCAT(DISTINCT(zone.uuid)) AS zone_uuid,
+        GROUP_CONCAT(DISTINCT(zone.name)) AS zone_name
+    FROM
+        `cloud`.`disk_offering`
+            LEFT JOIN
+        `cloud`.`disk_offering_details` AS `domain_details` ON `domain_details`.`offering_id` = `disk_offering`.`id` AND `domain_details`.`name`='domainid'
+            LEFT JOIN
+        `cloud`.`domain` AS `domain` ON FIND_IN_SET(`domain`.`id`, `domain_details`.`value`)
+            LEFT JOIN
+        `cloud`.`disk_offering_details` AS `zone_details` ON `zone_details`.`offering_id` = `disk_offering`.`id` AND `zone_details`.`name`='zoneid'
+            LEFT JOIN
+        `cloud`.`data_center` AS `zone` ON FIND_IN_SET(`zone`.`id`, `zone_details`.`value`)
+			LEFT JOIN
+		`cloud`.`disk_offering_details` AS `vsphere_storage_policy` ON `vsphere_storage_policy`.`offering_id` = `disk_offering`.`id`
+				AND `vsphere_storage_policy`.`name` = 'storagepolicy'
+
+    WHERE
+        `disk_offering`.`state`='Active'
+    GROUP BY
+        `disk_offering`.`id`;
+
+ALTER TABLE `cloud`.`template_spool_ref`
+DROP FOREIGN KEY `fk_template_spool_ref__template_id`;
+
+ALTER TABLE `cloud`.`template_spool_ref`
+ADD COLUMN `deployment_option` VARCHAR(255) NULL DEFAULT NULL AFTER `updated`,
+ADD INDEX `fk_template_spool_ref__template_id_idx` (`template_id` ASC),
+ADD UNIQUE INDEX `index_template_spool_configuration` (`pool_id` ASC, `template_id` ASC, `deployment_option` ASC),
+DROP INDEX `i_template_spool_ref__template_id__pool_id` ;
+
+ALTER TABLE `cloud`.`template_spool_ref`
+ADD CONSTRAINT `fk_template_spool_ref__template_id`
+  FOREIGN KEY (`template_id`)
+  REFERENCES `cloud`.`vm_template` (`id`)
+  ON DELETE NO ACTION
+  ON UPDATE NO ACTION;
+
+CREATE TABLE `cloud`.`template_deploy_as_is_details` (
+  `id` bigint unsigned NOT NULL auto_increment,
+  `template_id` bigint unsigned NOT NULL COMMENT 'template id',
+  `name` varchar(255) NOT NULL,
+  `value` TEXT,
+  PRIMARY KEY (`id`),
+  CONSTRAINT `fk_template_deploy_as_is_details__template_id` FOREIGN KEY `fk_template_deploy_as_is_details__template_id`(`template_id`) REFERENCES `vm_template`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+CREATE TABLE `cloud`.`user_vm_deploy_as_is_details` (
+  `id` bigint unsigned NOT NULL auto_increment,
+  `vm_id` bigint unsigned NOT NULL COMMENT 'virtual machine id',
+  `name` varchar(255) NOT NULL,
+  `value` TEXT,
+  PRIMARY KEY (`id`),
+  CONSTRAINT `fk_user_vm_deploy_as_is_details__vm_id` FOREIGN KEY `fk_user_vm_deploy_as_is_details__vm_id`(`vm_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+ALTER TABLE `cloud`.`image_store` ADD COLUMN `readonly` boolean DEFAULT false COMMENT 'defines status of image store';
+
+DROP VIEW IF EXISTS `cloud`.`image_store_view`;
+CREATE VIEW `cloud`.`image_store_view` AS
+    select
+        image_store.id,
+        image_store.uuid,
+        image_store.name,
+        image_store.image_provider_name,
+        image_store.protocol,
+        image_store.url,
+        image_store.scope,
+        image_store.role,
+        image_store.readonly,
+        image_store.removed,
+        data_center.id data_center_id,
+        data_center.uuid data_center_uuid,
+        data_center.name data_center_name,
+        image_store_details.name detail_name,
+        image_store_details.value detail_value
+    from
+        `cloud`.`image_store`
+            left join
+        `cloud`.`data_center` ON image_store.data_center_id = data_center.id
+            left join
+        `cloud`.`image_store_details` ON image_store_details.store_id = image_store.id;
+
+-- OVF configured OS while registering deploy-as-is templates Linux 3.x Kernel OS
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (305, UUID(), 11, 'OVF Configured OS', now());
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (306, UUID(), 2, 'Linux 3.x Kernel (64 bit)', now());
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (307, UUID(), 2, 'Linux 3.x Kernel (32 bit)', now());
+
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'other3xLinux64Guest', 306, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'other3xLinux64Guest', 306, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7', 'other3xLinux64Guest', 306, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.1', 'other3xLinux64Guest', 306, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.2', 'other3xLinux64Guest', 306, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.3', 'other3xLinux64Guest', 306, now(), 0);
+
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'other3xLinuxGuest', 307, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'other3xLinuxGuest', 307, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7', 'other3xLinuxGuest', 307, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.1', 'other3xLinuxGuest', 307, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.2', 'other3xLinuxGuest', 307, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.7.3', 'other3xLinuxGuest', 307, now(), 0);
+
+
+-- Add amazonlinux as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (308, UUID(), 7, 'Amazon Linux 2 (64 bit)', now());
+-- Amazonlinux VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'amazonlinux2_64Guest', 308, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'amazonlinux2_64Guest', 308, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'amazonlinux2_64Guest', 308, now(), 0);
+
+
+-- Add asianux4 32 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (309, UUID(), 7, 'Asianux Server 4 (32 bit)', now());
+-- asianux4 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'asianux4Guest', 309, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux4Guest', 309, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux4Guest', 309, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux4Guest', 309, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux4Guest', 309, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux4Guest', 309, now(), 0);
+
+
+-- Add asianux4 64 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (310, UUID(), 7, 'Asianux Server 4 (64 bit)', now());
+-- asianux4 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'asianux4_64Guest', 310, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux4_64Guest', 310, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux4_64Guest', 310, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux4_64Guest', 310, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux4_64Guest', 310, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux4_64Guest', 310, now(), 0);
+
+
+-- Add asianux5 32 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (311, UUID(), 7, 'Asianux Server 5 (32 bit)', now());
+-- asianux5 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'asianux5Guest', 311, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux5Guest', 311, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux5Guest', 311, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux5Guest', 311, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux5Guest', 311, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux5Guest', 311, now(), 0);
+
+
+-- Add asianux5 64 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (312, UUID(), 7, 'Asianux Server 5 (64 bit)', now());
+-- asianux5 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'asianux5_64Guest', 312, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux5_64Guest', 312, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux5_64Guest', 312, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux5_64Guest', 312, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux5_64Guest', 312, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux5_64Guest', 312, now(), 0);
+
+
+-- Add asianux7 32 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (313, UUID(), 7, 'Asianux Server 7 (32 bit)', now());
+-- asianux7 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux7Guest', 313, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux7Guest', 313, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux7Guest', 313, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux7Guest', 313, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux7Guest', 313, now(), 0);
+
+
+-- Add asianux7 64 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (314, UUID(), 7, 'Asianux Server 7 (64 bit)', now());
+-- asianux7 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'asianux7_64Guest', 314, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux7_64Guest', 314, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux7_64Guest', 314, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux7_64Guest', 314, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux7_64Guest', 314, now(), 0);
+
+
+-- Add asianux8 as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (315, UUID(), 7, 'Asianux Server 8 (64 bit)', now());
+-- asianux8 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'asianux8_64Guest', 315, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'asianux8_64Guest', 315, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'asianux8_64Guest', 315, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'asianux8_64Guest', 315, now(), 0);
+
+
+-- Add eComStation 2.0   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (316, UUID(), 7, 'eComStation 2.0', now());
+-- eComStation 2.0 VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'eComStation2Guest', 316, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'eComStation2Guest', 316, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'eComStation2Guest', 316, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'eComStation2Guest', 316, now(), 0);
+
+-- Add macOS 10.13 (64 bit)  as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (317, UUID(), 7, 'macOS 10.13 (64 bit)', now());
+-- macOS 10.13 (64 bit)  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'darwin17_64Guest', 317, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'darwin17_64Guest', 317, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'darwin17_64Guest', 317, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'darwin17_64Guest', 317, now(), 0);
+
+-- Add macOS 10.14 (64 bit)  as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (318, UUID(), 7, 'macOS 10.14 (64 bit)', now());
+-- macOS 10.14 (64 bit) VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'darwin18_64Guest', 318, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'darwin18_64Guest', 318, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'darwin18_64Guest', 318, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'darwin18_64Guest', 318, now(), 0);
+
+
+-- Add Fedora Linux (64 bit)   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (319, UUID(), 7, 'Fedora Linux (64 bit)', now());
+-- Fedora Linux (64 bit)  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'fedora64Guest', 319, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'fedora64Guest', 319, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'fedora64Guest', 319, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'fedora64Guest', 319, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'fedora64Guest', 319, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'fedora64Guest', 319, now(), 0);
+
+
+-- Add Fedora Linux   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (320, UUID(), 7, 'Fedora Linux', now());
+-- Fedora Linux  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'fedoraGuest', 320, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'fedoraGuest', 320, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'fedoraGuest', 320, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'fedoraGuest', 320, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'fedoraGuest', 320, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'fedoraGuest', 320, now(), 0);
+
+-- Add Mandrake Linux   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (321, UUID(), 7, 'Mandrake Linux', now());
+-- Mandrake Linux  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'mandrakeGuest', 321, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'mandrakeGuest', 321, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'mandrakeGuest', 321, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'mandrakeGuest', 321, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'mandrakeGuest', 321, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'mandrakeGuest', 321, now(), 0);
+
+-- Add Mandriva Linux (64 bit)  as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (322, UUID(), 7, 'Mandriva Linux (64 bit)', now());
+-- Mandriva Linux (64 bit)  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'mandriva64Guest', 322, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'mandriva64Guest', 322, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'mandriva64Guest', 322, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'mandriva64Guest', 322, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'mandriva64Guest', 322, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'mandriva64Guest', 322, now(), 0);
+
+
+-- Add Mandriva Linux  as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (323, UUID(), 7, 'Mandriva Linux', now());
+-- Mandriva Linux  VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'mandrivaGuest', 323, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'mandrivaGuest', 323, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'mandrivaGuest', 323, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'mandrivaGuest', 323, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'mandrivaGuest', 323, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'mandrivaGuest', 323, now(), 0);
+
+
+-- Add SCO OpenServer 5   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (324, UUID(), 7, 'SCO OpenServer 5', now());
+-- SCO OpenServer 5   VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'openServer5Guest', 324, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'openServer5Guest', 324, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'openServer5Guest', 324, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'openServer5Guest', 324, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'openServer5Guest', 324, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'openServer5Guest', 324, now(), 0);
+
+
+-- Add SCO OpenServer 6   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (325, UUID(), 7, 'SCO OpenServer 6', now());
+-- SCO OpenServer 6   VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'openServer6Guest', 325, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'openServer6Guest', 325, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'openServer6Guest', 325, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'openServer6Guest', 325, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'openServer6Guest', 325, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'openServer6Guest', 325, now(), 0);
+
+
+
+-- Add OpenSUSE Linux (64 bit)    as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (326, UUID(), 7, 'OpenSUSE Linux (64 bit)', now());
+-- OpenSUSE Linux (64 bit)   VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'opensuse64Guest', 326, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'opensuse64Guest', 326, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'opensuse64Guest', 326, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'opensuse64Guest', 326, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'opensuse64Guest', 326, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'opensuse64Guest', 326, now(), 0);
+
+
+-- Add SCO OpenServer 6   as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (327, UUID(), 7, 'SCO OpenServer 6', now());
+-- SCO OpenServer 6   VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'opensuseGuest', 327, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'opensuseGuest', 327, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'opensuseGuest', 327, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'opensuseGuest', 327, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'opensuseGuest', 327, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'opensuseGuest', 327, now(), 0);
+
+
+-- Add Solaris 11 (64 bit)    as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (328, UUID(), 7, 'Solaris 11 (64 bit)', now());
+-- Solaris 11 (64 bit)    VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'solaris11_64Guest', 328, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'solaris11_64Guest', 328, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'solaris11_64Guest', 328, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'solaris11_64Guest', 328, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'solaris11_64Guest', 328, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'solaris11_64Guest', 328, now(), 0);
+
+-- Add  VMware Photon (64 bit)     as support guest os
+INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (329, UUID(), 7, 'VMware Photon (64 bit)', now());
+-- VMware Photon (64 bit)    VMWare guest os mapping
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.5', 'vmwarePhoton64Guest', 329, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7', 'vmwarePhoton64Guest', 329, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.1', 'vmwarePhoton64Guest', 329, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.2', 'vmwarePhoton64Guest', 329, now(), 0);
+INSERT INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.7.3', 'vmwarePhoton64Guest', 329, now(), 0);
+
+-- Fix OS category for Guest OS 'Other PV Virtio-SCSI (64-bit)'
+UPDATE `cloud`.`guest_os` SET category_id = 7 WHERE id = 275 AND display_name = 'Other PV Virtio-SCSI (64-bit)';
+
+-- Add flag 'hidden' in tables usage_ip_address and cloud_usage
+ALTER TABLE `cloud_usage`.`usage_ip_address` ADD COLUMN `is_hidden` smallint(1) NOT NULL DEFAULT '0' COMMENT 'is usage hidden';
+ALTER TABLE `cloud_usage`.`cloud_usage` ADD COLUMN `is_hidden` smallint(1) NOT NULL DEFAULT '0' COMMENT 'is usage hidden';
+
+-- Fix Zones are returned in a random order (#3934)
+UPDATE `cloud`.`data_center` JOIN (SELECT COUNT(1) AS count FROM `cloud`.`data_center` WHERE `sort_key` != 0) AS tbl_tmp SET `sort_key` = `id` WHERE count = 0;
+
+-- Fix description of volume.stats.interval which is in milliseconds not seconds
+UPDATE `cloud`.`configuration` SET `description` = 'Interval (in milliseconds) to report volume statistics' WHERE `name` = 'volume.stats.interval';
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41500to41510-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41500to41510-cleanup.sql
new file mode 100644
index 0000000..0939030
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41500to41510-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.0.0 to 4.15.1.0
+--;
+
diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41500to41510.sql b/engine/schema/src/main/resources/META-INF/db/schema-41500to41510.sql
new file mode 100644
index 0000000..caafde6
--- /dev/null
+++ b/engine/schema/src/main/resources/META-INF/db/schema-41500to41510.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 from 4.15.0.0 to 4.15.1.0
+--;
+
diff --git a/engine/service/pom.xml b/engine/service/pom.xml
index bc7b12a..7c7ecaa 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 99a320e..1f3f5f6 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
index 278c80d..40eeafe 100644
--- a/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
+++ b/engine/storage/cache/src/main/java/org/apache/cloudstack/storage/cache/manager/StorageCacheManagerImpl.java
@@ -291,7 +291,7 @@
 
                 if (st == ObjectInDataStoreStateMachine.State.Ready) {
                     s_logger.debug("there is already one in the cache store");
-                    DataObject dataObj = objectInStoreMgr.get(data, store);
+                    DataObject dataObj = objectInStoreMgr.get(data, store, null);
                     dataObj.incRefCount();
                     existingDataObj = dataObj;
                 }
diff --git a/engine/storage/configdrive/pom.xml b/engine/storage/configdrive/pom.xml
index 220e0c2..9570adc 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml
index f65701e..db4e53d 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 7c930fb..c49ffba 100644
--- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -356,37 +356,47 @@
             DataObject objOnImageStore = imageStore.create(srcData);
             objOnImageStore.processEvent(Event.CreateOnlyRequested);
 
-            Answer answer = copyObject(srcData, objOnImageStore);
-            if (answer == null || !answer.getResult()) {
-                if (answer != null) {
-                    s_logger.debug("copy to image store failed: " + answer.getDetails());
+            Answer answer = null;
+            try {
+                answer = copyObject(srcData, objOnImageStore);
+
+                if (answer == null || !answer.getResult()) {
+                    if (answer != null) {
+                        s_logger.debug("copy to image store failed: " + answer.getDetails());
+                    }
+                    objOnImageStore.processEvent(Event.OperationFailed);
+                    imageStore.delete(objOnImageStore);
+                    return answer;
                 }
-                objOnImageStore.processEvent(Event.OperationFailed);
-                imageStore.delete(objOnImageStore);
-                return answer;
-            }
 
-            objOnImageStore.processEvent(Event.OperationSuccessed, answer);
+                objOnImageStore.processEvent(Event.OperationSuccessed, answer);
 
-            objOnImageStore.processEvent(Event.CopyingRequested);
+                objOnImageStore.processEvent(Event.CopyingRequested);
 
-            CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value());
-            EndPoint ep = selector.select(objOnImageStore, destData);
-            if (ep == null) {
-                String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
-                s_logger.error(errMsg);
-                answer = new Answer(cmd, false, errMsg);
-            } else {
-                answer = ep.sendMessage(cmd);
-            }
-
-            if (answer == null || !answer.getResult()) {
-                if (answer != null) {
-                    s_logger.debug("copy to primary store failed: " + answer.getDetails());
+                CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value());
+                EndPoint ep = selector.select(objOnImageStore, destData);
+                if (ep == null) {
+                    String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+                    s_logger.error(errMsg);
+                    answer = new Answer(cmd, false, errMsg);
+                } else {
+                    answer = ep.sendMessage(cmd);
                 }
-                objOnImageStore.processEvent(Event.OperationFailed);
-                imageStore.delete(objOnImageStore);
-                return answer;
+
+                if (answer == null || !answer.getResult()) {
+                    if (answer != null) {
+                        s_logger.debug("copy to primary store failed: " + answer.getDetails());
+                    }
+                    objOnImageStore.processEvent(Event.OperationFailed);
+                    imageStore.delete(objOnImageStore);
+                    return answer;
+                }
+            } catch (Exception e) {
+                if (imageStore.exists(objOnImageStore)) {
+                    objOnImageStore.processEvent(Event.OperationFailed);
+                    imageStore.delete(objOnImageStore);
+                }
+                throw e;
             }
 
             objOnImageStore.processEvent(Event.OperationSuccessed);
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 c2724e6..ac6c855 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
@@ -25,12 +25,6 @@
 
 import javax.inject.Inject;
 
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.VolumeDao;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy;
@@ -39,9 +33,14 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.StorageStrategyFactory;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
 
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.host.Host;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.VolumeDao;
 import com.cloud.utils.StringUtils;
 import com.cloud.utils.exception.CloudRuntimeException;
 
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 e6b5c85..9718596 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
@@ -195,7 +195,7 @@
     @Override
     protected void copyTemplateToTargetFilesystemStorageIfNeeded(VolumeInfo srcVolumeInfo, StoragePool srcStoragePool, DataStore destDataStore, StoragePool destStoragePool,
             Host destHost) {
-        VMTemplateStoragePoolVO sourceVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(destStoragePool.getId(), srcVolumeInfo.getTemplateId());
+        VMTemplateStoragePoolVO sourceVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(destStoragePool.getId(), srcVolumeInfo.getTemplateId(), null);
         if (sourceVolumeTemplateStoragePoolVO == null && destStoragePool.getPoolType() == StoragePoolType.Filesystem) {
             DataStore sourceTemplateDataStore = dataStoreManagerImpl.getRandomImageStore(srcVolumeInfo.getDataCenterId());
             if (sourceTemplateDataStore != null) {
@@ -220,8 +220,8 @@
      *  Update the template reference on table "template_spool_ref" (VMTemplateStoragePoolVO).
      */
     protected void updateTemplateReferenceIfSuccessfulCopy(VolumeInfo srcVolumeInfo, StoragePool srcStoragePool, TemplateInfo destTemplateInfo, DataStore destDataStore) {
-        VMTemplateStoragePoolVO srcVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(srcStoragePool.getId(), srcVolumeInfo.getTemplateId());
-        VMTemplateStoragePoolVO destVolumeTemplateStoragePoolVO = new VMTemplateStoragePoolVO(destDataStore.getId(), srcVolumeInfo.getTemplateId());
+        VMTemplateStoragePoolVO srcVolumeTemplateStoragePoolVO = vmTemplatePoolDao.findByPoolTemplate(srcStoragePool.getId(), srcVolumeInfo.getTemplateId(), null);
+        VMTemplateStoragePoolVO destVolumeTemplateStoragePoolVO = new VMTemplateStoragePoolVO(destDataStore.getId(), srcVolumeInfo.getTemplateId(), null);
         destVolumeTemplateStoragePoolVO.setDownloadPercent(100);
         destVolumeTemplateStoragePoolVO.setDownloadState(VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
         destVolumeTemplateStoragePoolVO.setState(ObjectInDataStoreStateMachine.State.Ready);
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 4d3ec18..936f062 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
@@ -1710,7 +1710,7 @@
      * Return expected MigrationOptions for a linked clone volume live storage migration
      */
     protected MigrationOptions createLinkedCloneMigrationOptions(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, String srcVolumeBackingFile, String srcPoolUuid, Storage.StoragePoolType srcPoolType) {
-        VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(destVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId());
+        VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(destVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId(), null);
         boolean updateBackingFileReference = ref == null;
         String backingFile = ref != null ? ref.getInstallPath() : srcVolumeBackingFile;
         return new MigrationOptions(srcPoolUuid, srcPoolType, backingFile, updateBackingFileReference);
@@ -1983,7 +1983,7 @@
                 srcVolumeInfo.getTemplateId() != null && srcVolumeInfo.getPoolId() != null) {
             VMTemplateVO template = _vmTemplateDao.findById(srcVolumeInfo.getTemplateId());
             if (template.getFormat() != null && template.getFormat() != Storage.ImageFormat.ISO) {
-                VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(srcVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId());
+                VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(srcVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId(), null);
                 return ref != null ? ref.getInstallPath() : null;
             }
         }
@@ -2157,8 +2157,8 @@
      * Update reference on template_spool_ref table of copied template to destination storage
      */
     protected void updateCopiedTemplateReference(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo) {
-        VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(srcVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId());
-        VMTemplateStoragePoolVO newRef = new VMTemplateStoragePoolVO(destVolumeInfo.getPoolId(), ref.getTemplateId());
+        VMTemplateStoragePoolVO ref = templatePoolDao.findByPoolTemplate(srcVolumeInfo.getPoolId(), srcVolumeInfo.getTemplateId(), null);
+        VMTemplateStoragePoolVO newRef = new VMTemplateStoragePoolVO(destVolumeInfo.getPoolId(), ref.getTemplateId(), null);
         newRef.setDownloadPercent(100);
         newRef.setDownloadState(VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
         newRef.setState(ObjectInDataStoreStateMachine.State.Ready);
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 6971444..ba7fb74 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
@@ -19,6 +19,7 @@
 package org.apache.cloudstack.storage.motion;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.when;
 
@@ -301,7 +302,7 @@
     public void copyTemplateToTargetStorageIfNeededTestTemplateAlreadyOnTargetHost() throws AgentUnavailableException, OperationTimedoutException {
         Answer copyCommandAnswer = Mockito.mock(Answer.class);
         Mockito.lenient().when(copyCommandAnswer.getResult()).thenReturn(true);
-        configureAndTestcopyTemplateToTargetStorageIfNeeded(new VMTemplateStoragePoolVO(0l, 0l), StoragePoolType.Filesystem, 0);
+        configureAndTestcopyTemplateToTargetStorageIfNeeded(new VMTemplateStoragePoolVO(0l, 0l, null), StoragePoolType.Filesystem, 0);
     }
 
     @Test
@@ -316,7 +317,7 @@
             if (storagePoolTypeArray[i] == StoragePoolType.Filesystem) {
                 continue;
             }
-            configureAndTestcopyTemplateToTargetStorageIfNeeded(new VMTemplateStoragePoolVO(0l, 0l), storagePoolTypeArray[i], 0);
+            configureAndTestcopyTemplateToTargetStorageIfNeeded(new VMTemplateStoragePoolVO(0l, 0l, null), storagePoolTypeArray[i], 0);
         }
     }
 
@@ -353,7 +354,7 @@
         Mockito.when(sourceTemplateInfo.getSize()).thenReturn(0l);
         Mockito.when(sourceTemplateInfo.getHypervisorType()).thenReturn(HypervisorType.KVM);
 
-        Mockito.when(vmTemplatePoolDao.findByPoolTemplate(Mockito.anyLong(), Mockito.anyLong())).thenReturn(vmTemplateStoragePoolVO);
+        Mockito.when(vmTemplatePoolDao.findByPoolTemplate(Mockito.anyLong(), Mockito.anyLong(), nullable(String.class))).thenReturn(vmTemplateStoragePoolVO);
         Mockito.when(dataStoreManagerImpl.getRandomImageStore(Mockito.anyLong())).thenReturn(sourceTemplateDataStore);
         Mockito.when(templateDataFactory.getTemplate(Mockito.anyLong(), Mockito.eq(sourceTemplateDataStore))).thenReturn(sourceTemplateInfo);
         Mockito.when(templateDataFactory.getTemplate(Mockito.anyLong(), Mockito.eq(destDataStore))).thenReturn(sourceTemplateInfo);
@@ -362,7 +363,7 @@
                 Mockito.any(TemplateInfo.class), Mockito.any(DataStore.class));
 
         InOrder verifyInOrder = Mockito.inOrder(vmTemplatePoolDao, dataStoreManagerImpl, templateDataFactory, kvmNonManagedStorageDataMotionStrategy);
-        verifyInOrder.verify(vmTemplatePoolDao, Mockito.times(1)).findByPoolTemplate(Mockito.anyLong(), Mockito.anyLong());
+        verifyInOrder.verify(vmTemplatePoolDao, Mockito.times(1)).findByPoolTemplate(Mockito.anyLong(), Mockito.anyLong(), nullable(String.class));
         verifyInOrder.verify(dataStoreManagerImpl, Mockito.times(times)).getRandomImageStore(Mockito.anyLong());
         verifyInOrder.verify(templateDataFactory, Mockito.times(times)).getTemplate(Mockito.anyLong(), Mockito.eq(sourceTemplateDataStore));
         verifyInOrder.verify(templateDataFactory, Mockito.times(times)).getTemplate(Mockito.anyLong(), Mockito.eq(destDataStore));
diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml
index 23b41a8..979f181 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/SecondaryStorageServiceImpl.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/SecondaryStorageServiceImpl.java
new file mode 100644
index 0000000..523c240
--- /dev/null
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/SecondaryStorageServiceImpl.java
@@ -0,0 +1,242 @@
+// 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.image;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService;
+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.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.engine.subsystem.api.storage.SecondaryStorageService;
+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.AsyncCallFuture;
+import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.framework.async.AsyncRpcContext;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.secstorage.CommandExecLogDao;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.utils.Pair;
+
+public class SecondaryStorageServiceImpl implements SecondaryStorageService {
+
+    private static final Logger s_logger = Logger.getLogger(SecondaryStorageServiceImpl.class);
+
+    @Inject
+    DataMotionService motionSrv;
+    @Inject
+    CommandExecLogDao _cmdExecLogDao;
+    @Inject
+    TemplateDataStoreDao templateStoreDao;
+    @Inject
+    SnapshotDataStoreDao snapshotStoreDao;
+    @Inject
+    VolumeDataStoreDao volumeDataStoreDao;
+
+    private class MigrateDataContext<T> extends AsyncRpcContext<T> {
+        final DataObject srcData;
+        final DataObject destData;
+        final AsyncCallFuture<DataObjectResult> future;
+
+        /**
+         * @param callback
+         */
+        public MigrateDataContext(AsyncCompletionCallback<T> callback, AsyncCallFuture<DataObjectResult> future, DataObject srcData, DataObject destData, DataStore destStore) {
+            super(callback);
+            this.srcData = srcData;
+            this.destData = destData;
+            this.future = future;
+        }
+    }
+
+    @Override
+    public AsyncCallFuture<DataObjectResult> migrateData(DataObject srcDataObject, DataStore srcDatastore, DataStore destDatastore, Map<DataObject, Pair<List<SnapshotInfo>, Long>> snapshotChain) {
+        AsyncCallFuture<DataObjectResult> future = new AsyncCallFuture<DataObjectResult>();
+        DataObjectResult res = new DataObjectResult(srcDataObject);
+        DataObject destDataObject = null;
+        try {
+            if (srcDataObject instanceof SnapshotInfo && snapshotChain != null && snapshotChain.containsKey(srcDataObject)) {
+                List<String> parentSnapshotPaths = new ArrayList<>();
+                for (SnapshotInfo snapshotInfo : snapshotChain.get(srcDataObject).first()) {
+                    destDataObject = null;
+                    if (!parentSnapshotPaths.isEmpty() && parentSnapshotPaths.contains(snapshotInfo.getPath())) {
+                        parentSnapshotPaths.add(snapshotInfo.getPath());
+                        SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findByStoreSnapshot(DataStoreRole.Image, srcDatastore.getId(), snapshotInfo.getSnapshotId());
+                        if (snapshotStore == null) {
+                            res.setResult("Failed to find snapshot " + snapshotInfo.getUuid() + " on store: " + srcDatastore.getName());
+                            res.setSuccess(false);
+                            future.complete(res);
+                            break;
+                        }
+                        snapshotStore.setDataStoreId(destDatastore.getId());
+                        snapshotStoreDao.update(snapshotStore.getId(), snapshotStore);
+                        continue;
+                    }
+                    parentSnapshotPaths.add(snapshotInfo.getPath());
+                    destDataObject = destDatastore.create(snapshotInfo);
+                    snapshotInfo.processEvent(ObjectInDataStoreStateMachine.Event.MigrateDataRequested);
+                    destDataObject.processEvent(ObjectInDataStoreStateMachine.Event.MigrateDataRequested);
+                    migrateJob(future, snapshotInfo, destDataObject, destDatastore);
+                    if (future.get() != null && future.get().isFailed()) {
+                        break;
+                    }
+                }
+            } else {
+                // Check if template in destination store, if yes, do not proceed
+                if (srcDataObject instanceof TemplateInfo) {
+                    s_logger.debug("Checking if template present at destination");
+                    TemplateDataStoreVO templateStoreVO = templateStoreDao.findByStoreTemplate(destDatastore.getId(), srcDataObject.getId());
+                    if (templateStoreVO != null) {
+                        String msg = "Template already exists in destination store";
+                        s_logger.debug(msg);
+                        res.setResult(msg);
+                        res.setSuccess(true);
+                        future.complete(res);
+                        return future;
+                    }
+                }
+                destDataObject = destDatastore.create(srcDataObject);
+                srcDataObject.processEvent(ObjectInDataStoreStateMachine.Event.MigrateDataRequested);
+                destDataObject.processEvent(ObjectInDataStoreStateMachine.Event.MigrateDataRequested);
+                migrateJob(future, srcDataObject, destDataObject, destDatastore);
+            }
+        } catch (Exception e) {
+            s_logger.debug("Failed to copy Data", e);
+            if (destDataObject != null) {
+                s_logger.info("Deleting data on destination store: " + destDataObject.getDataStore().getName());
+                destDataObject.getDataStore().delete(destDataObject);
+            }
+            if (!(srcDataObject instanceof VolumeInfo)) {
+                srcDataObject.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
+            } else {
+                ((VolumeInfo) srcDataObject).processEventOnly(ObjectInDataStoreStateMachine.Event.OperationFailed);
+            }
+            res.setResult(e.toString());
+            future.complete(res);
+        }
+        return future;
+    }
+
+    protected void migrateJob(AsyncCallFuture<DataObjectResult> future, DataObject srcDataObject, DataObject destDataObject, DataStore destDatastore) throws ExecutionException, InterruptedException {
+        MigrateDataContext<DataObjectResult> context = new MigrateDataContext<DataObjectResult>(null, future, srcDataObject, destDataObject, destDatastore);
+        AsyncCallbackDispatcher<SecondaryStorageServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
+        caller.setCallback(caller.getTarget().migrateDataCallBack(null, null)).setContext(context);
+        motionSrv.copyAsync(srcDataObject, destDataObject, caller);
+    }
+
+    /**
+     * Callback function to handle state change of source and destination data objects based on the success or failure of the migrate task
+     */
+    protected Void migrateDataCallBack(AsyncCallbackDispatcher<SecondaryStorageServiceImpl, CopyCommandResult> callback, MigrateDataContext<DataObjectResult> context) throws ExecutionException, InterruptedException {
+        DataObject srcData = context.srcData;
+        DataObject destData = context.destData;
+        CopyCommandResult result = callback.getResult();
+        AsyncCallFuture<DataObjectResult> future = context.future;
+        DataObjectResult res = new DataObjectResult(srcData);
+        Answer answer = result.getAnswer();
+        try {
+            if (!answer.getResult()) {
+                s_logger.warn("Migration failed for "+srcData.getUuid());
+                res.setResult(result.getResult());
+                if (!(srcData instanceof VolumeInfo) ) {
+                    srcData.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
+                    destData.processEvent(ObjectInDataStoreStateMachine.Event.MigrationFailed);
+                    destData.processEvent(ObjectInDataStoreStateMachine.Event.DestroyRequested);
+                } else {
+                    ((VolumeInfo)srcData).processEventOnly(ObjectInDataStoreStateMachine.Event.OperationFailed);
+                    ((VolumeInfo)destData).processEventOnly(ObjectInDataStoreStateMachine.Event.MigrationFailed);
+                    ((VolumeInfo)destData).processEventOnly(ObjectInDataStoreStateMachine.Event.DestroyRequested);
+                }
+
+                if (destData != null) {
+                    destData.getDataStore().delete(destData);
+                }
+            } else {
+                if (destData instanceof  VolumeInfo) {
+                    ((VolumeInfo) destData).processEventOnly(ObjectInDataStoreStateMachine.Event.OperationSuccessed, answer);
+                } else {
+                    destData.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed, answer);
+                }
+                updateDataObject(srcData, destData);
+                s_logger.debug("Deleting source data");
+                srcData.getDataStore().delete(srcData);
+                s_logger.debug("Successfully migrated "+srcData.getUuid());
+            }
+            _cmdExecLogDao.expunge(Long.parseLong(answer.getContextParam("cmd")));
+            future.complete(res);
+        } catch (Exception e) {
+            s_logger.error("Failed to process migrate data callback", e);
+            res.setResult(e.toString());
+            _cmdExecLogDao.expunge(Long.parseLong(answer.getContextParam("cmd")));
+            future.complete(res);
+        }
+        return null;
+    }
+
+    private void updateDataObject(DataObject srcData, DataObject destData) {
+        if (destData instanceof SnapshotInfo) {
+            SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySourceSnapshot(srcData.getId(), DataStoreRole.Image);
+            SnapshotDataStoreVO destSnapshotStore = snapshotStoreDao.findBySnapshot(srcData.getId(), DataStoreRole.Image);
+            if (snapshotStore != null && destSnapshotStore != null) {
+                destSnapshotStore.setPhysicalSize(snapshotStore.getPhysicalSize());
+                destSnapshotStore.setCreated(snapshotStore.getCreated());
+                if (snapshotStore.getParentSnapshotId() != destSnapshotStore.getParentSnapshotId()) {
+                    destSnapshotStore.setParentSnapshotId(snapshotStore.getParentSnapshotId());
+                }
+                snapshotStoreDao.update(destSnapshotStore.getId(), destSnapshotStore);
+            }
+        } else if (destData instanceof VolumeInfo) {
+            VolumeDataStoreVO srcVolume = volumeDataStoreDao.findByStoreVolume(srcData.getDataStore().getId(), srcData.getId());
+            VolumeDataStoreVO destVolume = volumeDataStoreDao.findByStoreVolume(destData.getDataStore().getId(), destData.getId());
+            if (srcVolume != null && destVolume != null) {
+                destVolume.setPhysicalSize(srcVolume.getPhysicalSize());
+                destVolume.setCreated(srcVolume.getCreated());
+                volumeDataStoreDao.update(destVolume.getId(), destVolume);
+            }
+        } else if (destData instanceof TemplateInfo) {
+            TemplateDataStoreVO srcTemplate = templateStoreDao.findByStoreTemplate(srcData.getDataStore().getId(), srcData.getId());
+            TemplateDataStoreVO destTemplate = templateStoreDao.findByStoreTemplate(destData.getDataStore().getId(), destData.getId());
+            if (srcTemplate != null && destTemplate != null) {
+                destTemplate.setCreated(srcTemplate.getCreated());
+                templateStoreDao.update(destTemplate.getId(), destTemplate);
+            }
+        } else {
+            s_logger.debug("Unsupported data object type");
+        }
+    }
+}
+
+
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 8343a74..1590fe0 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
@@ -18,21 +18,20 @@
  */
 package org.apache.cloudstack.storage.image;
 
-import com.cloud.host.HostVO;
-import com.cloud.host.dao.HostDao;
 import java.util.ArrayList;
 import java.util.List;
 
 import javax.inject.Inject;
 
 import com.cloud.hypervisor.Hypervisor;
+import com.cloud.utils.StringUtils;
 import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.cloudstack.direct.download.DirectDownloadManager;
 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.DataStoreManager;
 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.DataStoreManager;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
@@ -41,6 +40,8 @@
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateVO;
@@ -66,16 +67,29 @@
     PrimaryDataStoreDao primaryDataStoreDao;
 
     @Override
+    public TemplateInfo getTemplateOnPrimaryStorage(long templateId, DataStore store, String configuration) {
+        VMTemplateVO templ = imageDataDao.findById(templateId);
+        if (store.getRole() == DataStoreRole.Primary) {
+            VMTemplateStoragePoolVO templatePoolVO = templatePoolDao.findByPoolTemplate(store.getId(), templateId, configuration);
+            if (templatePoolVO != null) {
+                String deployAsIsConfiguration = templatePoolVO.getDeploymentOption();
+                return TemplateObject.getTemplate(templ, store, deployAsIsConfiguration);
+            }
+        }
+        return null;
+    }
+
+    @Override
     public TemplateInfo getTemplate(long templateId, DataStore store) {
         VMTemplateVO templ = imageDataDao.findById(templateId);
         if (store == null && !templ.isDirectDownload()) {
-            TemplateObject tmpl = TemplateObject.getTemplate(templ, null);
+            TemplateObject tmpl = TemplateObject.getTemplate(templ, null, null);
             return tmpl;
         }
         // verify if the given input parameters are consistent with our db data.
         boolean found = false;
         if (store.getRole() == DataStoreRole.Primary) {
-            VMTemplateStoragePoolVO templatePoolVO = templatePoolDao.findByPoolTemplate(store.getId(), templateId);
+            VMTemplateStoragePoolVO templatePoolVO = templatePoolDao.findByPoolTemplate(store.getId(), templateId, null);
             if (templatePoolVO != null) {
                 found = true;
             }
@@ -94,7 +108,7 @@
             }
         }
 
-        TemplateObject tmpl = TemplateObject.getTemplate(templ, store);
+        TemplateObject tmpl = TemplateObject.getTemplate(templ, store, null);
         return tmpl;
     }
 
@@ -130,8 +144,13 @@
     }
 
     @Override
-    public TemplateInfo getTemplate(DataObject obj, DataStore store) {
-        TemplateObject tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store);
+    public TemplateInfo getTemplate(DataObject obj, DataStore store, String configuration) {
+        TemplateObject tmpObj;
+        if (StringUtils.isNotBlank(configuration)) {
+            tmpObj = (TemplateObject)this.getTemplateOnPrimaryStorage(obj.getId(), store, configuration);
+        } else {
+            tmpObj = (TemplateObject)this.getTemplate(obj.getId(), store);
+        }
         // carry over url set in passed in data object, for copyTemplate case
         // where url is generated on demand and not persisted in DB.
         // need to think of a more generic way to pass these runtime information
@@ -217,7 +236,7 @@
         if (pool == null) {
             throw new CloudRuntimeException("No storage pool found where to download template: " + templateId);
         }
-        VMTemplateStoragePoolVO spoolRef = templatePoolDao.findByPoolTemplate(pool, templateId);
+        VMTemplateStoragePoolVO spoolRef = templatePoolDao.findByPoolTemplate(pool, templateId, null);
         if (spoolRef == null) {
             directDownloadManager.downloadTemplate(templateId, pool, hostId);
         }
@@ -230,5 +249,4 @@
         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 edf8244..ed9359d 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
@@ -204,7 +204,7 @@
             // clean up already persisted template_store_ref entry in case of createTemplateCallback is never called
             TemplateDataStoreVO templateStoreVO = _vmTemplateStoreDao.findByStoreTemplate(store.getId(), template.getId());
             if (templateStoreVO != null) {
-                TemplateInfo tmplObj = _templateFactory.getTemplate(template, store);
+                TemplateInfo tmplObj = _templateFactory.getTemplate(template, store, null);
                 tmplObj.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
             }
             TemplateApiResult result = new TemplateApiResult(template);
@@ -253,7 +253,7 @@
     @Override
     public void handleSysTemplateDownload(HypervisorType hostHyper, Long dcId) {
         Set<VMTemplateVO> toBeDownloaded = new HashSet<VMTemplateVO>();
-        List<DataStore> stores = _storeMgr.getImageStoresByScope(new ZoneScope(dcId));
+        List<DataStore> stores = _storeMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(dcId));
         if (stores == null || stores.isEmpty()) {
             return;
         }
@@ -412,7 +412,7 @@
                                         VirtualMachineTemplate.Event event = VirtualMachineTemplate.Event.OperationSucceeded;
                                         // For multi-disk OVA, check and create data disk templates
                                         if (tmplt.getFormat().equals(ImageFormat.OVA)) {
-                                            if (!createOvaDataDiskTemplates(_templateFactory.getTemplate(tmlpt.getId(), store))) {
+                                            if (!createOvaDataDiskTemplates(_templateFactory.getTemplate(tmlpt.getId(), store), tmplt.isDeployAsIs())) {
                                                 event = VirtualMachineTemplate.Event.OperationFailed;
                                             }
                                         }
@@ -671,7 +671,7 @@
     }
 
     private Map<String, TemplateProp> listTemplate(DataStore ssStore) {
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
         ListTemplateCommand cmd = new ListTemplateCommand(ssStore.getTO(), nfsVersion);
         EndPoint ep = _epSelector.select(ssStore);
         Answer answer = null;
@@ -710,7 +710,7 @@
 
         // For multi-disk OVA, check and create data disk templates
         if (template.getFormat().equals(ImageFormat.OVA)) {
-            if (!createOvaDataDiskTemplates(template)) {
+            if (!createOvaDataDiskTemplates(template, template.isDeployAsIs())) {
                 template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
                 result.setResult(callbackResult.getResult());
                 if (parentCallback != null) {
@@ -737,12 +737,18 @@
     }
 
     @Override
-    public boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate) {
+    public List<DatadiskTO> getTemplateDatadisksOnImageStore(TemplateInfo templateInfo, String configurationId) {
+        ImageStoreEntity tmpltStore = (ImageStoreEntity)templateInfo.getDataStore();
+        return tmpltStore.getDataDiskTemplates(templateInfo, configurationId);
+    }
+
+    @Override
+    public boolean createOvaDataDiskTemplates(TemplateInfo parentTemplate, boolean deployAsIs) {
         try {
             // Get Datadisk template (if any) for OVA
             List<DatadiskTO> dataDiskTemplates = new ArrayList<DatadiskTO>();
             ImageStoreEntity tmpltStore = (ImageStoreEntity)parentTemplate.getDataStore();
-            dataDiskTemplates = tmpltStore.getDataDiskTemplates(parentTemplate);
+            dataDiskTemplates = tmpltStore.getDataDiskTemplates(parentTemplate, null);
             int diskCount = 0;
             VMTemplateVO templateVO = _templateDao.findById(parentTemplate.getId());
             _templateDao.loadDetails(templateVO);
@@ -754,23 +760,27 @@
                     details = new HashMap<>();
                 }
             }
+
             for (DatadiskTO diskTemplate : dataDiskTemplates) {
-                if (!diskTemplate.isBootable()) {
-                    createChildDataDiskTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++);
-                    if (!diskTemplate.isIso() && Strings.isNullOrEmpty(details.get(VmDetailConstants.DATA_DISK_CONTROLLER))){
-                        details.put(VmDetailConstants.DATA_DISK_CONTROLLER, getOvaDiskControllerDetails(diskTemplate, false));
-                        details.put(VmDetailConstants.DATA_DISK_CONTROLLER + diskTemplate.getDiskId(), getOvaDiskControllerDetails(diskTemplate, false));
-                    }
-                } else {
-                    finalizeParentTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++);
-                    if (Strings.isNullOrEmpty(VmDetailConstants.ROOT_DISK_CONTROLLER)) {
-                        final String rootDiskController = getOvaDiskControllerDetails(diskTemplate, true);
-                        if (!Strings.isNullOrEmpty(rootDiskController)) {
-                            details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDiskController);
+                if (!deployAsIs) {
+                    if (!diskTemplate.isBootable()) {
+                        createChildDataDiskTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++);
+                        if (!diskTemplate.isIso() && Strings.isNullOrEmpty(details.get(VmDetailConstants.DATA_DISK_CONTROLLER))){
+                            details.put(VmDetailConstants.DATA_DISK_CONTROLLER, getOvaDiskControllerDetails(diskTemplate, false));
+                            details.put(VmDetailConstants.DATA_DISK_CONTROLLER + diskTemplate.getDiskId(), getOvaDiskControllerDetails(diskTemplate, false));
+                        }
+                    } else {
+                        finalizeParentTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++);
+                        if (Strings.isNullOrEmpty(VmDetailConstants.ROOT_DISK_CONTROLLER)) {
+                            final String rootDiskController = getOvaDiskControllerDetails(diskTemplate, true);
+                            if (!Strings.isNullOrEmpty(rootDiskController)) {
+                                details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDiskController);
+                            }
                         }
                     }
                 }
             }
+
             templateVO.setDetails(details);
             _templateDao.saveDetails(templateVO);
             return true;
@@ -789,7 +799,7 @@
         String templateName = dataDiskTemplate.isIso() ? dataDiskTemplate.getPath().substring(dataDiskTemplate.getPath().lastIndexOf(File.separator) + 1) : template.getName() + suffix + diskCount;
         VMTemplateVO templateVO = new VMTemplateVO(templateId, templateName, format, false, false, false, ttype, template.getUrl(),
                 template.requiresHvm(), template.getBits(), template.getAccountId(), null, templateName, false, guestOsId, false, template.getHypervisorType(), null,
-                null, false, false, false);
+                null, false, false, false, false);
         if (dataDiskTemplate.isIso()){
             templateVO.setUniqueName(templateName);
         }
@@ -952,7 +962,7 @@
         AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
         // no need to create entry on template_store_ref here, since entries are already created when prepareSecondaryStorageForMigration is invoked.
         // But we need to set default install path so that sync can be done in the right s3 path
-        TemplateInfo templateOnStore = _templateFactory.getTemplate(template, store);
+        TemplateInfo templateOnStore = _templateFactory.getTemplate(template, store, null);
         String installPath =
                 TemplateConstants.DEFAULT_TMPLT_ROOT_DIR + "/" + TemplateConstants.DEFAULT_TMPLT_FIRST_LEVEL_DIR + template.getAccountId() + "/" + template.getId() + "/" +
                         template.getUniqueName();
@@ -1039,7 +1049,7 @@
             throw new CloudRuntimeException("No secondary VM in running state in source template zone ");
         }
 
-        TemplateObject tmplForCopy = (TemplateObject)_templateFactory.getTemplate(srcTemplate, destStore);
+        TemplateObject tmplForCopy = (TemplateObject)_templateFactory.getTemplate(srcTemplate, destStore, null);
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Setting source template url to " + url);
         }
@@ -1068,7 +1078,7 @@
             // clean up already persisted template_store_ref entry in case of createTemplateCallback is never called
             TemplateDataStoreVO templateStoreVO = _vmTemplateStoreDao.findByStoreTemplate(destStore.getId(), srcTemplate.getId());
             if (templateStoreVO != null) {
-                TemplateInfo tmplObj = _templateFactory.getTemplate(srcTemplate, destStore);
+                TemplateInfo tmplObj = _templateFactory.getTemplate(srcTemplate, destStore, null);
                 tmplObj.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
             }
             TemplateApiResult res = new TemplateApiResult((TemplateObject)templateOnStore);
@@ -1130,7 +1140,7 @@
 
     @Override
     public AsyncCallFuture<TemplateApiResult> deleteTemplateOnPrimary(TemplateInfo template, StoragePool pool) {
-        TemplateObject templateObject = (TemplateObject)_templateFactory.getTemplate(template.getId(), (DataStore)pool);
+        TemplateObject templateObject = (TemplateObject)_templateFactory.getTemplateOnPrimaryStorage(template.getId(), (DataStore)pool, template.getDeployAsIsConfiguration());
 
         templateObject.processEvent(ObjectInDataStoreStateMachine.Event.DestroyRequested);
 
@@ -1241,7 +1251,7 @@
             dataDiskTemplateOnStore = (TemplateObject)store.create(dataDiskTemplate);
             dataDiskTemplateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested);
         } else {
-            dataDiskTemplateOnStore = (TemplateObject) imageFactory.getTemplate(parentTemplate, store);
+            dataDiskTemplateOnStore = (TemplateObject) imageFactory.getTemplate(parentTemplate, store, null);
         }
         try {
             CreateDataDiskTemplateContext<TemplateApiResult> context = new CreateDataDiskTemplateContext<TemplateApiResult>(null, dataDiskTemplateOnStore, future);
@@ -1261,7 +1271,7 @@
     }
 
     protected Void createDatadiskTemplateCallback(AsyncCallbackDispatcher<TemplateServiceImpl, CreateCmdResult> callback,
-            CreateDataDiskTemplateContext<TemplateApiResult> context) {
+                                                  CreateDataDiskTemplateContext<TemplateApiResult> context) {
         DataObject dataDiskTemplate = context.dataDiskTemplate;
         AsyncCallFuture<TemplateApiResult> future = context.getFuture();
         CreateCmdResult result = callback.getResult();
@@ -1280,4 +1290,4 @@
         future.complete(dataDiskTemplateResult);
         return null;
     }
-}
+}
\ No newline at end of file
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
index 80e5b38..1ca155c 100644
--- a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/manager/ImageStoreProviderManagerImpl.java
@@ -33,6 +33,9 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.ImageStoreProvider;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.image.ImageStoreDriver;
@@ -47,7 +50,7 @@
 import com.cloud.storage.dao.VMTemplateDao;
 
 @Component
-public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager {
+public class ImageStoreProviderManagerImpl implements ImageStoreProviderManager, Configurable {
     private static final Logger s_logger = Logger.getLogger(ImageStoreProviderManagerImpl.class);
     @Inject
     ImageStoreDao dataStoreDao;
@@ -57,8 +60,14 @@
     DataStoreProviderManager providerManager;
     @Inject
     StatsCollector _statsCollector;
+    @Inject
+    ConfigurationDao configDao;
+
     Map<String, ImageStoreDriver> driverMaps;
 
+    static final ConfigKey<String> ImageStoreAllocationAlgorithm = new ConfigKey<String>("Advanced", String.class, "image.store.allocation.algorithm", "firstfitleastconsumed",
+            "firstfitleastconsumed','random' : Order in which hosts within a cluster will be considered for VM/volume allocation", true, ConfigKey.Scope.Global );
+
     @PostConstruct
     public void config() {
         driverMaps = new HashMap<String, ImageStoreDriver>();
@@ -110,7 +119,7 @@
 
     @Override
     public List<DataStore> listImageStoresByScope(ZoneScope scope) {
-        List<ImageStoreVO> stores = dataStoreDao.findByScope(scope);
+        List<ImageStoreVO> stores = dataStoreDao.findByZone(scope, null);
         List<DataStore> imageStores = new ArrayList<DataStore>();
         for (ImageStoreVO store : stores) {
             imageStores.add(getImageStore(store.getId()));
@@ -119,6 +128,24 @@
     }
 
     @Override
+    public List<DataStore> listImageStoresByScopeExcludingReadOnly(ZoneScope scope) {
+        String allocationAlgorithm = ImageStoreAllocationAlgorithm.value();
+
+        List<ImageStoreVO> stores = dataStoreDao.findByZone(scope, Boolean.FALSE);
+        List<DataStore> imageStores = new ArrayList<DataStore>();
+        for (ImageStoreVO store : stores) {
+            imageStores.add(getImageStore(store.getId()));
+        }
+        if (allocationAlgorithm.equals("random")) {
+            Collections.shuffle(imageStores);
+            return imageStores;
+        } else if (allocationAlgorithm.equals("firstfitleastconsumed")) {
+            return orderImageStoresOnFreeCapacity(imageStores);
+        }
+        return null;
+    }
+
+    @Override
     public List<DataStore> listImageStoreByProvider(String provider) {
         List<ImageStoreVO> stores = dataStoreDao.findByProvider(provider);
         List<DataStore> imageStores = new ArrayList<DataStore>();
@@ -179,6 +206,31 @@
     }
 
     @Override
+    public List<DataStore> orderImageStoresOnFreeCapacity(List<DataStore> imageStores) {
+        List<DataStore> stores = new ArrayList<>();
+        if (imageStores.size() > 1) {
+            imageStores.sort(new Comparator<DataStore>() { // Sort data stores based on free capacity
+                @Override
+                public int compare(DataStore store1, DataStore store2) {
+                    return Long.compare(_statsCollector.imageStoreCurrentFreeCapacity(store1),
+                            _statsCollector.imageStoreCurrentFreeCapacity(store2));
+                }
+            });
+            for (DataStore imageStore : imageStores) {
+                // Return image store if used percentage is less then threshold value i.e. 90%.
+                if (_statsCollector.imageStoreHasEnoughCapacity(imageStore)) {
+                    stores.add(imageStore);
+                }
+            }
+        } else if (imageStores.size() == 1) {
+            if (_statsCollector.imageStoreHasEnoughCapacity(imageStores.get(0))) {
+                stores.add(imageStores.get(0));
+            }
+        }
+        return stores;
+    }
+
+    @Override
     public List<DataStore> listImageStoresWithFreeCapacity(List<DataStore> imageStores) {
         List<DataStore> stores = new ArrayList<>();
         for (DataStore imageStore : imageStores) {
@@ -195,4 +247,14 @@
         }
         return stores;
     }
+
+    @Override
+    public String getConfigComponentName() {
+        return ImageStoreProviderManager.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] { ImageStoreAllocationAlgorithm };
+    }
 }
diff --git a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
index f54673d..d4e2c05 100644
--- a/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
+++ b/engine/storage/image/src/main/java/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
@@ -218,8 +218,8 @@
     }
 
     @Override
-    public List<DatadiskTO> getDataDiskTemplates(DataObject obj) {
-        return driver.getDataDiskTemplates(obj);
+    public List<DatadiskTO> getDataDiskTemplates(DataObject obj, String configurationId) {
+        return driver.getDataDiskTemplates(obj, configurationId);
     }
 
     @Override
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 25f27a2..b7a44cd 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
@@ -63,6 +63,7 @@
     private DataStore dataStore;
     private String url;
     private String installPath; // temporarily set installPath before passing to resource for entries with empty installPath for object store migration case
+    private String deployAsIsConfiguration; // Temporarily set
     @Inject
     VMTemplateDao imageDao;
     @Inject
@@ -80,8 +81,9 @@
         this.dataStore = dataStore;
     }
 
-    public static TemplateObject getTemplate(VMTemplateVO vo, DataStore store) {
+    public static TemplateObject getTemplate(VMTemplateVO vo, DataStore store, String configuration) {
         TemplateObject to = ComponentContext.inject(TemplateObject.class);
+        to.deployAsIsConfiguration = configuration;
         to.configure(vo, store);
         return to;
     }
@@ -190,7 +192,9 @@
                 if (answer instanceof CopyCmdAnswer) {
                     CopyCmdAnswer cpyAnswer = (CopyCmdAnswer)answer;
                     TemplateObjectTO newTemplate = (TemplateObjectTO)cpyAnswer.getNewData();
-                    VMTemplateStoragePoolVO templatePoolRef = templatePoolDao.findByPoolTemplate(getDataStore().getId(), getId());
+
+                    String deployAsIsConfiguration = newTemplate.getDeployAsIsConfiguration();
+                    VMTemplateStoragePoolVO templatePoolRef = templatePoolDao.findByPoolTemplate(getDataStore().getId(), getId(), deployAsIsConfiguration);
                     templatePoolRef.setDownloadPercent(100);
 
                     setTemplateSizeIfNeeded(newTemplate, templatePoolRef);
@@ -208,7 +212,9 @@
                     CopyCmdAnswer cpyAnswer = (CopyCmdAnswer)answer;
                     TemplateObjectTO newTemplate = (TemplateObjectTO)cpyAnswer.getNewData();
                     TemplateDataStoreVO templateStoreRef = templateStoreDao.findByStoreTemplate(getDataStore().getId(), getId());
-                    templateStoreRef.setInstallPath(newTemplate.getPath());
+                    if (newTemplate.getPath() != null) {
+                        templateStoreRef.setInstallPath(newTemplate.getPath());
+                    }
                     templateStoreRef.setDownloadPercent(100);
                     templateStoreRef.setDownloadState(Status.DOWNLOADED);
                     templateStoreRef.setSize(newTemplate.getSize());
@@ -326,6 +332,11 @@
     }
 
     @Override
+    public String getDeployAsIsConfiguration() {
+        return deployAsIsConfiguration;
+    }
+
+    @Override
     public DataTO getTO() {
         DataTO to = null;
         if (dataStore == null) {
@@ -363,6 +374,14 @@
         return this.imageVO.isDirectDownload();
     }
 
+    @Override
+    public boolean isDeployAsIs() {
+        if (this.imageVO == null) {
+            return false;
+        }
+        return this.imageVO.isDeployAsIs();
+    }
+
     public void setInstallPath(String installPath) {
         this.installPath = installPath;
     }
diff --git a/engine/storage/image/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml b/engine/storage/image/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml
index 5c7b05b..805af26 100644
--- a/engine/storage/image/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml
+++ b/engine/storage/image/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml
@@ -34,6 +34,10 @@
     <bean id="templateDataFactoryImpl"
         class="org.apache.cloudstack.storage.image.TemplateDataFactoryImpl" />
 
+    <bean id="secondaryStorageServiceImpl"
+          class="org.apache.cloudstack.storage.image.SecondaryStorageServiceImpl"
+          depends-on="dataMotionServiceImpl, objectInDataStoreManagerImpl" />
+
     <bean id="imageStoreHelper"
         class="org.apache.cloudstack.storage.image.datastore.ImageStoreHelper" />
     <bean id="imageFormatHelper"
@@ -41,5 +45,5 @@
 
     <bean id="imageStoreProviderMgr"
         class="org.apache.cloudstack.storage.image.manager.ImageStoreProviderManagerImpl" />
-    
+
 </beans>
diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml
index 1973097..475ebd0 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/VolumeServiceTest.java b/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/VolumeServiceTest.java
index 9a680ed..5ed0cc3 100644
--- a/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/VolumeServiceTest.java
+++ b/engine/storage/integration-test/src/test/java/org/apache/cloudstack/storage/test/VolumeServiceTest.java
@@ -276,6 +276,7 @@
         params.put("path", uri.getPath());
         params.put("protocol", StoragePoolType.NetworkFilesystem);
         params.put("dcId", dcId.toString());
+        params.put("hypervisorType", HypervisorType.None);
         params.put("clusterId", clusterId.toString());
         params.put("name", this.primaryName);
         params.put("port", "1");
@@ -318,6 +319,7 @@
             params.put("path", uri.getPath());
             params.put("protocol", Storage.StoragePoolType.NetworkFilesystem);
             params.put("dcId", dcId.toString());
+            params.put("hypervisorType", HypervisorType.None);
             params.put("clusterId", clusterId.toString());
             params.put("name", this.primaryName);
             params.put("port", "1");
diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml
index 1157f42..c03f9ff 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml
index e5583b3..c19adc4 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
index 65d6fa5..f107343 100644
--- a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotObject.java
@@ -18,12 +18,12 @@
  */
 package org.apache.cloudstack.storage.snapshot;
 
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
 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;
@@ -40,6 +40,7 @@
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO;
 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;
@@ -130,6 +131,24 @@
     }
 
     @Override
+    public List<SnapshotInfo> getChildren() {
+        QueryBuilder<SnapshotDataStoreVO> sc = QueryBuilder.create(SnapshotDataStoreVO.class);
+        sc.and(sc.entity().getDataStoreId(), Op.EQ, store.getId());
+        sc.and(sc.entity().getRole(), Op.EQ, store.getRole());
+        sc.and(sc.entity().getState(), Op.NIN, State.Destroying, State.Destroyed, State.Error);
+        sc.and(sc.entity().getParentSnapshotId(), Op.EQ, getId());
+        List<SnapshotDataStoreVO> vos = sc.list();
+
+        List<SnapshotInfo> children = new ArrayList<>();
+        if (vos != null) {
+            for (SnapshotDataStoreVO vo : vos) {
+                children.add(snapshotFactory.getSnapshot(vo.getSnapshotId(), DataStoreRole.Image));
+            }
+        }
+        return children;
+    }
+
+    @Override
     public boolean isRevertable() {
         SnapshotStrategy snapshotStrategy = storageStrategyFactory.getSnapshotStrategy(snapshot, SnapshotOperation.REVERT);
         if (snapshotStrategy != null) {
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
index 51a2741..b8788fb 100644
--- a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java
@@ -323,6 +323,7 @@
         if (result.isFailed()) {
             try {
                 if (createSnapshotPayload.getAsyncBackup()) {
+                    _snapshotDao.remove(srcSnapshot.getId());
                     destSnapshot.processEvent(Event.OperationFailed);
                     throw new SnapshotBackupException("Failed in creating backup of snapshot with ID "+srcSnapshot.getId());
                 } else {
diff --git a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
index 6b83dab..8423624 100644
--- a/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
+++ b/engine/storage/snapshot/src/main/java/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java
@@ -426,7 +426,7 @@
     }
 
     @Override
-    public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot) {
+    public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot, boolean unmanage) {
         try {
             vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.ExpungeRequested);
         } catch (NoTransitionException e) {
@@ -435,9 +435,14 @@
         }
         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());
     }
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 727d10a..82649b9 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
@@ -26,12 +26,12 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
 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.apache.log4j.Logger;
 
 import com.cloud.capacity.Capacity;
 import com.cloud.capacity.dao.CapacityDao;
@@ -39,10 +39,12 @@
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.deploy.DeploymentPlan;
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
+import com.cloud.exception.StorageUnavailableException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.storage.Storage;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.StorageUtil;
 import com.cloud.storage.Volume;
 import com.cloud.storage.dao.VolumeDao;
@@ -84,12 +86,17 @@
         return false;
     }
 
-    protected abstract List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo);
+    protected abstract List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck);
 
     @Override
     public List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
-        List<StoragePool> pools = select(dskCh, vmProfile, plan, avoid, returnUpTo);
-        return reOrder(pools, vmProfile, plan);
+        return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, false);
+    }
+
+    @Override
+    public List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
+        List<StoragePool> pools = select(dskCh, vmProfile, plan, avoid, returnUpTo, bypassStorageTypeCheck);
+        return reorderPools(pools, vmProfile, plan);
     }
 
     protected List<StoragePool> reorderPoolsByCapacity(DeploymentPlan plan,
@@ -155,7 +162,8 @@
         return reorderedPools;
     }
 
-    protected List<StoragePool> reOrder(List<StoragePool> pools, VirtualMachineProfile vmProfile, DeploymentPlan plan) {
+    @Override
+    public List<StoragePool> reorderPools(List<StoragePool> pools, VirtualMachineProfile vmProfile, DeploymentPlan plan) {
         if (pools == null) {
             return null;
         }
@@ -215,6 +223,29 @@
         Volume volume = volumeDao.findById(dskCh.getVolumeId());
         List<Volume> requestVolumes = new ArrayList<>();
         requestVolumes.add(volume);
+        if (dskCh.getHypervisorType() == HypervisorType.VMware) {
+            // Skip the parent datastore cluster, consider only child storage pools in it
+            if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster && storageMgr.isStoragePoolDatastoreClusterParent(pool)) {
+                return false;
+            }
+            // Skip the storage pool whose parent datastore cluster is not in UP state.
+            if (pool.getParent() != 0L) {
+                StoragePoolVO datastoreCluster = storagePoolDao.findById(pool.getParent());
+                if (datastoreCluster == null || (datastoreCluster != null && datastoreCluster.getStatus() != StoragePoolStatus.Up)) {
+                    return false;
+                }
+            }
+
+            try {
+                boolean isStoragePoolStoragepolicyComplaince = storageMgr.isStoragePoolComplaintWithStoragePolicy(requestVolumes, pool);
+                if (!isStoragePoolStoragepolicyComplaince) {
+                    return false;
+                }
+            } catch (StorageUnavailableException e) {
+                s_logger.warn(String.format("Could not verify storage policy complaince against storage pool %s due to exception %s", pool.getUuid(), e.getMessage()));
+                return false;
+            }
+        }
         return storageMgr.storagePoolHasEnoughIops(requestVolumes, pool) && storageMgr.storagePoolHasEnoughSpace(requestVolumes, pool, plan.getClusterId());
     }
 
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
index 12884d5..9967a2c 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/ClusterScopeStoragePoolAllocator.java
@@ -45,9 +45,13 @@
     DiskOfferingDao _diskOfferingDao;
 
     @Override
-    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         s_logger.debug("ClusterScopeStoragePoolAllocator looking for storage pool");
 
+        if (!bypassStorageTypeCheck && dskCh.useLocalStorage()) {
+            return null;
+        }
+
         List<StoragePool> suitablePools = new ArrayList<StoragePool>();
 
         long dcId = plan.getDataCenterId();
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
index b3a1c0d..f02a898 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/GarbageCollectingStoragePoolAllocator.java
@@ -47,7 +47,7 @@
     boolean _storagePoolCleanupEnabled;
 
     @Override
-    public List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+    public List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         s_logger.debug("GarbageCollectingStoragePoolAllocator looking for storage pool");
         if (!_storagePoolCleanupEnabled) {
             s_logger.debug("Storage pool cleanup is not enabled, so GarbageCollectingStoragePoolAllocator is being skipped.");
@@ -68,7 +68,7 @@
         ExcludeList myAvoids =
             new ExcludeList(avoid.getDataCentersToAvoid(), avoid.getPodsToAvoid(), avoid.getClustersToAvoid(), avoid.getHostsToAvoid(), avoid.getPoolsToAvoid());
 
-        return allocator.allocateToPool(dskCh, vmProfile, plan, myAvoids, returnUpTo);
+        return allocator.allocateToPool(dskCh, vmProfile, plan, myAvoids, returnUpTo, bypassStorageTypeCheck);
     }
 
     @Override
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java
index 390272e..6fc4ada 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/LocalStoragePoolAllocator.java
@@ -60,10 +60,10 @@
     ConfigurationDao _configDao;
 
     @Override
-    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         s_logger.debug("LocalStoragePoolAllocator trying to find storage pool to fit the vm");
 
-        if (!dskCh.useLocalStorage()) {
+        if (!bypassStorageTypeCheck && !dskCh.useLocalStorage()) {
             return null;
         }
 
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
index e552a1b..4b150b2 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/allocator/UseLocalForRootAllocator.java
@@ -39,12 +39,17 @@
 
     @Override
     public List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+        return allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, false);
+    }
+
+    @Override
+    public List<StoragePool> allocateToPool(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         DataCenterVO dc = _dcDao.findById(plan.getDataCenterId());
         if (!dc.isLocalStorageEnabled()) {
             return null;
         }
 
-        return super.allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo);
+        return super.allocateToPool(dskCh, vmProfile, plan, avoid, returnUpTo, bypassStorageTypeCheck);
     }
 
     @Override
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 301704a..e3b2991 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
@@ -50,10 +50,10 @@
 
 
     @Override
-    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+    protected List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
         LOGGER.debug("ZoneWideStoragePoolAllocator to find storage pool");
 
-        if (dskCh.useLocalStorage()) {
+        if (!bypassStorageTypeCheck && dskCh.useLocalStorage()) {
             return null;
         }
 
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
index 2caa3ef..777eb37 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataObjectManagerImpl.java
@@ -76,7 +76,7 @@
             s_logger.debug("waiting too long for template downloading, marked it as failed");
             throw new CloudRuntimeException("waiting too long for template downloading, marked it as failed");
         }
-        return objectInDataStoreMgr.get(dataObj, dataStore);
+        return objectInDataStoreMgr.get(dataObj, dataStore, null);
     }
 
     class CreateContext<T> extends AsyncRpcContext<T> {
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
index 51421e4..ff6c4fb 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java
@@ -73,6 +73,11 @@
     }
 
     @Override
+    public List<DataStore> getImageStoresByScopeExcludingReadOnly(ZoneScope scope) {
+        return imageDataStoreMgr.listImageStoresByScopeExcludingReadOnly(scope);
+    }
+
+    @Override
     public DataStore getRandomImageStore(long zoneId) {
         List<DataStore> stores = getImageStoresByScope(new ZoneScope(zoneId));
         if (stores == null || stores.size() == 0) {
@@ -82,8 +87,17 @@
     }
 
     @Override
+    public DataStore getRandomUsableImageStore(long zoneId) {
+        List<DataStore> stores = getImageStoresByScopeExcludingReadOnly(new ZoneScope(zoneId));
+        if (stores == null || stores.size() == 0) {
+            return null;
+        }
+        return imageDataStoreMgr.getRandomImageStore(stores);
+    }
+
+    @Override
     public DataStore getImageStoreWithFreeCapacity(long zoneId) {
-        List<DataStore> stores = getImageStoresByScope(new ZoneScope(zoneId));
+        List<DataStore> stores = getImageStoresByScopeExcludingReadOnly(new ZoneScope(zoneId));
         if (stores == null || stores.size() == 0) {
             return null;
         }
@@ -91,8 +105,16 @@
     }
 
     @Override
+    public DataStore getImageStoreWithFreeCapacity(List<DataStore> imageStores) {
+        if (imageStores.isEmpty()) {
+            return null;
+        }
+        return imageDataStoreMgr.getImageStoreWithFreeCapacity(imageStores);
+    }
+
+    @Override
     public List<DataStore> listImageStoresWithFreeCapacity(long zoneId) {
-        List<DataStore> stores = getImageStoresByScope(new ZoneScope(zoneId));
+        List<DataStore> stores = getImageStoresByScopeExcludingReadOnly(new ZoneScope(zoneId));
         if (stores == null || stores.size() == 0) {
             return null;
         }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
index 8f081d3..48aceca 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
@@ -33,11 +33,11 @@
 
     boolean deleteIfNotReady(DataObject dataObj);
 
-    DataObject get(DataObject dataObj, DataStore store);
+    DataObject get(DataObject dataObj, DataStore store, String configuration);
 
     boolean update(DataObject vo, Event event) throws NoTransitionException, ConcurrentOperationException;
 
-    DataObjectInStore findObject(long objId, DataObjectType type, long dataStoreId, DataStoreRole role);
+    DataObjectInStore findObject(long objId, DataObjectType type, long dataStoreId, DataStoreRole role, String deployAsIsConfiguration);
 
     DataObjectInStore findObject(DataObject obj, DataStore store);
 
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
index 062e89a..da97b22 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -104,13 +104,21 @@
         // TODO: further investigate why an extra event is sent when it is
         // alreay Ready for DownloadListener
         stateMachines.addTransition(State.Ready, Event.OperationSuccessed, State.Ready);
+        // State transitions for data object migration
+        stateMachines.addTransition(State.Ready, Event.MigrateDataRequested, State.Migrating);
+        stateMachines.addTransition(State.Ready, Event.CopyRequested, State.Copying);
+        stateMachines.addTransition(State.Allocated, Event.MigrateDataRequested, State.Migrating);
+        stateMachines.addTransition(State.Migrating, Event.MigrationFailed, State.Failed);
+        stateMachines.addTransition(State.Migrating, Event.MigrationSucceeded, State.Destroyed);
+        stateMachines.addTransition(State.Migrating, Event.OperationSuccessed, State.Ready);
+        stateMachines.addTransition(State.Migrating, Event.OperationFailed, State.Ready);
     }
 
     @Override
     public DataObject create(DataObject obj, DataStore dataStore) {
         if (dataStore.getRole() == DataStoreRole.Primary) {
             if (obj.getType() == DataObjectType.TEMPLATE) {
-                VMTemplateStoragePoolVO vo = new VMTemplateStoragePoolVO(dataStore.getId(), obj.getId());
+                VMTemplateStoragePoolVO vo = new VMTemplateStoragePoolVO(dataStore.getId(), obj.getId(), null);
                 vo = templatePoolDao.persist(vo);
             } else if (obj.getType() == DataObjectType.SNAPSHOT) {
                 SnapshotInfo snapshotInfo = (SnapshotInfo)obj;
@@ -189,7 +197,7 @@
             }
         }
 
-        return this.get(obj, dataStore);
+        return this.get(obj, dataStore, null);
     }
 
     @Override
@@ -198,7 +206,7 @@
         DataStore dataStore = dataObj.getDataStore();
         if (dataStore.getRole() == DataStoreRole.Primary) {
             if (dataObj.getType() == DataObjectType.TEMPLATE) {
-                VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId);
+                VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId, null);
                 if (destTmpltPool != null) {
                     return templatePoolDao.remove(destTmpltPool.getId());
                 } else {
@@ -246,7 +254,7 @@
         DataStore dataStore = dataObj.getDataStore();
         if (dataStore.getRole() == DataStoreRole.Primary) {
             if (dataObj.getType() == DataObjectType.TEMPLATE) {
-                VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId);
+                VMTemplateStoragePoolVO destTmpltPool = templatePoolDao.findByPoolTemplate(dataStore.getId(), objId, null);
                 if (destTmpltPool != null && destTmpltPool.getState() != ObjectInDataStoreStateMachine.State.Ready) {
                     return templatePoolDao.remove(destTmpltPool.getId());
                 } else {
@@ -325,9 +333,9 @@
     }
 
     @Override
-    public DataObject get(DataObject dataObj, DataStore store) {
+    public DataObject get(DataObject dataObj, DataStore store, String configuration) {
         if (dataObj.getType() == DataObjectType.TEMPLATE) {
-            return imageFactory.getTemplate(dataObj, store);
+            return imageFactory.getTemplate(dataObj, store, configuration);
         } else if (dataObj.getType() == DataObjectType.VOLUME) {
             return volumeFactory.getVolume(dataObj, store);
         } else if (dataObj.getType() == DataObjectType.SNAPSHOT) {
@@ -339,11 +347,15 @@
 
     @Override
     public DataObjectInStore findObject(DataObject obj, DataStore store) {
-        return findObject(obj.getId(), obj.getType(), store.getId(), store.getRole());
+        String deployAsIsConfiguration = null;
+        if (obj.getType() == DataObjectType.TEMPLATE) {
+            deployAsIsConfiguration = ((TemplateInfo) obj).getDeployAsIsConfiguration();
+        }
+        return findObject(obj.getId(), obj.getType(), store.getId(), store.getRole(), deployAsIsConfiguration);
     }
 
     @Override
-    public DataObjectInStore findObject(long objId, DataObjectType type, long dataStoreId, DataStoreRole role) {
+    public DataObjectInStore findObject(long objId, DataObjectType type, long dataStoreId, DataStoreRole role, String deployAsIsConfiguration) {
         DataObjectInStore vo = null;
         if (role == DataStoreRole.Image || role == DataStoreRole.ImageCache) {
             switch (type) {
@@ -358,7 +370,7 @@
                     break;
             }
         } else if (type == DataObjectType.TEMPLATE && role == DataStoreRole.Primary) {
-            vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId);
+            vo = templatePoolDao.findByPoolTemplate(dataStoreId, objId, deployAsIsConfiguration);
         } else if (type == DataObjectType.SNAPSHOT && role == DataStoreRole.Primary) {
             vo = snapshotDataStoreDao.findByStoreSnapshot(role, dataStoreId, objId);
         } else {
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index 6e8bdaf..6a903e4 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -25,10 +25,16 @@
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import javax.inject.Inject;
 
+import com.cloud.dc.DedicatedResourceVO;
+import com.cloud.dc.dao.DedicatedResourceDao;
+import com.cloud.user.Account;
+import com.cloud.utils.Pair;
+import org.apache.cloudstack.context.CallContext;
 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.EndPoint;
@@ -64,6 +70,8 @@
     private static final Logger s_logger = Logger.getLogger(DefaultEndPointSelector.class);
     @Inject
     private HostDao hostDao;
+    @Inject
+    private DedicatedResourceDao dedicatedResourceDao;
     private final String findOneHostOnPrimaryStorage = "select t.id from "
                             + "(select h.id, cd.value "
                             + "from host h join storage_pool_host_ref s on h.id = s.host_id  "
@@ -115,6 +123,8 @@
         StringBuilder sbuilder = new StringBuilder();
         sbuilder.append(sqlBase);
 
+        List<Long> dedicatedHosts = new ArrayList<Long>();
+
         if (scope != null) {
             if (scope.getScopeType() == ScopeType.HOST) {
                 sbuilder.append(" and h.id = ");
@@ -122,15 +132,23 @@
             } else if (scope.getScopeType() == ScopeType.CLUSTER) {
                 sbuilder.append(" and h.cluster_id = ");
                 sbuilder.append(scope.getScopeId());
+                dedicatedHosts = dedicatedResourceDao.findHostsByCluster(scope.getScopeId());
             } else if (scope.getScopeType() == ScopeType.ZONE) {
                 sbuilder.append(" and h.data_center_id = ");
                 sbuilder.append(scope.getScopeId());
+                dedicatedHosts = dedicatedResourceDao.findHostsByZone(scope.getScopeId());
             }
+        } else {
+            dedicatedHosts = dedicatedResourceDao.listAllHosts();
         }
 
         // TODO: order by rand() is slow if there are lot of hosts
         sbuilder.append(") t where t.value<>'true' or t.value is null");    //Added for exclude cluster's subquery
-        sbuilder.append(" ORDER by rand() limit 1");
+        sbuilder.append(" ORDER by ");
+        if (dedicatedHosts.size() > 0) {
+            moveDedicatedHostsToLowerPriority(sbuilder, dedicatedHosts);
+        }
+        sbuilder.append(" rand() limit 1");
         String sql = sbuilder.toString();
         HostVO host = null;
         TransactionLegacy txn = TransactionLegacy.currentTxn();
@@ -154,6 +172,42 @@
         return RemoteHostEndPoint.getHypervisorHostEndPoint(host);
     }
 
+    private void moveDedicatedHostsToLowerPriority(StringBuilder sbuilder, List<Long> dedicatedHosts) {
+
+        // Check if we have a call context
+        final CallContext context = CallContext.current();
+        if (context != null) {
+            Account account = context.getCallingAccount();
+            if (account != null) {
+                // Remove hosts for this account. Only leave hosts dedicated to other accounts in the lower priority list.
+                Pair<List<DedicatedResourceVO>, Integer> hostIds = dedicatedResourceDao.searchDedicatedHosts(null, null, account.getId(), null, null);
+                List<DedicatedResourceVO> accountDedicatedHosts = hostIds.first();
+                for (DedicatedResourceVO accountDedicatedResource: accountDedicatedHosts){
+                    Iterator<Long> dedicatedHostsIterator = dedicatedHosts.iterator();
+                    while (dedicatedHostsIterator.hasNext()) {
+                        if (dedicatedHostsIterator.next() == accountDedicatedResource.getHostId()) {
+                            dedicatedHostsIterator.remove();
+                        }
+                    }
+                }
+            }
+        }
+
+        if (dedicatedHosts.size() > 0) {
+            Collections.shuffle(dedicatedHosts); // Randomize dedicated hosts as well.
+            sbuilder.append("field(t.id, ");
+            int hostIndex = 0;
+            for (Long hostId: dedicatedHosts) { // put dedicated hosts at the end of the result set
+                sbuilder.append("'" + hostId + "'");
+                hostIndex++;
+                if (hostIndex < dedicatedHosts.size()){
+                    sbuilder.append(",");
+                }
+            }
+            sbuilder.append(")," );
+        }
+    }
+
     protected EndPoint findEndPointForImageMove(DataStore srcStore, DataStore destStore) {
         // find any xenserver/kvm host in the scope
         Scope srcScope = srcStore.getScope();
@@ -264,6 +318,27 @@
         return RemoteHostEndPoint.getHypervisorHostEndPoint(host);
     }
 
+    @Override
+    public List<EndPoint> findAllEndpointsForScope(DataStore store) {
+        Long dcId = null;
+        Scope storeScope = store.getScope();
+        if (storeScope.getScopeType() == ScopeType.ZONE) {
+            dcId = storeScope.getScopeId();
+        }
+        // find ssvm that can be used to download data to store. For zone-wide
+        // image store, use SSVM for that zone. For region-wide store,
+        // we can arbitrarily pick one ssvm to do that task
+        List<HostVO> ssAHosts = listUpAndConnectingSecondaryStorageVmHost(dcId);
+        if (ssAHosts == null || ssAHosts.isEmpty()) {
+            return null;
+        }
+        List<EndPoint> endPoints = new ArrayList<EndPoint>();
+        for (HostVO host: ssAHosts) {
+            endPoints.add(RemoteHostEndPoint.getHypervisorHostEndPoint(host));
+        }
+        return endPoints;
+    }
+
     private List<HostVO> listUpAndConnectingSecondaryStorageVmHost(Long dcId) {
         QueryBuilder<HostVO> sc = QueryBuilder.create(HostVO.class);
         if (dcId != null) {
@@ -333,7 +408,7 @@
         }
     }
 
-    private EndPoint getEndPointFromHostId(Long hostId) {
+    public EndPoint getEndPointFromHostId(Long hostId) {
         HostVO host = hostDao.findById(hostId);
         return RemoteHostEndPoint.getHypervisorHostEndPoint(host);
     }
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 dec9b76..9cf73e6 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
@@ -20,19 +20,22 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
-import com.cloud.agent.api.storage.OVFPropertyTO;
+import com.cloud.agent.api.to.NfsTO;
+import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.Upload;
-import com.cloud.storage.dao.TemplateOVFPropertiesDao;
-import com.cloud.storage.TemplateOVFPropertyVO;
-import com.cloud.utils.crypt.DBEncryptionUtil;
-import org.apache.commons.collections.CollectionUtils;
+import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -47,6 +50,7 @@
 import org.apache.cloudstack.framework.async.AsyncRpcContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
@@ -54,6 +58,7 @@
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.storage.endpoint.DefaultEndPointSelector;
 
+import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.storage.CreateDatadiskTemplateCommand;
 import com.cloud.agent.api.storage.DownloadAnswer;
@@ -61,23 +66,34 @@
 import com.cloud.agent.api.storage.GetDatadisksCommand;
 import com.cloud.agent.api.to.DataObjectType;
 import com.cloud.agent.api.to.DataTO;
+import com.cloud.agent.api.to.DatadiskTO;
 import com.cloud.alert.AlertManager;
+import com.cloud.configuration.Config;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.host.dao.HostDao;
+import com.cloud.secstorage.CommandExecLogDao;
+import com.cloud.secstorage.CommandExecLogVO;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.download.DownloadMonitor;
 import com.cloud.user.ResourceLimitService;
 import com.cloud.user.dao.AccountDao;
-import com.cloud.agent.api.to.DatadiskTO;
-import com.cloud.utils.net.Proxy;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.Proxy;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
 
 public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
-    private static final Logger s_logger = Logger.getLogger(BaseImageStoreDriverImpl.class);
+    private static final Logger LOGGER = Logger.getLogger(BaseImageStoreDriverImpl.class);
+
     @Inject
     protected VMTemplateDao _templateDao;
     @Inject
@@ -97,15 +113,23 @@
     @Inject
     AlertManager _alertMgr;
     @Inject
-    VMTemplateDetailsDao _templateDetailsDao;
-    @Inject
     DefaultEndPointSelector _defaultEpSelector;
     @Inject
     AccountDao _accountDao;
     @Inject
     ResourceLimitService _resourceLimitMgr;
     @Inject
-    TemplateOVFPropertiesDao templateOvfPropertiesDao;
+    DeployAsIsHelper deployAsIsHelper;
+    @Inject
+    HostDao hostDao;
+    @Inject
+    CommandExecLogDao _cmdExecLogDao;
+    @Inject
+    StorageManager storageMgr;
+    @Inject
+    protected SecondaryStorageVmDao _secStorageVmDao;
+    @Inject
+    AgentManager agentMgr;
 
     protected String _proxy = null;
 
@@ -156,63 +180,45 @@
         caller.setContext(context);
         if (data.getType() == DataObjectType.TEMPLATE) {
             caller.setCallback(caller.getTarget().createTemplateAsyncCallback(null, null));
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Downloading template to data store " + dataStore.getId());
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Downloading template to data store " + dataStore.getId());
             }
             _downloadMonitor.downloadTemplateToStorage(data, caller);
         } else if (data.getType() == DataObjectType.VOLUME) {
             caller.setCallback(caller.getTarget().createVolumeAsyncCallback(null, null));
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Downloading volume to data store " + dataStore.getId());
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("Downloading volume to data store " + dataStore.getId());
             }
             _downloadMonitor.downloadVolumeToStorage(data, caller);
         }
     }
 
-    /**
-     * Persist OVF properties as template details for template with id = templateId
-     */
-    private void persistOVFProperties(List<OVFPropertyTO> ovfProperties, long templateId) {
-        List<TemplateOVFPropertyVO> listToPersist = new ArrayList<>();
-        for (OVFPropertyTO property : ovfProperties) {
-            if (!templateOvfPropertiesDao.existsOption(templateId, property.getKey())) {
-                TemplateOVFPropertyVO option = new TemplateOVFPropertyVO(templateId, property.getKey(), property.getType(),
-                        property.getValue(), property.getQualifiers(), property.isUserConfigurable(),
-                        property.getLabel(), property.getDescription(), property.isPassword());
-                if (property.isPassword()) {
-                    String encryptedPassword = DBEncryptionUtil.encrypt(property.getValue());
-                    option.setValue(encryptedPassword);
-                }
-                listToPersist.add(option);
-            }
-        }
-        if (CollectionUtils.isNotEmpty(listToPersist)) {
-            s_logger.debug("Persisting " + listToPersist.size() + " OVF properties for template " + templateId);
-            templateOvfPropertiesDao.saveOptions(listToPersist);
-        }
-    }
-
     protected Void createTemplateAsyncCallback(AsyncCallbackDispatcher<? extends BaseImageStoreDriverImpl, DownloadAnswer> callback,
-        CreateContext<CreateCmdResult> context) {
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Performing image store createTemplate async callback");
+                                               CreateContext<CreateCmdResult> context) {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Performing image store createTemplate async callback");
         }
         DownloadAnswer answer = callback.getResult();
         DataObject obj = context.data;
         DataStore store = obj.getDataStore();
-        List<OVFPropertyTO> ovfProperties = answer.getOvfProperties();
 
+        VMTemplateVO template = _templateDao.findById(obj.getId());
         TemplateDataStoreVO tmpltStoreVO = _templateStoreDao.findByStoreTemplate(store.getId(), obj.getId());
         if (tmpltStoreVO != null) {
             if (tmpltStoreVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
-                if (CollectionUtils.isNotEmpty(ovfProperties)) {
-                    persistOVFProperties(ovfProperties, obj.getId());
+                if (template.isDeployAsIs()) {
+                    boolean persistDeployAsIs = deployAsIsHelper.persistTemplateDeployAsIsDetails(template.getId(), answer, tmpltStoreVO);
+                    if (!persistDeployAsIs) {
+                        LOGGER.info("Failed persisting deploy-as-is template details for template " + template.getName());
+                        return null;
+                    }
                 }
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Template is already in DOWNLOADED state, ignore further incoming DownloadAnswer");
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("Template is already in DOWNLOADED state, ignore further incoming DownloadAnswer");
                 }
                 return null;
             }
+            LOGGER.info("Updating store ref entry for template " + template.getName());
             TemplateDataStoreVO updateBuilder = _templateStoreDao.createForUpdate();
             updateBuilder.setDownloadPercent(answer.getDownloadPct());
             updateBuilder.setDownloadState(answer.getDownloadStatus());
@@ -233,23 +239,20 @@
         AsyncCompletionCallback<CreateCmdResult> caller = context.getParentCallback();
 
         if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR ||
-            answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) {
+                answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) {
             CreateCmdResult result = new CreateCmdResult(null, null);
             result.setSuccess(false);
             result.setResult(answer.getErrorString());
             caller.complete(result);
             String msg = "Failed to register template: " + obj.getUuid() + " with error: " + answer.getErrorString();
             _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_UPLOAD_FAILED, _vmTemplateZoneDao.listByTemplateId(obj.getId()).get(0).getZoneId(), null, msg, msg);
-            s_logger.error(msg);
+            LOGGER.error(msg);
         } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
             if (answer.getCheckSum() != null) {
                 VMTemplateVO templateDaoBuilder = _templateDao.createForUpdate();
                 templateDaoBuilder.setChecksum(answer.getCheckSum());
                 _templateDao.update(obj.getId(), templateDaoBuilder);
             }
-            if (CollectionUtils.isNotEmpty(ovfProperties)) {
-                persistOVFProperties(ovfProperties, obj.getId());
-            }
 
             CreateCmdResult result = new CreateCmdResult(null, null);
             caller.complete(result);
@@ -258,7 +261,7 @@
     }
 
     protected Void
-        createVolumeAsyncCallback(AsyncCallbackDispatcher<? extends BaseImageStoreDriverImpl, DownloadAnswer> callback, CreateContext<CreateCmdResult> context) {
+    createVolumeAsyncCallback(AsyncCallbackDispatcher<? extends BaseImageStoreDriverImpl, DownloadAnswer> callback, CreateContext<CreateCmdResult> context) {
         DownloadAnswer answer = callback.getResult();
         DataObject obj = context.data;
         DataStore store = obj.getDataStore();
@@ -266,8 +269,8 @@
         VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(store.getId(), obj.getId());
         if (volStoreVO != null) {
             if (volStoreVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Volume is already in DOWNLOADED state, ignore further incoming DownloadAnswer");
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug("Volume is already in DOWNLOADED state, ignore further incoming DownloadAnswer");
                 }
                 return null;
             }
@@ -291,7 +294,7 @@
         AsyncCompletionCallback<CreateCmdResult> caller = context.getParentCallback();
 
         if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR ||
-            answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) {
+                answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) {
             CreateCmdResult result = new CreateCmdResult(null, null);
             result.setSuccess(false);
             result.setResult(answer.getErrorString());
@@ -299,7 +302,7 @@
             String msg = "Failed to upload volume: " + obj.getUuid() + " with error: " + answer.getErrorString();
             _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_UPLOAD_FAILED,
                     (volStoreVO == null ? -1L : volStoreVO.getZoneId()), null, msg, msg);
-            s_logger.error(msg);
+            LOGGER.error(msg);
         } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
             CreateCmdResult result = new CreateCmdResult(null, null);
             caller.complete(result);
@@ -316,7 +319,7 @@
             Answer answer = null;
             if (ep == null) {
                 String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
-                s_logger.error(errMsg);
+                LOGGER.error(errMsg);
                 answer = new Answer(cmd, false, errMsg);
             } else {
                 answer = ep.sendMessage(cmd);
@@ -325,7 +328,7 @@
                 result.setResult(answer.getDetails());
             }
         } catch (Exception ex) {
-            s_logger.debug("Unable to destoy " + data.getType().toString() + ": " + data.getId(), ex);
+            LOGGER.debug("Unable to destoy " + data.getType().toString() + ": " + data.getId(), ex);
             result.setResult(ex.toString());
         }
         callback.complete(result);
@@ -333,10 +336,78 @@
 
     @Override
     public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
+        if (!canCopy(srcdata, destData)) {
+            return;
+        }
+
+        if ((srcdata.getType() == DataObjectType.TEMPLATE && destData.getType() == DataObjectType.TEMPLATE) ||
+                (srcdata.getType() == DataObjectType.SNAPSHOT && destData.getType() == DataObjectType.SNAPSHOT) ||
+                (srcdata.getType() == DataObjectType.VOLUME && destData.getType() == DataObjectType.VOLUME)) {
+
+            int nMaxExecutionMinutes = NumbersUtil.parseInt(configDao.getValue(Config.SecStorageCmdExecutionTimeMax.key()), 30);
+            CopyCommand cmd = new CopyCommand(srcdata.getTO(), destData.getTO(), nMaxExecutionMinutes * 60 * 1000, VirtualMachineManager.ExecuteInSequence.value());
+            Answer answer = null;
+
+            // Select host endpoint such that the load is balanced out
+            List<EndPoint> eps = _epSelector.findAllEndpointsForScope(srcdata.getDataStore());
+            if (eps == null || eps.isEmpty()) {
+                String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+                LOGGER.error(errMsg);
+                answer = new Answer(cmd, false, errMsg);
+            } else {
+                // select endpoint with least number of commands running on them
+                answer = sendToLeastBusyEndpoint(eps, cmd);
+            }
+            CopyCommandResult result = new CopyCommandResult("", answer);
+            callback.complete(result);
+        }
+    }
+
+    private Answer sendToLeastBusyEndpoint(List<EndPoint> eps, CopyCommand cmd) {
+        Answer answer = null;
+        EndPoint endPoint = null;
+        List<Long> epIds = ssvmWithLeastMigrateJobs();
+
+        if (epIds.isEmpty()) {
+            Collections.shuffle(eps);
+            endPoint = eps.get(0);
+        } else {
+            List<EndPoint> remainingEps = eps.stream().filter(ep -> !epIds.contains(ep.getId())).collect(Collectors.toList());
+            if (!remainingEps.isEmpty()) {
+                Collections.shuffle(remainingEps);
+                endPoint = remainingEps.get(0);
+            } else {
+                endPoint = _defaultEpSelector.getEndPointFromHostId(epIds.get(0));
+            }
+        }
+        CommandExecLogVO execLog = new CommandExecLogVO(endPoint.getId(), _secStorageVmDao.findByInstanceName(hostDao.findById(endPoint.getId()).getName()).getId(), "DataMigrationCommand", 1);
+        Long cmdExecId = _cmdExecLogDao.persist(execLog).getId();
+        String errMsg = null;
+        try {
+            answer = agentMgr.send(endPoint.getId(), cmd);
+            answer.setContextParam("cmd", cmdExecId.toString());
+            return answer;
+        }  catch (AgentUnavailableException e) {
+            errMsg = e.toString();
+            LOGGER.debug("Failed to send command, due to Agent:" + endPoint.getId() + ", " + e.toString());
+        } catch (OperationTimedoutException e) {
+            errMsg = e.toString();
+            LOGGER.debug("Failed to send command, due to Agent:" + endPoint.getId() + ", " + e.toString());
+        }
+        throw new CloudRuntimeException("Failed to send command, due to Agent:" + endPoint.getId() + ", " + errMsg);
     }
 
     @Override
     public boolean canCopy(DataObject srcData, DataObject destData) {
+        DataStore srcStore = srcData.getDataStore();
+        DataStore destStore = destData.getDataStore();
+        if ((srcData.getDataStore().getTO() instanceof NfsTO && destData.getDataStore().getTO() instanceof NfsTO) &&
+                (srcStore.getRole() == DataStoreRole.Image && destStore.getRole() == DataStoreRole.Image) &&
+                ((srcData.getType() == DataObjectType.TEMPLATE && destData.getType() == DataObjectType.TEMPLATE) ||
+                        (srcData.getType() == DataObjectType.SNAPSHOT && destData.getType() == DataObjectType.SNAPSHOT) ||
+                        (srcData.getType() == DataObjectType.VOLUME && destData.getType() == DataObjectType.VOLUME))) {
+            return true;
+        }
         return false;
     }
 
@@ -349,18 +420,18 @@
     }
 
     @Override
-    public List<DatadiskTO> getDataDiskTemplates(DataObject obj) {
+    public List<DatadiskTO> getDataDiskTemplates(DataObject obj, String configurationId) {
         List<DatadiskTO> dataDiskDetails = new ArrayList<DatadiskTO>();
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Get the data disks present in the OVA template");
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Get the data disks present in the OVA template");
         }
         DataStore store = obj.getDataStore();
-        GetDatadisksCommand cmd = new GetDatadisksCommand(obj.getTO());
+        GetDatadisksCommand cmd = new GetDatadisksCommand(obj.getTO(), configurationId);
         EndPoint ep = _defaultEpSelector.select(store);
         Answer answer = null;
         if (ep == null) {
             String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
-            s_logger.error(errMsg);
+            LOGGER.error(errMsg);
             answer = new Answer(cmd, false, errMsg);
         } else {
             answer = ep.sendMessage(cmd);
@@ -379,14 +450,14 @@
     public Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, boolean bootable, long fileSize, AsyncCompletionCallback<CreateCmdResult> callback) {
         Answer answer = null;
         String errMsg = null;
-        if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Create Datadisk template: " + dataDiskTemplate.getId());
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Create Datadisk template: " + dataDiskTemplate.getId());
         }
         CreateDatadiskTemplateCommand cmd = new CreateDatadiskTemplateCommand(dataDiskTemplate.getTO(), path, diskId, fileSize, bootable);
         EndPoint ep = _defaultEpSelector.select(dataDiskTemplate.getDataStore());
         if (ep == null) {
             errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
-            s_logger.error(errMsg);
+            LOGGER.error(errMsg);
             answer = new Answer(cmd, false, errMsg);
         } else {
             answer = ep.sendMessage(cmd);
@@ -399,4 +470,27 @@
         callback.complete(result);
         return null;
     }
+
+    private Integer getCopyCmdsCountToSpecificSSVM(Long ssvmId) {
+        return _cmdExecLogDao.getCopyCmdCountForSSVM(ssvmId);
+    }
+
+    private List<Long> ssvmWithLeastMigrateJobs() {
+        LOGGER.debug("Picking ssvm from the pool with least commands running on it");
+        String query = "select host_id, count(*) from cmd_exec_log group by host_id order by 2;";
+        TransactionLegacy txn = TransactionLegacy.currentTxn();
+
+        List<Long> result = new ArrayList<Long>();
+        PreparedStatement pstmt = null;
+        try {
+            pstmt = txn.prepareAutoCloseStatement(query);
+            ResultSet rs = pstmt.executeQuery();
+            while (rs.next()) {
+                result.add((long) rs.getInt(1));
+            }
+        } catch (SQLException e) {
+            LOGGER.debug("SQLException caught", e);
+        }
+        return result;
+    }
 }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/ImageStoreDriver.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/ImageStoreDriver.java
index 70f40f6..29071d8 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/ImageStoreDriver.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/ImageStoreDriver.java
@@ -37,7 +37,7 @@
 
     void deleteEntityExtractUrl(DataStore store, String installPath, String url, Upload.Type entityType);
 
-    List<DatadiskTO> getDataDiskTemplates(DataObject obj);
+    List<DatadiskTO> getDataDiskTemplates(DataObject obj, String configurationId);
 
     Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, boolean bootable, long fileSize, AsyncCompletionCallback<CreateCmdResult> callback);
 }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
index c7aad89..aea7922 100755
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java
@@ -36,12 +36,11 @@
      * @param imgStoreId store id
      * @return "secstorage.nfs.version" associated value for imgStoreId in image_store_details table if exists, null if not
      */
-    protected Integer getNfsVersion(long imgStoreId){
+    protected String getNfsVersion(long imgStoreId){
         Map<String, String> imgStoreDetails = _imageStoreDetailsDao.getDetails(imgStoreId);
         String nfsVersionKey = CapacityManager.ImageStoreNFSVersion.key();
         if (imgStoreDetails != null && imgStoreDetails.containsKey(nfsVersionKey)){
-            String nfsVersionParam = imgStoreDetails.get(nfsVersionKey);
-            return (nfsVersionParam != null ? Integer.valueOf(nfsVersionParam) : null);
+            return imgStoreDetails.get(nfsVersionKey);
         }
         return null;
     }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
deleted file mode 100644
index b027c42..0000000
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
+++ /dev/null
@@ -1,314 +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.
- */
-package org.apache.cloudstack.storage.image;
-
-import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo;
-import org.apache.cloudstack.storage.image.datastore.ImageStoreInfo;
-
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.Storage.TemplateType;
-import com.cloud.template.VirtualMachineTemplate;
-
-public class TemplateEntityImpl implements TemplateEntity {
-    protected TemplateInfo templateInfo;
-
-    @Override
-    public State getState() {
-        return templateInfo.getState();
-    }
-
-    public TemplateEntityImpl(TemplateInfo templateInfo) {
-        this.templateInfo = templateInfo;
-    }
-
-    public ImageStoreInfo getImageDataStore() {
-        return (ImageStoreInfo)templateInfo.getDataStore();
-    }
-
-    public long getImageDataStoreId() {
-        return getImageDataStore().getImageStoreId();
-    }
-
-    public TemplateInfo getTemplateInfo() {
-        return templateInfo;
-    }
-
-    @Override
-    public String getUuid() {
-        return templateInfo.getUuid();
-    }
-
-    @Override
-    public long getId() {
-        return templateInfo.getId();
-    }
-
-    public String getExternalId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getCurrentState() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getDesiredState() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Date getCreatedTime() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Date getLastUpdatedTime() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getOwner() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Map<String, String> getDetails() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isDynamicallyScalable() {
-        return false;
-    }
-
-    @Override
-    public void addDetail(String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void delDetail(String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void updateDetail(String name, String value) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public List<Method> getApplicableActions() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isFeatured() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean isPublicTemplate() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean isExtractable() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public String getName() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ImageFormat getFormat() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isRequiresHvm() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public String getDisplayText() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public boolean isEnablePassword() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean isEnableSshKey() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean isCrossZones() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public Date getCreated() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public long getGuestOSId() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public boolean isBootable() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public TemplateType getTemplateType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public HypervisorType getHypervisorType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public int getBits() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public String getUniqueName() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getUrl() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getChecksum() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public Long getSourceTemplateId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getTemplateTag() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public long getAccountId() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public long getDomainId() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public long getPhysicalSize() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public long getVirtualSize() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public Class<?> getEntityType() {
-        return VirtualMachineTemplate.class;
-    }
-
-    @Override
-    public long getUpdatedCount() {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public void incrUpdatedCount() {
-        // TODO Auto-generated method stub
-    }
-
-    @Override
-    public Date getUpdated() {
-        return null;
-    }
-
-    @Override
-    public Long getParentTemplateId() {
-        return null;
-    }
-}
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
index 01f2100..7e2f720 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/datastore/ImageStoreProviderManager.java
@@ -36,6 +36,8 @@
 
     List<DataStore> listImageStoresByScope(ZoneScope scope);
 
+    List<DataStore> listImageStoresByScopeExcludingReadOnly(ZoneScope scope);
+
     List<DataStore> listImageStoreByProvider(String provider);
 
     List<DataStore> listImageCacheStores(Scope scope);
@@ -76,4 +78,6 @@
      * @return            the list of DataStore which have free capacity
      */
     List<DataStore> listImageStoresWithFreeCapacity(List<DataStore> imageStores);
+
+    List<DataStore> orderImageStoresOnFreeCapacity(List<DataStore> imageStores);
 }
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index 151b9ba..4e5210d 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -27,8 +27,6 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.storage.DataStoreRole;
-import com.cloud.storage.SnapshotVO;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
@@ -39,6 +37,8 @@
 import org.springframework.stereotype.Component;
 
 import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.Filter;
@@ -65,6 +65,7 @@
     private SearchBuilder<SnapshotDataStoreVO> stateSearch;
     private SearchBuilder<SnapshotDataStoreVO> parentSnapshotSearch;
     private SearchBuilder<SnapshotVO> snapshotVOSearch;
+    private SearchBuilder<SnapshotDataStoreVO> snapshotCreatedSearch;
 
     public static ArrayList<Hypervisor.HypervisorType> hypervisorsSupportingSnapshotsChaining = new ArrayList<Hypervisor.HypervisorType>();
 
@@ -158,6 +159,11 @@
         snapshotVOSearch.and("volume_id", snapshotVOSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
         snapshotVOSearch.done();
 
+        snapshotCreatedSearch = createSearchBuilder();
+        snapshotCreatedSearch.and("store_id", snapshotCreatedSearch.entity().getDataStoreId(), Op.EQ);
+        snapshotCreatedSearch.and("created",  snapshotCreatedSearch.entity().getCreated(), Op.BETWEEN);
+        snapshotCreatedSearch.done();
+
         return true;
     }
 
@@ -335,6 +341,15 @@
     }
 
     @Override
+    public SnapshotDataStoreVO findBySourceSnapshot(long snapshotId, DataStoreRole role) {
+        SearchCriteria<SnapshotDataStoreVO> sc = snapshotSearch.create();
+        sc.setParameters("snapshot_id", snapshotId);
+        sc.setParameters("store_role", role);
+        sc.setParameters("state", State.Migrating);
+        return findOneBy(sc);
+    }
+
+    @Override
     public List<SnapshotDataStoreVO> listAllByVolumeAndDataStore(long volumeId, DataStoreRole role) {
         SearchCriteria<SnapshotDataStoreVO> sc = volumeSearch.create();
         sc.setParameters("volume_id", volumeId);
@@ -462,6 +477,15 @@
     }
 
     @Override
+    public List<SnapshotDataStoreVO> findSnapshots(Long storeId, Date start, Date end) {
+        SearchCriteria<SnapshotDataStoreVO> sc = snapshotCreatedSearch.create();
+        sc.setParameters("store_id", storeId);
+        if (start != null && end != null) {
+            sc.setParameters("created", start, end);
+        }
+        return search(sc, null);
+    }
+
     public SnapshotDataStoreVO findDestroyedReferenceBySnapshot(long snapshotId, DataStoreRole role) {
         SearchCriteria<SnapshotDataStoreVO> sc = snapshotSearch.create();
         sc.setParameters("snapshot_id", snapshotId);
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 2372e84..ea53825 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -97,6 +97,7 @@
 
         templateSearch = createSearchBuilder();
         templateSearch.and("template_id", templateSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
+        templateSearch.and("download_state", templateSearch.entity().getDownloadState(), SearchCriteria.Op.NEQ);
         templateSearch.and("destroyed", templateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
         templateSearch.done();
 
@@ -143,6 +144,7 @@
         downloadTemplateSearch.and("download_url", downloadTemplateSearch.entity().getExtractUrl(), Op.NNULL);
         downloadTemplateSearch.and("download_url_created", downloadTemplateSearch.entity().getExtractUrlCreated(), Op.NNULL);
         downloadTemplateSearch.and("destroyed", downloadTemplateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+        downloadTemplateSearch.and("store_id", downloadTemplateSearch.entity().getDataStoreId(), Op.EQ);
         downloadTemplateSearch.done();
 
         directDownloadTemplateSeach = createSearchBuilder();
@@ -419,6 +421,15 @@
     }
 
     @Override
+    public List<TemplateDataStoreVO> listByTemplateNotBypassed(long templateId) {
+        SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
+        sc.setParameters("template_id", templateId);
+        sc.setParameters("download_state", Status.BYPASSED);
+        sc.setParameters("destroyed", false);
+        return search(sc, null);
+    }
+
+    @Override
     public TemplateDataStoreVO findByTemplateZone(long templateId, Long zoneId, DataStoreRole role) {
         // get all elgible image stores
         List<DataStore> imgStores = null;
@@ -534,6 +545,14 @@
     }
 
     @Override
+    public List<TemplateDataStoreVO> listTemplateDownloadUrlsByStoreId(long storeId) {
+        SearchCriteria<TemplateDataStoreVO> sc = downloadTemplateSearch.create();
+        sc.setParameters("destroyed", false);
+        sc.setParameters("store_id", storeId);
+        return listBy(sc);
+    }
+
+    @Override
     public void expireDnldUrlsForZone(Long dcId){
         TransactionLegacy txn = TransactionLegacy.currentTxn();
         PreparedStatement pstmt = null;
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 8258042..34854d5 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -25,6 +25,7 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.db.Filter;
 import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -103,6 +104,7 @@
         downloadVolumeSearch.and("download_url", downloadVolumeSearch.entity().getExtractUrl(), Op.NNULL);
         downloadVolumeSearch.and("download_url_created", downloadVolumeSearch.entity().getExtractUrlCreated(), Op.NNULL);
         downloadVolumeSearch.and("destroyed", downloadVolumeSearch.entity().getDestroyed(), SearchCriteria.Op.EQ);
+        downloadVolumeSearch.and("zone_id", downloadVolumeSearch.entity().getZoneId(), Op.EQ);
         downloadVolumeSearch.done();
 
         uploadVolumeSearch = createSearchBuilder();
@@ -213,7 +215,13 @@
         SearchCriteria<VolumeDataStoreVO> sc = volumeSearch.create();
         sc.setParameters("volume_id", volumeId);
         sc.setParameters("destroyed", false);
-        return findOneBy(sc);
+        return findVolumeby(sc);
+    }
+
+    private VolumeDataStoreVO findVolumeby(SearchCriteria<VolumeDataStoreVO> sc) {
+        Filter filter = new Filter(VolumeDataStoreVO.class, "created", false, 0L, 1L);
+        List<VolumeDataStoreVO> results = searchIncludingRemoved(sc, filter, null, false);
+        return results.size() == 0 ? null : results.get(0);
     }
 
     @Override
@@ -317,6 +325,14 @@
     }
 
     @Override
+    public List<VolumeDataStoreVO> listVolumeDownloadUrlsByZoneId(long zoneId) {
+        SearchCriteria<VolumeDataStoreVO> sc = downloadVolumeSearch.create();
+        sc.setParameters("destroyed", false);
+        sc.setParameters("zone_id", zoneId);
+        return listBy(sc);
+    }
+
+    @Override
     public List<VolumeDataStoreVO> listUploadedVolumesByStoreId(long id) {
         SearchCriteria<VolumeDataStoreVO> sc = uploadVolumeSearch.create();
         sc.setParameters("store_id", id);
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelperImpl.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelperImpl.java
new file mode 100644
index 0000000..6d05af3
--- /dev/null
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelperImpl.java
@@ -0,0 +1,376 @@
+/*
+ * 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.image.deployasis;
+
+import com.cloud.agent.api.storage.DownloadAnswer;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.OVFInformationTO;
+import com.cloud.agent.api.to.deployasis.OVFConfigurationTO;
+import com.cloud.agent.api.to.deployasis.OVFEulaSectionTO;
+import com.cloud.agent.api.to.deployasis.OVFPropertyTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareItemTO;
+import com.cloud.agent.api.to.deployasis.OVFVirtualHardwareSectionTO;
+import com.cloud.agent.api.to.deployasis.TemplateDeployAsIsInformationTO;
+import com.cloud.deployasis.DeployAsIsConstants;
+import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
+import com.cloud.deployasis.UserVmDeployAsIsDetailVO;
+import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
+import com.cloud.deployasis.dao.UserVmDeployAsIsDetailsDao;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.GuestOSCategoryVO;
+import com.cloud.storage.GuestOSHypervisorVO;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.GuestOSCategoryDao;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.GuestOSHypervisorDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.utils.Pair;
+import com.cloud.utils.compression.CompressionUtil;
+import com.cloud.utils.crypt.DBEncryptionUtil;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.VirtualMachineProfile;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.cloud.agent.api.to.deployasis.OVFNetworkTO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State.Failed;
+
+@Component
+public class DeployAsIsHelperImpl implements DeployAsIsHelper {
+
+    private static final Logger LOGGER = Logger.getLogger(DeployAsIsHelperImpl.class);
+    private static Gson gson;
+
+    @Inject
+    private TemplateDeployAsIsDetailsDao templateDeployAsIsDetailsDao;
+    @Inject
+    private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
+    @Inject
+    private PrimaryDataStoreDao storagePoolDao;
+    @Inject
+    private VMTemplatePoolDao templateStoragePoolDao;
+    @Inject
+    private VMTemplateDao templateDao;
+    @Inject
+    private GuestOSDao guestOSDao;
+    @Inject
+    private GuestOSHypervisorDao guestOSHypervisorDao;
+    @Inject
+    private GuestOSCategoryDao guestOSCategoryDao;
+    @Inject
+    private TemplateDataStoreDao templateDataStoreDao;
+
+    static {
+        GsonBuilder builder = new GsonBuilder();
+        builder.disableHtmlEscaping();
+        gson = builder.create();
+    }
+
+    public boolean persistTemplateDeployAsIsDetails(long templateId, DownloadAnswer answer, TemplateDataStoreVO tmpltStoreVO) {
+        try {
+            OVFInformationTO ovfInformationTO = answer.getOvfInformationTO();
+            if (ovfInformationTO != null) {
+                List<OVFPropertyTO> ovfProperties = ovfInformationTO.getProperties();
+                List<OVFNetworkTO> networkRequirements = ovfInformationTO.getNetworks();
+                OVFVirtualHardwareSectionTO ovfHardwareSection = ovfInformationTO.getHardwareSection();
+                List<OVFEulaSectionTO> eulaSections = ovfInformationTO.getEulaSections();
+                Pair<String, String> guestOsInfo = ovfInformationTO.getGuestOsInfo();
+
+                if (CollectionUtils.isNotEmpty(ovfProperties)) {
+                    persistTemplateDeployAsIsInformationTOList(templateId, ovfProperties);
+                }
+                if (CollectionUtils.isNotEmpty(networkRequirements)) {
+                    persistTemplateDeployAsIsInformationTOList(templateId, networkRequirements);
+                }
+                if (CollectionUtils.isNotEmpty(eulaSections)) {
+                    persistTemplateDeployAsIsInformationTOList(templateId, eulaSections);
+                }
+                String minimumHardwareVersion = null;
+                if (ovfHardwareSection != null) {
+                    if (CollectionUtils.isNotEmpty(ovfHardwareSection.getConfigurations())) {
+                        persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getConfigurations());
+                    }
+                    if (CollectionUtils.isNotEmpty(ovfHardwareSection.getCommonHardwareItems())) {
+                        persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getCommonHardwareItems());
+                    }
+                    minimumHardwareVersion = ovfHardwareSection.getMinimiumHardwareVersion();
+                }
+                if (guestOsInfo != null) {
+                    String osType = guestOsInfo.first();
+                    String osDescription = guestOsInfo.second();
+                    LOGGER.info("Guest OS information retrieved from the template: " + osType + " - " + osDescription);
+                    handleGuestOsFromOVFDescriptor(templateId, osType, osDescription, minimumHardwareVersion);
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.error("Error persisting deploy-as-is details for template " + templateId, e);
+            tmpltStoreVO.setErrorString(e.getMessage());
+            tmpltStoreVO.setState(Failed);
+            tmpltStoreVO.setDownloadState(VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR);
+            templateDataStoreDao.update(tmpltStoreVO.getId(), tmpltStoreVO);
+            return false;
+        }
+        LOGGER.info("Successfully persisted deploy-as-is details for template " + templateId);
+        return true;
+    }
+
+    /**
+     * Returns the mapped guest OS from the OVF file of the template to the CloudStack database OS ID
+     */
+    public Long retrieveTemplateGuestOsIdFromGuestOsInfo(long templateId, String guestOsType, String guestOsDescription,
+                                                         String minimumHardwareVersion) {
+        VMTemplateVO template = templateDao.findById(templateId);
+        Hypervisor.HypervisorType hypervisor = template.getHypervisorType();
+        if (hypervisor != Hypervisor.HypervisorType.VMware) {
+            return null;
+        }
+
+        String minimumHypervisorVersion = getMinimumSupportedHypervisorVersionForHardwareVersion(minimumHardwareVersion);
+        LOGGER.info("Minimum hardware version " + minimumHardwareVersion + " matched to hypervisor version " + minimumHypervisorVersion + ". " +
+                "Checking guest OS supporting this version");
+
+        List<GuestOSHypervisorVO> guestOsMappings = guestOSHypervisorDao.listByOsNameAndHypervisorMinimumVersion(guestOsType,
+                hypervisor.toString(), minimumHypervisorVersion);
+
+        if (CollectionUtils.isNotEmpty(guestOsMappings)) {
+            Long guestOsId = null;
+            if (guestOsMappings.size() == 1) {
+                GuestOSHypervisorVO mapping = guestOsMappings.get(0);
+                guestOsId = mapping.getGuestOsId();
+            } else {
+                if (!StringUtils.isEmpty(guestOsDescription)) {
+                    for (GuestOSHypervisorVO guestOSHypervisorVO : guestOsMappings) {
+                        GuestOSVO guestOSVO = guestOSDao.findById(guestOSHypervisorVO.getGuestOsId());
+                        if (guestOsDescription.equalsIgnoreCase(guestOSVO.getDisplayName())) {
+                            guestOsId = guestOSHypervisorVO.getGuestOsId();
+                            break;
+                        }
+                    }
+                }
+                if (null == guestOsId) {
+                    GuestOSHypervisorVO mapping = guestOsMappings.get(guestOsMappings.size()-1);
+                    guestOsId = mapping.getGuestOsId();
+                }
+            }
+            return guestOsId;
+        } else {
+            throw new CloudRuntimeException("Did not find a guest OS with type " + guestOsType);
+        }
+    }
+
+    /**
+     * Handle the guest OS read from the OVF and try to match it to an existing guest OS in DB.
+     * If the guest OS cannot be mapped to an existing guest OS in DB, then create it and create support for hypervisor versions.
+     * Roll back actions in case of unexpected errors
+     */
+    private void handleGuestOsFromOVFDescriptor(long templateId, String guestOsType, String guestOsDescription,
+                                                String minimumHardwareVersion) {
+        Long guestOsId = retrieveTemplateGuestOsIdFromGuestOsInfo(templateId, guestOsType, guestOsDescription, minimumHardwareVersion);
+        if (guestOsId != null) {
+            LOGGER.info("Updating deploy-as-is template guest OS to " + guestOsType);
+            VMTemplateVO template = templateDao.findById(templateId);
+            updateTemplateGuestOsId(template, guestOsId);
+        }
+    }
+
+    /**
+     * Updates the deploy-as-is template guest OS doing:
+     * - Create a new guest OS with the guest OS description parsed from the OVF
+     * - Create mappings for the new guest OS and supported hypervisor versions
+     * - Update the template guest OS ID to the new guest OS ID
+     */
+    private void updateDeployAsIsTemplateToNewGuestOs(VMTemplateVO template, String guestOsType, String guestOsDescription,
+                                                      Hypervisor.HypervisorType hypervisor, Collection<String> hypervisorVersions) {
+        GuestOSVO newGuestOs = createGuestOsEntry(guestOsDescription);
+        for (String hypervisorVersion : hypervisorVersions) {
+            LOGGER.info(String.format("Adding a new guest OS mapping for hypervisor: %s version: %s and " +
+                    "guest OS: %s", hypervisor.toString(), hypervisorVersion, guestOsType));
+            createGuestOsHypervisorMapping(newGuestOs.getId(), guestOsType, hypervisor.toString(), hypervisorVersion);
+        }
+        updateTemplateGuestOsId(template, newGuestOs.getId());
+    }
+
+    private void updateTemplateGuestOsId(VMTemplateVO template, long guestOsId) {
+        template.setGuestOSId(guestOsId);
+        templateDao.update(template.getId(), template);
+    }
+
+    /**
+     * Create a new entry on guest_os_hypervisor
+     */
+    private void createGuestOsHypervisorMapping(long guestOsId, String guestOsType, String hypervisorType, String hypervisorVersion) {
+        GuestOSHypervisorVO mappingVO = new GuestOSHypervisorVO();
+        mappingVO.setGuestOsId(guestOsId);
+        mappingVO.setHypervisorType(hypervisorType);
+        mappingVO.setHypervisorVersion(hypervisorVersion);
+        mappingVO.setGuestOsName(guestOsType);
+        guestOSHypervisorDao.persist(mappingVO);
+    }
+
+    /**
+     * Create new guest OS entry with category 'Other'
+     */
+    private GuestOSVO createGuestOsEntry(String guestOsDescription) {
+        GuestOSCategoryVO categoryVO = guestOSCategoryDao.findByCategoryName("Other");
+        long categoryId = categoryVO != null ? categoryVO.getId() : 7L;
+        GuestOSVO guestOSVO = new GuestOSVO();
+        guestOSVO.setDisplayName(guestOsDescription);
+        guestOSVO.setCategoryId(categoryId);
+        return guestOSDao.persist(guestOSVO);
+    }
+
+    /**
+     * Minimum VMware hosts supported version is 6.0
+     */
+    protected String getMinimumSupportedHypervisorVersionForHardwareVersion(String hardwareVersion) {
+        // From https://kb.vmware.com/s/article/1003746 and https://kb.vmware.com/s/article/2007240
+        String hypervisorVersion = "default";
+        if (StringUtils.isBlank(hardwareVersion)) {
+            return hypervisorVersion;
+        }
+        String hwVersion = hardwareVersion.replace("vmx-", "");
+        try {
+            int hwVersionNumber = Integer.parseInt(hwVersion);
+            if (hwVersionNumber <= 11) {
+                hypervisorVersion = "6.0";
+            } else if (hwVersionNumber == 13) {
+                hypervisorVersion = "6.5";
+            } else if (hwVersionNumber >= 14) {
+                hypervisorVersion = "6.7";
+            }
+        } catch (NumberFormatException e) {
+            LOGGER.error("Cannot parse hardware version " + hwVersion + " to integer. Using default hypervisor version", e);
+        }
+        return hypervisorVersion;
+    }
+
+    @Override
+    public Map<String, String> getVirtualMachineDeployAsIsProperties(VirtualMachineProfile vm) {
+        Map<String, String> map = new HashMap<>();
+        List<UserVmDeployAsIsDetailVO> details = userVmDeployAsIsDetailsDao.listDetails(vm.getId());
+        if (CollectionUtils.isNotEmpty(details)) {
+            for (UserVmDeployAsIsDetailVO detail : details) {
+                OVFPropertyTO property = templateDeployAsIsDetailsDao.findPropertyByTemplateAndKey(vm.getTemplateId(), detail.getName());
+                String value = property.isPassword() ? DBEncryptionUtil.decrypt(detail.getValue()) : detail.getValue();
+                map.put(detail.getName(), value);
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public Map<Integer, String> getAllocatedVirtualMachineNicsAdapterMapping(VirtualMachineProfile vm, NicTO[] nics) {
+        Map<Integer, String> map = new HashMap<>();
+        List<OVFNetworkTO> networks = templateDeployAsIsDetailsDao.listNetworkRequirementsByTemplateId(vm.getTemplateId());
+        if (ArrayUtils.isNotEmpty(nics)) {
+            if (nics.length != networks.size()) {
+                String msg = "Different number of networks provided vs networks defined in deploy-as-is template";
+                LOGGER.error(msg);
+                return map;
+            }
+            for (int i = 0; i < nics.length; i++) {
+                // The nic Adapter is defined on the resource sub type
+                map.put(nics[i].getDeviceId(), networks.get(i).getResourceSubType());
+            }
+        }
+        return map;
+    }
+
+    private void persistTemplateDeployAsIsInformationTOList(long templateId,
+                                                            List<? extends TemplateDeployAsIsInformationTO> informationTOList) {
+        for (TemplateDeployAsIsInformationTO informationTO : informationTOList) {
+            String propKey = getKeyFromInformationTO(informationTO);
+            if (LOGGER.isTraceEnabled()) {
+                LOGGER.trace(String.format("Saving property %s for template %d as detail", propKey, templateId));
+            }
+            String propValue = null;
+            try {
+                propValue = getValueFromInformationTO(informationTO);
+            } catch (RuntimeException re) {
+                LOGGER.error("gson marshalling of property object fails: " + propKey,re);
+            } catch (IOException e) {
+                LOGGER.error("Could not decompress the license for template " + templateId, e);
+            }
+            saveTemplateDeployAsIsPropertyAttribute(templateId, propKey, propValue);
+        }
+    }
+
+    private String getValueFromInformationTO(TemplateDeployAsIsInformationTO informationTO) throws IOException {
+        if (informationTO instanceof OVFEulaSectionTO) {
+            CompressionUtil compressionUtil = new CompressionUtil();
+            byte[] compressedLicense = ((OVFEulaSectionTO) informationTO).getCompressedLicense();
+            return compressionUtil.decompressByteArary(compressedLicense);
+        }
+        return gson.toJson(informationTO);
+    }
+
+    private String getKeyFromInformationTO(TemplateDeployAsIsInformationTO informationTO) {
+        if (informationTO instanceof OVFPropertyTO) {
+            return DeployAsIsConstants.PROPERTY_PREFIX + ((OVFPropertyTO) informationTO).getKey();
+        } else if (informationTO instanceof OVFNetworkTO) {
+            return DeployAsIsConstants.NETWORK_PREFIX + ((OVFNetworkTO) informationTO).getName();
+        } else if (informationTO instanceof OVFConfigurationTO) {
+            return DeployAsIsConstants.CONFIGURATION_PREFIX +
+                    ((OVFConfigurationTO) informationTO).getIndex() + "-" + ((OVFConfigurationTO) informationTO).getId();
+        } else if (informationTO instanceof OVFVirtualHardwareItemTO) {
+            String key = ((OVFVirtualHardwareItemTO) informationTO).getResourceType().getName().trim().replaceAll("\\s","")
+                    + "-" + ((OVFVirtualHardwareItemTO) informationTO).getInstanceId();
+            return DeployAsIsConstants.HARDWARE_ITEM_PREFIX + key;
+        } else if (informationTO instanceof OVFEulaSectionTO) {
+            return DeployAsIsConstants.EULA_PREFIX + ((OVFEulaSectionTO) informationTO).getIndex() +
+                    "-" + ((OVFEulaSectionTO) informationTO).getInfo();
+        }
+        return null;
+    }
+
+    private void saveTemplateDeployAsIsPropertyAttribute(long templateId, String key, String value) {
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace(String.format("Saving property %s for template %d as detail", key, templateId));
+        }
+        if (templateDeployAsIsDetailsDao.findDetail(templateId,key) != null) {
+            LOGGER.debug(String.format("Detail '%s' existed for template %d, deleting.", key, templateId));
+            templateDeployAsIsDetailsDao.removeDetail(templateId,key);
+        }
+        if (LOGGER.isTraceEnabled()) {
+            LOGGER.trace(String.format("Template detail for template %d to save is '%s': '%s'", templateId, key, value));
+        }
+        TemplateDeployAsIsDetailVO detailVO = new TemplateDeployAsIsDetailVO(templateId, key, value);
+        LOGGER.debug("Persisting template details " + detailVO.getName() + " from OVF properties for template " + templateId);
+        templateDeployAsIsDetailsDao.persist(detailVO);
+    }
+
+}
diff --git a/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
index 31b5708..ac2c935 100644
--- a/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
+++ b/engine/storage/src/main/java/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
@@ -161,6 +161,13 @@
         pool.setScope(ScopeType.CLUSTER);
         pool.setStatus(StoragePoolStatus.Up);
         this.dataStoreDao.update(pool.getId(), pool);
+        if(pool.getPoolType() == StoragePoolType.DatastoreCluster && pool.getParent() == 0) {
+            List<StoragePoolVO> childDatastores = dataStoreDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+            for (StoragePoolVO child : childDatastores) {
+                child.setScope(ScopeType.CLUSTER);
+                this.dataStoreDao.update(child.getId(), child);
+            }
+        }
         return dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Primary);
     }
 
@@ -178,6 +185,13 @@
         pool.setHypervisor(hypervisor);
         pool.setStatus(StoragePoolStatus.Up);
         this.dataStoreDao.update(pool.getId(), pool);
+        if(pool.getPoolType() == StoragePoolType.DatastoreCluster && pool.getParent() == 0) {
+            List<StoragePoolVO> childDatastores = dataStoreDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+            for (StoragePoolVO child : childDatastores) {
+                child.setScope(ScopeType.ZONE);
+                this.dataStoreDao.update(child.getId(), child);
+            }
+        }
         return dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Primary);
     }
 
diff --git a/engine/storage/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml b/engine/storage/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
index 33385b5..5cecb22 100644
--- a/engine/storage/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
+++ b/engine/storage/src/main/resources/META-INF/cloudstack/core/spring-engine-storage-core-context.xml
@@ -72,4 +72,6 @@
     
     <bean id="imageStoreDetailsUtil" class="com.cloud.storage.ImageStoreDetailsUtil" />
 
+    <bean id="deployAsIsImageStoreHelper" class="org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelperImpl" />
+
 </beans>
diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml
index cab44be..38f3647 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 8196678..18a7f3c 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
@@ -218,12 +218,12 @@
     }
 
     @Override
-    public TemplateInfo getTemplate(long templateId) {
-        VMTemplateStoragePoolVO template = templatePoolDao.findByPoolTemplate(getId(), templateId);
+    public TemplateInfo getTemplate(long templateId, String configuration) {
+        VMTemplateStoragePoolVO template = templatePoolDao.findByPoolTemplate(getId(), templateId, configuration);
         if (template == null || template.getState() != ObjectInDataStoreStateMachine.State.Ready) {
             return null;
         }
-        return imageDataFactory.getTemplate(templateId, this);
+        return imageDataFactory.getTemplateOnPrimaryStorage(templateId, this, configuration);
     }
 
     @Override
@@ -241,6 +241,11 @@
         return pdsv.isManaged();
     }
 
+    @Override
+    public Long getParent() {
+        return pdsv.getParent();
+    }
+
     private boolean canCloneVolume() {
         return Boolean.valueOf(getDriver().getCapabilities().get(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_VOLUME.toString()));
     }
@@ -259,18 +264,26 @@
      */
     @Override
     public DataObject create(DataObject dataObject) {
-        return create(dataObject, true);
+        return create(dataObject, true, null);
+    }
+
+    @Override
+    public DataObject create(DataObject dataObject, String configuration) {
+        return create(dataObject, true, configuration);
     }
 
     /**
      * Please read the comment for the create(DataObject) method if you are planning on passing in "false" for createEntryInTempSpoolRef.
+     *
+     * The parameter configuration allows storing multiple configurations of the
+     * base template appliance in primary storage (VMware supported) - null by default or no configurations
      */
     @Override
-    public DataObject create(DataObject obj, boolean createEntryInTempSpoolRef) {
+    public DataObject create(DataObject obj, boolean createEntryInTempSpoolRef, String configuration) {
         // create template on primary storage
         if (obj.getType() == DataObjectType.TEMPLATE && (!isManaged() || (createEntryInTempSpoolRef && canCloneVolume()))) {
             try {
-                String templateIdPoolIdString = "templateId:" + obj.getId() + "poolId:" + getId();
+                String templateIdPoolIdString = "templateId:" + obj.getId() + "poolId:" + getId() + "conf:" + configuration;
                 VMTemplateStoragePoolVO templateStoragePoolRef;
                 GlobalLock lock = GlobalLock.getInternLock(templateIdPoolIdString);
                 if (!lock.lock(5)) {
@@ -278,20 +291,20 @@
                     return null;
                 }
                 try {
-                    templateStoragePoolRef = templatePoolDao.findByPoolTemplate(getId(), obj.getId());
+                    templateStoragePoolRef = templatePoolDao.findByPoolTemplate(getId(), obj.getId(), configuration);
                     if (templateStoragePoolRef == null) {
 
                         if (s_logger.isDebugEnabled()) {
                             s_logger.debug("Not found (" + templateIdPoolIdString + ") in template_spool_ref, persisting it");
                         }
-                        templateStoragePoolRef = new VMTemplateStoragePoolVO(getId(), obj.getId());
+                        templateStoragePoolRef = new VMTemplateStoragePoolVO(getId(), obj.getId(), configuration);
                         templateStoragePoolRef = templatePoolDao.persist(templateStoragePoolRef);
                     }
                 } catch (Throwable t) {
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("Failed to insert (" + templateIdPoolIdString + ") to template_spool_ref", t);
                     }
-                    templateStoragePoolRef = templatePoolDao.findByPoolTemplate(getId(), obj.getId());
+                    templateStoragePoolRef = templatePoolDao.findByPoolTemplate(getId(), obj.getId(), configuration);
                     if (templateStoragePoolRef == null) {
                         throw new CloudRuntimeException("Failed to create template storage pool entry");
                     } else {
@@ -316,7 +329,7 @@
             }
         }
 
-        return objectInStoreMgr.get(obj, this);
+        return objectInStoreMgr.get(obj, this, configuration);
     }
 
     @Override
diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
index 64533d5..cb4ff74 100644
--- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
+++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java
@@ -18,28 +18,34 @@
  */
 package org.apache.cloudstack.storage.datastore.provider;
 
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-
 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.agent.api.StoragePoolInfo;
 import com.cloud.alert.AlertManager;
 import com.cloud.exception.StorageConflictException;
 import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Storage;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.dao.StoragePoolHostDao;
+import com.cloud.storage.dao.StoragePoolTagsDao;
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.HypervisorHostListener;
+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.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class DefaultHostListener implements HypervisorHostListener {
     private static final Logger s_logger = Logger.getLogger(DefaultHostListener.class);
@@ -53,6 +59,10 @@
     StoragePoolHostDao storagePoolHostDao;
     @Inject
     PrimaryDataStoreDao primaryStoreDao;
+    @Inject
+    StoragePoolDetailsDao storagePoolDetailsDao;
+    @Inject
+    StoragePoolTagsDao storagePoolTagsDao;
 
     @Override
     public boolean hostAdded(long hostId) {
@@ -90,7 +100,54 @@
                 }
             }
         }
+        StoragePoolVO poolVO = this.primaryStoreDao.findById(poolId);
+        updateStoragePoolHostVOAndDetails(poolVO, hostId, mspAnswer);
 
+        if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+            for (ModifyStoragePoolAnswer childDataStoreAnswer : ((ModifyStoragePoolAnswer) answer).getDatastoreClusterChildren()) {
+                StoragePoolInfo childStoragePoolInfo = childDataStoreAnswer.getPoolInfo();
+                StoragePoolVO dataStoreVO = primaryStoreDao.findPoolByUUID(childStoragePoolInfo.getUuid());
+                if (dataStoreVO != null) {
+                    continue;
+                }
+                dataStoreVO = new StoragePoolVO();
+                dataStoreVO.setStorageProviderName(poolVO.getStorageProviderName());
+                dataStoreVO.setHostAddress(childStoragePoolInfo.getHost());
+                dataStoreVO.setPoolType(Storage.StoragePoolType.PreSetup);
+                dataStoreVO.setPath(childStoragePoolInfo.getHostPath());
+                dataStoreVO.setPort(poolVO.getPort());
+                dataStoreVO.setName(childStoragePoolInfo.getName());
+                dataStoreVO.setUuid(childStoragePoolInfo.getUuid());
+                dataStoreVO.setDataCenterId(poolVO.getDataCenterId());
+                dataStoreVO.setPodId(poolVO.getPodId());
+                dataStoreVO.setClusterId(poolVO.getClusterId());
+                dataStoreVO.setStatus(StoragePoolStatus.Up);
+                dataStoreVO.setUserInfo(poolVO.getUserInfo());
+                dataStoreVO.setManaged(poolVO.isManaged());
+                dataStoreVO.setCapacityIops(poolVO.getCapacityIops());
+                dataStoreVO.setCapacityBytes(childDataStoreAnswer.getPoolInfo().getCapacityBytes());
+                dataStoreVO.setUsedBytes(childDataStoreAnswer.getPoolInfo().getCapacityBytes() - childDataStoreAnswer.getPoolInfo().getAvailableBytes());
+                dataStoreVO.setHypervisor(poolVO.getHypervisor());
+                dataStoreVO.setScope(poolVO.getScope());
+                dataStoreVO.setParent(poolVO.getId());
+
+                Map<String, String> details = new HashMap<>();
+                if(StringUtils.isNotEmpty(childDataStoreAnswer.getPoolType())) {
+                    details.put("pool_type", childDataStoreAnswer.getPoolType());
+                }
+
+                List<String> storageTags = storagePoolTagsDao.getStoragePoolTags(poolId);
+                primaryStoreDao.persist(dataStoreVO, details, storageTags);
+
+                updateStoragePoolHostVOAndDetails(dataStoreVO, hostId, childDataStoreAnswer);
+            }
+        }
+
+        s_logger.info("Connection established between storage pool " + pool + " and host " + hostId);
+        return true;
+    }
+
+    private void updateStoragePoolHostVOAndDetails(StoragePool pool, long hostId, ModifyStoragePoolAnswer mspAnswer) {
         StoragePoolHostVO poolHost = storagePoolHostDao.findByPoolHost(pool.getId(), hostId);
         if (poolHost == null) {
             poolHost = new StoragePoolHostVO(pool.getId(), hostId, mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/"));
@@ -99,13 +156,17 @@
             poolHost.setLocalPath(mspAnswer.getPoolInfo().getLocalPath().replaceAll("//", "/"));
         }
 
-        StoragePoolVO poolVO = this.primaryStoreDao.findById(poolId);
+        StoragePoolVO poolVO = this.primaryStoreDao.findById(pool.getId());
         poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes());
         poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes());
+        if(StringUtils.isNotEmpty(mspAnswer.getPoolType())) {
+            StoragePoolDetailVO poolType = storagePoolDetailsDao.findDetail(pool.getId(), "pool_type");
+            if (poolType == null) {
+                StoragePoolDetailVO storagePoolDetailVO = new StoragePoolDetailVO(pool.getId(), "pool_type", mspAnswer.getPoolType(), false);
+                storagePoolDetailsDao.persist(storagePoolDetailVO);
+            }
+        }
         primaryStoreDao.update(pool.getId(), poolVO);
-
-        s_logger.info("Connection established between storage pool " + pool + " and host " + hostId);
-        return true;
     }
 
     @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 690a112..9750fb1 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
@@ -20,7 +20,18 @@
 
 import javax.inject.Inject;
 
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
+import com.cloud.service.dao.ServiceOfferingDetailsDao;
 import com.cloud.storage.MigrationOptions;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeDetailVO;
+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.engine.subsystem.api.storage.DataObjectInStore;
@@ -72,9 +83,21 @@
     VMInstanceDao vmInstanceDao;
     @Inject
     DiskOfferingDao diskOfferingDao;
+    @Inject
+    VMTemplateDao templateDao;
+    @Inject
+    VolumeDetailsDao volumeDetailsDao;
+    @Inject
+    ServiceOfferingDetailsDao serviceOfferingDetailsDao;
+    @Inject
+    DiskOfferingDetailsDao diskOfferingDetailsDao;
+    @Inject
+    VsphereStoragePolicyDao vsphereStoragePolicyDao;
+
     private Object payload;
     private MigrationOptions migrationOptions;
     private boolean directDownload;
+    private String vSphereStoragePolicyId;
 
     public VolumeObject() {
         _volStateMachine = Volume.State.getStateMachine();
@@ -358,7 +381,7 @@
         if (dataStore == null) {
             throw new CloudRuntimeException("datastore must be set before using this object");
         }
-        DataObjectInStore obj = objectInStoreMgr.findObject(volumeVO.getId(), DataObjectType.VOLUME, dataStore.getId(), dataStore.getRole());
+        DataObjectInStore obj = objectInStoreMgr.findObject(volumeVO.getId(), DataObjectType.VOLUME, dataStore.getId(), dataStore.getRole(), null);
         if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
             return dataStore.getUri() + "&" + EncodingType.OBJTYPE + "=" + DataObjectType.VOLUME + "&" + EncodingType.SIZE + "=" + volumeVO.getSize() + "&" +
                 EncodingType.NAME + "=" + volumeVO.getName();
@@ -393,6 +416,8 @@
                     volEvent = Volume.Event.UploadRequested;
                 } else if (event == ObjectInDataStoreStateMachine.Event.MigrationRequested) {
                     volEvent = Volume.Event.CopyRequested;
+                } else if (event == ObjectInDataStoreStateMachine.Event.MigrateDataRequested) {
+                    return;
                 }
             } else {
                 if (event == ObjectInDataStoreStateMachine.Event.CreateRequested || event == ObjectInDataStoreStateMachine.Event.CreateOnlyRequested) {
@@ -436,6 +461,18 @@
     }
 
     @Override
+    public boolean isDeployAsIs() {
+        VMTemplateVO template = templateDao.findById(getTemplateId());
+        return template != null && template.isDeployAsIs();
+    }
+
+    @Override
+    public String getDeployAsIsConfiguration() {
+        VolumeDetailVO detail = volumeDetailsDao.findDetail(getId(), VmDetailConstants.DEPLOY_AS_IS_CONFIGURATION);
+        return detail != null ? detail.getValue() : null;
+    }
+
+    @Override
     public void processEventOnly(ObjectInDataStoreStateMachine.Event event) {
         try {
             objectInStoreMgr.update(this, event);
@@ -759,6 +796,28 @@
 
     }
 
+    public String getvSphereStoragePolicyId() {
+        if (StringUtils.isEmpty(vSphereStoragePolicyId)) {
+            String storagePolicyVOid = null;
+            if (Volume.Type.ROOT == getVolumeType()) {
+                Long vmId = volumeVO.getInstanceId();
+                if (vmId != null) {
+                    VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(vmId);
+                    storagePolicyVOid = serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(),
+                            ApiConstants.STORAGE_POLICY);
+                }
+            } else {
+                storagePolicyVOid = diskOfferingDetailsDao.getDetail(volumeVO.getDiskOfferingId(),
+                        ApiConstants.STORAGE_POLICY);
+            }
+            if (storagePolicyVOid != null) {
+                VsphereStoragePolicyVO vsphereStoragePolicyVO = vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyVOid));
+                vSphereStoragePolicyId = vsphereStoragePolicyVO.getPolicyId();
+            }
+        }
+        return vSphereStoragePolicyId;
+    }
+
     @Override
     public ImageFormat getFormat() {
         return volumeVO.getFormat();
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 92c8a93..5e3493a 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
@@ -28,6 +28,8 @@
 
 import javax.inject.Inject;
 
+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.subsystem.api.storage.ChapInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
@@ -121,6 +123,8 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.VirtualMachine;
 
+import static com.cloud.storage.resource.StorageProcessor.REQUEST_TEMPLATE_RELOAD;
+
 @Component
 public class VolumeServiceImpl implements VolumeService {
     private static final Logger s_logger = Logger.getLogger(VolumeServiceImpl.class);
@@ -166,6 +170,8 @@
     private ClusterDao clusterDao;
     @Inject
     private VolumeDetailsDao _volumeDetailsDao;
+    @Inject
+    private VMTemplateDao templateDao;
 
     private final static String SNAPSHOT_ID = "SNAPSHOT_ID";
 
@@ -349,9 +355,12 @@
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Marking volume that was never created as destroyed: " + vol);
                 }
-                volDao.remove(vol.getId());
-                future.complete(result);
-                return future;
+                VMTemplateVO template = templateDao.findById(vol.getTemplateId());
+                if (template != null && !template.isDeployAsIs()) {
+                    volDao.remove(vol.getId());
+                    future.complete(result);
+                    return future;
+                }
             }
         }
         VolumeObject vo = (VolumeObject)volume;
@@ -458,7 +467,7 @@
         private final AsyncCallFuture<VolumeApiResult> _future;
 
         public ManagedCreateBaseImageContext(AsyncCompletionCallback<T> callback, VolumeInfo volumeInfo, PrimaryDataStore primaryDatastore, TemplateInfo templateInfo,
-                AsyncCallFuture<VolumeApiResult> future) {
+                                             AsyncCallFuture<VolumeApiResult> future) {
             super(callback);
 
             _volumeInfo = volumeInfo;
@@ -493,7 +502,7 @@
         long templatePoolId;
 
         public CreateBaseImageContext(AsyncCompletionCallback<T> callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo srcTemplate, AsyncCallFuture<VolumeApiResult> future,
-                DataObject destObj, long templatePoolId) {
+                                      DataObject destObj, long templatePoolId) {
             super(callback);
             this.volume = volume;
             this.dataStore = datastore;
@@ -530,7 +539,7 @@
         int sleepTime = 120;
         int tries = storagePoolMaxWaitSeconds / sleepTime;
         while (tries > 0) {
-            TemplateInfo tmpl = store.getTemplate(template.getId());
+            TemplateInfo tmpl = store.getTemplate(template.getId(), null);
             if (tmpl != null) {
                 return tmpl;
             }
@@ -546,9 +555,10 @@
 
     @DB
     protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStore, TemplateInfo template, AsyncCallFuture<VolumeApiResult> future) {
-        DataObject templateOnPrimaryStoreObj = dataStore.create(template);
+        String deployAsIsConfiguration = volume.getDeployAsIsConfiguration();
+        DataObject templateOnPrimaryStoreObj = dataStore.create(template, deployAsIsConfiguration);
 
-        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(dataStore.getId(), template.getId());
+        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(dataStore.getId(), template.getId(), deployAsIsConfiguration);
         if (templatePoolRef == null) {
             throw new CloudRuntimeException("Failed to find template " + template.getUniqueName() + " in storage pool " + dataStore.getId());
         } else {
@@ -571,7 +581,7 @@
             if (s_logger.isDebugEnabled()) {
                 s_logger.info("Unable to acquire lock on VMTemplateStoragePool " + templatePoolRefId);
             }
-            templatePoolRef = _tmpltPoolDao.findByPoolTemplate(dataStore.getId(), template.getId());
+            templatePoolRef = _tmpltPoolDao.findByPoolTemplate(dataStore.getId(), template.getId(), deployAsIsConfiguration);
             if (templatePoolRef != null && templatePoolRef.getState() == ObjectInDataStoreStateMachine.State.Ready) {
                 s_logger.info(
                         "Unable to acquire lock on VMTemplateStoragePool " + templatePoolRefId + ", But Template " + template.getUniqueName() + " is already copied to primary storage, skip copying");
@@ -595,7 +605,7 @@
         } catch (Throwable e) {
             s_logger.debug("failed to create template on storage", e);
             templateOnPrimaryStoreObj.processEvent(Event.OperationFailed);
-            dataStore.create(template);  // make sure that template_spool_ref entry is still present so that the second thread can acquire the lock
+            dataStore.create(template, deployAsIsConfiguration);  // make sure that template_spool_ref entry is still present so that the second thread can acquire the lock
             VolumeApiResult result = new VolumeApiResult(volume);
             result.setResult(e.toString());
             future.complete(result);
@@ -705,14 +715,16 @@
         private final AsyncCallFuture<VolumeApiResult> future;
         private final DataObject templateOnStore;
         private final SnapshotInfo snapshot;
+        private final String deployAsIsConfiguration;
 
         public CreateVolumeFromBaseImageContext(AsyncCompletionCallback<T> callback, DataObject vo, DataStore primaryStore, DataObject templateOnStore, AsyncCallFuture<VolumeApiResult> future,
-                SnapshotInfo snapshot) {
+                                                SnapshotInfo snapshot, String configuration) {
             super(callback);
             this.vo = vo;
             this.future = future;
             this.templateOnStore = templateOnStore;
             this.snapshot = snapshot;
+            this.deployAsIsConfiguration = configuration;
         }
 
         public AsyncCallFuture<VolumeApiResult> getFuture() {
@@ -722,15 +734,16 @@
 
     @DB
     protected void createVolumeFromBaseImageAsync(VolumeInfo volume, DataObject templateOnPrimaryStore, PrimaryDataStore pd, AsyncCallFuture<VolumeApiResult> future) {
-        DataObject volumeOnPrimaryStorage = pd.create(volume);
+        DataObject volumeOnPrimaryStorage = pd.create(volume, volume.getDeployAsIsConfiguration());
         volumeOnPrimaryStorage.processEvent(Event.CreateOnlyRequested);
 
-        CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, volumeOnPrimaryStorage, pd, templateOnPrimaryStore, future, null);
+        CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, volumeOnPrimaryStorage, pd, templateOnPrimaryStore, future, null, volume.getDeployAsIsConfiguration());
         AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
         caller.setCallback(caller.getTarget().createVolumeFromBaseImageCallBack(null, null));
         caller.setContext(context);
 
         motionSrv.copyAsync(context.templateOnStore, volumeOnPrimaryStorage, caller);
+
         return;
     }
 
@@ -740,6 +753,7 @@
         DataObject tmplOnPrimary = context.templateOnStore;
         CopyCommandResult result = callback.getResult();
         VolumeApiResult volResult = new VolumeApiResult((VolumeObject)vo);
+        String deployAsIsConfiguration = context.deployAsIsConfiguration;
 
         if (result.isSuccess()) {
             vo.processEvent(Event.OperationSuccessed, result.getAnswer());
@@ -750,10 +764,10 @@
             // hack for Vmware: host is down, previously download template to the host needs to be re-downloaded, so we need to reset
             // template_spool_ref entry here to NOT_DOWNLOADED and Allocated state
             Answer ans = result.getAnswer();
-            if (ans != null && ans instanceof CopyCmdAnswer && ans.getDetails().contains("request template reload")) {
+            if (ans != null && ans instanceof CopyCmdAnswer && ans.getDetails().contains(REQUEST_TEMPLATE_RELOAD)) {
                 if (tmplOnPrimary != null) {
                     s_logger.info("Reset template_spool_ref entry so that vmware template can be reloaded in next try");
-                    VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(tmplOnPrimary.getDataStore().getId(), tmplOnPrimary.getId());
+                    VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(tmplOnPrimary.getDataStore().getId(), tmplOnPrimary.getId(), deployAsIsConfiguration);
                     if (templatePoolRef != null) {
                         long templatePoolRefId = templatePoolRef.getId();
                         templatePoolRef = _tmpltPoolDao.acquireInLockTable(templatePoolRefId, 1200);
@@ -789,9 +803,9 @@
     private TemplateInfo createManagedTemplateVolume(TemplateInfo srcTemplateInfo, PrimaryDataStore destPrimaryDataStore) {
         // create a template volume on primary storage
         AsyncCallFuture<VolumeApiResult> createTemplateFuture = new AsyncCallFuture<>();
-        TemplateInfo templateOnPrimary = (TemplateInfo)destPrimaryDataStore.create(srcTemplateInfo);
+        TemplateInfo templateOnPrimary = (TemplateInfo)destPrimaryDataStore.create(srcTemplateInfo, srcTemplateInfo.getDeployAsIsConfiguration());
 
-        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId());
+        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId(), srcTemplateInfo.getDeployAsIsConfiguration());
 
         if (templatePoolRef == null) {
             throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
@@ -861,7 +875,7 @@
      * @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) {
         AsyncCallFuture<VolumeApiResult> copyTemplateFuture = new AsyncCallFuture<>();
         int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600);
         long templatePoolRefId = templatePoolRef.getId();
@@ -986,7 +1000,7 @@
      * @param future For async
      */
     private void createManagedVolumeCloneTemplateAsync(VolumeInfo volumeInfo, TemplateInfo templateOnPrimary, PrimaryDataStore destPrimaryDataStore, AsyncCallFuture<VolumeApiResult> future) {
-        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId());
+        VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId(), volumeInfo.getDeployAsIsConfiguration());
 
         if (templatePoolRef == null) {
             throw new CloudRuntimeException("Failed to find template " + templateOnPrimary.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId());
@@ -1000,7 +1014,7 @@
         try {
             volumeInfo.processEvent(Event.CreateOnlyRequested);
 
-            CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, templateOnPrimary, future, null);
+            CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, templateOnPrimary, future, null, volumeInfo.getDeployAsIsConfiguration());
 
             AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
 
@@ -1021,7 +1035,7 @@
         try {
             // Create a volume on managed storage.
 
-            TemplateInfo destTemplateInfo = (TemplateInfo)primaryDataStore.create(srcTemplateInfo, false);
+            TemplateInfo destTemplateInfo = (TemplateInfo)primaryDataStore.create(srcTemplateInfo, false, volumeInfo.getDeployAsIsConfiguration());
 
             AsyncCallFuture<VolumeApiResult> createVolumeFuture = createVolumeAsync(volumeInfo, primaryDataStore);
             VolumeApiResult createVolumeResult = createVolumeFuture.get();
@@ -1109,7 +1123,7 @@
         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());
+            TemplateInfo templateOnPrimary = destPrimaryDataStore.getTemplate(srcTemplateInfo.getId(), null);
 
             if (templateOnPrimary == null) {
                 templateOnPrimary = createManagedTemplateVolume(srcTemplateInfo, destPrimaryDataStore);
@@ -1120,7 +1134,7 @@
             }
 
             // Copy the template to the template volume.
-            VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId());
+            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());
@@ -1196,8 +1210,8 @@
     @Override
     public AsyncCallFuture<VolumeApiResult> createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, TemplateInfo template) {
         PrimaryDataStore pd = dataStoreMgr.getPrimaryDataStore(dataStoreId);
-        TemplateInfo templateOnPrimaryStore = pd.getTemplate(template.getId());
-        AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<VolumeApiResult>();
+        TemplateInfo templateOnPrimaryStore = pd.getTemplate(template.getId(), volume.getDeployAsIsConfiguration());
+        AsyncCallFuture<VolumeApiResult> future = new AsyncCallFuture<>();
 
         if (templateOnPrimaryStore == null) {
             createBaseImageAsync(volume, pd, template, future);
@@ -1234,7 +1248,7 @@
             volumeOnStore.processEvent(Event.CreateOnlyRequested);
             _volumeDetailsDao.addDetail(volume.getId(), SNAPSHOT_ID, Long.toString(snapshot.getId()), false);
 
-            CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, volume, store, volumeOnStore, future, snapshot);
+            CreateVolumeFromBaseImageContext<VolumeApiResult> context = new CreateVolumeFromBaseImageContext<VolumeApiResult>(null, volume, store, volumeOnStore, future, snapshot, null);
             AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = AsyncCallbackDispatcher.create(this);
             caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null)).setContext(context);
             motionSrv.copyAsync(snapshot, volumeOnStore, caller);
@@ -2108,4 +2122,21 @@
 
         return volFactory.getVolume(volumeId);
     }
-}
+
+    @DB
+    @Override
+    /**
+     * The volume must be marked as expunged on DB to exclude it from the storage cleanup task
+     */
+    public void unmanageVolume(long volumeId) {
+        VolumeInfo vol = volFactory.getVolume(volumeId);
+        if (vol != null) {
+            vol.stateTransit(Volume.Event.DestroyRequested);
+            snapshotMgr.deletePoliciesForVolume(volumeId);
+            vol.stateTransit(Volume.Event.OperationSucceeded);
+            vol.stateTransit(Volume.Event.ExpungingRequested);
+            vol.stateTransit(Volume.Event.OperationSucceeded);
+            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 e75d0e6..ed58da7 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/framework/ca/pom.xml b/framework/ca/pom.xml
index 4c64148..2262e7e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml
index 119bb6c..0af8466 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
index 8786bfd..600b257 100644
--- a/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/main/java/com/cloud/cluster/ClusterManagerImpl.java
@@ -905,7 +905,7 @@
                 try {
                     JmxUtil.registerMBean("ClusterManager", "Node " + mshost.getId(), new ClusterManagerMBeanImpl(this, mshost));
                 } catch (final Exception e) {
-                    s_logger.warn("Unable to regiester cluster node into JMX monitoring due to exception " + ExceptionUtil.toString(e));
+                    s_logger.warn("Unable to register cluster node into JMX monitoring due to exception " + ExceptionUtil.toString(e));
                 }
             }
         }
@@ -985,7 +985,7 @@
 
         _mshostPeerDao.clearPeerInfo(_mshostId);
 
-        // use seperate thread for heartbeat updates
+        // use separate thread for heartbeat updates
         _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HeartbeatInterval.value(), HeartbeatInterval.value(), TimeUnit.MILLISECONDS);
         _notificationExecutor.submit(getNotificationTask());
 
diff --git a/framework/config/pom.xml b/framework/config/pom.xml
index d162cb2..aded63b 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/db/pom.xml b/framework/db/pom.xml
index 2bb7872..4142ba2 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
index f34b8ed..7d1b7b7 100644
--- a/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
+++ b/framework/db/src/main/java/com/cloud/utils/db/GenericDaoBase.java
@@ -162,6 +162,9 @@
     protected static final String SELECT_LAST_INSERT_ID_SQL = "SELECT LAST_INSERT_ID()";
     public static final Date DATE_TO_NULL = new Date(Long.MIN_VALUE);
 
+    private static final String INTEGRITY_CONSTRAINT_VIOLATION = "23000";
+    private static final int DUPLICATE_ENTRY_ERRO_CODE = 1062;
+
     protected static final SequenceFetcher s_seqFetcher = SequenceFetcher.getInstance();
 
     public static <J> GenericDao<? extends J, ? extends Serializable> getDao(Class<J> entityType) {
@@ -341,23 +344,13 @@
 
     @DB()
     protected List<T> search(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache) {
-        if (_removed != null) {
-            if (sc == null) {
-                sc = createSearchCriteria();
-            }
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
+        sc = checkAndSetRemovedIsNull(sc);
         return searchIncludingRemoved(sc, filter, lock, cache);
     }
 
     @DB()
     protected List<T> search(SearchCriteria<T> sc, final Filter filter, final Boolean lock, final boolean cache, final boolean enableQueryCache) {
-        if (_removed != null) {
-            if (sc == null) {
-                sc = createSearchCriteria();
-            }
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
+        sc = checkAndSetRemovedIsNull(sc);
         return searchIncludingRemoved(sc, filter, lock, cache, enableQueryCache);
     }
 
@@ -516,7 +509,6 @@
         if (_removed != null) {
             sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
         }
-
         return customSearchIncludingRemoved(sc, filter);
     }
 
@@ -850,13 +842,23 @@
             ub.clear();
             return result;
         } catch (final SQLException e) {
-            if (e.getSQLState().equals("23000") && e.getErrorCode() == 1062) {
-                throw new EntityExistsException("Entity already exists ", e);
-            }
+            handleEntityExistsException(e);
             throw new CloudRuntimeException("DB Exception on: " + pstmt, e);
         }
     }
 
+    /**
+     * If the SQLException.getSQLState is of 23000 (Integrity Constraint Violation), and the Error Code is 1062 (Duplicate Entry), throws EntityExistsException.
+     * @throws EntityExistsException
+     */
+    protected static void handleEntityExistsException(SQLException e) throws EntityExistsException {
+        boolean isIntegrityConstantViolation = INTEGRITY_CONSTRAINT_VIOLATION.equals(e.getSQLState());
+        boolean isErrorCodeOfDuplicateEntry = e.getErrorCode() == DUPLICATE_ENTRY_ERRO_CODE;
+        if (isIntegrityConstantViolation && isErrorCodeOfDuplicateEntry) {
+            throw new EntityExistsException("Entity already exists ", e);
+        }
+    }
+
     @DB()
     protected Attribute findAttributeByFieldName(String name) {
         return _allAttributes.get(name);
@@ -898,26 +900,20 @@
 
     @Override
     @DB()
-    public T findOneBy(final SearchCriteria<T> sc) {
-        if (_removed != null) {
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
+    public T findOneBy(SearchCriteria<T> sc) {
+        sc = checkAndSetRemovedIsNull(sc);
         return findOneIncludingRemovedBy(sc);
     }
 
     @DB()
-    protected List<T> listBy(final SearchCriteria<T> sc, final Filter filter) {
-        if (_removed != null) {
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
+    protected List<T> listBy(SearchCriteria<T> sc, final Filter filter) {
+        sc = checkAndSetRemovedIsNull(sc);
         return listIncludingRemovedBy(sc, filter);
     }
 
     @DB()
-    protected List<T> listBy(final SearchCriteria<T> sc, final Filter filter, final boolean enableQueryCache) {
-        if (_removed != null) {
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
+    protected List<T> listBy(SearchCriteria<T> sc, final Filter filter, final boolean enableQueryCache) {
+        sc = checkAndSetRemovedIsNull(sc);
         return listIncludingRemovedBy(sc, filter, enableQueryCache);
     }
 
@@ -1450,11 +1446,8 @@
             }
             txn.commit();
         } catch (final SQLException e) {
-            if (e.getSQLState().equals("23000") && e.getErrorCode() == 1062) {
-                throw new EntityExistsException("Entity already exists: ", e);
-            } else {
-                throw new CloudRuntimeException("DB Exception on: " + pstmt, e);
-            }
+            handleEntityExistsException(e);
+            throw new CloudRuntimeException("DB Exception on: " + pstmt, e);
         } catch (IllegalArgumentException e) {
             throw new CloudRuntimeException("Problem with getting the ec attribute ", e);
         } catch (IllegalAccessException e) {
@@ -1925,7 +1918,22 @@
         return builder.create();
     }
 
+    private SearchCriteria<T> checkAndSetRemovedIsNull(SearchCriteria<T> sc) {
+        if (_removed != null) {
+            if (sc == null) {
+                sc = createSearchCriteria();
+            }
+            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
+        }
+        return sc;
+    }
+
     public Integer getDistinctCount(SearchCriteria<T> sc) {
+        sc = checkAndSetRemovedIsNull(sc);
+        return getDistinctCountIncludingRemoved(sc);
+    }
+
+    public Integer getDistinctCountIncludingRemoved(SearchCriteria<T> sc) {
         String clause = sc != null ? sc.getWhereClause() : null;
         if (clause != null && clause.length() == 0) {
             clause = null;
@@ -1984,6 +1992,11 @@
     }
 
     public Integer getDistinctCount(SearchCriteria<T> sc, String[] distinctColumns) {
+        sc = checkAndSetRemovedIsNull(sc);
+        return getDistinctCountIncludingRemoved(sc, distinctColumns);
+    }
+
+    public Integer getDistinctCountIncludingRemoved(SearchCriteria<T> sc, String[] distinctColumns) {
         String clause = sc != null ? sc.getWhereClause() : null;
         if (Strings.isNullOrEmpty(clause)) {
             clause = null;
@@ -2030,15 +2043,15 @@
     }
 
     public Integer countAll() {
-        SearchCriteria<T> sc = null;
-        if (_removed != null) {
-            sc = createSearchCriteria();
-            sc.addAnd(_removed.second().field.getName(), SearchCriteria.Op.NULL);
-        }
-        return getCount(sc);
+        return getCount(null);
     }
 
     public Integer getCount(SearchCriteria<T> sc) {
+        sc = checkAndSetRemovedIsNull(sc);
+        return getCountIncludingRemoved(sc);
+    }
+
+    public Integer getCountIncludingRemoved(SearchCriteria<T> sc) {
         String clause = sc != null ? sc.getWhereClause() : null;
         if (clause != null && clause.length() == 0) {
             clause = null;
diff --git a/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java b/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java
index aef0c69..26530a2 100644
--- a/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java
+++ b/framework/db/src/test/java/com/cloud/utils/db/GenericDaoBaseTest.java
@@ -20,21 +20,44 @@
 import java.sql.SQLException;
 
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import javax.persistence.EntityExistsException;
 
 @RunWith(MockitoJUnitRunner.class)
 public class GenericDaoBaseTest {
     @Mock
     ResultSet resultSet;
+    @Mock
+    SQLException mockedSQLException;
+
+    private static final String INTEGRITY_CONSTRAINT_VIOLATION = "23000";
+    private static final int DUPLICATE_ENTRY_ERRO_CODE = 1062;
+
+    @Before
+    public void prepareTests() throws SQLException {
+        Mockito.when(resultSet.getObject(1)).thenReturn(false);
+        Mockito.when(resultSet.getBoolean(1)).thenReturn(false);
+        Mockito.when(resultSet.getObject(1)).thenReturn((short) 1);
+        Mockito.when(resultSet.getShort(1)).thenReturn((short) 1);
+        Mockito.when(resultSet.getObject(1)).thenReturn(0.1f);
+        Mockito.when(resultSet.getFloat(1)).thenReturn(0.1f);
+        Mockito.when(resultSet.getObject(1)).thenReturn(0.1d);
+        Mockito.when(resultSet.getDouble(1)).thenReturn(0.1d);
+        Mockito.when(resultSet.getObject(1)).thenReturn(1l);
+        Mockito.when(resultSet.getLong(1)).thenReturn(1l);
+        Mockito.when(resultSet.getInt(1)).thenReturn(1);
+        Mockito.when(resultSet.getObject(1)).thenReturn((byte) 1);
+        Mockito.when(resultSet.getByte(1)).thenReturn((byte) 1);
+    }
 
     @Test
     public void getObjectBoolean() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(false);
-        Mockito.when(resultSet.getBoolean(1)).thenReturn(false);
         Assert.assertFalse(GenericDaoBase
                 .getObject(Boolean.class, resultSet, 1));
         Mockito.verify(resultSet).getBoolean(1);
@@ -42,8 +65,6 @@
 
     @Test
     public void getObjectPrimitiveBoolean() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(false);
-        Mockito.when(resultSet.getBoolean(1)).thenReturn(false);
         Assert.assertFalse(GenericDaoBase
                 .getObject(boolean.class, resultSet, 1));
         Mockito.verify(resultSet).getBoolean(1);
@@ -51,8 +72,6 @@
 
     @Test
     public void getObjectPrimitiveShort() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn((short) 1);
-        Mockito.when(resultSet.getShort(1)).thenReturn((short) 1);
         Assert.assertEquals(Short.valueOf((short) 1),
                 GenericDaoBase.getObject(short.class, resultSet, 1));
         Mockito.verify(resultSet).getShort(1);
@@ -60,8 +79,6 @@
 
     @Test
     public void getObjectShort() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn((short) 1);
-        Mockito.when(resultSet.getShort(1)).thenReturn((short) 1);
         Assert.assertEquals(Short.valueOf((short) 1),
                 GenericDaoBase.getObject(Short.class, resultSet, 1));
         Mockito.verify(resultSet).getShort(1);
@@ -69,8 +86,6 @@
 
     @Test
     public void getObjectFloat() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(0.1f);
-        Mockito.when(resultSet.getFloat(1)).thenReturn(0.1f);
         Assert.assertEquals(0.1f,
                 GenericDaoBase.getObject(Float.class, resultSet, 1), 0.1);
         Mockito.verify(resultSet).getFloat(1);
@@ -78,8 +93,6 @@
 
     @Test
     public void getObjectPrimitiveFloat() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(0.1f);
-        Mockito.when(resultSet.getFloat(1)).thenReturn(0.1f);
         Assert.assertEquals(0.1f,
                 GenericDaoBase.getObject(float.class, resultSet, 1), 0.1);
         Mockito.verify(resultSet).getFloat(1);
@@ -87,8 +100,6 @@
 
     @Test
     public void getObjectPrimitiveDouble() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(0.1d);
-        Mockito.when(resultSet.getDouble(1)).thenReturn(0.1d);
         Assert.assertEquals(0.1d,
                 GenericDaoBase.getObject(double.class, resultSet, 1), 0.1);
         Mockito.verify(resultSet).getDouble(1);
@@ -96,8 +107,6 @@
 
     @Test
     public void getObjectDouble() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(0.1d);
-        Mockito.when(resultSet.getDouble(1)).thenReturn(0.1d);
         Assert.assertEquals(0.1d,
                 GenericDaoBase.getObject(Double.class, resultSet, 1), 0.1);
         Mockito.verify(resultSet).getDouble(1);
@@ -105,8 +114,6 @@
 
     @Test
     public void getObjectLong() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(1l);
-        Mockito.when(resultSet.getLong(1)).thenReturn(1l);
         Assert.assertEquals((Long) 1l,
                 GenericDaoBase.getObject(Long.class, resultSet, 1));
         Mockito.verify(resultSet).getLong(1);
@@ -114,8 +121,6 @@
 
     @Test
     public void getObjectPrimitiveLong() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(1l);
-        Mockito.when(resultSet.getLong(1)).thenReturn(1l);
         Assert.assertEquals((Long) 1l,
                 GenericDaoBase.getObject(long.class, resultSet, 1));
         Mockito.verify(resultSet).getLong(1);
@@ -123,8 +128,6 @@
 
     @Test
     public void getObjectPrimitiveInt() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(1l);
-        Mockito.when(resultSet.getInt(1)).thenReturn(1);
         Assert.assertEquals((Integer) 1,
                 GenericDaoBase.getObject(int.class, resultSet, 1));
         Mockito.verify(resultSet).getInt(1);
@@ -132,8 +135,6 @@
 
     @Test
     public void getObjectInteger() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn(1l);
-        Mockito.when(resultSet.getInt(1)).thenReturn(1);
         Assert.assertEquals((Integer) 1,
                 GenericDaoBase.getObject(Integer.class, resultSet, 1));
         Mockito.verify(resultSet).getInt(1);
@@ -141,11 +142,44 @@
 
     @Test
     public void getObjectPrimitiveByte() throws SQLException {
-        Mockito.when(resultSet.getObject(1)).thenReturn((byte) 1);
-        Mockito.when(resultSet.getByte(1)).thenReturn((byte) 1);
         Assert.assertTrue((byte) 1 == GenericDaoBase.getObject(byte.class,
                 resultSet, 1));
         Mockito.verify(resultSet).getByte(1);
     }
 
+    @Test
+    public void handleEntityExistsExceptionTestNoMatchForEntityExists() {
+        Mockito.when(mockedSQLException.getErrorCode()).thenReturn(123);
+        Mockito.when(mockedSQLException.getSQLState()).thenReturn("123");
+        GenericDaoBase.handleEntityExistsException(mockedSQLException);
+    }
+
+    @Test
+    public void handleEntityExistsExceptionTestIntegrityConstraint() {
+        Mockito.when(mockedSQLException.getErrorCode()).thenReturn(123);
+        Mockito.when(mockedSQLException.getSQLState()).thenReturn(INTEGRITY_CONSTRAINT_VIOLATION);
+        GenericDaoBase.handleEntityExistsException(mockedSQLException);
+    }
+
+    @Test
+    public void handleEntityExistsExceptionTestIntegrityConstraintNull() {
+        Mockito.when(mockedSQLException.getErrorCode()).thenReturn(123);
+        Mockito.when(mockedSQLException.getSQLState()).thenReturn(null);
+        GenericDaoBase.handleEntityExistsException(mockedSQLException);
+    }
+
+    @Test
+    public void handleEntityExistsExceptionTestDuplicateEntryErrorCode() {
+        Mockito.when(mockedSQLException.getErrorCode()).thenReturn(DUPLICATE_ENTRY_ERRO_CODE);
+        Mockito.when(mockedSQLException.getSQLState()).thenReturn("123");
+        GenericDaoBase.handleEntityExistsException(mockedSQLException);
+    }
+
+    @Test(expected = EntityExistsException.class)
+    public void handleEntityExistsExceptionTestExpectEntityExistsException() {
+        Mockito.when(mockedSQLException.getErrorCode()).thenReturn(DUPLICATE_ENTRY_ERRO_CODE);
+        Mockito.when(mockedSQLException.getSQLState()).thenReturn(INTEGRITY_CONSTRAINT_VIOLATION);
+        GenericDaoBase.handleEntityExistsException(mockedSQLException);
+    }
+
 }
diff --git a/framework/direct-download/pom.xml b/framework/direct-download/pom.xml
index 3ec2790..4f2719e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
\ No newline at end of file
diff --git a/framework/events/pom.xml b/framework/events/pom.xml
index ae03511..284f92d 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml
index acc3092..7fd681b 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/jobs/pom.xml b/framework/jobs/pom.xml
index e20af28..401c7d1 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
index 6ca698b..7dd7343 100644
--- a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
+++ b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
@@ -242,7 +242,9 @@
         SearchCriteria<Long> sc = asyncJobTypeSearch.create();
         sc.setParameters("status", JobInfo.Status.IN_PROGRESS);
         sc.setParameters("job_cmd", (Object[])cmds);
-        sc.setParameters("job_info", "%" + havingInfo + "%");
+        if (havingInfo != null) {
+            sc.setParameters("job_info", "%" + havingInfo + "%");
+        }
         List<Long> results = customSearch(sc, null);
         return results.get(0);
     }
diff --git a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index cb04d22..54ce065 100644
--- a/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/main/java/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -60,7 +60,7 @@
 import org.apache.cloudstack.jobs.JobInfo.Status;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.slf4j.MDC;
+import org.apache.log4j.MDC;
 
 import com.cloud.cluster.ClusterManagerListener;
 import org.apache.cloudstack.management.ManagementServerHost;
@@ -95,6 +95,8 @@
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.storage.dao.VolumeDao;
 
+import static com.cloud.utils.HumanReadableJson.getHumanReadableBytesJson;
+
 public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, ClusterManagerListener, Configurable {
     // Advanced
     public static final ConfigKey<Long> JobExpireMinutes = new ConfigKey<Long>("Advanced", Long.class, "job.expire.minutes", "1440",
@@ -255,8 +257,9 @@
     @Override
     @DB
     public void completeAsyncJob(final long jobId, final Status jobStatus, final int resultCode, final String resultObject) {
+        String resultObj = null;
         if (s_logger.isDebugEnabled()) {
-            String resultObj = obfuscatePassword(resultObject, HidePassword.value());
+            resultObj = convertHumanReadableJson(obfuscatePassword(resultObject, HidePassword.value()));
             s_logger.debug("Complete async job-" + jobId + ", jobStatus: " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObj);
         }
 
@@ -265,7 +268,7 @@
         if (job == null) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " +
-                    resultObject);
+                    resultObj);
             }
             // still purge item from queue to avoid any blocking
             _queueMgr.purgeAsyncJobQueueItemId(jobId);
@@ -343,6 +346,15 @@
         _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
     }
 
+    private String convertHumanReadableJson(String resultObj) {
+
+        if (resultObj != null && resultObj.contains("/") && resultObj.contains("{")){
+            resultObj = resultObj.substring(0, resultObj.indexOf("{")) + getHumanReadableBytesJson(resultObj.substring(resultObj.indexOf("{")));
+        }
+
+        return resultObj;
+    }
+
     @Override
     @DB
     public void updateAsyncJobStatus(final long jobId, final int processStatus, final String resultObject) {
@@ -463,14 +475,19 @@
         return job;
     }
 
-    private String obfuscatePassword(String result, boolean hidePassword) {
+    public String obfuscatePassword(String result, boolean hidePassword) {
         if (hidePassword) {
             String pattern = "\"password\":";
             if (result != null) {
                 if (result.contains(pattern)) {
                     String[] resp = result.split(pattern);
                     String psswd = resp[1].toString().split(",")[0];
-                    result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "," + resp[1].split(",", 2)[1];
+                    if (psswd.endsWith("}")) {
+                        psswd = psswd.substring(0, psswd.length() - 1);
+                        result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "}," + resp[1].split(",", 2)[1];
+                    } else {
+                        result = resp[0] + pattern + psswd.replace(psswd.substring(2, psswd.length() - 1), "*****") + "," + resp[1].split(",", 2)[1];
+                    }
                 }
             }
         }
diff --git a/framework/jobs/src/test/java/org/apache/cloudstack/framework/jobs/AsyncJobManagerTest.java b/framework/jobs/src/test/java/org/apache/cloudstack/framework/jobs/AsyncJobManagerTest.java
index a49f28e..7130873 100644
--- a/framework/jobs/src/test/java/org/apache/cloudstack/framework/jobs/AsyncJobManagerTest.java
+++ b/framework/jobs/src/test/java/org/apache/cloudstack/framework/jobs/AsyncJobManagerTest.java
@@ -16,116 +16,67 @@
 // under the License.
 package org.apache.cloudstack.framework.jobs;
 
-/*
- * This integration test requires real DB setup, it is not meant to run at per-build
- * basis, it can only be opened in developer's run
- *
- *
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnitRunner;
 
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = "classpath:/AsyncJobManagerTestContext.xml")
-public class AsyncJobManagerTest extends TestCase {
-    private static final Logger s_logger =
-            Logger.getLogger(AsyncJobManagerTest.class);
+@RunWith (MockitoJUnitRunner.class)
+public class AsyncJobManagerTest {
 
-    @Inject
-    AsyncJobManager _jobMgr;
+    @Spy
+    AsyncJobManagerImpl asyncJobManager;
 
-    @Inject
-    AsyncJobTestDashboard _testDashboard;
+    String input = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"password\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
+    String expected = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"p*****\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
+    String obfuscatedInput = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\",\"password\":\"p***\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
+    String noPassword = "\"haprovider\":\"kvmhaprovider\"},\"outofbandmanagement\":{\"powerstate\":\"On\",\"enabled\":true,\"driver\":\"redfish\",\"address\":\"oob-address.com\",\"port\":\"80\",\"username\":\"root\"},\"resourcestate\":\"PrepareForMaintenance\",\"hahost\":false";
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        try {
-            ComponentContext.initComponentsLifeCycle();
-        } catch (Exception ex) {
-            ex.printStackTrace();
-            s_logger.error(ex.getMessage());
-        }
-    }
+    String inputNoBraces = "\"password\":\"password\"\",\"action\":\"OFF\"";
+    String expectedNoBraces = "\"password\":\"p*****\",\"action\":\"OFF\"";
 
-    @Override
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    public void testWaitBehave() {
-
-        final Object me = this;
-        new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                s_logger.info("Sleeping...");
-                try {
-                    Thread.sleep(3000);
-                } catch (InterruptedException e) {
-                    s_logger.debug("[ignored] .");
-                }
-
-                s_logger.info("wakeup");
-                synchronized (me) {
-                    me.notifyAll();
-                }
-            }
-
-        }).start();
-
-        s_logger.info("First wait");
-        synchronized (me) {
-            try {
-                wait(5000);
-            } catch (InterruptedException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        s_logger.info("First wait done");
-
-        s_logger.info("Second wait");
-        synchronized (me) {
-            try {
-                wait(5000);
-            } catch (InterruptedException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-            }
-        }
-        s_logger.info("Second wait done");
+    @Test
+    public void obfuscatePasswordTest() {
+        String result = asyncJobManager.obfuscatePassword(input, true);
+        Assert.assertEquals(expected, result);
     }
 
     @Test
-    public void test() {
-        final int TOTAL_JOBS_PER_QUEUE = 5;
-        final int TOTAL_QUEUES = 100;
-
-        for (int i = 0; i < TOTAL_QUEUES; i++) {
-            for (int j = 0; j < TOTAL_JOBS_PER_QUEUE; j++) {
-                AsyncJobVO job = new AsyncJobVO();
-                job.setCmd("TestCmd");
-                job.setDispatcher("TestJobDispatcher");
-                job.setCmdInfo("TestCmd info");
-
-                _jobMgr.submitAsyncJob(job, "fakequeue", i);
-
-                s_logger.info("Job submitted. job " + job.getId() + ", queue: " + i);
-            }
-        }
-
-        while (true) {
-            if (_testDashboard.getCompletedJobCount() == TOTAL_JOBS_PER_QUEUE * TOTAL_QUEUES)
-                break;
-
-            try {
-                Thread.sleep(1000);
-            } catch (InterruptedException e) {
-                s_logger.debug("[ignored] .");
-            }
-        }
-
-        s_logger.info("Test done with " + _testDashboard.getCompletedJobCount() + " job executed");
+    public void obfuscatePasswordTestNoBraces() {
+        String result = asyncJobManager.obfuscatePassword(inputNoBraces, true);
+        Assert.assertEquals(expectedNoBraces, result);
     }
-}
 
-*/
+    @Test
+    public void obfuscatePasswordTestHidePasswordFalse() {
+        String result = asyncJobManager.obfuscatePassword(input, false);
+        Assert.assertEquals(input, result);
+    }
+
+    @Test
+    public void obfuscatePasswordTestObfuscatedInput() {
+        String result = asyncJobManager.obfuscatePassword(obfuscatedInput, true);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void obfuscatePasswordTestHidePasswordFalseObfuscatedInput() {
+        String result = asyncJobManager.obfuscatePassword(obfuscatedInput, false);
+        Assert.assertEquals(obfuscatedInput, result);
+    }
+
+    @Test
+    public void obfuscatePasswordTestNoPassword() {
+        String result = asyncJobManager.obfuscatePassword(noPassword, true);
+        Assert.assertEquals(noPassword, result);
+    }
+
+    @Test
+    public void obfuscatePasswordTestHidePasswordNoPassword() {
+        String result = asyncJobManager.obfuscatePassword(noPassword, false);
+        Assert.assertEquals(noPassword, result);
+    }
+
+}
diff --git a/framework/managed-context/pom.xml b/framework/managed-context/pom.xml
index 19d0f79..29f36aa 100644
--- a/framework/managed-context/pom.xml
+++ b/framework/managed-context/pom.xml
@@ -24,13 +24,14 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>${cs.log4j.version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
index b4a9758..da8265c 100644
--- a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
+++ b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
@@ -18,8 +18,7 @@
  */
 package org.apache.cloudstack.managed.context;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.managed.context.impl.DefaultManagedContext;
 
@@ -27,7 +26,7 @@
 
     private static final int SLEEP_COUNT = 120;
 
-    private static final Logger log = LoggerFactory.getLogger(ManagedContextRunnable.class);
+    private static final Logger log = Logger.getLogger(ManagedContextRunnable.class);
     private static final ManagedContext DEFAULT_MANAGED_CONTEXT = new DefaultManagedContext();
     private static ManagedContext context;
     private static boolean managedContext = false;
diff --git a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/impl/DefaultManagedContext.java b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/impl/DefaultManagedContext.java
index 34c83b1..76e6d45 100644
--- a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/impl/DefaultManagedContext.java
+++ b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/impl/DefaultManagedContext.java
@@ -23,8 +23,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.managed.context.ManagedContext;
 import org.apache.cloudstack.managed.context.ManagedContextListener;
@@ -33,7 +32,7 @@
 
 public class DefaultManagedContext implements ManagedContext {
 
-    private static final Logger log = LoggerFactory.getLogger(DefaultManagedContext.class);
+    private static final Logger log = Logger.getLogger(DefaultManagedContext.class);
 
     List<ManagedContextListener<?>> listeners = new CopyOnWriteArrayList<ManagedContextListener<?>>();
 
@@ -88,7 +87,7 @@
                     if (firstError == null) {
                         firstError = t;
                     }
-                    log.error("Failed onEnterContext for listener [{}]", listener, t);
+                    log.error("Failed onEnterContext for listener: " +  listener, t);
                 }
 
                 /* Stack data structure is used because in between onEnter and onLeave
@@ -114,7 +113,7 @@
                         invocation.listener.onLeaveContext(invocation.data, reentry);
                     } catch (Throwable t) {
                         lastError = t;
-                        log.error("Failed onLeaveContext for listener [{}]", invocation.listener, t);
+                        log.error("Failed onLeaveContext for listener: [" + invocation.listener + "]", t);
                     }
                 }
 
diff --git a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/threadlocal/ManagedThreadLocal.java b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/threadlocal/ManagedThreadLocal.java
index 2db3aaf..f323d9a 100644
--- a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/threadlocal/ManagedThreadLocal.java
+++ b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/threadlocal/ManagedThreadLocal.java
@@ -21,8 +21,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.managed.context.ManagedContextUtils;
 
@@ -36,7 +35,7 @@
     };
 
     private static boolean s_validateContext = false;
-    private static final Logger log = LoggerFactory.getLogger(ManagedThreadLocal.class);
+    private static final Logger log = Logger.getLogger(ManagedThreadLocal.class);
 
     @SuppressWarnings("unchecked")
     @Override
diff --git a/framework/pom.xml b/framework/pom.xml
index 103e7b7..e2edbe0 100644
--- a/framework/pom.xml
+++ b/framework/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <build>
         <plugins>
diff --git a/framework/quota/pom.xml b/framework/quota/pom.xml
index 6d0807a..35a9cc0 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/rest/pom.xml b/framework/rest/pom.xml
index d605d39..a43d57b 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 0684b12..0216ee9 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/spring/lifecycle/pom.xml b/framework/spring/lifecycle/pom.xml
index 6998af4..a93c76e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java
index fd9c886..b0c1dcc 100644
--- a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java
+++ b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java
@@ -29,8 +29,7 @@
 import javax.management.NotCompliantMBeanException;
 import javax.naming.ConfigurationException;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import com.cloud.utils.component.ComponentLifecycle;
 import com.cloud.utils.component.SystemIntegrityChecker;
@@ -40,7 +39,7 @@
 
 public class CloudStackExtendedLifeCycle extends AbstractBeanCollector {
 
-    private static final Logger log = LoggerFactory.getLogger(CloudStackExtendedLifeCycle.class);
+    private static final Logger log = Logger.getLogger(CloudStackExtendedLifeCycle.class);
 
     Map<Integer, Set<ComponentLifecycle>> sorted = new TreeMap<Integer, Set<ComponentLifecycle>>();
 
@@ -60,7 +59,7 @@
 
     protected void checkIntegrity() {
         for (SystemIntegrityChecker checker : getBeans(SystemIntegrityChecker.class)) {
-            log.info("Running system integrity checker {}", checker);
+            log.info("Running system integrity checker " + checker);
 
             checker.check();
         }
@@ -114,7 +113,7 @@
                 try {
                     lifecycle.configure(lifecycle.getName(), lifecycle.getConfigParams());
                 } catch (ConfigurationException e) {
-                    log.error("Failed to configure {}", lifecycle.getName(), e);
+                    log.error("Failed to configure " +  lifecycle.getName(), e);
                     throw new CloudRuntimeException(e);
                 }
             }
diff --git a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/DumpRegistry.java b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/DumpRegistry.java
index 79e35f1..5c5e916 100644
--- a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/DumpRegistry.java
+++ b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/DumpRegistry.java
@@ -22,8 +22,7 @@
 
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 
 import com.cloud.utils.component.ComponentLifecycleBase;
 import com.cloud.utils.component.Named;
@@ -31,7 +30,7 @@
 
 public class DumpRegistry extends ComponentLifecycleBase {
 
-    private static final Logger log = LoggerFactory.getLogger(DumpRegistry.class);
+    private static final Logger log = Logger.getLogger(DumpRegistry.class);
 
     List<Registry<?>> registries;
 
@@ -56,7 +55,7 @@
                 buffer.append(getName(o));
             }
 
-            log.info("Registry [{}] contains [{}]", registry.getName(), buffer);
+            log.info("Registry [" + registry.getName() + "] contains [" + buffer + "]");
         }
 
         return super.start();
diff --git a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/ExtensionRegistry.java b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/ExtensionRegistry.java
index 321e365..ebb5b5f 100644
--- a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/ExtensionRegistry.java
+++ b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/ExtensionRegistry.java
@@ -28,8 +28,7 @@
 import javax.annotation.PostConstruct;
 
 import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.BeanNameAware;
 
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -39,7 +38,7 @@
 
 public class ExtensionRegistry implements Registry<Object>, Configurable, BeanNameAware {
 
-    private static final Logger log = LoggerFactory.getLogger(ExtensionRegistry.class);
+    private static final Logger log = Logger.getLogger(ExtensionRegistry.class);
 
     String name;
     String beanName;
@@ -112,7 +111,7 @@
             registered.add(item);
         }
 
-        log.debug("Registering extension [{}] in [{}]", name, this.name);
+        log.debug("Registering extension [" + name + "] in [" + this.name + "]");
 
         return true;
     }
diff --git a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/RegistryLifecycle.java b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/RegistryLifecycle.java
index 337cfbd..43efd84 100644
--- a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/RegistryLifecycle.java
+++ b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/registry/RegistryLifecycle.java
@@ -23,8 +23,7 @@
 import java.util.Properties;
 import java.util.Set;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
 import org.springframework.context.ApplicationContext;
@@ -36,7 +35,7 @@
 
 public class RegistryLifecycle implements BeanPostProcessor, SmartLifecycle, ApplicationContextAware {
 
-    private static final Logger log = LoggerFactory.getLogger(RegistryLifecycle.class);
+    private static final Logger log = Logger.getLogger(RegistryLifecycle.class);
 
     public static final String EXTENSION_EXCLUDE = "extensions.exclude";
     public static final String EXTENSION_INCLUDE_PREFIX = "extensions.include.";
@@ -71,7 +70,7 @@
 
         boolean result = excludes.contains(name);
         if (result) {
-            log.info("Excluding extension [{}] based on configuration", name);
+            log.info("Excluding extension [" + name + "] based on configuration");
         }
 
         return result;
@@ -110,7 +109,7 @@
         while (iter.hasNext()) {
             Object next = iter.next();
             if (registry.register(next)) {
-                log.debug("Registered {}", next);
+                log.debug("Registered " + next);
             } else {
                 iter.remove();
             }
diff --git a/framework/spring/module/pom.xml b/framework/spring/module/pom.xml
index 216367e..b680d80 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java
index 26525de..f054d39 100644
--- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java
+++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java
@@ -24,8 +24,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.core.io.Resource;
@@ -37,7 +36,7 @@
 
 public class CloudStackSpringContext {
 
-    private static final Logger log = LoggerFactory.getLogger(CloudStackSpringContext.class);
+    private static final Logger log = Logger.getLogger(CloudStackSpringContext.class);
 
     public static final String CLOUDSTACK_CONTEXT_SERVLET_KEY = CloudStackSpringContext.class.getSimpleName();
     public static final String CLOUDSTACK_CONTEXT = "META-INF/cloudstack";
@@ -130,7 +129,7 @@
                 String urlString = r.getURL().toExternalForm();
                 urlList.add(urlString);
             } catch (IOException e) {
-                log.error("Failed to create URL for {}", r.getDescription(), e);
+                log.error("Failed to create URL for " + r.getDescription(), e);
             }
         }
 
diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java
index bba0dcc..5dab5d7 100644
--- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java
+++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java
@@ -33,8 +33,7 @@
 import java.util.Stack;
 
 import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -49,7 +48,7 @@
 
 public class DefaultModuleDefinitionSet implements ModuleDefinitionSet {
 
-    private static final Logger log = LoggerFactory.getLogger(DefaultModuleDefinitionSet.class);
+    private static final Logger log = Logger.getLogger(DefaultModuleDefinitionSet.class);
 
     public static final String DEFAULT_CONFIG_RESOURCES = "DefaultConfigResources";
     public static final String DEFAULT_CONFIG_PROPERTIES = "DefaultConfigProperties";
@@ -101,7 +100,7 @@
                     ApplicationContext context = getApplicationContext(def.getName());
                     try {
                         Runnable runnable = context.getBean("moduleStartup", Runnable.class);
-                        log.info("Starting module [{}]", def.getName());
+                        log.info("Starting module [" + def.getName() + "]");
                         runnable.run();
                     } catch (BeansException e) {
                         // Ignore
@@ -139,11 +138,11 @@
         long start = System.currentTimeMillis();
         if (log.isInfoEnabled()) {
             for (Resource resource : resources) {
-                log.info("Loading module context [{}] from {}", def.getName(), resource);
+                log.info("Loading module context [" + def.getName() + "] from " + resource);
             }
         }
         context.refresh();
-        log.info("Loaded module context [{}] in {} ms", def.getName(), (System.currentTimeMillis() - start));
+        log.info("Loaded module context [" + def.getName() + "] in " + (System.currentTimeMillis() - start) + " ms");
 
         contexts.put(def.getName(), context);
 
@@ -238,7 +237,7 @@
             return;
 
         if (!shouldLoad(def)) {
-            log.info("Excluding context [{}] based on configuration", def.getName());
+            log.info("Excluding context [" + def.getName() + "] based on configuration");
             return;
         }
 
diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java
index bf6fb24..a90d6a5 100644
--- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java
+++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java
@@ -23,8 +23,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.log4j.Logger;
 import org.springframework.context.ApplicationContext;
 import org.springframework.web.context.ConfigurableWebApplicationContext;
 import org.springframework.web.context.ContextLoaderListener;
@@ -36,7 +35,7 @@
     public static final String WEB_PARENT_MODULE = "parentModule";
     public static final String WEB_PARENT_MODULE_DEFAULT = "web";
 
-    private static final Logger log = LoggerFactory.getLogger(CloudStackContextLoaderListener.class);
+    private static final Logger log = Logger.getLogger(CloudStackContextLoaderListener.class);
 
     CloudStackSpringContext cloudStackContext;
     String configuredParentName;
diff --git a/packaging/README.md b/packaging/README.md
index 9c54ea6..634b1cf 100644
--- a/packaging/README.md
+++ b/packaging/README.md
@@ -6,9 +6,9 @@
 # Requirements
 The RPM and DEB packages have dependencies on versions of specific libraries. Due to these dependencies the following distributions and their versions are supported by the packages.
 
-* CentOS / RHEL: 7
+* CentOS / RHEL: 7 and 8
 * Debian 7 (Wheezy) and 8 (Jessy) (untested!)
-* Ubuntu: 16.04 (Xenial) and 18.04 (Bionic)
+* Ubuntu: 16.04 (Xenial), 18.04 (Bionic) and 20.04 (Focal)
 
 # Building
 Using the scripts in the *packaging* directory the RPM and DEB packages can be build.
diff --git a/packaging/centos7/cloud.spec b/packaging/centos7/cloud.spec
index 8b26086..5b0515c 100644
--- a/packaging/centos7/cloud.spec
+++ b/packaging/centos7/cloud.spec
@@ -27,6 +27,7 @@
 %define _maventag %{_fullver}
 Release:   %{_rel}%{dist}
 
+%define __python python3
 %{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
 
 Version:   %{_ver}
@@ -47,6 +48,8 @@
 BuildRequires: mysql-connector-python
 BuildRequires: maven => 3.0.0
 BuildRequires: python-setuptools
+BuildRequires: wget
+BuildRequires: nodejs
 
 %description
 CloudStack is a highly-scalable elastic, open source,
@@ -73,12 +76,12 @@
 Requires: /sbin/chkconfig
 Requires: /usr/bin/ssh-keygen
 Requires: genisoimage
-Requires: mysql-connector-python
 Requires: ipmitool
 Requires: %{name}-common = %{_ver}
 Requires: iptables-services
 Requires: qemu-img
-Requires: python-dns
+Requires: python3-pip
+Requires: python3-setuptools
 Group:     System Environment/Libraries
 %description management
 The CloudStack management server is the central point of coordination,
@@ -88,8 +91,7 @@
 Summary: Apache CloudStack common files and scripts
 Requires: python
 Requires: python3
-Requires: python-argparse
-Requires: python-netaddr
+Requires: python3-pip
 Group:   System Environment/Libraries
 %description common
 The Apache CloudStack files shared between agent and management server
@@ -109,7 +111,6 @@
 Requires: iproute
 Requires: ipset
 Requires: perl
-Requires: libvirt-python
 Requires: python36-libvirt
 Requires: qemu-img
 Requires: qemu-kvm
@@ -137,6 +138,12 @@
 %description usage
 The CloudStack usage calculation service
 
+%package ui
+Summary: CloudStack UI
+Group: System Environment/Libraries
+%description ui
+The CloudStack UI
+
 %package cli
 Summary: Apache CloudStack CLI
 Provides: python-marvin
@@ -195,6 +202,7 @@
 fi
 
 mvn -Psystemvm,developer $FLAGS clean package
+cd ui && npm install && npm run build && cd ..
 
 %install
 [ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT}
@@ -220,8 +228,8 @@
 install -D systemvm/dist/systemvm.iso ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms/systemvm.iso
 install python/lib/cloud_utils.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py
 cp -r python/lib/cloudutils ${RPM_BUILD_ROOT}%{python_sitearch}/
-python -m py_compile ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py
-python -m compileall ${RPM_BUILD_ROOT}%{python_sitearch}/cloudutils
+python3 -m py_compile ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py
+python3 -m compileall ${RPM_BUILD_ROOT}%{python_sitearch}/cloudutils
 cp build/gitrev.txt ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts
 cp packaging/centos7/cloudstack-sccs ${RPM_BUILD_ROOT}/usr/bin
 
@@ -235,6 +243,7 @@
 mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management
 mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management
 mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/run
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel
 
 # Setup Jetty
 ln -sf /etc/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/conf
@@ -254,6 +263,10 @@
 
 cp -r client/target/cloud-client-ui-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/
 cp -r client/target/classes/META-INF/webapp ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp
+cp ui/dist/config.json ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/
+cp -r ui/dist/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/
+rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/config.json
+ln -sf /etc/%{name}/management/config.json ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/config.json
 mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/cloud-client-ui-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib/cloudstack-%{_maventag}.jar
 cp client/target/lib/*jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib/
 
@@ -261,7 +274,7 @@
 rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/scripts
 rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/vms
 
-for name in db.properties server.properties log4j-cloud.xml commons-logging.properties environment.properties java.security.ciphers
+for name in db.properties server.properties log4j-cloud.xml environment.properties java.security.ciphers
 do
   cp client/target/conf/$name ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/$name
 done
@@ -279,6 +292,20 @@
 touch ${RPM_BUILD_ROOT}%{_localstatedir}/run/%{name}-management.pid
 #install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina
 
+# UI
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/ui
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/
+cp ui/dist/config.json ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/ui/
+cp -r ui/dist/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/
+rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/config.json
+ln -sf /etc/%{name}/ui/config.json ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/config.json
+
+# Package mysql-connector-python
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/e9/93/4860cebd5ad3ff2664ad3c966490ccb46e3b88458b2095145bca11727ca4/setuptools-47.3.1-py3-none-any.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/28/05/9867ef8eafd12265267bee138fa2c46ebf34a276ea4cbe184cba4c606e8b/protobuf-3.12.2-cp36-cp36m-manylinux1_x86_64.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/d1/53/4cf90d2fe81b9cdb55dc180951bcec44ea8685665f1bdb1412501dc362dd/mysql_connector_python-8.0.20-cp36-cp36m-manylinux1_x86_64.whl
+
 chmod 440 ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management
 chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt
 chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management
@@ -348,6 +375,8 @@
 install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE
 install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE
 install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-ui-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-ui-%{version}/LICENSE
 install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE
 install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE
 install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-marvin-%{version}/NOTICE
@@ -386,6 +415,9 @@
 fi
 
 %post management
+# Install mysql-connector-python
+pip3 install %{_datadir}/%{name}-management/setup/wheel/six-1.15.0-py2.py3-none-any.whl %{_datadir}/%{name}-management/setup/wheel/setuptools-47.3.1-py3-none-any.whl %{_datadir}/%{name}-management/setup/wheel/protobuf-3.12.2-cp36-cp36m-manylinux1_x86_64.whl %{_datadir}/%{name}-management/setup/wheel/mysql_connector_python-8.0.20-cp36-cp36m-manylinux1_x86_64.whl
+
 /usr/bin/systemctl on cloudstack-management > /dev/null 2>&1 || true
 
 grep -s -q "db.cloud.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties" || sed -i -e "\$adb.cloud.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties"
@@ -455,14 +487,14 @@
 
 %post usage
 if [ -f "%{_sysconfdir}/%{name}/management/db.properties" ]; then
-    echo Replacing db.properties with management server db.properties
+    echo "Replacing usage server's db.properties with a link to the management server's db.properties"
     rm -f %{_sysconfdir}/%{name}/usage/db.properties
     ln -s %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/usage/db.properties
     /usr/bin/systemctl enable cloudstack-usage > /dev/null 2>&1 || true
 fi
 
 if [ -f "%{_sysconfdir}/%{name}/management/key" ]; then
-    echo Replacing key with management server key
+    echo "Replacing usage server's key with a link to the management server's key"
     rm -f %{_sysconfdir}/%{name}/usage/key
     ln -s %{_sysconfdir}/%{name}/management/key %{_sysconfdir}/%{name}/usage/key
 fi
@@ -472,7 +504,7 @@
 fi
 
 %post marvin
-pip install --upgrade http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-2.0.4.zip#md5=3df394d89300db95163f17c843ef49df
+pip install --upgrade https://files.pythonhosted.org/packages/ca/ea/1e2553b088bad2f9fa8120c2624f797b2d7450d3b61bb492d29c72e3d3c2/mysql_connector_python-8.0.20-cp27-cp27mu-manylinux1_x86_64.whl
 pip install --upgrade /usr/share/cloudstack-marvin/Marvin-*.tar.gz
 
 #No default permission as the permission setup is complex
@@ -488,11 +520,11 @@
 %config(noreplace) %{_sysconfdir}/security/limits.d/cloud
 %config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/db.properties
 %config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/server.properties
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/config.json
 %config(noreplace) %{_sysconfdir}/%{name}/management/log4j-cloud.xml
 %config(noreplace) %{_sysconfdir}/%{name}/management/log4j.xml
 %config(noreplace) %{_sysconfdir}/%{name}/management/environment.properties
 %config(noreplace) %{_sysconfdir}/%{name}/management/java.security.ciphers
-%config(noreplace) %{_sysconfdir}/%{name}/management/commons-logging.properties
 %attr(0644,root,root) %{_unitdir}/%{name}-management.service
 %attr(0755,cloud,cloud) %{_localstatedir}/run/%{name}-management.pid
 %attr(0755,root,root) %{_bindir}/%{name}-setup-management
@@ -516,6 +548,7 @@
 %{_defaultdocdir}/%{name}-management-%{version}/LICENSE
 %{_defaultdocdir}/%{name}-management-%{version}/NOTICE
 #%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-catalina
+%{_datadir}/%{name}-management/setup/wheel/*.whl
 
 %files agent
 %attr(0755,root,root) %{_bindir}/%{name}-setup-agent
@@ -544,12 +577,18 @@
 %attr(0755,root,root) /usr/bin/cloudstack-sccs
 %attr(0644, root, root) %{_datadir}/%{name}-common/vms/systemvm.iso
 %attr(0644,root,root) %{python_sitearch}/cloud_utils.py
-%attr(0644,root,root) %{python_sitearch}/cloud_utils.pyc
+%attr(0644,root,root) %{python_sitearch}/__pycache__/*
 %attr(0644,root,root) %{python_sitearch}/cloudutils/*
 %attr(0644, root, root) %{_datadir}/%{name}-common/lib/jasypt-1.9.3.jar
 %{_defaultdocdir}/%{name}-common-%{version}/LICENSE
 %{_defaultdocdir}/%{name}-common-%{version}/NOTICE
 
+%files ui
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/ui/config.json
+%attr(0644,root,root) %{_datadir}/%{name}-ui/*
+%{_defaultdocdir}/%{name}-ui-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-ui-%{version}/NOTICE
+
 %files usage
 %attr(0644,root,root) %{_unitdir}/%{name}-usage.service
 %config(noreplace) %{_sysconfdir}/default/%{name}-usage
@@ -599,3 +638,4 @@
 
 * Fri Oct 5 2012 Hugo Trippaers <hugo@apache.org> 4.1.0
 - new style spec file
+
diff --git a/packaging/centos7/replace.properties b/packaging/centos7/replace.properties
index 0b0f2cc..8c3560d 100644
--- a/packaging/centos7/replace.properties
+++ b/packaging/centos7/replace.properties
@@ -48,7 +48,7 @@
 PIDDIR=/var/run
 PLUGINJAVADIR=/usr/share/cloudstack-management/plugin
 PREMIUMJAVADIR=/usr/share/cloudstack-management/premium
-PYTHONDIR=/usr/lib/python2.7/site-packages/
+PYTHONDIR=/usr/lib/python3.6/site-packages/
 SERVERSYSCONFDIR=/etc/sysconfig
 SETUPDATADIR=/usr/share/cloudstack-management/setup
 SYSCONFDIR=/etc/sysconfig
diff --git a/packaging/centos8/cloud-ipallocator.rc b/packaging/centos8/cloud-ipallocator.rc
new file mode 100755
index 0000000..d3eadec
--- /dev/null
+++ b/packaging/centos8/cloud-ipallocator.rc
@@ -0,0 +1,96 @@
+#!/bin/bash
+# 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.
+
+# chkconfig: 35 99 10
+# description: Cloud Agent
+
+# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well
+
+. /etc/rc.d/init.d/functions
+
+# set environment variables
+
+SHORTNAME="$(basename $(readlink -f $0))"
+PIDFILE=/var/run/"$SHORTNAME".pid
+LOCKFILE=/var/lock/subsys/"$SHORTNAME"
+LOGFILE=/var/log/cloudstack/ipallocator/ipallocator.log
+PROGNAME="External IPAllocator"
+
+unset OPTIONS
+[ -r /etc/sysconfig/"$SHORTNAME" ] && source /etc/sysconfig/"$SHORTNAME"
+DAEMONIZE=/usr/bin/cloud-daemonize
+PROG=/usr/bin/cloud-external-ipallocator.py
+OPTIONS=8083
+
+start() {
+        echo -n $"Starting $PROGNAME: "
+	if hostname --fqdn >/dev/null 2>&1 ; then
+		daemon --check=$SHORTNAME --pidfile=${PIDFILE} "$DAEMONIZE" \
+			-n "$SHORTNAME" -p "$PIDFILE" -l "$LOGFILE" "$PROG" $OPTIONS
+		RETVAL=$?
+		echo
+	else
+		failure
+		echo
+		echo The host name does not resolve properly to an IP address.  Cannot start "$PROGNAME". > /dev/stderr
+		RETVAL=9
+	fi
+	[ $RETVAL = 0 ] && touch ${LOCKFILE}
+	return $RETVAL
+}
+
+stop() {
+	echo -n $"Stopping $PROGNAME: "
+	killproc -p ${PIDFILE} $SHORTNAME # -d 10 $SHORTNAME
+	RETVAL=$?
+	echo
+	[ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE}
+}
+
+
+# See how we were called.
+case "$1" in
+  start)
+	start
+	;;
+  stop)
+	stop
+	;;
+  status)
+        status -p ${PIDFILE} $SHORTNAME
+	RETVAL=$?
+	;;
+  restart)
+	stop
+	sleep 3
+	start
+	;;
+  condrestart)
+	if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then
+		stop
+		sleep 3
+		start
+	fi
+	;;
+  *)
+	echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}"
+	RETVAL=3
+esac
+
+exit $RETVAL
+
diff --git a/packaging/centos8/cloud.limits b/packaging/centos8/cloud.limits
new file mode 100644
index 0000000..7debeb2
--- /dev/null
+++ b/packaging/centos8/cloud.limits
@@ -0,0 +1,19 @@
+# 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.
+
+cloud hard nofile 4096
+cloud soft nofile 4096
diff --git a/packaging/centos8/cloud.spec b/packaging/centos8/cloud.spec
new file mode 100644
index 0000000..60d86f7
--- /dev/null
+++ b/packaging/centos8/cloud.spec
@@ -0,0 +1,638 @@
+# 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 __os_install_post %{nil}
+%global debug_package %{nil}
+
+# DISABLE the post-percentinstall java repacking and line number stripping
+# we need to find a way to just disable the java repacking and line number stripping, but not the autodeps
+
+Name:      cloudstack
+Summary:   CloudStack IaaS Platform
+#http://fedoraproject.org/wiki/PackageNamingGuidelines#Pre-Release_packages
+%define _maventag %{_fullver}
+Release:   %{_rel}%{dist}
+
+%define __python python3
+%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
+
+Version:   %{_ver}
+License:   ASL 2.0
+Vendor:    Apache CloudStack <dev@cloudstack.apache.org>
+Packager:  Apache CloudStack <dev@cloudstack.apache.org>
+Group:     System Environment/Libraries
+# FIXME do groups for every single one of the subpackages
+Source0:   %{name}-%{_maventag}.tgz
+BuildRoot: %{_tmppath}/%{name}-%{_maventag}-%{release}-build
+
+BuildRequires: java-11-openjdk-devel
+#BuildRequires: ws-commons-util
+BuildRequires: jpackage-utils
+BuildRequires: gcc
+BuildRequires: glibc-devel
+BuildRequires: /usr/bin/mkisofs
+BuildRequires: maven => 3.0.0
+BuildRequires: python3-setuptools
+BuildRequires: wget
+BuildRequires: nodejs
+
+%description
+CloudStack is a highly-scalable elastic, open source,
+intelligent IaaS cloud implementation.
+
+%package management
+Summary:   CloudStack management server UI
+Requires: java-11-openjdk
+Requires: python3
+Requires: bash
+Requires: gawk
+Requires: bzip2
+Requires: gzip
+Requires: unzip
+Requires: /sbin/mount.nfs
+Requires: openssh-clients
+Requires: nfs-utils
+Requires: iproute
+Requires: wget
+Requires: mysql
+Requires: sudo
+Requires: /sbin/service
+Requires: /sbin/chkconfig
+Requires: /usr/bin/ssh-keygen
+Requires: genisoimage
+Requires: ipmitool
+Requires: %{name}-common = %{_ver}
+Requires: iptables-services
+Requires: qemu-img
+Requires: python3-pip
+Requires: python3-setuptools
+Group:     System Environment/Libraries
+%description management
+The CloudStack management server is the central point of coordination,
+management, and intelligence in CloudStack.
+
+%package common
+Summary: Apache CloudStack common files and scripts
+Requires: python3
+Group:   System Environment/Libraries
+%description common
+The Apache CloudStack files shared between agent and management server
+%global __requires_exclude ^(libuuid\\.so\\.1|/usr/bin/python)$
+
+%package agent
+Summary: CloudStack Agent for KVM hypervisors
+Requires: openssh-clients
+Requires: java-11-openjdk
+Requires: %{name}-common = %{_ver}
+Requires: libvirt
+Requires: ebtables
+Requires: iptables
+Requires: ethtool
+Requires: net-tools
+Requires: iproute
+Requires: ipset
+Requires: perl
+Requires: python3-libvirt
+Requires: qemu-img
+Requires: qemu-kvm
+Provides: cloud-agent
+Group: System Environment/Libraries
+%description agent
+The CloudStack agent for KVM hypervisors
+
+%package baremetal-agent
+Summary: CloudStack baremetal agent
+Requires: tftp-server
+Requires: xinetd
+Requires: syslinux
+Requires: chkconfig
+Requires: dhcp
+Requires: httpd
+Group:     System Environment/Libraries
+%description baremetal-agent
+The CloudStack baremetal agent
+
+%package usage
+Summary: CloudStack Usage calculation server
+Requires: java-11-openjdk
+Group: System Environment/Libraries
+%description usage
+The CloudStack usage calculation service
+
+%package ui
+Summary: CloudStack UI
+Group: System Environment/Libraries
+%description ui
+The CloudStack UI
+
+%package cli
+Summary: Apache CloudStack CLI
+Provides: python-marvin
+Group: System Environment/Libraries
+%description cli
+Apache CloudStack command line interface
+
+%package marvin
+Summary: Apache CloudStack Marvin library
+Requires: python3-pip
+Requires: python2-pip
+Requires: gcc
+Requires: python3-devel
+Requires: python2-devel
+Requires: libffi-devel
+Requires: openssl-devel
+Group: System Environment/Libraries
+%description marvin
+Apache CloudStack Marvin library
+
+%package integration-tests
+Summary: Apache CloudStack Marvin integration tests
+Requires: %{name}-marvin = %{_ver}
+Group: System Environment/Libraries
+%description integration-tests
+Apache CloudStack Marvin integration tests
+
+%if "%{_ossnoss}" == "noredist"
+%package mysql-ha
+Summary: Apache CloudStack Balancing Strategy for MySQL
+Group: System Environmnet/Libraries
+%description mysql-ha
+Apache CloudStack Balancing Strategy for MySQL
+
+%endif
+
+%prep
+echo Doing CloudStack build
+
+%setup -q -n %{name}-%{_maventag}
+
+%build
+
+cp packaging/centos8/replace.properties build/replace.properties
+echo VERSION=%{_maventag} >> build/replace.properties
+echo PACKAGE=%{name} >> build/replace.properties
+touch build/gitrev.txt
+echo $(git rev-parse HEAD) > build/gitrev.txt
+
+if [ "%{_ossnoss}" == "NOREDIST" -o "%{_ossnoss}" == "noredist" ] ; then
+   echo "Adding noredist flag to the maven build"
+   FLAGS="$FLAGS -Dnoredist"
+fi
+
+if [ "%{_sim}" == "SIMULATOR" -o "%{_sim}" == "simulator" ] ; then
+   echo "Adding simulator flag to the maven build"
+   FLAGS="$FLAGS -Dsimulator"
+fi
+
+mvn -Psystemvm,developer $FLAGS clean package
+cd ui && npm install && npm run build && cd ..
+
+%install
+[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT}
+# Common directories
+mkdir -p ${RPM_BUILD_ROOT}%{_bindir}
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/ipallocator
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management
+mkdir -p ${RPM_BUILD_ROOT}%{_initrddir}
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/default
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d
+
+# Common
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms
+mkdir -p ${RPM_BUILD_ROOT}%{python_sitearch}/
+mkdir -p ${RPM_BUILD_ROOT}/usr/bin
+cp -r scripts/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts
+install -D systemvm/dist/systemvm.iso ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms/systemvm.iso
+install python/lib/cloud_utils.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py
+cp -r python/lib/cloudutils ${RPM_BUILD_ROOT}%{python_sitearch}/
+python3 -m py_compile ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py
+python3 -m compileall ${RPM_BUILD_ROOT}%{python_sitearch}/cloudutils
+cp build/gitrev.txt ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts
+cp packaging/centos8/cloudstack-sccs ${RPM_BUILD_ROOT}/usr/bin
+
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco
+cp -r plugins/network-elements/cisco-vnmc/src/main/scripts/network/cisco/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco
+
+# Management
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/run
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel
+
+# Setup Jetty
+ln -sf /etc/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/conf
+ln -sf /var/log/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/logs
+
+install -D client/target/utilities/bin/cloud-migrate-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-migrate-databases
+install -D client/target/utilities/bin/cloud-set-guest-password ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-password
+install -D client/target/utilities/bin/cloud-set-guest-sshkey ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-sshkey
+install -D client/target/utilities/bin/cloud-setup-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-databases
+install -D client/target/utilities/bin/cloud-setup-encryption ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-encryption
+install -D client/target/utilities/bin/cloud-setup-management ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-management
+install -D client/target/utilities/bin/cloud-setup-baremetal ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-baremetal
+install -D client/target/utilities/bin/cloud-sysvmadm ${RPM_BUILD_ROOT}%{_bindir}/%{name}-sysvmadm
+install -D client/target/utilities/bin/cloud-update-xenserver-licenses ${RPM_BUILD_ROOT}%{_bindir}/%{name}-update-xenserver-licenses
+
+cp -r client/target/utilities/scripts/db/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup
+
+cp -r client/target/cloud-client-ui-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/
+cp -r client/target/classes/META-INF/webapp ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp
+cp ui/dist/config.json ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/
+cp -r ui/dist/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/
+rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/config.json
+ln -sf /etc/%{name}/management/config.json ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapp/config.json
+mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/cloud-client-ui-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib/cloudstack-%{_maventag}.jar
+cp client/target/lib/*jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib/
+
+# Don't package the scripts in the management webapp
+rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/scripts
+rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/vms
+
+for name in db.properties server.properties log4j-cloud.xml environment.properties java.security.ciphers
+do
+  cp client/target/conf/$name ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/$name
+done
+
+ln -sf log4j-cloud.xml  ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/log4j.xml
+
+install python/bindir/cloud-external-ipallocator.py ${RPM_BUILD_ROOT}%{_bindir}/%{name}-external-ipallocator.py
+install -D client/target/pythonlibs/jasypt-1.9.3.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/lib/jasypt-1.9.3.jar
+
+install -D packaging/centos8/cloud-ipallocator.rc ${RPM_BUILD_ROOT}%{_initrddir}/%{name}-ipallocator
+install -D packaging/centos8/cloud.limits ${RPM_BUILD_ROOT}%{_sysconfdir}/security/limits.d/cloud
+install -D packaging/systemd/cloudstack-management.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-management.service
+install -D packaging/systemd/cloudstack-management.default ${RPM_BUILD_ROOT}%{_sysconfdir}/default/%{name}-management
+install -D server/target/conf/cloudstack-sudoers ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management
+touch ${RPM_BUILD_ROOT}%{_localstatedir}/run/%{name}-management.pid
+#install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina
+
+# UI
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/ui
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/
+cp ui/dist/config.json ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/ui/
+cp -r ui/dist/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/
+rm -f ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/config.json
+ln -sf /etc/%{name}/ui/config.json ${RPM_BUILD_ROOT}%{_datadir}/%{name}-ui/config.json
+
+# Package mysql-connector-python
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/e9/93/4860cebd5ad3ff2664ad3c966490ccb46e3b88458b2095145bca11727ca4/setuptools-47.3.1-py3-none-any.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/28/05/9867ef8eafd12265267bee138fa2c46ebf34a276ea4cbe184cba4c606e8b/protobuf-3.12.2-cp36-cp36m-manylinux1_x86_64.whl
+wget -P ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup/wheel https://files.pythonhosted.org/packages/d1/53/4cf90d2fe81b9cdb55dc180951bcec44ea8685665f1bdb1412501dc362dd/mysql_connector_python-8.0.20-cp36-cp36m-manylinux1_x86_64.whl
+
+chmod 440 ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management
+chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent
+
+# KVM Agent
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/plugins
+install -D packaging/systemd/cloudstack-agent.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-agent.service
+install -D packaging/systemd/cloudstack-rolling-maintenance@.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-rolling-maintenance@.service
+install -D packaging/systemd/cloudstack-agent.default ${RPM_BUILD_ROOT}%{_sysconfdir}/default/%{name}-agent
+install -D agent/target/transformed/agent.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/agent.properties
+install -D agent/target/transformed/environment.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/environment.properties
+install -D agent/target/transformed/log4j-cloud.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/log4j-cloud.xml
+install -D agent/target/transformed/cloud-setup-agent ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-agent
+install -D agent/target/transformed/cloudstack-agent-upgrade ${RPM_BUILD_ROOT}%{_bindir}/%{name}-agent-upgrade
+install -D agent/target/transformed/cloud-guest-tool ${RPM_BUILD_ROOT}%{_bindir}/%{name}-guest-tool
+install -D agent/target/transformed/libvirtqemuhook ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook
+install -D agent/target/transformed/rolling-maintenance ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/rolling-maintenance
+install -D agent/target/transformed/cloud-ssh ${RPM_BUILD_ROOT}%{_bindir}/%{name}-ssh
+install -D agent/target/transformed/cloudstack-agent-profile.sh ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d/%{name}-agent-profile.sh
+install -D agent/target/transformed/cloudstack-agent.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-agent
+install -D plugins/hypervisors/kvm/target/cloud-plugin-hypervisor-kvm-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%name-agent/lib/cloud-plugin-hypervisor-kvm-%{_maventag}.jar
+cp plugins/hypervisors/kvm/target/dependencies/*  ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib
+
+# Usage server
+mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib
+install -D usage/target/cloud-usage-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/cloud-usage-%{_maventag}.jar
+install -D usage/target/transformed/db.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/db.properties
+install -D usage/target/transformed/log4j-cloud_usage.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/log4j-cloud.xml
+cp usage/target/dependencies/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/
+cp client/target/lib/mysql*jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/
+install -D packaging/systemd/cloudstack-usage.service ${RPM_BUILD_ROOT}%{_unitdir}/%{name}-usage.service
+install -D packaging/systemd/cloudstack-usage.default ${RPM_BUILD_ROOT}%{_sysconfdir}/default/%{name}-usage
+mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/usage/
+
+# CLI
+cp -r cloud-cli/cloudtool ${RPM_BUILD_ROOT}%{python_sitearch}/
+install cloud-cli/cloudapis/cloud.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloudapis.py
+
+# Marvin
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-marvin
+cp tools/marvin/dist/Marvin-*.tar.gz ${RPM_BUILD_ROOT}%{_datadir}/%{name}-marvin/
+
+# integration-tests
+mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-integration-tests
+cp -r test/integration/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-integration-tests/
+
+# MYSQL HA
+if [ "x%{_ossnoss}" == "xnoredist" ] ; then
+  mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-mysql-ha/lib
+  cp -r plugins/database/mysql-ha/target/cloud-plugin-database-mysqlha-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib
+fi
+
+#License files from whisker
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-ui-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-ui-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-marvin-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-marvin-%{version}/LICENSE
+install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-integration-tests-%{version}/NOTICE
+install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-integration-tests-%{version}/LICENSE
+
+%clean
+[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT}
+
+%preun management
+/usr/bin/systemctl stop cloudstack-management || true
+/usr/bin/systemctl off cloudstack-management || true
+
+%pre management
+id cloud > /dev/null 2>&1 || /usr/sbin/useradd -M -c "CloudStack unprivileged user" \
+     -r -s /bin/sh -d %{_localstatedir}/cloudstack/management cloud|| true
+
+rm -rf %{_localstatedir}/cache/cloudstack
+
+# in case of upgrade to 4.9+ copy commands.properties if not exists in /etc/cloudstack/management/
+if [ "$1" == "2" ] ; then
+    if [ -f "%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties" ] && [ ! -f "%{_sysconfdir}/%{name}/management/commands.properties" ] ; then
+        cp -p %{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties %{_sysconfdir}/%{name}/management/commands.properties
+    fi
+fi
+
+# Remove old tomcat symlinks and env config file
+if [ -L "%{_datadir}/%{name}-management/lib" ]
+then
+    rm -f %{_datadir}/%{name}-management/bin
+    rm -f %{_datadir}/%{name}-management/lib
+    rm -f %{_datadir}/%{name}-management/temp
+    rm -f %{_datadir}/%{name}-management/work
+    rm -f %{_sysconfdir}/default/%{name}-management
+fi
+
+%post management
+# Install mysql-connector-python
+pip3 install %{_datadir}/%{name}-management/setup/wheel/six-1.15.0-py2.py3-none-any.whl %{_datadir}/%{name}-management/setup/wheel/setuptools-47.3.1-py3-none-any.whl %{_datadir}/%{name}-management/setup/wheel/protobuf-3.12.2-cp36-cp36m-manylinux1_x86_64.whl %{_datadir}/%{name}-management/setup/wheel/mysql_connector_python-8.0.20-cp36-cp36m-manylinux1_x86_64.whl
+
+/usr/bin/systemctl on cloudstack-management > /dev/null 2>&1 || true
+
+grep -s -q "db.cloud.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties" || sed -i -e "\$adb.cloud.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties"
+grep -s -q "db.usage.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties" || sed -i -e "\$adb.usage.driver=jdbc:mysql"  "%{_sysconfdir}/%{name}/management/db.properties"
+grep -s -q "db.simulator.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties" || sed -i -e "\$adb.simulator.driver=jdbc:mysql" "%{_sysconfdir}/%{name}/management/db.properties"
+
+if [ ! -f %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/vhd-util ] ; then
+    echo Please download vhd-util from http://download.cloudstack.org/tools/vhd-util and put it in
+    echo %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/
+fi
+
+if [ -f %{_sysconfdir}/sysconfig/%{name}-management ] ; then
+    rm -f %{_sysconfdir}/sysconfig/%{name}-management
+fi
+
+chown -R cloud:cloud /var/log/cloudstack/management
+
+systemctl daemon-reload
+
+%preun agent
+/sbin/service cloudstack-agent stop || true
+if [ "$1" == "0" ] ; then
+    /sbin/chkconfig --del cloudstack-agent > /dev/null 2>&1 || true
+fi
+
+%pre agent
+
+# save old configs if they exist (for upgrade). Otherwise we may lose them
+# when the old packages are erased. There are a lot of properties files here.
+if [ -d "%{_sysconfdir}/cloud" ] ; then
+    mv %{_sysconfdir}/cloud %{_sysconfdir}/cloud.rpmsave
+fi
+
+%post agent
+if [ "$1" == "2" ] ; then
+    echo "Running %{_bindir}/%{name}-agent-upgrade to update bridge name for upgrade from CloudStack 4.0.x (and before) to CloudStack 4.1 (and later)"
+    %{_bindir}/%{name}-agent-upgrade
+fi
+if [ ! -d %{_sysconfdir}/libvirt/hooks ] ; then
+    mkdir %{_sysconfdir}/libvirt/hooks
+fi
+cp -a ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook %{_sysconfdir}/libvirt/hooks/qemu
+mkdir -m 0755 -p /usr/share/cloudstack-agent/tmp
+/sbin/service libvirtd restart
+/sbin/systemctl enable cloudstack-agent > /dev/null 2>&1 || true
+/sbin/systemctl enable cloudstack-rolling-maintenance@p > /dev/null 2>&1 || true
+
+# if saved configs from upgrade exist, copy them over
+if [ -f "%{_sysconfdir}/cloud.rpmsave/agent/agent.properties" ]; then
+    mv %{_sysconfdir}/%{name}/agent/agent.properties  %{_sysconfdir}/%{name}/agent/agent.properties.rpmnew
+    cp -p %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/%{name}/agent
+    # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall
+    mv %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/cloud.rpmsave/agent/agent.properties.rpmsave
+fi
+
+systemctl daemon-reload
+
+%pre usage
+id cloud > /dev/null 2>&1 || /usr/sbin/useradd -M -c "CloudStack unprivileged user" \
+     -r -s /bin/sh -d %{_localstatedir}/cloudstack/management cloud|| true
+
+%preun usage
+/sbin/service cloudstack-usage stop || true
+if [ "$1" == "0" ] ; then
+    /sbin/chkconfig --del cloudstack-usage > /dev/null 2>&1 || true
+fi
+
+%post usage
+if [ -f "%{_sysconfdir}/%{name}/management/db.properties" ]; then
+    echo "Replacing usage server's db.properties with a link to the management server's db.properties"
+    rm -f %{_sysconfdir}/%{name}/usage/db.properties
+    ln -s %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/usage/db.properties
+    /usr/bin/systemctl enable cloudstack-usage > /dev/null 2>&1 || true
+fi
+
+if [ -f "%{_sysconfdir}/%{name}/management/key" ]; then
+    echo "Replacing usage server's key with a link to the management server's key"
+    rm -f %{_sysconfdir}/%{name}/usage/key
+    ln -s %{_sysconfdir}/%{name}/management/key %{_sysconfdir}/%{name}/usage/key
+fi
+
+if [ ! -f "%{_sysconfdir}/%{name}/usage/key" ]; then
+    ln -s %{_sysconfdir}/%{name}/management/key %{_sysconfdir}/%{name}/usage/key
+fi
+
+%post marvin
+pip install --upgrade https://files.pythonhosted.org/packages/ca/ea/1e2553b088bad2f9fa8120c2624f797b2d7450d3b61bb492d29c72e3d3c2/mysql_connector_python-8.0.20-cp27-cp27mu-manylinux1_x86_64.whl
+pip install --upgrade /usr/share/cloudstack-marvin/Marvin-*.tar.gz
+
+#No default permission as the permission setup is complex
+%files management
+%defattr(-,root,root,-)
+%dir %{_datadir}/%{name}-management
+%dir %attr(0770,root,cloud) %{_localstatedir}/%{name}/mnt
+%dir %attr(0770,cloud,cloud) %{_localstatedir}/%{name}/management
+%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management
+%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/management
+%config(noreplace) %{_sysconfdir}/default/%{name}-management
+%config(noreplace) %{_sysconfdir}/sudoers.d/%{name}-management
+%config(noreplace) %{_sysconfdir}/security/limits.d/cloud
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/db.properties
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/server.properties
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/config.json
+%config(noreplace) %{_sysconfdir}/%{name}/management/log4j-cloud.xml
+%config(noreplace) %{_sysconfdir}/%{name}/management/log4j.xml
+%config(noreplace) %{_sysconfdir}/%{name}/management/environment.properties
+%config(noreplace) %{_sysconfdir}/%{name}/management/java.security.ciphers
+%attr(0644,root,root) %{_unitdir}/%{name}-management.service
+%attr(0755,cloud,cloud) %{_localstatedir}/run/%{name}-management.pid
+%attr(0755,root,root) %{_bindir}/%{name}-setup-management
+%attr(0755,root,root) %{_bindir}/%{name}-update-xenserver-licenses
+%{_datadir}/%{name}-management/conf
+%{_datadir}/%{name}-management/lib/*.jar
+%{_datadir}/%{name}-management/logs
+%attr(0755,root,root) %{_bindir}/%{name}-setup-databases
+%attr(0755,root,root) %{_bindir}/%{name}-migrate-databases
+%attr(0755,root,root) %{_bindir}/%{name}-set-guest-password
+%attr(0755,root,root) %{_bindir}/%{name}-set-guest-sshkey
+%attr(0755,root,root) %{_bindir}/%{name}-sysvmadm
+%attr(0755,root,root) %{_bindir}/%{name}-setup-encryption
+%{_datadir}/%{name}-management/setup/*.sql
+%{_datadir}/%{name}-management/setup/*.sh
+%{_datadir}/%{name}-management/setup/server-setup.xml
+%{_datadir}/%{name}-management/webapp/*
+%attr(0755,root,root) %{_bindir}/%{name}-external-ipallocator.py
+%attr(0755,root,root) %{_initrddir}/%{name}-ipallocator
+%dir %attr(0770,root,root) %{_localstatedir}/log/%{name}/ipallocator
+%{_defaultdocdir}/%{name}-management-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-management-%{version}/NOTICE
+#%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-catalina
+%{_datadir}/%{name}-management/setup/wheel/*.whl
+
+%files agent
+%attr(0755,root,root) %{_bindir}/%{name}-setup-agent
+%attr(0755,root,root) %{_bindir}/%{name}-agent-upgrade
+%attr(0755,root,root) %{_bindir}/%{name}-guest-tool
+%attr(0755,root,root) %{_bindir}/%{name}-ssh
+%attr(0644,root,root) %{_unitdir}/%{name}-agent.service
+%attr(0644,root,root) %{_unitdir}/%{name}-rolling-maintenance@.service
+%config(noreplace) %{_sysconfdir}/default/%{name}-agent
+%attr(0644,root,root) %{_sysconfdir}/profile.d/%{name}-agent-profile.sh
+%config(noreplace) %attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-agent
+%attr(0755,root,root) %{_datadir}/%{name}-common/scripts/network/cisco
+%config(noreplace) %{_sysconfdir}/%{name}/agent
+%dir %{_localstatedir}/log/%{name}/agent
+%attr(0644,root,root) %{_datadir}/%{name}-agent/lib/*.jar
+%attr(0755,root,root) %{_datadir}/%{name}-agent/lib/libvirtqemuhook
+%attr(0755,root,root) %{_datadir}/%{name}-agent/lib/rolling-maintenance
+%dir %{_datadir}/%{name}-agent/plugins
+%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE
+
+%files common
+%dir %attr(0755,root,root) %{python_sitearch}/cloudutils
+%dir %attr(0755,root,root) %{_datadir}/%{name}-common/vms
+%attr(0755,root,root) %{_datadir}/%{name}-common/scripts
+%attr(0755,root,root) /usr/bin/cloudstack-sccs
+%attr(0644, root, root) %{_datadir}/%{name}-common/vms/systemvm.iso
+%attr(0644,root,root) %{python_sitearch}/cloud_utils.py
+%attr(0644,root,root) %{python_sitearch}/__pycache__/*
+%attr(0644,root,root) %{python_sitearch}/cloudutils/*
+%attr(0644, root, root) %{_datadir}/%{name}-common/lib/jasypt-1.9.3.jar
+%{_defaultdocdir}/%{name}-common-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-common-%{version}/NOTICE
+
+%files ui
+%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/ui/config.json
+%attr(0644,root,root) %{_datadir}/%{name}-ui/*
+%{_defaultdocdir}/%{name}-ui-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-ui-%{version}/NOTICE
+
+%files usage
+%attr(0644,root,root) %{_unitdir}/%{name}-usage.service
+%config(noreplace) %{_sysconfdir}/default/%{name}-usage
+%attr(0644,root,root) %{_datadir}/%{name}-usage/*.jar
+%attr(0644,root,root) %{_datadir}/%{name}-usage/lib/*.jar
+%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/usage
+%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/db.properties
+%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/log4j-cloud.xml
+%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE
+
+%files cli
+%attr(0644,root,root) %{python_sitearch}/cloudapis.py
+%attr(0644,root,root) %{python_sitearch}/cloudtool/__init__.py
+%attr(0644,root,root) %{python_sitearch}/cloudtool/utils.py
+%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE
+
+%files marvin
+%attr(0644,root,root) %{_datadir}/%{name}-marvin/Marvin*.tar.gz
+%{_defaultdocdir}/%{name}-marvin-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-marvin-%{version}/NOTICE
+
+%files integration-tests
+%attr(0755,root,root) %{_datadir}/%{name}-integration-tests/*
+%{_defaultdocdir}/%{name}-integration-tests-%{version}/LICENSE
+%{_defaultdocdir}/%{name}-integration-tests-%{version}/NOTICE
+
+%if "%{_ossnoss}" == "noredist"
+%files mysql-ha
+%defattr(0644,cloud,cloud,0755)
+%attr(0644,root,root) %{_datadir}/%{name}-management/lib/*mysqlha*jar
+%endif
+
+%files baremetal-agent
+%attr(0755,root,root) %{_bindir}/cloudstack-setup-baremetal
+
+%changelog
+* Thu Apr 30 2015 Rohit Yadav <bhaisaab@apache.org> 4.6.0
+- Remove awsapi package
+
+* Wed Nov 19 2014 Hugo Trippaers <hugo@apache.org> 4.6.0
+- Create a specific spec for CentOS 7
+
+* Fri Jul 4 2014 Hugo Trippaers <hugo@apache.org> 4.5.0
+- Add a package for the mysql ha module
+
+* Fri Oct 5 2012 Hugo Trippaers <hugo@apache.org> 4.1.0
+- new style spec file
+
diff --git a/packaging/centos8/cloudstack-agent.te b/packaging/centos8/cloudstack-agent.te
new file mode 100644
index 0000000..4259e17
--- /dev/null
+++ b/packaging/centos8/cloudstack-agent.te
@@ -0,0 +1,33 @@
+# 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.
+
+module cloudstack-agent 1.0;
+
+require {
+	type nfs_t;
+	type system_conf_t;
+	type mount_t;
+	type qemu_t;
+	class file unlink;
+	class filesystem getattr;
+}
+
+#============= mount_t ==============
+allow mount_t system_conf_t:file unlink;
+
+#============= qemu_t ==============
+allow qemu_t nfs_t:filesystem getattr;
diff --git a/packaging/centos8/cloudstack-sccs b/packaging/centos8/cloudstack-sccs
new file mode 100644
index 0000000..e05d372
--- /dev/null
+++ b/packaging/centos8/cloudstack-sccs
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# 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.
+
+cat /usr/share/cloudstack-common/scripts/gitrev.txt
diff --git a/packaging/centos8/replace.properties b/packaging/centos8/replace.properties
new file mode 100644
index 0000000..8c3560d
--- /dev/null
+++ b/packaging/centos8/replace.properties
@@ -0,0 +1,59 @@
+# 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.
+
+DBUSER=cloud
+DBPW=cloud
+DBROOTPW=
+MSLOG=vmops.log
+APISERVERLOG=api.log
+DBHOST=localhost
+DBDRIVER=jdbc:mysql
+COMPONENTS-SPEC=components-premium.xml
+REMOTEHOST=localhost
+AGENTCLASSPATH=
+AGENTLOG=/var/log/cloudstack/agent/agent.log
+AGENTLOGDIR=/var/log/cloudstack/agent/
+AGENTSYSCONFDIR=/etc/cloudstack/agent
+APISERVERLOG=/var/log/cloudstack/management/apilog.log
+BINDIR=/usr/bin
+COMMONLIBDIR=/usr/share/cloudstack-common
+CONFIGUREVARS=
+DEPSCLASSPATH=
+DOCDIR=
+IPALOCATORLOG=/var/log/cloudstack/management/ipallocator.log
+JAVADIR=/usr/share/java
+LIBEXECDIR=/usr/libexec
+LOCKDIR=/var/lock
+MSCLASSPATH=
+MSCONF=/etc/cloudstack/management
+MSENVIRON=/usr/share/cloudstack-management
+MSLOG=/var/log/cloudstack/management/management-server.log
+MSLOGDIR=/var/log/cloudstack/management/
+MSMNTDIR=/var/cloudstack/mnt
+MSUSER=cloud
+PIDDIR=/var/run
+PLUGINJAVADIR=/usr/share/cloudstack-management/plugin
+PREMIUMJAVADIR=/usr/share/cloudstack-management/premium
+PYTHONDIR=/usr/lib/python3.6/site-packages/
+SERVERSYSCONFDIR=/etc/sysconfig
+SETUPDATADIR=/usr/share/cloudstack-management/setup
+SYSCONFDIR=/etc/sysconfig
+SYSTEMCLASSPATH=
+SYSTEMJARS=
+USAGECLASSPATH=
+USAGELOG=/var/log/cloudstack/usage/usage.log
+USAGESYSCONFDIR=/etc/sysconfig
diff --git a/packaging/debian/replace.properties b/packaging/debian/replace.properties
index 258cb84..5007360 100644
--- a/packaging/debian/replace.properties
+++ b/packaging/debian/replace.properties
@@ -48,7 +48,7 @@
 PIDDIR=/var/run
 PLUGINJAVADIR=
 PREMIUMJAVADIR=
-PYTHONDIR=/usr/lib/python2.6/site-packages/
+PYTHONDIR=/usr/lib/python3/site-packages/
 SERVERSYSCONFDIR=/etc/cloudstack/server
 SETUPDATADIR=/usr/share/cloudstack-management/setup
 SYSCONFDIR=/etc
diff --git a/packaging/systemd/cloudstack-agent.default b/packaging/systemd/cloudstack-agent.default
index dba2c0c..a319c4e 100644
--- a/packaging/systemd/cloudstack-agent.default
+++ b/packaging/systemd/cloudstack-agent.default
@@ -23,4 +23,4 @@
 
 #You can uncomment this if you want to enable Java remote debugging.
 #Feel free to change the parameters at your will. The 'address' field defines the port to be used.
-#JAVA_DEBUG="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
+#JAVA_DEBUG="-agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n"
diff --git a/packaging/systemd/cloudstack-management.default b/packaging/systemd/cloudstack-management.default
index a431e8b..6444c61 100644
--- a/packaging/systemd/cloudstack-management.default
+++ b/packaging/systemd/cloudstack-management.default
@@ -26,7 +26,7 @@
 #You can change the parameters at your will. The 'address' field defines the port to be used.  #
 ################################################################################################ 
 # This option here should be used with 'systemmd' based operating systems such as CentOS7, Ubuntu 16, and so on.
-#JAVA_DEBUG="-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n"
+#JAVA_DEBUG="-agentlib:jdwp=transport=dt_socket,address=*:8000,server=y,suspend=n"
 
 # On the other hand, this option is used by CentOS6.
-#JAVA_DEBUG="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
\ No newline at end of file
+#JAVA_DEBUG="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
diff --git a/plugins/acl/dynamic-role-based/pom.xml b/plugins/acl/dynamic-role-based/pom.xml
index 30d0c93..3ba0b67 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java b/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java
index d8612a6..02cdf2a 100644
--- a/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java
+++ b/plugins/acl/dynamic-role-based/src/main/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java
@@ -25,10 +25,12 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-import com.cloud.exception.UnavailableCommandException;
 import org.apache.cloudstack.api.APICommand;
+import org.apache.log4j.Logger;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
 
 import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.UnavailableCommandException;
 import com.cloud.user.Account;
 import com.cloud.user.AccountService;
 import com.cloud.user.User;
@@ -44,7 +46,9 @@
     private RoleService roleService;
 
     private List<PluggableService> services;
-    private Map<RoleType, Set<String>> annotationRoleBasedApisMap = new HashMap<>();
+    private Map<RoleType, Set<String>> annotationRoleBasedApisMap = new HashMap<RoleType, Set<String>>();
+
+    private static final Logger logger = Logger.getLogger(DynamicRoleBasedAPIAccessChecker.class.getName());
 
     protected DynamicRoleBasedAPIAccessChecker() {
         super();
@@ -84,7 +88,7 @@
         // Check against current list of permissions
         for (final RolePermission permission : roleService.findAllPermissionsBy(accountRole.getId())) {
             if (permission.getRule().matches(commandName)) {
-                if (RolePermission.Permission.ALLOW.equals(permission.getPermission())) {
+                if (Permission.ALLOW.equals(permission.getPermission())) {
                     return true;
                 } else {
                     denyApiAccess(commandName);
diff --git a/plugins/acl/dynamic-role-based/src/test/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessCheckerTest.java b/plugins/acl/dynamic-role-based/src/test/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessCheckerTest.java
index 12ebbe5..6bae346 100644
--- a/plugins/acl/dynamic-role-based/src/test/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessCheckerTest.java
+++ b/plugins/acl/dynamic-role-based/src/test/java/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessCheckerTest.java
@@ -16,13 +16,9 @@
 // under the License.
 package org.apache.cloudstack.acl;
 
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.user.Account;
-import com.cloud.user.AccountService;
-import com.cloud.user.AccountVO;
-import com.cloud.user.User;
-import com.cloud.user.UserVO;
-import junit.framework.TestCase;
+import java.lang.reflect.Field;
+import java.util.Collections;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -30,8 +26,16 @@
 import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
 
-import java.lang.reflect.Field;
-import java.util.Collections;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import com.cloud.user.AccountVO;
+import com.cloud.user.User;
+import com.cloud.user.UserVO;
+
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+
+import junit.framework.TestCase;
 
 @RunWith(MockitoJUnitRunner.class)
 public class DynamicRoleBasedAPIAccessCheckerTest extends TestCase {
@@ -117,7 +121,7 @@
     @Test
     public void testValidAllowRolePermissionApiCheckAccess() {
         final String allowedApiName = "someAllowedApi";
-        final RolePermission permission = new RolePermissionVO(1L, allowedApiName, RolePermission.Permission.ALLOW, null);
+        final RolePermission permission = new RolePermissionVO(1L, allowedApiName, Permission.ALLOW, null);
         Mockito.when(roleService.findAllPermissionsBy(Mockito.anyLong())).thenReturn(Collections.singletonList(permission));
         assertTrue(apiAccessChecker.checkAccess(getTestUser(), allowedApiName));
     }
@@ -125,7 +129,7 @@
     @Test
     public void testValidAllowRolePermissionWildcardCheckAccess() {
         final String allowedApiName = "someAllowedApi";
-        final RolePermission permission = new RolePermissionVO(1L, "some*", RolePermission.Permission.ALLOW, null);
+        final RolePermission permission = new RolePermissionVO(1L, "some*", Permission.ALLOW, null);
         Mockito.when(roleService.findAllPermissionsBy(Mockito.anyLong())).thenReturn(Collections.singletonList(permission));
         assertTrue(apiAccessChecker.checkAccess(getTestUser(), allowedApiName));
     }
@@ -133,7 +137,7 @@
     @Test
     public void testValidDenyRolePermissionApiCheckAccess() {
         final String denyApiName = "someDeniedApi";
-        final RolePermission permission = new RolePermissionVO(1L, denyApiName, RolePermission.Permission.DENY, null);
+        final RolePermission permission = new RolePermissionVO(1L, denyApiName, Permission.DENY, null);
         Mockito.when(roleService.findAllPermissionsBy(Mockito.anyLong())).thenReturn(Collections.singletonList(permission));
         try {
             apiAccessChecker.checkAccess(getTestUser(), denyApiName);
@@ -145,7 +149,7 @@
     @Test
     public void testValidDenyRolePermissionWildcardCheckAccess() {
         final String denyApiName = "someDenyApi";
-        final RolePermission permission = new RolePermissionVO(1L, "*Deny*", RolePermission.Permission.DENY, null);
+        final RolePermission permission = new RolePermissionVO(1L, "*Deny*", Permission.DENY, null);
         Mockito.when(roleService.findAllPermissionsBy(Mockito.anyLong())).thenReturn(Collections.singletonList(permission));
         try {
             apiAccessChecker.checkAccess(getTestUser(), denyApiName);
diff --git a/plugins/acl/project-role-based/pom.xml b/plugins/acl/project-role-based/pom.xml
new file mode 100644
index 0000000..4618683
--- /dev/null
+++ b/plugins/acl/project-role-based/pom.xml
@@ -0,0 +1,30 @@
+<!--
+  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-acl-project-role-based</artifactId>
+    <name>Apache CloudStack Plugin - ACL Project Role Based</name>
+    <parent>
+        <groupId>org.apache.cloudstack</groupId>
+        <artifactId>cloudstack-plugins</artifactId>
+        <version>4.15.1.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+</project>
diff --git a/plugins/acl/project-role-based/src/main/java/org/apache/cloudstack/acl/ProjectRoleBasedApiAccessChecker.java b/plugins/acl/project-role-based/src/main/java/org/apache/cloudstack/acl/ProjectRoleBasedApiAccessChecker.java
new file mode 100644
index 0000000..5a17bb9
--- /dev/null
+++ b/plugins/acl/project-role-based/src/main/java/org/apache/cloudstack/acl/ProjectRoleBasedApiAccessChecker.java
@@ -0,0 +1,148 @@
+// 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.acl;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.UnavailableCommandException;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.cloud.projects.dao.ProjectAccountDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import com.cloud.user.User;
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.component.PluggableService;
+
+public class ProjectRoleBasedApiAccessChecker  extends AdapterBase implements APIAclChecker {
+
+    @Inject
+    ProjectAccountDao projectAccountDao;
+    @Inject
+    ProjectRoleService projectRoleService;
+    @Inject
+    RoleService roleService;
+    @Inject
+    AccountService accountService;
+
+    private List<PluggableService> services;
+    private static final Logger LOGGER = Logger.getLogger(ProjectRoleBasedApiAccessChecker.class.getName());
+    protected ProjectRoleBasedApiAccessChecker() {
+        super();
+    }
+
+    private void denyApiAccess(final String commandName) throws PermissionDeniedException {
+        throw new PermissionDeniedException("The API " + commandName + " is blacklisted for the user's/account's project role.");
+    }
+
+
+    public boolean isDisabled() {
+        return !roleService.isEnabled();
+    }
+
+    @Override
+    public boolean checkAccess(User user, String apiCommandName) throws PermissionDeniedException {
+        if (isDisabled()) {
+            return true;
+        }
+
+        Account userAccount = accountService.getAccount(user.getAccountId());
+        Project project = CallContext.current().getProject();
+        if (project == null) {
+            return true;
+        }
+
+        if (accountService.isRootAdmin(userAccount.getId()) || accountService.isDomainAdmin(userAccount.getAccountId())) {
+            return true;
+        }
+
+        ProjectAccount projectUser = projectAccountDao.findByProjectIdUserId(project.getId(), userAccount.getAccountId(), user.getId());
+        if (projectUser != null) {
+            if (projectUser.getAccountRole() == ProjectAccount.Role.Admin) {
+                return true;
+            } else {
+                return isPermitted(project, projectUser, apiCommandName);
+            }
+        }
+
+        ProjectAccount projectAccount = projectAccountDao.findByProjectIdAccountId(project.getId(), userAccount.getAccountId());
+        if (projectAccount != null) {
+            if (projectAccount.getAccountRole() == ProjectAccount.Role.Admin) {
+                return true;
+            } else {
+                return isPermitted(project, projectAccount, apiCommandName);
+            }
+        }
+        // Default deny all
+        if ("updateProjectInvitation".equals(apiCommandName)) {
+            return true;
+        }
+        throw new UnavailableCommandException("The API " + apiCommandName + " does not exist or is not available for this account/user in project "+project.getUuid());
+    }
+
+    private boolean isPermitted(Project project, ProjectAccount projectUser, String apiCommandName) {
+        ProjectRole projectRole = null;
+        if(projectUser.getProjectRoleId() != null) {
+            projectRole = projectRoleService.findProjectRole(projectUser.getProjectRoleId(), project.getId());
+        }
+
+        if (projectRole == null) {
+            return true;
+        }
+
+        for (ProjectRolePermission permission : projectRoleService.findAllProjectRolePermissions(project.getId(), projectRole.getId())) {
+            if (permission.getRule().matches(apiCommandName)) {
+                if (Permission.ALLOW.equals(permission.getPermission())) {
+                    return true;
+                } else {
+                    denyApiAccess(apiCommandName);
+                }
+            }
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        super.configure(name, params);
+        return true;
+    }
+
+    @Override
+    public boolean start() {
+        return super.start();
+    }
+
+    public List<PluggableService> getServices() {
+        return services;
+    }
+
+    @Inject
+    public void setServices(List<PluggableService> services) {
+        this.services = services;
+    }
+}
diff --git a/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/module.properties b/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/module.properties
new file mode 100644
index 0000000..76064d4
--- /dev/null
+++ b/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/module.properties
@@ -0,0 +1,18 @@
+# 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=acl-project-role-based
+parent=api
\ No newline at end of file
diff --git a/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/spring-acl-project-role-based-context.xml b/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/spring-acl-project-role-based-context.xml
new file mode 100644
index 0000000..8aa185d
--- /dev/null
+++ b/plugins/acl/project-role-based/src/main/resources/META-INF/cloudstack/acl-project-role-based/spring-acl-project-role-based-context.xml
@@ -0,0 +1,33 @@
+<!--
+  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="ProjectRoleBasedAPIAccessChecker" class="org.apache.cloudstack.acl.ProjectRoleBasedApiAccessChecker" >
+        <property name="services" value="#{apiCommandsRegistry.registered}" />
+    </bean>
+</beans>
diff --git a/plugins/acl/static-role-based/pom.xml b/plugins/acl/static-role-based/pom.xml
index 3c4c3be..6e7f00c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 e5055d5..ab306ea 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 d399375..a71ff7a 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 00d0ba9..a54c594 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 51113db..c25de15 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 1773a0f..50cb3f4 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/api/discovery/pom.xml b/plugins/api/discovery/pom.xml
index 7fa7c7d..d86a928 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java b/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
index 62164db..5d22856 100644
--- a/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
+++ b/plugins/api/discovery/src/main/java/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java
@@ -16,13 +16,17 @@
 // under the License.
 package org.apache.cloudstack.discovery;
 
-import com.cloud.serializer.Param;
-import com.cloud.user.User;
-import com.cloud.utils.ReflectUtil;
-import com.cloud.utils.StringUtils;
-import com.cloud.utils.component.ComponentLifecycleBase;
-import com.cloud.utils.component.PluggableService;
-import com.google.gson.annotations.SerializedName;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+
 import org.apache.cloudstack.acl.APIChecker;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -39,14 +43,13 @@
 import org.reflections.ReflectionUtils;
 import org.springframework.stereotype.Component;
 
-import javax.inject.Inject;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import com.cloud.serializer.Param;
+import com.cloud.user.User;
+import com.cloud.utils.ReflectUtil;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.component.ComponentLifecycleBase;
+import com.cloud.utils.component.PluggableService;
+import com.google.gson.annotations.SerializedName;
 
 @Component
 public class ApiDiscoveryServiceImpl extends ComponentLifecycleBase implements ApiDiscoveryService {
@@ -65,7 +68,7 @@
         if (s_apiNameDiscoveryResponseMap == null) {
             long startTime = System.nanoTime();
             s_apiNameDiscoveryResponseMap = new HashMap<String, ApiDiscoveryResponse>();
-            Set<Class<?>> cmdClasses = new HashSet<Class<?>>();
+            Set<Class<?>> cmdClasses = new LinkedHashSet<Class<?>>();
             for (PluggableService service : _services) {
                 s_logger.debug(String.format("getting api commands of service: %s", service.getClass().getName()));
                 cmdClasses.addAll(service.getCommands());
diff --git a/plugins/api/rate-limit/pom.xml b/plugins/api/rate-limit/pom.xml
index ff7e0b2..8bd6c56 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 4fec020..cd0011c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 e7be3d9..e50f36e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/backup/dummy/pom.xml b/plugins/backup/dummy/pom.xml
index 0c57831..d309b6c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/backup/veeam/pom.xml b/plugins/backup/veeam/pom.xml
index 6cb0bcd..4fab8af 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.14.2.0-SNAPSHOT</version>
+    <version>4.15.1.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 4e56c00..94f09fa 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 338d23d..9a86e57 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/database/quota/pom.xml b/plugins/database/quota/pom.xml
index 4f387e2..c9e9f75 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/dedicated-resources/pom.xml b/plugins/dedicated-resources/pom.xml
index 66b00d5..3da0f29 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 2e0133e..ec79c99 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 945f7a7..edcfb59 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 aa21f2f..726a613 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 200cf10..6f3b2bd 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 af952f4..4f8bdf4 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 be13b0d..a171ecf 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
index b2f173e..f54c769 100644
--- a/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
+++ b/plugins/event-bus/rabbitmq/src/main/java/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java
@@ -21,11 +21,14 @@
 
 import java.io.IOException;
 import java.net.ConnectException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.TimeoutException;
 
 import javax.naming.ConfigurationException;
 
@@ -358,8 +361,8 @@
         if (s_connection == null) {
             try {
                 return createConnection();
-            } catch (Exception e) {
-                s_logger.error("Failed to create a connection to AMQP server due to " + e.getMessage());
+            } catch (KeyManagementException | NoSuchAlgorithmException | IOException  | TimeoutException e) {
+                s_logger.error(String.format("Failed to create a connection to AMQP server [AMQP host:%s, port:%d] due to: %s", amqpHost, port, e));
                 throw e;
             }
         } else {
@@ -367,8 +370,7 @@
         }
     }
 
-    private synchronized Connection createConnection() throws Exception {
-        try {
+    private synchronized Connection createConnection() throws KeyManagementException, NoSuchAlgorithmException, IOException, TimeoutException {
             ConnectionFactory factory = new ConnectionFactory();
             factory.setUsername(username);
             factory.setPassword(password);
@@ -389,9 +391,6 @@
             connection.addBlockedListener(blockedConnectionHandler);
             s_connection = connection;
             return s_connection;
-        } catch (Exception e) {
-            throw e;
-        }
     }
 
     private synchronized void closeConnection() {
diff --git a/plugins/ha-planners/skip-heurestics/pom.xml b/plugins/ha-planners/skip-heurestics/pom.xml
index 4ebda2b..3a59ec4 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 7bdcba9..afe1a0a 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/hypervisors/baremetal/pom.xml b/plugins/hypervisors/baremetal/pom.xml
index d30da98..a14332c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>

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

     </parent>

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

@@ -32,20 +32,20 @@
             <groupId>commons-lang</groupId>

             <artifactId>commons-lang</artifactId>

         </dependency>

-        <dependency>
-          <groupId>javax.xml.bind</groupId>
-          <artifactId>jaxb-api</artifactId>
-          <version>${cs.jaxb.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>com.sun.xml.bind</groupId>
-          <artifactId>jaxb-core</artifactId>
-          <version>${cs.jaxb.version}</version>
-        </dependency>
-        <dependency>
-          <groupId>com.sun.xml.bind</groupId>
-          <artifactId>jaxb-impl</artifactId>
-          <version>${cs.jaxb.version}</version>
-        </dependency>
+        <dependency>

+          <groupId>javax.xml.bind</groupId>

+          <artifactId>jaxb-api</artifactId>

+          <version>${cs.jaxb.version}</version>

+        </dependency>

+        <dependency>

+          <groupId>com.sun.xml.bind</groupId>

+          <artifactId>jaxb-core</artifactId>

+          <version>${cs.jaxb.version}</version>

+        </dependency>

+        <dependency>

+          <groupId>com.sun.xml.bind</groupId>

+          <artifactId>jaxb-impl</artifactId>

+          <version>${cs.jaxb.version}</version>

+        </dependency>

     </dependencies>

 </project>

diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalDiscoverer.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalDiscoverer.java
index 98ab514..3bdd2e8 100644
--- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalDiscoverer.java
+++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalDiscoverer.java
@@ -205,7 +205,7 @@
             zone.setDhcpProvider(Network.Provider.ExternalDhcpServer.getName());
             _dcDao.update(zone.getId(), zone);
 
-            s_logger.debug(String.format("Discover Bare Metal host successfully(ip=%1$s, username=%2$s, password=%3%s," +
+            s_logger.debug(String.format("Discover Bare Metal host successfully(ip=%1$s, username=%2$s, password=%3$s," +
                     "cpuNum=%4$s, cpuCapacity-%5$s, memCapacity=%6$s)", ipmiIp, username, "******", cpuNum, cpuCapacity, memCapacity));
             return resources;
         } catch (Exception e) {
diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalPlanner.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalPlanner.java
index 5d6472b..c37b51d 100644
--- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalPlanner.java
+++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/manager/BareMetalPlanner.java
@@ -22,6 +22,7 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.NumbersUtil;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.log4j.Logger;
 
@@ -145,7 +146,7 @@
             }
         }
 
-        s_logger.warn(String.format("Cannot find enough capacity(requested cpu=%1$s memory=%2$s)", cpu_requested, ram_requested));
+        s_logger.warn(String.format("Cannot find enough capacity(requested cpu=%1$s memory=%2$s)", cpu_requested, NumbersUtil.toHumanReadableSize(ram_requested)));
         return null;
     }
 
diff --git a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalUserdataElement.java b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalUserdataElement.java
index b00d490..d2c9731 100644
--- a/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalUserdataElement.java
+++ b/plugins/hypervisors/baremetal/src/main/java/com/cloud/baremetal/networkservice/BaremetalUserdataElement.java
@@ -89,6 +89,11 @@
     }
 
     @Override
+    public boolean saveHypervisorHostname(NicProfile profile, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
     public Map<Service, Map<Capability, String>> getCapabilities() {
         return capabilities;
     }
diff --git a/plugins/hypervisors/hyperv/pom.xml b/plugins/hypervisors/hyperv/pom.xml
index facf85e..b8eb356 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml
index 19c5121..e2e14f8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -67,6 +67,11 @@
             <artifactId>jna</artifactId>
             <version>${cs.jna.version}</version>
         </dependency>
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna-platform</artifactId>
+            <version>${cs.jna.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/dpdk/DpdkDriverImpl.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/dpdk/DpdkDriverImpl.java
index cd962b6..b5886a1 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/dpdk/DpdkDriverImpl.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/dpdk/DpdkDriverImpl.java
@@ -70,9 +70,11 @@
                 dpdkPortVhostUserClientType;
 
         StringBuilder stringBuilder = new StringBuilder();
-        stringBuilder.append(String.format("ovs-vsctl add-port %s %s " +
-                "vlan_mode=access tag=%s " +
-                "-- set Interface %s type=%s", bridgeName, port, vlan, port, type));
+        stringBuilder.append(String.format("ovs-vsctl add-port %s %s ", bridgeName, port));
+        if (Integer.parseInt(vlan) > 0 && Integer.parseInt(vlan) < 4095) {
+            stringBuilder.append(String.format("vlan_mode=access tag=%s ", vlan));
+        }
+        stringBuilder.append(String.format("-- set Interface %s type=%s", port, type));
 
         if (vHostUserMode == DpdkHelper.VHostUserMode.CLIENT) {
             stringBuilder.append(String.format(" options:vhost-server-path=%s/%s",
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 8fe8449..4cb356c 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
@@ -56,6 +56,9 @@
 import org.apache.cloudstack.utils.linux.CPUStat;
 import org.apache.cloudstack.utils.linux.KVMHostInfo;
 import org.apache.cloudstack.utils.linux.MemStat;
+import org.apache.cloudstack.utils.qemu.QemuImg;
+import org.apache.cloudstack.utils.qemu.QemuImgException;
+import org.apache.cloudstack.utils.qemu.QemuImgFile;
 import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat;
 import org.apache.cloudstack.utils.security.KeyStoreUtils;
 import org.apache.commons.collections.MapUtils;
@@ -798,14 +801,14 @@
             throw new ConfigurationException("Unable to find the router_proxy.sh");
         }
 
-        _ovsPvlanDhcpHostPath = Script.findScript(networkScriptsDir, "ovs-pvlan-dhcp-host.sh");
+        _ovsPvlanDhcpHostPath = Script.findScript(networkScriptsDir, "ovs-pvlan-kvm-dhcp-host.sh");
         if (_ovsPvlanDhcpHostPath == null) {
-            throw new ConfigurationException("Unable to find the ovs-pvlan-dhcp-host.sh");
+            throw new ConfigurationException("Unable to find the ovs-pvlan-kvm-dhcp-host.sh");
         }
 
-        _ovsPvlanVmPath = Script.findScript(networkScriptsDir, "ovs-pvlan-vm.sh");
+        _ovsPvlanVmPath = Script.findScript(networkScriptsDir, "ovs-pvlan-kvm-vm.sh");
         if (_ovsPvlanVmPath == null) {
-            throw new ConfigurationException("Unable to find the ovs-pvlan-vm.sh");
+            throw new ConfigurationException("Unable to find the ovs-pvlan-kvm-vm.sh");
         }
 
         String value = (String)params.get("developer");
@@ -2528,6 +2531,15 @@
                 volPath = physicalDisk.getPath();
             }
 
+            if (volume.getType() != Volume.Type.ISO
+                    && physicalDisk != null && physicalDisk.getFormat() == PhysicalDiskFormat.QCOW2
+                    && (pool.getType() == StoragePoolType.NetworkFilesystem
+                    || pool.getType() == StoragePoolType.SharedMountPoint
+                    || pool.getType() == StoragePoolType.Filesystem
+                    || pool.getType() == StoragePoolType.Gluster)) {
+                setBackingFileFormat(physicalDisk.getPath());
+            }
+
             // check for disk activity, if detected we should exit because vm is running elsewhere
             if (_diskActivityCheckEnabled && physicalDisk != null && physicalDisk.getFormat() == PhysicalDiskFormat.QCOW2) {
                 s_logger.debug("Checking physical disk file at path " + volPath + " for disk activity to ensure vm is not running elsewhere");
@@ -4245,4 +4257,25 @@
             cmd.setTopology(numCoresPerSocket, vcpus / numCoresPerSocket);
         }
     }
+
+    public void setBackingFileFormat(String volPath) {
+        final int timeout = 0;
+        QemuImgFile file = new QemuImgFile(volPath);
+        QemuImg qemu = new QemuImg(timeout);
+        try{
+            Map<String, String> info = qemu.info(file);
+            String backingFilePath = info.get(new String("backing_file"));
+            String backingFileFormat = info.get(new String("backing_file_format"));
+            if (org.apache.commons.lang.StringUtils.isEmpty(backingFileFormat)) {
+                s_logger.info("Setting backing file format of " + volPath);
+                QemuImgFile backingFile = new QemuImgFile(backingFilePath);
+                Map<String, String> backingFileinfo = qemu.info(backingFile);
+                String backingFileFmt = backingFileinfo.get(new String("file_format"));
+                qemu.rebase(file, backingFile, backingFileFmt, false);
+            }
+        } catch (QemuImgException e) {
+            s_logger.error("Failed to set backing file format of " + volPath + " due to : " + e.getMessage());
+        }
+    }
+
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
index 51ebdb3..bb3f713 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
@@ -84,7 +84,11 @@
                     String authUserName = getAttrValue("auth", "username", disk);
                     String poolUuid = getAttrValue("secret", "uuid", disk);
                     String host = getAttrValue("host", "name", disk);
-                    int port = Integer.parseInt(getAttrValue("host", "port", disk));
+                    int port = 0;
+                    String xmlPort = getAttrValue("host", "port", disk);
+                    if (StringUtils.isNotBlank(xmlPort)) {
+                        port = Integer.parseInt(xmlPort);
+                    }
                     String diskLabel = getAttrValue("target", "dev", disk);
                     String bus = getAttrValue("target", "bus", disk);
 
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 31fe88f..56519ae 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
@@ -147,7 +147,12 @@
         }
         if (_poolType == PoolType.RBD) {
             storagePoolBuilder.append("<source>\n");
-            storagePoolBuilder.append("<host name='" + _sourceHost + "' port='" + _sourcePort + "'/>\n");
+            if (_sourcePort > 0) {
+                storagePoolBuilder.append("<host name='" + _sourceHost + "' port='" + _sourcePort + "'/>\n");
+            } else {
+                storagePoolBuilder.append("<host name='" + _sourceHost + "'/>\n");
+            }
+
             storagePoolBuilder.append("<name>" + _sourceDir + "</name>\n");
             if (_authUsername != null) {
                 storagePoolBuilder.append("<auth username='" + _authUsername + "' type='" + _authType + "'>\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 239cc3d..7b70c37 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
@@ -23,6 +23,7 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -55,7 +56,11 @@
             String format = getAttrValue("format", "type", source);
 
             if (type.equalsIgnoreCase("rbd")) {
-                int port = Integer.parseInt(getAttrValue("host", "port", source));
+                int port = 0;
+                String xmlPort = getAttrValue("host", "port", source);
+                if (StringUtils.isNotBlank(xmlPort)) {
+                    port = Integer.parseInt(xmlPort);
+                }
                 String pool = getTagValue("name", source);
 
                 Element auth = (Element)source.getElementsByTagName("auth").item(0);
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtBackupSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtBackupSnapshotCommandWrapper.java
index b2a8d06..70dce76 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtBackupSnapshotCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtBackupSnapshotCommandWrapper.java
@@ -51,6 +51,8 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @ResourceWrapper(handles =  BackupSnapshotCommand.class)
 public final class LibvirtBackupSnapshotCommandWrapper extends CommandWrapper<BackupSnapshotCommand, Answer, LibvirtComputingResource> {
 
@@ -121,7 +123,7 @@
                             bos.write(buf, 0, bytes);
                             offset += bytes;
                         }
-                        s_logger.debug("Completed backing up RBD snapshot " + snapshotName + " to  " + snapshotDestPath + ". Bytes written: " + offset);
+                        s_logger.debug("Completed backing up RBD snapshot " + snapshotName + " to  " + snapshotDestPath + ". Bytes written: " + toHumanReadableSize(offset));
                     }catch(final IOException ex)
                     {
                         s_logger.error("BackupSnapshotAnswer:Exception:"+ ex.getMessage());
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java
index a0faa37..5b55db2 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java
@@ -24,7 +24,7 @@
 import org.apache.log4j.Logger;
 import org.libvirt.Connect;
 import org.libvirt.Domain;
-import org.libvirt.DomainInfo.DomainState;
+import org.libvirt.DomainInfo;
 import org.libvirt.DomainSnapshot;
 import org.libvirt.LibvirtException;
 
@@ -52,18 +52,33 @@
         final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr();
         Domain dm = null;
         DomainSnapshot snapshot = null;
+        DomainInfo.DomainState oldState = null;
+        boolean tryingResume = false;
+        Connect conn = null;
         try {
             final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
-            Connect conn = libvirtUtilitiesHelper.getConnection();
+            conn = libvirtUtilitiesHelper.getConnection();
             dm = libvirtComputingResource.getDomain(conn, vmName);
 
             snapshot = dm.snapshotLookupByName(cmd.getTarget().getSnapshotName());
 
-            s_logger.debug("Suspending domain " + vmName);
-            dm.suspend(); // suspend the vm to avoid image corruption
+            oldState = dm.getInfo().state;
+            if (oldState == DomainInfo.DomainState.VIR_DOMAIN_RUNNING) {
+                s_logger.debug("Suspending domain " + vmName);
+                dm.suspend(); // suspend the vm to avoid image corruption
+            }
 
             snapshot.delete(0); // only remove this snapshot, not children
 
+            if (oldState == DomainInfo.DomainState.VIR_DOMAIN_RUNNING) {
+                // Resume the VM
+                tryingResume = true;
+                dm = libvirtComputingResource.getDomain(conn, vmName);
+                if (dm.getInfo().state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) {
+                    dm.resume();
+                }
+            }
+
             return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs());
         } catch (LibvirtException e) {
             String msg = " Delete VM snapshot failed due to " + e.toString();
@@ -97,21 +112,26 @@
             } else if (snapshot == null) {
                 s_logger.debug("Can not find vm snapshot " + cmd.getTarget().getSnapshotName() + " on vm: " + vmName + ", return true");
                 return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs());
+            } else if (tryingResume) {
+                s_logger.error("Failed to resume vm after delete snapshot " + cmd.getTarget().getSnapshotName() + " on vm: " + vmName + " return true : " + e);
+                return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs());
             }
 
             s_logger.warn(msg, e);
             return new DeleteVMSnapshotAnswer(cmd, false, msg);
         } finally {
             if (dm != null) {
+                // Make sure if the VM is paused, then resume it, in case we got an exception during our delete() and didn't have the chance before
                 try {
-                    if (dm.getInfo().state == DomainState.VIR_DOMAIN_PAUSED) {
+                    dm = libvirtComputingResource.getDomain(conn, vmName);
+                    if (oldState == DomainInfo.DomainState.VIR_DOMAIN_RUNNING && dm.getInfo().state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) {
                         s_logger.debug("Resuming domain " + vmName);
                         dm.resume();
                     }
                     dm.free();
-                } catch (LibvirtException l) {
-                    s_logger.trace("Ignoring libvirt error.", l);
-                };
+                } catch (LibvirtException e) {
+                    s_logger.error("Failed to resume vm after delete snapshot " + cmd.getTarget().getSnapshotName() + " on vm: " + vmName + " return true : " + e);
+                }
             }
         }
     }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
index f0eb287..841eadf 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java
@@ -22,6 +22,7 @@
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URISyntaxException;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,12 +38,12 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamResult;
 
+import com.cloud.agent.api.to.DiskTO;
 import com.cloud.agent.api.to.DpdkTO;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.io.IOUtils;
@@ -64,6 +65,7 @@
 import com.cloud.agent.api.MigrateAnswer;
 import com.cloud.agent.api.MigrateCommand;
 import com.cloud.agent.api.MigrateCommand.MigrateDiskInfo;
+import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
 import com.cloud.hypervisor.kvm.resource.LibvirtConnection;
 import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
@@ -115,6 +117,9 @@
             conn = libvirtUtilitiesHelper.getConnectionByVmName(vmName);
             ifaces = libvirtComputingResource.getInterfaces(conn, vmName);
             disks = libvirtComputingResource.getDisks(conn, vmName);
+
+            VirtualMachineTO to = command.getVirtualMachine();
+
             dm = conn.domainLookupByName(vmName);
             /*
                 We replace the private IP address with the address of the destination host.
@@ -141,9 +146,23 @@
             xmlDesc = dm.getXMLDesc(xmlFlag);
             xmlDesc = replaceIpForVNCInDescFile(xmlDesc, target);
 
+            String oldIsoVolumePath = getOldVolumePath(disks, vmName);
+            String newIsoVolumePath = getNewVolumePathIfDatastoreHasChanged(libvirtComputingResource, conn, to);
+            if (newIsoVolumePath != null && !newIsoVolumePath.equals(oldIsoVolumePath)) {
+                s_logger.debug("Editing mount path");
+                xmlDesc = replaceDiskSourceFile(xmlDesc, newIsoVolumePath, vmName);
+            }
             // delete the metadata of vm snapshots before migration
             vmsnapshots = libvirtComputingResource.cleanVMSnapshotMetadata(dm);
 
+            // Verify Format of backing file
+            for (DiskDef disk : disks) {
+                if (disk.getDeviceType() == DiskDef.DeviceType.DISK
+                        && disk.getDiskFormatType() == DiskDef.DiskFmtType.QCOW2) {
+                    libvirtComputingResource.setBackingFileFormat(disk.getDiskPath());
+                }
+            }
+
             Map<String, MigrateCommand.MigrateDiskInfo> mapMigrateStorage = command.getMigrateStorage();
             // migrateStorage is declared as final because the replaceStorage method may mutate mapMigrateStorage, but
             // migrateStorage's value should always only be associated with the initial state of mapMigrateStorage.
@@ -226,30 +245,16 @@
             if (result.startsWith("unable to connect to server") && result.endsWith("refused")) {
                 result = String.format("Migration was refused connection to destination: %s. Please check libvirt configuration compatibility and firewall rules on the source and destination hosts.", destinationUri);
             }
-        } catch (final InterruptedException e) {
-            s_logger.debug("Interrupted while migrating domain: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final ExecutionException e) {
-            s_logger.debug("Failed to execute while migrating domain: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final TimeoutException e) {
-            s_logger.debug("Timed out while migrating domain: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final IOException e) {
-            s_logger.debug("IOException: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final ParserConfigurationException e) {
-            s_logger.debug("ParserConfigurationException: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final SAXException e) {
-            s_logger.debug("SAXException: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final TransformerConfigurationException e) {
-            s_logger.debug("TransformerConfigurationException: " + e.getMessage());
-            result = e.getMessage();
-        } catch (final TransformerException e) {
-            s_logger.debug("TransformerException: " + e.getMessage());
-            result = e.getMessage();
+        } catch (final InterruptedException
+            | ExecutionException
+            | TimeoutException
+            | IOException
+            | ParserConfigurationException
+            | SAXException
+            | TransformerException
+            | URISyntaxException e) {
+            s_logger.debug(String.format("%s : %s", e.getClass().getSimpleName(), e.getMessage()));
+            result = "Exception during migrate: " + e.getMessage();
         } finally {
             try {
                 if (dm != null && result != null) {
@@ -507,6 +512,33 @@
         return getXml(doc);
     }
 
+    private  String getOldVolumePath(List<DiskDef> disks, String vmName) {
+        String oldIsoVolumePath = null;
+        for (DiskDef disk : disks) {
+            if (disk.getDiskPath() != null && disk.getDiskPath().contains(vmName)) {
+                oldIsoVolumePath = disk.getDiskPath();
+                break;
+            }
+        }
+        return oldIsoVolumePath;
+    }
+
+    private String getNewVolumePathIfDatastoreHasChanged(LibvirtComputingResource libvirtComputingResource, Connect conn, VirtualMachineTO to) throws LibvirtException, URISyntaxException {
+        DiskTO newDisk = null;
+        for (DiskTO disk : to.getDisks()) {
+            if (disk.getPath() != null && disk.getPath().contains("configdrive")) {
+                newDisk = disk;
+                break;
+            }
+        }
+
+        String newIsoVolumePath = null;
+        if (newDisk != null) {
+            newIsoVolumePath = libvirtComputingResource.getVolumePath(conn, newDisk);
+        }
+        return newIsoVolumePath;
+    }
+
     private String getPathFromSourceText(Set<String> paths, String sourceText) {
         if (paths != null && !StringUtils.isBlank(sourceText)) {
             for (String path : paths) {
@@ -572,4 +604,62 @@
 
         return byteArrayOutputStream.toString();
     }
+
+    private String replaceDiskSourceFile(String xmlDesc, String isoPath, String vmName) throws IOException, SAXException, ParserConfigurationException, TransformerException {
+        InputStream in = IOUtils.toInputStream(xmlDesc);
+
+        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+        Document doc = docBuilder.parse(in);
+
+        // Get the root element
+        Node domainNode = doc.getFirstChild();
+
+        NodeList domainChildNodes = domainNode.getChildNodes();
+
+        for (int i = 0; i < domainChildNodes.getLength(); i++) {
+            Node domainChildNode = domainChildNodes.item(i);
+
+            if ("devices".equals(domainChildNode.getNodeName())) {
+                NodeList devicesChildNodes = domainChildNode.getChildNodes();
+                if (findDiskNode(doc, devicesChildNodes, vmName, isoPath)) {
+                    break;
+                }
+            }
+        }
+        return getXml(doc);
+    }
+
+    private boolean findDiskNode(Document doc, NodeList devicesChildNodes, String vmName, String isoPath) {
+        for (int x = 0; x < devicesChildNodes.getLength(); x++) {
+            Node deviceChildNode = devicesChildNodes.item(x);
+            if ("disk".equals(deviceChildNode.getNodeName())) {
+                Node diskNode = deviceChildNode;
+                if (findSourceNode(doc, diskNode, vmName, isoPath)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean findSourceNode(Document doc, Node diskNode, String vmName, String isoPath) {
+        NodeList diskChildNodes = diskNode.getChildNodes();
+        for (int z = 0; z < diskChildNodes.getLength(); z++) {
+            Node diskChildNode = diskChildNodes.item(z);
+            if ("source".equals(diskChildNode.getNodeName())) {
+                Node sourceNode = diskChildNode;
+                NamedNodeMap sourceNodeAttributes = sourceNode.getAttributes();
+                Node sourceNodeAttribute = sourceNodeAttributes.getNamedItem("file");
+                if ( sourceNodeAttribute.getNodeValue().contains(vmName)) {
+                    diskNode.removeChild(diskChildNode);
+                    Element newChildSourceNode = doc.createElement("source");
+                    newChildSourceNode.setAttribute("file", isoPath);
+                    diskNode.appendChild(newChildSourceNode);
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPvlanSetupCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPvlanSetupCommandWrapper.java
index 3e01dc4..23722a5 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPvlanSetupCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPvlanSetupCommandWrapper.java
@@ -19,22 +19,17 @@
 
 package com.cloud.hypervisor.kvm.resource.wrapper;
 
-import java.util.List;
-
 import org.apache.log4j.Logger;
 import org.joda.time.Duration;
-import org.libvirt.Connect;
-import org.libvirt.LibvirtException;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.PvlanSetupCommand;
 import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource;
-import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
 import com.cloud.resource.CommandWrapper;
 import com.cloud.resource.ResourceWrapper;
 import com.cloud.utils.script.Script;
 
-@ResourceWrapper(handles =  PvlanSetupCommand.class)
+@ResourceWrapper(handles = PvlanSetupCommand.class)
 public final class LibvirtPvlanSetupCommandWrapper extends CommandWrapper<PvlanSetupCommand, Answer, LibvirtComputingResource> {
 
     private static final Logger s_logger = Logger.getLogger(LibvirtPvlanSetupCommandWrapper.class);
@@ -43,66 +38,50 @@
     public Answer execute(final PvlanSetupCommand command, final LibvirtComputingResource libvirtComputingResource) {
         final String primaryPvlan = command.getPrimary();
         final String isolatedPvlan = command.getIsolated();
+        final String pvlanType = "-" + command.getPvlanType();
         final String op = command.getOp();
-        final String dhcpName = command.getDhcpName();
         final String dhcpMac = command.getDhcpMac();
-        final String vmMac = command.getVmMac();
+        final String vmMac = command.getVmMac() == null ? dhcpMac : command.getVmMac();
         final String dhcpIp = command.getDhcpIp();
-        boolean add = true;
 
         String opr = "-A";
         if (op.equals("delete")) {
             opr = "-D";
-            add = false;
         }
 
         String result = null;
-        try {
-            final String guestBridgeName = libvirtComputingResource.getGuestBridgeName();
-            final Duration timeout = libvirtComputingResource.getTimeout();
 
-            if (command.getType() == PvlanSetupCommand.Type.DHCP) {
-                final String ovsPvlanDhcpHostPath = libvirtComputingResource.getOvsPvlanDhcpHostPath();
-                final Script script = new Script(ovsPvlanDhcpHostPath, timeout, s_logger);
+        final String guestBridgeName = libvirtComputingResource.getGuestBridgeName();
+        final Duration timeout = libvirtComputingResource.getTimeout();
 
-                if (add) {
-                    final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
-                    final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(dhcpName);
+        if (command.getType() == PvlanSetupCommand.Type.DHCP) {
+            final String ovsPvlanDhcpHostPath = libvirtComputingResource.getOvsPvlanDhcpHostPath();
+            final Script script = new Script(ovsPvlanDhcpHostPath, timeout, s_logger);
 
-                    final List<InterfaceDef> ifaces = libvirtComputingResource.getInterfaces(conn, dhcpName);
-                    final InterfaceDef guestNic = ifaces.get(0);
-                    script.add(opr, "-b", guestBridgeName, "-p", primaryPvlan, "-i", isolatedPvlan, "-n", dhcpName, "-d", dhcpIp, "-m", dhcpMac, "-I",
-                            guestNic.getDevName());
-                } else {
-                    script.add(opr, "-b", guestBridgeName, "-p", primaryPvlan, "-i", isolatedPvlan, "-n", dhcpName, "-d", dhcpIp, "-m", dhcpMac);
-                }
+            script.add(opr, pvlanType, "-b", guestBridgeName, "-p", primaryPvlan, "-s", isolatedPvlan, "-m", dhcpMac,
+                    "-d", dhcpIp);
+            result = script.execute();
 
-                result = script.execute();
-
-                if (result != null) {
-                    s_logger.warn("Failed to program pvlan for dhcp server with mac " + dhcpMac);
-                    return new Answer(command, false, result);
-                } else {
-                    s_logger.info("Programmed pvlan for dhcp server with mac " + dhcpMac);
-                }
-            } else if (command.getType() == PvlanSetupCommand.Type.VM) {
-                final String ovsPvlanVmPath = libvirtComputingResource.getOvsPvlanVmPath();
-
-                final Script script = new Script(ovsPvlanVmPath, timeout, s_logger);
-                script.add(opr, "-b", guestBridgeName, "-p", primaryPvlan, "-i", isolatedPvlan, "-v", vmMac);
-                result = script.execute();
-
-                if (result != null) {
-                    s_logger.warn("Failed to program pvlan for vm with mac " + vmMac);
-                    return new Answer(command, false, result);
-                } else {
-                    s_logger.info("Programmed pvlan for vm with mac " + vmMac);
-                }
+            if (result != null) {
+                s_logger.warn("Failed to program pvlan for dhcp server with mac " + dhcpMac);
+            } else {
+                s_logger.info("Programmed pvlan for dhcp server with mac " + dhcpMac);
             }
-        } catch (final LibvirtException e) {
-            s_logger.error("Error whislt executing OVS Setup command! ==> " + e.getMessage());
-            return new Answer(command, false, e.getMessage());
         }
+
+        // We run this even for DHCP servers since they're all vms after all
+        final String ovsPvlanVmPath = libvirtComputingResource.getOvsPvlanVmPath();
+        final Script script = new Script(ovsPvlanVmPath, timeout, s_logger);
+        script.add(opr, pvlanType, "-b", guestBridgeName, "-p", primaryPvlan, "-s", isolatedPvlan, "-m", vmMac);
+        result = script.execute();
+
+        if (result != null) {
+            s_logger.warn("Failed to program pvlan for vm with mac " + vmMac);
+            return new Answer(command, false, result);
+        } else {
+            s_logger.info("Programmed pvlan for vm with mac " + vmMac);
+        }
+
         return new Answer(command, true, result);
     }
 }
\ No newline at end of file
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java
index 79ed6e4..52ed64a 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtResizeVolumeCommandWrapper.java
@@ -39,6 +39,8 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 /*
  * Uses a local script now, eventually support for virStorageVolResize() will maybe work on qcow2 and lvm and we can do this in libvirt calls
  */
@@ -59,7 +61,7 @@
 
         if ( currentSize == newSize) {
             // nothing to do
-            s_logger.info("No need to resize volume: current size " + currentSize + " is same as new size " + newSize);
+            s_logger.info("No need to resize volume: current size " + toHumanReadableSize(currentSize) + " is same as new size " + toHumanReadableSize(newSize));
             return new ResizeVolumeAnswer(command, true, "success", currentSize);
         }
 
@@ -80,7 +82,7 @@
                 s_logger.debug("Volume " + path + " is on a RBD storage pool. No need to query for additional information.");
             }
 
-            s_logger.debug("Resizing volume: " + path + "," + currentSize + "," + newSize + "," + type + "," + vmInstanceName + "," + shrinkOk);
+            s_logger.debug("Resizing volume: " + path + ", from: " + toHumanReadableSize(currentSize) + ", to: " + toHumanReadableSize(newSize) + ", type: " + type + ", name: " + vmInstanceName + ", shrinkOk: " + shrinkOk);
 
             /* libvirt doesn't support resizing (C)LVM devices, and corrupts QCOW2 in some scenarios, so we have to do these via Bash script */
             if (pool.getType() != StoragePoolType.CLVM && vol.getFormat() != PhysicalDiskFormat.QCOW2) {
@@ -127,7 +129,7 @@
             pool = storagePoolMgr.getStoragePool(spool.getType(), spool.getUuid());
             pool.refresh();
             final long finalSize = pool.getPhysicalDisk(volid).getVirtualSize();
-            s_logger.debug("after resize, size reports as " + finalSize + ", requested " + newSize);
+            s_logger.debug("after resize, size reports as: " + toHumanReadableSize(finalSize) + ", requested: " + toHumanReadableSize(newSize));
             return new ResizeVolumeAnswer(command, true, "success", finalSize);
         } catch (final CloudRuntimeException e) {
             final String error = "Failed to resize volume: " + e.getMessage();
diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
index eaa143a..5b4a610 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
@@ -28,8 +28,8 @@
 
         rbdOpts = "rbd:" + image;
         rbdOpts += ":mon_host=" + monHost;
-        if (monPort != 6789) {
-            rbdOpts += "\\\\:" + monPort;
+        if (monPort > 0) {
+            rbdOpts += "\\:" + monPort;
         }
 
         if (authUserName == null) {
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 1df72de..016a13e 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
@@ -18,6 +18,7 @@
  */
 package com.cloud.hypervisor.kvm.storage;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 import static com.cloud.utils.storage.S3.S3Utils.putFile;
 
 import java.io.File;
@@ -45,6 +46,7 @@
 import org.apache.cloudstack.agent.directdownload.NfsDirectDownloadCommand;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
@@ -239,11 +241,11 @@
                 final VolumeObjectTO volume = (VolumeObjectTO)destData;
                 // pass along volume's target size if it's bigger than template's size, for storage types that copy template rather than cloning on deploy
                 if (volume.getSize() != null && volume.getSize() > tmplVol.getVirtualSize()) {
-                    s_logger.debug("Using configured size of " + volume.getSize());
+                    s_logger.debug("Using configured size of " + toHumanReadableSize(volume.getSize()));
                     tmplVol.setSize(volume.getSize());
                     tmplVol.setVirtualSize(volume.getSize());
                 } else {
-                    s_logger.debug("Using template's size of " + tmplVol.getVirtualSize());
+                    s_logger.debug("Using template's size of " + toHumanReadableSize(tmplVol.getVirtualSize()));
                 }
                 primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds());
             } else if (destData instanceof TemplateObjectTO) {
@@ -340,11 +342,11 @@
             /* Copy volume to primary storage */
 
             if (size > templateVol.getSize()) {
-                s_logger.debug("Overriding provided template's size with new size " + size);
+                s_logger.debug("Overriding provided template's size with new size " + toHumanReadableSize(size));
                 templateVol.setSize(size);
                 templateVol.setVirtualSize(size);
             } else {
-                s_logger.debug("Using templates disk size of " + templateVol.getVirtualSize() + "since size passed was " + size);
+                s_logger.debug("Using templates disk size of " + toHumanReadableSize(templateVol.getVirtualSize()) + "since size passed was " + toHumanReadableSize(size));
             }
 
             final KVMPhysicalDisk primaryVol = storagePoolMgr.copyPhysicalDisk(templateVol, volUuid, primaryPool, timeout);
@@ -942,7 +944,7 @@
                         size = snapFile.length();
                     }
 
-                    s_logger.debug("Finished backing up RBD snapshot " + rbdSnapshot + " to " + snapshotFile + " Snapshot size: " + size);
+                    s_logger.debug("Finished backing up RBD snapshot " + rbdSnapshot + " to " + snapshotFile + " Snapshot size: " + toHumanReadableSize(size));
                 } catch (final FileNotFoundException e) {
                     s_logger.error("Failed to open " + snapshotDestPath + ". The error was: " + e.getMessage());
                     return new CopyCmdAnswer(e.toString());
@@ -1029,7 +1031,7 @@
                         }
                     }
                 } catch (final Exception ex) {
-                    s_logger.debug("Failed to delete snapshots on primary", ex);
+                    s_logger.error("Failed to delete snapshots on primary", ex);
                 }
             }
 
@@ -1398,7 +1400,7 @@
      * Create full clone volume from VM snapshot
      */
     protected KVMPhysicalDisk createFullCloneVolume(MigrationOptions migrationOptions, VolumeObjectTO volume, KVMStoragePool primaryPool, PhysicalDiskFormat format) {
-        s_logger.debug("For VM migration with full-clone volume: Creating empty stub disk for source disk " + migrationOptions.getSrcVolumeUuid() + " and size: " + volume.getSize() + " and format: " + format);
+            s_logger.debug("For VM migration with full-clone volume: Creating empty stub disk for source disk " + migrationOptions.getSrcVolumeUuid() + " and size: " + toHumanReadableSize(volume.getSize()) + " and format: " + format);
         return primaryPool.createPhysicalDisk(volume.getUuid(), format, volume.getProvisioningType(), volume.getSize());
     }
 
@@ -1832,4 +1834,10 @@
         }
         return availableBytes >= templateSize;
     }
+
+    @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        s_logger.info("'CheckDataStoreStoragePolicyComplainceCommand' not currently applicable for KVMStorageProcessor");
+        return new Answer(cmd,false,"Not currently applicable for KVMStorageProcessor");
+    }
 }
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 ce2199c..f9c627b 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
@@ -65,6 +65,8 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class LibvirtStorageAdaptor implements StorageAdaptor {
     private static final Logger s_logger = Logger.getLogger(LibvirtStorageAdaptor.class);
     private StorageLayer _storageLayer;
@@ -493,9 +495,9 @@
             pool.setAvailable(storage.getInfo().available);
 
             s_logger.debug("Succesfully refreshed pool " + uuid +
-                           " Capacity: " + storage.getInfo().capacity +
-                           " Used: " + storage.getInfo().allocation +
-                           " Available: " + storage.getInfo().available);
+                           " Capacity: " + toHumanReadableSize(storage.getInfo().capacity) +
+                           " Used: " + toHumanReadableSize(storage.getInfo().allocation) +
+                           " Available: " + toHumanReadableSize(storage.getInfo().available));
 
             return pool;
         } catch (LibvirtException e) {
@@ -730,7 +732,7 @@
             PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size) {
 
         s_logger.info("Attempting to create volume " + name + " (" + pool.getType().toString() + ") in pool "
-                + pool.getUuid() + " with size " + size);
+                + pool.getUuid() + " with size " + toHumanReadableSize(size));
 
         switch (pool.getType()) {
             case RBD:
@@ -962,7 +964,7 @@
             String name, PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size, KVMStoragePool destPool, int timeout) {
 
         s_logger.info("Creating volume " + name + " from template " + template.getName() + " in pool " + destPool.getUuid() +
-                " (" + destPool.getType().toString() + ") with size " + size);
+                " (" + destPool.getType().toString() + ") with size " + toHumanReadableSize(size));
 
         KVMPhysicalDisk disk = null;
 
@@ -1099,7 +1101,7 @@
                     if (srcImage.isOldFormat()) {
                         /* The source image is RBD format 1, we have to do a regular copy */
                         s_logger.debug("The source image " + srcPool.getSourceDir() + "/" + template.getName() +
-                                " is RBD format 1. We have to perform a regular copy (" + disk.getVirtualSize() + " bytes)");
+                                " is RBD format 1. We have to perform a regular copy (" + toHumanReadableSize(disk.getVirtualSize()) + " bytes)");
 
                         rbd.create(disk.getName(), disk.getVirtualSize(), rbdFeatures, rbdOrder);
                         RbdImage destImage = rbd.open(disk.getName());
@@ -1145,7 +1147,7 @@
                             RbdImage diskImage = rbd.open(disk.getName());
                             diskImage.resize(disk.getVirtualSize());
                             rbd.close(diskImage);
-                            s_logger.debug("Resized " + disk.getName() + " to " + disk.getVirtualSize());
+                            s_logger.debug("Resized " + disk.getName() + " to " + toHumanReadableSize(disk.getVirtualSize()));
                         }
 
                     }
@@ -1251,7 +1253,7 @@
         String sourcePath = disk.getPath();
 
         KVMPhysicalDisk newDisk;
-        s_logger.debug("copyPhysicalDisk: disk size:" + disk.getSize() + ", virtualsize:" + disk.getVirtualSize()+" format:"+disk.getFormat());
+        s_logger.debug("copyPhysicalDisk: disk size:" + toHumanReadableSize(disk.getSize()) + ", virtualsize:" + toHumanReadableSize(disk.getVirtualSize())+" format:"+disk.getFormat());
         if (destPool.getType() != StoragePoolType.RBD) {
             if (disk.getFormat() == PhysicalDiskFormat.TAR) {
                 newDisk = destPool.createPhysicalDisk(name, PhysicalDiskFormat.DIR, Storage.ProvisioningType.THIN, disk.getVirtualSize());
@@ -1345,7 +1347,7 @@
                 RbdImageInfo rbdInfo = image.stat();
                 newDisk.setSize(rbdInfo.size);
                 newDisk.setVirtualSize(rbdInfo.size);
-                s_logger.debug("After copy the resulting RBD image " + rbdDestPath + " is " + rbdInfo.size + " bytes long");
+                s_logger.debug("After copy the resulting RBD image " + rbdDestPath + " is " + toHumanReadableSize(rbdInfo.size) + " bytes long");
                 rbd.close(image);
 
                 r.ioCtxDestroy(io);
diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
index 481dcdc..3006d25 100644
--- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
+++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java
@@ -150,6 +150,8 @@
         s.add("-f");
         if (backingFile != null) {
             s.add(backingFile.getFormat().toString());
+            s.add("-F");
+            s.add(backingFile.getFormat().toString());
             s.add("-b");
             s.add(backingFile.getFileName());
         } else {
@@ -377,8 +379,29 @@
     }
 
     /* Changes the backing file of an image */
-    public void rebase() throws QemuImgException {
+    public void rebase(final QemuImgFile file, final QemuImgFile backingFile, final String backingFileFormat, final boolean secure) throws QemuImgException {
+        if (backingFile == null) {
+            throw new QemuImgException("No backing file was passed");
+        }
+        final Script s = new Script(_qemuImgPath, timeout);
+        s.add("rebase");
+        if (! secure) {
+            s.add("-u");
+        }
+        s.add("-F");
+        if (backingFileFormat != null) {
+            s.add(backingFileFormat);
+        } else {
+            s.add(backingFile.getFormat().toString());
+        }
+        s.add("-b");
+        s.add(backingFile.getFileName());
 
+        s.add(file.getFileName());
+        final String result = s.execute();
+        if (result != null) {
+            throw new QemuImgException(result);
+        }
     }
 
     /**
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
index 1bf27d0..bd651f4 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java
@@ -1289,10 +1289,11 @@
         final boolean isWindows = false;
         final VirtualMachineTO vmTO = Mockito.mock(VirtualMachineTO.class);
         final boolean executeInSequence = false;
-
+        DiskTO[] diskTOS = new DiskTO[]{};
         final MigrateCommand command = new MigrateCommand(vmName, destIp, isWindows, vmTO, executeInSequence );
 
         when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
+        when(vmTO.getDisks()).thenReturn(diskTOS);
         try {
             when(libvirtUtilitiesHelper.getConnectionByVmName(vmName)).thenReturn(conn);
             when(libvirtUtilitiesHelper.retrieveQemuConnection("qemu+tcp://" + command.getDestinationIp() + "/system")).thenReturn(dconn);
@@ -4336,7 +4337,7 @@
     @Test
     public void testPvlanSetupCommandDhcpAdd() {
         final String op = "add";
-        final URI uri = URI.create("http://localhost");
+        final URI uri = URI.create("pvlan://200-p200");
         final String networkTag = "/105";
         final String dhcpName = "dhcp";
         final String dhcpMac = "00:00:00:00";
@@ -4344,46 +4345,24 @@
 
         final PvlanSetupCommand command = PvlanSetupCommand.createDhcpSetup(op, uri, networkTag, dhcpName, dhcpMac, dhcpIp);
 
-        final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class);
-        final Connect conn = Mockito.mock(Connect.class);
-
         final String guestBridgeName = "br0";
         when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
-
         when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
+
         final String ovsPvlanDhcpHostPath = "/pvlan";
         when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
-        when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
-
-        final List<InterfaceDef> ifaces = new ArrayList<InterfaceDef>();
-        final InterfaceDef nic = Mockito.mock(InterfaceDef.class);
-        ifaces.add(nic);
-
-        try {
-            when(libvirtUtilitiesHelper.getConnectionByVmName(dhcpName)).thenReturn(conn);
-            when(libvirtComputingResource.getInterfaces(conn, dhcpName)).thenReturn(ifaces);
-        } catch (final LibvirtException e) {
-            fail(e.getMessage());
-        }
 
         final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
         assertNotNull(wrapper);
 
         final Answer answer = wrapper.execute(command, libvirtComputingResource);
         assertFalse(answer.getResult());
-
-        verify(libvirtComputingResource, times(1)).getLibvirtUtilitiesHelper();
-        try {
-            verify(libvirtUtilitiesHelper, times(1)).getConnectionByVmName(dhcpName);
-        } catch (final LibvirtException e) {
-            fail(e.getMessage());
-        }
     }
 
     @Test
     public void testPvlanSetupCommandVm() {
         final String op = "add";
-        final URI uri = URI.create("http://localhost");
+        final URI uri = URI.create("pvlan://200-p200");
         final String networkTag = "/105";
         final String vmMac = "00:00:00:00";
 
@@ -4403,52 +4382,10 @@
         assertFalse(answer.getResult());
     }
 
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testPvlanSetupCommandDhcpException() {
-        final String op = "add";
-        final URI uri = URI.create("http://localhost");
-        final String networkTag = "/105";
-        final String dhcpName = "dhcp";
-        final String dhcpMac = "00:00:00:00";
-        final String dhcpIp = "127.0.0.1";
-
-        final PvlanSetupCommand command = PvlanSetupCommand.createDhcpSetup(op, uri, networkTag, dhcpName, dhcpMac, dhcpIp);
-
-        final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class);
-
-        final String guestBridgeName = "br0";
-        when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
-
-        when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
-        final String ovsPvlanDhcpHostPath = "/pvlan";
-        when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
-        when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
-
-        try {
-            when(libvirtUtilitiesHelper.getConnectionByVmName(dhcpName)).thenThrow(LibvirtException.class);
-        } catch (final LibvirtException e) {
-            fail(e.getMessage());
-        }
-
-        final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
-        assertNotNull(wrapper);
-
-        final Answer answer = wrapper.execute(command, libvirtComputingResource);
-        assertFalse(answer.getResult());
-
-        verify(libvirtComputingResource, times(1)).getLibvirtUtilitiesHelper();
-        try {
-            verify(libvirtUtilitiesHelper, times(1)).getConnectionByVmName(dhcpName);
-        } catch (final LibvirtException e) {
-            fail(e.getMessage());
-        }
-    }
-
     @Test
     public void testPvlanSetupCommandDhcpDelete() {
         final String op = "delete";
-        final URI uri = URI.create("http://localhost");
+        final URI uri = URI.create("pvlan://200-p200");
         final String networkTag = "/105";
         final String dhcpName = "dhcp";
         final String dhcpMac = "00:00:00:00";
@@ -4456,15 +4393,12 @@
 
         final PvlanSetupCommand command = PvlanSetupCommand.createDhcpSetup(op, uri, networkTag, dhcpName, dhcpMac, dhcpIp);
 
-        final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class);
-
         final String guestBridgeName = "br0";
         when(libvirtComputingResource.getGuestBridgeName()).thenReturn(guestBridgeName);
-
         when(libvirtComputingResource.getTimeout()).thenReturn(Duration.ZERO);
+
         final String ovsPvlanDhcpHostPath = "/pvlan";
         when(libvirtComputingResource.getOvsPvlanDhcpHostPath()).thenReturn(ovsPvlanDhcpHostPath);
-        when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper);
 
         final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance();
         assertNotNull(wrapper);
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDefTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDefTest.java
index ec22e3f..a1a4344 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDefTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDefTest.java
@@ -81,4 +81,25 @@
 
         assertEquals(expectedXml, pool.toString());
     }
-}
\ No newline at end of file
+
+    public void testRbdStoragePoolWithoutPort() {
+        PoolType type = PoolType.RBD;
+        String name = "myRBDPool";
+        String uuid = "30a5fb6f-7277-44ce-9065-67e2bfdb0ebb";
+        String host = "::1";
+        String dir  = "rbd";
+        String authUsername = "admin";
+        String secretUuid = "d0d616dd-3446-409e-84d7-44465e325b35";
+        AuthenticationType auth = AuthenticationType.CEPH;
+        int port = 0;
+
+        LibvirtStoragePoolDef pool = new LibvirtStoragePoolDef(type, name, uuid, host, port, dir, authUsername, auth, secretUuid);
+
+        String expectedXml = "<pool type='" + type.toString() + "'>\n<name>" + name + "</name>\n<uuid>" + uuid + "</uuid>\n" +
+                             "<source>\n<host name='" + host + "'/>\n<name>" + dir + "</name>\n" +
+                             "<auth username='" + authUsername + "' type='" + auth.toString() + "'>\n<secret uuid='" + secretUuid + "'/>\n" +
+                             "</auth>\n</source>\n</pool>\n";
+
+        assertEquals(expectedXml, pool.toString());
+    }
+}
diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java
index bd644c8..cf39dce 100644
--- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java
+++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/storage/KVMPhysicalDiskTest.java
@@ -25,7 +25,7 @@
 
     public void testRBDStringBuilder() {
         assertEquals(KVMPhysicalDisk.RBDStringBuilder("ceph-monitor", 8000, "admin", "supersecret", "volume1"),
-                     "rbd:volume1:mon_host=ceph-monitor\\\\:8000:auth_supported=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30");
+                     "rbd:volume1:mon_host=ceph-monitor\\:8000:auth_supported=cephx:id=admin:key=supersecret:rbd_default_format=2:client_mount_timeout=30");
     }
 
     public void testAttributes() {
diff --git a/plugins/hypervisors/ovm/pom.xml b/plugins/hypervisors/ovm/pom.xml
index b73e8c7..2e2c940 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py
index c60b1ec..c640071 100755
--- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py
+++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py
@@ -184,8 +184,8 @@
         @return : success
         ex. {bridge:xapi100, attach:eth0.100}
         create bridge interface, and attached it 
-        cmd 1: brctl addbr bridge
-        cmd 2: brctl addif brdige attach
+        cmd 1: ip link add bridge
+        cmd 2: ip link set dev
         """
         
         if "xenbr" not in bridge.name and "vlan" not in bridge.name:
@@ -206,8 +206,8 @@
             logger.error(self._createBridge, msg)
             raise Exception(msg)
 
-        doCmd(['brctl', 'addbr', bridge.name])
-        doCmd(['brctl', 'addif', bridge.name, bridge.attach])
+        doCmd(['ip', 'link', 'add', 'name', bridge.name, 'type', 'bridge'])
+        doCmd(['ip', 'link', 'set', 'dev', bridge.attach, 'master', bridge.name])
         self.bringUP(bridge.name)
         logger.debug(self._createBridge, "Create bridge %s on %s successfully"%(bridge.name, bridge.attach))
         return self.bridges[bridge.name]
@@ -228,7 +228,7 @@
             logger.debug(self._deleteBridge, "There are still some interfaces(%s) on bridge %s"%(bridge.interfaces, bridge.name))
             return False
         self.bringDown(bridge.name)
-        doCmd(['brctl', 'delbr', bridge.name])
+        doCmd(['ip', 'link', 'del', bridge.name])
         logger.debug(self._deleteBridge, "Delete bridge %s successfully"%bridge.name)
         return True
         
diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py
index 8ad41da..5ce68f8 100755
--- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py
+++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py
@@ -107,7 +107,7 @@
                 execute("iptables -I FORWARD -o " + bridge_name + " -j DROP")
                 execute("iptables -I FORWARD -i " + bridge_name + " -m physdev --physdev-is-bridged -j " + brfw)
                 execute("iptables -I FORWARD -o " + bridge_name + " -m physdev --physdev-is-bridged -j " + brfw)
-                phydev = execute("brctl show |grep " + bridge_name + " | awk '{print $4}'").strip()
+                phydev = execute("ip link show type bridge |grep " + bridge_name + " | awk '{print $4}'").strip()
                 execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-out " + phydev + " -j ACCEPT")
                 execute("iptables -A " + brfw + " -m state --state RELATED,ESTABLISHED -j ACCEPT")
                 execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-is-out -j " + brfwout)
diff --git a/plugins/hypervisors/ovm3/pom.xml b/plugins/hypervisors/ovm3/pom.xml
index 8bd6b7f..d9c6d28 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/resources/Ovm3StorageProcessor.java b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/resources/Ovm3StorageProcessor.java
index 7915586..dd58bb5 100644
--- a/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/resources/Ovm3StorageProcessor.java
+++ b/plugins/hypervisors/ovm3/src/main/java/com/cloud/hypervisor/ovm3/resources/Ovm3StorageProcessor.java
@@ -24,6 +24,7 @@
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
@@ -827,6 +828,12 @@
     }
 
     @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        LOGGER.info("'CheckDataStoreStoragePolicyComplainceCommand' not applicable used for Ovm3StorageProcessor");
+        return new Answer(cmd,false,"Not applicable used for Ovm3StorageProcessor");
+    }
+
+    @Override
     public Answer copyVolumeFromPrimaryToPrimary(CopyCommand cmd) {
         return null;
     }
diff --git a/plugins/hypervisors/simulator/pom.xml b/plugins/hypervisors/simulator/pom.xml
index 0bb1b01..e81cccf 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>cloud-plugin-hypervisor-simulator</artifactId>
diff --git a/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/AgentStorageResource.java b/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/AgentStorageResource.java
index c77550e..c8f4701 100644
--- a/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/AgentStorageResource.java
+++ b/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/AgentStorageResource.java
@@ -109,8 +109,7 @@
     }
 
     @Override
-    public String getRootDir(String url, Integer nfsVersion) {
-        // TODO Auto-generated method stub
+    public String getRootDir(String cmd, String nfsVersion) {
         return null;
     }
 }
diff --git a/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/SimulatorStorageProcessor.java b/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/SimulatorStorageProcessor.java
index e4ef4df..16579bc 100644
--- a/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/SimulatorStorageProcessor.java
+++ b/plugins/hypervisors/simulator/src/main/java/com/cloud/resource/SimulatorStorageProcessor.java
@@ -31,6 +31,7 @@
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
 import org.apache.cloudstack.storage.command.CreateObjectCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
 import org.apache.cloudstack.storage.command.DettachAnswer;
 import org.apache.cloudstack.storage.command.DettachCommand;
@@ -269,4 +270,9 @@
     public Answer copyVolumeFromPrimaryToPrimary(CopyCommand cmd) {
         return null;
     }
+
+    @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        return new Answer(cmd, true, null);
+    }
 }
diff --git a/plugins/hypervisors/ucs/pom.xml b/plugins/hypervisors/ucs/pom.xml
index 2b91a20..08712dc 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 90eb752..01b31cf 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -72,5 +72,11 @@
             <groupId>wsdl4j</groupId>
             <artifactId>wsdl4j</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.cloud.com.vmware</groupId>
+            <artifactId>vmware-pbm</artifactId>
+            <version>${cs.vmware.api.version}</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>
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 59b27bd..d48a5d9 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
@@ -17,19 +17,15 @@
 package com.cloud.hypervisor.guru;
 
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
 import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.backup.Backup;
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStore;
@@ -61,13 +57,11 @@
 import com.cloud.agent.api.storage.CopyVolumeCommand;
 import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand;
 import com.cloud.agent.api.storage.CreateVolumeOVACommand;
-import com.cloud.agent.api.storage.OVFPropertyTO;
 import com.cloud.agent.api.storage.PrepareOVAPackingCommand;
 import com.cloud.agent.api.to.DataObjectType;
 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.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.agent.api.to.VolumeTO;
 import com.cloud.cluster.ClusterManager;
@@ -75,7 +69,6 @@
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.event.EventTypes;
 import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.InsufficientAddressCapacityException;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.host.Host;
 import com.cloud.host.HostVO;
@@ -90,18 +83,13 @@
 import com.cloud.hypervisor.vmware.dao.VmwareDatacenterZoneMapDao;
 import com.cloud.hypervisor.vmware.manager.VmwareManager;
 import com.cloud.hypervisor.vmware.mo.DatacenterMO;
-import com.cloud.hypervisor.vmware.mo.DiskControllerType;
 import com.cloud.hypervisor.vmware.mo.NetworkMO;
 import com.cloud.hypervisor.vmware.mo.VirtualDiskManagerMO;
-import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
 import com.cloud.hypervisor.vmware.resource.VmwareContextFactory;
 import com.cloud.hypervisor.vmware.util.VmwareContext;
 import com.cloud.network.Network;
-import com.cloud.network.Network.Provider;
-import com.cloud.network.Network.Service;
-import com.cloud.network.NetworkModel;
 import com.cloud.network.Networks;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.TrafficType;
@@ -117,11 +105,9 @@
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.DataStoreRole;
 import com.cloud.storage.DiskOfferingVO;
-import com.cloud.storage.GuestOSHypervisorVO;
 import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.Storage;
 import com.cloud.storage.StoragePool;
-import com.cloud.storage.TemplateOVFPropertyVO;
 import com.cloud.storage.VMTemplateStoragePoolVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
@@ -129,20 +115,16 @@
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.DiskOfferingDao;
 import com.cloud.storage.dao.GuestOSDao;
-import com.cloud.storage.dao.GuestOSHypervisorDao;
-import com.cloud.storage.dao.TemplateOVFPropertiesDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.storage.secondary.SecondaryStorageVmManager;
-import com.cloud.template.VirtualMachineTemplate.BootloaderType;
 import com.cloud.user.ResourceLimitService;
 import com.cloud.utils.Pair;
 import com.cloud.utils.UuidUtils;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.DomainRouterVO;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.NicVO;
 import com.cloud.vm.SecondaryStorageVmVO;
@@ -152,8 +134,6 @@
 import com.cloud.vm.VirtualMachine.Type;
 import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.VmDetailConstants;
-import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
@@ -169,376 +149,67 @@
 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);
 
-    @Inject
-    private NetworkDao _networkDao;
-    @Inject
-    private GuestOSDao _guestOsDao;
-    @Inject
-    private GuestOSHypervisorDao _guestOsHypervisorDao;
-    @Inject
-    private HostDao _hostDao;
-    @Inject
-    private HostDetailsDao _hostDetailsDao;
-    @Inject
-    private ClusterDetailsDao _clusterDetailsDao;
-    @Inject
-    private CommandExecLogDao _cmdExecLogDao;
-    @Inject
-    private VmwareManager _vmwareMgr;
-    @Inject
-    private SecondaryStorageVmManager _secStorageMgr;
-    @Inject
-    private NetworkModel _networkMgr;
-    @Inject
-    private NicDao _nicDao;
-    @Inject
-    private DomainRouterDao _domainRouterDao;
-    @Inject
-    private PhysicalNetworkTrafficTypeDao _physicalNetworkTrafficTypeDao;
-    @Inject
-    private VMInstanceDao _vmDao;
-    @Inject
-    private VirtualMachineManager vmManager;
-    @Inject
-    private ClusterManager _clusterMgr;
-    @Inject
-    VolumeDao _volumeDao;
-    @Inject
-    ResourceLimitService _resourceLimitService;
-    @Inject
-    PrimaryDataStoreDao _storagePoolDao;
-    @Inject
-    VolumeDataFactory _volFactory;
-    @Inject
-    private VmwareDatacenterDao vmwareDatacenterDao;
-    @Inject
-    private VmwareDatacenterZoneMapDao vmwareDatacenterZoneMapDao;
-    @Inject
-    private ServiceOfferingDao serviceOfferingDao;
-    @Inject
-    private VMTemplatePoolDao templateStoragePoolDao;
-    @Inject
-    private VMTemplateDao vmTemplateDao;
-    @Inject
-    private UserVmDao userVmDao;
-    @Inject
-    private DiskOfferingDao diskOfferingDao;
-    @Inject
-    private PhysicalNetworkDao physicalNetworkDao;
-    @Inject
-    private TemplateOVFPropertiesDao templateOVFPropertiesDao;
+
+    @Inject VmwareVmImplementer vmwareVmImplementer;
+
+    @Inject NetworkDao _networkDao;
+    @Inject GuestOSDao _guestOsDao;
+    @Inject HostDao _hostDao;
+    @Inject HostDetailsDao _hostDetailsDao;
+    @Inject ClusterDetailsDao _clusterDetailsDao;
+    @Inject CommandExecLogDao _cmdExecLogDao;
+    @Inject VmwareManager _vmwareMgr;
+    @Inject SecondaryStorageVmManager _secStorageMgr;
+    @Inject NicDao _nicDao;
+    @Inject PhysicalNetworkTrafficTypeDao _physicalNetworkTrafficTypeDao;
+    @Inject VMInstanceDao _vmDao;
+    @Inject VirtualMachineManager vmManager;
+    @Inject ClusterManager _clusterMgr;
+    @Inject VolumeDao _volumeDao;
+    @Inject ResourceLimitService _resourceLimitService;
+    @Inject PrimaryDataStoreDao _storagePoolDao;
+    @Inject VolumeDataFactory _volFactory;
+    @Inject VmwareDatacenterDao vmwareDatacenterDao;
+    @Inject VmwareDatacenterZoneMapDao vmwareDatacenterZoneMapDao;
+    @Inject ServiceOfferingDao serviceOfferingDao;
+    @Inject VMTemplatePoolDao templateStoragePoolDao;
+    @Inject VMTemplateDao vmTemplateDao;
+    @Inject UserVmDao userVmDao;
+    @Inject DiskOfferingDao diskOfferingDao;
+    @Inject PhysicalNetworkDao physicalNetworkDao;
 
     protected VMwareGuru() {
         super();
     }
 
     public static final ConfigKey<Boolean> VmwareReserveCpu = new ConfigKey<Boolean>(Boolean.class, "vmware.reserve.cpu", "Advanced", "false",
-        "Specify whether or not to reserve CPU when deploying an instance.", true, ConfigKey.Scope.Cluster,
-        null);
+            "Specify whether or not to reserve CPU when deploying an instance.", true, ConfigKey.Scope.Cluster, null);
 
     public static final ConfigKey<Boolean> VmwareReserveMemory = new ConfigKey<Boolean>(Boolean.class, "vmware.reserve.mem", "Advanced", "false",
-        "Specify whether or not to reserve memory when deploying an instance.", true,
-        ConfigKey.Scope.Cluster, null);
+            "Specify whether or not to reserve memory when deploying an instance.", true, ConfigKey.Scope.Cluster, null);
 
-    protected ConfigKey<Boolean> VmwareEnableNestedVirtualization = new ConfigKey<Boolean>(Boolean.class, "vmware.nested.virtualization", "Advanced", "false",
+    public static final ConfigKey<Boolean> VmwareEnableNestedVirtualization = new ConfigKey<Boolean>(Boolean.class, "vmware.nested.virtualization", "Advanced", "false",
             "When set to true this will enable nested virtualization when this is supported by the hypervisor", true, ConfigKey.Scope.Global, null);
 
-    protected ConfigKey<Boolean> VmwareEnableNestedVirtualizationPerVM = new ConfigKey<Boolean>(Boolean.class, "vmware.nested.virtualization.perVM", "Advanced", "false",
+    public static final ConfigKey<Boolean> VmwareEnableNestedVirtualizationPerVM = new ConfigKey<Boolean>(Boolean.class, "vmware.nested.virtualization.perVM", "Advanced", "false",
             "When set to true this will enable nested virtualization per vm", true, ConfigKey.Scope.Global, null);
 
-    @Override
-    public HypervisorType getHypervisorType() {
+    @Override public HypervisorType getHypervisorType() {
         return HypervisorType.VMware;
     }
 
-    @Override
-    public VirtualMachineTO implement(VirtualMachineProfile vm) {
-        VirtualMachineTO to = toVirtualMachineTO(vm);
-        to.setBootloader(BootloaderType.HVM);
-
-        Map<String, String> details = to.getDetails();
-        if (details == null)
-            details = new HashMap<String, String>();
-
-        Type vmType = vm.getType();
-        boolean userVm = !(vmType.equals(VirtualMachine.Type.DomainRouter) || vmType.equals(VirtualMachine.Type.ConsoleProxy)
-                || vmType.equals(VirtualMachine.Type.SecondaryStorageVm));
-
-        String nicDeviceType = details.get(VmDetailConstants.NIC_ADAPTER);
-        if (!userVm) {
-
-            if (nicDeviceType == null) {
-                details.put(VmDetailConstants.NIC_ADAPTER, _vmwareMgr.getSystemVMDefaultNicAdapterType());
-            } else {
-                try {
-                    VirtualEthernetCardType.valueOf(nicDeviceType);
-                } catch (Exception e) {
-                    s_logger.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
-                    details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
-                }
-            }
-        } else {
-            // for user-VM, use E1000 as default
-            if (nicDeviceType == null) {
-                details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
-            } else {
-                try {
-                    VirtualEthernetCardType.valueOf(nicDeviceType);
-                } catch (Exception e) {
-                    s_logger.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
-                    details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
-                }
-            }
-        }
-
-        details.put(VmDetailConstants.BOOT_MODE, to.getBootMode());
-        String diskDeviceType = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER);
-        if (userVm) {
-            if (diskDeviceType == null) {
-                details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, _vmwareMgr.getRootDiskController());
-            }
-        }
-        String diskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
-        if (userVm) {
-            if (diskController == null) {
-                details.put(VmDetailConstants.DATA_DISK_CONTROLLER, DiskControllerType.lsilogic.toString());
-            }
-        }
-
-        if (vm.getType() == VirtualMachine.Type.NetScalerVm) {
-            details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi");
-        }
-
-        List<NicProfile> nicProfiles = vm.getNics();
-
-        for (NicProfile nicProfile : nicProfiles) {
-            if (nicProfile.getTrafficType() == TrafficType.Guest) {
-                if (_networkMgr.isProviderSupportServiceInNetwork(nicProfile.getNetworkId(), Service.Firewall, Provider.CiscoVnmc)) {
-                    details.put("ConfigureVServiceInNexus", Boolean.TRUE.toString());
-                }
-                break;
-            }
-        }
-
-        long clusterId = getClusterId(vm.getId());
-        details.put(VmwareReserveCpu.key(), VmwareReserveCpu.valueIn(clusterId).toString());
-        details.put(VmwareReserveMemory.key(), VmwareReserveMemory.valueIn(clusterId).toString());
-        to.setDetails(details);
-
-        if (vmType.equals(VirtualMachine.Type.DomainRouter)) {
-
-            NicProfile publicNicProfile = null;
-            for (NicProfile nicProfile : nicProfiles) {
-                if (nicProfile.getTrafficType() == TrafficType.Public) {
-                    publicNicProfile = nicProfile;
-                    break;
-                }
-            }
-
-            if (publicNicProfile != null) {
-                NicTO[] nics = to.getNics();
-
-                // reserve extra NICs
-                NicTO[] expandedNics = new NicTO[nics.length + _vmwareMgr.getRouterExtraPublicNics()];
-                int i = 0;
-                int deviceId = -1;
-                for (i = 0; i < nics.length; i++) {
-                    expandedNics[i] = nics[i];
-                    if (nics[i].getDeviceId() > deviceId)
-                        deviceId = nics[i].getDeviceId();
-                }
-                deviceId++;
-
-                long networkId = publicNicProfile.getNetworkId();
-                NetworkVO network = _networkDao.findById(networkId);
-
-                for (; i < nics.length + _vmwareMgr.getRouterExtraPublicNics(); i++) {
-                    NicTO nicTo = new NicTO();
-
-                    nicTo.setDeviceId(deviceId++);
-                    nicTo.setBroadcastType(publicNicProfile.getBroadcastType());
-                    nicTo.setType(publicNicProfile.getTrafficType());
-                    nicTo.setIp("0.0.0.0");
-                    nicTo.setNetmask("255.255.255.255");
-
-                    try {
-                        String mac = _networkMgr.getNextAvailableMacAddressInNetwork(networkId);
-                        nicTo.setMac(mac);
-                    } catch (InsufficientAddressCapacityException e) {
-                        throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId);
-                    }
-                    nicTo.setDns1(publicNicProfile.getIPv4Dns1());
-                    nicTo.setDns2(publicNicProfile.getIPv4Dns2());
-                    if (publicNicProfile.getIPv4Gateway() != null) {
-                        nicTo.setGateway(publicNicProfile.getIPv4Gateway());
-                    } else {
-                        nicTo.setGateway(network.getGateway());
-                    }
-                    nicTo.setDefaultNic(false);
-                    nicTo.setBroadcastUri(publicNicProfile.getBroadCastUri());
-                    nicTo.setIsolationuri(publicNicProfile.getIsolationUri());
-
-                    Integer networkRate = _networkMgr.getNetworkRate(network.getId(), null);
-                    nicTo.setNetworkRateMbps(networkRate);
-
-                    expandedNics[i] = nicTo;
-                }
-
-                to.setNics(expandedNics);
-
-                VirtualMachine router = vm.getVirtualMachine();
-                DomainRouterVO routerVO = _domainRouterDao.findById(router.getId());
-                if (routerVO != null && routerVO.getIsRedundantRouter()) {
-                    Long peerRouterId = _nicDao.getPeerRouterId(publicNicProfile.getMacAddress(), router.getId());
-                    DomainRouterVO peerRouterVO = null;
-                    if (peerRouterId != null) {
-                        peerRouterVO = _domainRouterDao.findById(peerRouterId);
-                        if (peerRouterVO != null) {
-                            details.put("PeerRouterInstanceName", peerRouterVO.getInstanceName());
-                        }
-                    }
-                }
-            }
-
-            StringBuffer sbMacSequence = new StringBuffer();
-            for (NicTO nicTo : sortNicsByDeviceId(to.getNics())) {
-                sbMacSequence.append(nicTo.getMac()).append("|");
-            }
-            if (!sbMacSequence.toString().isEmpty()) {
-                sbMacSequence.deleteCharAt(sbMacSequence.length() - 1);
-                String bootArgs = to.getBootArgs();
-                to.setBootArgs(bootArgs + " nic_macs=" + sbMacSequence.toString());
-            }
-
-        }
-
-        // Don't do this if the virtual machine is one of the special types
-        // Should only be done on user machines
-        if (userVm) {
-            configureNestedVirtualization(details, to);
-        }
-        // Determine the VM's OS description
-        GuestOSVO guestOS = _guestOsDao.findByIdIncludingRemoved(vm.getVirtualMachine().getGuestOSId());
-        to.setOs(guestOS.getDisplayName());
-        to.setHostName(vm.getHostName());
-        HostVO host = _hostDao.findById(vm.getVirtualMachine().getHostId());
-        GuestOSHypervisorVO guestOsMapping = null;
-        if (host != null) {
-            guestOsMapping = _guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), getHypervisorType().toString(), host.getHypervisorVersion());
-        }
-        if (guestOsMapping == null || host == null) {
-            to.setPlatformEmulator(null);
-        } else {
-            to.setPlatformEmulator(guestOsMapping.getGuestOsName());
-        }
-
-        List<OVFPropertyTO> ovfProperties = new ArrayList<>();
-        for (String detailKey : details.keySet()) {
-            if (detailKey.startsWith(ApiConstants.OVF_PROPERTIES)) {
-                String ovfPropKey = detailKey.replace(ApiConstants.OVF_PROPERTIES + "-", "");
-                TemplateOVFPropertyVO templateOVFPropertyVO = templateOVFPropertiesDao.findByTemplateAndKey(vm.getTemplateId(), ovfPropKey);
-                if (templateOVFPropertyVO == null) {
-                    s_logger.warn(String.format("OVF property %s not found on template, discarding", ovfPropKey));
-                    continue;
-                }
-                String ovfValue = details.get(detailKey);
-                boolean isPassword = templateOVFPropertyVO.isPassword();
-                OVFPropertyTO propertyTO = new OVFPropertyTO(ovfPropKey, ovfValue, isPassword);
-                ovfProperties.add(propertyTO);
-            }
-        }
-
-        if (CollectionUtils.isNotEmpty(ovfProperties)) {
-            removeOvfPropertiesFromDetails(ovfProperties, details);
-            String templateInstallPath = null;
-            List<DiskTO> rootDiskList = vm.getDisks().stream().filter(x -> x.getType() == Volume.Type.ROOT).collect(Collectors.toList());
-            if (rootDiskList.size() != 1) {
-                throw new CloudRuntimeException("Did not find only one root disk for VM " + vm.getHostName());
-            }
-
-            DiskTO rootDiskTO = rootDiskList.get(0);
-            DataStoreTO dataStore = rootDiskTO.getData().getDataStore();
-            StoragePoolVO storagePoolVO = _storagePoolDao.findByUuid(dataStore.getUuid());
-            long dataCenterId = storagePoolVO.getDataCenterId();
-            List<StoragePoolVO> pools = _storagePoolDao.listByDataCenterId(dataCenterId);
-            for (StoragePoolVO pool : pools) {
-                VMTemplateStoragePoolVO ref = templateStoragePoolDao.findByPoolTemplate(pool.getId(), vm.getTemplateId());
-                if (ref != null && ref.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
-                    templateInstallPath = ref.getInstallPath();
-                    break;
-                }
-            }
-
-            if (templateInstallPath == null) {
-                throw new CloudRuntimeException("Did not find the template install path for template " +
-                        vm.getTemplateId() + " on zone " + dataCenterId);
-            }
-
-            Pair<String, List<OVFPropertyTO>> pair = new Pair<>(templateInstallPath, ovfProperties);
-            to.setOvfProperties(pair);
-        }
-
-        return to;
+    @Override public VirtualMachineTO implement(VirtualMachineProfile vm) {
+        vmwareVmImplementer.setGlobalNestedVirtualisationEnabled(VmwareEnableNestedVirtualization.value());
+        vmwareVmImplementer.setGlobalNestedVPerVMEnabled(VmwareEnableNestedVirtualizationPerVM.value());
+        return vmwareVmImplementer.implement(vm, toVirtualMachineTO(vm), getClusterId(vm.getId()));
     }
 
-    /*
-    Remove OVF properties from details to be sent to hypervisor (avoid duplicate data)
-     */
-    private void removeOvfPropertiesFromDetails(List<OVFPropertyTO> ovfProperties, Map<String, String> details) {
-        for (OVFPropertyTO propertyTO : ovfProperties) {
-            String key = propertyTO.getKey();
-            details.remove(ApiConstants.OVF_PROPERTIES + "-" + key);
-        }
-    }
-
-    /**
-     * Decide in which cases nested virtualization should be enabled based on (1){@code globalNestedV}, (2){@code globalNestedVPerVM}, (3){@code localNestedV}<br/>
-     * Nested virtualization should be enabled when one of this cases:
-     * <ul>
-     * <li>(1)=TRUE, (2)=TRUE, (3) is NULL (missing)</li>
-     * <li>(1)=TRUE, (2)=TRUE, (3)=TRUE</li>
-     * <li>(1)=TRUE, (2)=FALSE</li>
-     * <li>(1)=FALSE, (2)=TRUE, (3)=TRUE</li>
-     * </ul>
-     * In any other case, it shouldn't be enabled
-     * @param globalNestedV value of {@code 'vmware.nested.virtualization'} global config
-     * @param globalNestedVPerVM value of {@code 'vmware.nested.virtualization.perVM'} global config
-     * @param localNestedV value of {@code 'nestedVirtualizationFlag'} key in vm details if present, null if not present
-     * @return "true" for cases in which nested virtualization is enabled, "false" if not
-     */
-    protected Boolean shouldEnableNestedVirtualization(Boolean globalNestedV, Boolean globalNestedVPerVM, String localNestedV){
-        if (globalNestedV == null || globalNestedVPerVM == null) {
-            return false;
-        }
-        boolean globalNV = globalNestedV.booleanValue();
-        boolean globalNVPVM = globalNestedVPerVM.booleanValue();
-
-        if (globalNVPVM){
-            return (localNestedV == null && globalNV) || BooleanUtils.toBoolean(localNestedV);
-        }
-        return globalNV;
-    }
-
-    /**
-     * Adds {@code 'nestedVirtualizationFlag'} value to {@code details} due to if it should be enabled or not
-     * @param details vm details
-     * @param to vm to
-     */
-    protected void configureNestedVirtualization(Map<String, String> details, VirtualMachineTO to) {
-        Boolean globalNestedV = VmwareEnableNestedVirtualization.value();
-        Boolean globalNestedVPerVM = VmwareEnableNestedVirtualizationPerVM.value();
-        String localNestedV = details.get(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG);
-
-        Boolean shouldEnableNestedVirtualization = shouldEnableNestedVirtualization(globalNestedV, globalNestedVPerVM, localNestedV);
-        s_logger.debug("Nested virtualization requested, adding flag to vm configuration");
-        details.put(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG, Boolean.toString(shouldEnableNestedVirtualization));
-        to.setDetails(details);
-    }
-
-    private long getClusterId(long vmId) {
+    long getClusterId(long vmId) {
         long clusterId;
         Long hostId;
 
@@ -552,32 +223,7 @@
         return clusterId;
     }
 
-    private NicTO[] sortNicsByDeviceId(NicTO[] nics) {
-
-        List<NicTO> listForSort = new ArrayList<NicTO>();
-        for (NicTO nic : nics) {
-            listForSort.add(nic);
-        }
-        Collections.sort(listForSort, new Comparator<NicTO>() {
-
-            @Override
-            public int compare(NicTO arg0, NicTO arg1) {
-                if (arg0.getDeviceId() < arg1.getDeviceId()) {
-                    return -1;
-                } else if (arg0.getDeviceId() == arg1.getDeviceId()) {
-                    return 0;
-                }
-
-                return 1;
-            }
-        });
-
-        return listForSort.toArray(new NicTO[0]);
-    }
-
-    @Override
-    @DB
-    public Pair<Boolean, Long> getCommandHostDelegation(long hostId, Command cmd) {
+    @Override @DB public Pair<Boolean, Long> getCommandHostDelegation(long hostId, Command cmd) {
         boolean needDelegation = false;
         if (cmd instanceof StorageSubSystemCommand) {
             Boolean fullCloneEnabled = VmwareFullClone.value();
@@ -585,12 +231,12 @@
             c.setExecuteInSequence(fullCloneEnabled);
         }
         if (cmd instanceof DownloadCommand) {
-          cmd.setContextParam(VmwareManager.s_vmwareOVAPackageTimeout.key(), String.valueOf(VmwareManager.s_vmwareOVAPackageTimeout.value()));
+            cmd.setContextParam(VmwareManager.s_vmwareOVAPackageTimeout.key(), String.valueOf(VmwareManager.s_vmwareOVAPackageTimeout.value()));
         }
         //NOTE: the hostid can be a hypervisor host, or a ssvm agent. For copycommand, if it's for volume upload, the hypervisor
         //type is empty, so we need to check the format of volume at first.
         if (cmd instanceof CopyCommand) {
-            CopyCommand cpyCommand = (CopyCommand) cmd;
+            CopyCommand cpyCommand = (CopyCommand)cmd;
             DataTO srcData = cpyCommand.getSrcTO();
             DataStoreTO srcStoreTO = srcData.getDataStore();
             DataTO destData = cpyCommand.getDestTO();
@@ -617,8 +263,8 @@
                 return new Pair<Boolean, Long>(Boolean.FALSE, new Long(hostId));
             }
 
-            if (destData.getObjectType() == DataObjectType.VOLUME && destStoreTO.getRole() == DataStoreRole.Primary &&
-                srcData.getObjectType() == DataObjectType.TEMPLATE && srcStoreTO.getRole() == DataStoreRole.Primary) {
+            if (destData.getObjectType() == DataObjectType.VOLUME && destStoreTO.getRole() == DataStoreRole.Primary && srcData.getObjectType() == DataObjectType.TEMPLATE
+                    && srcStoreTO.getRole() == DataStoreRole.Primary) {
                 needDelegation = false;
             } else {
                 needDelegation = true;
@@ -662,9 +308,8 @@
             cmd.setContextParam("vCenterSessionTimeout", String.valueOf(_vmwareMgr.getVcenterSessionTimeout()));
             cmd.setContextParam(VmwareManager.s_vmwareOVAPackageTimeout.key(), String.valueOf(VmwareManager.s_vmwareOVAPackageTimeout.value()));
 
-            if (cmd instanceof BackupSnapshotCommand || cmd instanceof CreatePrivateTemplateFromVolumeCommand ||
-                cmd instanceof CreatePrivateTemplateFromSnapshotCommand || cmd instanceof CopyVolumeCommand || cmd instanceof CopyCommand ||
-                cmd instanceof CreateVolumeOVACommand || cmd instanceof PrepareOVAPackingCommand || cmd instanceof CreateVolumeFromSnapshotCommand) {
+            if (cmd instanceof BackupSnapshotCommand || cmd instanceof CreatePrivateTemplateFromVolumeCommand || cmd instanceof CreatePrivateTemplateFromSnapshotCommand || cmd instanceof CopyVolumeCommand || cmd instanceof CopyCommand || cmd instanceof CreateVolumeOVACommand || cmd instanceof PrepareOVAPackingCommand
+                    || cmd instanceof CreateVolumeFromSnapshotCommand) {
                 String workerName = _vmwareMgr.composeWorkerName();
                 long checkPointId = 1;
                 // FIXME: Fix                    long checkPointId = _checkPointMgr.pushCheckPoint(new VmwareCleanupMaid(hostDetails.get("guid"), workerName));
@@ -707,8 +352,7 @@
         return tokens[0] + "@" + vCenterIp;
     }
 
-    @Override
-    public List<Command> finalizeExpungeNics(VirtualMachine vm, List<NicProfile> nics) {
+    @Override public List<Command> finalizeExpungeNics(VirtualMachine vm, List<NicProfile> nics) {
         List<Command> commands = new ArrayList<Command>();
         List<NicVO> nicVOs = _nicDao.listByVmId(vm.getId());
         for (NicVO nic : nicVOs) {
@@ -719,26 +363,22 @@
                 // We need the traffic label to figure out which vSwitch has the
                 // portgroup
                 PhysicalNetworkTrafficTypeVO trafficTypeVO = _physicalNetworkTrafficTypeDao.findBy(networkVO.getPhysicalNetworkId(), networkVO.getTrafficType());
-                UnregisterNicCommand unregisterNicCommand =
-                    new UnregisterNicCommand(vm.getInstanceName(), trafficTypeVO.getVmwareNetworkLabel(), UUID.fromString(nic.getUuid()));
+                UnregisterNicCommand unregisterNicCommand = new UnregisterNicCommand(vm.getInstanceName(), trafficTypeVO.getVmwareNetworkLabel(), UUID.fromString(nic.getUuid()));
                 commands.add(unregisterNicCommand);
             }
         }
         return commands;
     }
 
-    @Override
-    public String getConfigComponentName() {
+    @Override public String getConfigComponentName() {
         return VMwareGuru.class.getSimpleName();
     }
 
-    @Override
-    public ConfigKey<?>[] getConfigKeys() {
+    @Override public ConfigKey<?>[] getConfigKeys() {
         return new ConfigKey<?>[] {VmwareReserveCpu, VmwareReserveMemory, VmwareEnableNestedVirtualization, VmwareEnableNestedVirtualizationPerVM};
     }
 
-    @Override
-    public List<Command> finalizeExpungeVolumes(VirtualMachine vm) {
+    @Override public List<Command> finalizeExpungeVolumes(VirtualMachine vm) {
         List<Command> commands = new ArrayList<Command>();
 
         List<VolumeVO> volumes = _volumeDao.findByInstance(vm.getId());
@@ -776,8 +416,7 @@
         return commands;
     }
 
-    @Override
-    public Map<String, String> getClusterSettings(long vmId) {
+    @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());
@@ -799,8 +438,7 @@
      */
     private DatacenterMO getDatacenterMO(long zoneId) throws Exception {
         VmwareDatacenterVO vmwareDatacenter = getVmwareDatacenter(zoneId);
-        VmwareContext context = VmwareContextFactory.getContext(vmwareDatacenter.getVcenterHost(),
-                vmwareDatacenter.getUser(), vmwareDatacenter.getPassword());
+        VmwareContext context = VmwareContextFactory.getContext(vmwareDatacenter.getVcenterHost(), vmwareDatacenter.getUser(), vmwareDatacenter.getPassword());
         DatacenterMO dcMo = new DatacenterMO(context, vmwareDatacenter.getVmwareDatacenterName());
         ManagedObjectReference dcMor = dcMo.getMor();
         if (dcMor == null) {
@@ -826,9 +464,8 @@
      */
     private ServiceOfferingVO createServiceOfferingForVMImporting(Integer cpus, Integer memory, Integer maxCpuUsage) {
         String name = "Imported-" + cpus + "-" + memory;
-        ServiceOfferingVO vo = new ServiceOfferingVO(name, cpus, memory, maxCpuUsage, null, null,
-                false, name, Storage.ProvisioningType.THIN, false, false,
-                null, false, Type.User, false);
+        ServiceOfferingVO vo = new ServiceOfferingVO(name, cpus, memory, maxCpuUsage, null, null, false, name, Storage.ProvisioningType.THIN, false, false, null, false, Type.User,
+                false);
         return serviceOfferingDao.persist(vo);
     }
 
@@ -836,15 +473,12 @@
      * Get service offering ID for VM being imported.
      * If it cannot be found it creates one and returns its ID
      */
-    private Long getImportingVMServiceOffering(VirtualMachineConfigSummary configSummary,
-                                               VirtualMachineRuntimeInfo runtimeInfo) {
+    private Long getImportingVMServiceOffering(VirtualMachineConfigSummary configSummary, VirtualMachineRuntimeInfo runtimeInfo) {
         Integer numCpu = configSummary.getNumCpu();
         Integer memorySizeMB = configSummary.getMemorySizeMB();
         Integer maxCpuUsage = runtimeInfo.getMaxCpuUsage();
         List<ServiceOfferingVO> offerings = serviceOfferingDao.listPublicByCpuAndMemory(numCpu, memorySizeMB);
-        return CollectionUtils.isEmpty(offerings) ?
-                createServiceOfferingForVMImporting(numCpu, memorySizeMB, maxCpuUsage).getId() :
-                offerings.get(0).getId();
+        return CollectionUtils.isEmpty(offerings) ? createServiceOfferingForVMImporting(numCpu, memorySizeMB, maxCpuUsage).getId() : offerings.get(0).getId();
     }
 
     /**
@@ -876,7 +510,7 @@
      * Check backing info
      */
     private void checkBackingInfo(VirtualDeviceBackingInfo backingInfo) {
-        if (! (backingInfo instanceof VirtualDiskFlatVer2BackingInfo)) {
+        if (!(backingInfo instanceof VirtualDiskFlatVer2BackingInfo)) {
             throw new CloudRuntimeException("Unsopported backing, expected " + VirtualDiskFlatVer2BackingInfo.class.getSimpleName());
         }
     }
@@ -899,7 +533,7 @@
     private Long getPoolId(VirtualDisk disk) {
         VirtualDeviceBackingInfo backing = disk.getBacking();
         checkBackingInfo(backing);
-        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo) backing;
+        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo)backing;
         String[] fileNameParts = info.getFileName().split(" ");
         String datastoreUuid = StringUtils.substringBetween(fileNameParts[0], "[", "]");
         return getPoolIdFromDatastoreUuid(datastoreUuid);
@@ -920,7 +554,7 @@
     private String getRootDiskTemplatePath(VirtualDisk rootDisk) {
         VirtualDeviceBackingInfo backing = rootDisk.getBacking();
         checkBackingInfo(backing);
-        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo) backing;
+        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo)backing;
         VirtualDiskFlatVer2BackingInfo parent = info.getParent();
         return (parent != null) ? getVolumeNameFromFileName(parent.getFileName()) : getVolumeNameFromFileName(info.getFileName());
     }
@@ -950,8 +584,7 @@
     /**
      * Get template size
      */
-    private Long getTemplateSize(VirtualMachineMO template, String vmInternalName,
-                                 Map<VirtualDisk, VolumeVO> disksMapping, Backup backup) throws Exception {
+    private Long getTemplateSize(VirtualMachineMO template, String vmInternalName, Map<VirtualDisk, VolumeVO> disksMapping, Backup backup) throws Exception {
         List<VirtualDisk> disks = template.getVirtualDisks();
         if (CollectionUtils.isEmpty(disks)) {
             throw new CloudRuntimeException("Couldn't find VM template size");
@@ -964,11 +597,8 @@
      */
     private VMTemplateVO createVMTemplateRecord(String vmInternalName, long guestOsId, long accountId) {
         Long nextTemplateId = vmTemplateDao.getNextInSequence(Long.class, "id");
-        VMTemplateVO templateVO = new VMTemplateVO(nextTemplateId, "Imported-from-" + vmInternalName,
-                Storage.ImageFormat.OVA,false, false, false, Storage.TemplateType.USER,
-                null, false, 64, accountId, null, "Template imported from VM " + vmInternalName,
-                false, guestOsId, false, HypervisorType.VMware, null, null,
-                false, false, false);
+        VMTemplateVO templateVO = new VMTemplateVO(nextTemplateId, "Imported-from-" + vmInternalName, Storage.ImageFormat.OVA, false, false, false, Storage.TemplateType.USER, null,
+                false, 64, accountId, null, "Template imported from VM " + vmInternalName, false, guestOsId, false, HypervisorType.VMware, null, null, false, false, false, false);
         return vmTemplateDao.persist(templateVO);
     }
 
@@ -979,9 +609,7 @@
      */
     private long getTemplateId(String templatePath, String vmInternalName, Long guestOsId, long accountId) {
         List<VMTemplateStoragePoolVO> poolRefs = templateStoragePoolDao.listByTemplatePath(templatePath);
-        return CollectionUtils.isNotEmpty(poolRefs) ?
-                poolRefs.get(0).getTemplateId() :
-                createVMTemplateRecord(vmInternalName, guestOsId, accountId).getId();
+        return CollectionUtils.isNotEmpty(poolRefs) ? poolRefs.get(0).getTemplateId() : createVMTemplateRecord(vmInternalName, guestOsId, accountId).getId();
     }
 
     /**
@@ -990,9 +618,8 @@
     private void updateTemplateRef(long templateId, Long poolId, String templatePath, Long templateSize) {
         VMTemplateStoragePoolVO templateRef = templateStoragePoolDao.findByPoolPath(poolId, templatePath);
         if (templateRef == null) {
-            templateRef = new VMTemplateStoragePoolVO(poolId, templateId, null, 100,
-                    VMTemplateStorageResourceAssoc.Status.DOWNLOADED, templatePath, null,
-                    null, templatePath, templateSize);
+            templateRef = new VMTemplateStoragePoolVO(poolId, templateId, null, 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED, templatePath, null, null, templatePath,
+                    templateSize, null);
             templateRef.setState(ObjectInDataStoreStateMachine.State.Ready);
             templateStoragePoolDao.persist(templateRef);
         }
@@ -1001,8 +628,7 @@
     /**
      * Get template ID for VM being imported. If it is not found, it is created
      */
-    private Long getImportingVMTemplate(List<VirtualDisk> virtualDisks, DatacenterMO dcMo, String vmInternalName,
-                                        Long guestOsId, long accountId, Map<VirtualDisk, VolumeVO> disksMapping, Backup backup) throws Exception {
+    private Long getImportingVMTemplate(List<VirtualDisk> virtualDisks, DatacenterMO dcMo, String vmInternalName, Long guestOsId, long accountId, Map<VirtualDisk, VolumeVO> disksMapping, Backup backup) throws Exception {
         for (VirtualDisk disk : virtualDisks) {
             if (isRootDisk(disk, disksMapping, backup)) {
                 VolumeVO volumeVO = disksMapping.get(disk);
@@ -1026,9 +652,7 @@
      * If VM does not exist: create and persist VM
      * If VM exists: update VM
      */
-    private VMInstanceVO getVM(String vmInternalName, long templateId, long guestOsId,
-                               long serviceOfferingId, long zoneId, long accountId, long userId,
-                               long domainId) {
+    private VMInstanceVO getVM(String vmInternalName, long templateId, long guestOsId, long serviceOfferingId, long zoneId, long accountId, long userId, long domainId) {
         VMInstanceVO vm = _vmDao.findVMByInstanceNameIncludingRemoved(vmInternalName);
         if (vm != null) {
             vm.setState(VirtualMachine.State.Stopped);
@@ -1036,16 +660,14 @@
             _vmDao.update(vm.getId(), vm);
             if (vm.getRemoved() != null) {
                 _vmDao.unremove(vm.getId());
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, vm.getDataCenterId(), vm.getId(),
-                        vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(),
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, vm.getDataCenterId(), vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(),
                         vm.getHypervisorType().toString(), VirtualMachine.class.getName(), vm.getUuid(), vm.isDisplayVm());
             }
             return _vmDao.findById(vm.getId());
         } else {
             long id = userVmDao.getNextInSequence(Long.class, "id");
-            UserVmVO vmInstanceVO = new UserVmVO(id, vmInternalName, vmInternalName, templateId, HypervisorType.VMware,
-                    guestOsId, false, false, domainId, accountId, userId, serviceOfferingId,
-                    null, vmInternalName, null);
+            UserVmVO vmInstanceVO = new UserVmVO(id, vmInternalName, vmInternalName, templateId, HypervisorType.VMware, guestOsId, false, false, domainId, accountId, userId,
+                    serviceOfferingId, null, vmInternalName, null);
             vmInstanceVO.setDataCenterId(zoneId);
             return userVmDao.persist(vmInstanceVO);
         }
@@ -1054,11 +676,9 @@
     /**
      * Create and persist volume
      */
-    private VolumeVO createVolumeRecord(Volume.Type type, String volumeName, long zoneId, long domainId,
-                                        long accountId, long diskOfferingId, Storage.ProvisioningType provisioningType,
-                                        Long size, long instanceId, Long poolId, long templateId, Integer unitNumber, VirtualMachineDiskInfo diskInfo) {
-        VolumeVO volumeVO = new VolumeVO(type, volumeName, zoneId, domainId, accountId, diskOfferingId,
-                provisioningType, size, null, null, null);
+    private VolumeVO createVolumeRecord(Volume.Type type, String volumeName, long zoneId, long domainId, long accountId, long diskOfferingId, Storage.ProvisioningType provisioningType,
+            Long size, long instanceId, Long poolId, long templateId, Integer unitNumber, VirtualMachineDiskInfo diskInfo) {
+        VolumeVO volumeVO = new VolumeVO(type, volumeName, zoneId, domainId, accountId, diskOfferingId, provisioningType, size, null, null, null);
         volumeVO.setFormat(Storage.ImageFormat.OVA);
         volumeVO.setPath(volumeName);
         volumeVO.setState(Volume.State.Ready);
@@ -1097,9 +717,7 @@
      */
     private long getDiskOfferingId(long size, Storage.ProvisioningType provisioningType) {
         List<DiskOfferingVO> offerings = diskOfferingDao.listAllBySizeAndProvisioningType(size, provisioningType);
-        return CollectionUtils.isNotEmpty(offerings) ?
-                offerings.get(0).getId() :
-                diskOfferingDao.findByUniqueName("Cloud.Com-Custom").getId();
+        return CollectionUtils.isNotEmpty(offerings) ? offerings.get(0).getId() : diskOfferingDao.findByUniqueName("Cloud.Com-Custom").getId();
     }
 
     protected VolumeVO updateVolume(VirtualDisk disk, Map<VirtualDisk, VolumeVO> disksMapping, VirtualMachineMO vmToImport, Long poolId, VirtualMachine vm) throws Exception {
@@ -1116,8 +734,7 @@
         if (volume.getRemoved() != null) {
             _volumeDao.unremove(volume.getId());
             if (vm.getType() == Type.User) {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(),
-                        volume.getId(), volume.getName(), volume.getDiskOfferingId(), null, volume.getSize(),
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), null, volume.getSize(),
                         Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
                 _resourceLimitService.incrementResourceCount(vm.getAccountId(), Resource.ResourceType.volume, volume.isDisplayVolume());
                 _resourceLimitService.incrementResourceCount(vm.getAccountId(), Resource.ResourceType.primary_storage, volume.isDisplayVolume(), volume.getSize());
@@ -1129,8 +746,8 @@
     /**
      * Get volumes for VM being imported
      */
-    private void syncVMVolumes(VMInstanceVO vmInstanceVO, List<VirtualDisk> virtualDisks,
-                               Map<VirtualDisk, VolumeVO> disksMapping, VirtualMachineMO vmToImport, Backup backup) throws Exception {
+    private void syncVMVolumes(VMInstanceVO vmInstanceVO, List<VirtualDisk> virtualDisks, Map<VirtualDisk, VolumeVO> disksMapping, VirtualMachineMO vmToImport, Backup backup)
+            throws Exception {
         long zoneId = vmInstanceVO.getDataCenterId();
         long accountId = vmInstanceVO.getAccountId();
         long domainId = vmInstanceVO.getDomainId();
@@ -1155,8 +772,7 @@
         return diskInfoBuilder.getDiskInfoByBackingFileBaseName(volumeName, poolName);
     }
 
-    private VolumeVO createVolume(VirtualDisk disk, VirtualMachineMO vmToImport, long domainId, long zoneId,
-                                  long accountId, long instanceId, Long poolId, long templateId, Backup backup, boolean isImport) throws Exception {
+    private VolumeVO createVolume(VirtualDisk disk, VirtualMachineMO vmToImport, long domainId, long zoneId, long accountId, long instanceId, Long poolId, long templateId, Backup backup, boolean isImport) throws Exception {
         VMInstanceVO vm = _vmDao.findByIdIncludingRemoved(backup.getVmId());
         if (vm == null) {
             throw new CloudRuntimeException("Failed to find the backup volume information from the VM backup");
@@ -1173,14 +789,13 @@
         }
         VirtualDeviceBackingInfo backing = disk.getBacking();
         checkBackingInfo(backing);
-        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo) backing;
+        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo)backing;
         String volumeName = getVolumeName(disk, vmToImport);
         Storage.ProvisioningType provisioningType = getProvisioningType(info);
         long diskOfferingId = getDiskOfferingId(size, provisioningType);
         Integer unitNumber = disk.getUnitNumber();
         VirtualMachineDiskInfo diskInfo = getDiskInfo(vmToImport, poolId, volumeName);
-        return createVolumeRecord(type, volumeName, zoneId, domainId, accountId, diskOfferingId,
-                provisioningType, size, instanceId, poolId, templateId, unitNumber, diskInfo);
+        return createVolumeRecord(type, volumeName, zoneId, domainId, accountId, diskOfferingId, provisioningType, size, instanceId, poolId, templateId, unitNumber, diskInfo);
     }
 
     /**
@@ -1208,9 +823,8 @@
     private NetworkVO createNetworkRecord(Long zoneId, String tag, String vlan, long accountId, long domainId) {
         Long physicalNetworkId = getPhysicalNetworkId(zoneId, tag);
         final long id = _networkDao.getNextInSequence(Long.class, "id");
-        NetworkVO networkVO = new NetworkVO(id, TrafficType.Guest, Networks.Mode.Dhcp, BroadcastDomainType.Vlan, 9L,
-                domainId, accountId, id, "Imported-network-" + id, "Imported-network-" + id, null, Network.GuestType.Isolated,
-                zoneId, physicalNetworkId, ControlledEntity.ACLType.Account, false, null, false);
+        NetworkVO networkVO = new NetworkVO(id, TrafficType.Guest, Networks.Mode.Dhcp, BroadcastDomainType.Vlan, 9L, domainId, accountId, id, "Imported-network-" + id,
+                "Imported-network-" + id, null, Network.GuestType.Isolated, zoneId, physicalNetworkId, ControlledEntity.ACLType.Account, false, null, false);
         networkVO.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan));
         networkVO.setGuruName("ExternalGuestNetworkGuru");
         networkVO.setState(Network.State.Implemented);
@@ -1252,7 +866,7 @@
      */
     private NetworkMO getNetworkMO(VirtualE1000 nic, VmwareContext context) {
         VirtualDeviceConnectInfo connectable = nic.getConnectable();
-        VirtualEthernetCardNetworkBackingInfo info = (VirtualEthernetCardNetworkBackingInfo) nic.getBacking();
+        VirtualEthernetCardNetworkBackingInfo info = (VirtualEthernetCardNetworkBackingInfo)nic.getBacking();
         ManagedObjectReference networkMor = info.getNetwork();
         if (networkMor == null) {
             throw new CloudRuntimeException("Could not find network for NIC on: " + nic.getMacAddress());
@@ -1261,15 +875,14 @@
     }
 
     private Pair<String, String> getNicMacAddressAndNetworkName(VirtualDevice nicDevice, VmwareContext context) throws Exception {
-        VirtualE1000 nic = (VirtualE1000) nicDevice;
+        VirtualE1000 nic = (VirtualE1000)nicDevice;
         String macAddress = nic.getMacAddress();
         NetworkMO networkMO = getNetworkMO(nic, context);
         String networkName = networkMO.getName();
         return new Pair<>(macAddress, networkName);
     }
 
-    private void syncVMNics(VirtualDevice[] nicDevices, DatacenterMO dcMo, Map<String, NetworkVO> networksMapping,
-                            VMInstanceVO vm) throws Exception {
+    private void syncVMNics(VirtualDevice[] nicDevices, DatacenterMO dcMo, Map<String, NetworkVO> networksMapping, VMInstanceVO vm) throws Exception {
         VmwareContext context = dcMo.getContext();
         List<NicVO> allNics = _nicDao.listByVmId(vm.getId());
         for (VirtualDevice nicDevice : nicDevices) {
@@ -1298,14 +911,12 @@
 
         for (Backup.VolumeInfo backedUpVol : backedUpVolumes) {
             for (VirtualDisk disk : virtualDisks) {
-                if (!map.containsKey(disk) && backedUpVol.getSize().equals(disk.getCapacityInBytes())
-                        && !usedVols.containsKey(backedUpVol.getUuid())) {
+                if (!map.containsKey(disk) && backedUpVol.getSize().equals(disk.getCapacityInBytes()) && !usedVols.containsKey(backedUpVol.getUuid())) {
                     String volId = backedUpVol.getUuid();
                     VolumeVO vol = _volumeDao.findByUuidIncludingRemoved(volId);
                     usedVols.put(backedUpVol.getUuid(), true);
                     map.put(disk, vol);
-                    s_logger.debug("VM restore mapping for disk " + disk.getBacking() +
-                            " (capacity: " + disk.getCapacityInBytes() + ") with volume ID" + vol.getId());
+                    s_logger.debug("VM restore mapping for disk " + disk.getBacking() + " (capacity: " + toHumanReadableSize(disk.getCapacityInBytes()) + ") with volume ID" + vol.getId());
                 }
             }
         }
@@ -1328,7 +939,7 @@
      */
     private VirtualDisk findRestoredVolume(Backup.VolumeInfo volumeInfo, VirtualMachineMO vm) throws Exception {
         List<VirtualDisk> virtualDisks = vm.getVirtualDisks();
-        for (VirtualDisk disk: virtualDisks) {
+        for (VirtualDisk disk : virtualDisks) {
             if (disk.getCapacityInBytes().equals(volumeInfo.getSize())) {
                 return disk;
             }
@@ -1342,15 +953,14 @@
     private String getVolumeFullPath(VirtualDisk disk) {
         VirtualDeviceBackingInfo backing = disk.getBacking();
         checkBackingInfo(backing);
-        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo) backing;
+        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo)backing;
         return info.getFileName();
     }
 
     /**
      * Get dest volume full path
      */
-    private String getDestVolumeFullPath(VirtualDisk restoredDisk, VirtualMachineMO restoredVm,
-                                         VirtualMachineMO vmMo) throws Exception {
+    private String getDestVolumeFullPath(VirtualDisk restoredDisk, VirtualMachineMO restoredVm, VirtualMachineMO vmMo) throws Exception {
         VirtualDisk vmDisk = vmMo.getVirtualDisks().get(0);
         String vmDiskPath = vmMo.getVmdkFileBaseName(vmDisk);
         String vmDiskFullPath = getVolumeFullPath(vmMo.getVirtualDisks().get(0));
@@ -1365,13 +975,11 @@
         VirtualDisk vmDisk = vmMo.getVirtualDisks().get(0);
         VirtualDeviceBackingInfo backing = vmDisk.getBacking();
         checkBackingInfo(backing);
-        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo) backing;
+        VirtualDiskFlatVer2BackingInfo info = (VirtualDiskFlatVer2BackingInfo)backing;
         return info.getDatastore();
     }
 
-    @Override
-    public VirtualMachine importVirtualMachineFromBackup(long zoneId, long domainId, long accountId, long userId,
-                                                         String vmInternalName, Backup backup) throws Exception {
+    @Override public VirtualMachine importVirtualMachineFromBackup(long zoneId, long domainId, long accountId, long userId, String vmInternalName, Backup backup) throws Exception {
         DatacenterMO dcMo = getDatacenterMO(zoneId);
         VirtualMachineMO vmToImport = dcMo.findVm(vmInternalName);
         if (vmToImport == null) {
@@ -1397,16 +1005,15 @@
         return vm;
     }
 
-    @Override
-    public boolean attachRestoredVolumeToVirtualMachine(long zoneId, String location, Backup.VolumeInfo volumeInfo,
-                                                        VirtualMachine vm, long poolId, Backup backup) throws Exception {
+    @Override public boolean attachRestoredVolumeToVirtualMachine(long zoneId, String location, Backup.VolumeInfo volumeInfo, VirtualMachine vm, long poolId, Backup backup)
+            throws Exception {
         DatacenterMO dcMo = getDatacenterMO(zoneId);
         VirtualMachineMO vmRestored = findVM(dcMo, location);
         VirtualMachineMO vmMo = findVM(dcMo, vm.getInstanceName());
         VirtualDisk restoredDisk = findRestoredVolume(volumeInfo, vmRestored);
         String diskPath = vmRestored.getVmdkFileBaseName(restoredDisk);
 
-        s_logger.debug("Restored disk size=" + restoredDisk.getCapacityInKB() + " path=" + diskPath);
+        s_logger.debug("Restored disk size=" + toHumanReadableSize(restoredDisk.getCapacityInKB()) + " path=" + diskPath);
 
         // Detach restored VM disks
         vmRestored.detachAllDisks();
@@ -1435,8 +1042,7 @@
             s_logger.error("Failed to get the attached the (restored) volume " + diskPath);
             return false;
         }
-        createVolume(attachedDisk, vmMo, vm.getDomainId(), vm.getDataCenterId(), vm.getAccountId(), vm.getId(),
-                poolId, vm.getTemplateId(), backup, false);
+        createVolume(attachedDisk, vmMo, vm.getDomainId(), vm.getDataCenterId(), vm.getAccountId(), vm.getId(), poolId, vm.getTemplateId(), backup, false);
 
         return true;
     }
@@ -1450,15 +1056,14 @@
         return null;
     }
 
-    @Override
-    public List<Command> finalizeMigrate(VirtualMachine vm, StoragePool destination) {
+    @Override public List<Command> finalizeMigrate(VirtualMachine vm, StoragePool destination) {
         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);
+            VolumeTO vol = new VolumeTO(volume, destination);
             vols.add(vol);
         }
         MigrateVmToPoolCommand migrateVmToPoolCommand = new MigrateVmToPoolCommand(vm.getInstanceName(), vols, destination.getUuid(), true);
@@ -1468,7 +1073,7 @@
         final Long destClusterId = destination.getClusterId();
         final Long srcClusterId = getClusterId(vm.getId());
 
-        if (srcClusterId != null && destClusterId != null && ! srcClusterId.equals(destClusterId)) {
+        if (srcClusterId != null && destClusterId != null && !srcClusterId.equals(destClusterId)) {
             final String srcDcName = _clusterDetailsDao.getVmwareDcName(srcClusterId);
             final String destDcName = _clusterDetailsDao.getVmwareDcName(destClusterId);
             if (srcDcName != null && destDcName != null && !srcDcName.equals(destDcName)) {
@@ -1480,4 +1085,9 @@
         }
         return commands;
     }
+
+    @Override
+    protected VirtualMachineTO toVirtualMachineTO(VirtualMachineProfile vmProfile) {
+        return super.toVirtualMachineTO(vmProfile);
+    }
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java
new file mode 100644
index 0000000..b8de0bb
--- /dev/null
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/guru/VmwareVmImplementer.java
@@ -0,0 +1,408 @@
+// 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.guru;
+
+import com.cloud.agent.api.to.DeployAsIsInfoTO;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.hypervisor.vmware.manager.VmwareManager;
+import com.cloud.hypervisor.vmware.mo.DiskControllerType;
+import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.storage.GuestOSHypervisorVO;
+import com.cloud.storage.GuestOSVO;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.GuestOSHypervisorDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VmDetailConstants;
+import com.cloud.vm.dao.DomainRouterDao;
+import com.cloud.vm.dao.NicDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
+import org.apache.commons.lang.BooleanUtils;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class VmwareVmImplementer {
+    private static final Logger LOGGER = Logger.getLogger(VmwareVmImplementer.class);
+
+    @Inject
+    DomainRouterDao domainRouterDao;
+    @Inject
+    GuestOSDao guestOsDao;
+    @Inject
+    GuestOSHypervisorDao guestOsHypervisorDao;
+    @Inject
+    HostDao hostDao;
+    @Inject
+    NetworkDao networkDao;
+    @Inject
+    NetworkModel networkMgr;
+    @Inject
+    NicDao nicDao;
+    @Inject
+    PrimaryDataStoreDao storagePoolDao;
+    @Inject
+    VMTemplatePoolDao templateStoragePoolDao;
+    @Inject
+    VmwareManager vmwareMgr;
+    @Inject
+    DeployAsIsHelper deployAsIsHelper;
+
+    private Boolean globalNestedVirtualisationEnabled;
+    private Boolean globalNestedVPerVMEnabled;
+
+    Boolean getGlobalNestedVirtualisationEnabled() {
+        return globalNestedVirtualisationEnabled != null ? globalNestedVirtualisationEnabled : false;
+    }
+
+    void setGlobalNestedVirtualisationEnabled(Boolean globalNestedVirtualisationEnabled) {
+        this.globalNestedVirtualisationEnabled = globalNestedVirtualisationEnabled;
+    }
+
+    Boolean getGlobalNestedVPerVMEnabled() {
+        return globalNestedVPerVMEnabled != null ? globalNestedVPerVMEnabled : false;
+    }
+
+    void setGlobalNestedVPerVMEnabled(Boolean globalNestedVPerVMEnabled) {
+        this.globalNestedVPerVMEnabled = globalNestedVPerVMEnabled;
+    }
+
+    VirtualMachineTO implement(VirtualMachineProfile vm, VirtualMachineTO to, long clusterId) {
+        to.setBootloader(VirtualMachineTemplate.BootloaderType.HVM);
+        boolean deployAsIs = vm.getTemplate().isDeployAsIs();
+        HostVO host = hostDao.findById(vm.getVirtualMachine().getHostId());
+        Map<String, String> details = to.getDetails();
+        if (details == null)
+            details = new HashMap<>();
+
+        VirtualMachine.Type vmType = vm.getType();
+        boolean userVm = !(vmType.equals(VirtualMachine.Type.DomainRouter) || vmType.equals(VirtualMachine.Type.ConsoleProxy) || vmType.equals(VirtualMachine.Type.SecondaryStorageVm));
+
+        String nicDeviceType = details.get(VmDetailConstants.NIC_ADAPTER);
+        if (!userVm) {
+
+            if (nicDeviceType == null) {
+                details.put(VmDetailConstants.NIC_ADAPTER, vmwareMgr.getSystemVMDefaultNicAdapterType());
+            } else {
+                try {
+                    VirtualEthernetCardType.valueOf(nicDeviceType);
+                } catch (Exception e) {
+                    LOGGER.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
+                    details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
+                }
+            }
+        } else {
+            // for user-VM, use E1000 as default
+            if (nicDeviceType == null) {
+                details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
+            } else {
+                try {
+                    VirtualEthernetCardType.valueOf(nicDeviceType);
+                } catch (Exception e) {
+                    LOGGER.warn("Invalid NIC device type " + nicDeviceType + " is specified in VM details, switch to default E1000");
+                    details.put(VmDetailConstants.NIC_ADAPTER, VirtualEthernetCardType.E1000.toString());
+                }
+            }
+        }
+
+        setBootParameters(vm, to, details);
+
+        setDiskControllers(vm, details, userVm);
+
+        List<NicProfile> nicProfiles = getNicProfiles(vm, details);
+
+        addReservationDetails(clusterId, details);
+
+        if (vmType.equals(VirtualMachine.Type.DomainRouter)) {
+            configureDomainRouterNicsAndDetails(vm, to, details, nicProfiles);
+        }
+
+        // Don't do this if the virtual machine is one of the special types
+        // Should only be done on user machines
+        if (userVm) {
+            configureNestedVirtualization(details, to);
+        }
+        // Determine the VM's OS description
+        GuestOSVO guestOS = guestOsDao.findByIdIncludingRemoved(vm.getVirtualMachine().getGuestOSId());
+        to.setOs(guestOS.getDisplayName());
+        to.setHostName(vm.getHostName());
+
+        GuestOSHypervisorVO guestOsMapping = null;
+        if (host != null) {
+            guestOsMapping = guestOsHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), Hypervisor.HypervisorType.VMware.toString(), host.getHypervisorVersion());
+        }
+        if (guestOsMapping == null || host == null) {
+            to.setPlatformEmulator(null);
+        } else {
+            to.setPlatformEmulator(guestOsMapping.getGuestOsName());
+        }
+
+        if (deployAsIs) {
+            setDeployAsIsInfoTO(vm, to, details);
+        }
+
+        setDetails(to, details);
+
+        return to;
+    }
+
+    /**
+     * Set the information relevant for deploy-as-is VMs on the VM TO
+     */
+    private void setDeployAsIsInfoTO(VirtualMachineProfile vm, VirtualMachineTO to, Map<String, String> details) {
+        Map<String, String> properties = deployAsIsHelper.getVirtualMachineDeployAsIsProperties(vm);
+        Map<Integer, String> nicsAdapterMapping = deployAsIsHelper.getAllocatedVirtualMachineNicsAdapterMapping(vm, to.getNics());
+        DeployAsIsInfoTO info = new DeployAsIsInfoTO(properties, nicsAdapterMapping);
+        to.setDeployAsIsInfo(info);
+    }
+
+    private void setDetails(VirtualMachineTO to, Map<String, String> details) {
+        if (LOGGER.isTraceEnabled()) {
+            for (String key : details.keySet()) {
+                LOGGER.trace(String.format("Detail for VM %s: %s => %s", to.getName(), key, details.get(key)));
+            }
+        }
+        to.setDetails(details);
+    }
+
+    private void configureDomainRouterNicsAndDetails(VirtualMachineProfile vm, VirtualMachineTO to, Map<String, String> details, List<NicProfile> nicProfiles) {
+        NicProfile publicNicProfile = null;
+        for (NicProfile nicProfile : nicProfiles) {
+            if (nicProfile.getTrafficType() == Networks.TrafficType.Public) {
+                publicNicProfile = nicProfile;
+                break;
+            }
+        }
+
+        if (publicNicProfile != null) {
+            NicTO[] nics = to.getNics();
+
+            // reserve extra NICs
+            NicTO[] expandedNics = new NicTO[nics.length + vmwareMgr.getRouterExtraPublicNics()];
+            int i = 0;
+            int deviceId = -1;
+            for (i = 0; i < nics.length; i++) {
+                expandedNics[i] = nics[i];
+                if (nics[i].getDeviceId() > deviceId)
+                    deviceId = nics[i].getDeviceId();
+            }
+            deviceId++;
+
+            long networkId = publicNicProfile.getNetworkId();
+            NetworkVO network = networkDao.findById(networkId);
+
+            for (; i < nics.length + vmwareMgr.getRouterExtraPublicNics(); i++) {
+                NicTO nicTo = new NicTO();
+
+                nicTo.setDeviceId(deviceId++);
+                nicTo.setBroadcastType(publicNicProfile.getBroadcastType());
+                nicTo.setType(publicNicProfile.getTrafficType());
+                nicTo.setIp("0.0.0.0");
+                nicTo.setNetmask("255.255.255.255");
+
+                try {
+                    String mac = networkMgr.getNextAvailableMacAddressInNetwork(networkId);
+                    nicTo.setMac(mac);
+                } catch (InsufficientAddressCapacityException e) {
+                    throw new CloudRuntimeException("unable to allocate mac address on network: " + networkId);
+                }
+                nicTo.setDns1(publicNicProfile.getIPv4Dns1());
+                nicTo.setDns2(publicNicProfile.getIPv4Dns2());
+                if (publicNicProfile.getIPv4Gateway() != null) {
+                    nicTo.setGateway(publicNicProfile.getIPv4Gateway());
+                } else {
+                    nicTo.setGateway(network.getGateway());
+                }
+                nicTo.setDefaultNic(false);
+                nicTo.setBroadcastUri(publicNicProfile.getBroadCastUri());
+                nicTo.setIsolationuri(publicNicProfile.getIsolationUri());
+
+                Integer networkRate = networkMgr.getNetworkRate(network.getId(), null);
+                nicTo.setNetworkRateMbps(networkRate);
+
+                expandedNics[i] = nicTo;
+            }
+
+            to.setNics(expandedNics);
+
+            VirtualMachine router = vm.getVirtualMachine();
+            DomainRouterVO routerVO = domainRouterDao.findById(router.getId());
+            if (routerVO != null && routerVO.getIsRedundantRouter()) {
+                Long peerRouterId = nicDao.getPeerRouterId(publicNicProfile.getMacAddress(), router.getId());
+                DomainRouterVO peerRouterVO = null;
+                if (peerRouterId != null) {
+                    peerRouterVO = domainRouterDao.findById(peerRouterId);
+                    if (peerRouterVO != null) {
+                        details.put("PeerRouterInstanceName", peerRouterVO.getInstanceName());
+                    }
+                }
+            }
+        }
+
+        StringBuffer sbMacSequence = new StringBuffer();
+        for (NicTO nicTo : sortNicsByDeviceId(to.getNics())) {
+            sbMacSequence.append(nicTo.getMac()).append("|");
+        }
+        if (!sbMacSequence.toString().isEmpty()) {
+            sbMacSequence.deleteCharAt(sbMacSequence.length() - 1);
+            String bootArgs = to.getBootArgs();
+            to.setBootArgs(bootArgs + " nic_macs=" + sbMacSequence.toString());
+        }
+    }
+
+    private void addReservationDetails(long clusterId, Map<String, String> details) {
+        details.put(VMwareGuru.VmwareReserveCpu.key(), VMwareGuru.VmwareReserveCpu.valueIn(clusterId).toString());
+        details.put(VMwareGuru.VmwareReserveMemory.key(), VMwareGuru.VmwareReserveMemory.valueIn(clusterId).toString());
+    }
+
+    private List<NicProfile> getNicProfiles(VirtualMachineProfile vm, Map<String, String> details) {
+        List<NicProfile> nicProfiles = vm.getNics();
+
+        for (NicProfile nicProfile : nicProfiles) {
+            if (nicProfile.getTrafficType() == Networks.TrafficType.Guest) {
+                if (networkMgr.isProviderSupportServiceInNetwork(nicProfile.getNetworkId(), Network.Service.Firewall, Network.Provider.CiscoVnmc)) {
+                    details.put("ConfigureVServiceInNexus", Boolean.TRUE.toString());
+                }
+                break;
+            }
+        }
+        return nicProfiles;
+    }
+
+    private void setDiskControllers(VirtualMachineProfile vm, Map<String, String> details, boolean userVm) {
+        String diskDeviceType = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER);
+        if (userVm) {
+            if (diskDeviceType == null) {
+                details.put(VmDetailConstants.ROOT_DISK_CONTROLLER,vmwareMgr.getRootDiskController());
+            }
+        }
+        String diskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
+        if (userVm) {
+            if (diskController == null) {
+                details.put(VmDetailConstants.DATA_DISK_CONTROLLER, DiskControllerType.lsilogic.toString());
+            }
+        }
+
+        if (vm.getType() == VirtualMachine.Type.NetScalerVm) {
+            details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, "scsi");
+        }
+    }
+
+    private void setBootParameters(VirtualMachineProfile vm, VirtualMachineTO to, Map<String, String> details) {
+        details.put(VmDetailConstants.BOOT_MODE, to.getBootMode());
+        if (vm.getParameter(VirtualMachineProfile.Param.BootIntoSetup) != null && (Boolean)vm.getParameter(VirtualMachineProfile.Param.BootIntoSetup) == true) {
+            to.setEnterHardwareSetup(true);
+        }
+// there should also be
+//        details.put(VmDetailConstants.BOOT_TYPE, to.getBootType());
+    }
+
+    /**
+     * Adds {@code 'nestedVirtualizationFlag'} value to {@code details} due to if it should be enabled or not
+     * @param details vm details should not be null
+     * @param to vm to
+     */
+    protected void configureNestedVirtualization(Map<String, String> details, VirtualMachineTO to) {
+        String localNestedV = details.get(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG);
+
+        Boolean globalNestedVirtualisationEnabled = getGlobalNestedVirtualisationEnabled();
+        Boolean globalNestedVPerVMEnabled = getGlobalNestedVPerVMEnabled();
+
+        Boolean shouldEnableNestedVirtualization = shouldEnableNestedVirtualization(globalNestedVirtualisationEnabled, globalNestedVPerVMEnabled, localNestedV);
+        if(LOGGER.isDebugEnabled()) {
+            LOGGER.debug(String.format(
+                    "Due to '%B'(globalNestedVirtualisationEnabled) and '%B'(globalNestedVPerVMEnabled) I'm adding a flag with value %B to the vm configuration for Nested Virtualisation.",
+                    globalNestedVirtualisationEnabled,
+                    globalNestedVPerVMEnabled,
+                    shouldEnableNestedVirtualization)
+            );
+        }
+        details.put(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG, Boolean.toString(shouldEnableNestedVirtualization));
+    }
+
+    /**
+     * Decide in which cases nested virtualization should be enabled based on (1){@code globalNestedV}, (2){@code globalNestedVPerVM}, (3){@code localNestedV}<br/>
+     * Nested virtualization should be enabled when one of this cases:
+     * <ul>
+     * <li>(1)=TRUE, (2)=TRUE, (3) is NULL (missing)</li>
+     * <li>(1)=TRUE, (2)=TRUE, (3)=TRUE</li>
+     * <li>(1)=TRUE, (2)=FALSE</li>
+     * <li>(1)=FALSE, (2)=TRUE, (3)=TRUE</li>
+     * </ul>
+     * In any other case, it shouldn't be enabled
+     * @param globalNestedV value of {@code 'vmware.nested.virtualization'} global config
+     * @param globalNestedVPerVM value of {@code 'vmware.nested.virtualization.perVM'} global config
+     * @param localNestedV value of {@code 'nestedVirtualizationFlag'} key in vm details if present, null if not present
+     * @return "true" for cases in which nested virtualization is enabled, "false" if not
+     */
+    Boolean shouldEnableNestedVirtualization(Boolean globalNestedV, Boolean globalNestedVPerVM, String localNestedV) {
+        if (globalNestedV == null || globalNestedVPerVM == null) {
+            return false;
+        }
+        boolean globalNV = globalNestedV.booleanValue();
+        boolean globalNVPVM = globalNestedVPerVM.booleanValue();
+
+        if (globalNVPVM) {
+            return (localNestedV == null && globalNV) || BooleanUtils.toBoolean(localNestedV);
+        }
+        return globalNV;
+    }
+
+    private NicTO[] sortNicsByDeviceId(NicTO[] nics) {
+
+        List<NicTO> listForSort = new ArrayList<NicTO>();
+        for (NicTO nic : nics) {
+            listForSort.add(nic);
+        }
+        Collections.sort(listForSort, new Comparator<NicTO>() {
+
+            @Override public int compare(NicTO arg0, NicTO arg1) {
+                if (arg0.getDeviceId() < arg1.getDeviceId()) {
+                    return -1;
+                } else if (arg0.getDeviceId() == arg1.getDeviceId()) {
+                    return 0;
+                }
+
+                return 1;
+            }
+        });
+
+        return listForSort.toArray(new NicTO[0]);
+    }
+}
\ No newline at end of file
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java
index 5379253..431526a 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/VmwareDatacenterService.java
@@ -17,17 +17,21 @@
 
 package com.cloud.hypervisor.vmware;
 
-import java.util.List;
-
+import com.cloud.dc.VsphereStoragePolicy;
+import com.cloud.exception.DiscoveryException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.storage.StoragePool;
+import com.cloud.utils.component.PluggableService;
+import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd;
+import org.apache.cloudstack.api.command.admin.zone.ImportVsphereStoragePoliciesCmd;
 import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd;
+import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePoliciesCmd;
+import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePolicyCompatiblePoolsCmd;
 import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd;
 import org.apache.cloudstack.api.command.admin.zone.UpdateVmwareDcCmd;
 
-import com.cloud.exception.DiscoveryException;
-import com.cloud.exception.ResourceInUseException;
-import com.cloud.utils.component.PluggableService;
-import com.cloud.utils.exception.CloudRuntimeException;
+import java.util.List;
 
 public interface VmwareDatacenterService extends PluggableService {
 
@@ -38,4 +42,10 @@
     boolean removeVmwareDatacenter(RemoveVmwareDcCmd cmd) throws IllegalArgumentException, ResourceInUseException;
 
     List<? extends VmwareDatacenter> listVmwareDatacenters(ListVmwareDcsCmd cmd) throws IllegalArgumentException, CloudRuntimeException;
+
+    List<? extends VsphereStoragePolicy> importVsphereStoragePolicies(ImportVsphereStoragePoliciesCmd cmd);
+
+    List<? extends VsphereStoragePolicy> listVsphereStoragePolicies(ListVsphereStoragePoliciesCmd cmd);
+
+    List<StoragePool> listVsphereStoragePolicyCompatibleStoragePools(ListVsphereStoragePolicyCompatiblePoolsCmd cmd);
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareHostService.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareHostService.java
index 14630b3..ea97a6e 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareHostService.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareHostService.java
@@ -17,6 +17,7 @@
 package com.cloud.hypervisor.vmware.manager;
 
 import com.cloud.agent.api.Command;
+import com.cloud.hypervisor.vmware.mo.DatastoreMO;
 import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
 import com.cloud.hypervisor.vmware.util.VmwareContext;
 
@@ -27,5 +28,5 @@
 
     VmwareHypervisorHost getHyperHost(VmwareContext context, Command cmd);
 
-    String getWorkerName(VmwareContext context, Command cmd, int workerSequence);
+    String getWorkerName(VmwareContext context, Command cmd, int workerSequence, DatastoreMO dsMo) throws Exception;
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
index c4b939a..e1e0d6b 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java
@@ -16,43 +16,6 @@
 // under the License.
 package com.cloud.hypervisor.vmware.manager;
 
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.rmi.RemoteException;
-import java.time.Duration;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd;
-import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd;
-import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd;
-import org.apache.cloudstack.api.command.admin.zone.UpdateVmwareDcCmd;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.apache.cloudstack.framework.config.Configurable;
-import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl;
-import org.apache.cloudstack.management.ManagementServerHost;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.utils.identity.ManagementServerNode;
-import org.apache.log4j.Logger;
-
 import com.amazonaws.util.CollectionUtils;
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.Listener;
@@ -62,6 +25,7 @@
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.StartupCommand;
 import com.cloud.agent.api.StartupRoutingCommand;
+import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.api.query.dao.TemplateJoinDao;
 import com.cloud.cluster.ClusterManager;
 import com.cloud.cluster.dao.ManagementServerHostPeerDao;
@@ -70,14 +34,19 @@
 import com.cloud.dc.ClusterVO;
 import com.cloud.dc.ClusterVSMMapVO;
 import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.VsphereStoragePolicy;
+import com.cloud.dc.VsphereStoragePolicyVO;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.ClusterVSMMapDao;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
 import com.cloud.event.ActionEvent;
 import com.cloud.event.EventTypes;
+import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.DiscoveredWithErrorException;
 import com.cloud.exception.DiscoveryException;
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.OperationTimedoutException;
 import com.cloud.exception.ResourceInUseException;
 import com.cloud.host.Host;
 import com.cloud.host.Status;
@@ -85,6 +54,7 @@
 import com.cloud.host.dao.HostDetailsDao;
 import com.cloud.hypervisor.Hypervisor;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.HypervisorGuruManager;
 import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.hypervisor.vmware.LegacyZoneVO;
 import com.cloud.hypervisor.vmware.VmwareCleanupMaid;
@@ -102,6 +72,7 @@
 import com.cloud.hypervisor.vmware.mo.HostFirewallSystemMO;
 import com.cloud.hypervisor.vmware.mo.HostMO;
 import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
+import com.cloud.hypervisor.vmware.mo.PbmProfileManagerMO;
 import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
 import com.cloud.hypervisor.vmware.mo.VirtualSwitchType;
 import com.cloud.hypervisor.vmware.mo.VmwareHostType;
@@ -122,6 +93,8 @@
 import com.cloud.storage.JavaStorageLayer;
 import com.cloud.storage.StorageLayer;
 import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.template.TemplateManager;
 import com.cloud.utils.FileUtil;
@@ -142,8 +115,51 @@
 import com.cloud.vm.dao.UserVmCloneSettingDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.google.common.base.Strings;
+import com.vmware.pbm.PbmProfile;
 import com.vmware.vim25.AboutInfo;
 import com.vmware.vim25.ManagedObjectReference;
+import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd;
+import org.apache.cloudstack.api.command.admin.zone.ImportVsphereStoragePoliciesCmd;
+import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd;
+import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePoliciesCmd;
+import org.apache.cloudstack.api.command.admin.zone.ListVsphereStoragePolicyCompatiblePoolsCmd;
+import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd;
+import org.apache.cloudstack.api.command.admin.zone.UpdateVmwareDcCmd;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl;
+import org.apache.cloudstack.management.ManagementServerHost;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
+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.log4j.Logger;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.rmi.RemoteException;
+import java.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 public class VmwareManagerImpl extends ManagerBase implements VmwareManager, VmwareStorageMount, Listener, VmwareDatacenterService, Configurable {
     private static final Logger s_logger = Logger.getLogger(VmwareManagerImpl.class);
@@ -208,6 +224,12 @@
     private UserVmCloneSettingDao cloneSettingDao;
     @Inject
     private TemplateManager templateManager;
+    @Inject
+    private VsphereStoragePolicyDao vsphereStoragePolicyDao;
+    @Inject
+    private StorageManager storageManager;
+    @Inject
+    private HypervisorGuruManager hypervisorGuruManager;
 
     private String _mountParent;
     private StorageLayer _storage;
@@ -633,7 +655,7 @@
 
     @Override
     public void prepareSecondaryStorageStore(String storageUrl, Long storeId) {
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(storeId);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersion(storeId);
         String mountPoint = getMountPoint(storageUrl, nfsVersion);
 
         GlobalLock lock = GlobalLock.getInternLock("prepare.systemvm");
@@ -729,7 +751,7 @@
     }
 
     @Override
-    public String getMountPoint(String storageUrl, Integer nfsVersion) {
+    public String getMountPoint(String storageUrl, String nfsVersion) {
         String mountPoint = null;
         synchronized (_storageMounts) {
             mountPoint = _storageMounts.get(storageUrl);
@@ -820,7 +842,7 @@
         }
     }
 
-    protected String mount(String path, String parent, Integer nfsVersion) {
+    protected String mount(String path, String parent, String nfsVersion) {
         String mountPoint = setupMountPoint(parent);
         if (mountPoint == null) {
             s_logger.warn("Unable to create a mount point");
@@ -1046,6 +1068,9 @@
         cmdList.add(UpdateVmwareDcCmd.class);
         cmdList.add(RemoveVmwareDcCmd.class);
         cmdList.add(ListVmwareDcsCmd.class);
+        cmdList.add(ImportVsphereStoragePoliciesCmd.class);
+        cmdList.add(ListVsphereStoragePoliciesCmd.class);
+        cmdList.add(ListVsphereStoragePolicyCompatiblePoolsCmd.class);
         return cmdList;
     }
 
@@ -1173,6 +1198,7 @@
             }
             context = null;
         }
+        importVsphereStoragePoliciesInternal(zoneId, vmwareDc.getId());
         return vmwareDc;
     }
 
@@ -1233,6 +1259,7 @@
                             hostDetailsDao.persist(host.getId(), hostDetails);
                         }
                     }
+                    importVsphereStoragePoliciesInternal(zoneId, vmwareDc.getId());
                     return vmwareDc;
                 }
                 return null;
@@ -1384,6 +1411,112 @@
     }
 
     @Override
+    public List<? extends VsphereStoragePolicy> importVsphereStoragePolicies(ImportVsphereStoragePoliciesCmd cmd) {
+        Long zoneId = cmd.getZoneId();
+        // Validate Id of zone
+        doesZoneExist(zoneId);
+
+        final VmwareDatacenterZoneMapVO vmwareDcZoneMap = vmwareDatacenterZoneMapDao.findByZoneId(zoneId);
+        // Check if zone is associated with VMware DC
+        if (vmwareDcZoneMap == null) {
+            throw new CloudRuntimeException("Zone " + zoneId + " is not associated with any VMware datacenter.");
+        }
+
+        final long vmwareDcId = vmwareDcZoneMap.getVmwareDcId();
+        return importVsphereStoragePoliciesInternal(zoneId, vmwareDcId);
+    }
+
+    public List<? extends VsphereStoragePolicy> importVsphereStoragePoliciesInternal(Long zoneId, Long vmwareDcId) {
+
+        // Get DC associated with this zone
+        VmwareDatacenterVO vmwareDatacenter = vmwareDcDao.findById(vmwareDcId);
+        String vmwareDcName = vmwareDatacenter.getVmwareDatacenterName();
+        String vCenterHost = vmwareDatacenter.getVcenterHost();
+        String userName = vmwareDatacenter.getUser();
+        String password = vmwareDatacenter.getPassword();
+        List<PbmProfile> storageProfiles = null;
+        try {
+            s_logger.debug(String.format("Importing vSphere Storage Policies for the vmware DC %d in zone %d", vmwareDcId, zoneId));
+            VmwareContext context = VmwareContextFactory.getContext(vCenterHost, userName, password);
+            PbmProfileManagerMO profileManagerMO = new PbmProfileManagerMO(context);
+            storageProfiles = profileManagerMO.getStorageProfiles();
+            s_logger.debug(String.format("Import vSphere Storage Policies for the vmware DC %d in zone %d is successful", vmwareDcId, zoneId));
+        } catch (Exception e) {
+            String msg = String.format("Unable to list storage profiles from DC %s due to : %s", vmwareDcName, VmwareHelper.getExceptionMessage(e));
+            s_logger.error(msg);
+            throw new CloudRuntimeException(msg);
+        }
+
+        for (PbmProfile storageProfile : storageProfiles) {
+            VsphereStoragePolicyVO storagePolicyVO = vsphereStoragePolicyDao.findByPolicyId(zoneId, storageProfile.getProfileId().getUniqueId());
+            if (storagePolicyVO == null) {
+                storagePolicyVO = new VsphereStoragePolicyVO(zoneId, storageProfile.getProfileId().getUniqueId(), storageProfile.getName(), storageProfile.getDescription());
+                vsphereStoragePolicyDao.persist(storagePolicyVO);
+            } else {
+                storagePolicyVO.setDescription(storageProfile.getDescription());
+                storagePolicyVO.setName(storageProfile.getName());
+                vsphereStoragePolicyDao.update(storagePolicyVO.getId(), storagePolicyVO);
+            }
+        }
+
+        List<VsphereStoragePolicyVO> allStoragePolicies = vsphereStoragePolicyDao.listAll();
+        List<PbmProfile> finalStorageProfiles = storageProfiles;
+        List<VsphereStoragePolicyVO> needToMarkRemoved = allStoragePolicies.stream()
+                .filter(existingPolicy -> !finalStorageProfiles.stream()
+                    .anyMatch(storageProfile -> storageProfile.getProfileId().getUniqueId().equals(existingPolicy.getPolicyId())))
+                .collect(Collectors.toList());
+
+        for (VsphereStoragePolicyVO storagePolicy : needToMarkRemoved) {
+            vsphereStoragePolicyDao.remove(storagePolicy.getId());
+        }
+
+        List<VsphereStoragePolicyVO> storagePolicies = vsphereStoragePolicyDao.listAll();
+        return storagePolicies;
+    }
+
+    @Override
+    public List<? extends VsphereStoragePolicy> listVsphereStoragePolicies(ListVsphereStoragePoliciesCmd cmd) {
+        List<? extends VsphereStoragePolicy> storagePolicies = vsphereStoragePolicyDao.findByZoneId(cmd.getZoneId());
+        if (storagePolicies != null) {
+            return new ArrayList<>(storagePolicies);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<StoragePool> listVsphereStoragePolicyCompatibleStoragePools(ListVsphereStoragePolicyCompatiblePoolsCmd cmd) {
+        Long policyId = cmd.getPolicyId();
+        VsphereStoragePolicyVO storagePolicy = vsphereStoragePolicyDao.findById(policyId);
+        if (storagePolicy == null) {
+            throw new CloudRuntimeException("Storage policy with ID = " + policyId + " was not found");
+        }
+        long zoneId = storagePolicy.getZoneId();
+        List<StoragePoolVO> poolsInZone = primaryStorageDao.listByStatusInZone(zoneId, StoragePoolStatus.Up);
+        List<StoragePool> compatiblePools = new ArrayList<>();
+        for (StoragePoolVO pool : poolsInZone) {
+            StorageFilerTO storageFilerTO = new StorageFilerTO(pool);
+            List<Long> hostIds = storageManager.getUpHostsInPool(pool.getId());
+            if (CollectionUtils.isNullOrEmpty(hostIds)) {
+                s_logger.debug("Did not find a suitable host to verify compatibility of the pool " + pool.getName());
+                continue;
+            }
+            Collections.shuffle(hostIds);
+            CheckDataStoreStoragePolicyComplainceCommand command = new CheckDataStoreStoragePolicyComplainceCommand(storagePolicy.getPolicyId(), storageFilerTO);
+            long targetHostId = hypervisorGuruManager.getGuruProcessedCommandTargetHost(hostIds.get(0), command);
+            try {
+                Answer answer = _agentMgr.send(targetHostId, command);
+                boolean result = answer != null && answer.getResult();
+                if (result) {
+                    compatiblePools.add(pool);
+                }
+            } catch (AgentUnavailableException | OperationTimedoutException e) {
+                s_logger.error("Could not verify if storage policy " + storagePolicy.getName() + " is compatible with storage pool " + pool.getName());
+            }
+        }
+        return compatiblePools;
+    }
+
+    @Override
     public boolean hasNexusVSM(Long clusterId) {
         ClusterVSMMapVO vsmMapVo = null;
 
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
index f17d613..3e2b5a0 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
@@ -93,7 +93,7 @@
 
 public class VmwareStorageManagerImpl implements VmwareStorageManager {
 
-    private Integer _nfsVersion;
+    private String _nfsVersion;
 
     @Override
     public boolean execute(VmwareHostService hostService, CreateEntityDownloadURLCommand cmd) {
@@ -147,7 +147,7 @@
         _mountService = mountService;
     }
 
-    public VmwareStorageManagerImpl(VmwareStorageMount mountService, Integer nfsVersion) {
+    public VmwareStorageManagerImpl(VmwareStorageMount mountService, String nfsVersion) {
         assert (mountService != null);
         _mountService = mountService;
         _nfsVersion = nfsVersion;
@@ -343,8 +343,8 @@
                     if (vmMo == null) {
                         dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
 
-                        workerVMName = hostService.getWorkerName(context, cmd, 0);
-                        vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName);
+                        workerVMName = hostService.getWorkerName(context, cmd, 0, dsMo);
+                        vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
 
                         if (vmMo == null) {
                             throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName);
@@ -362,7 +362,7 @@
                 }
 
                 snapshotBackupUuid = backupSnapshotToSecondaryStorage(vmMo, accountId, volumeId, cmd.getVolumePath(), snapshotUuid, secondaryStorageUrl, prevSnapshotUuid,
-                        prevBackupUuid, hostService.getWorkerName(context, cmd, 1), cmd.getNfsVersion());
+                        prevBackupUuid, hostService.getWorkerName(context, cmd, 1, dsMo), cmd.getNfsVersion());
 
                 success = (snapshotBackupUuid != null);
                 if (success) {
@@ -428,7 +428,7 @@
             }
 
             Ternary<String, Long, Long> result = createTemplateFromVolume(vmMo, accountId, templateId, cmd.getUniqueName(), secondaryStoragePoolURL, volumePath,
-                    hostService.getWorkerName(context, cmd, 0), cmd.getNfsVersion());
+                    hostService.getWorkerName(context, cmd, 0, null), cmd.getNfsVersion());
 
             return new CreatePrivateTemplateAnswer(cmd, true, null, result.first(), result.third(), result.second(), cmd.getUniqueName(), ImageFormat.OVA);
 
@@ -486,13 +486,13 @@
             Pair<String, String> result;
             if (cmd.toSecondaryStorage()) {
                 result = copyVolumeToSecStorage(hostService, hyperHost, cmd, vmName, volumeId, cmd.getPool().getUuid(), volumePath, secondaryStorageURL,
-                        hostService.getWorkerName(context, cmd, 0), cmd.getNfsVersion());
+                        hostService.getWorkerName(context, cmd, 0, null), cmd.getNfsVersion());
             } else {
                 StorageFilerTO poolTO = cmd.getPool();
 
                 ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, poolTO.getUuid());
                 if (morDatastore == null) {
-                    morDatastore = hyperHost.mountDatastore(false, poolTO.getHost(), 0, poolTO.getPath(), poolTO.getUuid().replace("-", ""));
+                    morDatastore = hyperHost.mountDatastore(false, poolTO.getHost(), 0, poolTO.getPath(), poolTO.getUuid().replace("-", ""), true);
 
                     if (morDatastore == null) {
                         throw new Exception("Unable to mount storage pool on host. storeUrl: " + poolTO.getHost() + ":/" + poolTO.getPath());
@@ -558,7 +558,7 @@
     // templateName: name in secondary storage
     // templateUuid: will be used at hypervisor layer
     private void copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl, String templatePathAtSecondaryStorage,
-            String templateName, String templateUuid, Integer nfsVersion) throws Exception {
+                                                    String templateName, String templateUuid, String nfsVersion) throws Exception {
 
         s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: "
                 + templatePathAtSecondaryStorage + ", templateName: " + templateName);
@@ -591,7 +591,7 @@
         }
 
         String vmName = templateUuid;
-        hyperHost.importVmFromOVF(srcFileName, vmName, datastoreMo, "thin");
+        hyperHost.importVmFromOVF(srcFileName, vmName, datastoreMo, "thin", null);
 
         VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
         if (vmMo == null) {
@@ -613,7 +613,7 @@
     }
 
     private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, long accountId, long templateId, String templateUniqueName, String secStorageUrl,
-            String volumePath, String workerVmName, Integer nfsVersion) throws Exception {
+                                                                 String volumePath, String workerVmName, String nfsVersion) throws Exception {
 
         String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
         String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId);
@@ -647,7 +647,7 @@
             }
 
             // 4 MB is the minimum requirement for VM memory in VMware
-            vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+            vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), null);
             clonedVm = vmMo.getRunningHost().findVmOnHyperHost(workerVmName);
             if (clonedVm == null) {
                 String msg = "Unable to create dummy VM to export volume. volume path: " + volumePath;
@@ -678,7 +678,7 @@
     }
 
     private Ternary<String, Long, Long> createTemplateFromSnapshot(long accountId, long templateId, String templateUniqueName, String secStorageUrl, long volumeId,
-            String backedUpSnapshotUuid, Integer nfsVersion) throws Exception {
+                                                                   String backedUpSnapshotUuid, String nfsVersion) throws Exception {
 
         String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
         String installPath = getTemplateRelativeDirInSecStorage(accountId, templateId);
@@ -862,14 +862,14 @@
     }
 
     private String createVolumeFromSnapshot(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, long accountId, long volumeId, String secStorageUrl,
-            String snapshotBackupUuid, Integer nfsVersion) throws Exception {
+                                            String snapshotBackupUuid, String nfsVersion) throws Exception {
 
         restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), snapshotBackupUuid, nfsVersion);
         return null;
     }
 
     private void restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir,
-            String backupName, Integer nfsVersion) throws Exception {
+                                             String backupName, String nfsVersion) throws Exception {
 
         String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
         String srcOVAFileName = secondaryMountPoint + "/" + secStorageDir + "/" + backupName + "." + ImageFormat.OVA.getFileExtension();
@@ -912,7 +912,7 @@
 
         VirtualMachineMO clonedVm = null;
         try {
-            hyperHost.importVmFromOVF(srcOVFFileName, newVolumeName, primaryDsMo, "thin");
+            hyperHost.importVmFromOVF(srcOVFFileName, newVolumeName, primaryDsMo, "thin", null);
             clonedVm = hyperHost.findVmOnHyperHost(newVolumeName);
             if (clonedVm == null) {
                 throw new Exception("Unable to create container VM for volume creation");
@@ -929,7 +929,7 @@
     }
 
     private String backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, long accountId, long volumeId, String volumePath, String snapshotUuid, String secStorageUrl,
-            String prevSnapshotUuid, String prevBackupUuid, String workerVmName, Integer nfsVersion) throws Exception {
+                                                    String prevSnapshotUuid, String prevBackupUuid, String workerVmName, String nfsVersion) throws Exception {
 
         String backupUuid = UUID.randomUUID().toString();
         exportVolumeToSecondaryStorage(vmMo, volumePath, secStorageUrl, getSnapshotRelativeDirInSecStorage(accountId, volumeId), backupUuid, workerVmName, nfsVersion, true);
@@ -937,7 +937,7 @@
     }
 
     private void exportVolumeToSecondaryStorage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir, String exportName, String workerVmName,
-                                                Integer nfsVersion, boolean clonedWorkerVMNeeded) throws Exception {
+                                                String nfsVersion, boolean clonedWorkerVMNeeded) throws Exception {
 
         String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
         String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName;
@@ -965,7 +965,7 @@
 
             if (clonedWorkerVMNeeded) {
                 // 4 MB is the minimum requirement for VM memory in VMware
-                vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+                vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), null);
                 clonedVm = vmMo.getRunningHost().findVmOnHyperHost(workerVmName);
                 if (clonedVm == null) {
                     String msg = "Unable to create dummy VM to export volume. volume path: " + volumePath;
@@ -985,7 +985,7 @@
     }
 
     private Pair<String, String> copyVolumeToSecStorage(VmwareHostService hostService, VmwareHypervisorHost hyperHost, CopyVolumeCommand cmd, String vmName, long volumeId,
-            String poolId, String volumePath, String secStorageUrl, String workerVmName, Integer nfsVersion) throws Exception {
+                                                        String poolId, String volumePath, String secStorageUrl, String workerVmName, String nfsVersion) throws Exception {
 
         String volumeFolder = String.valueOf(volumeId) + "/";
         VirtualMachineMO workerVm = null;
@@ -1008,7 +1008,7 @@
             if (vmMo == null) {
                 // create a dummy worker vm for attaching the volume
                 DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
-                workerVm = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName);
+                workerVm = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName, null);
 
                 if (workerVm == null) {
                     String msg = "Unable to create worker VM to execute CopyVolumeCommand";
@@ -1025,7 +1025,7 @@
                 vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false);
             }
 
-            exportVolumeToSecondaryStorage(vmMo, volumePath, secStorageUrl, "volumes/" + volumeFolder, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1),
+            exportVolumeToSecondaryStorage(vmMo, volumePath, secStorageUrl, "volumes/" + volumeFolder, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1, null),
                     nfsVersion, clonedWorkerVMNeeded);
             return new Pair<String, String>(volumeFolder, exportName);
 
@@ -1050,7 +1050,7 @@
     }
 
     private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, long volumeId, DatastoreMO dsMo, String secStorageUrl, String exportName,
-            Integer nfsVersion) throws Exception {
+                                                          String nfsVersion) throws Exception {
 
         String volumeFolder = String.valueOf(volumeId) + "/";
         String newVolume = UUID.randomUUID().toString().replace("-", "");
@@ -1464,7 +1464,7 @@
         }
     }
 
-    private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl, Integer nfsVersion) throws Exception {
+    private String deleteVolumeDirOnSecondaryStorage(long volumeId, String secStorageUrl, String nfsVersion) throws Exception {
         String secondaryMountPoint = _mountService.getMountPoint(secStorageUrl, nfsVersion);
         String volumeMountRoot = secondaryMountPoint + "/" + getVolumeRelativeDirInSecStroage(volumeId);
 
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java
index fd139e4..54b52f6 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareStorageMount.java
@@ -17,5 +17,5 @@
 package com.cloud.hypervisor.vmware.manager;
 
 public interface VmwareStorageMount {
-    String getMountPoint(String storageUrl, Integer nfsVersion);
+    String getMountPoint(String storageUrl, String nfsVersion);
 }
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 4fc48c0..56d08a4 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
@@ -40,21 +40,22 @@
 import java.util.Set;
 import java.util.TimeZone;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 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.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 import org.apache.log4j.Logger;
@@ -129,6 +130,8 @@
 import com.cloud.agent.api.PlugNicCommand;
 import com.cloud.agent.api.PrepareForMigrationAnswer;
 import com.cloud.agent.api.PrepareForMigrationCommand;
+import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer;
+import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand;
 import com.cloud.agent.api.PvlanSetupCommand;
 import com.cloud.agent.api.ReadyAnswer;
 import com.cloud.agent.api.ReadyCommand;
@@ -175,7 +178,7 @@
 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.storage.OVFPropertyTO;
+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;
@@ -215,7 +218,9 @@
 import com.cloud.hypervisor.vmware.mo.HostStorageSystemMO;
 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.VirtualEthernetCardType;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
@@ -247,7 +252,6 @@
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.Ternary;
-import com.cloud.utils.crypt.DBEncryptionUtil;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExceptionUtil;
@@ -285,6 +289,7 @@
 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;
@@ -295,6 +300,7 @@
 import com.vmware.vim25.PerfMetricSeries;
 import com.vmware.vim25.PerfQuerySpec;
 import com.vmware.vim25.RuntimeFaultFaultMsg;
+import com.vmware.vim25.StoragePodSummary;
 import com.vmware.vim25.ToolsUnavailableFaultMsg;
 import com.vmware.vim25.VAppOvfSectionInfo;
 import com.vmware.vim25.VAppOvfSectionSpec;
@@ -335,9 +341,15 @@
 import com.vmware.vim25.VirtualVmxnet3;
 import com.vmware.vim25.VmConfigInfo;
 import com.vmware.vim25.VmConfigSpec;
-import com.vmware.vim25.VmfsDatastoreInfo;
 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);
@@ -365,7 +377,7 @@
     protected String _password;
     protected String _guid;
     protected String _vCenterAddress;
-    protected Integer storageNfsVersion;
+    protected String storageNfsVersion;
 
     protected String _privateNetworkVSwitchName;
     protected VmwareTrafficLabel _guestTrafficInfo = new VmwareTrafficLabel(TrafficType.Guest);
@@ -561,6 +573,10 @@
                 answer = execute((UnregisterNicCommand) cmd);
             } else if (clz == GetUnmanagedInstancesCommand.class) {
                 answer = execute((GetUnmanagedInstancesCommand) cmd);
+            } else if (clz == PrepareUnmanageVMInstanceCommand.class) {
+                answer = execute((PrepareUnmanageVMInstanceCommand) cmd);
+            } else if (clz == ValidateVcenterDetailsCommand.class) {
+                answer = execute((ValidateVcenterDetailsCommand) cmd);
             } else {
                 answer = Answer.createUnsupportedCommandAnswer(cmd);
             }
@@ -738,13 +754,30 @@
             } else if (newSize == oldSize) {
                 return new ResizeVolumeAnswer(cmd, true, "success", newSize * ResourceType.bytesToKiB);
             }
+            /*
+            // FR41 this is yet to fix
+            ManagedObjectReference morDS1 = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getPoolUuid());
+            DatastoreMO dsMo1 = new DatastoreMO(hyperHost.getContext(), morDS1);
+            vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo1, path + VMDK_EXTENSION);
+            DatastoreFile dsFile1 = new DatastoreFile(vmdkDataStorePath);
+
+            s_logger.debug("vDiskid does not exist for volume " + vmdkDataStorePath + " registering the disk now");
+            VirtualStorageObjectManagerMO vStorageObjectManagerMO = new VirtualStorageObjectManagerMO(getServiceContext());
+            try {
+                VStorageObject vStorageObject = vStorageObjectManagerMO.registerVirtualDisk(dsFile1, null, dsMo1.getOwnerDatacenter().second());
+                VStorageObjectConfigInfo diskConfigInfo = vStorageObject.getConfig();
+                ID vdiskId = diskConfigInfo.getId();
+            } catch (Throwable e) {
+                if (e instanceof AlreadyExistsFaultMsg) {
+
+                }
+            }*/
 
             if (vmName.equalsIgnoreCase("none")) {
                 // OfflineVmwareMigration: we need to refactor the worker vm creation out for use in migration methods as well as here
                 // OfflineVmwareMigration: this method is 100 lines and needs refactorring anyway
                 // we need to spawn a worker VM to attach the volume to and resize the volume.
                 useWorkerVm = true;
-                vmName = getWorkerName(getServiceContext(), cmd, 0);
 
                 String poolId = cmd.getPoolUuid();
 
@@ -752,11 +785,12 @@
                 // OfflineVmwareMigration: 1. find data(store)
                 ManagedObjectReference morDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, poolId);
                 DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), morDS);
+                vmName = getWorkerName(getServiceContext(), cmd, 0, dsMo);
 
                 s_logger.info("Create worker VM " + vmName);
 
                 // OfflineVmwareMigration: 2. create the worker with access to the data(store)
-                vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, vmName);
+                vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, vmName, null);
 
                 if (vmMo == null) {
                     // OfflineVmwareMigration: don't throw a general Exception but think of a specific one
@@ -1173,7 +1207,7 @@
             }
 
             // find a usable device number in VMware environment
-            VirtualDevice[] nicDevices = vmMo.getNicDevices();
+            VirtualDevice[] nicDevices = vmMo.getSortedNicDevices();
             int deviceNumber = -1;
             for (VirtualDevice device : nicDevices) {
                 if (device.getUnitNumber() > deviceNumber)
@@ -1373,7 +1407,7 @@
         int nicIndex = allocPublicNicIndex(vmMo);
 
         try {
-            VirtualDevice[] nicDevices = vmMo.getNicDevices();
+            VirtualDevice[] nicDevices = vmMo.getSortedNicDevices();
 
             VirtualEthernetCard device = (VirtualEthernetCard) nicDevices[nicIndex];
 
@@ -1627,7 +1661,7 @@
             }
 
             // Check increment is multiple of increment size
-            long reminder = requestedMaxMemoryInMb % hotaddIncrementSizeInMb;
+            long reminder = hotaddIncrementSizeInMb > 0 ? requestedMaxMemoryInMb % hotaddIncrementSizeInMb : 0;
             if (reminder != 0) {
                 requestedMaxMemoryInMb = requestedMaxMemoryInMb + hotaddIncrementSizeInMb - reminder;
             }
@@ -1706,7 +1740,7 @@
 
     protected StartAnswer execute(StartCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource StartCommand: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource StartCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         VirtualMachineTO vmSpec = cmd.getVirtualMachine();
@@ -1716,36 +1750,21 @@
         VirtualMachineFileInfo existingVmFileInfo = null;
         VirtualMachineFileLayoutEx existingVmFileLayout = null;
         List<DatastoreMO> existingDatastores = new ArrayList<DatastoreMO>();
+        String diskStoragePolicyId = null;
+        String vmStoragePolicyId = null;
+        VirtualMachineDefinedProfileSpec diskProfileSpec = null;
+        VirtualMachineDefinedProfileSpec vmProfileSpec = null;
+
+
+        DeployAsIsInfoTO deployAsIsInfo = vmSpec.getDeployAsIsInfo();
+        boolean deployAsIs = deployAsIsInfo != null;
 
         Pair<String, String> names = composeVmNames(vmSpec);
         String vmInternalCSName = names.first();
         String vmNameOnVcenter = names.second();
-        String dataDiskController = vmSpec.getDetails().get(VmDetailConstants.DATA_DISK_CONTROLLER);
-        String rootDiskController = vmSpec.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER);
         DiskTO rootDiskTO = null;
-        String bootMode = "bios";
-        if (vmSpec.getDetails().containsKey(VmDetailConstants.BOOT_MODE)) {
-            bootMode = vmSpec.getDetails().get(VmDetailConstants.BOOT_MODE);
-        }
-
-        // If root disk controller is scsi, then data disk controller would also be scsi instead of using 'osdefault'
-        // This helps avoid mix of different scsi subtype controllers in instance.
-        if (DiskControllerType.osdefault == DiskControllerType.getType(dataDiskController) && DiskControllerType.lsilogic == DiskControllerType.getType(rootDiskController)) {
-            dataDiskController = DiskControllerType.scsi.toString();
-        }
-
-        // Validate the controller types
-        dataDiskController = DiskControllerType.getType(dataDiskController).toString();
-        rootDiskController = DiskControllerType.getType(rootDiskController).toString();
-
-        if (DiskControllerType.getType(rootDiskController) == DiskControllerType.none) {
-            throw new CloudRuntimeException("Invalid root disk controller detected : " + rootDiskController);
-        }
-        if (DiskControllerType.getType(dataDiskController) == DiskControllerType.none) {
-            throw new CloudRuntimeException("Invalid data disk controller detected : " + dataDiskController);
-        }
-
-        Pair<String, String> controllerInfo = new Pair<String, String>(rootDiskController, dataDiskController);
+        String bootMode = getBootModeFromVmSpec(vmSpec, deployAsIs);
+        Pair<String, String> controllerInfo = getControllerInfoFromVmSpec(vmSpec);
 
         Boolean systemVm = vmSpec.getType().isUsedBySystem();
         // Thus, vmInternalCSName always holds i-x-y, the cloudstack generated internal VM name.
@@ -1765,7 +1784,9 @@
                 s_logger.error(msg);
                 throw new Exception(msg);
             }
-            String guestOsId = translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs(), vmSpec.getPlatformEmulator()).value();
+
+            DiskTO[] specDisks = vmSpec.getDisks();
+            String guestOsId = getGuestOsIdFromVmSpec(vmSpec, deployAsIs);
             DiskTO[] disks = validateDisks(vmSpec.getDisks());
             assert (disks.length > 0);
             NicTO[] nics = vmSpec.getNics();
@@ -1777,36 +1798,29 @@
                 throw new Exception(msg);
             }
 
-            DatastoreMO dsRootVolumeIsOn = getDatastoreThatRootDiskIsOn(dataStoresDetails, disks);
-            if (dsRootVolumeIsOn == null) {
-                String msg = "Unable to locate datastore details of root volume";
-                s_logger.error(msg);
-                throw new Exception(msg);
-            }
-
             VirtualMachineDiskInfoBuilder diskInfoBuilder = null;
+            VirtualDevice[] nicDevices = null;
             VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
             DiskControllerType systemVmScsiControllerType = DiskControllerType.lsilogic;
             int firstScsiControllerBusNum = 0;
             int numScsiControllerForSystemVm = 1;
             boolean hasSnapshot = false;
+
+            List<Pair<Integer, ManagedObjectReference>> diskDatastores = null;
             if (vmMo != null) {
                 s_logger.info("VM " + vmInternalCSName + " already exists, tear down devices for reconfiguration");
                 if (getVmPowerState(vmMo) != PowerState.PowerOff)
                     vmMo.safePowerOff(_shutdownWaitMs);
 
                 // retrieve disk information before we tear down
+                diskDatastores = vmMo.getAllDiskDatastores();
                 diskInfoBuilder = vmMo.getDiskInfoBuilder();
                 hasSnapshot = vmMo.hasSnapshot();
-                if (!hasSnapshot)
-                    vmMo.tearDownDevices(new Class<?>[]{VirtualDisk.class, VirtualEthernetCard.class});
-                else
-                    vmMo.tearDownDevices(new Class<?>[]{VirtualEthernetCard.class});
-                if (systemVm) {
-                    ensureScsiDiskControllers(vmMo, systemVmScsiControllerType.toString(), numScsiControllerForSystemVm, firstScsiControllerBusNum);
-                } else {
-                    ensureDiskControllers(vmMo, controllerInfo);
-                }
+                nicDevices = vmMo.getNicDevices();
+
+                tearDownVmDevices(vmMo, hasSnapshot, deployAsIs);
+                ensureDiskControllersInternal(vmMo, systemVm, controllerInfo, systemVmScsiControllerType,
+                        numScsiControllerForSystemVm, firstScsiControllerBusNum, deployAsIs);
             } else {
                 ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter();
                 assert (morDc != null);
@@ -1824,17 +1838,11 @@
 
                     diskInfoBuilder = vmMo.getDiskInfoBuilder();
                     hasSnapshot = vmMo.hasSnapshot();
-                    if (!hasSnapshot)
-                        vmMo.tearDownDevices(new Class<?>[]{VirtualDisk.class, VirtualEthernetCard.class});
-                    else
-                        vmMo.tearDownDevices(new Class<?>[]{VirtualEthernetCard.class});
+                    diskDatastores = vmMo.getAllDiskDatastores();
 
-                    if (systemVm) {
-                        // System volumes doesn't require more than 1 SCSI controller as there is no requirement for data volumes.
-                        ensureScsiDiskControllers(vmMo, systemVmScsiControllerType.toString(), numScsiControllerForSystemVm, firstScsiControllerBusNum);
-                    } else {
-                        ensureDiskControllers(vmMo, controllerInfo);
-                    }
+                    tearDownVmDevices(vmMo, hasSnapshot, deployAsIs);
+                    ensureDiskControllersInternal(vmMo, systemVm, controllerInfo, systemVmScsiControllerType,
+                            numScsiControllerForSystemVm, firstScsiControllerBusNum, deployAsIs);
                 } else {
                     // If a VM with the same name is found in a different cluster in the DC, unregister the old VM and configure a new VM (cold-migration).
                     VirtualMachineMO existingVmInDc = dcMo.findVm(vmInternalCSName);
@@ -1846,45 +1854,55 @@
                         existingDatastores = existingVmInDc.getAllDatastores();
                         existingVmInDc.unregisterVm();
                     }
-                    Pair<ManagedObjectReference, DatastoreMO> rootDiskDataStoreDetails = null;
-                    for (DiskTO vol : disks) {
-                        if (vol.getType() == Volume.Type.ROOT) {
-                            Map<String, String> details = vol.getDetails();
-                            boolean managed = false;
 
-                            if (details != null) {
-                                managed = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
-                            }
-
-                            if (managed) {
-                                String datastoreName = VmwareResource.getDatastoreName(details.get(DiskTO.IQN));
-
-                                rootDiskDataStoreDetails = dataStoresDetails.get(datastoreName);
-                            } else {
-                                DataStoreTO primaryStore = vol.getData().getDataStore();
-
-                                rootDiskDataStoreDetails = dataStoresDetails.get(primaryStore.getUuid());
-                            }
-                        }
-                    }
-
-                    assert (vmSpec.getMinSpeed() != null) && (rootDiskDataStoreDetails != null);
-
-                    boolean vmFolderExists = rootDiskDataStoreDetails.second().folderExists(String.format("[%s]", rootDiskDataStoreDetails.second().getName()), vmNameOnVcenter);
-                    String vmxFileFullPath = dsRootVolumeIsOn.searchFileInSubFolders(vmNameOnVcenter + ".vmx", false, VmwareManager.s_vmwareSearchExcludeFolder.value());
-                    if (vmFolderExists && vmxFileFullPath != null) { // VM can be registered only if .vmx is present.
-                        registerVm(vmNameOnVcenter, dsRootVolumeIsOn);
+                    if (deployAsIs) {
                         vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
-                        if (vmMo != null) {
-                            if (s_logger.isDebugEnabled()) {
-                                s_logger.debug("Found registered vm " + vmInternalCSName + " at host " + hyperHost.getHyperHostName());
+                        if (vmMo == null) {
+                            s_logger.info("Cloned deploy-as-is VM " + vmInternalCSName + " is not in this host, relocating it");
+                            vmMo = takeVmFromOtherHyperHost(hyperHost, vmInternalCSName);
+                        }
+                    } else {
+                        DiskTO rootDisk = null;
+                        for (DiskTO vol : disks) {
+                            if (vol.getType() == Volume.Type.ROOT) {
+                                rootDisk = vol;
                             }
                         }
-                        tearDownVm(vmMo);
-                    } else if (!hyperHost.createBlankVm(vmNameOnVcenter, vmInternalCSName, vmSpec.getCpus(), vmSpec.getMaxSpeed().intValue(), getReservedCpuMHZ(vmSpec),
-                            vmSpec.getLimitCpuUse(), (int) (vmSpec.getMaxRam() / ResourceType.bytesToMiB), getReservedMemoryMb(vmSpec), guestOsId, rootDiskDataStoreDetails.first(), false,
-                            controllerInfo, systemVm)) {
-                        throw new Exception("Failed to create VM. vmName: " + vmInternalCSName);
+                        Pair<ManagedObjectReference, DatastoreMO> rootDiskDataStoreDetails = getDatastoreThatDiskIsOn(dataStoresDetails, rootDisk);
+                        assert (vmSpec.getMinSpeed() != null) && (rootDiskDataStoreDetails != null);
+                        DatastoreMO dsRootVolumeIsOn = rootDiskDataStoreDetails.second();
+                        if (dsRootVolumeIsOn == null) {
+                                String msg = "Unable to locate datastore details of root volume";
+                                s_logger.error(msg);
+                                throw new Exception(msg);
+                            }
+                        if (rootDisk.getDetails().get(DiskTO.PROTOCOL_TYPE) != null && rootDisk.getDetails().get(DiskTO.PROTOCOL_TYPE).equalsIgnoreCase("DatastoreCluster")) {
+                            if (diskInfoBuilder != null) {
+                                DatastoreMO diskDatastoreMofromVM = getDataStoreWhereDiskExists(hyperHost, context, diskInfoBuilder, rootDisk, diskDatastores);
+                                if (diskDatastoreMofromVM != null) {
+                                    String actualPoolUuid = diskDatastoreMofromVM.getCustomFieldValue(CustomFieldConstants.CLOUD_UUID);
+                                    if (!actualPoolUuid.equalsIgnoreCase(rootDisk.getData().getDataStore().getUuid())) {
+                                        dsRootVolumeIsOn = diskDatastoreMofromVM;
+                                    }
+                                }
+                            }
+                        }
+
+                        boolean vmFolderExists = dsRootVolumeIsOn.folderExists(String.format("[%s]", dsRootVolumeIsOn.getName()), vmNameOnVcenter);                        String vmxFileFullPath = dsRootVolumeIsOn.searchFileInSubFolders(vmNameOnVcenter + ".vmx", false, VmwareManager.s_vmwareSearchExcludeFolder.value());
+                        if (vmFolderExists && vmxFileFullPath != null) { // VM can be registered only if .vmx is present.
+                            registerVm(vmNameOnVcenter, dsRootVolumeIsOn);
+                            vmMo = hyperHost.findVmOnHyperHost(vmInternalCSName);
+                            if (vmMo != null) {
+                                if (s_logger.isDebugEnabled()) {
+                                    s_logger.debug("Found registered vm " + vmInternalCSName + " at host " + hyperHost.getHyperHostName());
+                                }
+                            }
+                            tearDownVm(vmMo);
+                        } else if (!hyperHost.createBlankVm(vmNameOnVcenter, vmInternalCSName, vmSpec.getCpus(), vmSpec.getMaxSpeed().intValue(), getReservedCpuMHZ(vmSpec),
+                                vmSpec.getLimitCpuUse(), (int) (vmSpec.getMaxRam() / ResourceType.bytesToMiB), getReservedMemoryMb(vmSpec), guestOsId, rootDiskDataStoreDetails.first(), false,
+                                controllerInfo, systemVm)) {
+                            throw new Exception("Failed to create VM. vmName: " + vmInternalCSName);
+                        }
                     }
                 }
 
@@ -1893,8 +1911,16 @@
                     throw new Exception("Failed to find the newly create or relocated VM. vmName: " + vmInternalCSName);
                 }
             }
+            if (deployAsIs) {
+                s_logger.info("Mapping VM disks to spec disks and tearing down datadisks (if any)");
+                mapSpecDisksToClonedDisksAndTearDownDatadisks(vmMo, vmInternalCSName, specDisks);
+            }
 
-            int totalChangeDevices = disks.length + nics.length;
+            int disksChanges = getDisksChangesNumberFromDisksSpec(disks, deployAsIs);
+            int totalChangeDevices = disksChanges + nics.length;
+            if (deployAsIsInfo != null && deployAsIsInfo.getProperties() != null) {
+                totalChangeDevices++;
+            }
 
             DiskTO volIso = null;
             if (vmSpec.getType() != VirtualMachine.Type.User) {
@@ -1902,14 +1928,23 @@
                 totalChangeDevices++;
             } else {
                 volIso = getIsoDiskTO(disks);
-                if (volIso == null)
+                if (volIso == null && !deployAsIs) {
                     totalChangeDevices++;
+                }
             }
 
             VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
 
+            int i = 0;
+            int ideUnitNumber = !deployAsIs ? 0 : vmMo.getNextIDEDeviceNumber();
+            int scsiUnitNumber = !deployAsIs ? 0 : vmMo.getNextScsiDiskDeviceNumber();
+            int ideControllerKey = vmMo.getIDEDeviceControllerKey();
+            int scsiControllerKey = vmMo.getScsiDeviceControllerKeyNoException();
+            VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[totalChangeDevices];
+            DiskTO[] sortedDisks = sortVolumesByDeviceId(disks);
+
             VmwareHelper.setBasicVmConfig(vmConfigSpec, vmSpec.getCpus(), vmSpec.getMaxSpeed(), getReservedCpuMHZ(vmSpec), (int) (vmSpec.getMaxRam() / (1024 * 1024)),
-                    getReservedMemoryMb(vmSpec), guestOsId, vmSpec.getLimitCpuUse());
+                    getReservedMemoryMb(vmSpec), guestOsId, vmSpec.getLimitCpuUse(), deployAsIs);
 
             // Check for multi-cores per socket settings
             int numCoresPerSocket = 1;
@@ -1937,14 +1972,6 @@
 
             configNestedHVSupport(vmMo, vmSpec, vmConfigSpec);
 
-            VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[totalChangeDevices];
-            int i = 0;
-            int ideUnitNumber = 0;
-            int scsiUnitNumber = 0;
-            int ideControllerKey = vmMo.getIDEDeviceControllerKey();
-            int scsiControllerKey = vmMo.getGenericScsiDeviceControllerKeyNoException();
-            int controllerKey;
-
             //
             // Setup ISO device
             //
@@ -1982,7 +2009,7 @@
                     deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.EDIT);
                 }
                 i++;
-            } else {
+            } else if (!deployAsIs) {
                 // Note: we will always plug a CDROM device
                 if (volIso != null) {
                     for (DiskTO vol : disks) {
@@ -2038,18 +2065,19 @@
                 }
             }
 
+            int controllerKey;
 
             //
             // Setup ROOT/DATA disk devices
             //
-            DiskTO[] sortedDisks = sortVolumesByDeviceId(disks);
             for (DiskTO vol : sortedDisks) {
-                if (vol.getType() == Volume.Type.ISO)
+                if (vol.getType() == Volume.Type.ISO || deployAsIs && vol.getType() == Volume.Type.ROOT) {
                     continue;
+                }
 
                 VirtualMachineDiskInfo matchingExistingDisk = getMatchingExistingDisk(diskInfoBuilder, vol, hyperHost, context);
                 controllerKey = getDiskController(matchingExistingDisk, vol, vmSpec, ideControllerKey, scsiControllerKey);
-                String diskController = getDiskController(vmMo, matchingExistingDisk, vol, new Pair<String, String>(rootDiskController, dataDiskController));
+                String diskController = getDiskController(vmMo, matchingExistingDisk, vol, controllerInfo);
 
                 if (DiskControllerType.getType(diskController) == DiskControllerType.osdefault) {
                     diskController = vmMo.getRecommendedDiskController(null);
@@ -2065,13 +2093,17 @@
                         }
                     }
                 } else {
-                    controllerKey = vmMo.getScsiDiskControllerKeyNoException(diskController);
+                    if (VmwareHelper.isReservedScsiDeviceNumber(scsiUnitNumber)) {
+                        scsiUnitNumber++;
+                    }
+
+                    controllerKey = vmMo.getScsiDiskControllerKeyNoException(diskController, scsiUnitNumber);
                     if (controllerKey == -1) {
                         // This may happen for ROOT legacy VMs which doesn't have recommended disk controller when global configuration parameter 'vmware.root.disk.controller' is set to "osdefault"
                         // Retrieve existing controller and use.
                         Ternary<Integer, Integer, DiskControllerType> vmScsiControllerInfo = vmMo.getScsiControllerInfo();
                         DiskControllerType existingControllerType = vmScsiControllerInfo.third();
-                        controllerKey = vmMo.getScsiDiskControllerKeyNoException(existingControllerType.toString());
+                        controllerKey = vmMo.getScsiDiskControllerKeyNoException(existingControllerType.toString(), scsiUnitNumber);
                     }
                 }
                 if (!hasSnapshot) {
@@ -2088,20 +2120,67 @@
                         iScsiName = details.get(DiskTO.IQN);
                     }
 
+                    String primaryStoreUuid = primaryStore.getUuid();
                     // if the storage is managed, iScsiName should not be null
-                    String datastoreName = managed ? VmwareResource.getDatastoreName(iScsiName) : primaryStore.getUuid();
+                    String datastoreName = managed ? VmwareResource.getDatastoreName(iScsiName) : primaryStoreUuid;
                     Pair<ManagedObjectReference, DatastoreMO> volumeDsDetails = dataStoresDetails.get(datastoreName);
 
                     assert (volumeDsDetails != null);
+                    if (volumeDsDetails == null) {
+                        throw new Exception("Primary datastore " + primaryStore.getUuid() + " is not mounted on host.");
+                    }
 
-                    String[] diskChain = syncDiskChain(dcMo, vmMo, vmSpec, vol, matchingExistingDisk, dataStoresDetails);
-                    if (controllerKey == scsiControllerKey && VmwareHelper.isReservedScsiDeviceNumber(scsiUnitNumber))
+                    if (vol.getDetails().get(DiskTO.PROTOCOL_TYPE) != null && vol.getDetails().get(DiskTO.PROTOCOL_TYPE).equalsIgnoreCase("DatastoreCluster")) {
+                        if (diskInfoBuilder != null && matchingExistingDisk != null) {
+                            String[] diskChain = matchingExistingDisk.getDiskChain();
+                            if (diskChain != null && diskChain.length > 0) {
+                                DatastoreFile file = new DatastoreFile(diskChain[0]);
+                                if (!file.getFileBaseName().equalsIgnoreCase(volumeTO.getPath())) {
+                                    if (s_logger.isInfoEnabled())
+                                        s_logger.info("Detected disk-chain top file change on volume: " + volumeTO.getId() + " " + volumeTO.getPath() + " -> " + file.getFileBaseName());
+                                    volumeTO.setPath(file.getFileBaseName());
+                                }
+                            }
+                            DatastoreMO diskDatastoreMofromVM = getDataStoreWhereDiskExists(hyperHost, context, diskInfoBuilder, vol, diskDatastores);
+                            if (diskDatastoreMofromVM != null) {
+                                String actualPoolUuid = diskDatastoreMofromVM.getCustomFieldValue(CustomFieldConstants.CLOUD_UUID);
+                                if (actualPoolUuid != null && !actualPoolUuid.equalsIgnoreCase(primaryStore.getUuid())) {
+                                    volumeDsDetails = new Pair<>(diskDatastoreMofromVM.getMor(), diskDatastoreMofromVM);
+                                    if (s_logger.isInfoEnabled())
+                                        s_logger.info("Detected datastore uuid change on volume: " + volumeTO.getId() + " " + primaryStore.getUuid() + " -> " + actualPoolUuid);
+                                    ((PrimaryDataStoreTO)primaryStore).setUuid(actualPoolUuid);
+                                }
+                            }
+                        }
+                    }
+
+                    String[] diskChain = syncDiskChain(dcMo, vmMo, vol, matchingExistingDisk, volumeDsDetails.second());
+
+                    int deviceNumber = -1;
+                    if (controllerKey == vmMo.getIDEControllerKey(ideUnitNumber)) {
+                        deviceNumber = ideUnitNumber % VmwareHelper.MAX_ALLOWED_DEVICES_IDE_CONTROLLER;
+                        ideUnitNumber++;
+                    } else {
+                        deviceNumber = scsiUnitNumber % VmwareHelper.MAX_ALLOWED_DEVICES_SCSI_CONTROLLER;
                         scsiUnitNumber++;
-                    VirtualDevice device = VmwareHelper.prepareDiskDevice(vmMo, null, controllerKey, diskChain, volumeDsDetails.first(),
-                            (controllerKey == vmMo.getIDEControllerKey(ideUnitNumber)) ? ((ideUnitNumber++) % VmwareHelper.MAX_IDE_CONTROLLER_COUNT) : scsiUnitNumber++, i + 1);
+                    }
 
-                    if (vol.getType() == Volume.Type.ROOT)
+                    VirtualDevice device = VmwareHelper.prepareDiskDevice(vmMo, null, controllerKey, diskChain, volumeDsDetails.first(), deviceNumber, i + 1);
+
+                    diskStoragePolicyId = volumeTO.getvSphereStoragePolicyId();
+                    if (!StringUtils.isEmpty(diskStoragePolicyId)) {
+                        PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(context);
+                        diskProfileSpec = profMgrMo.getProfileSpec(diskStoragePolicyId);
+                        deviceConfigSpecArray[i].getProfile().add(diskProfileSpec);
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug(String.format("Adding vSphere storage profile: %s to virtual disk [%s]", diskStoragePolicyId, _gson.toJson(device)));
+                        }
+                    }
+                    if (vol.getType() == Volume.Type.ROOT) {
                         rootDiskTO = vol;
+                        vmStoragePolicyId = diskStoragePolicyId;
+                        vmProfileSpec = diskProfileSpec;
+                    }
                     deviceConfigSpecArray[i].setDevice(device);
                     deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.ADD);
 
@@ -2110,8 +2189,6 @@
 
                     i++;
                 } else {
-                    if (controllerKey == scsiControllerKey && VmwareHelper.isReservedScsiDeviceNumber(scsiUnitNumber))
-                        scsiUnitNumber++;
                     if (controllerKey == vmMo.getIDEControllerKey(ideUnitNumber))
                         ideUnitNumber++;
                     else
@@ -2122,7 +2199,7 @@
             //
             // Setup USB devices
             //
-            if (guestOsId.startsWith("darwin")) { //Mac OS
+            if (StringUtils.isNotBlank(guestOsId) && guestOsId.startsWith("darwin")) { //Mac OS
                 VirtualDevice[] devices = vmMo.getMatchedDevices(new Class<?>[]{VirtualUSBController.class});
                 if (devices.length == 0) {
                     s_logger.debug("No USB Controller device on VM Start. Add USB Controller device for Mac OS VM " + vmInternalCSName);
@@ -2182,9 +2259,7 @@
                 }
             }
 
-            VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType.valueOf(vmSpec.getDetails().get(VmDetailConstants.NIC_ADAPTER));
-            if (s_logger.isDebugEnabled())
-                s_logger.debug("VM " + vmInternalCSName + " will be started with NIC device type: " + nicDeviceType);
+            VirtualEthernetCardType nicDeviceType;
 
             NiciraNvpApiVersion.logNiciraApiVersion();
 
@@ -2192,6 +2267,14 @@
             for (NicTO nicTo : sortNicsByDeviceId(nics)) {
                 s_logger.info("Prepare NIC device based on NicTO: " + _gson.toJson(nicTo));
 
+                String adapterTypeStr = deployAsIs ?
+                        mapAdapterType(deployAsIsInfo.getNicAdapterMap().get(nicTo.getDeviceId())) :
+                        vmSpec.getDetails().get(VmDetailConstants.NIC_ADAPTER);
+                nicDeviceType = VirtualEthernetCardType.valueOf(adapterTypeStr);
+
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug("VM " + vmInternalCSName + " will be started with NIC device type: " + nicDeviceType + " on NIC device " + nicTo.getDeviceId());
+                }
                 boolean configureVServiceInNexus = (nicTo.getType() == TrafficType.Guest) && (vmSpec.getDetails().containsKey("ConfigureVServiceInNexus"));
                 VirtualMachine.Type vmType = cmd.getVirtualMachine().getType();
                 Pair<ManagedObjectReference, String> networkInfo = prepareNetworkFromNicInfo(vmMo.getRunningHost(), nicTo, configureVServiceInNexus, vmType);
@@ -2245,6 +2328,11 @@
             // pass boot arguments through machine.id & perform customized options to VMX
             ArrayList<OptionValue> extraOptions = new ArrayList<OptionValue>();
             configBasicExtraOption(extraOptions, vmSpec);
+
+            if (deployAsIs) {
+                setDeployAsIsProperties(vmMo, deployAsIsInfo, vmConfigSpec);
+            }
+
             configNvpExtraOption(extraOptions, vmSpec, nicUuidToDvSwitchUuid);
             configCustomExtraOption(extraOptions, vmSpec);
 
@@ -2258,43 +2346,19 @@
                 extraOptions.add(option);
             }
 
-            // config VNC
-            String keyboardLayout = null;
-            if (vmSpec.getDetails() != null)
-                keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD);
-            vmConfigSpec.getExtraConfig()
-                    .addAll(Arrays.asList(configureVnc(extraOptions.toArray(new OptionValue[0]), hyperHost, vmInternalCSName, vmSpec.getVncPassword(), keyboardLayout)));
+            configureVNC(vmSpec, extraOptions, vmConfigSpec, hyperHost, vmInternalCSName);
 
             // config video card
             configureVideoCard(vmMo, vmSpec, vmConfigSpec);
 
-            // Set OVF properties (if available)
-            Pair<String, List<OVFPropertyTO>> ovfPropsMap = vmSpec.getOvfProperties();
-            VmConfigInfo templateVappConfig = null;
-            List<OVFPropertyTO> ovfProperties = null;
-            if (ovfPropsMap != null) {
-                String vmTemplate = ovfPropsMap.first();
-                s_logger.info("Find VM template " + vmTemplate);
-                VirtualMachineMO vmTemplateMO = dcMo.findVm(vmTemplate);
-                templateVappConfig = vmTemplateMO.getConfigInfo().getVAppConfig();
-                ovfProperties = ovfPropsMap.second();
-                // Set OVF properties (if available)
-                if (CollectionUtils.isNotEmpty(ovfProperties)) {
-                    s_logger.info("Copying OVF properties from template and setting them to the values the user provided");
-                    copyVAppConfigsFromTemplate(templateVappConfig, ovfProperties, vmConfigSpec);
+            setBootOptions(vmSpec, bootMode, vmConfigSpec);
+
+            if (!StringUtils.isEmpty(vmStoragePolicyId)) {
+                vmConfigSpec.getVmProfile().add(vmProfileSpec);
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace(String.format("Configuring the VM %s with storage policy: %s", vmInternalCSName, vmStoragePolicyId));
                 }
             }
-
-            if (StringUtils.isNotBlank(bootMode) && !bootMode.equalsIgnoreCase("bios")) {
-                vmConfigSpec.setFirmware("efi");
-                if (vmSpec.getDetails().containsKey(ApiConstants.BootType.UEFI.toString()) && "secure".equalsIgnoreCase(vmSpec.getDetails().get(ApiConstants.BootType.UEFI.toString()))) {
-                    VirtualMachineBootOptions bootOptions = new VirtualMachineBootOptions();
-                    bootOptions.setEfiSecureBootEnabled(true);
-                    vmConfigSpec.setBootOptions(bootOptions);
-                }
-            }
-
-
             //
             // Configure VM
             //
@@ -2308,7 +2372,7 @@
 
             // Resizing root disk only when explicit requested by user
             final Map<String, String> vmDetails = cmd.getVirtualMachine().getDetails();
-            if (rootDiskTO != null && !hasSnapshot && (vmDetails != null && vmDetails.containsKey(ApiConstants.ROOT_DISK_SIZE))) {
+            if (!deployAsIs && rootDiskTO != null && !hasSnapshot && (vmDetails != null && vmDetails.containsKey(ApiConstants.ROOT_DISK_SIZE))) {
                 resizeRootDiskOnVMStart(vmMo, rootDiskTO, hyperHost, context);
             }
 
@@ -2382,6 +2446,210 @@
         }
     }
 
+    private String mapAdapterType(String adapterStringFromOVF) {
+        if (StringUtils.isBlank(adapterStringFromOVF) || adapterStringFromOVF.equalsIgnoreCase(VirtualEthernetCardType.E1000.toString())) {
+            return VirtualEthernetCardType.E1000.toString();
+        } else if (adapterStringFromOVF.equalsIgnoreCase(VirtualEthernetCardType.PCNet32.toString())) {
+            return VirtualEthernetCardType.PCNet32.toString();
+        } else if (adapterStringFromOVF.equalsIgnoreCase(VirtualEthernetCardType.Vmxnet2.toString())) {
+            return VirtualEthernetCardType.Vmxnet2.toString();
+        } else if (adapterStringFromOVF.equalsIgnoreCase(VirtualEthernetCardType.Vmxnet3.toString())) {
+            return VirtualEthernetCardType.Vmxnet3.toString();
+        }
+        return VirtualEthernetCardType.E1000.toString();
+    }
+
+    private int getDisksChangesNumberFromDisksSpec(DiskTO[] disks, boolean deployAsIs) {
+        if (!deployAsIs) {
+            return disks.length;
+        } else {
+            int datadisksNumber = 0;
+            if (ArrayUtils.isNotEmpty(disks)) {
+                List<DiskTO> datadisks = Arrays.stream(disks).filter(x -> x.getType() == Volume.Type.DATADISK).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(datadisks)) {
+                    datadisksNumber = datadisks.size();
+                }
+            }
+            return datadisksNumber;
+        }
+    }
+
+    /**
+     * Configure VNC
+     */
+    private void configureVNC(VirtualMachineTO vmSpec, ArrayList<OptionValue> extraOptions, VirtualMachineConfigSpec vmConfigSpec, VmwareHypervisorHost hyperHost, String vmInternalCSName) throws Exception {
+        String keyboardLayout = null;
+        if (vmSpec.getDetails() != null)
+            keyboardLayout = vmSpec.getDetails().get(VmDetailConstants.KEYBOARD);
+        vmConfigSpec.getExtraConfig()
+                .addAll(Arrays.asList(configureVnc(extraOptions.toArray(new OptionValue[0]), hyperHost, vmInternalCSName, vmSpec.getVncPassword(), keyboardLayout)));
+
+    }
+
+    private void ensureDiskControllersInternal(VirtualMachineMO vmMo, Boolean systemVm,
+                                               Pair<String, String> controllerInfo,
+                                               DiskControllerType systemVmScsiControllerType,
+                                               int numScsiControllerForSystemVm,
+                                               int firstScsiControllerBusNum, boolean deployAsIs) throws Exception {
+        if (systemVm) {
+            ensureScsiDiskControllers(vmMo, systemVmScsiControllerType.toString(), numScsiControllerForSystemVm, firstScsiControllerBusNum);
+        } else if (!deployAsIs) {
+            ensureDiskControllers(vmMo, controllerInfo);
+        }
+    }
+
+    private void tearDownVmDevices(VirtualMachineMO vmMo, boolean hasSnapshot, boolean deployAsIs) throws Exception {
+        if (deployAsIs) {
+            vmMo.tearDownDevices(new Class<?>[]{VirtualEthernetCard.class});
+        } else if (!hasSnapshot) {
+            vmMo.tearDownDevices(new Class<?>[]{VirtualDisk.class, VirtualEthernetCard.class});
+        } else {
+            vmMo.tearDownDevices(new Class<?>[]{VirtualEthernetCard.class});
+        }
+    }
+
+    private void tearDownVMDisks(VirtualMachineMO vmMo, List<VirtualDisk> disks) throws Exception {
+        for (VirtualDisk disk : disks) {
+            vmMo.tearDownDevice(disk);
+        }
+    }
+
+    private String getGuestOsIdFromVmSpec(VirtualMachineTO vmSpec, boolean deployAsIs) {
+        return translateGuestOsIdentifier(vmSpec.getArch(), vmSpec.getOs(), vmSpec.getPlatformEmulator()).value();
+    }
+
+    private Pair<String, String> getControllerInfoFromVmSpec(VirtualMachineTO vmSpec) throws CloudRuntimeException {
+        String dataDiskController = vmSpec.getDetails().get(VmDetailConstants.DATA_DISK_CONTROLLER);
+        String rootDiskController = vmSpec.getDetails().get(VmDetailConstants.ROOT_DISK_CONTROLLER);
+
+        // If root disk controller is scsi, then data disk controller would also be scsi instead of using 'osdefault'
+        // This helps avoid mix of different scsi subtype controllers in instance.
+        if (DiskControllerType.osdefault == DiskControllerType.getType(dataDiskController) && DiskControllerType.lsilogic == DiskControllerType.getType(rootDiskController)) {
+            dataDiskController = DiskControllerType.scsi.toString();
+        }
+
+        // Validate the controller types
+        dataDiskController = DiskControllerType.getType(dataDiskController).toString();
+        rootDiskController = DiskControllerType.getType(rootDiskController).toString();
+
+        if (DiskControllerType.getType(rootDiskController) == DiskControllerType.none) {
+            throw new CloudRuntimeException("Invalid root disk controller detected : " + rootDiskController);
+        }
+        if (DiskControllerType.getType(dataDiskController) == DiskControllerType.none) {
+            throw new CloudRuntimeException("Invalid data disk controller detected : " + dataDiskController);
+        }
+
+        return new Pair<>(rootDiskController, dataDiskController);
+    }
+
+    private String getBootModeFromVmSpec(VirtualMachineTO vmSpec, boolean deployAsIs) {
+        String bootMode = null;
+        if (vmSpec.getDetails().containsKey(VmDetailConstants.BOOT_MODE)) {
+            bootMode = vmSpec.getDetails().get(VmDetailConstants.BOOT_MODE);
+        }
+        if (bootMode == null) {
+            bootMode = ApiConstants.BootType.BIOS.toString();
+        }
+        return bootMode;
+    }
+
+    /**
+     * Set OVF properties (if available)
+     */
+    private void setDeployAsIsProperties(VirtualMachineMO vmMo, DeployAsIsInfoTO deployAsIsInfo,
+                                         VirtualMachineConfigSpec vmConfigSpec) throws Exception {
+        if (deployAsIsInfo != null) {
+            Map<String, String> properties = deployAsIsInfo.getProperties();
+            VmConfigInfo vAppConfig = vmMo.getConfigInfo().getVAppConfig();
+            s_logger.info("Copying OVF properties to the values the user provided");
+            setVAppPropertiesToConfigSpec(vAppConfig, properties, vmConfigSpec);
+        }
+    }
+
+    /**
+     * Modify the specDisks information to match the cloned VM's disks (from vmMo VM)
+     */
+    private void mapSpecDisksToClonedDisksAndTearDownDatadisks(VirtualMachineMO vmMo, String vmInternalCSName, DiskTO[] specDisks) {
+        try {
+            s_logger.debug("Mapping spec disks information to cloned VM disks for VM " + vmInternalCSName);
+            if (vmMo != null && ArrayUtils.isNotEmpty(specDisks)) {
+                List<VirtualDisk> vmDisks = vmMo.getVirtualDisks();
+                List<VirtualDisk> rootDisks = new ArrayList<>();
+                List<DiskTO> sortedRootDisksFromSpec = Arrays.asList(sortVolumesByDeviceId(specDisks))
+                        .stream()
+                        .filter(x -> x.getType() == Volume.Type.ROOT)
+                        .collect(Collectors.toList());
+                for (int i = 0; i < sortedRootDisksFromSpec.size(); i++) {
+                    DiskTO specDisk = sortedRootDisksFromSpec.get(i);
+                    VirtualDisk vmDisk = vmDisks.get(i);
+                    DataTO dataVolume = specDisk.getData();
+                    if (dataVolume instanceof VolumeObjectTO) {
+                        VolumeObjectTO volumeObjectTO = (VolumeObjectTO) dataVolume;
+                        if (!volumeObjectTO.getSize().equals(vmDisk.getCapacityInBytes())) {
+                            s_logger.info("Mapped disk size is not the same as the cloned VM disk size: " +
+                                    volumeObjectTO.getSize() + " - " + vmDisk.getCapacityInBytes());
+                        }
+                        VirtualDeviceBackingInfo backingInfo = vmDisk.getBacking();
+                        if (backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
+                            VirtualDiskFlatVer2BackingInfo backing = (VirtualDiskFlatVer2BackingInfo) backingInfo;
+                            String fileName = backing.getFileName();
+                            if (StringUtils.isNotBlank(fileName)) {
+                                String[] fileNameParts = fileName.split(" ");
+                                String datastoreUuid = fileNameParts[0].replace("[", "").replace("]", "");
+                                String relativePath = fileNameParts[1].split("/")[1].replace(".vmdk", "");
+                                String vmSpecDatastoreUuid = volumeObjectTO.getDataStore().getUuid().replaceAll("-", "");
+                                if (!datastoreUuid.equals(vmSpecDatastoreUuid)) {
+                                    s_logger.info("Mapped disk datastore UUID is not the same as the cloned VM datastore UUID: " +
+                                            datastoreUuid + " - " + vmSpecDatastoreUuid);
+                                }
+                                volumeObjectTO.setPath(relativePath);
+                                specDisk.setPath(relativePath);
+                                rootDisks.add(vmDisk);
+                            } else {
+                                s_logger.error("Empty backing filename for volume " + volumeObjectTO.getName());
+                            }
+                        } else {
+                            s_logger.error("Could not get volume backing info for volume " + volumeObjectTO.getName());
+                        }
+                    }
+                }
+                vmDisks.removeAll(rootDisks);
+                if (CollectionUtils.isNotEmpty(vmDisks)) {
+                    s_logger.info("Tearing down datadisks for deploy-as-is VM");
+                    tearDownVMDisks(vmMo, vmDisks);
+                }
+            }
+        } catch (Exception e) {
+            String msg = "Error mapping deploy-as-is VM disks from cloned VM " + vmInternalCSName;
+            s_logger.error(msg, e);
+            throw new CloudRuntimeException(e);
+        }
+    }
+
+    private void setBootOptions(VirtualMachineTO vmSpec, String bootMode, VirtualMachineConfigSpec vmConfigSpec) {
+        VirtualMachineBootOptions bootOptions = null;
+        if (StringUtils.isNotBlank(bootMode) && !bootMode.equalsIgnoreCase("bios")) {
+            vmConfigSpec.setFirmware("efi");
+            if (vmSpec.getDetails().containsKey(ApiConstants.BootType.UEFI.toString()) && "secure".equalsIgnoreCase(vmSpec.getDetails().get(ApiConstants.BootType.UEFI.toString()))) {
+                if (bootOptions == null) {
+                    bootOptions = new VirtualMachineBootOptions();
+                }
+                bootOptions.setEfiSecureBootEnabled(true);
+            }
+        }
+        if (vmSpec.isEnterHardwareSetup()) {
+            if (bootOptions == null) {
+                bootOptions = new VirtualMachineBootOptions();
+            }
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug(String.format("configuring VM '%s' to enter hardware setup",vmSpec.getName()));
+            }
+            bootOptions.setEnterBIOSSetup(vmSpec.isEnterHardwareSetup());
+        }
+        if (bootOptions != null) {
+            vmConfigSpec.setBootOptions(bootOptions);
+        }
+    }
 
     /**
      * Set the ovf section spec from existing vApp configuration
@@ -2401,26 +2669,33 @@
     private Map<String, Pair<String, Boolean>> getOVFMap(List<OVFPropertyTO> props) {
         Map<String, Pair<String, Boolean>> map = new HashMap<>();
         for (OVFPropertyTO prop : props) {
-            Pair<String, Boolean> pair = new Pair<>(prop.getValue(), prop.isPassword());
+            String value = getPropertyValue(prop);
+            Pair<String, Boolean> pair = new Pair<>(value, prop.isPassword());
             map.put(prop.getKey(), pair);
         }
         return map;
     }
 
+    private String getPropertyValue(OVFPropertyTO prop) {
+        String type = prop.getType();
+        String value = prop.getValue();
+        if ("boolean".equalsIgnoreCase(type)) {
+            value = Boolean.parseBoolean(value) ? "True" : "False";
+        }
+        return value;
+    }
+
     /**
      * Set the properties section from existing vApp configuration and values set on ovfProperties
      */
-    protected List<VAppPropertySpec> copyVAppConfigPropertySectionFromOVF(VmConfigInfo vAppConfig, List<OVFPropertyTO> ovfProperties) {
+    protected List<VAppPropertySpec> copyVAppConfigPropertySectionFromOVF(VmConfigInfo vAppConfig, Map<String, String> ovfProperties) {
         List<VAppPropertyInfo> productFromOvf = vAppConfig.getProperty();
         List<VAppPropertySpec> specs = new ArrayList<>();
-        Map<String, Pair<String, Boolean>> ovfMap = getOVFMap(ovfProperties);
         for (VAppPropertyInfo info : productFromOvf) {
             VAppPropertySpec spec = new VAppPropertySpec();
-            if (ovfMap.containsKey(info.getId())) {
-                Pair<String, Boolean> pair = ovfMap.get(info.getId());
-                String value = pair.first();
-                boolean isPassword = pair.second();
-                info.setValue(isPassword ? DBEncryptionUtil.decrypt(value) : value);
+            if (ovfProperties.containsKey(info.getId())) {
+                String value = ovfProperties.get(info.getId());
+                info.setValue(value);
             }
             spec.setInfo(info);
             spec.setOperation(ArrayUpdateOperation.ADD);
@@ -2448,9 +2723,9 @@
      * Set the vApp configuration to vmConfig spec, copying existing configuration from vAppConfig
      * and seting properties values from ovfProperties
      */
-    protected void copyVAppConfigsFromTemplate(VmConfigInfo vAppConfig,
-                                               List<OVFPropertyTO> ovfProperties,
-                                               VirtualMachineConfigSpec vmConfig) throws Exception {
+    protected void setVAppPropertiesToConfigSpec(VmConfigInfo vAppConfig,
+                                                 Map<String, String> ovfProperties,
+                                                 VirtualMachineConfigSpec vmConfig) throws Exception {
         VmConfigSpec vmConfigSpec = new VmConfigSpec();
         vmConfigSpec.getEula().addAll(vAppConfig.getEula());
         vmConfigSpec.setInstallBootStopDelay(vAppConfig.getInstallBootStopDelay());
@@ -2592,7 +2867,7 @@
      */
     protected void modifyVmVideoCardVRamSize(VirtualMachineVideoCard videoCard, VirtualMachineMO vmMo, long svgaVmramSize, VirtualMachineConfigSpec vmConfigSpec) {
         if (videoCard.getVideoRamSizeInKB().longValue() != svgaVmramSize) {
-            s_logger.info("Video card memory was set " + videoCard.getVideoRamSizeInKB().longValue() + "kb instead of " + svgaVmramSize + "kb");
+           s_logger.info("Video card memory was set " + toHumanReadableSize(videoCard.getVideoRamSizeInKB().longValue()) + " instead of " + toHumanReadableSize(svgaVmramSize));
             configureSpecVideoCardNewVRamSize(videoCard, svgaVmramSize, vmConfigSpec);
         }
     }
@@ -2644,66 +2919,61 @@
     }
 
     // return the finalized disk chain for startup, from top to bottom
-    private String[] syncDiskChain(DatacenterMO dcMo, VirtualMachineMO vmMo, VirtualMachineTO vmSpec, DiskTO vol, VirtualMachineDiskInfo diskInfo,
-                                   HashMap<String, Pair<ManagedObjectReference, DatastoreMO>> dataStoresDetails) throws Exception {
+    private String[] syncDiskChain(DatacenterMO dcMo, VirtualMachineMO vmMo, DiskTO vol, VirtualMachineDiskInfo diskInfo,
+                                   DatastoreMO dsMo) throws Exception {
 
         VolumeObjectTO volumeTO = (VolumeObjectTO) vol.getData();
-        DataStoreTO primaryStore = volumeTO.getDataStore();
         Map<String, String> details = vol.getDetails();
         boolean isManaged = false;
-        String iScsiName = null;
 
         if (details != null) {
             isManaged = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
-            iScsiName = details.get(DiskTO.IQN);
         }
 
-        // if the storage is managed, iScsiName should not be null
-        String datastoreName = isManaged ? VmwareResource.getDatastoreName(iScsiName) : primaryStore.getUuid();
-        Pair<ManagedObjectReference, DatastoreMO> volumeDsDetails = dataStoresDetails.get(datastoreName);
-
-        if (volumeDsDetails == null) {
-            throw new Exception("Primary datastore " + primaryStore.getUuid() + " is not mounted on host.");
-        }
-
-        DatastoreMO dsMo = volumeDsDetails.second();
-
-        // we will honor vCenter's meta if it exists
-        if (diskInfo != null) {
-            // to deal with run-time upgrade to maintain the new datastore folder structure
-            String disks[] = diskInfo.getDiskChain();
-            for (int i = 0; i < disks.length; i++) {
-                DatastoreFile file = new DatastoreFile(disks[i]);
-                if (!isManaged && file.getDir() != null && file.getDir().isEmpty()) {
-                    s_logger.info("Perform run-time datastore folder upgrade. sync " + disks[i] + " to VM folder");
-                    disks[i] = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, file.getFileBaseName(), VmwareManager.s_vmwareSearchExcludeFolder.value());
-                }
+        String datastoreDiskPath;
+        if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+            datastoreDiskPath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumeTO.getPath() + ".vmdk");
+            if (!dsMo.fileExists(datastoreDiskPath)) {
+                datastoreDiskPath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmMo.getName(), volumeTO.getPath() + ".vmdk");
             }
-            return disks;
-        }
-
-        final String datastoreDiskPath;
-
-        if (isManaged) {
-            String vmdkPath = new DatastoreFile(volumeTO.getPath()).getFileBaseName();
-
-            if (volumeTO.getVolumeType() == Volume.Type.ROOT) {
-                if (vmdkPath == null) {
-                    vmdkPath = volumeTO.getName();
-                }
-
-                datastoreDiskPath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, vmdkPath);
-            } else {
-                if (vmdkPath == null) {
-                    vmdkPath = dsMo.getName();
-                }
-
-                datastoreDiskPath = dsMo.getDatastorePath(vmdkPath + VMDK_EXTENSION);
+            if (!dsMo.fileExists(datastoreDiskPath)) {
+                datastoreDiskPath = dsMo.searchFileInSubFolders(volumeTO.getPath() + ".vmdk", true, null);
             }
         } else {
-            datastoreDiskPath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, volumeTO.getPath(), VmwareManager.s_vmwareSearchExcludeFolder.value());
-        }
+            // we will honor vCenter's meta if it exists
+            if (diskInfo != null) {
+                // to deal with run-time upgrade to maintain the new datastore folder structure
+                String disks[] = diskInfo.getDiskChain();
+                for (int i = 0; i < disks.length; i++) {
+                    DatastoreFile file = new DatastoreFile(disks[i]);
+                    if (!isManaged && file.getDir() != null && file.getDir().isEmpty()) {
+                        s_logger.info("Perform run-time datastore folder upgrade. sync " + disks[i] + " to VM folder");
+                        disks[i] = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, file.getFileBaseName(), VmwareManager.s_vmwareSearchExcludeFolder.value());
+                    }
+                }
+                return disks;
+            }
 
+            if (isManaged) {
+                String vmdkPath = new DatastoreFile(volumeTO.getPath()).getFileBaseName();
+
+                if (volumeTO.getVolumeType() == Volume.Type.ROOT) {
+                    if (vmdkPath == null) {
+                        vmdkPath = volumeTO.getName();
+                    }
+
+                    datastoreDiskPath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, vmdkPath);
+                } else {
+                    if (vmdkPath == null) {
+                        vmdkPath = dsMo.getName();
+                    }
+
+                    datastoreDiskPath = dsMo.getDatastorePath(vmdkPath + VMDK_EXTENSION);
+                }
+            } else {
+                datastoreDiskPath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmMo.getName(), dsMo, volumeTO.getPath(), VmwareManager.s_vmwareSearchExcludeFolder.value());
+            }
+        }
         if (!dsMo.fileExists(datastoreDiskPath)) {
             s_logger.warn("Volume " + volumeTO.getId() + " does not seem to exist on datastore, out of sync? path: " + datastoreDiskPath);
         }
@@ -3091,6 +3361,9 @@
                     volInSpec.setPath(datastoreVolumePath);
                 } else {
                     volInSpec.setPath(file.getFileBaseName());
+                    if (vol.getDetails().get(DiskTO.PROTOCOL_TYPE) != null && vol.getDetails().get(DiskTO.PROTOCOL_TYPE).equalsIgnoreCase("DatastoreCluster")) {
+                        volInSpec.setUpdatedDataStoreUUID(volumeTO.getDataStore().getUuid());
+                    }
                 }
                 volInSpec.setChainInfo(_gson.toJson(diskInfo));
             }
@@ -3226,6 +3499,41 @@
         return path.substring(0, endIndex).trim();
     }
 
+    private DatastoreMO getDataStoreWhereDiskExists(VmwareHypervisorHost hyperHost, VmwareContext context,
+                                               VirtualMachineDiskInfoBuilder diskInfoBuilder, DiskTO disk, List<Pair<Integer, ManagedObjectReference>> diskDatastores) throws Exception {
+        VolumeObjectTO volume = (VolumeObjectTO) disk.getData();
+        String diskBackingFileBaseName = volume.getPath();
+        for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores) {
+            DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), diskDatastore.second());
+            String dsName = dsMo.getName();
+
+            VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(diskBackingFileBaseName, dsName);
+            if (diskInfo != null) {
+                s_logger.info("Found existing disk info from volume path: " + volume.getPath());
+                return dsMo;
+            } else {
+                String chainInfo = volume.getChainInfo();
+                if (chainInfo != null) {
+                    VirtualMachineDiskInfo infoInChain = _gson.fromJson(chainInfo, VirtualMachineDiskInfo.class);
+                    if (infoInChain != null) {
+                        String[] disks = infoInChain.getDiskChain();
+                        if (disks.length > 0) {
+                            for (String diskPath : disks) {
+                                DatastoreFile file = new DatastoreFile(diskPath);
+                                diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName(), dsName);
+                                if (diskInfo != null) {
+                                    s_logger.info("Found existing disk from chain info: " + diskPath);
+                                    return dsMo;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     private HashMap<String, Pair<ManagedObjectReference, DatastoreMO>> inferDatastoreDetailsFromDiskInfo(VmwareHypervisorHost hyperHost, VmwareContext context,
                                                                                                          DiskTO[] disks, Command cmd) throws Exception {
         HashMap<String, Pair<ManagedObjectReference, DatastoreMO>> mapIdToMors = new HashMap<>();
@@ -3298,39 +3606,25 @@
         return mapIdToMors;
     }
 
-    private DatastoreMO getDatastoreThatRootDiskIsOn(HashMap<String, Pair<ManagedObjectReference, DatastoreMO>> dataStoresDetails, DiskTO disks[]) {
+    private Pair<ManagedObjectReference, DatastoreMO> getDatastoreThatDiskIsOn(HashMap<String, Pair<ManagedObjectReference, DatastoreMO>> dataStoresDetails, DiskTO vol) {
         Pair<ManagedObjectReference, DatastoreMO> rootDiskDataStoreDetails = null;
 
-        for (DiskTO vol : disks) {
-            if (vol.getType() == Volume.Type.ROOT) {
-                Map<String, String> details = vol.getDetails();
-                boolean managed = false;
+        Map<String, String> details = vol.getDetails();
+        boolean managed = false;
 
-                if (details != null) {
-                    managed = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
-                }
-
-                if (managed) {
-                    String datastoreName = VmwareResource.getDatastoreName(details.get(DiskTO.IQN));
-
-                    rootDiskDataStoreDetails = dataStoresDetails.get(datastoreName);
-
-                    break;
-                } else {
-                    DataStoreTO primaryStore = vol.getData().getDataStore();
-
-                    rootDiskDataStoreDetails = dataStoresDetails.get(primaryStore.getUuid());
-
-                    break;
-                }
-            }
+        if (details != null) {
+            managed = Boolean.parseBoolean(details.get(DiskTO.MANAGED));
         }
 
-        if (rootDiskDataStoreDetails != null) {
-            return rootDiskDataStoreDetails.second();
+        if (managed) {
+            String datastoreName = VmwareResource.getDatastoreName(details.get(DiskTO.IQN));
+            rootDiskDataStoreDetails = dataStoresDetails.get(datastoreName);
+        } else {
+            DataStoreTO primaryStore = vol.getData().getDataStore();
+            rootDiskDataStoreDetails = dataStoresDetails.get(primaryStore.getUuid());
         }
 
-        return null;
+        return rootDiskDataStoreDetails;
     }
 
     private String getPvlanInfo(NicTO nicTo) {
@@ -3892,7 +4186,7 @@
 
     protected Answer execute(RebootCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource RebootCommand: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource RebootCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         boolean toolsInstallerMounted = false;
@@ -3907,8 +4201,12 @@
                     s_logger.trace("Detected mounted vmware tools installer for :[" + cmd.getVmName() + "]");
                 }
                 try {
-                    vmMo.rebootGuest();
-                    return new RebootAnswer(cmd, "reboot succeeded", true);
+                    if (canSetEnableSetupConfig(vmMo,cmd.getVirtualMachine())) {
+                        vmMo.rebootGuest();
+                        return new RebootAnswer(cmd, "reboot succeeded", true);
+                    } else {
+                        return new RebootAnswer(cmd, "Failed to configure VM to boot into hardware setup menu: " + vmMo.getName(), false);
+                    }
                 } catch (ToolsUnavailableFaultMsg e) {
                     s_logger.warn("VMware tools is not installed at guest OS, we will perform hard reset for reboot");
                 } catch (Exception e) {
@@ -3949,6 +4247,33 @@
         }
     }
 
+    /**
+     * set the boot into setup option if possible
+     * @param vmMo vmware view on the vm
+     * @param virtualMachine orchestration spec for the vm
+     * @return true unless reboot into setup is requested and vmware is unable to comply
+     */
+    private boolean canSetEnableSetupConfig(VirtualMachineMO vmMo, VirtualMachineTO virtualMachine) {
+        if (virtualMachine.isEnterHardwareSetup()) {
+            VirtualMachineBootOptions bootOptions = new VirtualMachineBootOptions();
+            VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec();
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug(String.format("configuring VM '%s' to reboot into hardware setup menu.",virtualMachine.getName()));
+            }
+            bootOptions.setEnterBIOSSetup(virtualMachine.isEnterHardwareSetup());
+            vmConfigSpec.setBootOptions(bootOptions);
+            try {
+                if (!vmMo.configureVm(vmConfigSpec)) {
+                    return false;
+                }
+            } catch (Exception e) {
+                s_logger.error(String.format("failed to reconfigure VM '%s' to boot into hardware setup menu",virtualMachine.getName()),e);
+                return false;
+            }
+        }
+        return true;
+    }
+
     protected Answer execute(CheckVirtualMachineCommand cmd) {
         if (s_logger.isInfoEnabled()) {
             s_logger.info("Executing resource CheckVirtualMachineCommand: " + _gson.toJson(cmd));
@@ -3984,7 +4309,7 @@
 
     protected Answer execute(PrepareForMigrationCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource PrepareForMigrationCommand: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource PrepareForMigrationCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         VirtualMachineTO vm = cmd.getVirtualMachine();
@@ -4211,7 +4536,7 @@
 
     protected Answer execute(MigrateCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource MigrateCommand: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource MigrateCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         final String vmName = cmd.getVmName();
@@ -4254,7 +4579,7 @@
     protected Answer execute(MigrateWithStorageCommand cmd) {
 
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource MigrateWithStorageCommand: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource MigrateWithStorageCommand: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         VirtualMachineTO vmTo = cmd.getVirtualMachine();
@@ -4318,7 +4643,8 @@
 
                 s_logger.debug("Preparing spec for volume : " + volume.getName());
                 morDsAtTarget = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(tgtHyperHost, filerTo.getUuid());
-                morDsAtSource = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(srcHyperHost, 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";
@@ -4338,7 +4664,7 @@
                     // 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);
+                            morDsAtSource = srcHyperHost.mountDatastore(false, tgtDsHost, tgtDsPort, tgtDsPath, tgtDsName, true);
                             if (morDsAtSource == null) {
                                 throw new Exception("Unable to mount NFS datastore " + tgtDsHost + ":/" + tgtDsPath + " on " + _hostName);
                             }
@@ -4346,9 +4672,8 @@
                             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)) {
+                    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.");
@@ -4367,8 +4692,9 @@
                 if (volume.getType() == Volume.Type.ROOT) {
                     relocateSpec.setDatastore(morTgtDatastore);
                 }
+
                 diskLocator = new VirtualMachineRelocateSpecDiskLocator();
-                diskLocator.setDatastore(morDsAtSource);
+                diskLocator.setDatastore(morTgtDatastore);
                 Pair<VirtualDisk, String> diskInfo = getVirtualDiskInfo(vmMo, appendFileType(volume.getPath(), VMDK_EXTENSION));
                 String vmdkAbsFile = getAbsoluteVmdkFile(diskInfo.first());
                 if (vmdkAbsFile != null && !vmdkAbsFile.isEmpty()) {
@@ -4391,7 +4717,6 @@
                     diskLocators.add(diskLocator);
                 }
             }
-
             relocateSpec.getDisk().addAll(diskLocators);
 
             // Prepare network at target before migration
@@ -4510,26 +4835,36 @@
         VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
         VirtualMachineMO vmMo = null;
         DatastoreMO dsMo = null;
+        DatastoreMO destinationDsMo = null;
         ManagedObjectReference morSourceDS = null;
+        ManagedObjectReference morDestintionDS = null;
         String vmdkDataStorePath = null;
+        boolean isvVolsInvolved = false;
 
         String vmName = null;
         try {
             // OfflineVmwareMigration: we need to refactor the worker vm creation out for use in migration methods as well as here
             // 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
-            vmName = getWorkerName(getServiceContext(), cmd, 0);
+            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);
+
+            vmName = getWorkerName(getServiceContext(), cmd, 0, dsMo);
+            if (destinationDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                isvVolsInvolved = true;
+                vmName = getWorkerName(getServiceContext(), cmd, 0, destinationDsMo);
+            }
 
             // 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()));
 
-            morSourceDS = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getSourcePool().getUuid());
-            dsMo = new DatastoreMO(hyperHost.getContext(), morSourceDS);
             s_logger.info("Create worker VM " + vmName);
             // OfflineVmwareMigration: 2. create the worker with access to the data(store)
-            vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, vmName);
+            vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, vmName, null);
             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");
@@ -4545,12 +4880,16 @@
                     }
                     vmdkDataStorePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, path, vmdkFileName);
                 }
-                if (!dsMo.fileExists(vmdkDataStorePath)) {
+                if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), path) || !dsMo.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);
                 }
+                if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmName) || !dsMo.fileExists(vmdkDataStorePath)) {
+                    vmdkDataStorePath = dsMo.searchFileInSubFolders(vmdkFileName, true, null);
+                }
+
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug(String.format("attaching %s to %s for migration", vmdkDataStorePath, vmMo.getVmName()));
                 }
@@ -4617,21 +4956,23 @@
             }
         }
         if (answer instanceof MigrateVolumeAnswer) {
-            String newPath = ((MigrateVolumeAnswer) answer).getVolumePath();
-            String vmdkFileName = newPath + VMDK_EXTENSION;
-            try {
-                VmwareStorageLayoutHelper.syncVolumeToRootFolder(dsMo.getOwnerDatacenter().first(), dsMo, newPath, vmName);
-                vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkFileName);
+            if (!isvVolsInvolved) {
+                String newPath = ((MigrateVolumeAnswer) answer).getVolumePath();
+                String vmdkFileName = newPath + VMDK_EXTENSION;
+                try {
+                    VmwareStorageLayoutHelper.syncVolumeToRootFolder(dsMo.getOwnerDatacenter().first(), dsMo, newPath, vmName);
+                    vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkFileName);
 
-                if (!dsMo.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);
+                    if (!dsMo.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);
+                    }
+                } catch (Exception e) {
+                    String msg = String.format("Migration of volume '%s' failed due to %s", cmd.getVolumePath(), e.getLocalizedMessage());
+                    s_logger.error(msg, e);
                     answer = new Answer(cmd, false, msg);
                 }
-            } catch (Exception e) {
-                String msg = String.format("Migration of volume '%s' failed due to %s", cmd.getVolumePath(), e.getLocalizedMessage());
-                s_logger.error(msg, e);
-                answer = new Answer(cmd, false, msg);
             }
         }
         return answer;
@@ -4835,27 +5176,71 @@
             VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
             StorageFilerTO pool = cmd.getPool();
 
-            if (pool.getType() != StoragePoolType.NetworkFilesystem && pool.getType() != StoragePoolType.VMFS) {
+            if (pool.getType() != StoragePoolType.NetworkFilesystem && pool.getType() != StoragePoolType.VMFS && pool.getType() != StoragePoolType.PreSetup && pool.getType() != StoragePoolType.DatastoreCluster) {
                 throw new Exception("Unsupported storage pool type " + pool.getType());
             }
 
             ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, pool.getUuid());
 
             if (morDatastore == null) {
-                morDatastore = hyperHost.mountDatastore(pool.getType() == StoragePoolType.VMFS, pool.getHost(), pool.getPort(), pool.getPath(), pool.getUuid().replace("-", ""));
+                morDatastore = hyperHost.mountDatastore((pool.getType() == StoragePoolType.VMFS || pool.getType() == StoragePoolType.PreSetup || pool.getType() == StoragePoolType.DatastoreCluster), pool.getHost(), pool.getPort(), pool.getPath(), pool.getUuid().replace("-", ""), true);
             }
 
             assert (morDatastore != null);
 
-            DatastoreSummary summary = new DatastoreMO(getServiceContext(), morDatastore).getSummary();
+            DatastoreMO dsMo = new DatastoreMO(getServiceContext(), morDatastore);
+            HypervisorHostHelper.createBaseFolder(dsMo, hyperHost, pool.getType());
 
-            long capacity = summary.getCapacity();
-            long available = summary.getFreeSpace();
+            long capacity = 0;
+            long available = 0;
+            List<ModifyStoragePoolAnswer> childDatastoresModifyStoragePoolAnswers = new ArrayList<>();
+            if (pool.getType() == StoragePoolType.DatastoreCluster) {
+                StoragepodMO datastoreClusterMo = new StoragepodMO(getServiceContext(), morDatastore);
+                StoragePodSummary dsClusterSummary = datastoreClusterMo.getDatastoreClusterSummary();
+                capacity = dsClusterSummary.getCapacity();
+                available = dsClusterSummary.getFreeSpace();
+
+                List<ManagedObjectReference> childDatastoreMors = datastoreClusterMo.getDatastoresInDatastoreCluster();
+                for (ManagedObjectReference childDsMor : childDatastoreMors) {
+                    DatastoreMO childDsMo = new DatastoreMO(getServiceContext(), childDsMor);
+
+                    Map<String, TemplateProp> tInfo = new HashMap<>();
+                    DatastoreSummary summary = childDsMo.getDatastoreSummary();;
+                    ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(cmd, summary.getCapacity(), summary.getFreeSpace(), tInfo);
+                    StoragePoolInfo poolInfo = answer.getPoolInfo();
+                    poolInfo.setName(summary.getName());
+                    String datastoreClusterPath = pool.getPath();
+                    int pathstartPosition = datastoreClusterPath.lastIndexOf('/');
+                    String datacenterName = datastoreClusterPath.substring(0, pathstartPosition+1);
+                    String childPath = datacenterName + summary.getName();
+                    poolInfo.setHostPath(childPath);
+                    String uuid = UUID.nameUUIDFromBytes(((pool.getHost() + childPath)).getBytes()).toString();
+                    poolInfo.setUuid(uuid);
+                    poolInfo.setLocalPath(cmd.LOCAL_PATH_PREFIX + File.separator + uuid);
+
+                    answer.setPoolInfo(poolInfo);
+                    answer.setPoolType(summary.getType());
+                    answer.setLocalDatastoreName(morDatastore.getValue());
+
+                    childDsMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, uuid);
+                    HypervisorHostHelper.createBaseFolderInDatastore(childDsMo, hyperHost);
+
+                    childDatastoresModifyStoragePoolAnswers.add(answer);
+                }
+            } else {
+                HypervisorHostHelper.createBaseFolderInDatastore(dsMo, hyperHost);
+
+                DatastoreSummary summary = dsMo.getDatastoreSummary();
+                capacity = summary.getCapacity();
+                available = summary.getFreeSpace();
+            }
 
             Map<String, TemplateProp> tInfo = new HashMap<>();
             ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(cmd, capacity, available, tInfo);
+            answer.setDatastoreClusterChildren(childDatastoresModifyStoragePoolAnswers);
 
-            if (cmd.getAdd() && pool.getType() == StoragePoolType.VMFS) {
+            if (cmd.getAdd() && (pool.getType() == StoragePoolType.VMFS || pool.getType() == StoragePoolType.PreSetup) && pool.getType() != StoragePoolType.DatastoreCluster) {
+                answer.setPoolType(dsMo.getDatastoreType());
                 answer.setLocalDatastoreName(morDatastore.getValue());
             }
 
@@ -5018,7 +5403,7 @@
         URI uri = new URI(storeUrl);
 
         VmwareHypervisorHost hyperHost = getHyperHost(getServiceContext());
-        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""));
+        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""), false);
 
         if (morDatastore == null)
             throw new Exception("Unable to mount secondary storage on host. storeUrl: " + storeUrl);
@@ -5030,7 +5415,7 @@
         String storeName = getSecondaryDatastoreUUID(storeUrl);
         URI uri = new URI(storeUrl);
 
-        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""));
+        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""), false);
 
         if (morDatastore == null)
             throw new Exception("Unable to mount secondary storage on host. storeUrl: " + storeUrl);
@@ -5235,20 +5620,28 @@
             ManagedObjectReference morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, cmd.getStorageId());
 
             if (morDs != null) {
-                DatastoreMO datastoreMo = new DatastoreMO(context, morDs);
-                DatastoreSummary summary = datastoreMo.getSummary();
-                assert (summary != null);
+                long capacity = 0;
+                long free = 0;
+                if (cmd.getPooltype() == StoragePoolType.DatastoreCluster) {
+                    StoragepodMO datastoreClusterMo = new StoragepodMO(getServiceContext(), morDs);
+                    StoragePodSummary summary = datastoreClusterMo.getDatastoreClusterSummary();
+                    capacity = summary.getCapacity();
+                    free = summary.getFreeSpace();
+                } else {
+                    DatastoreMO datastoreMo = new DatastoreMO(context, morDs);
+                    DatastoreSummary summary = datastoreMo.getDatastoreSummary();
+                    capacity = summary.getCapacity();
+                    free = summary.getFreeSpace();
+                }
 
-                long capacity = summary.getCapacity();
-                long free = summary.getFreeSpace();
                 long used = capacity - free;
 
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Datastore summary info, storageId: " + cmd.getStorageId() + ", localPath: " + cmd.getLocalPath() + ", poolType: " + cmd.getPooltype()
-                            + ", capacity: " + capacity + ", free: " + free + ", used: " + used);
+                            + ", capacity: " + toHumanReadableSize(capacity) + ", free: " + toHumanReadableSize(free) + ", used: " + toHumanReadableSize(used));
                 }
 
-                if (summary.getCapacity() <= 0) {
+                if (capacity <= 0) {
                     s_logger.warn("Something is wrong with vSphere NFS datastore, rebooting ESX(ESXi) host should help");
                 }
 
@@ -5770,7 +6163,7 @@
                         dsMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, poolUuid);
                     }
 
-                    DatastoreSummary dsSummary = dsMo.getSummary();
+                    DatastoreSummary dsSummary = dsMo.getDatastoreSummary();
                     String address = hostMo.getHostName();
                     StoragePoolInfo pInfo = new StoragePoolInfo(poolUuid, address, dsMo.getMor().getValue(), "", StoragePoolType.VMFS, dsSummary.getCapacity(),
                             dsSummary.getFreeSpace());
@@ -6486,6 +6879,8 @@
 
             CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(context, context.getServiceContent().getCustomFieldsManager());
             cfmMo.ensureCustomFieldDef("Datastore", CustomFieldConstants.CLOUD_UUID);
+            cfmMo.ensureCustomFieldDef("StoragePod", CustomFieldConstants.CLOUD_UUID);
+
             if (_publicTrafficInfo != null && _publicTrafficInfo.getVirtualSwitchType() != VirtualSwitchType.StandardVirtualSwitch
                     || _guestTrafficInfo != null && _guestTrafficInfo.getVirtualSwitchType() != VirtualSwitchType.StandardVirtualSwitch) {
                 cfmMo.ensureCustomFieldDef("DistributedVirtualPortgroup", CustomFieldConstants.CLOUD_GC_DVP);
@@ -6663,9 +7058,12 @@
 
     @Override
     @DB
-    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence) {
+    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence, DatastoreMO dsMo) throws Exception {
         VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
         String vmName = mgr.composeWorkerName();
+        if (dsMo!= null && dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+            vmName = CustomFieldConstants.CLOUD_UUID + "-" + vmName;
+        }
 
         assert (cmd != null);
         context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
@@ -6705,7 +7103,7 @@
     @Override
     public Answer execute(DestroyCommand cmd) {
         if (s_logger.isInfoEnabled()) {
-            s_logger.info("Executing resource DestroyCommand to evict template from storage pool: " + _gson.toJson(cmd));
+            s_logger.info("Executing resource DestroyCommand to evict template from storage pool: " + getHumanReadableBytesJson(_gson.toJson(cmd)));
         }
 
         try {
@@ -6715,10 +7113,13 @@
 
             VirtualMachineMO vmMo = findVmOnDatacenter(context, hyperHost, vol);
 
-            if (vmMo != null && vmMo.isTemplate()) {
+            if (vmMo != null) {
                 if (s_logger.isInfoEnabled()) {
                     s_logger.info("Destroy template volume " + vol.getPath());
                 }
+                if (vmMo.isTemplate()) {
+                    vmMo.markAsVirtualMachine(hyperHost.getHyperHostOwnerResourcePool(), hyperHost.getMor());
+                }
                 vmMo.destroy();
             } else {
                 if (s_logger.isInfoEnabled()) {
@@ -6855,14 +7256,8 @@
                                     instanceDisk.setDatastorePath(dsInfo.getNas().getRemotePath());
                                     instanceDisk.setDatastoreType(dsInfo.getNas().getType());
                                 }
-                            } else if (info instanceof VmfsDatastoreInfo) {
-                                VmfsDatastoreInfo dsInfo = (VmfsDatastoreInfo) info;
-                                instanceDisk.setDatastoreName(dsInfo.getVmfs().getName());
-                                instanceDisk.setDatastoreType(dsInfo.getVmfs().getType());
                             } else {
-                                String msg = String.format("Unmanaged instance disk: %s is on unsupported datastore %s", instanceDisk.getDiskId(), info.getClass().getSimpleName());
-                                s_logger.error(msg);
-                                throw new Exception(msg);
+                                instanceDisk.setDatastoreName(info.getName());
                             }
                         }
                         s_logger.info(vmMo.getName() + " " + disk.getDeviceInfo().getLabel() + " " + disk.getDeviceInfo().getSummary() + " " + disk.getDiskObjectId() + " " + disk.getCapacityInKB() + " " + instanceDisk.getController());
@@ -7097,4 +7492,40 @@
         }
         return new GetUnmanagedInstancesAnswer(cmd, "", unmanagedInstances);
     }
+
+    private Answer execute(PrepareUnmanageVMInstanceCommand cmd) {
+        s_logger.debug("Verify VMware instance: " + cmd.getInstanceName() + " is available before unmanaging VM");
+        VmwareContext context = getServiceContext();
+        VmwareHypervisorHost hyperHost = getHyperHost(context);
+        String instanceName = cmd.getInstanceName();
+
+        try {
+            ManagedObjectReference  dcMor = hyperHost.getHyperHostDatacenter();
+            DatacenterMO dataCenterMo = new DatacenterMO(getServiceContext(), dcMor);
+            VirtualMachineMO vm = dataCenterMo.findVm(instanceName);
+            if (vm == null) {
+                return new PrepareUnmanageVMInstanceAnswer(cmd, false, "Cannot find VM with name " + instanceName +
+                        " in datacenter " + dataCenterMo.getName());
+            }
+        } catch (Exception e) {
+            s_logger.error("Error trying to verify if VM to unmanage exists", e);
+            return new PrepareUnmanageVMInstanceAnswer(cmd, false, "Error: " + e.getMessage());
+        }
+
+        return new PrepareUnmanageVMInstanceAnswer(cmd, true, "OK");
+    }
+
+    private Answer execute(ValidateVcenterDetailsCommand cmd) {
+        if (s_logger.isInfoEnabled()) {
+            s_logger.info("Executing resource ValidateVcenterDetailsCommand " + _gson.toJson(cmd));
+        }
+        String vCenterServerAddress = cmd.getvCenterServerAddress();
+        VmwareContext context = getServiceContext();
+
+        if (vCenterServerAddress.equals(context.getServerAddress())) {
+            return new Answer(cmd, true, "success");
+        } else {
+            return new Answer(cmd, false, "Provided vCenter server address is invalid");
+        }
+    }
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/PremiumSecondaryStorageResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/PremiumSecondaryStorageResource.java
index fd89cc7..e2aff4c 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/PremiumSecondaryStorageResource.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/PremiumSecondaryStorageResource.java
@@ -102,7 +102,7 @@
             VmwareSecondaryStorageContextFactory.initFactoryEnvironment();
         }
 
-        Integer nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
+        String nfsVersion = NfsSecondaryStorageResource.retrieveNfsVersionFromParams(params);
         registerHandler(Hypervisor.HypervisorType.VMware, new VmwareSecondaryStorageResourceHandler(this, nfsVersion));
         return true;
     }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
index ff00f55..936ca15 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareSecondaryStorageResourceHandler.java
@@ -41,6 +41,7 @@
 import com.cloud.hypervisor.vmware.manager.VmwareStorageManagerImpl;
 import com.cloud.hypervisor.vmware.manager.VmwareStorageMount;
 import com.cloud.hypervisor.vmware.mo.ClusterMO;
+import com.cloud.hypervisor.vmware.mo.DatastoreMO;
 import com.cloud.hypervisor.vmware.mo.HostMO;
 import com.cloud.hypervisor.vmware.mo.VmwareHostType;
 import com.cloud.hypervisor.vmware.mo.VmwareHypervisorHost;
@@ -66,7 +67,7 @@
      * private Map<String, HostMO> _activeHosts = new HashMap<String, HostMO>();
      */
 
-    public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, Integer nfsVersion) {
+    public VmwareSecondaryStorageResourceHandler(PremiumSecondaryStorageResource resource, String nfsVersion) {
         _resource = resource;
         _storageMgr = new VmwareStorageManagerImpl(this, nfsVersion);
         _gson = GsonHelper.getGsonLogger();
@@ -297,7 +298,7 @@
     }
 
     @Override
-    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence) {
+    public String getWorkerName(VmwareContext context, Command cmd, int workerSequence, DatastoreMO dsMo) {
         assert (cmd.getContextParam("worker") != null);
         assert (workerSequence < 2);
 
@@ -307,7 +308,7 @@
     }
 
     @Override
-    public String getMountPoint(String storageUrl, Integer nfsVersion) {
+    public String getMountPoint(String storageUrl, String nfsVersion) {
         return _resource.getRootDir(storageUrl, nfsVersion);
     }
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java
index 9b2acbc..6c66183 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java
@@ -16,13 +16,19 @@
 // under the License.
 package com.cloud.storage.resource;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.log4j.Logger;
 
 import com.cloud.hypervisor.vmware.mo.DatacenterMO;
 import com.cloud.hypervisor.vmware.mo.DatastoreFile;
 import com.cloud.hypervisor.vmware.mo.DatastoreMO;
+import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
+
 import com.cloud.utils.Pair;
 
 /**
@@ -30,32 +36,93 @@
  * To provide helper methods to handle storage layout in one place
  *
  */
-public class VmwareStorageLayoutHelper {
+public class VmwareStorageLayoutHelper implements Configurable {
     private static final Logger s_logger = Logger.getLogger(VmwareStorageLayoutHelper.class);
 
+    static final ConfigKey<String> VsphereLinkedCloneExtensions = new ConfigKey<String>("Hidden", String.class,
+            "vsphere.linked.clone.extensions", "delta.vmdk,sesparse.vmdk",
+            "Comma separated list of linked clone disk formats allowed to handle storage in VMware", true);
+
+
     public static String[] getVmdkFilePairDatastorePath(DatastoreMO dsMo, String vmName, String vmdkName, VmwareStorageLayoutType layoutType, boolean linkedVmdk)
         throws Exception {
 
-        String[] filePair = new String[2];
+        int i = 0;
+        String[] vSphereLinkedCloneExtensions = VsphereLinkedCloneExtensions.value().trim().split("\\s*,\\s*");
+        String[] fileNames;
+        if (linkedVmdk)
+            fileNames = new String[vSphereLinkedCloneExtensions.length + 1];
+        else
+            fileNames = new String[2];
+
         switch (layoutType) {
             case VMWARE:
                 assert (vmName != null && !vmName.isEmpty());
-                filePair[0] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + ".vmdk");
+                fileNames[i] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + ".vmdk");
 
-                if (linkedVmdk)
-                    filePair[1] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + "-delta.vmdk");
+                if (linkedVmdk) {
+                    for (int j=0 ; j < vSphereLinkedCloneExtensions.length; j++) {
+                        fileNames[++i] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, String.format("%s-%s",vmdkName, vSphereLinkedCloneExtensions[j]));
+                    }
+                }
                 else
-                    filePair[1] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + "-flat.vmdk");
-                return filePair;
+                    fileNames[i+1] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + "-flat.vmdk");
+                return fileNames;
 
             case CLOUDSTACK_LEGACY:
-                filePair[0] = getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkName + ".vmdk");
+                fileNames[i] = getDatastorePathBaseFolderFromVmdkFileName(dsMo, vmdkName + ".vmdk");
 
-                if (linkedVmdk)
-                    filePair[1] = getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkName + "-delta.vmdk");
-                else
-                    filePair[1] = getLegacyDatastorePathFromVmdkFileName(dsMo, vmdkName + "-flat.vmdk");
-                return filePair;
+                if (linkedVmdk) {
+                    for (int j=0 ; j < vSphereLinkedCloneExtensions.length; j++) {
+                        fileNames[++i] = getDatastorePathBaseFolderFromVmdkFileName(dsMo, String.format("%s-%s",vmdkName, vSphereLinkedCloneExtensions[j]));
+                    }
+                } else
+                    fileNames[i+1] = getDatastorePathBaseFolderFromVmdkFileName(dsMo, vmdkName + "-flat.vmdk");
+                return fileNames;
+
+            default:
+                assert (false);
+                break;
+        }
+
+        assert (false);
+        return null;
+    }
+
+    public static String[] getVmdkFilePairManagedDatastorePath(DatastoreMO dsMo, String vmName, String vmdkName, VmwareStorageLayoutType layoutType, boolean linkedVmdk)
+            throws Exception {
+
+        int i = 0;
+        String[] vSphereLinkedCloneExtensions = VsphereLinkedCloneExtensions.value().trim().split("\\s*,\\s*");
+        String[] fileNames;
+        if (linkedVmdk)
+            fileNames = new String[vSphereLinkedCloneExtensions.length + 1];
+        else
+            fileNames = new String[2];
+
+        switch (layoutType) {
+            case VMWARE:
+                assert (vmName != null && !vmName.isEmpty());
+                fileNames[i] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + ".vmdk");
+
+                if (linkedVmdk) {
+                    for (int j=0 ; j < vSphereLinkedCloneExtensions.length; j++) {
+                        fileNames[++i] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, String.format("%s-%s",vmdkName, vSphereLinkedCloneExtensions[j]));
+                    }
+                } else
+                    fileNames[i+1] = getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, vmdkName + "-flat.vmdk");
+                return fileNames;
+
+            case CLOUDSTACK_LEGACY:
+                fileNames[i] = getDeprecatedLegacyDatastorePathFromVmdkFileName(dsMo, vmdkName + ".vmdk");
+
+                if (linkedVmdk) {
+                    for (int j=0 ; j < vSphereLinkedCloneExtensions.length; j++) {
+                        fileNames[++i] = getDeprecatedLegacyDatastorePathFromVmdkFileName(dsMo, String.format("%s-%s",vmdkName, vSphereLinkedCloneExtensions[j]));
+                    }
+                } else
+                    fileNames[i+1] = getDeprecatedLegacyDatastorePathFromVmdkFileName(dsMo, vmdkName + "-flat.vmdk");
+                return fileNames;
 
             default:
                 assert (false);
@@ -121,16 +188,20 @@
             syncVolumeToRootFolder(dcMo, ds, vmdkName, vmName, excludeFolders);
         }
 
-        if (ds.fileExists(vmdkFullCloneModeLegacyPair[1])) {
-            s_logger.info("sync " + vmdkFullCloneModeLegacyPair[1] + "->" + vmdkFullCloneModePair[1]);
+        for (int i=1; i<vmdkFullCloneModeLegacyPair.length; i++) {
+            if (ds.fileExists(vmdkFullCloneModeLegacyPair[i])) {
+                s_logger.info("sync " + vmdkFullCloneModeLegacyPair[i] + "->" + vmdkFullCloneModePair[i]);
 
-            ds.moveDatastoreFile(vmdkFullCloneModeLegacyPair[1], dcMo.getMor(), ds.getMor(), vmdkFullCloneModePair[1], dcMo.getMor(), true);
+                ds.moveDatastoreFile(vmdkFullCloneModeLegacyPair[i], dcMo.getMor(), ds.getMor(), vmdkFullCloneModePair[i], dcMo.getMor(), true);
+            }
         }
 
-        if (ds.fileExists(vmdkLinkedCloneModeLegacyPair[1])) {
-            s_logger.info("sync " + vmdkLinkedCloneModeLegacyPair[1] + "->" + vmdkLinkedCloneModePair[1]);
+        for (int i=1; i<vmdkLinkedCloneModeLegacyPair.length; i++) {
+            if (ds.fileExists(vmdkLinkedCloneModeLegacyPair[i])) {
+                s_logger.info("sync " + vmdkLinkedCloneModeLegacyPair[i] + "->" + vmdkLinkedCloneModePair[i]);
 
-            ds.moveDatastoreFile(vmdkLinkedCloneModeLegacyPair[1], dcMo.getMor(), ds.getMor(), vmdkLinkedCloneModePair[1], dcMo.getMor(), true);
+                ds.moveDatastoreFile(vmdkLinkedCloneModeLegacyPair[i], dcMo.getMor(), ds.getMor(), vmdkLinkedCloneModePair[i], dcMo.getMor(), true);
+            }
         }
 
         if (ds.fileExists(vmdkLinkedCloneModeLegacyPair[0])) {
@@ -157,24 +228,22 @@
         }
 
         DatastoreFile srcDsFile = new DatastoreFile(fileDsFullPath);
-        String companionFilePath = srcDsFile.getCompanionPath(vmdkName + "-flat.vmdk");
-        if (ds.fileExists(companionFilePath)) {
-            String targetPath = getLegacyDatastorePathFromVmdkFileName(ds, vmdkName + "-flat.vmdk");
 
-            s_logger.info("Fixup folder-synchronization. move " + companionFilePath + " -> " + targetPath);
-            ds.moveDatastoreFile(companionFilePath, dcMo.getMor(), ds.getMor(), targetPath, dcMo.getMor(), true);
-        }
+        List<String> vSphereFileExtensions = new ArrayList<>(Arrays.asList(VsphereLinkedCloneExtensions.value().trim().split("\\s*,\\s*")));
+        // add flat file format to the above list
+        vSphereFileExtensions.add("flat.vmdk");
+        for (String linkedCloneExtension :  vSphereFileExtensions) {
+            String companionFilePath = srcDsFile.getCompanionPath(String.format("%s-%s",vmdkName, linkedCloneExtension));
+            if (ds.fileExists(companionFilePath)) {
+                String targetPath = getDatastorePathBaseFolderFromVmdkFileName(ds, String.format("%s-%s",vmdkName, linkedCloneExtension));
 
-        companionFilePath = srcDsFile.getCompanionPath(vmdkName + "-delta.vmdk");
-        if (ds.fileExists(companionFilePath)) {
-            String targetPath = getLegacyDatastorePathFromVmdkFileName(ds, vmdkName + "-delta.vmdk");
-
-            s_logger.info("Fixup folder-synchronization. move " + companionFilePath + " -> " + targetPath);
-            ds.moveDatastoreFile(companionFilePath, dcMo.getMor(), ds.getMor(), targetPath, dcMo.getMor(), true);
+                s_logger.info("Fixup folder-synchronization. move " + companionFilePath + " -> " + targetPath);
+                ds.moveDatastoreFile(companionFilePath, dcMo.getMor(), ds.getMor(), targetPath, dcMo.getMor(), true);
+            }
         }
 
         // move the identity VMDK file the last
-        String targetPath = getLegacyDatastorePathFromVmdkFileName(ds, vmdkName + ".vmdk");
+        String targetPath = getDatastorePathBaseFolderFromVmdkFileName(ds, vmdkName + ".vmdk");
         s_logger.info("Fixup folder-synchronization. move " + fileDsFullPath + " -> " + targetPath);
         ds.moveDatastoreFile(fileDsFullPath, dcMo.getMor(), ds.getMor(), targetPath, dcMo.getMor(), true);
 
@@ -193,24 +262,22 @@
 
                 s_logger.info("Check if we need to move " + fileFullDsPath + " to its root location");
                 DatastoreMO dsMo = new DatastoreMO(dcMo.getContext(), dcMo.findDatastore(file.getDatastoreName()));
-                if (dsMo.getMor() != null) {
-                    DatastoreFile targetFile = new DatastoreFile(file.getDatastoreName(), file.getFileName());
+                if (dsMo.getMor() != null && !dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                    DatastoreFile targetFile = new DatastoreFile(file.getDatastoreName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, file.getFileName());
                     if (!targetFile.getPath().equalsIgnoreCase(file.getPath())) {
                         s_logger.info("Move " + file.getPath() + " -> " + targetFile.getPath());
                         dsMo.moveDatastoreFile(file.getPath(), dcMo.getMor(), dsMo.getMor(), targetFile.getPath(), dcMo.getMor(), true);
 
-                        String pairSrcFilePath = file.getCompanionPath(file.getFileBaseName() + "-flat.vmdk");
-                        String pairTargetFilePath = targetFile.getCompanionPath(file.getFileBaseName() + "-flat.vmdk");
-                        if (dsMo.fileExists(pairSrcFilePath)) {
-                            s_logger.info("Move " + pairSrcFilePath + " -> " + pairTargetFilePath);
-                            dsMo.moveDatastoreFile(pairSrcFilePath, dcMo.getMor(), dsMo.getMor(), pairTargetFilePath, dcMo.getMor(), true);
-                        }
-
-                        pairSrcFilePath = file.getCompanionPath(file.getFileBaseName() + "-delta.vmdk");
-                        pairTargetFilePath = targetFile.getCompanionPath(file.getFileBaseName() + "-delta.vmdk");
-                        if (dsMo.fileExists(pairSrcFilePath)) {
-                            s_logger.info("Move " + pairSrcFilePath + " -> " + pairTargetFilePath);
-                            dsMo.moveDatastoreFile(pairSrcFilePath, dcMo.getMor(), dsMo.getMor(), pairTargetFilePath, dcMo.getMor(), true);
+                        List<String> vSphereFileExtensions = new ArrayList<>(Arrays.asList(VsphereLinkedCloneExtensions.value().trim().split("\\s*,\\s*")));
+                        // add flat file format to the above list
+                        vSphereFileExtensions.add("flat.vmdk");
+                        for (String linkedCloneExtension :  vSphereFileExtensions) {
+                            String pairSrcFilePath = file.getCompanionPath(String.format("%s-%s", file.getFileBaseName(), linkedCloneExtension));
+                            String pairTargetFilePath = targetFile.getCompanionPath(String.format("%s-%s", file.getFileBaseName(), linkedCloneExtension));
+                            if (dsMo.fileExists(pairSrcFilePath)) {
+                                s_logger.info("Move " + pairSrcFilePath + " -> " + pairTargetFilePath);
+                                dsMo.moveDatastoreFile(pairSrcFilePath, dcMo.getMor(), dsMo.getMor(), pairTargetFilePath, dcMo.getMor(), true);
+                            }
                         }
                     }
                 } else {
@@ -287,32 +354,49 @@
             s_logger.warn("Unable to locate VMDK file: " + fileName);
         }
 
-        fileName = volumeName + "-flat.vmdk";
-        fileFullPath = getLegacyDatastorePathFromVmdkFileName(dsMo, fileName);
-        if (!dsMo.fileExists(fileFullPath))
-            fileFullPath = dsMo.searchFileInSubFolders(fileName, false, excludeFolders);
-        if (fileFullPath != null) {
-            dsMo.deleteFile(fileFullPath, dcMo.getMor(), true, excludeFolders);
-        } else {
-            s_logger.warn("Unable to locate VMDK file: " + fileName);
-        }
-
-        fileName = volumeName + "-delta.vmdk";
-        fileFullPath = getLegacyDatastorePathFromVmdkFileName(dsMo, fileName);
-        if (!dsMo.fileExists(fileFullPath))
-            fileFullPath = dsMo.searchFileInSubFolders(fileName, false, excludeFolders);
-        if (fileFullPath != null) {
-            dsMo.deleteFile(fileFullPath, dcMo.getMor(), true, excludeFolders);
-        } else {
-            s_logger.warn("Unable to locate VMDK file: " + fileName);
+        List<String> vSphereFileExtensions = new ArrayList<>(Arrays.asList(VsphereLinkedCloneExtensions.value().trim().split("\\s*,\\s*")));
+        vSphereFileExtensions.add("flat.vmdk");
+        for (String linkedCloneExtension :  vSphereFileExtensions) {
+            fileFullPath = getLegacyDatastorePathFromVmdkFileName(dsMo, String.format("%s-%s", volumeName, linkedCloneExtension));
+            if (!dsMo.fileExists(fileFullPath))
+                fileFullPath = dsMo.searchFileInSubFolders(String.format("%s-%s", volumeName, linkedCloneExtension), false, excludeFolders);
+            if (fileFullPath != null) {
+                dsMo.deleteFile(fileFullPath, dcMo.getMor(), true, excludeFolders);
+            } else {
+                s_logger.warn("Unable to locate VMDK file: " + String.format("%s-%s", volumeName, linkedCloneExtension));
+            }
         }
     }
 
+    //This method call is for the volumes which actually exists
     public static String getLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
+        String vmdkDatastorePath = String.format("[%s] %s/%s", dsMo.getName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, vmdkFileName);
+        if (!dsMo.fileExists(vmdkDatastorePath)) {
+            vmdkDatastorePath = getDeprecatedLegacyDatastorePathFromVmdkFileName(dsMo, vmdkFileName);
+        }
+        return vmdkDatastorePath;
+    }
+
+    //This method call is for the volumes to be created or can also be for volumes already exists
+    public static String getDatastorePathBaseFolderFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
+        return String.format("[%s] %s/%s", dsMo.getName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, vmdkFileName);
+    }
+
+    public static String getDeprecatedLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
         return String.format("[%s] %s", dsMo.getName(), vmdkFileName);
     }
 
     public static String getVmwareDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmName, String vmdkFileName) throws Exception {
         return String.format("[%s] %s/%s", dsMo.getName(), vmName, vmdkFileName);
     }
+
+    @Override
+    public String getConfigComponentName() {
+        return VmwareStorageLayoutHelper.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] {VsphereLinkedCloneExtensions};
+    }
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
index 796db94..1584bd0 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -34,9 +34,15 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+import com.cloud.hypervisor.vmware.mo.VirtualStorageObjectManagerMO;
+import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder;
+import com.vmware.vim25.BaseConfigInfoDiskFileBackingInfo;
+import com.vmware.vim25.VStorageObject;
+import com.vmware.vim25.VirtualDiskType;
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
@@ -154,11 +160,11 @@
     protected Integer _shutdownWaitMs;
     private final Gson _gson;
     private final StorageLayer _storage = new JavaStorageLayer();
-    private Integer _nfsVersion;
+    private String _nfsVersion;
     private static final Random RANDOM = new Random(System.nanoTime());
 
     public VmwareStorageProcessor(VmwareHostService hostService, boolean fullCloneFlag, VmwareStorageMount mountService, Integer timeout, VmwareResource resource,
-                                  Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource, Integer nfsVersion) {
+                                  Integer shutdownWaitMs, PremiumSecondaryStorageResource storageResource, String nfsVersion) {
         this.hostService = hostService;
         _fullCloneFlag = fullCloneFlag;
         this.mountService = mountService;
@@ -394,9 +400,9 @@
 
         // If vmName is not null, then move all VMDK files out of this folder to the root folder and then delete the folder named vmName.
         if (vmName != null) {
-            String workerVmName = hostService.getWorkerName(context, cmd, 0);
+            String workerVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
 
-            VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName);
+            VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName, null);
 
             if (vmMo == null) {
                 throw new Exception("Unable to create a worker VM for volume creation");
@@ -479,9 +485,9 @@
 
     private Pair<VirtualMachineMO, Long> copyTemplateFromSecondaryToPrimary(VmwareHypervisorHost hyperHost, DatastoreMO datastoreMo, String secondaryStorageUrl,
                                                                             String templatePathAtSecondaryStorage, String templateName, String templateUuid,
-                                                                            boolean createSnapshot, Integer nfsVersion) throws Exception {
+                                                                            boolean createSnapshot, String nfsVersion, String configuration) throws Exception {
         s_logger.info("Executing copyTemplateFromSecondaryToPrimary. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " +
-                templatePathAtSecondaryStorage + ", templateName: " + templateName);
+                templatePathAtSecondaryStorage + ", templateName: " + templateName + ", configuration: " + configuration);
 
         String secondaryMountPoint = mountService.getMountPoint(secondaryStorageUrl, nfsVersion);
         s_logger.info("Secondary storage mount point: " + secondaryMountPoint);
@@ -512,11 +518,16 @@
             throw new Exception(msg);
         }
 
-        String vmName = templateUuid;
-        hyperHost.importVmFromOVF(srcFileName, vmName, datastoreMo, "thin");
+        if (datastoreMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+            templateUuid = CustomFieldConstants.CLOUD_UUID + "-" + templateUuid;
+        }
 
-        VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(vmName);
         VmConfigInfo vAppConfig;
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug(String.format("Deploying OVF template %s with configuration %s", templateName, configuration));
+        }
+        hyperHost.importVmFromOVF(srcFileName, templateUuid, datastoreMo, "thin", configuration);
+        VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(templateUuid);
         if (vmMo == null) {
             String msg =
                     "Failed to import OVA template. secondaryStorage: " + secondaryStorageUrl + ", templatePathAtSecondaryStorage: " + templatePathAtSecondaryStorage +
@@ -541,7 +552,7 @@
                 // the same template may be deployed with multiple copies at per-datastore per-host basis,
                 // save the original template name from CloudStack DB as the UUID to associate them.
                 vmMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, templateName);
-                if (vAppConfig == null) {
+                if (vAppConfig == null || (vAppConfig.getProperty().size() == 0)) {
                     vmMo.markAsTemplate();
                 }
             } else {
@@ -572,6 +583,7 @@
         DataTO destData = cmd.getDestTO();
         DataStoreTO destStore = destData.getDataStore();
         DataStoreTO primaryStore = destStore;
+        String configurationId = ((TemplateObjectTO) destData).getDeployAsIsConfiguration();
 
         String secondaryStorageUrl = nfsImageStore.getUrl();
 
@@ -629,51 +641,56 @@
 
         try {
             String storageUuid = managed ? managedStoragePoolName : primaryStore.getUuid();
-            String templateUuidName = deriveTemplateUuidOnHost(hyperHost, storageUuid, templateInfo.second());
+
+            // Generate a new template uuid if the template is marked as deploy-as-is,
+            // as it supports multiple configurations
+            String templateUuidName = template.isDeployAsIs() ?
+                    UUID.randomUUID().toString() :
+                    deriveTemplateUuidOnHost(hyperHost, storageUuid, templateInfo.second());
+
             DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
             VirtualMachineMO templateMo = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templateUuidName), true);
             Pair<VirtualMachineMO, Long> vmInfo = null;
 
+            final ManagedObjectReference morDs;
+            if (managed) {
+                morDs = prepareManagedDatastore(context, hyperHost, null, managedStoragePoolName, storageHost, storagePort,
+                        chapInitiatorUsername, chapInitiatorSecret, chapTargetUsername, chapTargetSecret);
+            }
+            else {
+                morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, storageUuid);
+            }
+            assert (morDs != null);
+            dsMo = new DatastoreMO(context, morDs);
+
             if (templateMo == null) {
                 if (s_logger.isInfoEnabled()) {
                     s_logger.info("Template " + templateInfo.second() + " is not setup yet. Set up template from secondary storage with uuid name: " + templateUuidName);
                 }
 
-                final ManagedObjectReference morDs;
-
-                if (managed) {
-                    morDs = prepareManagedDatastore(context, hyperHost, null, managedStoragePoolName, storageHost, storagePort,
-                                chapInitiatorUsername, chapInitiatorSecret, chapTargetUsername, chapTargetSecret);
-                }
-                else {
-                    morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, storageUuid);
-                }
-
-                assert (morDs != null);
-
-                dsMo = new DatastoreMO(context, morDs);
-
                 if (managed) {
                     vmInfo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(),
-                            managedStoragePoolRootVolumeName, false, _nfsVersion);
+                            managedStoragePoolRootVolumeName, false, _nfsVersion, configurationId);
 
                     VirtualMachineMO vmMo = vmInfo.first();
                     vmMo.unregisterVm();
 
-                    String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, managedStoragePoolRootVolumeName,
+                    String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairManagedDatastorePath(dsMo, managedStoragePoolRootVolumeName,
                             managedStoragePoolRootVolumeName, VmwareStorageLayoutType.VMWARE, false);
-                    String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null,
+                    String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairManagedDatastorePath(dsMo, null,
                             managedStoragePoolRootVolumeName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, false);
 
                     dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
-                    dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
+                    for (int i=1; i<vmwareLayoutFilePair.length; i++) {
+                        dsMo.moveDatastoreFile(vmwareLayoutFilePair[i], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[i], dcMo.getMor(), true);
+                    }
 
                     String folderToDelete = dsMo.getDatastorePath(managedStoragePoolRootVolumeName, true);
                     dsMo.deleteFolder(folderToDelete, dcMo.getMor());
                 }
                 else {
                     vmInfo = copyTemplateFromSecondaryToPrimary(hyperHost, dsMo, secondaryStorageUrl, templateInfo.first(), templateInfo.second(),
-                            templateUuidName, true, _nfsVersion);
+                            templateUuidName, true, _nfsVersion, configurationId);
                 }
             } else {
                 s_logger.info("Template " + templateInfo.second() + " has already been setup, skip the template setup process in primary storage");
@@ -689,9 +706,14 @@
                 }
             }
             else {
-                newTemplate.setPath(templateUuidName);
+                if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                    newTemplate.setPath(CustomFieldConstants.CLOUD_UUID + "-" + templateUuidName);
+                } else {
+                    newTemplate.setPath(templateUuidName);
+                }
             }
 
+            newTemplate.setDeployAsIsConfiguration(configurationId);
             newTemplate.setSize((vmInfo != null)? vmInfo.second() : new Long(0));
 
             return new CopyCmdAnswer(newTemplate);
@@ -788,94 +810,82 @@
             DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
 
             String vmdkName = volume.getName();
-            String vmdkFileBaseName;
-            if (srcStore == null) {
-                // create a root volume for blank VM (created from ISO)
-                String dummyVmName = hostService.getWorkerName(context, cmd, 0);
-
-                try {
-                    vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName);
-                    if (vmMo == null) {
-                        throw new Exception("Unable to create a dummy VM for volume creation");
+            String vmName = volume.getVmName();
+            String vmdkFileBaseName = null;
+            if (template.isDeployAsIs() && volume.getVolumeType() == Volume.Type.ROOT) {
+                VirtualMachineMO existingVm = dcMo.findVm(vmName);
+                if (volume.getDeviceId().equals(0L)) {
+                    if (existingVm != null) {
+                        s_logger.info("Found existing VM " + vmName + " before cloning from template, destroying it");
+                        existingVm.detachAllDisks();
+                        existingVm.destroy();
                     }
-
-                    vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
-                    // we only use the first file in the pair, linked or not will not matter
-                    String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
-                    String volumeDatastorePath = vmdkFilePair[0];
-                    synchronized (this) {
-                        s_logger.info("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath);
-                        VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, vmdkName, dcMo, searchExcludedFolders);
-                        vmMo.createDisk(volumeDatastorePath, (long)(volume.getSize() / (1024L * 1024L)), morDatastore, -1);
-                        vmMo.detachDisk(volumeDatastorePath, false);
-                    }
-                } finally {
-                    s_logger.info("Destroy dummy VM after volume creation");
-                    if (vmMo != null) {
-                        s_logger.warn("Unable to destroy a null VM ManagedObjectReference");
-                        vmMo.detachAllDisks();
-                        vmMo.destroy();
-                    }
+                    s_logger.info("ROOT Volume from deploy-as-is template, cloning template");
+                    cloneVMFromTemplate(hyperHost, template.getPath(), vmName, primaryStore.getUuid());
+                } else {
+                    s_logger.info("ROOT Volume from deploy-as-is template, volume already created at this point");
                 }
             } else {
-                String templatePath = template.getPath();
-                VirtualMachineMO vmTemplate = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templatePath), true);
-                if (vmTemplate == null) {
-                    s_logger.warn("Template host in vSphere is not in connected state, request template reload");
-                    return new CopyCmdAnswer("Template host in vSphere is not in connected state, request template reload");
-                }
+                if (srcStore == null) {
+                    // create a root volume for blank VM (created from ISO)
+                    String dummyVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
 
-                ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
-                ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
-                if (template.getSize() != null){
-                    _fullCloneFlag = volume.getSize() > template.getSize() ? true : _fullCloneFlag;
-                }
-                if (!_fullCloneFlag) {
-                    createVMLinkedClone(vmTemplate, dcMo, vmdkName, morDatastore, morPool);
+                    try {
+                        vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName, null);
+                        if (vmMo == null) {
+                            throw new Exception("Unable to create a dummy VM for volume creation");
+                        }
+
+                        vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
+                        // we only use the first file in the pair, linked or not will not matter
+                        String vmdkFilePair[] = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, null, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true);
+                        String volumeDatastorePath = vmdkFilePair[0];
+                        synchronized (this) {
+                            s_logger.info("Delete file if exists in datastore to clear the way for creating the volume. file: " + volumeDatastorePath);
+                            VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, vmdkName, dcMo, searchExcludedFolders);
+                            vmMo.createDisk(volumeDatastorePath, (long)(volume.getSize() / (1024L * 1024L)), morDatastore, -1, null);
+                            vmMo.detachDisk(volumeDatastorePath, false);
+                        }
+                    } finally {
+                        s_logger.info("Destroy dummy VM after volume creation");
+                        if (vmMo != null) {
+                            s_logger.warn("Unable to destroy a null VM ManagedObjectReference");
+                            vmMo.detachAllDisks();
+                            vmMo.destroy();
+                        }
+                    }
                 } else {
-                    createVMFullClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
+                    String templatePath = template.getPath();
+                    VirtualMachineMO vmTemplate = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templatePath), true);
+                    if (vmTemplate == null) {
+                        s_logger.warn("Template host in vSphere is not in connected state, request template reload");
+                        return new CopyCmdAnswer("Template host in vSphere is not in connected state, request template reload");
+                    }
+                    if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                        vmdkFileBaseName = cloneVMforVvols(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo);
+                    } else {
+                        vmdkFileBaseName = createVMFolderWithVMName(context, hyperHost, template, vmTemplate, volume, dcMo, dsMo, searchExcludedFolders);
+                    }
                 }
-
-                vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmdkName);
-                assert (vmMo != null);
-
-                vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
-                s_logger.info("Move volume out of volume-wrapper VM " + vmdkFileBaseName);
-                String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.VMWARE, !_fullCloneFlag);
-                String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, !_fullCloneFlag);
-
-                dsMo.moveDatastoreFile(vmwareLayoutFilePair[0], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[0], dcMo.getMor(), true);
-                dsMo.moveDatastoreFile(vmwareLayoutFilePair[1], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[1], dcMo.getMor(), true);
-
-                s_logger.info("detach disks from volume-wrapper VM " + vmdkName);
-                vmMo.detachAllDisks();
-
-                s_logger.info("destroy volume-wrapper VM " + vmdkName);
-                vmMo.destroy();
-
-                String srcFile = dsMo.getDatastorePath(vmdkName, true);
-
-                dsMo.deleteFile(srcFile, dcMo.getMor(), true, searchExcludedFolders);
-
-                if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmdkName)) {
-                    dsMo.deleteFolder(srcFile, dcMo.getMor());
-                }
-            }
-            // restoreVM - move the new ROOT disk into corresponding VM folder
-            VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
-            if (restoreVmMo != null) {
-                String vmNameInVcenter = restoreVmMo.getName(); // VM folder name in datastore will be VM's name in vCenter.
-                if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
-                    VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
+                // restoreVM - move the new ROOT disk into corresponding VM folder
+                VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
+                if (restoreVmMo != null) {
+                    if (!dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                        String vmNameInVcenter = restoreVmMo.getName(); // VM folder name in datastore will be VM's name in vCenter.
+                        if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
+                            VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
+                        }
+                    }
                 }
             }
 
             VolumeObjectTO newVol = new VolumeObjectTO();
             newVol.setPath(vmdkFileBaseName);
-            if (template.getSize() != null){
+            if (template.isDeployAsIs()) {
+                newVol.setSize(volume.getSize());
+            } else if (template.getSize() != null) {
                 newVol.setSize(template.getSize());
-            }
-            else {
+            } else {
                 newVol.setSize(volume.getSize());
             }
             return new CopyCmdAnswer(newVol);
@@ -891,8 +901,110 @@
         }
     }
 
+    private String cloneVMforVvols(VmwareContext context, VmwareHypervisorHost hyperHost, TemplateObjectTO template,
+                                   VirtualMachineMO vmTemplate, VolumeObjectTO volume, DatacenterMO dcMo, DatastoreMO dsMo) throws Exception {
+        ManagedObjectReference morDatastore = dsMo.getMor();
+        ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
+        ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
+        if (template.getSize() != null) {
+            _fullCloneFlag = volume.getSize() > template.getSize() ? true : _fullCloneFlag;
+        }
+        String vmName = volume.getVmName();
+        if (volume.getVolumeType() == Volume.Type.DATADISK)
+            vmName = volume.getName();
+        if (!_fullCloneFlag) {
+            createVMLinkedClone(vmTemplate, dcMo, vmName, morDatastore, morPool);
+        } else {
+            createVMFullClone(vmTemplate, dcMo, dsMo, vmName, morDatastore, morPool);
+        }
+
+        VirtualMachineMO vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmName);
+        assert (vmMo != null);
+        String vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
+        if (volume.getVolumeType() == Volume.Type.DATADISK) {
+            s_logger.info("detach disks from volume-wrapper VM " + vmName);
+            vmMo.detachAllDisks();
+            vmMo.destroy();
+        }
+        return vmdkFileBaseName;
+    }
+
+    private String createVMFolderWithVMName(VmwareContext context, VmwareHypervisorHost hyperHost, TemplateObjectTO template,
+                                            VirtualMachineMO vmTemplate, VolumeObjectTO volume, DatacenterMO dcMo, DatastoreMO dsMo,
+                                            String searchExcludedFolders) throws Exception {
+        String vmdkName = volume.getName();
+        try {
+            ManagedObjectReference morDatastore = dsMo.getMor();
+            ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
+            ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
+            if (template.getSize() != null){
+                _fullCloneFlag = volume.getSize() > template.getSize() ? true : _fullCloneFlag;
+            }
+            if (!_fullCloneFlag) {
+                createVMLinkedClone(vmTemplate, dcMo, vmdkName, morDatastore, morPool);
+            } else {
+                createVMFullClone(vmTemplate, dcMo, dsMo, vmdkName, morDatastore, morPool);
+            }
+
+            VirtualMachineMO vmMo = new ClusterMO(context, morCluster).findVmOnHyperHost(vmdkName);
+            assert (vmMo != null);
+
+            String vmdkFileBaseName = vmMo.getVmdkFileBaseNames().get(0);
+            s_logger.info("Move volume out of volume-wrapper VM " + vmdkFileBaseName);
+            String[] vmwareLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.VMWARE, !_fullCloneFlag);
+            String[] legacyCloudStackLayoutFilePair = VmwareStorageLayoutHelper.getVmdkFilePairDatastorePath(dsMo, vmdkName, vmdkFileBaseName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, !_fullCloneFlag);
+
+            for (int i=0; i<vmwareLayoutFilePair.length; i++) {
+                dsMo.moveDatastoreFile(vmwareLayoutFilePair[i], dcMo.getMor(), dsMo.getMor(), legacyCloudStackLayoutFilePair[i], dcMo.getMor(), true);
+            }
+
+            s_logger.info("detach disks from volume-wrapper VM " + vmdkName);
+            vmMo.detachAllDisks();
+
+            s_logger.info("destroy volume-wrapper VM " + vmdkName);
+            vmMo.destroy();
+
+            String srcFile = dsMo.getDatastorePath(vmdkName, true);
+
+            dsMo.deleteFile(srcFile, dcMo.getMor(), true, searchExcludedFolders);
+
+            if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmdkName)) {
+                dsMo.deleteFolder(srcFile, dcMo.getMor());
+            }
+
+            // restoreVM - move the new ROOT disk into corresponding VM folder
+            VirtualMachineMO restoreVmMo = dcMo.findVm(volume.getVmName());
+            if (restoreVmMo != null) {
+                String vmNameInVcenter = restoreVmMo.getName(); // VM folder name in datastore will be VM's name in vCenter.
+                if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmNameInVcenter)) {
+                    VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmNameInVcenter, dsMo, vmdkFileBaseName, searchExcludedFolders);
+                }
+            }
+
+            return vmdkFileBaseName;
+        } finally {
+            // check if volume wrapper VM is cleaned, if not cleanup
+            VirtualMachineMO vmdknamedVM = dcMo.findVm(vmdkName);
+            if (vmdknamedVM != null) {
+                vmdknamedVM.destroy();
+            }
+        }
+    }
+
+    private void createLinkedOrFullClone(TemplateObjectTO template, VolumeObjectTO volume, DatacenterMO dcMo, VirtualMachineMO vmMo, ManagedObjectReference morDatastore,
+                                         DatastoreMO dsMo, String cloneName, ManagedObjectReference morPool) throws Exception {
+        if (template.getSize() != null) {
+            _fullCloneFlag = volume.getSize() > template.getSize() || _fullCloneFlag;
+        }
+        if (!_fullCloneFlag) {
+            createVMLinkedClone(vmMo, dcMo, cloneName, morDatastore, morPool);
+        } else {
+            createVMFullClone(vmMo, dcMo, dsMo, cloneName, morDatastore, morPool);
+        }
+    }
+
     private Pair<String, String> copyVolumeFromSecStorage(VmwareHypervisorHost hyperHost, String srcVolumePath, DatastoreMO dsMo, String secStorageUrl,
-                                                          long wait, Integer nfsVersion) throws Exception {
+                                                          long wait, String nfsVersion) throws Exception {
         String volumeFolder;
         String volumeName;
         String sufix = ".ova";
@@ -905,13 +1017,13 @@
             volumeName = srcVolumePath.substring(index + 1);
         }
 
-        String newVolume = VmwareHelper.getVCenterSafeUuid();
+        String newVolume = VmwareHelper.getVCenterSafeUuid(dsMo);
         restoreVolumeFromSecStorage(hyperHost, dsMo, newVolume, secStorageUrl, volumeFolder, volumeName, wait, nfsVersion);
 
         return new Pair<>(volumeFolder, newVolume);
     }
 
-    private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl, Integer nfsVersion) throws Exception {
+    private String deleteVolumeDirOnSecondaryStorage(String volumeDir, String secStorageUrl, String nfsVersion) throws Exception {
         String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
         String volumeMountRoot = secondaryMountPoint + File.separator + volumeDir;
 
@@ -944,7 +1056,7 @@
             if (morDatastore == null) {
                 URI uri = new URI(destStore.getUrl());
 
-                morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), destStore.getUuid().replace("-", ""));
+                morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), destStore.getUuid().replace("-", ""), true);
 
                 if (morDatastore == null) {
                     throw new Exception("Unable to mount storage pool on host. storeUrl: " + uri.getHost() + ":/" + uri.getPath());
@@ -995,7 +1107,7 @@
             if (vmMo == null || VmwareResource.getVmState(vmMo) == PowerState.PowerOff) {
                 // create a dummy worker vm for attaching the volume
                 DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
-                workerVm = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName);
+                workerVm = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVmName, null);
 
                 if (workerVm == null) {
                     String msg = "Unable to create worker VM to execute CopyVolumeCommand";
@@ -1008,11 +1120,9 @@
                 workerVm.attachDisk(new String[] {datastoreVolumePath}, morDs);
                 vmMo = workerVm;
                 clonedWorkerVMNeeded = false;
-            } else {
-                vmMo.createSnapshot(exportName, "Temporary snapshot for copy-volume command", false, false);
             }
 
-            exportVolumeToSecondaryStorage(vmMo, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1), _nfsVersion, clonedWorkerVMNeeded);
+            exportVolumeToSecondaryStorage(hyperHost.getContext(), vmMo, hyperHost, volumePath, secStorageUrl, destVolumePath, exportName, hostService.getWorkerName(hyperHost.getContext(), cmd, 1, null), _nfsVersion, clonedWorkerVMNeeded);
             return new Pair<>(destVolumePath, exportName);
 
         } finally {
@@ -1043,7 +1153,7 @@
 
             result =
                     copyVolumeToSecStorage(hostService, hyperHost, cmd, vmName, primaryStorage.getUuid(), srcVolume.getPath(), destVolume.getPath(), destStore.getUrl(),
-                            hostService.getWorkerName(context, cmd, 0));
+                            hostService.getWorkerName(context, cmd, 0, null));
             VolumeObjectTO newVolume = new VolumeObjectTO();
             newVolume.setPath(result.first() + File.separator + result.second());
             return new CopyCmdAnswer(newVolume);
@@ -1097,8 +1207,8 @@
         }
     }
 
-    private Ternary<String, Long, Long> createTemplateFromVolume(VirtualMachineMO vmMo, String installPath, long templateId, String templateUniqueName,
-                                                                 String secStorageUrl, String volumePath, String workerVmName, Integer nfsVersion) throws Exception {
+    private Ternary<String, Long, Long> createTemplateFromVolume(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hyperHost, String installPath, long templateId, String templateUniqueName,
+                                                                 String secStorageUrl, String volumePath, String workerVmName, String nfsVersion) throws Exception {
 
         String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
         String installFullPath = secondaryMountPoint + "/" + installPath;
@@ -1124,17 +1234,25 @@
                 throw new Exception(msg);
             }
 
+            DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
+            ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
+            vmMo.createFullCloneWithSpecificDisk(templateUniqueName, dcMo.getVmFolder(), morPool, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), volumeDeviceInfo);
+            clonedVm = dcMo.findVm(templateUniqueName);
+
+            /* FR41 THIS IS OLD way of creating template using snapshot
             if (!vmMo.createSnapshot(templateUniqueName, "Temporary snapshot for template creation", false, false)) {
                 String msg = "Unable to take snapshot for creating template from volume. volume path: " + volumePath;
                 s_logger.error(msg);
                 throw new Exception(msg);
             }
 
+            String hardwareVersion = String.valueOf(vmMo.getVirtualHardwareVersion());
+
             // 4 MB is the minimum requirement for VM memory in VMware
             Pair<VirtualMachineMO, String[]> cloneResult =
-                    vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
+                    vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, volumeDeviceInfo.second(), VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), hardwareVersion);
             clonedVm = cloneResult.first();
-
+            * */
             clonedVm.exportVm(secondaryMountPoint + "/" + installPath, templateUniqueName, false, false);
 
             // Get VMDK filename
@@ -1167,8 +1285,6 @@
                 clonedVm.detachAllDisks();
                 clonedVm.destroy();
             }
-
-            vmMo.removeSnapshot(templateUniqueName, false);
         }
     }
 
@@ -1186,38 +1302,49 @@
         String volumePath = volume.getPath();
 
         String details = null;
-
+        VirtualMachineMO vmMo = null;
+        VirtualMachineMO workerVmMo = null;
         VmwareContext context = hostService.getServiceContext(cmd);
         try {
             VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
-
-            VirtualMachineMO vmMo = hyperHost.findVmOnHyperHost(volume.getVmName());
-            if (vmMo == null) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Unable to find the owner VM for CreatePrivateTemplateFromVolumeCommand on host " + hyperHost.getHyperHostName() +
-                            ", try within datacenter");
+            if (volume.getVmName() == null) {
+                ManagedObjectReference secMorDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, volume.getDataStore().getUuid());
+                DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), secMorDs);
+                workerVmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, "workervm"+volume.getUuid(), null);
+                if (workerVmMo == null) {
+                    throw new Exception("Unable to find created worker VM");
                 }
-                vmMo = hyperHost.findVmOnPeerHyperHost(volume.getVmName());
-
+                vmMo = workerVmMo;
+                String vmdkDataStorePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumePath + ".vmdk");
+                vmMo.attachDisk(new String[] {vmdkDataStorePath}, secMorDs);
+            } else {
+                vmMo = hyperHost.findVmOnHyperHost(volume.getVmName());
                 if (vmMo == null) {
-                    // This means either the volume is on a zone wide storage pool or VM is deleted by external entity.
-                    // Look for the VM in the datacenter.
-                    ManagedObjectReference dcMor = hyperHost.getHyperHostDatacenter();
-                    DatacenterMO dcMo = new DatacenterMO(context, dcMor);
-                    vmMo = dcMo.findVm(volume.getVmName());
-                }
+                    if (s_logger.isDebugEnabled()) {
+                        s_logger.debug("Unable to find the owner VM for CreatePrivateTemplateFromVolumeCommand on host " + hyperHost.getHyperHostName() +
+                                ", try within datacenter");
+                    }
+                    vmMo = hyperHost.findVmOnPeerHyperHost(volume.getVmName());
 
-                if (vmMo == null) {
-                    String msg = "Unable to find the owner VM for volume operation. vm: " + volume.getVmName();
-                    s_logger.error(msg);
-                    throw new Exception(msg);
+                    if (vmMo == null) {
+                        // This means either the volume is on a zone wide storage pool or VM is deleted by external entity.
+                        // Look for the VM in the datacenter.
+                        ManagedObjectReference dcMor = hyperHost.getHyperHostDatacenter();
+                        DatacenterMO dcMo = new DatacenterMO(context, dcMor);
+                        vmMo = dcMo.findVm(volume.getVmName());
+                    }
+
+                    if (vmMo == null) {
+                        String msg = "Unable to find the owner VM for volume operation. vm: " + volume.getVmName();
+                        s_logger.error(msg);
+                        throw new Exception(msg);
+                    }
                 }
             }
 
             Ternary<String, Long, Long> result =
-                    createTemplateFromVolume(vmMo, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath,
-                            hostService.getWorkerName(context, cmd, 0), _nfsVersion);
-
+                    createTemplateFromVolume(context, vmMo, hyperHost, template.getPath(), template.getId(), template.getName(), secondaryStoragePoolURL, volumePath,
+                            hostService.getWorkerName(context, cmd, 0, null), _nfsVersion);
             TemplateObjectTO newTemplate = new TemplateObjectTO();
             newTemplate.setPath(result.first());
             newTemplate.setFormat(ImageFormat.OVA);
@@ -1234,6 +1361,15 @@
 
             details = "create template from volume exception: " + VmwareHelper.getExceptionMessage(e);
             return new CopyCmdAnswer(details);
+        } finally {
+            try {
+                if (volume.getVmName() == null && workerVmMo != null) {
+                    workerVmMo.detachAllDisks();
+                    workerVmMo.destroy();
+                }
+            } catch (Throwable e) {
+                s_logger.error("Failed to destroy worker VM created for detached volume");
+            }
         }
     }
 
@@ -1263,7 +1399,7 @@
     }
 
     private Ternary<String, Long, Long> createTemplateFromSnapshot(String installPath, String templateUniqueName, String secStorageUrl, String snapshotPath,
-                                                                   Long templateId, long wait, Integer nfsVersion) throws Exception {
+                                                                   Long templateId, long wait, String nfsVersion) throws Exception {
         //Snapshot path is decoded in this form: /snapshots/account/volumeId/uuid/uuid
         String backupSSUuid;
         String snapshotFolder;
@@ -1525,12 +1661,11 @@
         VmwareContext context = hostService.getServiceContext(cmd);
         VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
 
-        String workerVMName = hostService.getWorkerName(context, cmd, 0);
-
         ManagedObjectReference dsMor = hyperHost.findDatastoreByName(dsFile.getDatastoreName());
         DatastoreMO dsMo = new DatastoreMO(context, dsMor);
+        String workerVMName = hostService.getWorkerName(context, cmd, 0, dsMo);
 
-        VirtualMachineMO workerVM = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName);
+        VirtualMachineMO workerVM = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
 
         if (workerVM == null) {
             throw new CloudRuntimeException("Failed to find the newly created worker VM: " + workerVMName);
@@ -1668,8 +1803,8 @@
     }
 
     // return Pair<String(divice bus name), String[](disk chain)>
-    private Pair<String, String[]> exportVolumeToSecondaryStorage(VirtualMachineMO vmMo, String volumePath, String secStorageUrl, String secStorageDir,
-                                                                  String exportName, String workerVmName, Integer nfsVersion, boolean clonedWorkerVMNeeded) throws Exception {
+    private Pair<String, String[]> exportVolumeToSecondaryStorage(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hyperHost, String volumePath, String secStorageUrl, String secStorageDir,
+                                                                  String exportName, String workerVmName, String nfsVersion, boolean clonedWorkerVMNeeded) throws Exception {
 
         String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, nfsVersion);
         String exportPath = secondaryMountPoint + "/" + secStorageDir + "/" + exportName;
@@ -1695,17 +1830,25 @@
                 throw new Exception(msg);
             }
 
+            String virtualHardwareVersion = String.valueOf(vmMo.getVirtualHardwareVersion());
+
             String diskDevice = volumeDeviceInfo.second();
             String disks[] = vmMo.getCurrentSnapshotDiskChainDatastorePaths(diskDevice);
             if (clonedWorkerVMNeeded) {
                 // 4 MB is the minimum requirement for VM memory in VMware
-                Pair<VirtualMachineMO, String[]> cloneResult =
-                        vmMo.cloneFromCurrentSnapshot(workerVmName, 0, 4, diskDevice, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()));
-                clonedVm = cloneResult.first();
-                clonedVm.exportVm(exportPath, exportName, false, false);
-            } else {
-                vmMo.exportVm(exportPath, exportName, false, false);
+                DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
+                ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
+                vmMo.createFullCloneWithSpecificDisk(exportName, dcMo.getVmFolder(), morPool, VmwareHelper.getDiskDeviceDatastore(volumeDeviceInfo.first()), volumeDeviceInfo);
+                clonedVm = dcMo.findVm(exportName);
+                if (clonedVm == null) {
+                    String msg = "Failed to clone VM. volume path: " + volumePath;
+                    s_logger.error(msg);
+                    throw new Exception(msg);
+                }
+                vmMo = clonedVm;
             }
+            vmMo.exportVm(exportPath, exportName, false, false);
+
             return new Pair<>(diskDevice, disks);
         } finally {
             if (clonedVm != null) {
@@ -1716,12 +1859,12 @@
     }
 
     // Ternary<String(backup uuid in secondary storage), String(device bus name), String[](original disk chain in the snapshot)>
-    private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VirtualMachineMO vmMo, String installPath, String volumePath, String snapshotUuid,
+    private Ternary<String, String, String[]> backupSnapshotToSecondaryStorage(VmwareContext context, VirtualMachineMO vmMo, VmwareHypervisorHost hypervisorHost, String installPath, String volumePath, String snapshotUuid,
                                                                                String secStorageUrl, String prevSnapshotUuid, String prevBackupUuid, String workerVmName,
-                                                                               Integer nfsVersion) throws Exception {
+                                                                               String nfsVersion) throws Exception {
 
         String backupUuid = UUID.randomUUID().toString();
-        Pair<String, String[]> snapshotInfo = exportVolumeToSecondaryStorage(vmMo, volumePath, secStorageUrl, installPath, backupUuid, workerVmName, nfsVersion, true);
+        Pair<String, String[]> snapshotInfo = exportVolumeToSecondaryStorage(context, vmMo, hypervisorHost, volumePath, secStorageUrl, installPath, backupUuid, workerVmName, nfsVersion, true);
         return new Ternary<>(backupUuid, snapshotInfo.first(), snapshotInfo.second());
     }
 
@@ -1776,27 +1919,23 @@
                 }
                 if(vmMo == null) {
                     dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
-                    workerVMName = hostService.getWorkerName(context, cmd, 0);
-                    vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName);
+                    workerVMName = hostService.getWorkerName(context, cmd, 0, dsMo);
+                    vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, workerVMName, null);
                     if (vmMo == null) {
                         throw new Exception("Failed to find the newly create or relocated VM. vmName: " + workerVMName);
                     }
                     workerVm = vmMo;
                     // attach volume to worker VM
-                    String datastoreVolumePath = dsMo.getDatastorePath(volumePath + ".vmdk");
+                    String datastoreVolumePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumePath + ".vmdk");
                     vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs);
                 } else {
                     s_logger.info("Using owner VM " + vmName + " for snapshot operation");
                     hasOwnerVm = true;
                 }
 
-                if (!vmMo.createSnapshot(snapshotUuid, "Snapshot taken for " + srcSnapshot.getName(), false, false)) {
-                    throw new Exception("Failed to take snapshot " + srcSnapshot.getName() + " on vm: " + vmName);
-                }
-
                 backupResult =
-                        backupSnapshotToSecondaryStorage(vmMo, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl,
-                                prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1), _nfsVersion);
+                        backupSnapshotToSecondaryStorage(context, vmMo, hyperHost, destSnapshot.getPath(), srcSnapshot.getVolume().getPath(), snapshotUuid, secondaryStorageUrl,
+                                prevSnapshotUuid, prevBackupUuid, hostService.getWorkerName(context, cmd, 1, null), _nfsVersion);
                 snapshotBackupUuid = backupResult.first();
 
                 success = (snapshotBackupUuid != null);
@@ -1876,7 +2015,7 @@
                             }
                         }
                     } else {
-                        s_logger.error("Can not find the snapshot we just used ?!");
+                        s_logger.info("No snapshots created to be deleted!");
                     }
                 }
 
@@ -1924,8 +2063,10 @@
                                 String storageHost, int storagePort, Map<String, String> controllerInfo) {
         VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
         DataStoreTO primaryStore = volumeTO.getDataStore();
+        String volumePath = volumeTO.getPath();
+        String storagePolicyId = volumeTO.getvSphereStoragePolicyId();
 
-        String vmdkPath = isManaged ? resource.getVmdkPath(volumeTO.getPath()) : null;
+        String vmdkPath = isManaged ? resource.getVmdkPath(volumePath) : null;
 
         try {
             VmwareContext context = hostService.getServiceContext(null);
@@ -1973,21 +2114,79 @@
 
             DatastoreMO dsMo = new DatastoreMO(context, morDs);
             String datastoreVolumePath;
+            boolean datastoreChangeObserved = false;
+            boolean volumePathChangeObserved = false;
+            String chainInfo = null;
 
             if (isAttach) {
                 if (isManaged) {
                     datastoreVolumePath = dsMo.getDatastorePath((vmdkPath != null ? vmdkPath : dsMo.getName()) + ".vmdk");
                 } else {
-                    datastoreVolumePath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dsMo.getOwnerDatacenter().first(), vmName, dsMo, volumeTO.getPath(), VmwareManager.s_vmwareSearchExcludeFolder.value());
+                    if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                        datastoreVolumePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumePath + ".vmdk");
+                        if (!dsMo.fileExists(datastoreVolumePath)) {
+                            datastoreVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, volumePath + ".vmdk");
+                        }
+                        if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmName) || !dsMo.fileExists(datastoreVolumePath)) {
+                            datastoreVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, volumePath, volumePath + ".vmdk");
+                        }
+                        if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), volumePath) || !dsMo.fileExists(datastoreVolumePath)) {
+                            datastoreVolumePath = dsMo.searchFileInSubFolders(volumePath + ".vmdk", true, null);
+                        }
+
+                    } else {
+                        datastoreVolumePath = VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dsMo.getOwnerDatacenter().first(), vmName, dsMo, volumePath, VmwareManager.s_vmwareSearchExcludeFolder.value());
+                    }
                 }
             } else {
                 if (isManaged) {
                     datastoreVolumePath = dsMo.getDatastorePath((vmdkPath != null ? vmdkPath : dsMo.getName()) + ".vmdk");
                 } else {
-                    datastoreVolumePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumeTO.getPath() + ".vmdk");
+                    String datastoreUUID = primaryStore.getUuid();
+                    if (disk.getDetails().get(DiskTO.PROTOCOL_TYPE) != null && disk.getDetails().get(DiskTO.PROTOCOL_TYPE).equalsIgnoreCase("DatastoreCluster")) {
+                        VirtualMachineDiskInfo matchingExistingDisk = getMatchingExistingDisk(hyperHost, context, vmMo, disk);
+                        VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
+                        if (diskInfoBuilder != null && matchingExistingDisk != null) {
+                            String[] diskChain = matchingExistingDisk.getDiskChain();
+                            assert (diskChain.length > 0);
+                            DatastoreFile file = new DatastoreFile(diskChain[0]);
+                            if (!file.getFileBaseName().equalsIgnoreCase(volumePath)) {
+                                if (s_logger.isInfoEnabled())
+                                    s_logger.info("Detected disk-chain top file change on volume: " + volumeTO.getId() + " " + volumePath + " -> " + file.getFileBaseName());
+                                volumePathChangeObserved = true;
+                                volumePath = file.getFileBaseName();
+                                volumeTO.setPath(volumePath);
+                                chainInfo = _gson.toJson(matchingExistingDisk);
+                            }
 
+                            DatastoreMO diskDatastoreMofromVM = getDiskDatastoreMofromVM(hyperHost, context, vmMo, disk, diskInfoBuilder);
+                            if (diskDatastoreMofromVM != null) {
+                                String actualPoolUuid = diskDatastoreMofromVM.getCustomFieldValue(CustomFieldConstants.CLOUD_UUID);
+                                if (!actualPoolUuid.equalsIgnoreCase(primaryStore.getUuid())) {
+                                    s_logger.warn(String.format("Volume %s found to be in a different storage pool %s", volumePath, actualPoolUuid));
+                                    datastoreChangeObserved = true;
+                                    datastoreUUID = actualPoolUuid;
+                                    chainInfo = _gson.toJson(matchingExistingDisk);
+                                }
+                            }
+                        }
+                    }
+                    if (storagePort == DEFAULT_NFS_PORT) {
+                        morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, isManaged ? VmwareResource.getDatastoreName(diskUuid) : datastoreUUID);
+                    } else {
+                        morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, isManaged ? VmwareResource.getDatastoreName(iScsiName) : datastoreUUID);
+                    }
+                    dsMo = new DatastoreMO(context, morDs);
+
+                    datastoreVolumePath = VmwareStorageLayoutHelper.getLegacyDatastorePathFromVmdkFileName(dsMo, volumePath + ".vmdk");
                     if (!dsMo.fileExists(datastoreVolumePath)) {
-                        datastoreVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, volumeTO.getPath() + ".vmdk");
+                        datastoreVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmName, volumePath + ".vmdk");
+                    }
+                    if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmName) || !dsMo.fileExists(datastoreVolumePath)) {
+                        datastoreVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, volumePath, volumePath + ".vmdk");
+                    }
+                    if (!dsMo.folderExists(String.format("[%s]", dsMo.getName()), volumePath) || !dsMo.fileExists(datastoreVolumePath)) {
+                        datastoreVolumePath = dsMo.searchFileInSubFolders(volumePath + ".vmdk", true, null);
                     }
                 }
             }
@@ -2007,7 +2206,10 @@
                     diskController = vmMo.getRecommendedDiskController(null);
                 }
 
-                vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs, diskController);
+                vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs, diskController, storagePolicyId);
+                VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
+                VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(volumePath, dsMo.getName());
+                chainInfo = _gson.toJson(diskInfo);
 
                 if (isManaged) {
                     expandVirtualDisk(vmMo, datastoreVolumePath, volumeTO.getSize());
@@ -2019,10 +2221,22 @@
                 if (isManaged) {
                     handleDatastoreAndVmdkDetachManaged(cmd, diskUuid, iScsiName, storageHost, storagePort);
                 } else {
-                    VmwareStorageLayoutHelper.syncVolumeToRootFolder(dsMo.getOwnerDatacenter().first(), dsMo, volumeTO.getPath(), vmName, VmwareManager.s_vmwareSearchExcludeFolder.value());
+                    if (!dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                        VmwareStorageLayoutHelper.syncVolumeToRootFolder(dsMo.getOwnerDatacenter().first(), dsMo, volumePath, vmName, VmwareManager.s_vmwareSearchExcludeFolder.value());
+                    }
+                }
+                if (datastoreChangeObserved) {
+                    answer.setContextParam("datastoreName", dsMo.getCustomFieldValue(CustomFieldConstants.CLOUD_UUID));
+                }
+
+                if (volumePathChangeObserved) {
+                    answer.setContextParam("volumePath", volumePath);
                 }
             }
 
+            if (chainInfo != null && !chainInfo.isEmpty())
+                answer.setContextParam("chainInfo", chainInfo);
+
             return answer;
         } catch (Throwable e) {
             if (e instanceof RemoteException) {
@@ -2034,18 +2248,104 @@
             String msg = "";
 
             if (isAttach) {
-                msg += "Failed to attach volume: " + e.getMessage();
+                msg += "Failed to attach volume: ";
             }
             else {
-                msg += "Failed to detach volume: " + e.getMessage();
+                msg += "Failed to detach volume: ";
             }
 
-            s_logger.error(msg, e);
+            s_logger.error(msg + e.getMessage(), e);
 
-            return new AttachAnswer(msg);
+            // Sending empty error message - too many duplicate errors in UI
+            return new AttachAnswer("");
         }
     }
 
+    private VirtualMachineDiskInfo getMatchingExistingDisk(VmwareHypervisorHost hyperHost, VmwareContext context, VirtualMachineMO vmMo, DiskTO vol)
+            throws Exception {
+        VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
+        if (diskInfoBuilder != null) {
+            VolumeObjectTO volume = (VolumeObjectTO) vol.getData();
+
+            ManagedObjectReference morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, volume.getDataStore().getUuid());
+            DatastoreMO dsMo = new DatastoreMO(context, morDs);
+
+            String dsName = dsMo.getName();
+
+            String diskBackingFileBaseName = volume.getPath();
+
+            VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(diskBackingFileBaseName, dsName);
+            if (diskInfo != null) {
+                s_logger.info("Found existing disk info from volume path: " + volume.getPath());
+                return diskInfo;
+            } else {
+                String chainInfo = volume.getChainInfo();
+                if (chainInfo != null) {
+                    VirtualMachineDiskInfo infoInChain = _gson.fromJson(chainInfo, VirtualMachineDiskInfo.class);
+                    if (infoInChain != null) {
+                        String[] disks = infoInChain.getDiskChain();
+                        if (disks.length > 0) {
+                            for (String diskPath : disks) {
+                                DatastoreFile file = new DatastoreFile(diskPath);
+                                diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName(), dsName);
+                                if (diskInfo != null) {
+                                    s_logger.info("Found existing disk from chain info: " + diskPath);
+                                    return diskInfo;
+                                }
+                            }
+                        }
+
+                        if (diskInfo == null) {
+                            diskInfo = diskInfoBuilder.getDiskInfoByDeviceBusName(infoInChain.getDiskDeviceBusName());
+                            if (diskInfo != null) {
+                                s_logger.info("Found existing disk from from chain device bus information: " + infoInChain.getDiskDeviceBusName());
+                                return diskInfo;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private DatastoreMO getDiskDatastoreMofromVM(VmwareHypervisorHost hyperHost, VmwareContext context,
+                                                 VirtualMachineMO vmMo, DiskTO disk, VirtualMachineDiskInfoBuilder diskInfoBuilder) throws Exception {
+        assert (hyperHost != null) && (context != null);
+        List<Pair<Integer, ManagedObjectReference>> diskDatastores = vmMo.getAllDiskDatastores();
+        VolumeObjectTO volume = (VolumeObjectTO) disk.getData();
+        String diskBackingFileBaseName = volume.getPath();
+        for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores) {
+            DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), diskDatastore.second());
+            String dsName = dsMo.getName();
+
+            VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(diskBackingFileBaseName, dsName);
+            if (diskInfo != null) {
+                s_logger.info("Found existing disk info from volume path: " + volume.getPath());
+                return dsMo;
+            } else {
+                String chainInfo = volume.getChainInfo();
+                if (chainInfo != null) {
+                    VirtualMachineDiskInfo infoInChain = _gson.fromJson(chainInfo, VirtualMachineDiskInfo.class);
+                    if (infoInChain != null) {
+                        String[] disks = infoInChain.getDiskChain();
+                        if (disks.length > 0) {
+                            for (String diskPath : disks) {
+                                DatastoreFile file = new DatastoreFile(diskPath);
+                                diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(file.getFileBaseName(), dsName);
+                                if (diskInfo != null) {
+                                    s_logger.info("Found existing disk from chain info: " + diskPath);
+                                    return dsMo;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     private boolean expandVirtualDisk(VirtualMachineMO vmMo, String datastoreVolumePath, long currentSizeInBytes) throws Exception {
         long currentSizeInKB = currentSizeInBytes / 1024;
 
@@ -2102,7 +2402,7 @@
         URI uri = new URI(storeUrl);
 
         VmwareHypervisorHost hyperHost = hostService.getHyperHost(hostService.getServiceContext(null), null);
-        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""));
+        ManagedObjectReference morDatastore = hyperHost.mountDatastore(false, uri.getHost(), 0, uri.getPath(), storeName.replace("-", ""), false);
 
         if (morDatastore == null) {
             throw new Exception("Unable to mount secondary storage on host. storeUrl: " + storeUrl);
@@ -2210,6 +2510,7 @@
 
         VolumeObjectTO volume = (VolumeObjectTO)cmd.getData();
         DataStoreTO primaryStore = volume.getDataStore();
+        String vSphereStoragePolicyId = volume.getvSphereStoragePolicyId();
 
         try {
             VmwareContext context = hostService.getServiceContext(null);
@@ -2226,38 +2527,50 @@
             VirtualMachineMO vmMo = null;
             String volumeUuid = UUID.randomUUID().toString().replace("-", "");
 
-            String volumeDatastorePath = dsMo.getDatastorePath(volumeUuid + ".vmdk");
-            String dummyVmName = hostService.getWorkerName(context, cmd, 0);
+            String volumeDatastorePath = VmwareStorageLayoutHelper.getDatastorePathBaseFolderFromVmdkFileName(dsMo, volumeUuid + ".vmdk");
+            VolumeObjectTO newVol = new VolumeObjectTO();
+
             try {
-                s_logger.info("Create worker VM " + dummyVmName);
-                vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName);
-                if (vmMo == null) {
-                    throw new Exception("Unable to create a dummy VM for volume creation");
-                }
-
-                synchronized (this) {
-                    try {
-                        vmMo.createDisk(volumeDatastorePath, (int)(volume.getSize() / (1024L * 1024L)), morDatastore, vmMo.getScsiDeviceControllerKey());
-                        vmMo.detachDisk(volumeDatastorePath, false);
-                    }
-                    catch (Exception e) {
-                        s_logger.error("Deleting file " + volumeDatastorePath + " due to error: " + e.getMessage());
-                        VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, volumeUuid, dcMo, VmwareManager.s_vmwareSearchExcludeFolder.value());
-                        throw new CloudRuntimeException("Unable to create volume due to: " + e.getMessage());
-                    }
-                }
-
-                VolumeObjectTO newVol = new VolumeObjectTO();
-                newVol.setPath(volumeUuid);
+                VirtualStorageObjectManagerMO vStorageObjectManagerMO = new VirtualStorageObjectManagerMO(context);
+                VStorageObject virtualDisk = vStorageObjectManagerMO.createDisk(morDatastore, VirtualDiskType.THIN, volume.getSize(), volumeDatastorePath, volumeUuid);
+                DatastoreFile file = new DatastoreFile(((BaseConfigInfoDiskFileBackingInfo)virtualDisk.getConfig().getBacking()).getFilePath());
+                newVol.setPath(file.getFileBaseName());
                 newVol.setSize(volume.getSize());
-                return new CreateObjectAnswer(newVol);
-            } finally {
-                s_logger.info("Destroy dummy VM after volume creation");
-                if (vmMo != null) {
-                    vmMo.detachAllDisks();
-                    vmMo.destroy();
+            } catch (Exception e) {
+                s_logger.debug("Create disk using vStorageObject manager failed due to exception " + e.getMessage() + ", retying using worker VM");
+                String dummyVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
+                try {
+                    s_logger.info("Create worker VM " + dummyVmName);
+                    vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName, null);
+                    if (vmMo == null) {
+                        throw new Exception("Unable to create a dummy VM for volume creation");
+                    }
+
+                    synchronized (this) {
+                        try {
+                            vmMo.createDisk(volumeDatastorePath, (int)(volume.getSize() / (1024L * 1024L)), morDatastore, vmMo.getScsiDeviceControllerKey(), vSphereStoragePolicyId);
+                            vmMo.detachDisk(volumeDatastorePath, false);
+                        }
+                        catch (Exception e1) {
+                            s_logger.error("Deleting file " + volumeDatastorePath + " due to error: " + e1.getMessage());
+                            VmwareStorageLayoutHelper.deleteVolumeVmdkFiles(dsMo, volumeUuid, dcMo, VmwareManager.s_vmwareSearchExcludeFolder.value());
+                            throw new CloudRuntimeException("Unable to create volume due to: " + e1.getMessage());
+                        }
+                    }
+
+                    newVol = new VolumeObjectTO();
+                    newVol.setPath(volumeUuid);
+                    newVol.setSize(volume.getSize());
+                    return new CreateObjectAnswer(newVol);
+                } finally {
+                    s_logger.info("Destroy dummy VM after volume creation");
+                    if (vmMo != null) {
+                        vmMo.detachAllDisks();
+                        vmMo.destroy();
+                    }
                 }
             }
+            return new CreateObjectAnswer(newVol);
         } catch (Throwable e) {
             if (e instanceof RemoteException) {
                 s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
@@ -2340,9 +2653,14 @@
 
                     List<Map<String, String>> dynamicTargetsToRemove = null;
 
+                    boolean deployAsIs = vol.isDeployAsIs();
                     if (vmMo != null) {
                         if (s_logger.isInfoEnabled()) {
-                            s_logger.info("Destroy root volume and VM itself. vmName " + vmName);
+                            if (deployAsIs) {
+                                s_logger.info("Destroying root volume " + vol.getPath() + " of deploy-as-is VM " + vmName);
+                            } else {
+                                s_logger.info("Destroy root volume and VM itself. vmName " + vmName);
+                            }
                         }
 
                         VirtualMachineDiskInfo diskInfo = null;
@@ -2365,13 +2683,12 @@
                         List<VirtualDisk> virtualDisks = vmMo.getVirtualDisks();
                         List<String> managedDatastoreNames = getManagedDatastoreNamesFromVirtualDisks(virtualDisks);
 
-                        List<String> detachedDisks = vmMo.detachAllDisksExcept(vol.getPath(), diskInfo != null ? diskInfo.getDiskDeviceBusName() : null);
-                        VmwareStorageLayoutHelper.moveVolumeToRootFolder(new DatacenterMO(context, morDc), detachedDisks);
-
                         // let vmMo.destroy to delete volume for us
                         // vmMo.tearDownDevices(new Class<?>[] { VirtualDisk.class, VirtualEthernetCard.class });
 
                         if (isManaged) {
+                            List<String> detachedDisks = vmMo.detachAllDisksExcept(vol.getPath(), diskInfo != null ? diskInfo.getDiskDeviceBusName() : null);
+                            VmwareStorageLayoutHelper.moveVolumeToRootFolder(new DatacenterMO(context, morDc), detachedDisks);
                             vmMo.unregisterVm();
                         }
                         else {
@@ -2390,6 +2707,24 @@
                                 }
                             }
                         }
+                    } else if (deployAsIs) {
+                        if (s_logger.isInfoEnabled()) {
+                            s_logger.info("Destroying root volume " + vol.getPath() + " of already removed deploy-as-is VM " + vmName);
+                        }
+                        // The disks of the deploy-as-is VM have been detached from the VM and moved to root folder
+                        String deployAsIsRootDiskPath = dsMo.searchFileInSubFolders(vol.getPath() + VmwareResource.VMDK_EXTENSION,
+                                true, null);
+                        if (StringUtils.isNotBlank(deployAsIsRootDiskPath)) {
+                            if (s_logger.isInfoEnabled()) {
+                                s_logger.info("Removing disk " + deployAsIsRootDiskPath);
+                            }
+                            dsMo.deleteFile(deployAsIsRootDiskPath, morDc, true);
+                            String deltaFilePath = dsMo.searchFileInSubFolders(vol.getPath() + "-delta" + VmwareResource.VMDK_EXTENSION,
+                                    true, null);
+                            if (StringUtils.isNotBlank(deltaFilePath)) {
+                                dsMo.deleteFile(deltaFilePath, morDc, true);
+                            }
+                        }
                     }
 
                     /*
@@ -2911,17 +3246,17 @@
         VmwareContext context = hostService.getServiceContext(null);
         VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, null);
 
-        String dummyVmName = hostService.getWorkerName(context, cmd, 0);
+        String dummyVmName = hostService.getWorkerName(context, cmd, 0, dsMo);
 
-        VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName);
+        VirtualMachineMO vmMo = HypervisorHostHelper.createWorkerVM(hyperHost, dsMo, dummyVmName, null);
 
         if (vmMo == null) {
             throw new Exception("Unable to create a dummy VM for volume creation");
         }
 
-        Long volumeSizeToUse = volumeSize < dsMo.getSummary().getFreeSpace() ? volumeSize : dsMo.getSummary().getFreeSpace();
+        Long volumeSizeToUse = volumeSize < dsMo.getDatastoreSummary().getFreeSpace() ? volumeSize : dsMo.getDatastoreSummary().getFreeSpace();
 
-        vmMo.createDisk(vmdkDatastorePath, getMBsFromBytes(volumeSizeToUse), dsMo.getMor(), vmMo.getScsiDeviceControllerKey());
+        vmMo.createDisk(vmdkDatastorePath, getMBsFromBytes(volumeSizeToUse), dsMo.getMor(), vmMo.getScsiDeviceControllerKey(), null);
         vmMo.detachDisk(vmdkDatastorePath, false);
         vmMo.destroy();
     }
@@ -3382,7 +3717,7 @@
     }
 
     private Long restoreVolumeFromSecStorage(VmwareHypervisorHost hyperHost, DatastoreMO primaryDsMo, String newVolumeName, String secStorageUrl, String secStorageDir,
-                                             String backupName, long wait, Integer nfsVersion) throws Exception {
+                                             String backupName, long wait, String nfsVersion) throws Exception {
 
         String secondaryMountPoint = mountService.getMountPoint(secStorageUrl, null);
         String srcOVAFileName;
@@ -3429,13 +3764,15 @@
 
         VirtualMachineMO clonedVm = null;
         try {
-            hyperHost.importVmFromOVF(srcOVFFileName, newVolumeName, primaryDsMo, "thin");
+            hyperHost.importVmFromOVF(srcOVFFileName, newVolumeName, primaryDsMo, "thin", null);
             clonedVm = hyperHost.findVmOnHyperHost(newVolumeName);
             if (clonedVm == null) {
                 throw new Exception("Unable to create container VM for volume creation");
             }
 
-            clonedVm.moveAllVmDiskFiles(primaryDsMo, "", false);
+            if(!primaryDsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+                clonedVm.moveAllVmDiskFiles(primaryDsMo, HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, false);
+            }
             clonedVm.detachAllDisks();
             return _storage.getSize(srcOVFFileName);
         } finally {
@@ -3467,7 +3804,6 @@
         String backupPath = backedUpSnapshotUuid.substring(0, index);
         backedUpSnapshotUuid = backedUpSnapshotUuid.substring(index + 1);
         String details;
-        String newVolumeName = VmwareHelper.getVCenterSafeUuid();
 
         VmwareContext context = hostService.getServiceContext(cmd);
         try {
@@ -3479,13 +3815,14 @@
                 throw new Exception(msg);
             }
 
+            DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs);
+            String newVolumeName = VmwareHelper.getVCenterSafeUuid(primaryDsMo);
             // strip off the extension since restoreVolumeFromSecStorage internally will append suffix there.
             if (backedUpSnapshotUuid.endsWith(".ova")){
                 backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ova", "");
             } else if (backedUpSnapshotUuid.endsWith(".ovf")){
                 backedUpSnapshotUuid = backedUpSnapshotUuid.replace(".ovf", "");
             }
-            DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs);
             restoreVolumeFromSecStorage(hyperHost, primaryDsMo, newVolumeName, secondaryStorageUrl, backupPath, backedUpSnapshotUuid, (long)cmd.getWait() * 1000, _nfsVersion);
 
             VolumeObjectTO newVol = new VolumeObjectTO();
@@ -3540,7 +3877,7 @@
         return DiskControllerType.lsilogic.toString();
     }
 
-    void setNfsVersion(Integer nfsVersion){
+    void setNfsVersion(String nfsVersion){
         this._nfsVersion = nfsVersion;
         s_logger.debug("VmwareProcessor instance now using NFS version: " + nfsVersion);
     }
@@ -3556,7 +3893,74 @@
     }
 
     @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        String primaryStorageNameLabel = cmd.getStoragePool().getUuid();
+        String storagePolicyId = cmd.getStoragePolicyId();
+        VmwareContext context = hostService.getServiceContext(cmd);
+        try {
+            VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
+            ManagedObjectReference morPrimaryDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStorageNameLabel);
+            if (morPrimaryDs == null) {
+                String msg = "Unable to find datastore: " + primaryStorageNameLabel;
+                s_logger.error(msg);
+                throw new Exception(msg);
+            }
+
+            DatastoreMO primaryDsMo = new DatastoreMO(hyperHost.getContext(), morPrimaryDs);
+            boolean isDatastoreStoragePolicyComplaint = primaryDsMo.isDatastoreStoragePolicyComplaint(storagePolicyId);
+
+            String failedMessage = String.format("DataStore %s is not complaince with storage policy id %s", primaryStorageNameLabel, storagePolicyId);
+            if (!isDatastoreStoragePolicyComplaint)
+                return new Answer(cmd, isDatastoreStoragePolicyComplaint, failedMessage);
+            else
+                return new Answer(cmd, isDatastoreStoragePolicyComplaint, null);
+        } catch (Throwable e) {
+            if (e instanceof RemoteException) {
+                hostService.invalidateServiceContext(context);
+            }
+            String details = String.format("Exception while checking if datastore %s is storage policy %s complaince : %s", primaryStorageNameLabel, storagePolicyId,  VmwareHelper.getExceptionMessage(e));
+            s_logger.error(details, e);
+            return new Answer(cmd, false, details);
+        }
+    }
+
+    @Override
     public Answer copyVolumeFromPrimaryToPrimary(CopyCommand cmd) {
         return null;
     }
+
+    /**
+     * Return the cloned VM from the template
+     */
+    public VirtualMachineMO cloneVMFromTemplate(VmwareHypervisorHost hyperHost, String templateName, String cloneName, String templatePrimaryStoreUuid) {
+        try {
+            VmwareContext context = hyperHost.getContext();
+            DatacenterMO dcMo = new DatacenterMO(context, hyperHost.getHyperHostDatacenter());
+            VirtualMachineMO templateMo = dcMo.findVm(templateName);
+            if (templateMo == null) {
+                throw new CloudRuntimeException(String.format("Unable to find template %s in vSphere", templateName));
+            }
+            ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, templatePrimaryStoreUuid);
+            DatastoreMO dsMo = new DatastoreMO(context, morDatastore);
+            ManagedObjectReference morPool = hyperHost.getHyperHostOwnerResourcePool();
+            if (morDatastore == null) {
+                throw new CloudRuntimeException("Unable to find datastore in vSphere");
+            }
+            s_logger.info("Cloning VM " + cloneName + " from template " + templateName + " into datastore " + templatePrimaryStoreUuid);
+            if (!_fullCloneFlag) {
+                createVMLinkedClone(templateMo, dcMo, cloneName, morDatastore, morPool);
+            } else {
+                createVMFullClone(templateMo, dcMo, dsMo, cloneName, morDatastore, morPool);
+            }
+            VirtualMachineMO vm = dcMo.findVm(cloneName);
+            if (vm == null) {
+                throw new CloudRuntimeException("Unable to get the cloned VM " + cloneName);
+            }
+            return vm;
+        } catch (Throwable e) {
+            String msg = "Error cloning VM from template in primary storage: %s" + e.getMessage();
+            s_logger.error(msg, e);
+            throw new CloudRuntimeException(msg, e);
+        }
+    }
 }
diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java
index 02ae2fe..122a034 100644
--- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java
+++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java
@@ -47,7 +47,7 @@
     private static final Logger s_logger = Logger.getLogger(VmwareStorageSubsystemCommandHandler.class);
     private VmwareStorageManager storageManager;
     private PremiumSecondaryStorageResource storageResource;
-    private Integer _nfsVersion;
+    private String _nfsVersion;
 
     public PremiumSecondaryStorageResource getStorageResource() {
         return storageResource;
@@ -65,7 +65,7 @@
         this.storageManager = storageManager;
     }
 
-    public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, Integer nfsVersion) {
+    public VmwareStorageSubsystemCommandHandler(StorageProcessor processor, String nfsVersion) {
         super(processor);
         this._nfsVersion = nfsVersion;
     }
@@ -75,7 +75,7 @@
         for (VmwareStorageProcessorConfigurableFields key : params.keySet()){
             switch (key){
             case NFS_VERSION:
-                Integer nfsVersion = (Integer) params.get(key);
+                String nfsVersion = (String) params.get(key);
                 processor.setNfsVersion(nfsVersion);
                 this._nfsVersion = nfsVersion;
                 break;
diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java
new file mode 100644
index 0000000..ea5bacf
--- /dev/null
+++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ImportVsphereStoragePoliciesCmd.java
@@ -0,0 +1,111 @@
+// 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.api.command.admin.zone;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.VsphereStoragePolicy;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.hypervisor.vmware.VmwareDatacenterService;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+@APICommand(name = ImportVsphereStoragePoliciesCmd.APINAME, description = "Import vSphere storage policies",
+        responseObject = VsphereStoragePoliciesResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin})
+public class ImportVsphereStoragePoliciesCmd extends BaseCmd {
+
+    public static final Logger LOGGER = Logger.getLogger(ImportVsphereStoragePoliciesCmd.class.getName());
+
+    public static final String APINAME = "importVsphereStoragePolicies";
+
+    @Inject
+    public VmwareDatacenterService _vmwareDatacenterService;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
+            description = "ID of the zone")
+    private Long zoneId;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final DataCenter dataCenter = _resourceService.getZone(getZoneId());
+        if (dataCenter == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId());
+        }
+
+        List<? extends VsphereStoragePolicy> storagePolicies = _vmwareDatacenterService.importVsphereStoragePolicies(this);
+        final ListResponse<VsphereStoragePoliciesResponse> responseList = new ListResponse<>();
+        final List<VsphereStoragePoliciesResponse> storagePoliciesResponseList = new ArrayList<>();
+        for (VsphereStoragePolicy storagePolicy : storagePolicies) {
+            final VsphereStoragePoliciesResponse storagePoliciesResponse = new VsphereStoragePoliciesResponse();
+            storagePoliciesResponse.setZoneId(dataCenter.getUuid());
+            storagePoliciesResponse.setId(storagePolicy.getUuid());
+            storagePoliciesResponse.setName(storagePolicy.getName());
+            storagePoliciesResponse.setPolicyId(storagePolicy.getPolicyId());
+            storagePoliciesResponse.setDescription(storagePolicy.getDescription());
+            storagePoliciesResponse.setObjectName("StoragePolicy");
+
+            storagePoliciesResponseList.add(storagePoliciesResponse);
+        }
+        responseList.setResponses(storagePoliciesResponseList);
+        responseList.setResponseName(getCommandName());
+        setResponseObject(responseList);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+}
diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java
new file mode 100644
index 0000000..90e8e88
--- /dev/null
+++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePoliciesCmd.java
@@ -0,0 +1,109 @@
+// 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.api.command.admin.zone;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.VsphereStoragePolicy;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.NetworkRuleConflictException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.hypervisor.vmware.VmwareDatacenterService;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+@APICommand(name = ListVsphereStoragePoliciesCmd.APINAME, description = "List vSphere storage policies",
+        responseObject = VsphereStoragePoliciesResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin})
+public class ListVsphereStoragePoliciesCmd extends BaseCmd {
+
+    public static final Logger LOGGER = Logger.getLogger(ListVsphereStoragePoliciesCmd.class.getName());
+
+    public static final String APINAME = "listVsphereStoragePolicies";
+
+    @Inject
+    public VmwareDatacenterService _vmwareDatacenterService;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
+            description = "ID of the zone")
+    private Long zoneId;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final DataCenter dataCenter = _resourceService.getZone(getZoneId());
+        if (dataCenter == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId());
+        }
+
+        List<? extends VsphereStoragePolicy> storagePolicies = _vmwareDatacenterService.listVsphereStoragePolicies(this);
+        final ListResponse<VsphereStoragePoliciesResponse> responseList = new ListResponse<>();
+        final List<VsphereStoragePoliciesResponse> storagePoliciesResponseList = new ArrayList<>();
+        for (VsphereStoragePolicy storagePolicy : storagePolicies) {
+            final VsphereStoragePoliciesResponse storagePoliciesResponse = new VsphereStoragePoliciesResponse();
+            storagePoliciesResponse.setZoneId(dataCenter.getUuid());
+            storagePoliciesResponse.setId(storagePolicy.getUuid());
+            storagePoliciesResponse.setName(storagePolicy.getName());
+            storagePoliciesResponse.setPolicyId(storagePolicy.getPolicyId());
+            storagePoliciesResponse.setDescription(storagePolicy.getDescription());
+            storagePoliciesResponse.setObjectName("StoragePolicy");
+
+            storagePoliciesResponseList.add(storagePoliciesResponse);
+        }
+        responseList.setResponses(storagePoliciesResponseList);
+        responseList.setResponseName(getCommandName());
+        setResponseObject(responseList);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+}
diff --git a/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java
new file mode 100644
index 0000000..ee7146a
--- /dev/null
+++ b/plugins/hypervisors/vmware/src/main/java/org/apache/cloudstack/api/command/admin/zone/ListVsphereStoragePolicyCompatiblePoolsCmd.java
@@ -0,0 +1,97 @@
+// 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.api.command.admin.zone;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.hypervisor.vmware.VmwareDatacenterService;
+import com.cloud.storage.StoragePool;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
+import org.apache.cloudstack.api.response.VsphereStoragePoliciesResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+@APICommand(name = ListVsphereStoragePolicyCompatiblePoolsCmd.APINAME, description = "List storage pools compatible with a vSphere storage policy",
+        responseObject = StoragePoolResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin})
+public class ListVsphereStoragePolicyCompatiblePoolsCmd extends BaseListCmd {
+    public static final String APINAME = "listVsphereStoragePolicyCompatiblePools";
+
+    @Inject
+    public VmwareDatacenterService vmwareDatacenterService;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
+            description = "ID of the zone")
+    private Long zoneId;
+
+    @Parameter(name = ApiConstants.POLICY_ID, type = BaseCmd.CommandType.UUID, entityType = VsphereStoragePoliciesResponse.class,
+            description = "ID of the storage policy")
+    private Long policyId;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() throws ServerApiException, ConcurrentOperationException {
+        List<StoragePool> pools = vmwareDatacenterService.listVsphereStoragePolicyCompatibleStoragePools(this);
+        ListResponse<StoragePoolResponse> response = new ListResponse<>();
+        List<StoragePoolResponse> poolResponses = new ArrayList<>();
+        for (StoragePool pool : pools) {
+            StoragePoolResponse poolResponse = _responseGenerator.createStoragePoolForMigrationResponse(pool);
+            poolResponse.setObjectName("storagepool");
+            poolResponses.add(poolResponse);
+        }
+        response.setResponses(poolResponses);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    public Long getPolicyId() {
+        return policyId;
+    }
+}
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 2463e75..5a7b4c4 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
@@ -132,7 +132,10 @@
         StoragePool srcPool = storagePoolDao.findById(srcStore.getId());
         DataStore destStore = destData.getDataStore();
         StoragePool destPool = storagePoolDao.findById(destStore.getId());
-        return srcPool.getClusterId().equals(destPool.getClusterId());
+        if (srcPool.getClusterId() != null && destPool.getClusterId() != null) {
+            return srcPool.getClusterId().equals(destPool.getClusterId());
+        }
+        return false;
     }
 
     /**
diff --git a/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/core/spring-vmware-core-context.xml b/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/core/spring-vmware-core-context.xml
index 3af2d1a..a2d8314 100644
--- a/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/core/spring-vmware-core-context.xml
+++ b/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/core/spring-vmware-core-context.xml
@@ -37,7 +37,6 @@
         class="com.cloud.hypervisor.vmware.dao.VmwareDatacenterZoneMapDaoImpl" />
     <bean id="LegacyZoneDaoImpl" class="com.cloud.hypervisor.vmware.dao.LegacyZoneDaoImpl" />
 
-
     <bean id="ciscoNexusVSMDeviceDaoImpl" class="com.cloud.network.dao.CiscoNexusVSMDeviceDaoImpl" />
 
 </beans>
\ No newline at end of file
diff --git a/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/vmware-compute/spring-vmware-compute-context.xml b/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/vmware-compute/spring-vmware-compute-context.xml
index 4b9fb85..ec1031d 100644
--- a/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/vmware-compute/spring-vmware-compute-context.xml
+++ b/plugins/hypervisors/vmware/src/main/resources/META-INF/cloudstack/vmware-compute/spring-vmware-compute-context.xml
@@ -35,6 +35,8 @@
         <property name="name" value="VMwareGuru" />
     </bean>
 
+    <bean id="VmwareVmImplementer" class="com.cloud.hypervisor.guru.VmwareVmImplementer"/>
+
     <bean id="VmwareInvestigator" class="com.cloud.ha.VmwareInvestigator">
         <property name="name" value="VMwareInvestigator" />
     </bean>
diff --git a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VMwareGuruTest.java b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VMwareGuruTest.java
deleted file mode 100755
index 77042fd..0000000
--- a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VMwareGuruTest.java
+++ /dev/null
@@ -1,157 +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.
-package com.cloud.hypervisor.guru;
-
-import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.inOrder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cloudstack.framework.config.ConfigKey;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InOrder;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.support.AnnotationConfigContextLoader;
-
-import com.cloud.agent.api.to.VirtualMachineTO;
-import com.cloud.vm.VmDetailConstants;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ConfigKey.class, VMwareGuru.class})
-@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
-public class VMwareGuruTest {
-
-    @Mock(name="VmwareEnableNestedVirtualization")
-    private ConfigKey<Boolean> vmwareNestedVirtualizationConfig;
-
-    @Mock(name="VmwareEnableNestedVirtualizationPerVM")
-    private ConfigKey<Boolean> vmwareNestedVirtualizationPerVmConfig;
-
-    @Spy
-    @InjectMocks
-    private VMwareGuru _guru = new VMwareGuru();
-
-    @Mock
-    VirtualMachineTO vmTO;
-
-    private Map<String,String> vmDetails = new HashMap<String, String>();
-
-    @Before
-    public void testSetUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    private void setConfigValues(Boolean globalNV, Boolean globalNVPVM, String localNV){
-        when(vmwareNestedVirtualizationConfig.value()).thenReturn(globalNV);
-        when(vmwareNestedVirtualizationPerVmConfig.value()).thenReturn(globalNVPVM);
-        if (localNV != null) {
-            vmDetails.put(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG, localNV);
-        }
-    }
-
-    private void executeAndVerifyTest(Boolean globalNV, Boolean globalNVPVM, String localNV, Boolean expectedResult){
-        Boolean result = _guru.shouldEnableNestedVirtualization(globalNV, globalNVPVM, localNV);
-        assertEquals(expectedResult, result);
-    }
-
-    @Test
-    public void testConfigureNestedVirtualization(){
-        setConfigValues(true, true, null);
-        _guru.configureNestedVirtualization(vmDetails, vmTO);
-
-        InOrder inOrder = inOrder(_guru, vmTO);
-        inOrder.verify(_guru).shouldEnableNestedVirtualization(true, true, null);
-        inOrder.verify(vmTO).setDetails(vmDetails);
-
-        assertTrue(vmDetails.containsKey(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG));
-        assertEquals(Boolean.toString(true), vmDetails.get(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG));
-
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVNull(){
-        executeAndVerifyTest(true, true, null, true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVTrue(){
-        executeAndVerifyTest(true, true, "true", true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVFalse(){
-        executeAndVerifyTest(true, true, "false", false);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVNull(){
-        executeAndVerifyTest(true, false, null, true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVTrue(){
-        executeAndVerifyTest(true, false, "true", true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVNFalse(){
-        executeAndVerifyTest(true, false, "false", true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVNull(){
-        executeAndVerifyTest(false, true, null, false);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVTrue(){
-        executeAndVerifyTest(false, true, "true", true);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVFalse(){
-        executeAndVerifyTest(false, true, "false", false);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVNull(){
-        executeAndVerifyTest(false, false, null, false);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVTrue(){
-        executeAndVerifyTest(false, false, "true", false);
-    }
-
-    @Test
-    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVFalse(){
-        executeAndVerifyTest(false, false, "false", false);
-    }
-
-}
diff --git a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VmwareVmImplementerTest.java b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VmwareVmImplementerTest.java
new file mode 100755
index 0000000..309eb6d
--- /dev/null
+++ b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/guru/VmwareVmImplementerTest.java
@@ -0,0 +1,148 @@
+// 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.guru;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.verify;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cloudstack.framework.config.ConfigKey;
+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.MockitoAnnotations;
+import org.mockito.Spy;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+
+import com.cloud.agent.api.to.VirtualMachineTO;
+import com.cloud.vm.VmDetailConstants;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ConfigKey.class, VmwareVmImplementer.class})
+@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
+public class VmwareVmImplementerTest {
+
+    @Spy
+    @InjectMocks
+    private VmwareVmImplementer implementer = new VmwareVmImplementer();
+
+    @Mock
+    VirtualMachineTO vmTO;
+
+    private Map<String,String> vmDetails = new HashMap<String, String>();
+
+    @Before
+    public void testSetUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    private void setConfigValues(Boolean globalNV, Boolean globalNVPVM, String localNV){
+        implementer.setGlobalNestedVirtualisationEnabled(globalNV.booleanValue());
+        implementer.setGlobalNestedVPerVMEnabled(globalNVPVM.booleanValue());
+        if (localNV != null) {
+            vmDetails.put(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG, localNV);
+        }
+    }
+
+    private void executeAndVerifyTest(Boolean globalNV, Boolean globalNVPVM, String localNV, Boolean expectedResult){
+        Boolean result = implementer.shouldEnableNestedVirtualization(globalNV, globalNVPVM, localNV);
+        assertEquals(expectedResult, result);
+    }
+
+    @Test
+    public void testConfigureNestedVirtualization(){
+        setConfigValues(true, true, null);
+        implementer.configureNestedVirtualization(vmDetails, vmTO);
+        Map<String,String> spyDetails = Mockito.spy(vmDetails);
+
+        verify(implementer).shouldEnableNestedVirtualization(true, true, null);
+
+        assertTrue(vmDetails.containsKey(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG));
+        assertEquals(Boolean.toString(true), vmDetails.get(VmDetailConstants.NESTED_VIRTUALIZATION_FLAG));
+
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVNull(){
+        executeAndVerifyTest(true, true, null, true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVTrue(){
+        executeAndVerifyTest(true, true, "true", true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMTrueLocalNVFalse(){
+        executeAndVerifyTest(true, true, "false", false);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVNull(){
+        executeAndVerifyTest(true, false, null, true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVTrue(){
+        executeAndVerifyTest(true, false, "true", true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVTrueGlobalNVPVMFalseLocalNVNFalse(){
+        executeAndVerifyTest(true, false, "false", true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVNull(){
+        executeAndVerifyTest(false, true, null, false);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVTrue(){
+        executeAndVerifyTest(false, true, "true", true);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMTrueLocalNVFalse(){
+        executeAndVerifyTest(false, true, "false", false);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVNull(){
+        executeAndVerifyTest(false, false, null, false);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVTrue(){
+        executeAndVerifyTest(false, false, "true", false);
+    }
+
+    @Test
+    public void testEnableNestedVirtualizationCaseGlobalNVFalseGlobalNVPVMFalseLocalNVFalse(){
+        executeAndVerifyTest(false, false, "false", false);
+    }
+
+}
diff --git a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
index eb04139..95387db 100644
--- a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
+++ b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/VmwareDatacenterApiUnitTest.java
@@ -31,6 +31,7 @@
 import com.cloud.dc.dao.ClusterVSMMapDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.HostPodDao;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
 import com.cloud.event.dao.EventDao;
 import com.cloud.exception.DiscoveryException;
 import com.cloud.exception.InvalidParameterValueException;
@@ -38,6 +39,7 @@
 import com.cloud.host.dao.HostDao;
 import com.cloud.host.dao.HostDetailsDao;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.HypervisorGuruManager;
 import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
 import com.cloud.hypervisor.vmware.dao.LegacyZoneDao;
 import com.cloud.hypervisor.vmware.dao.VmwareDatacenterDao;
@@ -50,6 +52,7 @@
 import com.cloud.secstorage.CommandExecLogDao;
 import com.cloud.server.ConfigurationServer;
 import com.cloud.storage.ImageStoreDetailsUtil;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.dao.VMTemplatePoolDao;
 import com.cloud.template.TemplateManager;
 import com.cloud.user.Account;
@@ -486,6 +489,21 @@
             return Mockito.mock(TemplateManager.class);
         }
 
+        @Bean
+        public VsphereStoragePolicyDao vsphereStoragePolicyDao() {
+            return Mockito.mock(VsphereStoragePolicyDao.class);
+        }
+
+        @Bean
+        public StorageManager storageManager() {
+            return Mockito.mock(StorageManager.class);
+        }
+
+        @Bean
+        public HypervisorGuruManager hypervisorGuruManager() {
+            return Mockito.mock(HypervisorGuruManager.class);
+        }
+
         public static class Library implements TypeFilter {
 
             @Override
diff --git a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImplTest.java b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImplTest.java
index 8aa92f7..80677e9 100644
--- a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImplTest.java
+++ b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/manager/VmwareManagerImplTest.java
@@ -105,6 +105,7 @@
         Mockito.lenient().doReturn(hostDetails).when(hostDetailsDao).findDetails(Mockito.anyLong());
         Mockito.doReturn("some-old-guid").when(hostDetails).get("guid");
         Mockito.doReturn(hostDetails).when(hostDetailsDao).findDetails(Mockito.anyLong());
+        Mockito.doReturn(null).when(vmwareManager).importVsphereStoragePoliciesInternal(Mockito.anyLong(), Mockito.anyLong());
 
         final VmwareDatacenter vmwareDatacenter = vmwareManager.updateVmwareDatacenter(updateVmwareDcCmd);
 
diff --git a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
index 7cebaf1..3dc8d01 100644
--- a/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
+++ b/plugins/hypervisors/vmware/src/test/java/com/cloud/hypervisor/vmware/resource/VmwareResourceTest.java
@@ -157,8 +157,8 @@
     CopyCommand storageCmd;
     EnumMap<VmwareStorageProcessorConfigurableFields, Object> params = new EnumMap<VmwareStorageProcessorConfigurableFields,Object>(VmwareStorageProcessorConfigurableFields.class);
 
-    private static final Integer NFS_VERSION = Integer.valueOf(3);
-    private static final Integer NFS_VERSION_NOT_PRESENT = null;
+    private static final String NFS_VERSION = "3";
+    private static final String NFS_VERSION_NOT_PRESENT = null;
     private static final long VRAM_MEMORY_SIZE = 131072l;
     private static final long VIDEO_CARD_MEMORY_SIZE = 65536l;
     private static final Boolean FULL_CLONE_FLAG = true;
diff --git a/plugins/hypervisors/xenserver/pom.xml b/plugins/hypervisors/xenserver/pom.xml
index 26a7fa2..1fc65df 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java
index fd95da2..23af5f2 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/discoverer/XcpServerDiscoverer.java
@@ -369,7 +369,7 @@
             s_logger.warn("Unable to resolve the host name", e);
             return null;
         } catch (Exception e) {
-            s_logger.debug("other exceptions: " + e.toString(), e);
+            s_logger.warn("other exceptions: " + e.toString(), e);
             return null;
         }
         return resources;
@@ -423,7 +423,7 @@
             }
         } else if (prodBrand.equals("XCP_Kronos")) {
             return new XcpOssResource();
-        } else if (prodBrand.equals("XenServer") || prodBrand.equals("XCP-ng")) {
+        } else if (prodBrand.equals("XenServer") || prodBrand.equals("XCP-ng") || prodBrand.equals("Citrix Hypervisor")) {
             final String[] items = prodVersion.split("\\.");
             if ((Integer.parseInt(items[0]) > 6) ||
                     (Integer.parseInt(items[0]) == 6 && Integer.parseInt(items[1]) >= 4)) {
@@ -434,7 +434,7 @@
             }
         }
         String msg =
-                "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6,  XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.1.0, 6.2.0, >6.4.0 but this one is " +
+                "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6,  XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.1.0, 6.2.0, >6.4.0, Citrix Hypervisor > 8.0.0 but this one is " +
                         prodBrand + " " + prodVersion;
         s_logger.warn(msg);
         throw new RuntimeException(msg);
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
index 87adcb3..a26bcc4 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java
@@ -164,6 +164,8 @@
 import com.xensource.xenapi.VM;
 import com.xensource.xenapi.XenAPIObject;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 /**
  * CitrixResourceBase encapsulates the calls to the XenServer Xapi process to
  * perform the required functionalities for CloudStack.
@@ -1061,29 +1063,46 @@
         }
     }
 
+    public SR findPatchIsoSR(final Connection conn) throws XmlRpcException, XenAPIException {
+        Set<SR> srs = SR.getByNameLabel(conn, "XenServer Tools");
+        if (srs.size() != 1) {
+            s_logger.debug("Failed to find SR by name 'XenServer Tools', will try to find 'XCP-ng Tools' SR");
+            srs = SR.getByNameLabel(conn, "XCP-ng Tools");
+        }
+        if (srs.size() != 1) {
+            s_logger.debug("Failed to find SR by name 'XenServer Tools' or 'XCP-ng Tools', will try to find 'Citrix Hypervisor' SR");
+            srs = SR.getByNameLabel(conn, "Citrix Hypervisor Tools");
+        }
+        if (srs.size() != 1) {
+            throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools or XCP-ng Tools or Citrix Hypervisor Tools");
+        }
+        final SR sr = srs.iterator().next();
+        sr.scan(conn);
+        return sr;
+    }
+
+    public VDI findPatchIsoVDI(final Connection conn, final SR sr) throws XmlRpcException, XenAPIException {
+        if (sr == null) {
+            return null;
+        }
+        final SR.Record srr = sr.getRecord(conn);
+        for (final VDI vdi : srr.VDIs) {
+            final VDI.Record vdir = vdi.getRecord(conn);
+            if (vdir.nameLabel.contains("systemvm.iso")) {
+                return vdi;
+            }
+        }
+        return null;
+    }
+
     public VBD createPatchVbd(final Connection conn, final String vmName, final VM vm) throws XmlRpcException, XenAPIException {
 
         if (_host.getSystemvmisouuid() == null) {
-            Set<SR> srs = SR.getByNameLabel(conn, "XenServer Tools");
-            if (srs.size() != 1) {
-                s_logger.debug("Failed to find SR by name 'XenServer Tools', will try to find 'XCP-ng Tools' SR");
-                srs = SR.getByNameLabel(conn, "XCP-ng Tools");
-                if (srs.size() != 1) {
-                    throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools");
-                }
-            }
-            final SR sr = srs.iterator().next();
-            sr.scan(conn);
-
-            final SR.Record srr = sr.getRecord(conn);
-
+            final SR sr = findPatchIsoSR(conn);
             if (_host.getSystemvmisouuid() == null) {
-                for (final VDI vdi : srr.VDIs) {
-                    final VDI.Record vdir = vdi.getRecord(conn);
-                    if (vdir.nameLabel.contains("systemvm.iso")) {
-                        _host.setSystemvmisouuid(vdir.uuid);
-                        break;
-                    }
+                final VDI vdi = findPatchIsoVDI(conn, sr);
+                if (vdi != null) {
+                    _host.setSystemvmisouuid(vdi.getRecord(conn).uuid);
                 }
             }
             if (_host.getSystemvmisouuid() == null) {
@@ -1483,24 +1502,33 @@
         return result;
     }
 
-    public void destroyPatchVbd(final Connection conn, final String vmName) throws XmlRpcException, XenAPIException {
-        try {
-            if (!vmName.startsWith("r-") && !vmName.startsWith("s-") && !vmName.startsWith("v-")) {
-                return;
-            }
-            final Set<VM> vms = VM.getByNameLabel(conn, vmName);
-            for (final VM vm : vms) {
+    public void destroyPatchVbd(final Connection conn, final Set<VM> vms) throws XmlRpcException, XenAPIException {
+        final SR sr = findPatchIsoSR(conn);
+        final VDI patchVDI = findPatchIsoVDI(conn, sr);
+        for (final VM vm : vms) {
+            final String vmName = vm.getNameLabel(conn);
+            try {
+                if (!vmName.startsWith("r-") && !vmName.startsWith("s-") && !vmName.startsWith("v-")) {
+                    return;
+                }
                 final Set<VBD> vbds = vm.getVBDs(conn);
                 for (final VBD vbd : vbds) {
-                    if (vbd.getType(conn) == Types.VbdType.CD) {
-                        vbd.eject(conn);
+                    if (Types.VbdType.CD.equals(vbd.getType(conn))) {
+                        if (!vbd.getEmpty(conn)) {
+                            vbd.eject(conn);
+                        }
+                        // Workaround for any file descriptor caching issue
+                        if (patchVDI != null) {
+                            vbd.insert(conn, patchVDI);
+                            vbd.eject(conn);
+                        }
                         vbd.destroy(conn);
                         break;
                     }
                 }
+            } catch (final Exception e) {
+                s_logger.debug("Cannot destroy CD-ROM device for VM " + vmName + " due to " + e.toString(), e);
             }
-        } catch (final Exception e) {
-            s_logger.debug("Cannot destory CD-ROM device for VM " + vmName + " due to " + e.toString(), e);
         }
     }
 
@@ -1799,7 +1827,7 @@
             cmd.setDom0MinMemory(dom0Ram);
 
             if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Total Ram: " + ram + " dom0 Ram: " + dom0Ram);
+                s_logger.debug("Total Ram: " + toHumanReadableSize(ram) + " dom0 Ram: " + toHumanReadableSize(dom0Ram));
             }
 
             PIF pif = PIF.getByUuid(conn, _host.getPrivatePif());
@@ -3088,7 +3116,7 @@
         // stability
         if (dynamicMaxRam > staticMax) { // XS contraint that dynamic max <=
             // static max
-            s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max ");
+            s_logger.warn("dynamic max " + toHumanReadableSize(dynamicMaxRam) + " cant be greater than static max " + toHumanReadableSize(staticMax) + ", this can lead to stability issues. Setting static max as much as dynamic max ");
             return dynamicMaxRam;
         }
         return staticMax;
@@ -3102,7 +3130,7 @@
 
         if (dynamicMinRam < recommendedValue) { // XS contraint that dynamic min
             // > static min
-            s_logger.warn("Vm is set to dynamixMin " + dynamicMinRam + " less than the recommended static min " + recommendedValue + ", could lead to stability issues");
+            s_logger.warn("Vm ram is set to dynamic min " + toHumanReadableSize(dynamicMinRam) + " and is less than the recommended static min " + toHumanReadableSize(recommendedValue) + ", this could lead to stability issues");
         }
         return dynamicMinRam;
     }
@@ -3329,13 +3357,13 @@
                                 VDI memoryVDI = vmsnap.getSuspendVDI(conn);
                                 if (!isRefNull(memoryVDI)) {
                                     size = size + memoryVDI.getPhysicalUtilisation(conn);
-                                    s_logger.debug("memoryVDI size :" + size);
+                                    s_logger.debug("memoryVDI size :" + toHumanReadableSize(size));
                                     String parentUuid = memoryVDI.getSmConfig(conn).get("vhd-parent");
                                     VDI pMemoryVDI = VDI.getByUuid(conn, parentUuid);
                                     if (!isRefNull(pMemoryVDI)) {
                                         size = size + pMemoryVDI.getPhysicalUtilisation(conn);
                                     }
-                                    s_logger.debug("memoryVDI size+parent :" + size);
+                                    s_logger.debug("memoryVDI size+parent :" + toHumanReadableSize(size));
                                 }
                             }
                         } catch (Exception e) {
@@ -4215,7 +4243,7 @@
             final long vdiVirtualSize = vdi.getVirtualSize(conn);
 
             if (vdiVirtualSize != volumeSize) {
-                s_logger.info("Resizing the data disk (VDI) from vdiVirtualSize: " + vdiVirtualSize + " to volumeSize: " + volumeSize);
+                s_logger.info("Resizing the data disk (VDI) from vdiVirtualSize: " + toHumanReadableSize(vdiVirtualSize) + " to volumeSize: " + toHumanReadableSize(volumeSize));
 
                 try {
                     vdi.resize(conn, volumeSize);
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
index 9343620..b6f326a 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XcpServerResource.java
@@ -24,6 +24,8 @@
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VM;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class XcpServerResource extends CitrixResourceBase {
 
     private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
@@ -87,8 +89,8 @@
     protected void setMemory(final Connection conn, final VM vm, final long minMemsize, final long maxMemsize) throws XmlRpcException, XenAPIException {
         //setMemoryLimits(staticMin, staticMax, dynamicMin, dynamicMax)
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Memory Limits for VM [" + vm.getNameLabel(conn) + "[staticMin:" + mem_32m + ", staticMax:" + maxMemsize + ", dynamicMin: " + minMemsize +
-                    ", dynamicMax:" + maxMemsize + "]]");
+           s_logger.debug("Memory Limits for VM [" + vm.getNameLabel(conn) + "[staticMin:" + toHumanReadableSize(mem_32m) + ", staticMax:" + toHumanReadableSize(maxMemsize) + ", dynamicMin: " + toHumanReadableSize(minMemsize) +
+                    ", dynamicMax:" + toHumanReadableSize(maxMemsize) + "]]");
         }
         vm.setMemoryLimits(conn, mem_32m, maxMemsize, minMemsize, maxMemsize);
     }
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
index e4c07d4..d530969 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java
@@ -18,6 +18,7 @@
  */
 package com.cloud.hypervisor.xenserver.resource;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
 import static com.cloud.utils.ReflectUtil.flattenProperties;
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -34,6 +35,7 @@
 import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand;
 import org.apache.cloudstack.storage.command.AttachAnswer;
 import org.apache.cloudstack.storage.command.AttachCommand;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.CreateObjectAnswer;
@@ -215,6 +217,12 @@
     }
 
     @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        s_logger.info("'CheckDataStoreStoragePolicyComplainceCommand' not applicable used for XenServerStorageProcessor");
+        return new Answer(cmd,false,"Not applicable used for XenServerStorageProcessor");
+    }
+
+    @Override
     public AttachAnswer attachIso(final AttachCommand cmd) {
         final DiskTO disk = cmd.getDisk();
         final DataTO data = disk.getData();
@@ -827,10 +835,10 @@
             vdi = tmpltvdi.createClone(conn, new HashMap<String, String>());
             Long virtualSize  = vdi.getVirtualSize(conn);
             if (volume.getSize() > virtualSize) {
-                s_logger.debug("Overriding provided template's size with new size " + volume.getSize() + " for volume: " + volume.getName());
+                s_logger.debug("Overriding provided template's size with new size " + toHumanReadableSize(volume.getSize()) + " for volume: " + volume.getName());
                 vdi.resize(conn, volume.getSize());
             } else {
-                s_logger.debug("Using templates disk size of " + virtualSize + " for volume: " + volume.getName() + " since size passed was " + volume.getSize());
+                s_logger.debug("Using templates disk size of " + toHumanReadableSize(virtualSize) + " for volume: " + volume.getName() + " since size passed was " + toHumanReadableSize(volume.getSize()));
             }
             vdi.setNameLabel(conn, volume.getName());
 
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
index a2c8b70..9b54e0b 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/Xenserver625StorageProcessor.java
@@ -27,6 +27,7 @@
 import java.util.Set;
 import java.util.UUID;
 
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
@@ -62,6 +63,8 @@
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VDI;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class Xenserver625StorageProcessor extends XenServerStorageProcessor {
     private static final Logger s_logger = Logger.getLogger(XenServerStorageProcessor.class);
 
@@ -665,7 +668,7 @@
                 newSnapshot.setParentSnapshotPath(prevBackupUuid);
             }
             s_logger.info("New snapshot details: " + newSnapshot.toString());
-            s_logger.info("New snapshot physical utilization: " + physicalSize);
+            s_logger.info("New snapshot physical utilization: " + toHumanReadableSize(physicalSize));
 
             return new CopyCmdAnswer(newSnapshot);
         } catch (final Exception e) {
@@ -911,6 +914,12 @@
     }
 
     @Override
+    public Answer CheckDataStoreStoragePolicyComplaince(CheckDataStoreStoragePolicyComplainceCommand cmd) {
+        s_logger.info("'CheckDataStoreStoragePolicyComplainceCommand' not applicable used for XenServerStorageProcessor");
+        return new Answer(cmd,false,"Not applicable used for XenServerStorageProcessor");
+    }
+
+    @Override
     public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) {
         final Connection conn = hypervisorResource.getConnection();
         final VolumeObjectTO srcVolume = (VolumeObjectTO)cmd.getSrcTO();
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java
index 4079f92..78359f0 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixReadyCommandWrapper.java
@@ -54,9 +54,7 @@
         try {
             final Host host = Host.getByUuid(conn, citrixResourceBase.getHost().getUuid());
             final Set<VM> vms = host.getResidentVMs(conn);
-            for (final VM vm : vms) {
-                citrixResourceBase.destroyPatchVbd(conn, vm.getNameLabel(conn));
-            }
+            citrixResourceBase.destroyPatchVbd(conn, vms);
         } catch (final Exception e) {
         }
         try {
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java
index a4a19dd..e7505cc 100755
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixResizeVolumeCommandWrapper.java
@@ -36,6 +36,8 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @ResourceWrapper(handles =  ResizeVolumeCommand.class)
 public final class CitrixResizeVolumeCommandWrapper extends CommandWrapper<ResizeVolumeCommand, Answer, CitrixResourceBase> {
     private static final Logger s_logger = Logger.getLogger(CitrixResizeVolumeCommandWrapper.class);
@@ -50,7 +52,7 @@
         try {
 
             if (command.getCurrentSize() >= newSize) {
-                s_logger.info("No need to resize volume: " + volId +", current size " + command.getCurrentSize() + " is same as  new size " + newSize);
+                s_logger.info("No need to resize volume: " + volId +", current size " + toHumanReadableSize(command.getCurrentSize()) + " is same as  new size " + toHumanReadableSize(newSize));
                 return new ResizeVolumeAnswer(command, true, "success", newSize);
             }
             if (command.isManaged()) {
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixSetupCommandWrapper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixSetupCommandWrapper.java
index 76f0e2a..2d2fb5d 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixSetupCommandWrapper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixSetupCommandWrapper.java
@@ -77,7 +77,6 @@
 
             }
 
-
             final boolean r = citrixResourceBase.launchHeartBeat(conn);
             if (!r) {
                 return null;
diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/XenServerUtilitiesHelper.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/XenServerUtilitiesHelper.java
index 51fc817..56b16cc 100644
--- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/XenServerUtilitiesHelper.java
+++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/XenServerUtilitiesHelper.java
@@ -45,6 +45,6 @@
     }
 
     public static boolean isXenServerToolsSR(final String label) {
-        return !Strings.isNullOrEmpty(label) && (label.startsWith("XenServer Tools") || label.startsWith("XCP-ng Tools"));
+        return !Strings.isNullOrEmpty(label) && (label.startsWith("XenServer Tools") || label.startsWith("Citrix Hypervisor Tools") || label.startsWith("XCP-ng Tools"));
     }
-}
\ No newline at end of file
+}
diff --git a/plugins/integrations/cloudian/pom.xml b/plugins/integrations/cloudian/pom.xml
index 137fecb..7cc53d4 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 f6f8280..a85dd1d 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 a6538c9..8f124f1 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
@@ -22,6 +22,7 @@
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,8 @@
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.SecurityChecker;
 import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiConstants.VMDetails;
+import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.kubernetes.cluster.CreateKubernetesClusterCmd;
 import org.apache.cloudstack.api.command.user.kubernetes.cluster.DeleteKubernetesClusterCmd;
 import org.apache.cloudstack.api.command.user.kubernetes.cluster.GetKubernetesClusterConfigCmd;
@@ -49,6 +52,7 @@
 import org.apache.cloudstack.api.response.KubernetesClusterConfigResponse;
 import org.apache.cloudstack.api.response.KubernetesClusterResponse;
 import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -61,7 +65,9 @@
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.query.dao.NetworkOfferingJoinDao;
 import com.cloud.api.query.dao.TemplateJoinDao;
+import com.cloud.api.query.dao.UserVmJoinDao;
 import com.cloud.api.query.vo.NetworkOfferingJoinVO;
+import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.capacity.CapacityManager;
 import com.cloud.dc.ClusterDetailsDao;
 import com.cloud.dc.ClusterDetailsVO;
@@ -103,6 +109,8 @@
 import com.cloud.network.Networks;
 import com.cloud.network.PhysicalNetwork;
 import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
 import com.cloud.network.dao.NetworkDao;
 import com.cloud.network.dao.NetworkVO;
 import com.cloud.network.dao.PhysicalNetworkDao;
@@ -144,13 +152,13 @@
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
 import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
 import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 import com.google.common.base.Strings;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class KubernetesClusterManagerImpl extends ManagerBase implements KubernetesClusterService {
 
     private static final Logger LOGGER = Logger.getLogger(KubernetesClusterManagerImpl.class);
@@ -192,7 +200,7 @@
     @Inject
     protected VMInstanceDao vmInstanceDao;
     @Inject
-    protected UserVmDao userVmDao;
+    protected UserVmJoinDao userVmJoinDao;
     @Inject
     protected NetworkOfferingDao networkOfferingDao;
     @Inject
@@ -210,6 +218,8 @@
     @Inject
     protected NetworkDao networkDao;
     @Inject
+    protected IPAddressDao ipAddressDao;
+    @Inject
     protected CapacityManager capacityManager;
     @Inject
     protected ResourceManager resourceManager;
@@ -535,7 +545,7 @@
                 }
                 if (capacityManager.checkIfHostHasCapacity(h.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) {
                     if (LOGGER.isDebugEnabled()) {
-                        LOGGER.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%d", h.getUuid(), cpu_requested * reserved, ram_requested * reserved));
+                        LOGGER.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%s", h.getUuid(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved)));
                     }
                     hostEntry.setValue(new Pair<HostVO, Integer>(h, reserved));
                     suitable_host_found = true;
@@ -556,8 +566,8 @@
             }
             return new DeployDestination(zone, null, planCluster, null);
         }
-        String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%d) with offering ID: %s",
-                cpu_requested * nodesCount, ram_requested * nodesCount, offering.getUuid());
+        String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%s) with offering ID: %s",
+                cpu_requested * nodesCount, toHumanReadableSize(ram_requested * nodesCount), offering.getUuid());
         LOGGER.warn(msg);
         throw new InsufficientServerCapacityException(msg, DataCenter.class, zone.getId());
     }
@@ -604,17 +614,32 @@
         response.setEndpoint(kubernetesCluster.getEndpoint());
         response.setNetworkId(ntwk.getUuid());
         response.setAssociatedNetworkName(ntwk.getName());
-        List<String> vmIds = new ArrayList<String>();
+        if (ntwk.getGuestType() == Network.GuestType.Isolated) {
+            List<IPAddressVO> ipAddresses = ipAddressDao.listByAssociatedNetwork(ntwk.getId(), true);
+            if (ipAddresses != null && ipAddresses.size() == 1) {
+                response.setIpAddress(ipAddresses.get(0).getAddress().addr());
+                response.setIpAddressId(ipAddresses.get(0).getUuid());
+            }
+        }
+        List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>();
         List<KubernetesClusterVmMapVO> vmList = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId());
+        ResponseView respView = ResponseView.Restricted;
+        Account caller = CallContext.current().getCallingAccount();
+        if (accountService.isRootAdmin(caller.getId())) {
+            respView = ResponseView.Full;
+        }
+        final String responseName = "virtualmachine";
         if (vmList != null && !vmList.isEmpty()) {
             for (KubernetesClusterVmMapVO vmMapVO : vmList) {
-                UserVmVO userVM = userVmDao.findById(vmMapVO.getVmId());
+                UserVmJoinVO userVM = userVmJoinDao.findById(vmMapVO.getVmId());
                 if (userVM != null) {
-                    vmIds.add(userVM.getUuid());
+                    UserVmResponse vmResponse = ApiDBUtils.newUserVmResponse(respView, responseName, userVM,
+                        EnumSet.of(VMDetails.nics), caller);
+                    vmResponses.add(vmResponse);
                 }
             }
         }
-        response.setVirtualMachineIds(vmIds);
+        response.setVirtualMachines(vmResponses);
         return response;
     }
 
@@ -829,19 +854,19 @@
         }
         final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
         if (zone == null) {
-            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
 
         Account caller = CallContext.current().getCallingAccount();
         accountManager.checkAccess(caller, SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
 
         if (serviceOfferingId == null && clusterSize == null) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled, either a new service offering or a new cluster size must be passed", kubernetesCluster.getUuid()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be scaled, either a new service offering or a new cluster size must be passed", kubernetesCluster.getName()));
         }
 
         final KubernetesSupportedVersion clusterVersion = kubernetesSupportedVersionDao.findById(kubernetesCluster.getKubernetesVersionId());
         if (clusterVersion == null) {
-            throw new CloudRuntimeException(String.format("Invalid Kubernetes version associated with Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            throw new CloudRuntimeException(String.format("Invalid Kubernetes version associated with Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
 
         ServiceOffering serviceOffering = null;
@@ -851,49 +876,49 @@
                 throw new InvalidParameterValueException("Failed to find service offering ID: " + serviceOfferingId);
             } else {
                 if (serviceOffering.isDynamic()) {
-                    throw new InvalidParameterValueException(String.format("Custom service offerings are not supported for Kubernetes clusters. Kubernetes cluster ID: %s, service offering ID: %s", kubernetesCluster.getUuid(), serviceOffering.getUuid()));
+                    throw new InvalidParameterValueException(String.format("Custom service offerings are not supported for Kubernetes clusters. Kubernetes cluster : %s, service offering : %s", kubernetesCluster.getName(), serviceOffering.getName()));
                 }
                 if (serviceOffering.getCpu() < MIN_KUBERNETES_CLUSTER_NODE_CPU || serviceOffering.getRamSize() < MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE) {
-                    throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled with service offering ID: %s, Kubernetes cluster template(CoreOS) needs minimum %d vCPUs and %d MB RAM",
-                            kubernetesCluster.getUuid(), serviceOffering.getUuid(), MIN_KUBERNETES_CLUSTER_NODE_CPU, MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE));
+                    throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be scaled with service offering : %s, Kubernetes cluster template(CoreOS) needs minimum %d vCPUs and %d MB RAM",
+                            kubernetesCluster.getName(), serviceOffering.getName(), MIN_KUBERNETES_CLUSTER_NODE_CPU, MIN_KUBERNETES_CLUSTER_NODE_RAM_SIZE));
                 }
                 if (serviceOffering.getCpu() < clusterVersion.getMinimumCpu()) {
-                    throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled with service offering ID: %s, associated Kubernetes version ID: %s needs minimum %d vCPUs",
-                            kubernetesCluster.getUuid(), serviceOffering.getUuid(), clusterVersion.getUuid(), clusterVersion.getMinimumCpu()));
+                    throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be scaled with service offering : %s, associated Kubernetes version : %s needs minimum %d vCPUs",
+                            kubernetesCluster.getName(), serviceOffering.getName(), clusterVersion.getName(), clusterVersion.getMinimumCpu()));
                 }
                 if (serviceOffering.getRamSize() < clusterVersion.getMinimumRamSize()) {
-                    throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled with service offering ID: %s, associated Kubernetes version ID: %s needs minimum %d MB RAM",
-                            kubernetesCluster.getUuid(), serviceOffering.getUuid(), clusterVersion.getUuid(), clusterVersion.getMinimumRamSize()));
+                    throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be scaled with service offering : %s, associated Kubernetes version : %s needs minimum %d MB RAM",
+                            kubernetesCluster.getName(), serviceOffering.getName(), clusterVersion.getName(), clusterVersion.getMinimumRamSize()));
                 }
             }
             final ServiceOffering existingServiceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
             if (serviceOffering.getRamSize() < existingServiceOffering.getRamSize() ||
                     serviceOffering.getCpu() * serviceOffering.getSpeed() < existingServiceOffering.getCpu() * existingServiceOffering.getSpeed()) {
-                logAndThrow(Level.WARN, String.format("Kubernetes cluster cannot be scaled down for service offering. Service offering ID: %s offers lesser resources as compared to service offering ID: %s of Kubernetes cluster ID: %s",
-                        serviceOffering.getUuid(), existingServiceOffering.getUuid(), kubernetesCluster.getUuid()));
+                logAndThrow(Level.WARN, String.format("Kubernetes cluster cannot be scaled down for service offering. Service offering : %s offers lesser resources as compared to service offering : %s of Kubernetes cluster : %s",
+                        serviceOffering.getName(), existingServiceOffering.getName(), kubernetesCluster.getName()));
             }
         }
 
         if (!(kubernetesCluster.getState().equals(KubernetesCluster.State.Created) ||
                 kubernetesCluster.getState().equals(KubernetesCluster.State.Running) ||
                 kubernetesCluster.getState().equals(KubernetesCluster.State.Stopped))) {
-            throw new PermissionDeniedException(String.format("Kubernetes cluster ID: %s is in %s state", kubernetesCluster.getUuid(), kubernetesCluster.getState().toString()));
+            throw new PermissionDeniedException(String.format("Kubernetes cluster : %s is in %s state", kubernetesCluster.getName(), kubernetesCluster.getState().toString()));
         }
 
         if (clusterSize != null) {
             if (kubernetesCluster.getState().equals(KubernetesCluster.State.Stopped)) { // Cannot scale stopped cluster currently for cluster size
-                throw new PermissionDeniedException(String.format("Kubernetes cluster ID: %s is in %s state", kubernetesCluster.getUuid(), kubernetesCluster.getState().toString()));
+                throw new PermissionDeniedException(String.format("Kubernetes cluster : %s is in %s state", kubernetesCluster.getName(), kubernetesCluster.getState().toString()));
             }
             if (clusterSize < 1) {
-                throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be scaled for size, %d", kubernetesCluster.getUuid(), clusterSize));
+                throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be scaled for size, %d", kubernetesCluster.getName(), clusterSize));
             }
             if (clusterSize > kubernetesCluster.getNodeCount()) { // Upscale
                 VMTemplateVO template = templateDao.findById(kubernetesCluster.getTemplateId());
                 if (template == null) {
-                    throw new InvalidParameterValueException(String.format("Invalid template associated with Kubernetes cluster ID: %s",  kubernetesCluster.getUuid()));
+                    throw new InvalidParameterValueException(String.format("Invalid template associated with Kubernetes cluster : %s",  kubernetesCluster.getName()));
                 }
                 if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(template, zone.getId(), true))) {
-                    throw new InvalidParameterValueException(String.format("Template ID: %s associated with Kubernetes cluster ID: %s is not in Ready state for datacenter ID: %s", template.getUuid(), kubernetesCluster.getUuid(), zone.getUuid()));
+                    throw new InvalidParameterValueException(String.format("Template : %s associated with Kubernetes cluster : %s is not in Ready state for datacenter : %s", template.getName(), kubernetesCluster.getName(), zone.getName()));
                 }
             }
         }
@@ -915,11 +940,11 @@
         }
         accountManager.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
         if (!KubernetesCluster.State.Running.equals(kubernetesCluster.getState())) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s is not in running state", kubernetesCluster.getUuid()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s is not in running state", kubernetesCluster.getName()));
         }
         final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
         if (zone == null) {
-            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         KubernetesSupportedVersionVO upgradeVersion = kubernetesSupportedVersionDao.findById(upgradeVersionId);
         if (upgradeVersion == null || upgradeVersion.getRemoved() != null) {
@@ -935,15 +960,15 @@
         }
         final ServiceOffering serviceOffering = serviceOfferingDao.findByIdIncludingRemoved(kubernetesCluster.getServiceOfferingId());
         if (serviceOffering == null) {
-            throw new CloudRuntimeException(String.format("Invalid service offering associated with Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            throw new CloudRuntimeException(String.format("Invalid service offering associated with Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         if (serviceOffering.getCpu() < upgradeVersion.getMinimumCpu()) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be upgraded with Kubernetes version ID: %s which needs minimum %d vCPUs while associated service offering ID: %s offers only %d vCPUs",
-                    kubernetesCluster.getUuid(), upgradeVersion.getUuid(), upgradeVersion.getMinimumCpu(), serviceOffering.getUuid(), serviceOffering.getCpu()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d vCPUs while associated service offering : %s offers only %d vCPUs",
+                    kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumCpu(), serviceOffering.getName(), serviceOffering.getCpu()));
         }
         if (serviceOffering.getRamSize() < upgradeVersion.getMinimumRamSize()) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s cannot be upgraded with Kubernetes version ID: %s which needs minimum %d MB RAM while associated service offering ID: %s offers only %d MB RAM",
-                    kubernetesCluster.getUuid(), upgradeVersion.getUuid(), upgradeVersion.getMinimumRamSize(), serviceOffering.getUuid(), serviceOffering.getRamSize()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s cannot be upgraded with Kubernetes version : %s which needs minimum %d MB RAM while associated service offering : %s offers only %d MB RAM",
+                    kubernetesCluster.getName(), upgradeVersion.getName(), upgradeVersion.getMinimumRamSize(), serviceOffering.getName(), serviceOffering.getRamSize()));
         }
         // Check upgradeVersion is either patch upgrade or immediate minor upgrade
         try {
@@ -954,10 +979,10 @@
 
         VMTemplateVO iso = templateDao.findById(upgradeVersion.getIsoId());
         if (iso == null) {
-            throw new InvalidParameterValueException(String.format("Invalid ISO associated with version ID: %s",  upgradeVersion.getUuid()));
+            throw new InvalidParameterValueException(String.format("Invalid ISO associated with version : %s",  upgradeVersion.getName()));
         }
         if (CollectionUtils.isEmpty(templateJoinDao.newTemplateView(iso, zone.getId(), true))) {
-            throw new InvalidParameterValueException(String.format("ISO associated with version ID: %s is not in Ready state for datacenter ID: %s",  upgradeVersion.getUuid(), zone.getUuid()));
+            throw new InvalidParameterValueException(String.format("ISO associated with version : %s is not in Ready state for datacenter : %s",  upgradeVersion.getName(), zone.getName()));
         }
     }
 
@@ -966,7 +991,7 @@
         try {
             return _stateMachine.transitTo(kubernetesCluster, e, null, kubernetesClusterDao);
         } catch (NoTransitionException nte) {
-            LOGGER.warn(String.format("Failed to transition state of the Kubernetes cluster ID: %s in state %s on event %s", kubernetesCluster.getUuid(), kubernetesCluster.getState().toString(), e.toString()), nte);
+            LOGGER.warn(String.format("Failed to transition state of the Kubernetes cluster : %s in state %s on event %s", kubernetesCluster.getName(), kubernetesCluster.getState().toString(), e.toString()), nte);
             return false;
         }
     }
@@ -991,10 +1016,10 @@
         try {
             deployDestination = plan(totalNodeCount, zone, serviceOffering);
         } catch (InsufficientCapacityException e) {
-            logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to insufficient capacity for %d nodes cluster in zone ID: %s with service offering ID: %s", totalNodeCount, zone.getUuid(), serviceOffering.getUuid()));
+            logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to insufficient capacity for %d nodes cluster in zone : %s with service offering : %s", totalNodeCount, zone.getName(), serviceOffering.getName()));
         }
         if (deployDestination == null || deployDestination.getCluster() == null) {
-            logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to error while finding suitable deployment plan for cluster in zone ID: %s", zone.getUuid()));
+            logAndThrow(Level.ERROR, String.format("Creating Kubernetes cluster failed due to error while finding suitable deployment plan for cluster in zone : %s", zone.getName()));
         }
 
         final Network defaultNetwork = getKubernetesClusterNetworkIfMissing(cmd.getName(), zone, owner, (int)masterNodeCount, (int)clusterSize, cmd.getExternalLoadBalancerIpAddress(), cmd.getNetworkId());
@@ -1043,24 +1068,24 @@
             throw new InvalidParameterValueException("Failed to find Kubernetes cluster with given ID");
         }
         if (kubernetesCluster.getRemoved() != null) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s is already deleted", kubernetesCluster.getUuid()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s is already deleted", kubernetesCluster.getName()));
         }
         accountManager.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
         if (kubernetesCluster.getState().equals(KubernetesCluster.State.Running)) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Kubernetes cluster ID: %s is in running state", kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Kubernetes cluster : %s is in running state", kubernetesCluster.getName()));
             }
             return true;
         }
         if (kubernetesCluster.getState().equals(KubernetesCluster.State.Starting)) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Kubernetes cluster ID: %s is already in starting state", kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Kubernetes cluster : %s is already in starting state", kubernetesCluster.getName()));
             }
             return true;
         }
         final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
         if (zone == null) {
-            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            logAndThrow(Level.WARN, String.format("Unable to find zone for Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         KubernetesClusterStartWorker startWorker =
                 new KubernetesClusterStartWorker(kubernetesCluster, this);
@@ -1084,18 +1109,18 @@
             throw new InvalidParameterValueException("Failed to find Kubernetes cluster with given ID");
         }
         if (kubernetesCluster.getRemoved() != null) {
-            throw new InvalidParameterValueException(String.format("Kubernetes cluster ID: %s is already deleted", kubernetesCluster.getUuid()));
+            throw new InvalidParameterValueException(String.format("Kubernetes cluster : %s is already deleted", kubernetesCluster.getName()));
         }
         accountManager.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.OperateEntry, false, kubernetesCluster);
         if (kubernetesCluster.getState().equals(KubernetesCluster.State.Stopped)) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Kubernetes cluster ID: %s is already stopped", kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Kubernetes cluster : %s is already stopped", kubernetesCluster.getName()));
             }
             return true;
         }
         if (kubernetesCluster.getState().equals(KubernetesCluster.State.Stopping)) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Kubernetes cluster ID: %s is getting stopped", kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Kubernetes cluster : %s is getting stopped", kubernetesCluster.getName()));
             }
             return true;
         }
@@ -1185,11 +1210,10 @@
         if (clusterDetailsVO != null && !Strings.isNullOrEmpty(clusterDetailsVO.getValue())) {
             configData = new String(Base64.decodeBase64(clusterDetailsVO.getValue()));
         } else {
-            if (KubernetesCluster.State.Starting.equals(kubernetesCluster.getState())) {
-                throw new CloudRuntimeException(String.format("Setup is in progress for Kubernetes cluster ID: %s, config not available at this moment", kubernetesCluster.getUuid()));
-            } else {
-                throw new CloudRuntimeException((String.format("Config not found for Kubernetes cluster ID: %s", kubernetesCluster.getUuid())));
-            }
+            String exceptionMessage = KubernetesCluster.State.Starting.equals(kubernetesCluster.getState()) ?
+                    String.format("Setup is in progress for Kubernetes cluster : %s, config not available at this moment", kubernetesCluster.getName()) :
+                    String.format("Config not found for Kubernetes cluster : %s", kubernetesCluster.getName());
+            throw new CloudRuntimeException(exceptionMessage);
         }
         response.setConfigData(configData);
         response.setObjectName("clusterconfig");
@@ -1268,20 +1292,20 @@
                 List<KubernetesClusterVO> kubernetesClusters = kubernetesClusterDao.findKubernetesClustersToGarbageCollect();
                 for (KubernetesCluster kubernetesCluster : kubernetesClusters) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Running Kubernetes cluster garbage collector on Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+                        LOGGER.info(String.format("Running Kubernetes cluster garbage collector on Kubernetes cluster : %s", kubernetesCluster.getName()));
                     }
                     try {
                         KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(kubernetesCluster, KubernetesClusterManagerImpl.this);
                         destroyWorker = ComponentContext.inject(destroyWorker);
                         if (destroyWorker.destroy()) {
                             if (LOGGER.isInfoEnabled()) {
-                                LOGGER.info(String.format("Garbage collection complete for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+                                LOGGER.info(String.format("Garbage collection complete for Kubernetes cluster : %s", kubernetesCluster.getName()));
                             }
                         } else {
-                            LOGGER.warn(String.format("Garbage collection failed for Kubernetes cluster ID: %s, it will be attempted to garbage collected in next run", kubernetesCluster.getUuid()));
+                            LOGGER.warn(String.format("Garbage collection failed for Kubernetes cluster : %s, it will be attempted to garbage collected in next run", kubernetesCluster.getName()));
                         }
                     } catch (CloudRuntimeException e) {
-                        LOGGER.warn(String.format("Failed to destroy Kubernetes cluster ID: %s during GC", kubernetesCluster.getUuid()), e);
+                        LOGGER.warn(String.format("Failed to destroy Kubernetes cluster : %s during GC", kubernetesCluster.getName()), e);
                         // proceed further with rest of the Kubernetes cluster garbage collection
                     }
                 }
@@ -1325,14 +1349,14 @@
                 List<KubernetesClusterVO> runningKubernetesClusters = kubernetesClusterDao.findKubernetesClustersInState(KubernetesCluster.State.Running);
                 for (KubernetesCluster kubernetesCluster : runningKubernetesClusters) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s", kubernetesCluster.getName()));
                     }
                     try {
                         if (!isClusterVMsInDesiredState(kubernetesCluster, VirtualMachine.State.Running)) {
                             stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.FaultsDetected);
                         }
                     } catch (Exception e) {
-                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Running state scanner on Kubernetes cluster ID: %s status scanner", kubernetesCluster.getUuid()), e);
+                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Running state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
                     }
                 }
 
@@ -1340,14 +1364,14 @@
                 List<KubernetesClusterVO> stoppedKubernetesClusters = kubernetesClusterDao.findKubernetesClustersInState(KubernetesCluster.State.Stopped);
                 for (KubernetesCluster kubernetesCluster : stoppedKubernetesClusters) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster ID: %s for state: %s", kubernetesCluster.getUuid(), KubernetesCluster.State.Stopped.toString()));
+                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s for state: %s", kubernetesCluster.getName(), KubernetesCluster.State.Stopped.toString()));
                     }
                     try {
                         if (!isClusterVMsInDesiredState(kubernetesCluster, VirtualMachine.State.Stopped)) {
                             stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.FaultsDetected);
                         }
                     } catch (Exception e) {
-                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Stopped state scanner on Kubernetes cluster ID: %s status scanner", kubernetesCluster.getUuid()), e);
+                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Stopped state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
                     }
                 }
 
@@ -1355,7 +1379,7 @@
                 List<KubernetesClusterVO> alertKubernetesClusters = kubernetesClusterDao.findKubernetesClustersInState(KubernetesCluster.State.Alert);
                 for (KubernetesClusterVO kubernetesCluster : alertKubernetesClusters) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster ID: %s for state: %s", kubernetesCluster.getUuid(), KubernetesCluster.State.Alert.toString()));
+                        LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s for state: %s", kubernetesCluster.getName(), KubernetesCluster.State.Alert.toString()));
                     }
                     try {
                         if (isClusterVMsInDesiredState(kubernetesCluster, VirtualMachine.State.Running)) {
@@ -1368,7 +1392,7 @@
                             stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
                         }
                     } catch (Exception e) {
-                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Alert state scanner on Kubernetes cluster ID: %s status scanner", kubernetesCluster.getUuid()), e);
+                        LOGGER.warn(String.format("Failed to run Kubernetes cluster Alert state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
                     }
                 }
 
@@ -1381,7 +1405,7 @@
                             continue;
                         }
                         if (LOGGER.isInfoEnabled()) {
-                            LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster ID: %s for state: %s", kubernetesCluster.getUuid(), KubernetesCluster.State.Starting.toString()));
+                            LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s for state: %s", kubernetesCluster.getName(), KubernetesCluster.State.Starting.toString()));
                         }
                         try {
                             if (isClusterVMsInDesiredState(kubernetesCluster, VirtualMachine.State.Running)) {
@@ -1390,20 +1414,20 @@
                                 stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
                             }
                         } catch (Exception e) {
-                            LOGGER.warn(String.format("Failed to run Kubernetes cluster Starting state scanner on Kubernetes cluster ID: %s status scanner", kubernetesCluster.getUuid()), e);
+                            LOGGER.warn(String.format("Failed to run Kubernetes cluster Starting state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
                         }
                     }
                     List<KubernetesClusterVO> destroyingKubernetesClusters = kubernetesClusterDao.findKubernetesClustersInState(KubernetesCluster.State.Destroying);
                     for (KubernetesCluster kubernetesCluster : destroyingKubernetesClusters) {
                         if (LOGGER.isInfoEnabled()) {
-                            LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster ID: %s for state: %s", kubernetesCluster.getUuid(), KubernetesCluster.State.Destroying.toString()));
+                            LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s for state: %s", kubernetesCluster.getName(), KubernetesCluster.State.Destroying.toString()));
                         }
                         try {
                             KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(kubernetesCluster, KubernetesClusterManagerImpl.this);
                             destroyWorker = ComponentContext.inject(destroyWorker);
                             destroyWorker.destroy();
                         } catch (Exception e) {
-                            LOGGER.warn(String.format("Failed to run Kubernetes cluster Destroying state scanner on Kubernetes cluster ID: %s status scanner", kubernetesCluster.getUuid()), e);
+                            LOGGER.warn(String.format("Failed to run Kubernetes cluster Destroying state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
                         }
                     }
                 }
@@ -1431,8 +1455,8 @@
             VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(clusterVm.getVmId());
             if (vm.getState() != state) {
                 if (LOGGER.isDebugEnabled()) {
-                    LOGGER.debug(String.format("Found VM ID: %s in the Kubernetes cluster ID: %s in state: %s while expected to be in state: %s. So moving the cluster to Alert state for reconciliation",
-                            vm.getUuid(), kubernetesCluster.getUuid(), vm.getState().toString(), state.toString()));
+                    LOGGER.debug(String.format("Found VM : %s in the Kubernetes cluster : %s in state: %s while expected to be in state: %s. So moving the cluster to Alert state for reconciliation",
+                            vm.getUuid(), kubernetesCluster.getName(), vm.getState().toString(), state.toString()));
                 }
                 return false;
             }
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
index 0a52b66..e5c8118 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterActionWorker.java
@@ -237,7 +237,7 @@
         }
         List<KubernetesClusterVmMapVO> clusterVMs = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId());
         if (CollectionUtils.isEmpty(clusterVMs)) {
-            LOGGER.warn(String.format("Unable to retrieve VMs for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.warn(String.format("Unable to retrieve VMs for Kubernetes cluster : %s", kubernetesCluster.getName()));
             return null;
         }
         List<Long> vmIds = new ArrayList<>();
@@ -265,13 +265,13 @@
         }
         Network network = networkDao.findById(kubernetesCluster.getNetworkId());
         if (network == null) {
-            LOGGER.warn(String.format("Network for Kubernetes cluster ID: %s cannot be found", kubernetesCluster.getUuid()));
+            LOGGER.warn(String.format("Network for Kubernetes cluster : %s cannot be found", kubernetesCluster.getName()));
             return new Pair<>(null, port);
         }
         if (Network.GuestType.Isolated.equals(network.getGuestType())) {
             List<? extends IpAddress> addresses = networkModel.listPublicIpsAssignedToGuestNtwk(network.getId(), true);
             if (CollectionUtils.isEmpty(addresses)) {
-                LOGGER.warn(String.format("No public IP addresses found for network ID: %s, Kubernetes cluster ID: %s", network.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.warn(String.format("No public IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
                 return new Pair<>(null, port);
             }
             for (IpAddress address : addresses) {
@@ -279,18 +279,18 @@
                     return new Pair<>(address.getAddress().addr(), port);
                 }
             }
-            LOGGER.warn(String.format("No source NAT IP addresses found for network ID: %s, Kubernetes cluster ID: %s", network.getUuid(), kubernetesCluster.getUuid()));
+            LOGGER.warn(String.format("No source NAT IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
             return new Pair<>(null, port);
         } else if (Network.GuestType.Shared.equals(network.getGuestType())) {
             port = 22;
             masterVm = fetchMasterVmIfMissing(masterVm);
             if (masterVm == null) {
-                LOGGER.warn(String.format("Unable to retrieve master VM for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+                LOGGER.warn(String.format("Unable to retrieve master VM for Kubernetes cluster : %s", kubernetesCluster.getName()));
                 return new Pair<>(null, port);
             }
             return new Pair<>(masterVm.getPrivateIpAddress(), port);
         }
-        LOGGER.warn(String.format("Unable to retrieve server IP address for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+        LOGGER.warn(String.format("Unable to retrieve server IP address for Kubernetes cluster : %s", kubernetesCluster.getName()));
         return  new Pair<>(null, port);
     }
 
@@ -305,26 +305,26 @@
             failedEvent = KubernetesCluster.Event.CreateFailed;
         }
         if (version == null) {
-            logTransitStateAndThrow(Level.ERROR, String .format("Unable to find Kubernetes version for cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), failedEvent);
+            logTransitStateAndThrow(Level.ERROR, String .format("Unable to find Kubernetes version for cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent);
         }
         VMTemplateVO iso = templateDao.findById(version.getIsoId());
         if (iso == null) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster ID: %s. Binaries ISO not found.",  kubernetesCluster.getUuid()), kubernetesCluster.getId(), failedEvent);
+            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster : %s. Binaries ISO not found.",  kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent);
         }
         if (!iso.getFormat().equals(Storage.ImageFormat.ISO)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster ID: %s. Invalid Binaries ISO.",  kubernetesCluster.getUuid()), kubernetesCluster.getId(), failedEvent);
+            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster : %s. Invalid Binaries ISO.",  kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent);
         }
         if (!iso.getState().equals(VirtualMachineTemplate.State.Active)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster ID: %s. Binaries ISO not active.",  kubernetesCluster.getUuid()), kubernetesCluster.getId(), failedEvent);
+            logTransitStateAndThrow(Level.ERROR, String.format("Unable to attach ISO to Kubernetes cluster : %s. Binaries ISO not active.",  kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent);
         }
         for (UserVm vm : clusterVMs) {
             try {
                 templateService.attachIso(iso.getId(), vm.getId());
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Attached binaries ISO for VM: %s in cluster: %s", vm.getUuid(), kubernetesCluster.getName()));
+                    LOGGER.info(String.format("Attached binaries ISO for VM : %s in cluster: %s", vm.getDisplayName(), kubernetesCluster.getName()));
                 }
             } catch (CloudRuntimeException ex) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Failed to attach binaries ISO for VM: %s in the Kubernetes cluster name: %s", vm.getDisplayName(), kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent, ex);
+                logTransitStateAndThrow(Level.ERROR, String.format("Failed to attach binaries ISO for VM : %s in the Kubernetes cluster name: %s", vm.getDisplayName(), kubernetesCluster.getName()), kubernetesCluster.getId(), failedEvent, ex);
             }
         }
     }
@@ -339,15 +339,15 @@
             try {
                 result = templateService.detachIso(vm.getId());
             } catch (CloudRuntimeException ex) {
-                LOGGER.warn(String.format("Failed to detach binaries ISO from VM ID: %s in the Kubernetes cluster ID: %s ", vm.getUuid(), kubernetesCluster.getUuid()), ex);
+                LOGGER.warn(String.format("Failed to detach binaries ISO from VM : %s in the Kubernetes cluster : %s ", vm.getDisplayName(), kubernetesCluster.getName()), ex);
             }
             if (result) {
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Detached Kubernetes binaries from VM ID: %s in the Kubernetes cluster ID: %s", vm.getUuid(), kubernetesCluster.getUuid()));
+                    LOGGER.info(String.format("Detached Kubernetes binaries from VM : %s in the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
                 }
                 continue;
             }
-            LOGGER.warn(String.format("Failed to detach binaries ISO from VM ID: %s in the Kubernetes cluster ID: %s ", vm.getUuid(), kubernetesCluster.getUuid()));
+            LOGGER.warn(String.format("Failed to detach binaries ISO from VM : %s in the Kubernetes cluster : %s ", vm.getDisplayName(), kubernetesCluster.getName()));
         }
     }
 
@@ -375,7 +375,8 @@
         try {
             return _stateMachine.transitTo(kubernetesCluster, e, null, kubernetesClusterDao);
         } catch (NoTransitionException nte) {
-            LOGGER.warn(String.format("Failed to transition state of the Kubernetes cluster ID: %s in state %s on event %s", kubernetesCluster.getUuid(), kubernetesCluster.getState().toString(), e.toString()), nte);
+            LOGGER.warn(String.format("Failed to transition state of the Kubernetes cluster : %s in state %s on event %s",
+                kubernetesCluster.getName(), kubernetesCluster.getState().toString(), e.toString()), nte);
             return false;
         }
     }
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java
index c9f42d8..01ed9aa 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterDestroyWorker.java
@@ -68,7 +68,8 @@
                 || kubernetesCluster.getState().equals(KubernetesCluster.State.Alert)
                 || kubernetesCluster.getState().equals(KubernetesCluster.State.Error)
                 || kubernetesCluster.getState().equals(KubernetesCluster.State.Destroying))) {
-            String msg = String.format("Cannot perform delete operation on cluster ID: %s in state: %s",kubernetesCluster.getUuid(), kubernetesCluster.getState());
+            String msg = String.format("Cannot perform delete operation on cluster : %s in state: %s",
+                kubernetesCluster.getName(), kubernetesCluster.getState());
             LOGGER.warn(msg);
             throw new PermissionDeniedException(msg);
         }
@@ -88,16 +89,15 @@
                 try {
                     UserVm vm = userVmService.destroyVm(vmID, true);
                     if (!userVmManager.expunge(userVM, CallContext.current().getCallingUserId(), CallContext.current().getCallingAccount())) {
-                        LOGGER.warn(String.format("Unable to expunge VM '%s' ID: %s, destroying Kubernetes cluster will probably fail"
-                                , vm.getInstanceName()
-                                , vm.getUuid()));
+                        LOGGER.warn(String.format("Unable to expunge VM %s : %s, destroying Kubernetes cluster will probably fail",
+                            vm.getInstanceName() , vm.getUuid()));
                     }
                     kubernetesClusterVmMapDao.expunge(clusterVM.getId());
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Destroyed VM ID: %s as part of Kubernetes cluster ID: %s cleanup", vm.getUuid(), kubernetesCluster.getUuid()));
+                        LOGGER.info(String.format("Destroyed VM : %s as part of Kubernetes cluster : %s cleanup", vm.getDisplayName(), kubernetesCluster.getName()));
                     }
                 } catch (ResourceUnavailableException | ConcurrentOperationException e) {
-                    LOGGER.warn(String.format("Failed to destroy VM ID: %s part of the Kubernetes cluster ID: %s cleanup. Moving on with destroying remaining resources provisioned for the Kubernetes cluster", userVM.getUuid(), kubernetesCluster.getUuid()), e);
+                    LOGGER.warn(String.format("Failed to destroy VM : %s part of the Kubernetes cluster : %s cleanup. Moving on with destroying remaining resources provisioned for the Kubernetes cluster", userVM.getDisplayName(), kubernetesCluster.getName()), e);
                     return false;
                 }
             }
@@ -119,12 +119,13 @@
             ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
             boolean networkDestroyed = networkMgr.destroyNetwork(kubernetesCluster.getNetworkId(), context, true);
             if (!networkDestroyed) {
-                String msg = String.format("Failed to destroy network ID: %s as part of Kubernetes cluster ID: %s cleanup", network.getUuid(), kubernetesCluster.getUuid());
+                String msg = String.format("Failed to destroy network : %s as part of Kubernetes cluster : %s cleanup", network.getName(), kubernetesCluster.getName());
                 LOGGER.warn(msg);
                 throw new ManagementServerException(msg);
             }
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Destroyed network: %s as part of Kubernetes cluster ID: %s cleanup", network.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.info(String.format("Destroyed network : %s as part of Kubernetes cluster : %s cleanup",
+                    network.getName(), kubernetesCluster.getName()));
             }
         }
     }
@@ -142,12 +143,12 @@
         }
         IpAddress publicIp = getSourceNatIp(network);
         if (publicIp == null) {
-            throw new ManagementServerException(String.format("No source NAT IP addresses found for network ID: %s", network.getUuid()));
+            throw new ManagementServerException(String.format("No source NAT IP addresses found for network : %s", network.getName()));
         }
         try {
             removeLoadBalancingRule(publicIp, network, owner, CLUSTER_API_PORT);
         } catch (ResourceUnavailableException e) {
-            throw new ManagementServerException(String.format("Failed to KubernetesCluster load balancing rule for network ID: %s", network.getUuid()));
+            throw new ManagementServerException(String.format("Failed to KubernetesCluster load balancing rule for network : %s", network.getName()));
         }
         FirewallRule firewallRule = removeApiFirewallRule(publicIp);
         if (firewallRule == null) {
@@ -160,7 +161,7 @@
         try {
             removePortForwardingRules(publicIp, network, owner, removedVmIds);
         } catch (ResourceUnavailableException e) {
-            throw new ManagementServerException(String.format("Failed to KubernetesCluster port forwarding rules for network ID: %s", network.getUuid()));
+            throw new ManagementServerException(String.format("Failed to KubernetesCluster port forwarding rules for network : %s", network.getName()));
         }
     }
 
@@ -209,7 +210,7 @@
             if (network != null) {
                 List<VMInstanceVO> networkVMs = vmInstanceDao.listNonRemovedVmsByTypeAndNetwork(network.getId(), VirtualMachine.Type.User);
                 if (networkVMs.size() > clusterVMs.size()) {
-                    logAndThrow(Level.ERROR, String.format("Network ID: %s for Kubernetes cluster ID: %s has instances using it which are not part of the Kubernetes cluster", network.getUuid(), kubernetesCluster.getUuid()));
+                    logAndThrow(Level.ERROR, String.format("Network : %s for Kubernetes cluster : %s has instances using it which are not part of the Kubernetes cluster", network.getName(), kubernetesCluster.getName()));
                 }
                 for (VMInstanceVO vm : networkVMs) {
                     boolean vmFoundInKubernetesCluster = false;
@@ -220,15 +221,15 @@
                         }
                     }
                     if (!vmFoundInKubernetesCluster) {
-                        logAndThrow(Level.ERROR, String.format("VM ID: %s which is not a part of Kubernetes cluster ID: %s is using Kubernetes cluster network ID: %s", vm.getUuid(), kubernetesCluster.getUuid(), network.getUuid()));
+                        logAndThrow(Level.ERROR, String.format("VM : %s which is not a part of Kubernetes cluster : %s is using Kubernetes cluster network : %s", vm.getUuid(), kubernetesCluster.getName(), network.getName()));
                     }
                 }
             } else {
-                LOGGER.error(String.format("Failed to find network for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+                LOGGER.error(String.format("Failed to find network for Kubernetes cluster : %s", kubernetesCluster.getName()));
             }
         }
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Destroying Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Destroying Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.DestroyRequested);
         boolean vmsDestroyed = destroyClusterVMs();
@@ -239,7 +240,7 @@
                 try {
                     destroyKubernetesClusterNetwork();
                 } catch (ManagementServerException e) {
-                    String msg = String.format("Failed to destroy network of Kubernetes cluster ID: %s cleanup", kubernetesCluster.getUuid());
+                    String msg = String.format("Failed to destroy network of Kubernetes cluster : %s cleanup", kubernetesCluster.getName());
                     LOGGER.warn(msg, e);
                     updateKubernetesClusterEntryForGC();
                     throw new CloudRuntimeException(msg, e);
@@ -248,14 +249,14 @@
                 try {
                     checkForRulesToDelete();
                 } catch (ManagementServerException e) {
-                    String msg = String.format("Failed to remove network rules of Kubernetes cluster ID: %s", kubernetesCluster.getUuid());
+                    String msg = String.format("Failed to remove network rules of Kubernetes cluster : %s", kubernetesCluster.getName());
                     LOGGER.warn(msg, e);
                     updateKubernetesClusterEntryForGC();
                     throw new CloudRuntimeException(msg, e);
                 }
             }
         } else {
-            String msg = String.format("Failed to destroy one or more VMs as part of Kubernetes cluster ID: %s cleanup", kubernetesCluster.getUuid());
+            String msg = String.format("Failed to destroy one or more VMs as part of Kubernetes cluster : %s cleanup", kubernetesCluster.getName());
             LOGGER.warn(msg);
             updateKubernetesClusterEntryForGC();
             throw new CloudRuntimeException(msg);
@@ -263,12 +264,12 @@
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
         boolean deleted = kubernetesClusterDao.remove(kubernetesCluster.getId());
         if (!deleted) {
-            logMessage(Level.WARN, String.format("Failed to delete Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), null);
+            logMessage(Level.WARN, String.format("Failed to delete Kubernetes cluster : %s", kubernetesCluster.getName()), null);
             updateKubernetesClusterEntryForGC();
             return false;
         }
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Kubernetes cluster ID: %s is successfully deleted", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Kubernetes cluster : %s is successfully deleted", kubernetesCluster.getName()));
         }
         return true;
     }
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
index 831bebe..b715f09 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterResourceModifierActionWorker.java
@@ -88,6 +88,8 @@
 import com.cloud.vm.dao.VMInstanceDao;
 import com.google.common.base.Strings;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class KubernetesClusterResourceModifierActionWorker extends KubernetesClusterActionWorker {
 
     @Inject
@@ -225,11 +227,11 @@
                 Float cpuOvercommitRatio = Float.parseFloat(cluster_detail_cpu.getValue());
                 Float memoryOvercommitRatio = Float.parseFloat(cluster_detail_ram.getValue());
                 if (LOGGER.isDebugEnabled()) {
-                    LOGGER.debug(String.format("Checking host ID: %s for capacity already reserved %d", h.getUuid(), reserved));
+                    LOGGER.debug(String.format("Checking host : %s for capacity already reserved %d", h.getName(), reserved));
                 }
                 if (capacityManager.checkIfHostHasCapacity(h.getId(), cpu_requested * reserved, ram_requested * reserved, false, cpuOvercommitRatio, memoryOvercommitRatio, true)) {
                     if (LOGGER.isDebugEnabled()) {
-                        LOGGER.debug(String.format("Found host ID: %s for with enough capacity, CPU=%d RAM=%d", h.getUuid(), cpu_requested * reserved, ram_requested * reserved));
+                        LOGGER.debug(String.format("Found host : %s for with enough capacity, CPU=%d RAM=%s", h.getName(), cpu_requested * reserved, toHumanReadableSize(ram_requested * reserved)));
                     }
                     hostEntry.setValue(new Pair<HostVO, Integer>(h, reserved));
                     suitable_host_found = true;
@@ -238,19 +240,21 @@
             }
             if (!suitable_host_found) {
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Suitable hosts not found in datacenter ID: %s for node %d, with offering ID: %s and hypervisor: %s", zone.getUuid(), i, offering.getUuid(), clusterTemplate.getHypervisorType().toString()));
+                    LOGGER.info(String.format("Suitable hosts not found in datacenter : %s for node %d, with offering : %s and hypervisor: %s",
+                        zone.getName(), i, offering.getName(), clusterTemplate.getHypervisorType().toString()));
                 }
                 break;
             }
         }
         if (suitable_host_found) {
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Suitable hosts found in datacenter ID: %s, creating deployment destination", zone.getUuid()));
+                LOGGER.info(String.format("Suitable hosts found in datacenter : %s, creating deployment destination", zone.getName()));
             }
             return new DeployDestination(zone, null, null, null);
         }
-        String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%d) with offering ID: %s and hypervisor: %s",
-                cpu_requested * nodesCount, ram_requested * nodesCount, offering.getUuid(), clusterTemplate.getHypervisorType().toString());
+        String msg = String.format("Cannot find enough capacity for Kubernetes cluster(requested cpu=%d memory=%s) with offering : %s and hypervisor: %s",
+                cpu_requested * nodesCount, toHumanReadableSize(ram_requested * nodesCount), offering.getName(), clusterTemplate.getHypervisorType().toString());
+
         LOGGER.warn(msg);
         throw new InsufficientServerCapacityException(msg, DataCenter.class, zone.getId());
     }
@@ -259,7 +263,7 @@
         ServiceOffering offering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
         DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
         if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug(String.format("Checking deployment destination for Kubernetes cluster ID: %s in zone ID: %s", kubernetesCluster.getUuid(), zone.getUuid()));
+            LOGGER.debug(String.format("Checking deployment destination for Kubernetes cluster : %s in zone : %s", kubernetesCluster.getName(), zone.getName()));
         }
         return plan(kubernetesCluster.getTotalNodeCount(), zone, offering);
     }
@@ -273,16 +277,16 @@
             f.set(startVm, vm.getId());
             userVmService.startVirtualMachine(startVm);
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Started VM ID: %s in the Kubernetes cluster ID: %s", vm.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.info(String.format("Started VM : %s in the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
             }
         } catch (IllegalAccessException | NoSuchFieldException | ExecutionException |
                 ResourceUnavailableException | ResourceAllocationException | InsufficientCapacityException ex) {
-            throw new ManagementServerException(String.format("Failed to start VM in the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), ex);
+            throw new ManagementServerException(String.format("Failed to start VM in the Kubernetes cluster : %s", kubernetesCluster.getName()), ex);
         }
 
         UserVm startVm = userVmDao.findById(vm.getId());
         if (!startVm.getState().equals(VirtualMachine.State.Running)) {
-            throw new ManagementServerException(String.format("Failed to start VM in the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            throw new ManagementServerException(String.format("Failed to start VM in the Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
     }
 
@@ -295,11 +299,11 @@
             startKubernetesVM(vm);
             vm = userVmDao.findById(vm.getId());
             if (vm == null) {
-                throw new ManagementServerException(String.format("Failed to provision worker VM for Kubernetes cluster ID: %s" , kubernetesCluster.getUuid()));
+                throw new ManagementServerException(String.format("Failed to provision worker VM for Kubernetes cluster : %s" , kubernetesCluster.getName()));
             }
             nodes.add(vm);
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Provisioned node VM ID: %s in to the Kubernetes cluster ID: %s", vm.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.info(String.format("Provisioned node VM : %s in to the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
             }
         }
         return nodes;
@@ -337,7 +341,7 @@
                 Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
                 null, addrs, null, null, null, customParameterMap, null, null, null, null);
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Created node VM ID: %s, %s in the Kubernetes cluster ID: %s", nodeVm.getUuid(), hostName, kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Created node VM : %s, %s in the Kubernetes cluster : %s", hostName, nodeVm.getUuid(), kubernetesCluster.getName()));
         }
         return nodeVm;
     }
@@ -432,7 +436,7 @@
                 });
                 rulesService.applyPortForwardingRules(publicIp.getId(), account);
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Provisioned SSH port forwarding rule from port %d to 22 on %s to the VM IP : %s in Kubernetes cluster ID: %s", srcPortFinal, publicIp.getAddress().addr(), vmIp.toString(), kubernetesCluster.getUuid()));
+                    LOGGER.info(String.format("Provisioned SSH port forwarding rule from port %d to 22 on %s to the VM IP : %s in Kubernetes cluster : %s", srcPortFinal, publicIp.getAddress().addr(), vmIp.toString(), kubernetesCluster.getName()));
                 }
             }
         }
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
index 0d6a028..1fce00b 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java
@@ -109,13 +109,13 @@
     private void scaleKubernetesClusterNetworkRules(final List<Long> clusterVMIds, final List<Long> removedVMIds) throws ManagementServerException {
         if (!Network.GuestType.Isolated.equals(network.getGuestType())) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Network ID: %s for Kubernetes cluster ID: %s is not an isolated network, therefore, no need for network rules", network.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Network : %s for Kubernetes cluster : %s is not an isolated network, therefore, no need for network rules", network.getName(), kubernetesCluster.getName()));
             }
             return;
         }
         IpAddress publicIp = getSourceNatIp(network);
         if (publicIp == null) {
-            throw new ManagementServerException(String.format("No source NAT IP addresses found for network ID: %s, Kubernetes cluster ID: %s", network.getUuid(), kubernetesCluster.getUuid()));
+            throw new ManagementServerException(String.format("No source NAT IP addresses found for network : %s, Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
         }
 
         // Remove existing SSH firewall rules
@@ -133,19 +133,19 @@
                         CLUSTER_NODES_DEFAULT_START_SSH_PORT, CLUSTER_NODES_DEFAULT_START_SSH_PORT + scaledTotalNodeCount - 1, publicIp.getAddress().addr(), kubernetesCluster.getUuid()));
             }
         } catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException e) {
-            throw new ManagementServerException(String.format("Failed to activate SSH firewall rules for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to activate SSH firewall rules for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
 
         try {
             removePortForwardingRules(publicIp, network, owner, removedVMIds);
         } catch (ResourceUnavailableException e) {
-            throw new ManagementServerException(String.format("Failed to remove SSH port forwarding rules for removed VMs for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to remove SSH port forwarding rules for removed VMs for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
 
         try {
             provisionSshPortForwardingRules(publicIp, network, owner, clusterVMIds, existingFirewallRuleSourcePortEnd + 1);
         } catch (ResourceUnavailableException | NetworkRuleConflictException e) {
-            throw new ManagementServerException(String.format("Failed to activate SSH port forwarding rules for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to activate SSH port forwarding rules for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
     }
 
@@ -195,7 +195,7 @@
                         pkFile, null, String.format("sudo kubectl drain %s --ignore-daemonsets --delete-local-data", hostName),
                         10000, 10000, 60000);
                 if (!result.first()) {
-                    LOGGER.warn(String.format("Draining node: %s on VM ID: %s in Kubernetes cluster ID: %s unsuccessful", hostName, userVm.getUuid(), kubernetesCluster.getUuid()));
+                    LOGGER.warn(String.format("Draining node: %s on VM : %s in Kubernetes cluster : %s unsuccessful", hostName, userVm.getDisplayName(), kubernetesCluster.getName()));
                 } else {
                     result = SshHelper.sshExecute(ipAddress, port, CLUSTER_NODE_VM_USER,
                             pkFile, null, String.format("sudo kubectl delete node %s", hostName),
@@ -203,18 +203,18 @@
                     if (result.first()) {
                         return true;
                     } else {
-                        LOGGER.warn(String.format("Deleting node: %s on VM ID: %s in Kubernetes cluster ID: %s unsuccessful", hostName, userVm.getUuid(), kubernetesCluster.getUuid()));
+                        LOGGER.warn(String.format("Deleting node: %s on VM : %s in Kubernetes cluster : %s unsuccessful", hostName, userVm.getDisplayName(), kubernetesCluster.getName()));
                     }
                 }
                 break;
             } catch (Exception e) {
-                String msg = String.format("Failed to remove Kubernetes cluster ID: %s node: %s on VM ID: %s", kubernetesCluster.getUuid(), hostName, userVm.getUuid());
+                String msg = String.format("Failed to remove Kubernetes cluster : %s node: %s on VM : %s", kubernetesCluster.getName(), hostName, userVm.getDisplayName());
                 LOGGER.warn(msg, e);
             }
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ie) {
-                LOGGER.error(String.format("Error while waiting for Kubernetes cluster ID: %s node: %s on VM ID: %s removal", kubernetesCluster.getUuid(), hostName, userVm.getUuid()), ie);
+                LOGGER.error(String.format("Error while waiting for Kubernetes cluster : %s node: %s on VM : %s removal", kubernetesCluster.getName(), hostName, userVm.getDisplayName()), ie);
             }
             retryCounter++;
         }
@@ -228,7 +228,7 @@
         final long originalNodeCount = kubernetesCluster.getTotalNodeCount();
         List<KubernetesClusterVmMapVO> vmList = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId());
         if (vmList == null || vmList.isEmpty() || vmList.size() < originalNodeCount) {
-            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster ID: %s failed, it is in unstable state as not enough existing VM instances found!", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster : %s failed, it is in unstable state as not enough existing VM instances found!", kubernetesCluster.getName()));
         } else {
             for (KubernetesClusterVmMapVO vmMapVO : vmList) {
                 VMInstanceVO vmInstance = vmInstanceDao.findById(vmMapVO.getVmId());
@@ -236,7 +236,7 @@
                         vmInstance.getHypervisorType() != Hypervisor.HypervisorType.XenServer &&
                         vmInstance.getHypervisorType() != Hypervisor.HypervisorType.VMware &&
                         vmInstance.getHypervisorType() != Hypervisor.HypervisorType.Simulator) {
-                    logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster ID: %s failed, scaling Kubernetes cluster with running VMs on hypervisor %s is not supported!", kubernetesCluster.getUuid(), vmInstance.getHypervisorType()));
+                    logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster : %s failed, scaling Kubernetes cluster with running VMs on hypervisor %s is not supported!", kubernetesCluster.getName(), vmInstance.getHypervisorType()));
                 }
             }
         }
@@ -245,13 +245,13 @@
     private void validateKubernetesClusterScaleSizeParameters() throws CloudRuntimeException {
         final long originalClusterSize = kubernetesCluster.getNodeCount();
         if (network == null) {
-            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster ID: %s, cluster network not found", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster : %s, cluster network not found", kubernetesCluster.getName()));
         }
         // Check capacity and transition state
         final long newVmRequiredCount = clusterSize - originalClusterSize;
         final ServiceOffering clusterServiceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
         if (clusterServiceOffering == null) {
-            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster ID: %s, cluster service offering not found", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster : %s, cluster service offering not found", kubernetesCluster.getName()));
         }
         if (newVmRequiredCount > 0) {
             final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
@@ -262,12 +262,12 @@
                     plan(kubernetesCluster.getTotalNodeCount() + newVmRequiredCount, zone, clusterServiceOffering);
                 }
             } catch (InsufficientCapacityException e) {
-                logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster ID: %s in zone ID: %s, insufficient capacity", kubernetesCluster.getUuid(), zone.getUuid()));
+                logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster : %s in zone : %s, insufficient capacity", kubernetesCluster.getName(), zone.getName()));
             }
         }
         List<KubernetesClusterVmMapVO> vmList = kubernetesClusterVmMapDao.listByClusterId(kubernetesCluster.getId());
         if (CollectionUtils.isEmpty(vmList) || vmList.size() < kubernetesCluster.getTotalNodeCount()) {
-            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, it is in unstable state as not enough existing VM instances found", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, it is in unstable state as not enough existing VM instances found", kubernetesCluster.getName()));
         }
     }
 
@@ -290,13 +290,13 @@
             try {
                 result = userVmManager.upgradeVirtualMachine(userVM.getId(), serviceOffering.getId(), new HashMap<String, String>());
             } catch (ResourceUnavailableException | ManagementServerException | ConcurrentOperationException | VirtualMachineMigrationException e) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster ID: %s failed, unable to scale cluster VM ID: %s", kubernetesCluster.getUuid(), userVM.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed, e);
+                logTransitStateAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster : %s failed, unable to scale cluster VM : %s", kubernetesCluster.getName(), userVM.getDisplayName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed, e);
             }
             if (!result) {
-                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster ID: %s failed, unable to scale cluster VM ID: %s", kubernetesCluster.getUuid(), userVM.getUuid()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster : %s failed, unable to scale cluster VM : %s", kubernetesCluster.getName(), userVM.getDisplayName()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
             if (System.currentTimeMillis() > scaleTimeoutTime) {
-                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster ID: %s failed, scaling action timed out", kubernetesCluster.getUuid()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster : %s failed, scaling action timed out", kubernetesCluster.getName()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
         }
         kubernetesCluster = updateKubernetesClusterEntry(null, serviceOffering);
@@ -313,7 +313,7 @@
             KubernetesClusterVmMapVO vmMapVO = originalVmList.get(i);
             UserVmVO userVM = userVmDao.findById(vmMapVO.getVmId());
             if (!removeKubernetesClusterNode(publicIpAddress, sshPort, userVM, 3, 30000)) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, failed to remove Kubernetes node: %s running on VM ID: %s", kubernetesCluster.getUuid(), userVM.getHostName(), userVM.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, failed to remove Kubernetes node: %s running on VM : %s", kubernetesCluster.getName(), userVM.getHostName(), userVM.getDisplayName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
             // For removing port-forwarding network rules
             removedVmIds.add(userVM.getId());
@@ -331,7 +331,7 @@
             }
             kubernetesClusterVmMapDao.expunge(vmMapVO.getId());
             if (System.currentTimeMillis() > scaleTimeoutTime) {
-                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster ID: %s failed, scaling action timed out", kubernetesCluster.getUuid()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.WARN, String.format("Scaling Kubernetes cluster : %s failed, scaling action timed out", kubernetesCluster.getName()),kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
             i--;
         }
@@ -339,7 +339,7 @@
         try {
             scaleKubernetesClusterNetworkRules(null, removedVmIds);
         } catch (ManagementServerException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, unable to update network rules", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, unable to update network rules", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed, e);
         }
     }
 
@@ -352,7 +352,7 @@
         try {
             clusterVMs = provisionKubernetesClusterNodeVms((int)(newVmCount + kubernetesCluster.getNodeCount()), (int)kubernetesCluster.getNodeCount(), publicIpAddress);
         } catch (CloudRuntimeException | ManagementServerException | ResourceUnavailableException | InsufficientCapacityException e) {
-            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, unable to provision node VM in the cluster", kubernetesCluster.getUuid()), e);
+            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, unable to provision node VM in the cluster", kubernetesCluster.getName()), e);
         }
         attachIsoKubernetesVMs(clusterVMs);
         for (UserVm vm : clusterVMs) {
@@ -361,7 +361,7 @@
         try {
             scaleKubernetesClusterNetworkRules(clusterVMIds, null);
         } catch (ManagementServerException e) {
-            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, unable to update network rules", kubernetesCluster.getUuid()), e);
+            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, unable to update network rules", kubernetesCluster.getName()), e);
         }
         KubernetesClusterVO kubernetesClusterVO = kubernetesClusterDao.findById(kubernetesCluster.getId());
         kubernetesClusterVO.setNodeCount(clusterSize);
@@ -369,7 +369,7 @@
                 CLUSTER_NODE_VM_USER, sshKeyFile, scaleTimeoutTime, 15000);
         detachIsoKubernetesVMs(clusterVMs);
         if (!readyNodesCountValid) { // Scaling failed
-            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling unsuccessful for Kubernetes cluster ID: %s as it does not have desired number of nodes in ready state", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling unsuccessful for Kubernetes cluster : %s as it does not have desired number of nodes in ready state", kubernetesCluster.getName()));
         }
     }
 
@@ -388,7 +388,7 @@
         publicIpAddress = publicIpSshPort.first();
         sshPort = publicIpSshPort.second();
         if (Strings.isNullOrEmpty(publicIpAddress)) {
-            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster ID: %s, unable to retrieve associated public IP", kubernetesCluster.getUuid()));
+            logTransitStateToFailedIfNeededAndThrow(Level.ERROR, String.format("Scaling failed for Kubernetes cluster : %s, unable to retrieve associated public IP", kubernetesCluster.getName()));
         }
         if (newVmRequiredCount < 0) { // downscale
             scaleDownKubernetesClusterSize();
@@ -401,13 +401,13 @@
     public boolean scaleCluster() throws CloudRuntimeException {
         init();
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Scaling Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Scaling Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         scaleTimeoutTime = System.currentTimeMillis() + KubernetesClusterService.KubernetesClusterScaleTimeout.value() * 1000;
         final long originalClusterSize = kubernetesCluster.getNodeCount();
         final ServiceOffering existingServiceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
         if (existingServiceOffering == null) {
-            logAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster ID: %s failed, service offering for the Kubernetes cluster not found!", kubernetesCluster.getUuid()));
+            logAndThrow(Level.ERROR, String.format("Scaling Kubernetes cluster : %s failed, service offering for the Kubernetes cluster not found!", kubernetesCluster.getName()));
         }
         final boolean serviceOfferingScalingNeeded = serviceOffering != null && serviceOffering.getId() != existingServiceOffering.getId();
         final boolean clusterSizeScalingNeeded = clusterSize != null && clusterSize != originalClusterSize;
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
index 90c0375..855c264 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStartWorker.java
@@ -121,7 +121,7 @@
                     haSupported = true;
                 }
             } catch (IllegalArgumentException e) {
-                LOGGER.error(String.format("Unable to compare Kubernetes version for cluster version ID: %s with %s", version.getUuid(), KubernetesClusterService.MIN_KUBERNETES_VERSION_HA_SUPPORT), e);
+                LOGGER.error(String.format("Unable to compare Kubernetes version for cluster version : %s with %s", version.getName(), KubernetesClusterService.MIN_KUBERNETES_VERSION_HA_SUPPORT), e);
             }
         }
         return haSupported;
@@ -213,7 +213,7 @@
                 Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
                 requestedIps, addrs, null, null, null, customParameterMap, null, null, null, null);
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Created master VM ID: %s, %s in the Kubernetes cluster ID: %s", masterVm.getUuid(), hostName, kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Created master VM ID: %s, %s in the Kubernetes cluster : %s", masterVm.getUuid(), hostName, kubernetesCluster.getName()));
         }
         return masterVm;
     }
@@ -267,7 +267,7 @@
                 Hypervisor.HypervisorType.None, BaseCmd.HTTPMethod.POST, base64UserData, kubernetesCluster.getKeyPair(),
                 null, addrs, null, null, null, customParameterMap, null, null, null, null);
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Created master VM ID: %s, %s in the Kubernetes cluster ID: %s", additionalMasterVm.getUuid(), hostName, kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Created master VM ID : %s, %s in the Kubernetes cluster : %s", additionalMasterVm.getUuid(), hostName, kubernetesCluster.getName()));
         }
         return additionalMasterVm;
     }
@@ -280,10 +280,10 @@
         startKubernetesVM(k8sMasterVM);
         k8sMasterVM = userVmDao.findById(k8sMasterVM.getId());
         if (k8sMasterVM == null) {
-            throw new ManagementServerException(String.format("Failed to provision master VM for Kubernetes cluster ID: %s" , kubernetesCluster.getUuid()));
+            throw new ManagementServerException(String.format("Failed to provision master VM for Kubernetes cluster : %s" , kubernetesCluster.getName()));
         }
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Provisioned the master VM ID: %s in to the Kubernetes cluster ID: %s", k8sMasterVM.getUuid(), kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Provisioned the master VM : %s in to the Kubernetes cluster : %s", k8sMasterVM.getDisplayName(), kubernetesCluster.getName()));
         }
         return k8sMasterVM;
     }
@@ -299,11 +299,11 @@
                 startKubernetesVM(vm);
                 vm = userVmDao.findById(vm.getId());
                 if (vm == null) {
-                    throw new ManagementServerException(String.format("Failed to provision additional master VM for Kubernetes cluster ID: %s" , kubernetesCluster.getUuid()));
+                    throw new ManagementServerException(String.format("Failed to provision additional master VM for Kubernetes cluster : %s" , kubernetesCluster.getName()));
                 }
                 additionalMasters.add(vm);
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Provisioned additional master VM ID: %s in to the Kubernetes cluster ID: %s", vm.getUuid(), kubernetesCluster.getUuid()));
+                    LOGGER.info(String.format("Provisioned additional master VM : %s in to the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
                 }
             }
         }
@@ -314,7 +314,7 @@
         final ReservationContext context = new ReservationContextImpl(null, null, null, owner);
         Network network = networkDao.findById(kubernetesCluster.getNetworkId());
         if (network == null) {
-            String msg  = String.format("Network for Kubernetes cluster ID: %s not found", kubernetesCluster.getUuid());
+            String msg  = String.format("Network for Kubernetes cluster : %s not found", kubernetesCluster.getName());
             LOGGER.warn(msg);
             stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
             throw new ManagementServerException(msg);
@@ -322,10 +322,10 @@
         try {
             networkMgr.startNetwork(network.getId(), destination, context);
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Network ID: %s is started for the  Kubernetes cluster ID: %s", network.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.info(String.format("Network : %s is started for the  Kubernetes cluster : %s", network.getName(), kubernetesCluster.getName()));
             }
         } catch (ConcurrentOperationException | ResourceUnavailableException |InsufficientCapacityException e) {
-            String msg = String.format("Failed to start Kubernetes cluster ID: %s as unable to start associated network ID: %s" , kubernetesCluster.getUuid(), network.getUuid());
+            String msg = String.format("Failed to start Kubernetes cluster : %s as unable to start associated network : %s" , kubernetesCluster.getName(), network.getName());
             LOGGER.error(msg, e);
             stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
             throw new ManagementServerException(msg, e);
@@ -365,7 +365,7 @@
     private void setupKubernetesClusterNetworkRules(Network network, List<UserVm> clusterVMs) throws ManagementServerException {
         if (!Network.GuestType.Isolated.equals(network.getGuestType())) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Network ID: %s for Kubernetes cluster ID: %s is not an isolated network, therefore, no need for network rules", network.getUuid(), kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Network : %s for Kubernetes cluster : %s is not an isolated network, therefore, no need for network rules", network.getName(), kubernetesCluster.getName()));
             }
             return;
         }
@@ -375,7 +375,8 @@
         }
         IpAddress publicIp = getSourceNatIp(network);
         if (publicIp == null) {
-            throw new ManagementServerException(String.format("No source NAT IP addresses found for network ID: %s, Kubernetes cluster ID: %s", network.getUuid(), kubernetesCluster.getUuid()));
+            throw new ManagementServerException(String.format("No source NAT IP addresses found for network : %s, Kubernetes cluster : %s",
+                network.getName(), kubernetesCluster.getName()));
         }
 
         try {
@@ -385,31 +386,31 @@
                         CLUSTER_API_PORT, publicIp.getAddress().addr(), kubernetesCluster.getUuid()));
             }
         } catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | NetworkRuleConflictException e) {
-            throw new ManagementServerException(String.format("Failed to provision firewall rules for API access for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to provision firewall rules for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
 
         try {
             int endPort = CLUSTER_NODES_DEFAULT_START_SSH_PORT + clusterVMs.size() - 1;
             provisionFirewallRules(publicIp, owner, CLUSTER_NODES_DEFAULT_START_SSH_PORT, endPort);
             if (LOGGER.isInfoEnabled()) {
-                LOGGER.info(String.format("Provisioned firewall rule to open up port %d to %d on %s for Kubernetes cluster ID: %s", CLUSTER_NODES_DEFAULT_START_SSH_PORT, endPort, publicIp.getAddress().addr(), kubernetesCluster.getUuid()));
+                LOGGER.info(String.format("Provisioned firewall rule to open up port %d to %d on %s for Kubernetes cluster : %s", CLUSTER_NODES_DEFAULT_START_SSH_PORT, endPort, publicIp.getAddress().addr(), kubernetesCluster.getName()));
             }
         } catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException | NetworkRuleConflictException e) {
-            throw new ManagementServerException(String.format("Failed to provision firewall rules for SSH access for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to provision firewall rules for SSH access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
 
         // Load balancer rule fo API access for master node VMs
         try {
             provisionLoadBalancerRule(publicIp, network, owner, clusterVMIds, CLUSTER_API_PORT);
         } catch (NetworkRuleConflictException | InsufficientAddressCapacityException e) {
-            throw new ManagementServerException(String.format("Failed to provision load balancer rule for API access for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to provision load balancer rule for API access for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
 
         // Port forwarding rule fo SSH access on each node VM
         try {
             provisionSshPortForwardingRules(publicIp, network, owner, clusterVMIds, CLUSTER_NODES_DEFAULT_START_SSH_PORT);
         } catch (ResourceUnavailableException | NetworkRuleConflictException e) {
-            throw new ManagementServerException(String.format("Failed to activate SSH port forwarding rules for the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+            throw new ManagementServerException(String.format("Failed to activate SSH port forwarding rules for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
         }
     }
 
@@ -417,19 +418,19 @@
         List <UserVm> clusterVms = getKubernetesClusterVMs();
         for (final UserVm vm : clusterVms) {
             if (vm == null) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Failed to start all VMs in Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.ERROR, String.format("Failed to start all VMs in Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
             try {
                 startKubernetesVM(vm);
             } catch (ManagementServerException ex) {
-                LOGGER.warn(String.format("Failed to start VM ID: %s in Kubernetes cluster ID: %s due to ", vm.getUuid(), kubernetesCluster.getUuid()) + ex);
+                LOGGER.warn(String.format("Failed to start VM : %s in Kubernetes cluster : %s due to ", vm.getDisplayName(), kubernetesCluster.getName()) + ex);
                 // dont bail out here. proceed further to stop the reset of the VM's
             }
         }
         for (final UserVm userVm : clusterVms) {
             UserVm vm = userVmDao.findById(userVm.getId());
             if (vm == null || !vm.getState().equals(VirtualMachine.State.Running)) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Failed to start all VMs in Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.ERROR, String.format("Failed to start all VMs in Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
         }
     }
@@ -477,7 +478,7 @@
     public boolean startKubernetesClusterOnCreate() {
         init();
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Starting Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Starting Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         final long startTimeoutTime = System.currentTimeMillis() + KubernetesClusterService.KubernetesClusterStartTimeout.value() * 1000;
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.StartRequested);
@@ -491,52 +492,52 @@
         try {
             network = startKubernetesClusterNetwork(dest);
         } catch (ManagementServerException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s as its network cannot be started", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s as its network cannot be started", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
         }
         Pair<String, Integer> publicIpSshPort = getKubernetesClusterServerIpSshPort(null);
         publicIpAddress = publicIpSshPort.first();
         if (Strings.isNullOrEmpty(publicIpAddress) &&
                 (Network.GuestType.Isolated.equals(network.getGuestType()) || kubernetesCluster.getMasterNodeCount() > 1)) { // Shared network, single-master cluster won't have an IP yet
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s as no public IP found for the cluster" , kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s as no public IP found for the cluster" , kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
         }
         List<UserVm> clusterVMs = new ArrayList<>();
         UserVm k8sMasterVM = null;
         try {
             k8sMasterVM = provisionKubernetesClusterMasterVm(network, publicIpAddress);
         } catch (CloudRuntimeException | ManagementServerException | ResourceUnavailableException | InsufficientCapacityException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning the master VM failed in the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning the master VM failed in the Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
         }
         clusterVMs.add(k8sMasterVM);
         if (Strings.isNullOrEmpty(publicIpAddress)) {
             publicIpSshPort = getKubernetesClusterServerIpSshPort(k8sMasterVM);
             publicIpAddress = publicIpSshPort.first();
             if (Strings.isNullOrEmpty(publicIpAddress)) {
-                logTransitStateAndThrow(Level.WARN, String.format("Failed to start Kubernetes cluster ID: %s as no public IP found for the cluster", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
+                logTransitStateAndThrow(Level.WARN, String.format("Failed to start Kubernetes cluster : %s as no public IP found for the cluster", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
             }
         }
         try {
             List<UserVm> additionalMasterVMs = provisionKubernetesClusterAdditionalMasterVms(publicIpAddress);
             clusterVMs.addAll(additionalMasterVMs);
         }  catch (CloudRuntimeException | ManagementServerException | ResourceUnavailableException | InsufficientCapacityException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning additional master VM failed in the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning additional master VM failed in the Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
         }
         try {
             List<UserVm> nodeVMs = provisionKubernetesClusterNodeVms(kubernetesCluster.getNodeCount(), publicIpAddress);
             clusterVMs.addAll(nodeVMs);
         }  catch (CloudRuntimeException | ManagementServerException | ResourceUnavailableException | InsufficientCapacityException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning node VM failed in the Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Provisioning node VM failed in the Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
         }
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Kubernetes cluster ID: %s VMs successfully provisioned", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Kubernetes cluster : %s VMs successfully provisioned", kubernetesCluster.getName()));
         }
         try {
             setupKubernetesClusterNetworkRules(network, clusterVMs);
         } catch (ManagementServerException e) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster ID: %s, unable to setup network rules", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s, unable to setup network rules", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
         }
         attachIsoKubernetesVMs(clusterVMs);
         if (!KubernetesClusterUtil.isKubernetesClusterMasterVmRunning(kubernetesCluster, publicIpAddress, publicIpSshPort.second(), startTimeoutTime)) {
-            String msg = String.format("Failed to setup Kubernetes cluster ID: %s in usable state as unable to access master node VMs of the cluster", kubernetesCluster.getUuid());
+            String msg = String.format("Failed to setup Kubernetes cluster : %s in usable state as unable to access master node VMs of the cluster", kubernetesCluster.getName());
             if (kubernetesCluster.getMasterNodeCount() > 1 && Network.GuestType.Shared.equals(network.getGuestType())) {
                 msg = String.format("%s. Make sure external load-balancer has port forwarding rules for SSH access on ports %d-%d and API access on port %d",
                         msg,
@@ -548,7 +549,7 @@
         }
         boolean k8sApiServerSetup = KubernetesClusterUtil.isKubernetesClusterServerRunning(kubernetesCluster, publicIpAddress, CLUSTER_API_PORT, startTimeoutTime, 15000);
         if (!k8sApiServerSetup) {
-            logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster ID: %s in usable state as unable to provision API endpoint for the cluster", kubernetesCluster.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.CreateFailed, null);
+            logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s in usable state as unable to provision API endpoint for the cluster", kubernetesCluster.getName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.CreateFailed, null);
         }
         sshPort = publicIpSshPort.second();
         updateKubernetesClusterEntryEndpoint();
@@ -556,13 +557,13 @@
                 CLUSTER_NODE_VM_USER, sshKeyFile, startTimeoutTime, 15000);
         detachIsoKubernetesVMs(clusterVMs);
         if (!readyNodesCountValid) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster ID: %s as it does not have desired number of nodes in ready state", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s as it does not have desired number of nodes in ready state", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed);
         }
         if (!isKubernetesClusterKubeConfigAvailable(startTimeoutTime)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster ID: %s in usable state as unable to retrieve kube-config for the cluster", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s in usable state as unable to retrieve kube-config for the cluster", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         if (!isKubernetesClusterDashboardServiceRunning(true, startTimeoutTime)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster ID: %s in usable state as unable to get Dashboard service running for the cluster", kubernetesCluster.getUuid()), kubernetesCluster.getId(),KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s in usable state as unable to get Dashboard service running for the cluster", kubernetesCluster.getName()), kubernetesCluster.getId(),KubernetesCluster.Event.OperationFailed);
         }
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
         return true;
@@ -571,7 +572,7 @@
     public boolean startStoppedKubernetesCluster() throws CloudRuntimeException {
         init();
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Starting Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Starting Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         final long startTimeoutTime = System.currentTimeMillis() + KubernetesClusterService.KubernetesClusterStartTimeout.value() * 1000;
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.StartRequested);
@@ -579,26 +580,26 @@
         try {
             InetAddress address = InetAddress.getByName(new URL(kubernetesCluster.getEndpoint()).getHost());
         } catch (MalformedURLException | UnknownHostException ex) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Kubernetes cluster ID: %s has invalid API endpoint. Can not verify if cluster is in ready state", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Kubernetes cluster : %s has invalid API endpoint. Can not verify if cluster is in ready state", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         Pair<String, Integer> sshIpPort =  getKubernetesClusterServerIpSshPort(null);
         publicIpAddress = sshIpPort.first();
         sshPort = sshIpPort.second();
         if (Strings.isNullOrEmpty(publicIpAddress)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s as no public IP found for the cluster" , kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s as no public IP found for the cluster" , kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         if (!KubernetesClusterUtil.isKubernetesClusterServerRunning(kubernetesCluster, publicIpAddress, CLUSTER_API_PORT, startTimeoutTime, 15000)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s in usable state", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s in usable state", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         if (!isKubernetesClusterKubeConfigAvailable(startTimeoutTime)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s in usable state as unable to retrieve kube-config for the cluster", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s in usable state as unable to retrieve kube-config for the cluster", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         if (!isKubernetesClusterDashboardServiceRunning(false, startTimeoutTime)) {
-            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster ID: %s in usable state as unable to get Dashboard service running for the cluster", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+            logTransitStateAndThrow(Level.ERROR, String.format("Failed to start Kubernetes cluster : %s in usable state as unable to get Dashboard service running for the cluster", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
         }
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Kubernetes cluster ID: %s successfully started", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Kubernetes cluster : %s successfully started", kubernetesCluster.getName()));
         }
         return true;
     }
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
index a8e1a2c..6821750 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterStopWorker.java
@@ -36,24 +36,26 @@
     public boolean stop() throws CloudRuntimeException {
         init();
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Stopping Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Stopping Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.StopRequested);
         List<UserVm> clusterVMs = getKubernetesClusterVMs();
         for (UserVm vm : clusterVMs) {
             if (vm == null) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Failed to find all VMs in Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.ERROR, String.format("Failed to find all VMs in Kubernetes cluster : %s", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
             try {
                 userVmService.stopVirtualMachine(vm.getId(), false);
             } catch (ConcurrentOperationException ex) {
-                LOGGER.warn(String.format("Failed to stop VM ID: %s in Kubernetes cluster ID: %s", vm.getUuid(), kubernetesCluster.getUuid()), ex);
+                LOGGER.warn(String.format("Failed to stop VM : %s in Kubernetes cluster : %s",
+                    vm.getDisplayName(), kubernetesCluster.getName()), ex);
             }
         }
         for (final UserVm userVm : clusterVMs) {
             UserVm vm = userVmDao.findById(userVm.getId());
             if (vm == null || !vm.getState().equals(VirtualMachine.State.Stopped)) {
-                logTransitStateAndThrow(Level.ERROR, String.format("Failed to stop all VMs in Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
+                logTransitStateAndThrow(Level.ERROR, String.format("Failed to stop all VMs in Kubernetes cluster : %s",
+                    kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.OperationFailed);
             }
         }
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.OperationSucceeded);
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterUpgradeWorker.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterUpgradeWorker.java
index 0ef624a..957adea 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterUpgradeWorker.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterUpgradeWorker.java
@@ -63,7 +63,7 @@
             upgradeScriptFileWriter.write(upgradeScriptData);
             upgradeScriptFileWriter.close();
         } catch (IOException e) {
-            logAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to prepare upgrade script", kubernetesCluster.getUuid()), e);
+            logAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to prepare upgrade script", kubernetesCluster.getName()), e);
         }
     }
 
@@ -101,31 +101,31 @@
                         String.format("sudo kubectl drain %s --ignore-daemonsets --delete-local-data", hostName),
                         10000, 10000, 60000);
             } catch (Exception e) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to drain Kubernetes node on VM ID: %s", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, e);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to drain Kubernetes node on VM : %s", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, e);
             }
             if (!result.first()) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to drain Kubernetes node on VM ID: %s", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to drain Kubernetes node on VM : %s", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
             }
             if (System.currentTimeMillis() > upgradeTimeoutTime) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, upgrade action timed out", kubernetesCluster.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, upgrade action timed out", kubernetesCluster.getName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
             }
             try {
                 result = runInstallScriptOnVM(vm, i);
             } catch (Exception e) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to upgrade Kubernetes node on VM ID: %s", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, e);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to upgrade Kubernetes node on VM : %s", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, e);
             }
             if (!result.first()) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to upgrade Kubernetes node on VM ID: %s", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to upgrade Kubernetes node on VM : %s", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
             }
             if (System.currentTimeMillis() > upgradeTimeoutTime) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, upgrade action timed out", kubernetesCluster.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, upgrade action timed out", kubernetesCluster.getName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
             }
             if (!KubernetesClusterUtil.uncordonKubernetesClusterNode(kubernetesCluster, publicIpAddress, sshPort, CLUSTER_NODE_VM_USER, getManagementServerSshPublicKeyFile(), vm, upgradeTimeoutTime, 15000)) {
-                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to uncordon Kubernetes node on VM ID: %s", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to uncordon Kubernetes node on VM : %s", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
             }
             if (i == 0) { // Wait for master to get in Ready state
                 if (!KubernetesClusterUtil.isKubernetesClusterNodeReady(kubernetesCluster, publicIpAddress, sshPort, CLUSTER_NODE_VM_USER, getManagementServerSshPublicKeyFile(), hostName, upgradeTimeoutTime, 15000)) {
-                    logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster ID: %s, unable to get master Kubernetes node on VM ID: %s in ready state", kubernetesCluster.getUuid(), vm.getUuid()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
+                    logTransitStateDetachIsoAndThrow(Level.ERROR, String.format("Failed to upgrade Kubernetes cluster : %s, unable to get master Kubernetes node on VM : %s in ready state", kubernetesCluster.getName(), vm.getDisplayName()), kubernetesCluster, clusterVMs, KubernetesCluster.Event.OperationFailed, null);
                 }
             }
             if (LOGGER.isInfoEnabled()) {
@@ -138,18 +138,18 @@
     public boolean upgradeCluster() throws CloudRuntimeException {
         init();
         if (LOGGER.isInfoEnabled()) {
-            LOGGER.info(String.format("Upgrading Kubernetes cluster ID: %s", kubernetesCluster.getUuid()));
+            LOGGER.info(String.format("Upgrading Kubernetes cluster : %s", kubernetesCluster.getName()));
         }
         upgradeTimeoutTime = System.currentTimeMillis() + KubernetesClusterService.KubernetesClusterUpgradeTimeout.value() * 1000;
         Pair<String, Integer> publicIpSshPort = getKubernetesClusterServerIpSshPort(null);
         publicIpAddress = publicIpSshPort.first();
         sshPort = publicIpSshPort.second();
         if (Strings.isNullOrEmpty(publicIpAddress)) {
-            logAndThrow(Level.ERROR, String.format("Upgrade failed for Kubernetes cluster ID: %s, unable to retrieve associated public IP", kubernetesCluster.getUuid()));
+            logAndThrow(Level.ERROR, String.format("Upgrade failed for Kubernetes cluster : %s, unable to retrieve associated public IP", kubernetesCluster.getName()));
         }
         clusterVMs = getKubernetesClusterVMs();
         if (CollectionUtils.isEmpty(clusterVMs)) {
-            logAndThrow(Level.ERROR, String.format("Upgrade failed for Kubernetes cluster ID: %s, unable to retrieve VMs for cluster", kubernetesCluster.getUuid()));
+            logAndThrow(Level.ERROR, String.format("Upgrade failed for Kubernetes cluster : %s, unable to retrieve VMs for cluster", kubernetesCluster.getName()));
         }
         retrieveUpgradeScriptFile();
         stateTransitTo(kubernetesCluster.getId(), KubernetesCluster.Event.UpgradeRequested);
diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
index 68cd916..b06cc00 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/utils/KubernetesClusterUtil.java
@@ -47,7 +47,7 @@
             return true;
         }
         if (LOGGER.isDebugEnabled()) {
-            LOGGER.debug(String.format("Failed to retrieve status for node: %s in Kubernetes cluster ID: %s. Output: %s", nodeName, kubernetesCluster.getUuid(), result.second()));
+            LOGGER.debug(String.format("Failed to retrieve status for node: %s in Kubernetes cluster : %s. Output: %s", nodeName, kubernetesCluster.getName(), result.second()));
         }
         return false;
     }
@@ -60,7 +60,7 @@
             try {
                 ready = isKubernetesClusterNodeReady(kubernetesCluster, ipAddress, port, user, sshKeyFile, nodeName);
             } catch (Exception e) {
-                LOGGER.warn(String.format("Failed to retrieve state of node: %s in Kubernetes cluster ID: %s", nodeName, kubernetesCluster.getUuid()), e);
+                LOGGER.warn(String.format("Failed to retrieve state of node: %s in Kubernetes cluster : %s", nodeName, kubernetesCluster.getName()), e);
             }
             if (ready) {
                 return true;
@@ -68,7 +68,7 @@
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ie) {
-                LOGGER.error(String.format("Error while waiting for Kubernetes cluster ID: %s node: %s to become ready", kubernetesCluster.getUuid(), nodeName), ie);
+                LOGGER.error(String.format("Error while waiting for Kubernetes cluster : %s node: %s to become ready", kubernetesCluster.getName(), nodeName), ie);
             }
         }
         return false;
@@ -108,12 +108,14 @@
                     return true;
                 }
             } catch (Exception e) {
-                LOGGER.warn(String.format("Failed to uncordon node: %s on VM ID: %s in Kubernetes cluster ID: %s", hostName, userVm.getUuid(), kubernetesCluster.getUuid()), e);
+                LOGGER.warn(String.format("Failed to uncordon node: %s on VM ID : %s in Kubernetes cluster : %s",
+                    hostName, userVm.getUuid(), kubernetesCluster.getName()), e);
             }
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ie) {
-                LOGGER.warn(String.format("Error while waiting for uncordon Kubernetes cluster ID: %s node: %s on VM ID: %s", kubernetesCluster.getUuid(), hostName, userVm.getUuid()), ie);
+                LOGGER.warn(String.format("Error while waiting for uncordon Kubernetes cluster : %s node: %s on VM : %s",
+                    kubernetesCluster.getName(), hostName, userVm.getUuid()), ie);
             }
         }
         return false;
@@ -136,14 +138,14 @@
                         lines) {
                     if (line.contains(serviceName) && line.contains("Running")) {
                         if (LOGGER.isDebugEnabled()) {
-                            LOGGER.debug(String.format("Service : %s in namespace: %s for the Kubernetes cluster ID: %s is running", serviceName, namespace, kubernetesCluster.getUuid()));
+                            LOGGER.debug(String.format("Service : %s in namespace: %s for the Kubernetes cluster : %s is running", serviceName, namespace, kubernetesCluster.getName()));
                         }
                         return true;
                     }
                 }
             }
         } catch (Exception e) {
-            LOGGER.warn(String.format("Unable to retrieve service: %s running status in namespace %s for Kubernetes cluster ID: %s", serviceName, namespace, kubernetesCluster.getUuid()), e);
+            LOGGER.warn(String.format("Unable to retrieve service: %s running status in namespace %s for Kubernetes cluster : %s", serviceName, namespace, kubernetesCluster.getName()), e);
         }
         return false;
     }
@@ -155,11 +157,11 @@
         // Check if dashboard service is up running.
         while (System.currentTimeMillis() < timeoutTime) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Checking dashboard service for the Kubernetes cluster ID: %s to come up", kubernetesCluster.getUuid()));
+                LOGGER.debug(String.format("Checking dashboard service for the Kubernetes cluster : %s to come up", kubernetesCluster.getName()));
             }
             if (isKubernetesClusterAddOnServiceRunning(kubernetesCluster, ipAddress, port, user, sshKeyFile, "kubernetes-dashboard", "kubernetes-dashboard")) {
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Dashboard service for the Kubernetes cluster ID: %s is in running state", kubernetesCluster.getUuid()));
+                    LOGGER.info(String.format("Dashboard service for the Kubernetes cluster : %s is in running state", kubernetesCluster.getName()));
                 }
                 running = true;
                 break;
@@ -167,7 +169,7 @@
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ex) {
-                LOGGER.error(String.format("Error while waiting for Kubernetes cluster: %s API dashboard service to be available", kubernetesCluster.getUuid()), ex);
+                LOGGER.error(String.format("Error while waiting for Kubernetes cluster: %s API dashboard service to be available", kubernetesCluster.getName()), ex);
             }
         }
         return running;
@@ -187,11 +189,11 @@
                     break;
                 } else  {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Failed to retrieve kube-config file for Kubernetes cluster ID: %s. Output: %s", kubernetesCluster.getUuid(), result.second()));
+                        LOGGER.info(String.format("Failed to retrieve kube-config file for Kubernetes cluster : %s. Output: %s", kubernetesCluster.getName(), result.second()));
                     }
                 }
             } catch (Exception e) {
-                LOGGER.warn(String.format("Failed to retrieve kube-config file for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+                LOGGER.warn(String.format("Failed to retrieve kube-config file for Kubernetes cluster : %s", kubernetesCluster.getName()), e);
             }
         }
         return kubeConfig;
@@ -207,7 +209,7 @@
             return Integer.parseInt(result.second().trim().replace("\"", ""));
         } else {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Failed to retrieve ready nodes for Kubernetes cluster ID: %s. Output: %s", kubernetesCluster.getUuid(), result.second()));
+                LOGGER.debug(String.format("Failed to retrieve ready nodes for Kubernetes cluster : %s. Output: %s", kubernetesCluster.getName(), result.second()));
             }
         }
         return 0;
@@ -221,18 +223,18 @@
                 String versionOutput = IOUtils.toString(new URL(String.format("https://%s:%d/version", ipAddress, port)), StringUtils.getPreferredCharset());
                 if (!Strings.isNullOrEmpty(versionOutput)) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Kubernetes cluster ID: %s API has been successfully provisioned, %s", kubernetesCluster.getUuid(), versionOutput));
+                        LOGGER.info(String.format("Kubernetes cluster : %s API has been successfully provisioned, %s", kubernetesCluster.getName(), versionOutput));
                     }
                     k8sApiServerSetup = true;
                     break;
                 }
             } catch (Exception e) {
-                LOGGER.warn(String.format("API endpoint for Kubernetes cluster ID: %s not available", kubernetesCluster.getUuid()), e);
+                LOGGER.warn(String.format("API endpoint for Kubernetes cluster : %s not available", kubernetesCluster.getName()), e);
             }
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ie) {
-                LOGGER.error(String.format("Error while waiting for Kubernetes cluster ID: %s API endpoint to be available", kubernetesCluster.getUuid()), ie);
+                LOGGER.error(String.format("Error while waiting for Kubernetes cluster : %s API endpoint to be available", kubernetesCluster.getName()), ie);
             }
         }
         return k8sApiServerSetup;
@@ -247,12 +249,12 @@
                 masterVmRunning = true;
             } catch (IOException e) {
                 if (LOGGER.isInfoEnabled()) {
-                    LOGGER.info(String.format("Waiting for Kubernetes cluster ID: %s master node VMs to be accessible", kubernetesCluster.getUuid()));
+                    LOGGER.info(String.format("Waiting for Kubernetes cluster : %s master node VMs to be accessible", kubernetesCluster.getName()));
                 }
                 try {
                     Thread.sleep(10000);
                 } catch (InterruptedException ex) {
-                    LOGGER.warn(String.format("Error while waiting for Kubernetes cluster ID: %s master node VMs to be accessible", kubernetesCluster.getUuid()), ex);
+                    LOGGER.warn(String.format("Error while waiting for Kubernetes cluster : %s master node VMs to be accessible", kubernetesCluster.getName()), ex);
                 }
             }
         }
@@ -265,28 +267,28 @@
                                                                    final long timeoutTime, final long waitDuration) {
         while (System.currentTimeMillis() < timeoutTime) {
             if (LOGGER.isDebugEnabled()) {
-                LOGGER.debug(String.format("Checking ready nodes for the Kubernetes cluster ID: %s with total %d provisioned nodes", kubernetesCluster.getUuid(), kubernetesCluster.getTotalNodeCount()));
+                LOGGER.debug(String.format("Checking ready nodes for the Kubernetes cluster : %s with total %d provisioned nodes", kubernetesCluster.getName(), kubernetesCluster.getTotalNodeCount()));
             }
             try {
                 int nodesCount = KubernetesClusterUtil.getKubernetesClusterReadyNodesCount(kubernetesCluster, ipAddress, port,
                         user, sshKeyFile);
                 if (nodesCount == kubernetesCluster.getTotalNodeCount()) {
                     if (LOGGER.isInfoEnabled()) {
-                        LOGGER.info(String.format("Kubernetes cluster ID: %s has %d ready nodes now", kubernetesCluster.getUuid(), kubernetesCluster.getTotalNodeCount()));
+                        LOGGER.info(String.format("Kubernetes cluster : %s has %d ready nodes now", kubernetesCluster.getName(), kubernetesCluster.getTotalNodeCount()));
                     }
                     return true;
                 } else {
                     if (LOGGER.isDebugEnabled()) {
-                        LOGGER.debug(String.format("Kubernetes cluster ID: %s has total %d provisioned nodes while %d ready now", kubernetesCluster.getUuid(), kubernetesCluster.getTotalNodeCount(), nodesCount));
+                        LOGGER.debug(String.format("Kubernetes cluster : %s has total %d provisioned nodes while %d ready now", kubernetesCluster.getName(), kubernetesCluster.getTotalNodeCount(), nodesCount));
                     }
                 }
             } catch (Exception e) {
-                LOGGER.warn(String.format("Failed to retrieve ready node count for Kubernetes cluster ID: %s", kubernetesCluster.getUuid()), e);
+                LOGGER.warn(String.format("Failed to retrieve ready node count for Kubernetes cluster : %s", kubernetesCluster.getName()), e);
             }
             try {
                 Thread.sleep(waitDuration);
             } catch (InterruptedException ex) {
-                LOGGER.warn(String.format("Error while waiting during Kubernetes cluster ID: %s ready node check", kubernetesCluster.getUuid()), ex);
+                LOGGER.warn(String.format("Error while waiting during Kubernetes cluster : %s ready node check", kubernetesCluster.getName()), ex);
             }
         }
         return false;
diff --git a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
index 2c6fc81..bb3f14f 100644
--- a/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
+++ b/plugins/integrations/kubernetes-service/src/main/java/org/apache/cloudstack/api/response/KubernetesClusterResponse.java
@@ -129,9 +129,17 @@
     @Param(description = "URL end point for the Kubernetes cluster dashboard UI")
     private String consoleEndpoint;
 
-    @SerializedName(ApiConstants.VIRTUAL_MACHINE_IDS)
-    @Param(description = "the list of virtualmachine IDs associated with this Kubernetes cluster")
-    private List<String> virtualMachineIds;
+    @SerializedName(ApiConstants.VIRTUAL_MACHINES)
+    @Param(description = "the list of virtualmachine associated with this Kubernetes cluster")
+    private List<UserVmResponse> virtualMachines;
+
+    @SerializedName(ApiConstants.IP_ADDRESS)
+    @Param(description = "Public IP Address of the cluster")
+    private String ipAddress;
+
+    @SerializedName(ApiConstants.IP_ADDRESS_ID)
+    @Param(description = "Public IP Address ID of the cluster")
+    private String ipAddressId;
 
     public KubernetesClusterResponse() {
     }
@@ -317,13 +325,19 @@
         this.serviceOfferingName = serviceOfferingName;
     }
 
-    public void setVirtualMachineIds(List<String> virtualMachineIds) {
-        this.virtualMachineIds = virtualMachineIds;
+    public void setVirtualMachines(List<UserVmResponse> virtualMachines) {
+        this.virtualMachines = virtualMachines;
     }
 
-    ;
+    public List<UserVmResponse> getVirtualMachines() {
+        return virtualMachines;
+    }
 
-    public List<String> getVirtualMachineIds() {
-        return virtualMachineIds;
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public void setIpAddressId(String ipAddressId) {
+        this.ipAddressId = ipAddressId;
     }
 }
diff --git a/plugins/integrations/prometheus/pom.xml b/plugins/integrations/prometheus/pom.xml
index 05db923..99cb2cf 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterImpl.java b/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterImpl.java
index 6ded663..d85e07b 100644
--- a/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterImpl.java
+++ b/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterImpl.java
@@ -22,6 +22,11 @@
 
 import javax.inject.Inject;
 
+import com.cloud.configuration.dao.ResourceCountDao;
+import com.cloud.dc.DedicatedResourceVO;
+import com.cloud.dc.dao.DedicatedResourceDao;
+import com.cloud.user.Account;
+import com.cloud.user.dao.AccountDao;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.log4j.Logger;
@@ -95,6 +100,12 @@
     private DomainJoinDao domainDao;
     @Inject
     private AlertManager alertManager;
+    @Inject
+    DedicatedResourceDao _dedicatedDao;
+    @Inject
+    private AccountDao _accountDao;
+    @Inject
+    private ResourceCountDao _resourceCountDao;
 
     public PrometheusExporterImpl() {
         super();
@@ -109,12 +120,27 @@
                 continue;
             }
             total++;
-            if (host.getStatus() == Status.Up) {
+            if (host.getStatus() == Status.Up && !host.isInMaintenanceStates()) {
                 up++;
-            } else if (host.getStatus() == Status.Disconnected || host.getStatus() == Status.Down) {
+            } else if (host.getStatus() == Status.Disconnected || host.getStatus() == Status.Down ||
+                        host.isInMaintenanceStates()) {
                 down++;
             }
 
+            final DedicatedResourceVO dr = _dedicatedDao.findByHostId(host.getId());
+            int isDedicated = (dr != null) ? 1 : 0;
+            metricsList.add(new ItemHostIsDedicated(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), isDedicated));
+
+            // Get account, domain details for dedicated hosts
+            if (isDedicated == 1) {
+                String accountName;
+                Account account = (dr.getAccountId() != null) ? _accountDao.findById(dr.getAccountId()) : null;
+                accountName = (account != null) ? account.getAccountName() : "";
+
+                DomainJoinVO domain = domainDao.findById(dr.getDomainId());
+                metricsList.add(new ItemHostDedicatedToAccount(zoneName, host.getName(), accountName, domain.getName(), isDedicated));
+            }
+
             final String cpuFactor = String.valueOf(CapacityManager.CpuOverprovisioningFactor.valueIn(host.getClusterId()));
             final CapacityVO cpuCapacity = capacityDao.findByHostIdType(host.getId(), Capacity.CAPACITY_TYPE_CPU);
             if (cpuCapacity != null) {
@@ -128,22 +154,22 @@
             final String memoryFactor = String.valueOf(CapacityManager.MemOverprovisioningFactor.valueIn(host.getClusterId()));
             final CapacityVO memCapacity = capacityDao.findByHostIdType(host.getId(), Capacity.CAPACITY_TYPE_MEMORY);
             if (memCapacity != null) {
-                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, USED, memCapacity.getUsedCapacity()));
-                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, TOTAL, memCapacity.getTotalCapacity()));
+                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, USED, memCapacity.getUsedCapacity(), isDedicated));
+                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, TOTAL, memCapacity.getTotalCapacity(), isDedicated));
             } else {
-                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, USED, 0L));
-                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, TOTAL, 0L));
+                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, USED, 0L, isDedicated));
+                metricsList.add(new ItemHostMemory(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), memoryFactor, TOTAL, 0L, isDedicated));
             }
 
             metricsList.add(new ItemHostVM(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), vmDao.listByHostId(host.getId()).size()));
 
             final CapacityVO coreCapacity = capacityDao.findByHostIdType(host.getId(), Capacity.CAPACITY_TYPE_CPU_CORE);
             if (coreCapacity != null) {
-                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), USED, coreCapacity.getUsedCapacity()));
-                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), TOTAL, coreCapacity.getTotalCapacity()));
+                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), USED, coreCapacity.getUsedCapacity(), isDedicated));
+                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), TOTAL, coreCapacity.getTotalCapacity(), isDedicated));
             } else {
-                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), USED, 0L));
-                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), TOTAL, 0L));
+                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), USED, 0L, isDedicated));
+                metricsList.add(new ItemVMCore(zoneName, zoneUuid, host.getName(), host.getUuid(), host.getPrivateIpAddress(), TOTAL, 0L, isDedicated));
             }
         }
 
@@ -154,12 +180,12 @@
 
         final List<CapacityDaoImpl.SummedCapacity> memCapacity = capacityDao.findCapacityBy((int) Capacity.CAPACITY_TYPE_MEMORY, dcId, null, null);
         if (memCapacity != null && memCapacity.size() > 0) {
-            metricsList.add(new ItemHostMemory(zoneName, zoneUuid, null, null, null, null, ALLOCATED, memCapacity.get(0).getAllocatedCapacity() != null ? memCapacity.get(0).getAllocatedCapacity() : 0));
+            metricsList.add(new ItemHostMemory(zoneName, zoneUuid, null, null, null, null, ALLOCATED, memCapacity.get(0).getAllocatedCapacity() != null ? memCapacity.get(0).getAllocatedCapacity() : 0, 0));
         }
 
         final List<CapacityDaoImpl.SummedCapacity> coreCapacity = capacityDao.findCapacityBy((int) Capacity.CAPACITY_TYPE_CPU_CORE, dcId, null, null);
         if (coreCapacity != null && coreCapacity.size() > 0) {
-            metricsList.add(new ItemVMCore(zoneName, zoneUuid, null, null, null, ALLOCATED, coreCapacity.get(0).getAllocatedCapacity() != null ? coreCapacity.get(0).getAllocatedCapacity() : 0));
+            metricsList.add(new ItemVMCore(zoneName, zoneUuid, null, null, null, ALLOCATED, coreCapacity.get(0).getAllocatedCapacity() != null ? coreCapacity.get(0).getAllocatedCapacity() : 0, 0));
         }
 
         metricsList.add(new ItemHost(zoneName, zoneUuid, ONLINE, up));
@@ -223,7 +249,7 @@
             metricsList.add(new ItemPool(zoneName, zoneUuid, poolName, poolPath, "primary", poolFactor, TOTAL, totalCapacity));
         }
 
-        for (final ImageStore imageStore : imageStoreDao.findByScope(new ZoneScope(dcId))) {
+        for (final ImageStore imageStore : imageStoreDao.findByZone(new ZoneScope(dcId), null)) {
             final StorageStats stats = ApiDBUtils.getSecondaryStorageStatistics(imageStore.getId());
             metricsList.add(new ItemPool(zoneName, zoneUuid, imageStore.getName(), imageStore.getUrl(), "secondary", null, USED, stats != null ? stats.getByteUsed() : 0));
             metricsList.add(new ItemPool(zoneName, zoneUuid, imageStore.getName(), imageStore.getUrl(), "secondary", null, TOTAL, stats != null ? stats.getCapacityBytes() : 0));
@@ -263,11 +289,52 @@
             if (memoryLimit > 0) {
                 totalMemoryLimit += memoryLimit;
             }
+
+            long primaryStorageLimit = ApiDBUtils.findCorrectResourceLimitForDomain(domain.getPrimaryStorageLimit(), false,
+                    Resource.ResourceType.primary_storage, domain.getId());
+            long secondaryStorageLimit = ApiDBUtils.findCorrectResourceLimitForDomain(domain.getSecondaryStorageLimit(), false,
+                    Resource.ResourceType.secondary_storage, domain.getId());
+
+            // Add per domain cpu, memory and storage count
+            metricsList.add(new ItemPerDomainResourceLimit(cpuLimit, domain.getName(), Resource.ResourceType.cpu.getName()));
+            metricsList.add(new ItemPerDomainResourceLimit(memoryLimit, domain.getName(), Resource.ResourceType.memory.getName()));
+            metricsList.add(new ItemPerDomainResourceLimit(primaryStorageLimit, domain.getName(), Resource.ResourceType.primary_storage.getName()));
+            metricsList.add(new ItemPerDomainResourceLimit(secondaryStorageLimit, domain.getName(), Resource.ResourceType.secondary_storage.getName()));
         }
         metricsList.add(new ItemDomainLimitCpu(totalCpuLimit));
         metricsList.add(new ItemDomainLimitMemory(totalMemoryLimit));
     }
 
+    /**
+     * Function to export the domain level resource count for specified resource type
+     *
+     * @param metricsList
+     */
+    private void addDomainResourceCount(final List<Item> metricsList) {
+        for (final DomainJoinVO domain: domainDao.listAll()) {
+            // Display stats for ROOT domain also
+            if (domain == null) {
+                continue;
+            }
+
+            long memoryUsed = _resourceCountDao.getResourceCount(domain.getId(), Resource.ResourceOwnerType.Domain,
+                    Resource.ResourceType.memory);
+            long cpuUsed = _resourceCountDao.getResourceCount(domain.getId(), Resource.ResourceOwnerType.Domain,
+                    Resource.ResourceType.cpu);
+            long primaryStorageUsed = _resourceCountDao.getResourceCount(domain.getId(), Resource.ResourceOwnerType.Domain,
+                    Resource.ResourceType.primary_storage);
+            long secondaryStorageUsed = _resourceCountDao.getResourceCount(domain.getId(), Resource.ResourceOwnerType.Domain,
+                    Resource.ResourceType.secondary_storage);
+
+            metricsList.add(new ItemPerDomainResourceCount(memoryUsed, domain.getName(), Resource.ResourceType.memory.getName()));
+            metricsList.add(new ItemPerDomainResourceCount(cpuUsed, domain.getName(), Resource.ResourceType.cpu.getName()));
+            metricsList.add(new ItemPerDomainResourceCount(primaryStorageUsed, domain.getName(),
+                    Resource.ResourceType.primary_storage.getName()));
+            metricsList.add(new ItemPerDomainResourceCount(secondaryStorageUsed, domain.getName(),
+                    Resource.ResourceType.secondary_storage.getName()));
+        }
+    }
+
     @Override
     public void updateMetrics() {
         final List<Item> latestMetricsItems = new ArrayList<Item>();
@@ -284,6 +351,7 @@
                 addVlanMetrics(latestMetricsItems, dc.getId(), zoneName, zoneUuid);
             }
             addDomainLimits(latestMetricsItems);
+            addDomainResourceCount(latestMetricsItems);
         } catch (Exception e) {
             LOG.warn("Getting metrics failed ", e);
         }
@@ -378,8 +446,9 @@
         String ip;
         String filter;
         long core = 0;
+        int isDedicated;
 
-        public ItemVMCore(final String zn, final String zu, final String hn, final String hu, final String hip, final String fl, final Long cr) {
+        public ItemVMCore(final String zn, final String zu, final String hn, final String hu, final String hip, final String fl, final Long cr, final int dedicated) {
             super("cloudstack_host_vms_cores_total");
             zoneName = zn;
             zoneUuid = zu;
@@ -390,6 +459,7 @@
             if (cr != null) {
                 core = cr;
             }
+            isDedicated = dedicated;
         }
 
         @Override
@@ -397,7 +467,7 @@
             if (Strings.isNullOrEmpty(hostName) && Strings.isNullOrEmpty(ip)) {
                 return String.format("%s{zone=\"%s\",filter=\"%s\"} %d", name, zoneName, filter, core);
             }
-            return String.format("%s{zone=\"%s\",hostname=\"%s\",ip=\"%s\",filter=\"%s\"} %d", name, zoneName, hostName, ip, filter, core);
+            return String.format("%s{zone=\"%s\",hostname=\"%s\",ip=\"%s\",filter=\"%s\",dedicated=\"%d\"} %d", name, zoneName, hostName, ip, filter, isDedicated, core);
         }
     }
 
@@ -441,8 +511,9 @@
         String overProvisioningFactor;
         String filter;
         double miBytes;
+        int isDedicated;
 
-        public ItemHostMemory(final String zn, final String zu, final String hn, final String hu, final String hip, final String of, final String fl, final double membytes) {
+        public ItemHostMemory(final String zn, final String zu, final String hn, final String hu, final String hip, final String of, final String fl, final double membytes, final int dedicated) {
             super("cloudstack_host_memory_usage_mibs_total");
             zoneName = zn;
             zoneUuid = zu;
@@ -452,6 +523,7 @@
             overProvisioningFactor = of;
             filter = fl;
             miBytes = membytes / (1024.0 * 1024.0);
+            isDedicated = dedicated;
         }
 
         @Override
@@ -459,7 +531,7 @@
             if (Strings.isNullOrEmpty(hostName) && Strings.isNullOrEmpty(ip)) {
                 return String.format("%s{zone=\"%s\",filter=\"%s\"} %.2f", name, zoneName, filter, miBytes);
             }
-            return String.format("%s{zone=\"%s\",hostname=\"%s\",ip=\"%s\",overprovisioningfactor=\"%s\",filter=\"%s\"} %.2f", name, zoneName, hostName, ip, overProvisioningFactor, filter, miBytes);
+            return String.format("%s{zone=\"%s\",hostname=\"%s\",ip=\"%s\",overprovisioningfactor=\"%s\",filter=\"%s\",dedicated=\"%d\"} %.2f", name, zoneName, hostName, ip, overProvisioningFactor, filter, isDedicated, miBytes);
         }
     }
 
@@ -625,4 +697,89 @@
             return String.format("%s %d", name, miBytes);
         }
     }
+
+    class ItemHostIsDedicated extends Item {
+        String zoneName;
+        String zoneUuid;
+        String hostName;
+        String hostUuid;
+        String hostIp;
+        int isDedicated;
+
+        public ItemHostIsDedicated(final String zoneName, final String zoneUuid, final String hostName, final String hostUuid, final String hostIp, final int isDedicated) {
+            super("cloudstack_host_is_dedicated");
+            this.zoneName = zoneName;
+            this.zoneUuid = zoneUuid;
+            this.hostName = hostName;
+            this.hostUuid = hostUuid;
+            this.hostIp = hostIp;
+            this.isDedicated = isDedicated;
+        }
+
+        @Override
+        public String toMetricsString() {
+            return String.format("%s{zone=\"%s\",hostname=\"%s\",ip=\"%s\"} %d", name, zoneName, hostName, hostIp, isDedicated);
+        }
+
+    }
+
+    class ItemHostDedicatedToAccount extends Item {
+        String zoneName;
+        String hostName;
+        String accountName;
+        String domainName;
+        int isDedicated;
+
+        public ItemHostDedicatedToAccount(final String zoneName, final String hostName,
+                                          final String accountName, final String domainName, int isDedicated) {
+            super("cloudstack_host_dedicated_to_account");
+            this.zoneName = zoneName;
+            this.hostName = hostName;
+            this.accountName = accountName;
+            this.domainName = domainName;
+            this.isDedicated = isDedicated;
+        }
+
+        @Override
+        public String toMetricsString() {
+            return String.format("%s{zone=\"%s\",hostname=\"%s\",account=\"%s\",domain=\"%s\"} %d",
+                    name, zoneName, hostName, accountName, domainName, isDedicated);
+        }
+    }
+
+    class ItemPerDomainResourceLimit extends Item {
+        long cores;
+        String domainName;
+        String resourceType;
+
+        public ItemPerDomainResourceLimit(final long c, final String domainName, final String resourceType) {
+            super("cloudstack_domain_resource_limit");
+            this.cores = c;
+            this.domainName = domainName;
+            this.resourceType = resourceType;
+        }
+
+        @Override
+        public String toMetricsString() {
+            return String.format("%s{domain=\"%s\", type=\"%s\"} %d", name, domainName, resourceType, cores);
+        }
+    }
+
+    class ItemPerDomainResourceCount extends Item {
+        long miBytes;
+        String domainName;
+        String resourceType;
+
+        public ItemPerDomainResourceCount(final long mb, final String domainName, final String resourceType) {
+            super("cloudstack_domain_resource_count");
+            this.miBytes = mb;
+            this.domainName = domainName;
+            this.resourceType = resourceType;
+        }
+
+        @Override
+        public String toMetricsString() {
+            return String.format("%s{domain=\"%s\", type=\"%s\"} %d", name, domainName, resourceType, miBytes);
+        }
+    }
 }
diff --git a/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServer.java b/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServer.java
index e030352..12d513c 100644
--- a/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServer.java
+++ b/plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServer.java
@@ -23,7 +23,7 @@
 public interface PrometheusExporterServer extends Manager {
 
     ConfigKey<Boolean> EnablePrometheusExporter = new ConfigKey<>("Advanced", Boolean.class, "prometheus.exporter.enable", "false",
-            "Enable the prometheus exporter plugin, management server restart needed.", true);
+            "Enable the prometheus exporter plugin, management server restart needed.", false);
 
     ConfigKey<Integer> PrometheusExporterServerPort = new ConfigKey<>("Advanced", Integer.class, "prometheus.exporter.port", "9595",
             "The prometheus exporter server port", true);
diff --git a/plugins/metrics/pom.xml b/plugins/metrics/pom.xml
index fb4e835..943487d 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 9bfc9e8..197b78e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 4cd6ee3..29ad385 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 67da197..87aab33 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 e760a0d..57b49d1 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 02c9ac4..0600698 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
index 78e04b5..bc35b34 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -596,4 +596,8 @@
     public void prepareStop(VirtualMachineProfile profile) {
     }
 
+    @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
 }
diff --git a/plugins/network-elements/f5/pom.xml b/plugins/network-elements/f5/pom.xml
index 5b46f73..e2456f3 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 ca75c34..cb8b8bc 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 5882d71..167e2e5 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
index 52ecebc..7232c1a 100644
--- a/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
+++ b/plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java
@@ -357,6 +357,10 @@
     }
 
     @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
+    @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
         final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params);
         _instance = configs.get("instance.name");
diff --git a/plugins/network-elements/juniper-contrail/pom.xml b/plugins/network-elements/juniper-contrail/pom.xml
index 26efac0..09c41a9 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <repositories>
diff --git a/plugins/network-elements/juniper-srx/pom.xml b/plugins/network-elements/juniper-srx/pom.xml
index 6a7b238..64ce0d7 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 864f7a3..ad08d1d 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java
index d869f0b..277c774 100644
--- a/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java
+++ b/plugins/network-elements/netscaler/src/main/java/com/cloud/network/vm/NetScalerVMManagerImpl.java
@@ -190,6 +190,10 @@
     }
 
     @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
+    @Override
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         _itMgr.registerGuru(VirtualMachine.Type.NetScalerVm, this);
         if (s_logger.isInfoEnabled()) {
diff --git a/plugins/network-elements/nicira-nvp/pom.xml b/plugins/network-elements/nicira-nvp/pom.xml
index d8a0e09..11bf1c9 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 7b8d8e2..68c1271 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 db91439..baae799 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 1894d5d..33d51a3 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 b16d7ba..c749501 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 79a22fe..4af0eaf 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 f3e645f..6d371a3 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 8f9164c..012d176 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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
new file mode 100644
index 0000000..c1418d5
--- /dev/null
+++ b/plugins/outofbandmanagement-drivers/redfish/pom.xml
@@ -0,0 +1,42 @@
+<!--
+  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-outofbandmanagement-driver-redfish</artifactId>
+    <name>Apache CloudStack Plugin - Power Management Driver Redfish</name>
+    <parent>
+        <groupId>org.apache.cloudstack</groupId>
+        <artifactId>cloudstack-plugins</artifactId>
+        <version>4.15.1.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-utils</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cloudstack</groupId>
+            <artifactId>cloud-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishOutOfBandManagementDriver.java b/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishOutOfBandManagementDriver.java
new file mode 100644
index 0000000..14a41e1
--- /dev/null
+++ b/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishOutOfBandManagementDriver.java
@@ -0,0 +1,124 @@
+//
+// 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.outofbandmanagement.driver.redfish;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement;
+import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementDriver;
+import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementVO;
+import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao;
+import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverChangePasswordCommand;
+import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverCommand;
+import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverPowerCommand;
+import org.apache.cloudstack.outofbandmanagement.driver.OutOfBandManagementDriverResponse;
+import org.apache.cloudstack.utils.redfish.RedfishClient;
+import org.apache.cloudstack.utils.redfish.RedfishClient.RedfishResetCmd;
+import org.apache.commons.httpclient.HttpStatus;
+
+import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.google.common.collect.ImmutableMap;
+
+public class RedfishOutOfBandManagementDriver extends AdapterBase implements OutOfBandManagementDriver, Configurable {
+
+    @Inject
+    private OutOfBandManagementDao outOfBandManagementDao;
+    private RedfishWrapper redfishWrapper = new RedfishWrapper();
+
+    public static final ConfigKey<Boolean> IGNORE_SSL_CERTIFICATE = new ConfigKey<Boolean>("Advanced", Boolean.class, "redfish.ignore.ssl", "false",
+            "Default value is false, ensuring that the client requests validate the certificate when using SSL. If set to true the redfish client will ignore SSL certificate validation when sending requests to a Redfish server.",
+            true, ConfigKey.Scope.Global);
+
+    public static final ConfigKey<Boolean> USE_HTTPS = new ConfigKey<Boolean>("Advanced", Boolean.class, "redfish.use.https", "true",
+            "Use HTTPS/SSL for all connections.", true, ConfigKey.Scope.Global);
+
+    public static final ConfigKey<Integer> REDFISHT_REQUEST_MAX_RETRIES = new ConfigKey<Integer>("Advanced", Integer.class, "redfish.retries", "2",
+            "Number of retries allowed if a Redfish REST request experiment connection issues. If set to 0 (zero) there will be no retries.", true, ConfigKey.Scope.Global);
+
+
+    private static final String HTTP_STATUS_OK = String.valueOf(HttpStatus.SC_OK);
+
+    @Override
+    public OutOfBandManagementDriverResponse execute(OutOfBandManagementDriverCommand cmd) {
+        OutOfBandManagementDriverResponse response = new OutOfBandManagementDriverResponse(null, "Unsupported Command", false);
+        if (cmd instanceof OutOfBandManagementDriverPowerCommand) {
+            response = execute((OutOfBandManagementDriverPowerCommand)cmd);
+        } else if (cmd instanceof OutOfBandManagementDriverChangePasswordCommand) {
+            response = execute((OutOfBandManagementDriverChangePasswordCommand)cmd);
+        } else {
+            throw new CloudRuntimeException(String.format("Operation [%s] not supported by the Redfish out-of-band management driver", cmd.getClass().getSimpleName()));
+        }
+        return response;
+    }
+
+    /**
+     *  Sends a HTTPS request to execute the given power command ({@link OutOfBandManagementDriverPowerCommand})
+     */
+    private OutOfBandManagementDriverResponse execute(final OutOfBandManagementDriverPowerCommand cmd) {
+        ImmutableMap<OutOfBandManagement.Option, String> outOfBandOptions = cmd.getOptions();
+        String username = outOfBandOptions.get(OutOfBandManagement.Option.USERNAME);
+        String password = outOfBandOptions.get(OutOfBandManagement.Option.PASSWORD);
+        String hostAddress = outOfBandOptions.get(OutOfBandManagement.Option.ADDRESS);
+        RedfishClient redfishClient = new RedfishClient(username, password, USE_HTTPS.value(), IGNORE_SSL_CERTIFICATE.value(), REDFISHT_REQUEST_MAX_RETRIES.value());
+
+        RedfishClient.RedfishPowerState powerState = null;
+        if (cmd.getPowerOperation() == OutOfBandManagement.PowerOperation.STATUS) {
+            powerState = redfishClient.getSystemPowerState(hostAddress);
+        } else {
+            RedfishResetCmd redfishCmd = redfishWrapper.parsePowerCommand(cmd.getPowerOperation());
+            redfishClient.executeComputerSystemReset(hostAddress, redfishCmd);
+        }
+
+        OutOfBandManagementDriverResponse response = new OutOfBandManagementDriverResponse(HTTP_STATUS_OK, null, true);
+        if (powerState != null) {
+            OutOfBandManagement.PowerState oobPowerState = redfishWrapper.parseRedfishPowerStateToOutOfBand(powerState);
+            response.setPowerState(oobPowerState);
+        }
+        return response;
+    }
+
+    /**
+     * Executes the password change command (OutOfBandManagementDriverChangePasswordCommand)
+     */
+    private OutOfBandManagementDriverResponse execute(final OutOfBandManagementDriverChangePasswordCommand cmd) {
+        cmd.getNewPassword();
+        String hostAddress = cmd.getOptions().get(OutOfBandManagement.Option.ADDRESS);
+        OutOfBandManagementVO outOfBandManagement = outOfBandManagementDao.findByHostAddress(hostAddress);
+        outOfBandManagement.setPassword(cmd.getNewPassword());
+        outOfBandManagementDao.update(outOfBandManagement.getId(), outOfBandManagement);
+
+        OutOfBandManagementDriverResponse response = new OutOfBandManagementDriverResponse(HTTP_STATUS_OK, null, true);
+
+        return response;
+    }
+
+    @Override
+    public String getConfigComponentName() {
+        return RedfishOutOfBandManagementDriver.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] {IGNORE_SSL_CERTIFICATE, USE_HTTPS, REDFISHT_REQUEST_MAX_RETRIES};
+    }
+
+}
diff --git a/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishWrapper.java b/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishWrapper.java
new file mode 100644
index 0000000..09cee3b
--- /dev/null
+++ b/plugins/outofbandmanagement-drivers/redfish/src/main/java/org/apache/cloudstack/outofbandmanagement/driver/redfish/RedfishWrapper.java
@@ -0,0 +1,66 @@
+//
+// 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.outofbandmanagement.driver.redfish;
+
+import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement;
+import org.apache.cloudstack.utils.redfish.RedfishClient;
+
+public class RedfishWrapper {
+
+    public RedfishClient.RedfishResetCmd parsePowerCommand(OutOfBandManagement.PowerOperation operation) {
+        if (operation == null) {
+            throw new IllegalStateException("Invalid power operation requested");
+        }
+        switch (operation) {
+        case ON:
+            return RedfishClient.RedfishResetCmd.On;
+        case OFF:
+            return RedfishClient.RedfishResetCmd.GracefulShutdown;
+        case CYCLE:
+            return RedfishClient.RedfishResetCmd.PowerCycle;
+        case RESET:
+            return RedfishClient.RedfishResetCmd.ForceRestart;
+        case SOFT:
+            return RedfishClient.RedfishResetCmd.GracefulShutdown;
+        case STATUS:
+            throw new IllegalStateException(String.format("%s is not a valid Redfish Reset command [%s]", operation));
+        default:
+            throw new IllegalStateException(String.format("Redfish does not support operation [%s]", operation));
+        }
+    }
+
+    public OutOfBandManagement.PowerState parseRedfishPowerStateToOutOfBand(RedfishClient.RedfishPowerState redfishPowerState) {
+        if (redfishPowerState == null) {
+            throw new IllegalStateException("Invalid power state [null]");
+        }
+
+        switch (redfishPowerState) {
+        case On:
+            return OutOfBandManagement.PowerState.On;
+        case Off:
+            return OutOfBandManagement.PowerState.Off;
+        case PoweringOn:
+            return OutOfBandManagement.PowerState.On;
+        case PoweringOff:
+            return OutOfBandManagement.PowerState.Off;
+        default:
+            return OutOfBandManagement.PowerState.Unknown;
+        }
+    }
+}
diff --git a/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/module.properties b/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/module.properties
new file mode 100644
index 0000000..8e70169
--- /dev/null
+++ b/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/module.properties
@@ -0,0 +1,18 @@
+# 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=redfish
+parent=outofbandmanagement
diff --git a/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/spring-redfish-context.xml b/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/spring-redfish-context.xml
new file mode 100644
index 0000000..44833e8
--- /dev/null
+++ b/plugins/outofbandmanagement-drivers/redfish/src/main/resources/META-INF/cloudstack/redfish/spring-redfish-context.xml
@@ -0,0 +1,33 @@
+<!--
+  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="redfishOutOfBandManagementDriver" class="org.apache.cloudstack.outofbandmanagement.driver.redfish.RedfishOutOfBandManagementDriver">
+        <property name="name" value="REDFISH" />
+    </bean>
+</beans>
diff --git a/plugins/pom.xml b/plugins/pom.xml
index a4142c1..f9a7c29 100755
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -16,8 +16,7 @@
   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">
+<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>cloudstack-plugins</artifactId>
     <name>Apache CloudStack Plugin POM</name>
@@ -25,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <build>
         <plugins>
@@ -46,6 +45,7 @@
         <!-- keep in alphabetic order -->
         <module>acl/dynamic-role-based</module>
         <module>acl/static-role-based</module>
+        <module>acl/project-role-based</module>
 
         <module>affinity-group-processors/explicit-dedication</module>
         <module>affinity-group-processors/host-affinity</module>
@@ -109,6 +109,7 @@
 
         <module>outofbandmanagement-drivers/ipmitool</module>
         <module>outofbandmanagement-drivers/nested-cloudstack</module>
+        <module>outofbandmanagement-drivers/redfish</module>
 
         <module>storage/image/default</module>
         <module>storage/image/s3</module>
@@ -129,7 +130,7 @@
         <module>user-authenticators/plain-text</module>
         <module>user-authenticators/saml2</module>
         <module>user-authenticators/sha256salted</module>
-    </modules>
+   </modules>
     <dependencies>
         <dependency>
             <groupId>org.apache.cloudstack</groupId>
@@ -219,4 +220,4 @@
             </modules>
         </profile>
     </profiles>
-</project>
+</project>
\ No newline at end of file
diff --git a/plugins/storage-allocators/random/pom.xml b/plugins/storage-allocators/random/pom.xml
index 13c0b47..9efbb38 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java b/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
index 6b912fb..eed623a 100644
--- a/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
+++ b/plugins/storage-allocators/random/src/main/java/org/apache/cloudstack/storage/allocator/RandomStoragePoolAllocator.java
@@ -35,7 +35,7 @@
     private static final Logger s_logger = Logger.getLogger(RandomStoragePoolAllocator.class);
 
     @Override
-    public List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo) {
+    public List<StoragePool> select(DiskProfile dskCh, VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid, int returnUpTo, boolean bypassStorageTypeCheck) {
 
         List<StoragePool> suitablePools = new ArrayList<StoragePool>();
 
diff --git a/plugins/storage/image/default/pom.xml b/plugins/storage/image/default/pom.xml
index d4ebd92..735a70e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
index b8b5226..8abf802 100644
--- a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
+++ b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
@@ -71,7 +71,8 @@
         // Create Symlink at ssvm
         String path = installPath;
         String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension();
-        CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(), path, uuid, dataObject.getTO());
+        CreateEntityDownloadURLCommand cmd = new CreateEntityDownloadURLCommand(((ImageStoreEntity)store).getMountPoint(),
+                                                                path, uuid, dataObject == null ? null: dataObject.getTO());
         Answer ans = null;
         if (ep == null) {
             String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
diff --git a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
index 7675e94..d40ca23 100644
--- a/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
+++ b/plugins/storage/image/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackImageStoreLifeCycleImpl.java
@@ -114,7 +114,7 @@
                 }
             }
         } catch (URISyntaxException e) {
-            throw new InvalidParameterValueException(url + " is not a valid uri");
+            throw new InvalidParameterValueException(logString + " is not a valid uri. Note that the URL in this message has been sanitized");
         }
 
         if (dcId == null) {
diff --git a/plugins/storage/image/s3/pom.xml b/plugins/storage/image/s3/pom.xml
index f8acba6..b8b2836 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 84d5426..9dc04e8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 c3b2446..aaf4007 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 2724a9c..5ba51f8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/datera/pom.xml b/plugins/storage/volume/datera/pom.xml
index 5186efb..1104237 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.14.2.0-SNAPSHOT</version>
+    <version>4.15.1.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 9a9a165..fa1f3d4 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
@@ -79,6 +79,8 @@
 import java.util.List;
 import java.util.Map;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class DateraPrimaryDataStoreDriver implements PrimaryDataStoreDriver {
     private static final Logger s_logger = Logger.getLogger(DateraPrimaryDataStoreDriver.class);
     private static final int s_lockTimeInSeconds = 300;
@@ -616,7 +618,7 @@
                 usedSpaceBytes += templatePoolRef.getTemplateSize();
             }
         }
-        s_logger.debug("usedSpaceBytes: " + String.valueOf(usedSpaceBytes));
+        s_logger.debug("usedSpaceBytes: " + toHumanReadableSize(usedSpaceBytes));
 
         return usedSpaceBytes;
     }
@@ -657,7 +659,7 @@
                 hypervisorSnapshotReserve = Math.max(hypervisorSnapshotReserve, s_lowestHypervisorSnapshotReserve);
                 volumeSize += volumeSize * (hypervisorSnapshotReserve / 100f);
             }
-            s_logger.debug("Volume size:" + String.valueOf(volumeSize));
+            s_logger.debug("Volume size: " + toHumanReadableSize(volumeSize));
             break;
 
         case TEMPLATE:
@@ -670,7 +672,7 @@
             } else {
                 volumeSize = (long) (templateSize + templateSize * (s_lowestHypervisorSnapshotReserve / 100f));
             }
-            s_logger.debug("Template volume size:" + String.valueOf(volumeSize));
+            s_logger.debug("Template volume size:" + toHumanReadableSize(volumeSize));
 
             break;
         }
@@ -953,7 +955,7 @@
         } else if (dataType == DataObjectType.TEMPLATE) {
             s_logger.debug("Clone volume from a template");
 
-            VMTemplateStoragePoolVO templatePoolRef = tmpltPoolDao.findByPoolTemplate(storagePoolId, dataObjectId);
+            VMTemplateStoragePoolVO templatePoolRef = tmpltPoolDao.findByPoolTemplate(storagePoolId, dataObjectId, null);
 
             if (templatePoolRef != null) {
                 baseAppInstanceName = templatePoolRef.getLocalDownloadPath();
@@ -1091,7 +1093,7 @@
             long templateSizeBytes = getDataObjectSizeIncludingHypervisorSnapshotReserve(templateInfo,
                     storagePoolDao.findById(storagePoolId));
 
-            s_logger.debug("cached VM template sizeBytes: " + String.valueOf(templateSizeBytes));
+            s_logger.debug("cached VM template sizeBytes: " + toHumanReadableSize(templateSizeBytes));
 
             int templateSizeGib = DateraUtil.bytesToGib(templateSizeBytes);
 
@@ -1112,7 +1114,7 @@
             iqn = appInstance.getIqn();
 
             VMTemplateStoragePoolVO templatePoolRef = tmpltPoolDao.findByPoolTemplate(storagePoolId,
-                    templateInfo.getId());
+                    templateInfo.getId(), null);
 
             templatePoolRef.setInstallPath(DateraUtil.generateIqnPath(iqn));
             templatePoolRef.setLocalDownloadPath(appInstance.getName());
@@ -1503,7 +1505,7 @@
             DateraUtil.deleteAppInstance(conn, appInstanceName);
 
             VMTemplateStoragePoolVO templatePoolRef = tmpltPoolDao.findByPoolTemplate(storagePoolId,
-                    templateInfo.getId());
+                    templateInfo.getId(), null);
 
             tmpltPoolDao.remove(templatePoolRef.getId());
 
diff --git a/plugins/storage/volume/default/pom.xml b/plugins/storage/volume/default/pom.xml
index feb3bbe..884491c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 5863ef9..6ce8741 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
@@ -78,6 +78,8 @@
 import com.cloud.template.TemplateManager;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class CloudStackPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
     @Override
     public Map<String, String> getCapabilities() {
@@ -366,7 +368,7 @@
             ResizeVolumeAnswer answer = (ResizeVolumeAnswer) storageMgr.sendToPool(pool, resizeParameter.hosts, resizeCmd);
             if (answer != null && answer.getResult()) {
                 long finalSize = answer.getNewSize();
-                s_logger.debug("Resize: volume started at size " + vol.getSize() + " and ended at size " + finalSize);
+                s_logger.debug("Resize: volume started at size: " + toHumanReadableSize(vol.getSize()) + " and ended at size: " + toHumanReadableSize(finalSize));
 
                 vol.setSize(finalSize);
                 vol.update();
diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
index a500fdb..1b2e41a 100644
--- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
+++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java
@@ -18,36 +18,12 @@
  */
 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.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.inject.Inject;
-
-import org.apache.log4j.Logger;
-
-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.DataStoreManager;
-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.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
-import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
-
 import com.cloud.agent.AgentManager;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CreateStoragePoolCommand;
 import com.cloud.agent.api.DeleteStoragePoolCommand;
 import com.cloud.agent.api.StoragePoolInfo;
+import com.cloud.agent.api.ValidateVcenterDetailsCommand;
 import com.cloud.alert.AlertManager;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.StorageConflictException;
@@ -77,6 +53,28 @@
 import com.cloud.vm.dao.SecondaryStorageVmDao;
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
+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.DataStoreManager;
+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.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.volume.datastore.PrimaryDataStoreHelper;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
 
 public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle {
     private static final Logger s_logger = Logger.getLogger(CloudStackPrimaryDataStoreLifeCycleImpl.class);
@@ -133,6 +131,7 @@
         Long zoneId = (Long)dsInfos.get("zoneId");
         String url = (String)dsInfos.get("url");
         String providerName = (String)dsInfos.get("providerName");
+        HypervisorType hypervisorType = (HypervisorType)dsInfos.get("hypervisorType");
         if (clusterId != null && podId == null) {
             throw new InvalidParameterValueException("Cluster id requires pod id");
         }
@@ -242,7 +241,7 @@
             parameters.setPath(hostPath.replaceFirst("/", ""));
         } else if (scheme.equalsIgnoreCase("rbd")) {
             if (port == -1) {
-                port = 6789;
+                port = 0;
             }
             parameters.setType(StoragePoolType.RBD);
             parameters.setHost(storageHost);
@@ -250,10 +249,21 @@
             parameters.setPath(hostPath.replaceFirst("/", ""));
             parameters.setUserInfo(userInfo);
         } else if (scheme.equalsIgnoreCase("PreSetup")) {
+            if (HypervisorType.VMware.equals(hypervisorType)) {
+                validateVcenterDetails(zoneId, podId, clusterId,storageHost);
+            }
             parameters.setType(StoragePoolType.PreSetup);
             parameters.setHost(storageHost);
             parameters.setPort(0);
             parameters.setPath(hostPath);
+        } else if (scheme.equalsIgnoreCase("DatastoreCluster")) {
+            if (HypervisorType.VMware.equals(hypervisorType)) {
+                validateVcenterDetails(zoneId, podId, clusterId,storageHost);
+            }
+            parameters.setType(StoragePoolType.DatastoreCluster);
+            parameters.setHost(storageHost);
+            parameters.setPort(0);
+            parameters.setPath(hostPath);
         } else if (scheme.equalsIgnoreCase("iscsi")) {
             String[] tokens = hostPath.split("/");
             int lun = NumbersUtil.parseInt(tokens[tokens.length - 1], -1);
@@ -327,7 +337,7 @@
             uuid = (String)existingUuid;
         } else if (scheme.equalsIgnoreCase("sharedmountpoint") || scheme.equalsIgnoreCase("clvm")) {
             uuid = UUID.randomUUID().toString();
-        } else if (scheme.equalsIgnoreCase("PreSetup")) {
+        } else if ("PreSetup".equalsIgnoreCase(scheme) && !HypervisorType.VMware.equals(hypervisorType)) {
             uuid = hostPath.replace("/", "");
         } else {
             uuid = UUID.nameUUIDFromBytes((storageHost + hostPath).getBytes()).toString();
@@ -353,12 +363,39 @@
         return dataStoreHelper.createPrimaryDataStore(parameters);
     }
 
+    private void validateVcenterDetails(Long zoneId, Long podId, Long clusterId, String storageHost) {
+
+        List<HostVO> allHosts =
+                _resourceMgr.listAllUpHosts(Host.Type.Routing, clusterId, podId, zoneId);
+        if (allHosts.isEmpty()) {
+            throw new CloudRuntimeException("No host up to associate a storage pool with in zone: " + zoneId + " pod: " + podId + " cluster: " + clusterId);
+        }
+
+        boolean success = false;
+        for (HostVO h : allHosts) {
+            ValidateVcenterDetailsCommand cmd = new ValidateVcenterDetailsCommand(storageHost);
+            final Answer answer = agentMgr.easySend(h.getId(), cmd);
+            if (answer != null && answer.getResult()) {
+                s_logger.info("Successfully validated vCenter details provided");
+                return;
+            } else {
+                if (answer != null) {
+                    throw new InvalidParameterValueException("Provided vCenter server details does not match with the existing vCenter in zone id: " + zoneId);
+                } else {
+                    String msg = "Can not validate vCenter through host " + h.getId() + " due to ValidateVcenterDetailsCommand returns null";
+                    s_logger.warn(msg);
+                }
+            }
+        }
+        throw new CloudRuntimeException("Could not validate vCenter details through any of the hosts with in zone: " + zoneId + ", pod: " + podId + ", cluster: " + clusterId);
+    }
+
     protected boolean createStoragePool(long hostId, StoragePool pool) {
         s_logger.debug("creating pool " + pool.getName() + " on  host " + hostId);
 
         if (pool.getPoolType() != StoragePoolType.NetworkFilesystem && pool.getPoolType() != StoragePoolType.Filesystem &&
                 pool.getPoolType() != StoragePoolType.IscsiLUN && pool.getPoolType() != StoragePoolType.Iscsi && pool.getPoolType() != StoragePoolType.VMFS &&
-                pool.getPoolType() != StoragePoolType.SharedMountPoint && pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2 &&
+                pool.getPoolType() != StoragePoolType.SharedMountPoint && pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.DatastoreCluster && pool.getPoolType() != StoragePoolType.OCFS2 &&
                 pool.getPoolType() != StoragePoolType.RBD && pool.getPoolType() != StoragePoolType.CLVM && pool.getPoolType() != StoragePoolType.SMB &&
                 pool.getPoolType() != StoragePoolType.Gluster) {
             s_logger.warn(" Doesn't support storage pool type " + pool.getPoolType());
diff --git a/plugins/storage/volume/nexenta/pom.xml b/plugins/storage/volume/nexenta/pom.xml
index cf6f10f..4959f59 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/sample/pom.xml b/plugins/storage/volume/sample/pom.xml
index 38c6f04..8c40100 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/storage/volume/solidfire/pom.xml b/plugins/storage/volume/solidfire/pom.xml
index c0ce1ee..3551ccd 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 aa277cd..0651f2e 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
@@ -172,9 +172,11 @@
         try {
             List<HostVO> hosts = hostDao.findByClusterId(clusterId);
 
+            String clusterUuId = clusterDao.findById(clusterId).getUuid();
+
             SolidFireUtil.SolidFireConnection sfConnection = SolidFireUtil.getSolidFireConnection(storagePoolId, storagePoolDetailsDao);
 
-            SolidFireUtil.placeVolumeInVolumeAccessGroups(sfConnection, sfVolumeId, hosts);
+            SolidFireUtil.placeVolumeInVolumeAccessGroups(sfConnection, sfVolumeId, hosts, clusterUuId);
 
             return true;
         }
@@ -707,7 +709,7 @@
             sfVolumeId = Long.parseLong(snapshotDetails.getValue());
         } else if (dataObjectType == DataObjectType.TEMPLATE) {
             // get the cached template on this storage
-            VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePoolId, dataObjectId);
+            VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePoolId, dataObjectId, null);
 
             if (templatePoolRef != null) {
                 sfVolumeId = Long.parseLong(templatePoolRef.getLocalDownloadPath());
@@ -1133,7 +1135,7 @@
 
         String iqn = sfVolume.getIqn();
 
-        VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePoolId, templateInfo.getId());
+        VMTemplateStoragePoolVO templatePoolRef = vmTemplatePoolDao.findByPoolTemplate(storagePoolId, templateInfo.getId(), null);
 
         templatePoolRef.setInstallPath(iqn);
         templatePoolRef.setLocalDownloadPath(Long.toString(sfVolume.getId()));
diff --git a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
index 2ebd69a..9cc746d 100644
--- a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
+++ b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/SolidFireSharedPrimaryDataStoreLifeCycle.java
@@ -285,7 +285,9 @@
             // place the newly created volume in the Volume Access Group
             List<HostVO> hosts = hostDao.findByClusterId(clusterId);
 
-            SolidFireUtil.placeVolumeInVolumeAccessGroups(sfConnection, sfVolume.getId(), hosts);
+            String clusterUuId = clusterDao.findById(clusterId).getUuid();
+
+            SolidFireUtil.placeVolumeInVolumeAccessGroups(sfConnection, sfVolume.getId(), hosts, clusterUuId);
 
             SolidFireUtil.SolidFireAccount sfAccount = sfCreateVolume.getAccount();
             Account csAccount = CallContext.current().getCallingAccount();
diff --git a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
index 9f7b205..acf1d5c 100644
--- a/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
+++ b/plugins/storage/volume/solidfire/src/main/java/org/apache/cloudstack/storage/datastore/util/SolidFireUtil.java
@@ -393,7 +393,7 @@
             }
         }
         else {
-            List<ClusterVO> clustersInZone = clusterDao.listByZoneId(storagePoolVO.getDataCenterId());
+            List<ClusterVO> clustersInZone = clusterDao.listClustersByDcId(storagePoolVO.getDataCenterId());
 
             if (clustersInZone != null) {
                 for (ClusterVO clusterInZone : clustersInZone) {
@@ -497,7 +497,7 @@
                         if (sfVag != null) {
                             placeVolumeIdsInVag(sfConnection, sfVags, sfVag, hostVO, hostDao);
                         } else {
-                            handleVagForHost(sfConnection, sfVags, hostVO, hostDao);
+                            handleVagForHost(sfConnection, sfVags, hostVO, hostDao, clusterDao);
                         }
                     }
                 }
@@ -513,12 +513,14 @@
     // creating a new VAG won't exceed 4 VAGs for the computer cluster).
     // If none of the hosts in the cluster are in a VAG, then leave this host out of a VAG.
     // Place applicable volume IDs in VAG, if need be (account of volume starts with SF_CS_ACCOUNT_PREFIX).
-    private static void handleVagForHost(SolidFireUtil.SolidFireConnection sfConnection, List<SolidFireUtil.SolidFireVag> sfVags, Host host, HostDao hostDao) {
+    private static void handleVagForHost(SolidFireUtil.SolidFireConnection sfConnection, List<SolidFireUtil.SolidFireVag> sfVags, Host host, HostDao hostDao, ClusterDao clusterDao) {
         List<HostVO> hostVOs = hostDao.findByClusterId(host.getClusterId());
 
         if (hostVOs != null) {
             int numVags = 0;
 
+            addInitiatorsToExistingVag(clusterDao, host, sfVags, sfConnection);
+
             Collections.shuffle(hostVOs, RANDOM);
 
             for (HostVO hostVO : hostVOs) {
@@ -544,8 +546,9 @@
                                 throw new CloudRuntimeException(errMsg);
                             }
 
-                            addInitiatorsToSolidFireVag(sfConnection, sfVag.getId(), new String[] { host.getStorageUrl() });
-
+                            if(!isInitiatorInSfVag(host.getStorageUrl(),sfVag)) {
+                                addInitiatorsToSolidFireVag(sfConnection, sfVag.getId(), new String[]{host.getStorageUrl()});
+                            }
                             return;
                         }
                     }
@@ -571,6 +574,14 @@
         }
     }
 
+    private static void addInitiatorsToExistingVag(ClusterDao clusterDao, Host host, List<SolidFireUtil.SolidFireVag> sfVags, SolidFireUtil.SolidFireConnection sfConnection){
+        String clusterUuId = clusterDao.findById(host.getClusterId()).getUuid();
+        SolidFireVag sfVagMatchingClusterId = sfVags.stream().filter(vag -> vag.getName().equals("CloudStack-"+clusterUuId)).findFirst().orElse(null);
+        if (sfVagMatchingClusterId != null && sfVagMatchingClusterId.getInitiators().length < MAX_NUM_INITIATORS_PER_VAG) {
+            addInitiatorsToSolidFireVag(sfConnection, sfVagMatchingClusterId.getId(), new String[]{host.getStorageUrl()});
+        }
+    }
+
     /**
      * Make use of the volume access group (VAG) of a random host in the cluster. With this VAG, collect all of its volume IDs that are for
      * volumes that are in SolidFire accounts that are for CloudStack.
@@ -683,7 +694,7 @@
         return null;
     }
 
-    public static void placeVolumeInVolumeAccessGroups(SolidFireConnection sfConnection, long sfVolumeId, List<HostVO> hosts) {
+    public static void placeVolumeInVolumeAccessGroups(SolidFireConnection sfConnection, long sfVolumeId, List<HostVO> hosts, String clusterUuId) {
         if (!SolidFireUtil.hostsSupport_iScsi(hosts)) {
             String errMsg = "Not all hosts in the compute cluster support iSCSI.";
 
@@ -691,11 +702,50 @@
 
             throw new CloudRuntimeException(errMsg);
         }
-
         List<SolidFireUtil.SolidFireVag> sfVags = SolidFireUtil.getAllVags(sfConnection);
+        Map<SolidFireUtil.SolidFireVag, List<String>> sfVagToIqnsMap = buildVagToIQNMap(hosts, sfVags);
+        if (sfVagToIqnsMap.size() > MAX_NUM_VAGS_PER_VOLUME) {
+            throw new CloudRuntimeException("A SolidFire volume can be in at most four volume access groups simultaneously.");
+        }
+        if (sfVagToIqnsMap.containsKey(null)) {
+            sfVagToIqnsMap = updateNullKeyInSfVagToIqnsMap(sfVagToIqnsMap, sfVags, sfConnection, clusterUuId, sfVolumeId);
+        }
+        addVolumestoVagIfNotPresent(sfVagToIqnsMap.keySet(), sfVolumeId, sfConnection);
+    }
+
+    private static Map<SolidFireUtil.SolidFireVag, List<String>> updateNullKeyInSfVagToIqnsMap(Map<SolidFireUtil.SolidFireVag,List<String>> sfVagToIqnsMap, List <SolidFireUtil.SolidFireVag> sfVags, SolidFireConnection sfConnection, String clusterUuId, long sfVolumeId){
+        SolidFireUtil.SolidFireVag sfVagMatchingClusterId = createClusterVagIfDoesntExist(sfVags, sfConnection, clusterUuId, sfVagToIqnsMap, sfVolumeId);
+        sfVagToIqnsMap.put(sfVagMatchingClusterId, sfVagToIqnsMap.get(null));
+        sfVagToIqnsMap.remove(null);
+        return sfVagToIqnsMap;
+    }
+
+    private static SolidFireVag createClusterVagIfDoesntExist(List<SolidFireUtil.SolidFireVag> sfVags, SolidFireConnection sfConnection, String clusterUuId, Map<SolidFireUtil.SolidFireVag, List<String>> sfVagToIqnsMap, long sfVolumeId) {
+        SolidFireVag sfVagMatchingClusterId = sfVags.stream().filter(vag -> vag.getName().equals("CloudStack-" + clusterUuId)).findFirst().orElse(null);
+        if (sfVagMatchingClusterId == null) {
+            LOGGER.info("Creating volume access group CloudStack-" + clusterUuId);
+            SolidFireUtil.createVag(sfConnection, "CloudStack-" + clusterUuId, sfVagToIqnsMap.get(null).toArray(new String[0]), new long[]{sfVolumeId});
+            sfVags = SolidFireUtil.getAllVags(sfConnection);
+            return sfVags.stream().filter(vag -> vag.getName().equals("CloudStack-" + clusterUuId)).findFirst().orElse(null);
+        }else{
+            return sfVagMatchingClusterId;
+        }
+    }
+
+    private static void addVolumestoVagIfNotPresent(Set<SolidFireUtil.SolidFireVag> sfVagSet, long sfVolumeId, SolidFireConnection sfConnection){
+        for (SolidFireUtil.SolidFireVag sfVag : sfVagSet) {
+            if (sfVag != null) {
+                if (!SolidFireUtil.isVolumeIdInSfVag(sfVolumeId, sfVag)) {
+                    SolidFireUtil.addVolumeIdsToSolidFireVag(sfConnection, sfVag.getId(), new Long[] { sfVolumeId });
+                }
+            }
+        }
+    }
+
+
+    private static Map<SolidFireVag,List<String>> buildVagToIQNMap(List<HostVO> hosts, List<SolidFireVag> sfVags) {
 
         Map<SolidFireUtil.SolidFireVag, List<String>> sfVagToIqnsMap = new HashMap<>();
-
         for (HostVO hostVO : hosts) {
             String iqn = hostVO.getStorageUrl();
 
@@ -705,24 +755,8 @@
 
             iqnsInVag.add(iqn);
         }
+        return sfVagToIqnsMap;
 
-        if (sfVagToIqnsMap.size() > MAX_NUM_VAGS_PER_VOLUME) {
-            throw new CloudRuntimeException("A SolidFire volume can be in at most four volume access groups simultaneously.");
-        }
-
-        for (SolidFireUtil.SolidFireVag sfVag : sfVagToIqnsMap.keySet()) {
-            if (sfVag != null) {
-                if (!SolidFireUtil.isVolumeIdInSfVag(sfVolumeId, sfVag)) {
-                    SolidFireUtil.addVolumeIdsToSolidFireVag(sfConnection, sfVag.getId(), new Long[] { sfVolumeId });
-                }
-            }
-            else {
-                List<String> iqnsNotInVag = sfVagToIqnsMap.get(null);
-
-                SolidFireUtil.createVag(sfConnection, "CloudStack-" + UUID.randomUUID().toString(),
-                        iqnsNotInVag.toArray(new String[0]), new long[] { sfVolumeId });
-            }
-        }
     }
 
     public static SolidFireUtil.SolidFireVag getVolumeAccessGroup(String hostIqn, List<SolidFireUtil.SolidFireVag> sfVags) {
@@ -777,6 +811,18 @@
         return false;
     }
 
+    private static boolean isInitiatorInSfVag(String initiatorName, SolidFireUtil.SolidFireVag sfVag) {
+        String[] initiatorsList = sfVag.getInitiators();
+
+        for (String initiator : initiatorsList) {
+            if (initiatorName.equals(initiator)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     private static boolean hostSupports_iScsi(Host host) {
         return host != null && host.getStorageUrl() != null && host.getStorageUrl().trim().length() > 0 && host.getStorageUrl().startsWith("iqn");
     }
@@ -1245,7 +1291,7 @@
 
         if (vags != null) {
             for (VolumeAccessGroup vag : vags) {
-                SolidFireVag sfVag = new SolidFireVag(vag.getVolumeAccessGroupID(), vag.getInitiators(), toPrimitive(vag.getVolumes()));
+                SolidFireVag sfVag = new SolidFireVag(vag.getVolumeAccessGroupID(), vag.getInitiators(), toPrimitive(vag.getVolumes()), vag.getName());
 
                 lstSolidFireVags.add(sfVag);
             }
@@ -1258,11 +1304,13 @@
         private final long _id;
         private final String[] _initiators;
         private final long[] _volumeIds;
+        private final String _vagName;
 
-        SolidFireVag(long id, String[] initiators, long[] volumeIds) {
+        SolidFireVag(long id, String[] initiators, long[] volumeIds, String name) {
             _id = id;
             _initiators = initiators;
             _volumeIds = volumeIds;
+            _vagName = name;
         }
 
         public long getId() {
@@ -1277,6 +1325,8 @@
             return _volumeIds;
         }
 
+        public String getName() { return _vagName; }
+
         @Override
         public int hashCode() {
             return String.valueOf(_id).hashCode();
diff --git a/plugins/user-authenticators/ldap/pom.xml b/plugins/user-authenticators/ldap/pom.xml
index c42d6ad..7972cd8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
diff --git a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapListUsersCmd.java b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapListUsersCmd.java
index ae60174..0b46489 100644
--- a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapListUsersCmd.java
+++ b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapListUsersCmd.java
@@ -225,7 +225,7 @@
                     rc = true;
                 } else {
                     if(s_logger.isTraceEnabled()) {
-                        s_logger.trace(String.format("ldap user %s does not match cloudstack user", ldapUser.getUsername(), cloudstackUser.getUsername()));
+                        s_logger.trace(String.format("ldap user %s does not match cloudstack user %s", ldapUser.getUsername(), cloudstackUser.getUsername()));
                     }
                 }
             }
@@ -242,12 +242,12 @@
             for (final UserResponse cloudstackUser : cloudstackUsers) {
                 if (ldapUser.getUsername().equals(cloudstackUser.getUsername())) {
                     if(s_logger.isTraceEnabled()) {
-                        s_logger.trace(String.format("found user %s in cloudstack", ldapUser.getUsername()));
+                        s_logger.trace(String.format("found user %s in cloudstack user %s", ldapUser.getUsername(), cloudstackUser.getUsername()));
                     }
                     return true;
                 } else {
                     if(s_logger.isTraceEnabled()) {
-                        s_logger.trace(String.format("ldap user %s does not match cloudstack user", ldapUser.getUsername(), cloudstackUser.getUsername()));
+                        s_logger.trace(String.format("ldap user %s does not match cloudstack user %s", ldapUser.getUsername(), cloudstackUser.getUsername()));
                     }
                 }
             }
diff --git a/plugins/user-authenticators/md5/pom.xml b/plugins/user-authenticators/md5/pom.xml
index 4e17f61..5218e68 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 8e58149..6d62236 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 9303642..7b4c120 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 0a23ffd..9a9524e 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAMLUtils.java b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAMLUtils.java
index 6a03d44..6110cc5 100644
--- a/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAMLUtils.java
+++ b/plugins/user-authenticators/saml2/src/main/java/org/apache/cloudstack/saml/SAMLUtils.java
@@ -280,7 +280,7 @@
             resp.addCookie(new Cookie("timezone", URLEncoder.encode(timezone, HttpUtils.UTF_8)));
         }
         resp.addCookie(new Cookie("userfullname", URLEncoder.encode(loginResponse.getFirstName() + " " + loginResponse.getLastName(), HttpUtils.UTF_8).replace("+", "%20")));
-        resp.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly;Path=/", ApiConstants.SESSIONKEY, loginResponse.getSessionKey()));
+        resp.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly", ApiConstants.SESSIONKEY, loginResponse.getSessionKey()));
     }
 
     /**
diff --git a/plugins/user-authenticators/sha256salted/pom.xml b/plugins/user-authenticators/sha256salted/pom.xml
index 752b60f..f86d801 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/pom.xml b/pom.xml
index 497da9e..d2b1182 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
 
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>cloudstack</artifactId>
-    <version>4.14.2.0-SNAPSHOT</version>
+    <version>4.15.1.0-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>Apache CloudStack</name>
     <description>Apache CloudStack is an IaaS ("Infrastructure as a Service") cloud orchestration platform.</description>
@@ -81,23 +81,24 @@
         <cs.logging.version>1.1.1</cs.logging.version>
 
         <!-- Apache Commons versions -->
-        <cs.codec.version>1.14</cs.codec.version>
+        <cs.codec.version>1.15</cs.codec.version>
         <cs.commons-collections.version>4.4</cs.commons-collections.version>
-        <cs.commons-compress.version>1.19</cs.commons-compress.version>
+        <cs.commons-compress.version>1.20</cs.commons-compress.version>
         <cs.commons-exec.version>1.3</cs.commons-exec.version>
         <cs.commons-fileupload.version>1.4</cs.commons-fileupload.version>
         <cs.commons-httpclient.version>3.1</cs.commons-httpclient.version>
-        <cs.commons-io.version>2.6</cs.commons-io.version>
-        <cs.commons-lang3.version>3.9</cs.commons-lang3.version>
+        <cs.commons-io.version>2.8.0</cs.commons-io.version>
+        <cs.commons-lang3.version>3.11</cs.commons-lang3.version>
         <cs.commons-logging.version>1.2</cs.commons-logging.version>
-        <cs.commons-net.version>3.6</cs.commons-net.version>
+        <cs.commons-net.version>3.7.2</cs.commons-net.version>
         <cs.commons-validator.version>1.6</cs.commons-validator.version>
         <cs.configuration.version>1.10</cs.configuration.version>
-        <cs.daemon.version>1.2.2</cs.daemon.version>
-        <cs.dbcp.version>2.7.0</cs.dbcp.version>
+        <cs.daemon.version>1.2.3</cs.daemon.version>
+        <cs.dbcp.version>2.8.0</cs.dbcp.version>
         <cs.discovery.version>0.5</cs.discovery.version>
         <cs.lang.version>2.6</cs.lang.version>
-        <cs.pool.version>2.7.0</cs.pool.version>
+        <cs.pool.version>2.9.0</cs.pool.version>
+        <cs.commons-math3.version>3.6.1</cs.commons-math3.version>
 
         <!-- Testing versions -->
         <!-- do not forget to also upgrade hamcrest library with junit -->
@@ -115,63 +116,62 @@
         <cs.xercesImpl.version>2.12.0</cs.xercesImpl.version>
 
         <!-- Dependencies versions -->
-        <cs.amqp-client.version>5.8.0</cs.amqp-client.version>
+        <cs.amqp-client.version>5.10.0</cs.amqp-client.version>
         <cs.apache-cloudstack-java-client.version>1.0.9</cs.apache-cloudstack-java-client.version>
-        <cs.aspectjrt.version>1.9.5</cs.aspectjrt.version>
-        <cs.aws.sdk.version>1.11.717</cs.aws.sdk.version>
+        <cs.aspectjrt.version>1.9.6</cs.aspectjrt.version>
+        <cs.aws.sdk.version>1.11.940</cs.aws.sdk.version>
         <cs.axiom.version>1.2.8</cs.axiom.version>
         <cs.axis.version>1.4</cs.axis.version>
-        <cs.batik.version>1.12</cs.batik.version>
+        <cs.batik.version>1.14</cs.batik.version>
         <cs.bcprov.version>1.64</cs.bcprov.version>
         <cs.cglib.version>3.3.0</cs.cglib.version>
         <cs.checkstyle-lib.version>8.18</cs.checkstyle-lib.version>
-        <cs.cxf.version>3.2.6</cs.cxf.version>
+        <cs.cxf.version>3.2.14</cs.cxf.version>
         <cs.ehcache.version>2.6.11</cs.ehcache.version>
         <cs.globodns-client.version>0.0.27</cs.globodns-client.version>
-        <cs.google-http-client>1.34.2</cs.google-http-client>
+        <cs.google-http-client>1.38.1</cs.google-http-client>
         <cs.groovy.version>2.4.17</cs.groovy.version>
         <cs.gson.version>1.7.2</cs.gson.version>
-        <cs.guava.version>28.2-jre</cs.guava.version>
-        <cs.httpclient.version>4.5.11</cs.httpclient.version>
-        <cs.httpcore.version>4.4.13</cs.httpcore.version>
-        <cs.influxdb-java.version>2.20</cs.influxdb-java.version>
-        <cs.jackson.version>2.10.3</cs.jackson.version>
+        <cs.guava.version>30.1-jre</cs.guava.version>
+        <cs.httpclient.version>4.5.13</cs.httpclient.version>
+        <cs.httpcore.version>4.4.14</cs.httpcore.version>
+        <cs.influxdb-java.version>2.21</cs.influxdb-java.version>
+        <cs.jackson.version>2.12.1</cs.jackson.version>
         <cs.jasypt.version>1.9.3</cs.jasypt.version>
         <cs.java-ipv6.version>0.17</cs.java-ipv6.version>
-        <cs.javassist.version>3.26.0-GA</cs.javassist.version>
+        <cs.javassist.version>3.27.0-GA</cs.javassist.version>
         <cs.maven-javadoc-plugin.version>3.1.1</cs.maven-javadoc-plugin.version>
         <cs.javax.annotation.version>1.3.2</cs.javax.annotation.version>
         <cs.jaxb.version>2.3.0</cs.jaxb.version>
         <cs.jaxws.version>2.3.2-1</cs.jaxws.version>
         <cs.jersey-bundle.version>1.19.4</cs.jersey-bundle.version>
-        <cs.jetty.version>9.4.27.v20200227</cs.jetty.version>
+        <cs.jetty.version>9.4.36.v20210114</cs.jetty.version>
         <cs.jetty-maven-plugin.version>9.4.27.v20200227</cs.jetty-maven-plugin.version>
-        <cs.jna.version>4.0.0</cs.jna.version>
-        <cs.joda-time.version>2.10.5</cs.joda-time.version>
+        <cs.jna.version>5.5.0</cs.jna.version>
+        <cs.joda-time.version>2.10.9</cs.joda-time.version>
         <cs.jpa.version>2.2.1</cs.jpa.version>
         <cs.jsch.version>0.1.55</cs.jsch.version>
         <cs.json.version>20090211</cs.json.version>
         <cs.jstl.version>1.2</cs.jstl.version>
-        <cs.kafka-clients.version>0.11.0.3</cs.kafka-clients.version>
-        <cs.libvirt-java.version>0.5.1</cs.libvirt-java.version>
+        <cs.kafka-clients.version>2.7.0</cs.kafka-clients.version>
+        <cs.libvirt-java.version>0.5.2</cs.libvirt-java.version>
         <cs.mail.version>1.5.0-b01</cs.mail.version>
         <cs.mysql.version>8.0.19</cs.mysql.version>
         <cs.neethi.version>2.0.4</cs.neethi.version>
         <cs.nitro.version>10.1</cs.nitro.version>
         <cs.opensaml.version>2.6.4</cs.opensaml.version>
-        <cs.rados-java.version>0.5.0</cs.rados-java.version>
+        <cs.rados-java.version>0.6.0</cs.rados-java.version>
         <cs.reflections.version>0.9.12</cs.reflections.version>
-        <cs.servicemix.version>3.3.3_1</cs.servicemix.version>
+        <cs.servicemix.version>3.4.4_1</cs.servicemix.version>
         <cs.servlet.version>4.0.1</cs.servlet.version>
-        <cs.tomcat-embed-core.version>8.5.47</cs.tomcat-embed-core.version>
+        <cs.tomcat-embed-core.version>8.5.61</cs.tomcat-embed-core.version>
         <cs.trilead.version>1.0.0-build222</cs.trilead.version>
         <cs.vmware.api.version>6.7</cs.vmware.api.version>
         <cs.winrm4j.version>0.5.0</cs.winrm4j.version>
         <cs.xapi.version>6.2.0-3.1</cs.xapi.version>
         <cs.xmlrpc.version>3.1.3</cs.xmlrpc.version>
-        <cs.xstream.version>1.4.11.1</cs.xstream.version>
-        <cs.slf4j.version>1.7.29</cs.slf4j.version>
-        <org.springframework.version>5.2.3.RELEASE</org.springframework.version>
+        <cs.xstream.version>1.4.15</cs.xstream.version>
+        <org.springframework.version>5.3.3</org.springframework.version>
     </properties>
 
     <distributionManagement>
@@ -628,16 +628,6 @@
                 <version>${cs.reflections.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>${cs.slf4j.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-log4j12</artifactId>
-                <version>${cs.slf4j.version}</version>
-            </dependency>
-            <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-aop</artifactId>
                 <version>${org.springframework.version}</version>
@@ -1000,6 +990,7 @@
                             <exclude>systemvm/agent/conf/environment.properties</exclude>
                             <exclude>systemvm/agent/js/jquery.js</exclude>
                             <exclude>systemvm/agent/js/jquery.flot.navigate.js</exclude>
+                            <exclude>systemvm/agent/noVNC/**</exclude>
                             <exclude>systemvm/debian/**</exclude>
                             <exclude>test/integration/component/test_host_ha.sh</exclude>
                             <exclude>test/systemvm/README.md</exclude>
@@ -1014,33 +1005,11 @@
                             <exclude>tools/ngui/static/bootstrap/*</exclude>
                             <exclude>tools/ngui/static/js/lib/*</exclude>
                             <exclude>tools/transifex/.tx/config</exclude>
-                            <exclude>ui/css/src/scss/components/token-input-facebook.scss</exclude>
-                            <exclude>ui/l10n/*</exclude>
-                            <exclude>ui/lib/flot/jquery.colorhelpers.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.crosshair.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.fillbetween.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.image.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.navigate.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.pie.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.resize.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.selection.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.stack.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.symbol.js</exclude>
-                            <exclude>ui/lib/flot/jquery.flot.threshold.js</exclude>
-                            <exclude>ui/lib/jquery-ui/css/jquery-ui.css</exclude>
-                            <exclude>ui/lib/jquery-ui/index.html</exclude>
-                            <exclude>ui/lib/jquery-ui/js/jquery-ui.js</exclude>
-                            <exclude>ui/lib/jquery.cookies.js</exclude>
-                            <exclude>ui/lib/jquery.easing.js</exclude>
-                            <exclude>ui/lib/jquery.js</exclude>
-                            <exclude>ui/lib/jquery.md5.js</exclude>
-                            <exclude>ui/lib/jquery.validate.js</exclude>
-                            <exclude>ui/lib/jquery.tokeninput.js</exclude>
-                            <exclude>ui/lib/qunit/qunit.css</exclude>
-                            <exclude>ui/lib/qunit/qunit.js</exclude>
-                            <exclude>ui/lib/reset.css</exclude>
-                            <exclude>ui/lib/require.js</exclude>
+                            <exclude>ui/.*</exclude>
+                            <exclude>ui/.*/**</exclude>
+                            <exclude>ui/src/assets/**</exclude>
+                            <exclude>ui/public/**</exclude>
+                            <exclude>ui/legacy/**</exclude>
                             <exclude>utils/testsmallfileinactive</exclude>
                         </excludes>
                     </configuration>
diff --git a/python/bindir/cloud-external-ipallocator.py b/python/bindir/cloud-external-ipallocator.py
index f5c1039..1033b19 100755
--- a/python/bindir/cloud-external-ipallocator.py
+++ b/python/bindir/cloud-external-ipallocator.py
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#! /usr/bin/python3
 # 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
@@ -37,25 +37,25 @@
 		self.netmask=None
 		self.initialized=False
 
-		options = augtool.match("/files/etc/dnsmasq.conf/dhcp-option").stdout.strip()
+		options = augtool.match("/files/etc/dnsmasq.conf/dhcp-option").stdout.decode('utf-8').strip()
 		for option in options.splitlines():
 			if option.find("option:router") != -1:
 				self.router = option.split("=")[1].strip().split(",")[1]
-				print self.router
+				print(self.router)
 
-		dhcp_range = augtool.get("/files/etc/dnsmasq.conf/dhcp-range").stdout.strip()
+		dhcp_range = augtool.get("/files/etc/dnsmasq.conf/dhcp-range").stdout.decode('utf-8').strip()
 		dhcp_start = dhcp_range.split("=")[1].strip().split(",")[0]
 		dhcp_end = dhcp_range.split("=")[1].strip().split(",")[1]
 		self.netmask = dhcp_range.split("=")[1].strip().split(",")[2]
-		print dhcp_start, dhcp_end, self.netmask
+		print(dhcp_start, dhcp_end, self.netmask)
 
  		start_ip_num = self.ipToNum(dhcp_start);
 		end_ip_num =  self.ipToNum(dhcp_end)
-		print start_ip_num, end_ip_num
+		print(start_ip_num, end_ip_num)
 	
 		for ip in range(start_ip_num, end_ip_num + 1):
 			self.availIP.append(ip)	
-		print self.availIP[0], self.availIP[len(self.availIP) - 1]	
+		print(self.availIP[0], self.availIP[len(self.availIP) - 1])	
 		
 		#load the ip already allocated
 		self.reloadAllocatedIP()
@@ -87,7 +87,7 @@
 	getInstance = staticmethod(getInstance)
 
 	def reloadAllocatedIP(self):
-		dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip().splitlines()
+		dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip().splitlines()
 		
 		for host in dhcp_hosts:
 			if host.find("dhcp-host") != -1:
@@ -97,7 +97,7 @@
 		
 	def allocateIP(self, mac):
 		newIP = self.getFreeIP()
-		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
+		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip()
 		cnt = len(dhcp_host.splitlines()) + 1
 		script = """set %s %s
 			    save"""%("/files/etc/dnsmasq.conf/dhcp-host[" + str(cnt) + "]", str(mac) + "," + newIP)
@@ -107,17 +107,17 @@
 		return newIP
 
 	def releaseIP(self, ip):
-		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
+		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip()
 		path = None
 		for host in dhcp_host.splitlines():
 			if host.find(ip) != -1:
 				path = host.split("=")[0].strip()
 				
 		if path == None:
-			print "Can't find " + str(ip) + " in conf file"
+			print("Can't find " + str(ip) + " in conf file")
 			return None
 
-		print path
+		print(path)
 		script = """rm %s
 			    save"""%(path)
 		augtool < script
@@ -132,7 +132,7 @@
 		try:
 			user_data = web.input()
 			command = user_data.command
-			print "Processing: " + command
+			print("Processing: " + command)
 
 			dhcpInit = dhcp.getInstance()
 
@@ -140,11 +140,11 @@
 				mac = user_data.mac
 				zone_id = user_data.dc
 				pod_id = user_data.pod
-				print mac, zone_id, pod_id
+				print(mac, zone_id, pod_id)
 				freeIP = dhcpInit.allocateIP(mac)
 				if not freeIP:
 					return "0,0,0"
-				print "Find an available IP: " + freeIP
+				print("Find an available IP: " + freeIP)
 		
 				return freeIP + "," + dhcpInit.getNetmask() + "," + dhcpInit.getRouter()
 			elif command == "releaseIpAddr":
diff --git a/python/bindir/cloud-grab-dependent-library-versions b/python/bindir/cloud-grab-dependent-library-versions
index f07ec1a..cdb5053 100755
--- a/python/bindir/cloud-grab-dependent-library-versions
+++ b/python/bindir/cloud-grab-dependent-library-versions
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
@@ -18,16 +18,16 @@
 
 import subprocess
 
-depLibraries = ['python', 'bzip2', 'gzip', 'unzip', 'openssh-clients', 'nfs-utils', 'wget', 'ws-commons-util', 'commons-dbcp',
-                'commons-collections', 'commons-httpclient', 'jpackage-utils', 'MySQL-python', 'python-paramiko', 'ipmitool', 'commons-httpclient', 'commons-collections',
+depLibraries = ['bzip2', 'gzip', 'unzip', 'openssh-clients', 'nfs-utils', 'wget', 'ws-commons-util', 'commons-dbcp',
+                'commons-collections', 'commons-httpclient', 'jpackage-utils', 'mysql-connector-python3', 'python-paramiko', 'ipmitool', 'commons-httpclient', 'commons-collections',
                 'commons-pool', 'commons-dbcp', 'jakarta-commons-logging', 'java-*-openjdk']
 
 def runCmd(cmds):
     process = subprocess.Popen(' '.join(cmds), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     stdout, stderr = process.communicate()
     if process.returncode != 0:
-        raise Exception(stderr)
-    return stdout
+        raise Exception(stderr.decode('utf-8'))
+    return stdout.decode('utf-8')
 
 
 def getDependentLibraryInfo():
@@ -43,12 +43,12 @@
             key = key.strip()
             value = value.strip()
             if key == 'Name' and "*" not in pkgname and pkgname not in value:
-                print "Required package name %s doesn't equal to package %s installed"%(pkgname, value)
+                print("Required package name %s doesn't equal to package %s installed"%(pkgname, value))
                 return 'UNKNOWN'
             if 'Version' in key: return value
             if 'Description' in key: return 'UNKNOWN' # we hit the end
         return 'UNKNOWN'
-    
+
     libraryMap = {}
     for l in depLibraries:
         cmd = ['yum', 'info', '"%s"'%l]
@@ -56,20 +56,26 @@
             result = runCmd(cmd)
             version = getVersion(result, l)
             libraryMap[l] = version
-        except Exception, e:
-            print "When finding %s, encounters %s"%(l, e)
+        except Exception as e:
+            print("When finding %s, encounters %s"%(l, e))
             continue
     return libraryMap
 
 def arrangeOutPut(libraryMap):
     msg = ['\n\n\nBelow is the checking list of library version that CloudStack depends on:']
     for l in depLibraries:
-        if libraryMap.has_key(l):
+        if l in libraryMap:
             entry = "%-40s:    %s"%(l, libraryMap[l])
         else:
             entry = "%-40s:    %s"%(l, 'UNKNOWN')
         msg.append(entry)
-    print '\n'.join(msg)
+    print('\n'.join(msg))
         
 if __name__ == '__main__':
+    pythonDepLibraries = ['python', 'python3']
+    relver = runCmd(['rpm', '-q', 'centos-release'])
+    if relver.startswith('centos-release-') and int(relver[len('centos-release-')]) >= 8:
+        pythonDepLibraries = ['python2', 'python36']
+    depLibraries = pythonDepLibraries + depLibraries
+
     arrangeOutPut(getDependentLibraryInfo())
diff --git a/python/bindir/cloud-setup-baremetal b/python/bindir/cloud-setup-baremetal
index 03ea086..a4ef7ad 100755
--- a/python/bindir/cloud-setup-baremetal
+++ b/python/bindir/cloud-setup-baremetal
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # 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
diff --git a/python/incubation/cloud-web-ipallocator.py b/python/incubation/cloud-web-ipallocator.py
index f5c1039..1033b19 100755
--- a/python/incubation/cloud-web-ipallocator.py
+++ b/python/incubation/cloud-web-ipallocator.py
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#! /usr/bin/python3
 # 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
@@ -37,25 +37,25 @@
 		self.netmask=None
 		self.initialized=False
 
-		options = augtool.match("/files/etc/dnsmasq.conf/dhcp-option").stdout.strip()
+		options = augtool.match("/files/etc/dnsmasq.conf/dhcp-option").stdout.decode('utf-8').strip()
 		for option in options.splitlines():
 			if option.find("option:router") != -1:
 				self.router = option.split("=")[1].strip().split(",")[1]
-				print self.router
+				print(self.router)
 
-		dhcp_range = augtool.get("/files/etc/dnsmasq.conf/dhcp-range").stdout.strip()
+		dhcp_range = augtool.get("/files/etc/dnsmasq.conf/dhcp-range").stdout.decode('utf-8').strip()
 		dhcp_start = dhcp_range.split("=")[1].strip().split(",")[0]
 		dhcp_end = dhcp_range.split("=")[1].strip().split(",")[1]
 		self.netmask = dhcp_range.split("=")[1].strip().split(",")[2]
-		print dhcp_start, dhcp_end, self.netmask
+		print(dhcp_start, dhcp_end, self.netmask)
 
  		start_ip_num = self.ipToNum(dhcp_start);
 		end_ip_num =  self.ipToNum(dhcp_end)
-		print start_ip_num, end_ip_num
+		print(start_ip_num, end_ip_num)
 	
 		for ip in range(start_ip_num, end_ip_num + 1):
 			self.availIP.append(ip)	
-		print self.availIP[0], self.availIP[len(self.availIP) - 1]	
+		print(self.availIP[0], self.availIP[len(self.availIP) - 1])	
 		
 		#load the ip already allocated
 		self.reloadAllocatedIP()
@@ -87,7 +87,7 @@
 	getInstance = staticmethod(getInstance)
 
 	def reloadAllocatedIP(self):
-		dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip().splitlines()
+		dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip().splitlines()
 		
 		for host in dhcp_hosts:
 			if host.find("dhcp-host") != -1:
@@ -97,7 +97,7 @@
 		
 	def allocateIP(self, mac):
 		newIP = self.getFreeIP()
-		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
+		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip()
 		cnt = len(dhcp_host.splitlines()) + 1
 		script = """set %s %s
 			    save"""%("/files/etc/dnsmasq.conf/dhcp-host[" + str(cnt) + "]", str(mac) + "," + newIP)
@@ -107,17 +107,17 @@
 		return newIP
 
 	def releaseIP(self, ip):
-		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
+		dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip()
 		path = None
 		for host in dhcp_host.splitlines():
 			if host.find(ip) != -1:
 				path = host.split("=")[0].strip()
 				
 		if path == None:
-			print "Can't find " + str(ip) + " in conf file"
+			print("Can't find " + str(ip) + " in conf file")
 			return None
 
-		print path
+		print(path)
 		script = """rm %s
 			    save"""%(path)
 		augtool < script
@@ -132,7 +132,7 @@
 		try:
 			user_data = web.input()
 			command = user_data.command
-			print "Processing: " + command
+			print("Processing: " + command)
 
 			dhcpInit = dhcp.getInstance()
 
@@ -140,11 +140,11 @@
 				mac = user_data.mac
 				zone_id = user_data.dc
 				pod_id = user_data.pod
-				print mac, zone_id, pod_id
+				print(mac, zone_id, pod_id)
 				freeIP = dhcpInit.allocateIP(mac)
 				if not freeIP:
 					return "0,0,0"
-				print "Find an available IP: " + freeIP
+				print("Find an available IP: " + freeIP)
 		
 				return freeIP + "," + dhcpInit.getNetmask() + "," + dhcpInit.getRouter()
 			elif command == "releaseIpAddr":
diff --git a/python/lib/cloud_utils.py b/python/lib/cloud_utils.py
index 36ce617..be908281 100644
--- a/python/lib/cloud_utils.py
+++ b/python/lib/cloud_utils.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # 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
@@ -24,7 +24,7 @@
 """CloudStack Python utility library"""
 
 import sys, os, subprocess, errno, re, time, glob
-import urllib2
+import urllib.request, urllib.error, urllib.parse
 import xml.dom.minidom
 import logging
 import socket
@@ -65,14 +65,14 @@
 if os.path.exists("/etc/fedora-release"): distro = Fedora
 elif os.path.exists("/etc/centos-release"): distro = CentOS
 elif os.path.exists("/etc/redhat-release"):
-    version = file("/etc/redhat-release").readline()
+    version = open("/etc/redhat-release").readline()
     if version.find("Red Hat Enterprise Linux Server release 6") != -1:
         distro = RHEL6
     elif version.find("CentOS") != -1:
         distro = CentOS
     else:
         distro = CentOS
-elif os.path.exists("/etc/legal") and "Ubuntu" in file("/etc/legal").read(-1): distro = Ubuntu
+elif os.path.exists("/etc/legal") and "Ubuntu" in open("/etc/legal").read(-1): distro = Ubuntu
 else: distro = Unknown
 logFileName=None
 # ==================  LIBRARY UTILITY CODE=============
@@ -80,7 +80,7 @@
 	global logFileName
 	logFileName=logFile
 def read_properties(propfile):
-	if not hasattr(propfile,"read"): propfile = file(propfile)
+	if not hasattr(propfile,"read"): propfile = open(propfile)
 	properties = propfile.read().splitlines()
 	properties = [ s.strip() for s in properties ]
 	properties = [ s for s in properties if
@@ -211,7 +211,6 @@
 ifconfig = Command("ifconfig")
 ifdown = Command("ifdown")
 ifup = Command("ifup")
-brctl = Command("brctl")
 uuidgen = Command("uuidgen")
 
 
@@ -225,7 +224,7 @@
 		else:
 			# retcode 0, service running
 			return True
-	except CalledProcessError,e:
+	except CalledProcessError as e:
 		# retcode nonzero, service not running
 		return False
 
@@ -261,7 +260,7 @@
 
 
 def replace_line(f,startswith,stanza,always_add=False):
-	lines = [ s.strip() for s in file(f).readlines() ]
+	lines = [ s.strip() for s in open(f).readlines() ]
 	newlines = []
 	replaced = False
 	for line in lines:
@@ -271,7 +270,7 @@
 		else: newlines.append(line)
 	if not replaced and always_add: newlines.append(stanza)
 	newlines = [ s + '\n' for s in newlines ]
-	file(f,"w").writelines(newlines)
+	open(f,"w").writelines(newlines)
 
 def replace_or_add_line(f,startswith,stanza):
 	return replace_line(f,startswith,stanza,always_add=True)
@@ -301,11 +300,11 @@
 			return True
 		except CalledProcessError:
 			raise CheckFailed("KVM is not correctly installed on this system, or support for it is not enabled in the BIOS")
-		except OSError,e:
-			if e.errno is errno.ENOENT: raise CheckFailed("KVM is not correctly installed on this system, or support for it is not enabled in the BIOS")
+		except OSError as e:
+			if e.errno == errno.ENOENT: raise CheckFailed("KVM is not correctly installed on this system, or support for it is not enabled in the BIOS")
 			raise
 		return True
-	raise AssertionError, "check_kvm() should have never reached this part"
+	raise AssertionError("check_kvm() should have never reached this part")
 
 def check_cgroups():
 	return glob.glob("/*/cpu.shares")
@@ -316,14 +315,14 @@
 	enforcing = False
 	config_enforcing = False
 	try:
-		output = getenforce().stdout.strip()
+		output = getenforce().stdout.decode('utf-8').strip()
 		if "nforcing" in output:
 			enforcing = True
-		if any ( [ s.startswith("SELINUX=enforcing") for s in file("/etc/selinux/config").readlines() ] ):
+		if any ( [ s.startswith("SELINUX=enforcing") for s in open("/etc/selinux/config").readlines() ] ):
 			config_enforcing = True
 		else:
 			config_enforcing = False
-	except (IOError,OSError),e:
+	except (IOError,OSError) as e:
 		if e.errno == 2: pass
 		else: raise CheckFailed("An unknown error (%s) took place while checking for SELinux"%str(e))
 	if enforcing:
@@ -334,8 +333,8 @@
 We strongly suggest you doing the option 1 that makes sure SELinux goes into permissive after system reboot.\n''')
 
 	if config_enforcing:
-		print "WARNING: We detected that your SELinux is not configured in permissive. to make sure cloudstack won't block by \
-SELinux after system reboot, we strongly suggest you setting it in permissive in /etc/selinux/config, then reboot the machine."
+		print("WARNING: We detected that your SELinux is not configured in permissive. to make sure cloudstack won't block by \
+SELinux after system reboot, we strongly suggest you setting it in permissive in /etc/selinux/config, then reboot the machine.")
 
 
 def preflight_checks(do_check_kvm=True):
@@ -399,7 +398,7 @@
 	def __init__(self,brname, pubNic, prvNic):
 		ConfigTask.__init__(self)
 		self.brname = brname
-  	        self.pubNic = pubNic
+		self.pubNic = pubNic
 		self.prvNic = prvNic
 		self.runtime_state_changed = False
 		self.was_nm_service_running = None
@@ -431,8 +430,8 @@
 				if not alreadysetup:
 					alreadysetup = augtool.match("/files/etc/network/interfaces/iface",self.brname).stdout.strip()
 			return alreadysetup
-		except OSError,e:
-			if e.errno is 2: raise TaskFailed("augtool has not been properly installed on this system")
+		except OSError as e:
+			if e.errno == 2: raise TaskFailed("augtool has not been properly installed on this system")
 			raise
 
 	def restore_state(self):
@@ -441,8 +440,8 @@
 		try:
 			o = ifconfig(self.brname)
 			bridge_exists = True
-		except CalledProcessError,e:
-			print e.stdout + e.stderr
+		except CalledProcessError as e:
+			print(e.stdout + e.stderr)
 			bridge_exists = False
 			
 		if bridge_exists:
@@ -454,7 +453,7 @@
 			except CalledProcessError: pass
 			try: ifconfig(self.brname,"down")
 			except CalledProcessError: pass
-			try: brctl("delbr",self.brname)
+			try: ip("link del",self.brname)
 			except CalledProcessError: pass
 			try: ifdown("--force",self.brname)
 			except CalledProcessError: pass
@@ -471,7 +470,7 @@
 			stop_service(self.netservice,force=True)
 			time.sleep(1)
 			try: start_service(self.netservice,force=True)
-			except CalledProcessError,e:
+			except CalledProcessError as e:
 				if e.returncode == 1: pass
 				else: raise
 			time.sleep(1)
@@ -543,17 +542,17 @@
 		yield "Creating Cloud bridging device and making device %s member of this bridge"%dev
 
 		if distro in (Fedora, CentOS, RHEL6):
-			ifcfgtext = file(pathtoconfigfile).read()
+			ifcfgtext = open(pathtoconfigfile).read()
 			newf = "/etc/sysconfig/network-scripts/ifcfg-%s"%self.brname
 			#def restore():
 				#try: os.unlink(newf)
 				#except OSError,e:
 					#if errno == 2: pass
 					#raise
-				#try: file(pathtoconfigfile,"w").write(ifcfgtext)
+				#try: open(pathtoconfigfile,"w").write(ifcfgtext)
 				#except OSError,e: raise
 
-			f = file(newf,"w") ; f.write(ifcfgtext) ; f.flush() ; f.close()
+			f = open(newf,"w") ; f.write(ifcfgtext) ; f.flush() ; f.close()
 			innewconfigfile = "/files" + newf
 
 			script = """set %s/DEVICE %s
@@ -580,18 +579,18 @@
 			try:
 				returned = augtool < script
 				if "Saved 2 file" not in returned.stdout:
-					print returned.stdout + returned.stderr
+					print(returned.stdout + returned.stderr)
 					#restore()
 					raise TaskFailed("Network reconfiguration failed.")
 				else:
 					yield "Network reconfiguration complete"
-			except CalledProcessError,e:
+			except CalledProcessError as e:
 				#restore()
-				print e.stdout + e.stderr
+				print(e.stdout + e.stderr)
 				raise TaskFailed("Network reconfiguration failed")
 		else: # Not fedora
-			backup = file("/etc/network/interfaces").read(-1)
-			#restore = lambda: file("/etc/network/interfaces","w").write(backup)
+			backup = open("/etc/network/interfaces").read(-1)
+			#restore = lambda: open("/etc/network/interfaces","w").write(backup)
 
 			script = """set %s %s
 set %s %s
@@ -607,15 +606,15 @@
 					raise TaskFailed("Network reconfiguration failed.")
 				else:
 					yield "Network reconfiguration complete"
-			except CalledProcessError,e:
+			except CalledProcessError as e:
 				#restore()
-				print e.stdout + e.stderr
+				print(e.stdout + e.stderr)
 				raise TaskFailed("Network reconfiguration failed")
 		
 		yield "We are going to restart network services now, to make the network changes take effect.  Hit ENTER when you are ready."
 		if self.isAutoMode(): pass
-        	else:
-		    raw_input()
+		else:
+		    input()
 		
 		# if we reach here, then if something goes wrong we should attempt to revert the runinng state
 		# if not, then no point
@@ -625,15 +624,15 @@
 		if distro is Ubuntu: ifup(self.brname,stdout=None,stderr=None)
 		stop_service(self.netservice)
 		try: enable_service(self.netservice,forcestart=True)
-		except CalledProcessError,e:
+		except CalledProcessError as e:
 			if e.returncode == 1: pass
 			else: raise
 		
 		yield "Verifying that the bridge is up"
 		try:
 			o = ifconfig(self.brname)
-		except CalledProcessError,e:
-			print e.stdout + e.stderr
+		except CalledProcessError as e:
+			print(e.stdout + e.stderr)
 			raise TaskFailed("The bridge could not be set up properly")
 		
 		yield "Networking restart done"
@@ -645,13 +644,13 @@
 	def done(self):
 		
 		try:
-			return "group virt" in file("/etc/cgconfig.conf","r").read(-1)
-		except IOError,e:
-			if e.errno is 2: raise TaskFailed("cgconfig has not been properly installed on this system")
+			return "group virt" in open("/etc/cgconfig.conf","r").read(-1)
+		except IOError as e:
+			if e.errno == 2: raise TaskFailed("cgconfig has not been properly installed on this system")
 			raise
 		
 	def execute(self):
-		cgconfig = file("/etc/cgconfig.conf","r").read(-1)
+		cgconfig = open("/etc/cgconfig.conf","r").read(-1)
 		cgconfig = cgconfig + """
 group virt {
 	cpu {
@@ -659,7 +658,7 @@
 	}
 }
 """
-		file("/etc/cgconfig.conf","w").write(cgconfig)
+		open("/etc/cgconfig.conf","w").write(cgconfig)
 		
 		stop_service("cgconfig")
 		enable_service("cgconfig",forcestart=True)
@@ -671,15 +670,15 @@
 	
 	def done(self):
 		try:
-			return self.cfgline in file("/etc/cgrules.conf","r").read(-1)
-		except IOError,e:
-			if e.errno is 2: raise TaskFailed("cgrulesd has not been properly installed on this system")
+			return self.cfgline in open("/etc/cgrules.conf","r").read(-1)
+		except IOError as e:
+			if e.errno == 2: raise TaskFailed("cgrulesd has not been properly installed on this system")
 			raise
 	
 	def execute(self):
-		cgrules = file("/etc/cgrules.conf","r").read(-1)
+		cgrules = open("/etc/cgrules.conf","r").read(-1)
 		cgrules = cgrules + "\n" + self.cfgline + "\n"
-		file("/etc/cgrules.conf","w").write(cgrules)
+		open("/etc/cgrules.conf","w").write(cgrules)
 		
 		stop_service("cgred")
 		enable_service("cgred")
@@ -692,15 +691,15 @@
 	
 	def done(self):
 		try:
-			return self.cfgline in file(self.filename,"r").read(-1)
-		except IOError,e:
-			if e.errno is 2: raise TaskFailed("qemu has not been properly installed on this system")
+			return self.cfgline in open(self.filename,"r").read(-1)
+		except IOError as e:
+			if e.errno == 2: raise TaskFailed("qemu has not been properly installed on this system")
 			raise
 	
 	def execute(self):
-		libvirtqemu = file(self.filename,"r").read(-1)
+		libvirtqemu = open(self.filename,"r").read(-1)
 		libvirtqemu = libvirtqemu + "\n" + self.cfgline + "\n"
-		file("/etc/libvirt/qemu.conf","w").write(libvirtqemu)
+		open("/etc/libvirt/qemu.conf","w").write(libvirtqemu)
 
 
 class SetupLibvirt(ConfigTask):
@@ -710,19 +709,19 @@
 		try:
 			if distro in (Fedora,CentOS, RHEL6): 	 libvirtfile = "/etc/sysconfig/libvirtd"
 			elif distro is Ubuntu:	 libvirtfile = "/etc/default/libvirt-bin"
-			else: raise AssertionError, "We should not reach this"
-			return self.cfgline in file(libvirtfile,"r").read(-1)
-		except IOError,e:
-			if e.errno is 2: raise TaskFailed("libvirt has not been properly installed on this system")
+			else: raise AssertionError("We should not reach this")
+			return self.cfgline in open(libvirtfile,"r").read(-1)
+		except IOError as e:
+			if e.errno == 2: raise TaskFailed("libvirt has not been properly installed on this system")
 			raise
 	
 	def execute(self):
 		if distro in (Fedora,CentOS, RHEL6): 	 libvirtfile = "/etc/sysconfig/libvirtd"
 		elif distro is Ubuntu:	 libvirtfile = "/etc/default/libvirt-bin"
-		else: raise AssertionError, "We should not reach this"
-		libvirtbin = file(libvirtfile,"r").read(-1)
+		else: raise AssertionError("We should not reach this")
+		libvirtbin = open(libvirtfile,"r").read(-1)
 		libvirtbin = libvirtbin + "\n" + self.cfgline + "\n"
-		file(libvirtfile,"w").write(libvirtbin)
+		open(libvirtfile,"w").write(libvirtbin)
 		
 		if distro in (CentOS, Fedora, RHEL6):	svc = "libvirtd"
 		else:					svc = "libvirt-bin"
@@ -740,10 +739,10 @@
 	
 	def done(self):
 		try:
-			lines = [ s.strip() for s in file("/etc/libvirt/libvirtd.conf").readlines() ]
+			lines = [ s.strip() for s in open("/etc/libvirt/libvirtd.conf").readlines() ]
 			if all( [ stanza in lines for stanza in self.stanzas ] ): return True
-		except IOError,e:
-			if e.errno is 2: raise TaskFailed("libvirt has not been properly installed on this system")
+		except IOError as e:
+			if e.errno == 2: raise TaskFailed("libvirt has not been properly installed on this system")
 			raise
 	
 	def execute(self):
@@ -807,7 +806,7 @@
 		ports = "22 1798 16509 16514".split()
 		if distro in (Fedora , CentOS, RHEL6):
 			for p in ports: iptables("-I","INPUT","1","-p","tcp","--dport",p,'-j','ACCEPT')
-			o = service.iptables.save() ; print o.stdout + o.stderr
+			o = service.iptables.save() ; print(o.stdout + o.stderr)
 		else:
 			for p in ports: ufw.allow(p)
 
@@ -894,7 +893,7 @@
 	check_call( ["rm","-rf",targetdir] )
 
 def list_zonespods(host):
-	text = urllib2.urlopen('http://%s:8096/client/api?command=listPods'%host).read(-1)
+	text = urllib.request.urlopen('http://%s:8096/client/api?command=listPods'%host).read(-1)
 	dom = xml.dom.minidom.parseString(text) 
 	x = [ (zonename,podname)
 		for pod in dom.childNodes[0].childNodes  
@@ -908,13 +907,13 @@
 	Returns (zone,pod) or None if the user made the default selection."""
 	while True:
 		stderr("Type the number of the zone and pod combination this host belongs to (hit ENTER to skip this step)")
-		print "  N) ZONE, POD" 
-		print "================"
+		print("  N) ZONE, POD") 
+		print("================")
 		for n,(z,p) in enumerate(zonespods):
-			print "%3d) %s, %s"%(n,z,p)
-		print "================"
-		print "> ",
-		zoneandpod = raw_input().strip()
+			print("%3d) %s, %s"%(n,z,p))
+		print("================")
+		print("> ", end=' ')
+		zoneandpod = input().strip()
 		
 		if not zoneandpod:
 			# we go with default, do not touch anything, just break
@@ -923,8 +922,8 @@
 		try:
 			# if parsing fails as an int, just vomit and retry
 			zoneandpod = int(zoneandpod)
-			if zoneandpod >= len(zonespods) or zoneandpod < 0: raise ValueError, "%s out of bounds"%zoneandpod
-		except ValueError,e:
+			if zoneandpod >= len(zonespods) or zoneandpod < 0: raise ValueError("%s out of bounds"%zoneandpod)
+		except ValueError as e:
 			stderr(str(e))
 			continue # re-ask
 		
@@ -941,13 +940,13 @@
 		else:
 			alreadysetup = augtool.match("/files/etc/network/interfaces/iface",devName).stdout.strip()
 		return alreadysetup
-	except OSError,e:
+	except OSError as e:
 		return False		
 	
 def setup_agent_config(configfile, host, zone, pod, cluster, guid, pubNic, prvNic):
 	stderr("Examining Agent configuration")
 	fn = configfile
-	text = file(fn).read(-1)
+	text = open(fn).read(-1)
 	lines = [ s.strip() for s in text.splitlines() ]
 	confopts = dict([ m.split("=",1) for m in lines if "=" in m and not m.startswith("#") ])
 	confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ])
@@ -963,8 +962,8 @@
 		try: host = confopts["host"]
 		except KeyError: host = "localhost"
 		stderr("Please enter the host name of the management server that this agent will connect to: (just hit ENTER to go with %s)",host)
-		print "> ",
-		newhost = raw_input().strip()
+		print("> ", end=' ')
+		newhost = input().strip()
 		if newhost: host = newhost
 
 	confopts["host"] = host
@@ -982,54 +981,7 @@
 	stderr("Querying %s for zones and pods",host)
 	
 	try:
-	    if zone == None or pod == None:
-			x = list_zonespods(confopts['host'])
-			zoneandpod = prompt_for_hostpods(x)
-			if zoneandpod:
-				confopts["zone"],confopts["pod"] = zoneandpod
-				stderr("You selected zone %s pod %s",confopts["zone"],confopts["pod"])
-			else:
-				stderr("Skipped -- using the previous zone %s pod %s",confopts["zone"],confopts["pod"])
-	    else:
-			confopts["zone"] = zone
-			confopts["pod"] = pod
-			confopts["cluster"] = cluster
-	except (urllib2.URLError,urllib2.HTTPError),e:
-		stderr("Query failed: %s.  Defaulting to zone %s pod %s",str(e),confopts["zone"],confopts["pod"])
-
-	for opt,val in confopts.items():
-		line = "=".join([opt,val])
-		if opt not in confposes: lines.append(line)
-		else: lines[confposes[opt]] = line
-	
-	text = "\n".join(lines)
-	file(fn,"w").write(text)
-
-def setup_consoleproxy_config(configfile, host, zone, pod):
-	stderr("Examining Console Proxy configuration")
-	fn = configfile
-	text = file(fn).read(-1)
-	lines = [ s.strip() for s in text.splitlines() ]
-	confopts = dict([ m.split("=",1) for m in lines if "=" in m and not m.startswith("#") ])
-	confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ])
-
-	if not "guid" in confopts:
-		stderr("Generating GUID for this Console Proxy")
-		confopts['guid'] = uuidgen().stdout.strip()
-
-        if host == None:
-		try: host = confopts["host"]
-		except KeyError: host = "localhost"
-		stderr("Please enter the host name of the management server that this console-proxy will connect to: (just hit ENTER to go with %s)",host)
-		print "> ",
-		newhost = raw_input().strip()
-		if newhost: host = newhost
-	confopts["host"] = host
-
-	stderr("Querying %s for zones and pods",host)
-	
-	try:
-                if zone == None or pod == None:
+		if zone == None or pod == None:
 			x = list_zonespods(confopts['host'])
 			zoneandpod = prompt_for_hostpods(x)
 			if zoneandpod:
@@ -1040,16 +992,63 @@
 		else:
 			confopts["zone"] = zone
 			confopts["pod"] = pod
-	except (urllib2.URLError,urllib2.HTTPError),e:
+			confopts["cluster"] = cluster
+	except (urllib.error.URLError,urllib.error.HTTPError) as e:
 		stderr("Query failed: %s.  Defaulting to zone %s pod %s",str(e),confopts["zone"],confopts["pod"])
 
-	for opt,val in confopts.items():
+	for opt,val in list(confopts.items()):
 		line = "=".join([opt,val])
 		if opt not in confposes: lines.append(line)
 		else: lines[confposes[opt]] = line
 	
 	text = "\n".join(lines)
-	file(fn,"w").write(text)
+	open(fn,"w").write(text)
+
+def setup_consoleproxy_config(configfile, host, zone, pod):
+	stderr("Examining Console Proxy configuration")
+	fn = configfile
+	text = open(fn).read(-1)
+	lines = [ s.strip() for s in text.splitlines() ]
+	confopts = dict([ m.split("=",1) for m in lines if "=" in m and not m.startswith("#") ])
+	confposes = dict([ (m.split("=",1)[0],n) for n,m in enumerate(lines) if "=" in m and not m.startswith("#") ])
+
+	if not "guid" in confopts:
+		stderr("Generating GUID for this Console Proxy")
+		confopts['guid'] = uuidgen().stdout.strip()
+
+	if host == None:
+		try: host = confopts["host"]
+		except KeyError: host = "localhost"
+		stderr("Please enter the host name of the management server that this console-proxy will connect to: (just hit ENTER to go with %s)",host)
+		print("> ", end=' ')
+		newhost = input().strip()
+		if newhost: host = newhost
+	confopts["host"] = host
+
+	stderr("Querying %s for zones and pods",host)
+	
+	try:
+		if zone == None or pod == None:
+			x = list_zonespods(confopts['host'])
+			zoneandpod = prompt_for_hostpods(x)
+			if zoneandpod:
+				confopts["zone"],confopts["pod"] = zoneandpod
+				stderr("You selected zone %s pod %s",confopts["zone"],confopts["pod"])
+			else:
+				stderr("Skipped -- using the previous zone %s pod %s",confopts["zone"],confopts["pod"])
+		else:
+			confopts["zone"] = zone
+			confopts["pod"] = pod
+	except (urllib.error.URLError,urllib.error.HTTPError) as e:
+		stderr("Query failed: %s.  Defaulting to zone %s pod %s",str(e),confopts["zone"],confopts["pod"])
+
+	for opt,val in list(confopts.items()):
+		line = "=".join([opt,val])
+		if opt not in confposes: lines.append(line)
+		else: lines[confposes[opt]] = line
+	
+	text = "\n".join(lines)
+	open(fn,"w").write(text)
 
 # =========================== DATABASE MIGRATION SUPPORT CODE ===================
 
@@ -1086,13 +1085,13 @@
 			if not new:
 				try: idx= [ i for i,s in enumerate(self.evolvers)
 					if s.from_level == INITIAL_LEVEL ][0] # initial evolver
-				except IndexError,e:
-					raise IndexError, "no initial evolver (from_level is None) could be found"
+				except IndexError as e:
+					raise IndexError("no initial evolver (from_level is None) could be found")
 			else:
 				try: idx= [ i for i,s in enumerate(self.evolvers)
 					if new[-1].to_level == s.from_level ][0]
-				except IndexError,e:
-					raise IndexError, "no evolver could be found to evolve from level %s"%new[-1].to_level
+				except IndexError as e:
+					raise IndexError("no evolver could be found to evolve from level %s"%new[-1].to_level)
 			new.append(self.evolvers.pop(idx))
 		self.evolvers = new
 	
@@ -1101,11 +1100,11 @@
 		
 	def get_evolver_by_starting_level(self,level):
 		try: return [ s for s in self.evolvers if s.from_level == level][0]
-		except IndexError: raise NoMigrator, "No evolver knows how to evolve the database from schema level %r"%level
+		except IndexError: raise NoMigrator("No evolver knows how to evolve the database from schema level %r"%level)
 	
 	def get_evolver_by_ending_level(self,level):
 		try: return [ s for s in self.evolvers if s.to_level == level][0]
-		except IndexError: raise NoMigrator, "No evolver knows how to evolve the database to schema level %r"%level
+		except IndexError: raise NoMigrator("No evolver knows how to evolve the database to schema level %r"%level)
 	
 	def run(self, context, dryrun = False, starting_level = None, ending_level = None):
 		"""Runs each one of the steps in sequence, passing the migration context to each. At the end of the process, context.commit() is called to save the changes, or context.rollback() is called if dryrun = True.
@@ -1124,8 +1123,8 @@
 		evolution_path = evolution_path[idx:]
 		try: idx = evolution_path.index(self.get_evolver_by_ending_level(ending_level))
 		except ValueError:
-			raise NoEvolutionPath, "No evolution path from schema level %r to schema level %r" % \
-				(starting_level,ending_level)
+			raise NoEvolutionPath("No evolution path from schema level %r to schema level %r" % \
+				(starting_level,ending_level))
 		evolution_path = evolution_path[:idx+1]
 		
 		logging.info("Starting migration on %s"%context)
@@ -1202,4 +1201,3 @@
 	def get_schema_level(self):raise NotImplementedError
 	def set_schema_level(self,l):raise NotImplementedError
 
-
diff --git a/python/lib/cloudutils/configFileOps.py b/python/lib/cloudutils/configFileOps.py
index e931824..ecc437d 100644
--- a/python/lib/cloudutils/configFileOps.py
+++ b/python/lib/cloudutils/configFileOps.py
@@ -17,7 +17,7 @@
 import re
 import tempfile
 import shutil
-from utilities import bash
+from .utilities import bash
 class configFileOps:
     class entry:
         def __init__(self, name, value, op, separator):
@@ -49,7 +49,7 @@
     
     def getEntry(self, name, separator="="):
         try:
-            ctx = file(self.fileName).read(-1)
+            ctx = open(self.fileName).read(-1)
             match = re.search("^" + name + ".*", ctx, re.MULTILINE)
             if match is None:
                 return ""
@@ -103,10 +103,10 @@
 
         fp.close()
         
-        file(self.fileName, "w").writelines(newLines)
+        open(self.fileName, "w").writelines(newLines)
 
     def replace_line(self, startswith,stanza,always_add=False):
-        lines = [ s.strip() for s in file(self.fileName).readlines() ]
+        lines = [ s.strip() for s in open(self.fileName).readlines() ]
         newlines = []
         replaced = False
         for line in lines:
@@ -120,36 +120,36 @@
             newlines.append(stanza)
             self.backups.append([None, stanza])
         newlines = [ s + '\n' for s in newlines ]
-        file(self.fileName,"w").writelines(newlines)
+        open(self.fileName,"w").writelines(newlines)
 
     def replace_or_add_line(self, startswith,stanza):
         return self.replace_line(startswith,stanza,always_add=True)
 
     def add_lines(self, lines, addToBackup=True):
-        fp = file(self.fileName).read(-1) 
+        fp = open(self.fileName).read(-1) 
         sh = re.escape(lines)
         match = re.search(sh, fp, re.MULTILINE) 
         if match is not None:
             return
     
         fp += lines
-        file(self.fileName, "w").write(fp)
+        open(self.fileName, "w").write(fp)
         self.backups.append([None, lines])
         
     def replace_lines(self, src, dst, addToBackup=True):
-        fp = file(self.fileName).read(-1) 
+        fp = open(self.fileName).read(-1) 
         sh = re.escape(src)
         if dst is None:
             dst = ""
         repl,nums = re.subn(sh, dst, fp)
         if nums <=0:
             return
-        file(self.fileName, "w").write(repl)
+        open(self.fileName, "w").write(repl)
         if addToBackup:
             self.backups.append([src, dst])
 
     def append_lines(self, match_lines, append_lines):
-        fp = file(self.fileName).read(-1)
+        fp = open(self.fileName).read(-1)
         sh = re.escape(match_lines)
         match = re.search(sh, fp, re.MULTILINE)
         if match is None:
@@ -160,14 +160,14 @@
             return
 
         newlines = []
-        for line in file(self.fileName).readlines():
+        for line in open(self.fileName).readlines():
             if re.search(match_lines, line) is not None:
                 newlines.append(line + append_lines)
                 self.backups.append([line, line + append_lines])
             else:
                 newlines.append(line)
 
-        file(self.fileName, "w").writelines(newlines)
+        open(self.fileName, "w").writelines(newlines)
             
     def backup(self):
         for oldLine, newLine in self.backups:
diff --git a/python/lib/cloudutils/db.py b/python/lib/cloudutils/db.py
index f2ce6f9..9045822 100644
--- a/python/lib/cloudutils/db.py
+++ b/python/lib/cloudutils/db.py
@@ -15,8 +15,8 @@
 # specific language governing permissions and limitations
 # under the License.
 import os
-from utilities import bash
-from cloudException import CloudRuntimeException
+from .utilities import bash
+from .cloudException import CloudRuntimeException
 import mysql.connector
 
 class Database(object):
diff --git a/python/lib/cloudutils/networkConfig.py b/python/lib/cloudutils/networkConfig.py
index 2798843..5a357c0 100644
--- a/python/lib/cloudutils/networkConfig.py
+++ b/python/lib/cloudutils/networkConfig.py
@@ -14,8 +14,8 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from utilities import bash
-from cloudException import CloudRuntimeException, CloudInternalException
+from .utilities import bash
+from .cloudException import CloudRuntimeException, CloudInternalException
 import logging
 import os
 import re
@@ -37,7 +37,7 @@
     @staticmethod
     def listNetworks():
         devs = os.listdir("/sys/class/net/") 
-        devs = filter(networkConfig.isBridge, devs) 
+        devs = list(filter(networkConfig.isBridge, devs)) 
         return devs
     @staticmethod
     def getDefaultNetwork():
@@ -66,10 +66,10 @@
 
         cmds = ""
         if not networkConfig.isBridge(brName):
-            cmds = "brctl addbr %s ;"%brName
+            cmds = "ip link add name %s type bridge ;"%brName
     
         cmds += "ifconfig %s up;"%brName
-        cmds += "brctl addif %s %s"%(brName, dev)
+        cmds += "ip link set dev %s master %s"%(dev, brName)
         return bash(cmds).isSuccess()
 
     @staticmethod
@@ -87,7 +87,7 @@
         if os.path.exists("/proc/sys/net/bridge"):
             return True
 
-        return bash("modprobe -b bridge").isSucess()
+        return bash("modprobe -b bridge").isSuccess()
 
     @staticmethod
     def isNetworkDev(devName):
@@ -125,7 +125,7 @@
             return None
 
         for dev in os.listdir("/sys/class/net/%s/brif"%br):
-            br_port = int(file("/sys/class/net/%s/brif/%s/port_no"%(br,dev)).readline().strip("\n"), 16)
+            br_port = int(open("/sys/class/net/%s/brif/%s/port_no"%(br,dev)).readline().strip("\n"), 16)
             if br_port == brPort:
                 return dev
 
@@ -164,4 +164,3 @@
 
         return networkConfig.devInfo(macAddr, ipAddr, netmask, None, type, dev)
 
-
diff --git a/python/lib/cloudutils/serviceConfig.py b/python/lib/cloudutils/serviceConfig.py
index cc7a22d..4cbab59 100755
--- a/python/lib/cloudutils/serviceConfig.py
+++ b/python/lib/cloudutils/serviceConfig.py
@@ -5,21 +5,21 @@
 # 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.
-from utilities import writeProgressBar, bash
-from cloudException import CloudRuntimeException, CloudInternalException, formatExceptionInfo
+from .utilities import writeProgressBar, bash
+from .cloudException import CloudRuntimeException, CloudInternalException, formatExceptionInfo
 import logging
-from networkConfig import networkConfig
+from .networkConfig import networkConfig
 import re
-from configFileOps import configFileOps
+from .configFileOps import configFileOps
 import os
 import shutil
 
@@ -27,25 +27,31 @@
 Unknown = 0
 CentOS6 = 1
 CentOS7 = 2
-Ubuntu = 3
-RHEL6 = 4
-RHEL7 = 5
+CentOS8 = 3
+Ubuntu = 4
+RHEL6 = 5
+RHEL7 = 6
+RHEL8 = 7
 distro = None
 
 #=================== DISTRIBUTION DETECTION =================
 if os.path.exists("/etc/centos-release"):
-    version = file("/etc/centos-release").readline()
+    version = open("/etc/centos-release").readline()
     if version.find("CentOS release 6") != -1:
       distro = CentOS6
     elif version.find("CentOS Linux release 7") != -1:
       distro = CentOS7
+    elif version.find("CentOS Linux release 8") != -1:
+      distro = CentOS8
 elif os.path.exists("/etc/redhat-release"):
-    version = file("/etc/redhat-release").readline()
+    version = open("/etc/redhat-release").readline()
     if version.find("Red Hat Enterprise Linux Server release 6") != -1:
       distro = RHEL6
     elif version.find("Red Hat Enterprise Linux Server 7") != -1:
       distro = RHEL7
-elif os.path.exists("/etc/lsb-release") and "Ubuntu" in file("/etc/lsb-release").read(-1): distro = Ubuntu
+    elif version.find("Red Hat Enterprise Linux Server 8") != -1:
+      distro = RHEL8
+elif os.path.exists("/etc/lsb-release") and "Ubuntu" in open("/etc/lsb-release").read(-1): distro = Ubuntu
 else: distro = Unknown
 #=================== DISTRIBUTION DETECTION =================
 
@@ -68,12 +74,12 @@
             self.status = result
             writeProgressBar(None, result)
             return result
-        except CloudRuntimeException, e:
+        except CloudRuntimeException as e:
             self.status = result
             writeProgressBar(None, result)
             logging.debug(e.getDetails())
             raise e
-        except CloudInternalException, e:
+        except CloudInternalException as e:
             self.status = result
             writeProgressBar(None, result)
             raise e
@@ -95,7 +101,7 @@
                 cfo.backup()
 
             result = self.restore()
-        except (CloudRuntimeException, CloudInternalException), e:
+        except (CloudRuntimeException, CloudInternalException) as e:
             logging.debug(e)
 
         writeProgressBar(None, result)
@@ -178,7 +184,7 @@
 
     def addBridge(self, br, dev):
         bash("ifdown %s"%dev.name)
-        for line in file(self.netCfgFile).readlines():
+        for line in open(self.netCfgFile).readlines():
             match = re.match("^ *iface %s.*"%dev.name, line)
             if match is not None:
                 dev.method = self.getNetworkMethod(match.group(0))
@@ -213,7 +219,7 @@
         logging.debug("Haven't implement yet")
 
     def writeToCfgFile(self, br, dev):
-        cfg = file(self.netCfgFile).read()
+        cfg = open(self.netCfgFile).read()
         ifaceDev = re.search("^ *iface %s.*"%dev.name, cfg, re.MULTILINE)
         ifaceBr = re.search("^ *iface %s.*"%br, cfg, re.MULTILINE)
         if ifaceDev is not None and ifaceBr is not None:
@@ -344,7 +350,8 @@
             cfo.save()
 
             if not bash("service network restart").isSuccess():
-                raise CloudInternalException("Can't restart network")
+                if not bash("systemctl restart NetworkManager.service").isSuccess():
+                    raise CloudInternalException("Can't restart network")
 
             self.syscfg.env.nics.append(self.brName)
             self.syscfg.env.nics.append(self.brName)
@@ -566,6 +573,12 @@
         elif os.path.exists("/etc/default/libvirtd"):
             cfo = configFileOps("/etc/default/libvirtd", self)
             cfo.replace_or_add_line("libvirtd_opts=","libvirtd_opts='-l'")
+            if os.path.exists("/lib/systemd/system/libvirtd.socket"):
+                bash("/bin/systemctl mask libvirtd.socket");
+                bash("/bin/systemctl mask libvirtd-ro.socket");
+                bash("/bin/systemctl mask libvirtd-admin.socket");
+                bash("/bin/systemctl mask libvirtd-tls.socket");
+                bash("/bin/systemctl mask libvirtd-tcp.socket");
 
     def config(self):
         try:
@@ -579,8 +592,11 @@
             cfo.addEntry("group", "\"root\"")
             cfo.save()
 
-            self.syscfg.svo.stopService("libvirt-bin")
-            self.syscfg.svo.enableService("libvirt-bin")
+            if os.path.exists("/lib/systemd/system/libvirtd.service"):
+                bash("systemctl restart libvirtd")
+            else:
+                self.syscfg.svo.stopService("libvirt-bin")
+                self.syscfg.svo.enableService("libvirt-bin")
             if os.path.exists("/lib/systemd/system/libvirt-bin.socket"):
                 bash("systemctl stop libvirt-bin.socket")
             return True
@@ -759,32 +775,3 @@
 
     def restore(self):
         return True
-
-class firewallConfigServer(firewallConfigBase):
-    def __init__(self, syscfg):
-        super(firewallConfigServer, self).__init__(syscfg)
-        #9090 is used for cluster management server
-        if self.syscfg.env.svrMode == "myCloud":
-            self.ports = "443 8080 8250 8443 9090".split()
-        else:
-            self.ports = "8080 8250 9090".split()
-
-class ubuntuFirewallConfigServer(firewallConfigServer):
-    def allowPort(self, port):
-        status = False
-        try:
-            status = bash("iptables-save|grep INPUT|grep -w %s"%port).isSuccess()
-        except:
-            pass
-
-        if not status:
-            bash("ufw allow %s/tcp"%port)
-
-    def config(self):
-        try:
-            for port in self.ports:
-                self.allowPort(port)
-
-            return True
-        except:
-            raise
diff --git a/python/lib/cloudutils/serviceConfigServer.py b/python/lib/cloudutils/serviceConfigServer.py
index 1748572..b0bfc25 100644
--- a/python/lib/cloudutils/serviceConfigServer.py
+++ b/python/lib/cloudutils/serviceConfigServer.py
@@ -14,11 +14,11 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from db import Database
-from configFileOps import configFileOps
-from serviceConfig import serviceCfgBase
-from cloudException import CloudRuntimeException, CloudInternalException
-from utilities import bash
+from .db import Database
+from .configFileOps import configFileOps
+from .serviceConfig import serviceCfgBase
+from .cloudException import CloudRuntimeException, CloudInternalException
+from .utilities import bash
 import os
 
 class cloudManagementConfig(serviceCfgBase):
@@ -49,7 +49,7 @@
 
             try:
                 db.testConnection()
-            except CloudRuntimeException, e:
+            except CloudRuntimeException as e:
                 raise e
             except:
                 raise CloudInternalException("Failed to connect to Mysql server")
@@ -93,5 +93,5 @@
             else:
                 raise CloudRuntimeException("Failed to configure %s, please see the /var/log/cloudstack/management/setupManagement.log for detail"%self.serviceName)
         else:
-            print "Configured successfully, but not starting management server."
+            print("Configured successfully, but not starting management server.")
             return True
diff --git a/python/lib/cloudutils/syscfg.py b/python/lib/cloudutils/syscfg.py
index 467fcf1..fdc077d 100755
--- a/python/lib/cloudutils/syscfg.py
+++ b/python/lib/cloudutils/syscfg.py
@@ -5,17 +5,17 @@
 # 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.
-from utilities import Distribution, serviceOpsRedhat,serviceOpsUbuntu,serviceOpsRedhat7
-from serviceConfig import *
+from .utilities import Distribution, serviceOpsRedhat,serviceOpsUbuntu,serviceOpsRedhat7Later
+from .serviceConfig import *
 class sysConfigFactory:
     @staticmethod
     def getSysConfigFactory(glbEnv):
@@ -29,7 +29,7 @@
             return sysConfigDbFactory.getDb(glbEnv)
         else:
             raise CloudInternalException("Need to specify which mode are u running: Agent/Server/Db")
-        
+
 class sysConfigAgentFactory:
     @staticmethod
     def getAgent(glbEnv):
@@ -43,8 +43,10 @@
             return sysConfigRedhat5(glbEnv)
         elif distribution == "RHEL7":
             return sysConfigRedhat7(glbEnv)
+        elif distribution == "RHEL8":
+            return sysConfigRedhat8(glbEnv)
         else:
-            print "Can't find the distribution version"
+            print("Can't find the distribution version")
             return sysConfig()
 
 class sysConfigServerFactory:
@@ -57,9 +59,9 @@
         elif distribution != "Unknown":
             return sysConfigServerRedhat(glbEnv)
         else:
-            print "Can't find the distribution version"
+            print("Can't find the distribution version")
             return sysConfig()
-    
+
 class sysConfigDbFactory:
     @staticmethod
     def getDb(glbEnv):
@@ -69,10 +71,10 @@
     def __init__(self, env):
         self.env = env
         self.services = []
-    
+
     def registerService(self, service):
         self.services.append(service(self))
-        
+
     def config(self):
         if not self.check():
             return False
@@ -80,14 +82,14 @@
         for service in self.services:
             if not service.configration():
                 raise CloudInternalException("Configuration failed for service %s" % service.serviceName)
-    
+
     def restore(self):
         for service in self.services:
             service.backup()
-    
+
     def check(self):
         return True
-    
+
 class sysConfigAgent(sysConfig):
     def __init__(self, env):
         super(sysConfigAgent, self).__init__(env)
@@ -95,13 +97,13 @@
     def check(self):
         if self.env.debug:
             return True
- 
+
         if self.env.agentMode == "myCloud":
             if self.env.distribution.getVersion() != "Ubuntu":
                 raise CloudInternalException("Need to run myCloud agent on an Ubuntu machine\n")
             elif self.env.distribution.getArch() != "x86_64":
                 raise CloudInternalException("Need to run myCloud agent on an 64bit machine\n")
-            #check free disk space on the local disk 
+            #check free disk space on the local disk
             if os.path.exists("/var/lib/libvirt/images"):
                 size = -1
                 try:
@@ -125,7 +127,7 @@
 
         if os.geteuid() != 0:
             raise CloudInternalException("Need to execute with root permission\n")
-        
+
         hostname = bash("hostname -f")
         if not hostname.isSuccess():
             raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n")
@@ -133,10 +135,10 @@
         kvmEnabled = self.svo.isKVMEnabled()
         if not kvmEnabled:
             raise CloudInternalException("Checking KVM...[Failed]\nPlease enable KVM on this machine\n")
-        
+
         return True
 
-    
+
 class sysConfigAgentRedhatBase(sysConfigAgent):
     def __init__(self, env):
         self.svo = serviceOpsRedhat()
@@ -144,9 +146,14 @@
 
 class sysConfigAgentRedhat7Base(sysConfigAgent):
     def __init__(self, env):
-        self.svo = serviceOpsRedhat7()
+        self.svo = serviceOpsRedhat7Later()
         super(sysConfigAgentRedhat7Base, self).__init__(env)
 
+class sysConfigAgentRedhat8Base(sysConfigAgent):
+    def __init__(self, env):
+        self.svo = serviceOpsRedhat7Later()
+        super(sysConfigAgentRedhat8Base, self).__init__(env)
+
 class sysConfigAgentUbuntu(sysConfigAgent):
     def __init__(self, glbEnv):
         super(sysConfigAgentUbuntu, self).__init__(glbEnv)
@@ -181,7 +188,7 @@
                          libvirtConfigRedhat(self),
                          firewallConfigAgent(self),
                          cloudAgentConfig(self)]
-        
+
 #it covers RHEL7
 class sysConfigRedhat7(sysConfigAgentRedhat7Base):
     def __init__(self, glbEnv):
@@ -193,6 +200,17 @@
                          nfsConfig(self),
                          cloudAgentConfig(self)]
 
+#it covers RHEL8
+class sysConfigRedhat8(sysConfigAgentRedhat8Base):
+    def __init__(self, glbEnv):
+        super(sysConfigRedhat8, self).__init__(glbEnv)
+        self.services = [securityPolicyConfigRedhat(self),
+                         networkConfigRedhat(self),
+                         libvirtConfigRedhat(self),
+                         firewallConfigAgent(self),
+                         nfsConfig(self),
+                         cloudAgentConfig(self)]
+
 class sysConfigServer(sysConfig):
     def check(self):
         if os.geteuid() != 0:
@@ -201,15 +219,15 @@
         if not hostname.isSuccess():
             raise CloudInternalException("Checking hostname ... [Failed]\nPlease edit /etc/hosts, add a Fully Qualified Domain Name as your hostname\n")
         return True
-        
+
 class sysConfigServerRedhat(sysConfigServer):
     def __init__(self, glbEnv):
         super(sysConfigServerRedhat, self).__init__(glbEnv)
         self.svo = serviceOpsRedhat()
-        self.services = [firewallConfigServer(self)]
-    
+        self.services = []
+
 class sysConfigServerUbuntu(sysConfigServer):
     def __init__(self, glbEnv):
         super(sysConfigServerUbuntu, self).__init__(glbEnv)
         self.svo = serviceOpsUbuntu()
-        self.services = [ubuntuFirewallConfigServer(self)]
+        self.services = []
diff --git a/python/lib/cloudutils/utilities.py b/python/lib/cloudutils/utilities.py
index 2a7043d..c0a35fe 100755
--- a/python/lib/cloudutils/utilities.py
+++ b/python/lib/cloudutils/utilities.py
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-from cloudException import CloudRuntimeException, formatExceptionInfo
+from .cloudException import CloudRuntimeException, formatExceptionInfo
 import logging
 from subprocess import PIPE, Popen
 from signal import alarm, signal, SIGALRM, SIGKILL
@@ -60,13 +60,13 @@
         return self.success
     
     def getStdout(self):
-        return self.stdout.strip("\n")
+        return self.stdout.decode('utf-8').strip('\n')
     
     def getLines(self):
-        return self.stdout.split("\n")
+        return self.stdout.decode('utf-8').strip('\n')
 
     def getStderr(self):
-        return self.stderr.strip("\n")
+        return self.stderr.decode('utf-8').strip('\n')
     
     def getErrMsg(self):
         if self.isSuccess():
@@ -109,16 +109,18 @@
         if os.path.exists("/etc/fedora-release"):
             self.distro = "Fedora"
         elif os.path.exists("/etc/redhat-release"):
-            version = file("/etc/redhat-release").readline()
+            version = open("/etc/redhat-release").readline()
             if version.find("Red Hat Enterprise Linux Server release 6") != -1 or version.find("Scientific Linux release 6") != -1 or version.find("CentOS Linux release 6") != -1 or version.find("CentOS release 6.") != -1:
                 self.distro = "RHEL6"
             elif version.find("Red Hat Enterprise Linux Server release 7") != -1 or version.find("Scientific Linux release 7") != -1 or version.find("CentOS Linux release 7") != -1 or version.find("CentOS release 7.") != -1:
                 self.distro = "RHEL7"
+            elif version.find("Red Hat Enterprise Linux Server release 8") != -1 or version.find("Scientific Linux release 8") != -1 or version.find("CentOS Linux release 8") != -1 or version.find("CentOS release 8.") != -1:
+                self.distro = "RHEL8"
             elif version.find("CentOS") != -1:
                 self.distro = "CentOS"
             else:
                 self.distro = "RHEL5"
-        elif os.path.exists("/etc/legal") and "Ubuntu" in file("/etc/legal").read(-1):
+        elif os.path.exists("/etc/legal") and "Ubuntu" in open("/etc/legal").read(-1):
             self.distro = "Ubuntu"
             kernel = bash("uname -r").getStdout()
             if kernel.find("2.6.32") != -1:
@@ -211,9 +213,9 @@
         return self.startService(servicename,force=forcestart)
 
     def isKVMEnabled(self):
-        return bash("kvm-ok").isSuccess() 
+        return bash("kvm-ok").isSuccess()
 
-class serviceOpsRedhat7(serviceOps):
+class serviceOpsRedhat7Later(serviceOps):
     def isServiceRunning(self, servicename):
         try:
             o = bash("systemctl is-active " + servicename)
diff --git a/quickcloud/pom.xml b/quickcloud/pom.xml
index 1357ced..5f37d68 100644
--- a/quickcloud/pom.xml
+++ b/quickcloud/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 </project>
diff --git a/scripts/storage/qcow2/managesnapshot.sh b/scripts/storage/qcow2/managesnapshot.sh
index b8caa2e..c5831ef 100755
--- a/scripts/storage/qcow2/managesnapshot.sh
+++ b/scripts/storage/qcow2/managesnapshot.sh
@@ -187,6 +187,7 @@
   local snapshotname="$2"
   local destPath=$3
   local destName=$4
+  local forceShareFlag="-U"
 
   if [ ! -d $destPath ]
   then
@@ -211,20 +212,49 @@
       return 1
     fi
 
-    ${qemu_img} convert -f raw -O qcow2 "/dev/mapper/${vg_dm}-${snapshotname}" "${destPath}/${destName}" || \
-     ( printf "${qemu_img} failed to create backup of snapshot ${snapshotname} for disk ${disk} to ${destPath}.\n" >&2; return 2 )
-
+    qemuimg_ret=$($qemu_img $forceShareFlag -f raw -O qcow2 "/dev/mapper/${vg_dm}-${snapshotname}" "${destPath}/${destName}")
+    ret_code=$?
+    if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"snapshot: invalid option -- 'U'"* ]]
+    then
+      forceShareFlag=""
+      $qemu_img $forceShareFlag -f raw -O qcow2 "/dev/mapper/${vg_dm}-${snapshotname}" "${destPath}/${destName}"
+      ret_code=$?
+    fi
+    if [ $ret_code -gt 0 ]
+    then
+      printf "${qemu_img} failed to create backup of snapshot ${snapshotname} for disk ${disk} to ${destPath}.\n" >&2
+      return 2
+    fi
   elif [ -f ${disk} ]; then
     # Does the snapshot exist?
-    $qemu_img snapshot -l $disk|grep -w "$snapshotname" >& /dev/null
-    if [ $? -gt 0 ]
+    qemuimg_ret=$($qemu_img snapshot $forceShareFlag -l $disk 2>&1)
+    ret_code=$?
+    if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"snapshot: invalid option -- 'U'"* ]]
+    then
+      forceShareFlag=""
+      qemuimg_ret=$($qemu_img snapshot $forceShareFlag -l $disk)
+      ret_code=$?
+    fi
+    if [ $ret_code -gt 0 ] || [[ ! $qemuimg_ret == *"$snapshotname"* ]]
     then
       printf "there is no $snapshotname on disk $disk\n" >&2
       return 1
     fi
 
-    $qemu_img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$destName >& /dev/null
-    if [ $? -gt 0 ]
+    qemuimg_ret=$($qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l snapshot.name=$snapshotname $disk $destPath/$destName 2>&1 > /dev/null)
+    ret_code=$?
+    if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"convert: invalid option -- 'U'"* ]]
+    then
+      forceShareFlag=""
+      qemuimg_ret=$($qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -l snapshot.name=$snapshotname $disk $destPath/$destName 2>&1 > /dev/null)
+      ret_code=$?
+    fi
+    if [ $ret_code -gt 0 ] && [[ $qemuimg_ret == *"convert: invalid option -- 'l'"* ]]
+    then
+      $qemu_img convert $forceShareFlag -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$destName >& /dev/null
+      ret_code=$?
+    fi
+    if [ $ret_code -gt 0 ]
     then
       printf "Failed to backup $snapshotname for disk $disk to $destPath\n" >&2
       return 2
diff --git a/scripts/util/create-kubernetes-binaries-iso.sh b/scripts/util/create-kubernetes-binaries-iso.sh
index e8ad0e5..67062be 100755
--- a/scripts/util/create-kubernetes-binaries-iso.sh
+++ b/scripts/util/create-kubernetes-binaries-iso.sh
@@ -37,7 +37,10 @@
 echo "Downloading CNI ${CNI_VERSION}..."
 cni_dir="${working_dir}/cni/"
 mkdir -p "${cni_dir}"
-curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" -o "${cni_dir}/cni-plugins-amd64.tgz"
+cni_status_code=$(curl -L  --write-out "%{http_code}\n" "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz" -o "${cni_dir}/cni-plugins-amd64.tgz")
+if [[ ${cni_status_code} -eq 404 ]] ; then
+  curl -L  --write-out "%{http_code}\n" "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" -o "${cni_dir}/cni-plugins-amd64.tgz"
+fi
 
 CRICTL_VERSION="v${4}"
 echo "Downloading CRI tools ${CRICTL_VERSION}..."
diff --git a/scripts/util/migrate-dynamicroles.py b/scripts/util/migrate-dynamicroles.py
index 35dfe66..36839ee 100755
--- a/scripts/util/migrate-dynamicroles.py
+++ b/scripts/util/migrate-dynamicroles.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -110,7 +110,7 @@
         sys.exit(1)
 
     while True:
-        choice = raw_input("Running this migration tool will remove any " +
+        choice = input("Running this migration tool will remove any " +
                            "default-role permissions from cloud.role_permissions. " +
                            "Do you want to continue? [y/N]").lower()
         if choice == 'y':
diff --git a/scripts/util/qemu-ifup b/scripts/util/qemu-ifup
index 4df2621..8cf28b8 100755
--- a/scripts/util/qemu-ifup
+++ b/scripts/util/qemu-ifup
@@ -17,5 +17,5 @@
 # under the License.
 
  switch=$(/sbin/ip route list | awk '/^default / { print $NF }') 
-/sbin/ifconfig $1 0.0.0.0 up 
-/usr/sbin/brctl addif ${switch} $1 
+/sbin/ifconfig $1 0.0.0.0 up
+/sbin/ip link set dev $1 master ${switch}
diff --git a/scripts/vm/hypervisor/vmware/discover_networks.py b/scripts/vm/hypervisor/vmware/discover_networks.py
index d19e784..0a401e1 100755
--- a/scripts/vm/hypervisor/vmware/discover_networks.py
+++ b/scripts/vm/hypervisor/vmware/discover_networks.py
@@ -16,7 +16,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-from __future__ import print_function
 from pyVim.connect import SmartConnect, SmartConnectNoSSL, Disconnect
 from pyVmomi import vim
 import atexit
diff --git a/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh b/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
index 5d70cd3..e42a33d 100755
--- a/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
+++ b/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
@@ -6,9 +6,9 @@
 # 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
@@ -17,7 +17,7 @@
 # under the License.
 
 #set -x
- 
+
 usage() {
   echo "Usage: $(basename $0) [uuid of this host] [uuid of the sr to place the heartbeat]"
 
@@ -40,7 +40,7 @@
   exit 0
 fi
 
-if [ `xe sr-list uuid=$2 | wc -l`  -eq 0 ]; then 
+if [ `xe sr-list uuid=$2 | wc -l`  -eq 0 ]; then
   echo "#4# Unable to find SR with uuid: $2"
   exit 0
 fi
@@ -60,7 +60,7 @@
     date=`date +%s`
     echo "$date" > $filename
   fi
-else 
+else
   dir=/dev/VG_XenStorage-$2
   link=$dir/hb-$1
   lv=`lvscan | grep $link`
@@ -72,7 +72,7 @@
       fi
       rm $link -f
     fi
-    if [ -f /etc/redhat-release ] && grep -q "XenServer release 7." /etc/redhat-release; then
+    if [ -f /etc/redhat-release ] && grep -q -E "(XenServer|XCP-ng) release (7|8)." /etc/redhat-release; then
         lvcreate VG_XenStorage-$2 -n hb-$1 --size 4M --config global{metadata_read_only=0}
     else
         lvcreate VG_XenStorage-$2 -n hb-$1 --size 4M
diff --git a/scripts/vm/network/ovs-pvlan-kvm-dhcp-host.sh b/scripts/vm/network/ovs-pvlan-kvm-dhcp-host.sh
new file mode 100755
index 0000000..46eceb9
--- /dev/null
+++ b/scripts/vm/network/ovs-pvlan-kvm-dhcp-host.sh
@@ -0,0 +1,137 @@
+#!/bin/bash
+# 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.
+
+#!/bin/bash
+
+# We're trying to do the impossible here by allowing pvlan on kvm / xen. As only God can do the impossible, and we've got too much ego to
+# admit that we can't, we're just hacking our way around it.
+# We're pretty much crafting two vlan headers, one with the primary vlan and the other with the secondary and with a few fancy rules
+# it managed to work. But take note that the'res no checking over here for secondary vlan overlap. That has to be handled while
+# creating the pvlan!!
+
+exec 2>&1
+
+usage() {
+  printf "Usage: %s: (-A|-D) (-P/I/C) -b <bridge/switch> -p <primary vlan> -s <secondary vlan> -m <VM MAC> -d <DHCP IP> -h \n" $(basename $0) >&2
+  exit 2
+}
+
+br=
+pri_vlan=
+sec_vlan=
+vm_mac=
+dhcp_ip=
+op=
+type=
+
+while getopts 'ADPICb:p:s:m:d:h' OPTION
+do
+  case $OPTION in
+  A)  op="add"
+      ;;
+  D)  op="del"
+      ;;
+  P)  type="P"
+      ;;
+  I)  type="I"
+      ;;
+  C)  type="C"
+      ;;
+  b)  br="$OPTARG"
+      ;;
+  p)  pri_vlan="$OPTARG"
+      ;;
+  s)  sec_vlan="$OPTARG"
+      ;;
+  m)  vm_mac="$OPTARG"
+      ;;
+  d)  dhcp_ip="$OPTARG"
+      ;;
+  h)  usage
+      exit 1
+      ;;
+  esac
+done
+
+if [ -z "$op" ]
+then
+    echo Missing operation pararmeter!
+    exit 1
+fi
+
+if [ -z "$type" ]
+then
+    echo Missing pvlan type pararmeter!
+    exit 1
+fi
+
+if [ -z "$br" ]
+then
+    echo Missing parameter bridge!
+    exit 1
+fi
+
+if [ -z "$vm_mac" ]
+then
+    echo Missing parameter VM MAC!
+    exit 1
+fi
+
+if [ -z "$pri_vlan" ]
+then
+    echo Missing parameter primary vlan!
+    exit 1
+fi
+
+if [ -z "$sec_vlan" ]
+then
+    echo Missing parameter secondary vlan!
+    exit 1
+fi
+
+if [ -z "$dhcp_ip" ]
+then
+    echo Missing parameter DHCP IP!
+    exit 1
+fi
+
+find_port() {
+  mac=`echo "$1" | sed -e 's/:/\\\:/g'`
+  port=`ovs-vsctl --column ofport find interface external_ids:attached-mac="$mac" | tr -d ' ' | cut -d ':' -f 2`
+  echo $port
+}
+
+ovs-vsctl set bridge $br protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13
+ovs-vsctl set Open_vSwitch . other_config:vlan-limit=2
+
+if [ "$op" == "add" ]
+then
+    dhcp_port=$(find_port $vm_mac)
+
+    ovs-ofctl add-flow $br table=0,priority=200,arp,dl_vlan=$pri_vlan,nw_dst=$dhcp_ip,actions=strip_vlan,resubmit\(,1\)
+    ovs-ofctl add-flow $br table=1,priority=200,arp,dl_vlan=$sec_vlan,nw_dst=$dhcp_ip,actions=strip_vlan,output:$dhcp_port
+
+    ovs-ofctl add-flow $br table=0,priority=100,udp,dl_vlan=$pri_vlan,nw_dst=255.255.255.255,tp_dst=67,actions=strip_vlan,resubmit\(,1\)
+    ovs-ofctl add-flow $br table=1,priority=100,udp,dl_vlan=$sec_vlan,nw_dst=255.255.255.255,tp_dst=67,actions=strip_vlan,output:$dhcp_port
+else
+    ovs-ofctl del-flows --strict $br table=0,priority=200,arp,dl_vlan=$pri_vlan,nw_dst=$dhcp_ip
+    ovs-ofctl del-flows --strict $br table=1,priority=200,arp,dl_vlan=$sec_vlan,nw_dst=$dhcp_ip
+
+    ovs-ofctl del-flows --strict $br table=0,priority=100,udp,dl_vlan=$pri_vlan,nw_dst=255.255.255.255,tp_dst=67
+    ovs-ofctl del-flows --strict $br table=1,priority=100,udp,dl_vlan=$sec_vlan,nw_dst=255.255.255.255,tp_dst=67
+fi
diff --git a/scripts/vm/network/ovs-pvlan-kvm-vm.sh b/scripts/vm/network/ovs-pvlan-kvm-vm.sh
new file mode 100644
index 0000000..7b4e274
--- /dev/null
+++ b/scripts/vm/network/ovs-pvlan-kvm-vm.sh
@@ -0,0 +1,290 @@
+#!/bin/bash
+# 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.
+
+#!/bin/bash
+
+# We're trying to do the impossible here by allowing pvlan on kvm / xen. As only God can do the impossible, and we've got too much ego to
+# admit that we can't, we're just hacking our way around it.
+# We're pretty much crafting two vlan headers, one with the primary vlan and the other with the secondary and with a few fancy rules
+# it managed to work. But take note that the'res no checking over here for secondary vlan overlap. That has to be handled while
+# creating the pvlan!!
+
+exec 2>&1
+
+usage() {
+  printf "Usage: %s: (-A|-D) (-P/I/C) -b <bridge/switch> -p <primary vlan> -s <secondary vlan> -m <VM MAC> -h \n" $(basename $0) >&2
+  exit 2
+}
+
+br=
+pri_vlan=
+sec_vlan=
+vm_mac=
+op=
+type=
+
+while getopts 'ADPICb:p:s:m:h' OPTION
+do
+  case $OPTION in
+  A)  op="add"
+      ;;
+  D)  op="del"
+      ;;
+  P)  type="P"
+      ;;
+  I)  type="I"
+      ;;
+  C)  type="C"
+      ;;
+  b)  br="$OPTARG"
+      ;;
+  p)  pri_vlan="$OPTARG"
+      ;;
+  s)  sec_vlan="$OPTARG"
+      ;;
+  m)  vm_mac="$OPTARG"
+      ;;
+  h)  usage
+      exit 1
+      ;;
+  esac
+done
+
+if [ -z "$op" ]
+then
+    echo Missing operation pararmeter!
+    exit 1
+fi
+
+if [ -z "$type" ]
+then
+    echo Missing pvlan type pararmeter!
+    exit 1
+fi
+
+if [ -z "$br" ]
+then
+    echo Missing parameter bridge!
+    exit 1
+fi
+
+if [ -z "$vm_mac" ]
+then
+    echo Missing parameter VM MAC!
+    exit 1
+fi
+
+if [ -z "$pri_vlan" ]
+then
+    echo Missing parameter primary vlan!
+    exit 1
+fi
+
+if [ -z "$sec_vlan" ]
+then
+    echo Missing parameter secondary vlan!
+    exit 1
+fi
+
+find_port() {
+  mac=`echo "$1" | sed -e 's/:/\\\:/g'`
+  port=`ovs-vsctl --column ofport find interface external_ids:attached-mac="$mac" | tr -d ' ' | cut -d ':' -f 2`
+  echo $port
+}
+
+find_port_group() {
+  ovs-ofctl -O OpenFlow13 dump-groups $br | grep group_id=$1, | sed -e 's/.*type=all,//g' -e 's/bucket=actions=//g' -e 's/resubmit(,1)//g' -e 's/strip_vlan,//g' -e 's/pop_vlan,//g' -e 's/output://g' -e 's/^,//g' -e 's/,$//g' -e 's/,,/,/g' -e 's/ //g'
+}
+
+# try to find the physical link to outside, only supports eth and em prefix now
+trunk_port=`ovs-ofctl show $br | egrep "\((eth|em)[0-9]" | cut -d '(' -f 1|tr -d ' '`
+vm_port=$(find_port $vm_mac)
+
+# craft the vlan headers. Adding 4096 as in hex, it must be of the form 0x1XXX
+pri_vlan_header=$((4096 + $pri_vlan))
+sec_vlan_header=$((4096 + $sec_vlan))
+
+# Get the groups for broadcast. Ensure we end the group id with ',' so that we wont accidentally match groupid 111 with 1110.
+# We're using the header value for the pri vlan port group, as anything from a promiscuous device has to go to every device in the vlan.
+# Since we're creating a separate group for just the promiscuous devices, adding 4096 so that it'll be unique. Hence we're restricted to 4096 vlans!
+# Not a big deal because if you have vxlan, why do you even need pvlan!!
+pri_vlan_ports=$(find_port_group $pri_vlan_header)
+sec_vlan_ports=$(find_port_group $sec_vlan)
+
+add_to_ports() {
+  if [ -z "$1" ]
+  then
+    # To ensure that we don't get trailing commas
+    echo "$2"
+  else
+    # Dont add it if it already exists
+    echo "$1" | grep -w -q "$2" && echo "$1" && return
+    echo "$2,$1"
+  fi
+}
+
+del_from_ports() {
+  # Delete when only, begining, middle and end of string
+  echo "$1" | sed -e "s/^$2$//g" -e "s/^$2,//g" -e "s/,$2$//g" -e "s/,$2,/,/g"
+}
+
+mod_group() {
+  # Ensure that we don't delete the prom port group, because if we do, the rules that have it go away!
+  actions=`echo "$2" | sed -e 's/,/,bucket=actions=/g'`
+  if [ "$1" == "$pri_vlan" ]
+  then
+    actions=`echo "$2" | sed -e 's/,/,bucket=actions=strip_vlan,output:/g'`
+    if [ -z "$2" ]
+    then
+      ovs-ofctl -O OpenFlow13 mod-group --may-create $br group_id=$1,type=all,bucket=resubmit\(,1\)
+    else
+      ovs-ofctl -O OpenFlow13 mod-group --may-create $br group_id=$1,type=all,bucket=resubmit\(,1\),bucket=actions=strip_vlan,output:$actions
+    fi
+    return
+  fi
+  if [ -z "$2" ]
+  then
+    ovs-ofctl -O OpenFlow13 del-groups $br group_id=$1
+  else
+    ovs-ofctl -O OpenFlow13 mod-group --may-create $br group_id=$1,type=all,bucket=actions=$actions
+  fi
+}
+
+cleanup_flows() {
+  ovs-ofctl del-flows $br --strict table=0,priority=70,dl_vlan=$pri_vlan,dl_dst=ff:ff:ff:ff:ff:ff
+  ovs-ofctl del-flows $br --strict table=1,priority=70,dl_vlan=$pri_vlan,dl_dst=ff:ff:ff:ff:ff:ff
+  ovs-ofctl -O OpenFlow13 del-groups $br group_id=$pri_vlan
+}
+
+# Allow the neccessary protocols and QinQ
+ovs-vsctl set bridge $br protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13
+ovs-vsctl set Open_vSwitch . other_config:vlan-limit=2
+
+# So that we're friendly to non pvlan devices
+ovs-ofctl add-flow $br priority=0,actions=NORMAL
+
+if [ "$op" == "add" ]
+then
+  # From our pri vlan
+  if [ "$type" == "P" ]
+  then
+    ovs-ofctl add-flow $br table=0,priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac,actions=strip_vlan,strip_vlan,output:$vm_port
+  else
+    ovs-ofctl add-flow $br table=0,priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac,actions=strip_vlan,resubmit\(,1\)
+  fi
+
+  # Accept from promiscuous
+  ovs-ofctl add-flow $br table=1,priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac,actions=strip_vlan,output:$vm_port
+  # From others in our own community
+  if [ "$type" == "C" ]
+  then
+    ovs-ofctl add-flow $br table=1,priority=70,dl_vlan=$sec_vlan,dl_dst=$vm_mac,actions=strip_vlan,output:$vm_port
+  fi
+  # Allow only dhcp to isolated vm
+  if [ "$type" == "I" ]
+  then
+    ovs-ofctl add-flow $br table=1,priority=70,udp,dl_vlan=$sec_vlan,dl_dst=$vm_mac,tp_src=67,actions=strip_vlan,output:$vm_port
+  fi
+
+  # Security101
+  ovs-ofctl add-flow $br table=1,priority=0,actions=drop
+
+  # If the dest isn't on our switch send it out
+  ovs-ofctl add-flow $br table=0,priority=60,dl_vlan=$pri_vlan,dl_src=$vm_mac,actions=output:$trunk_port
+  # QinQ the packet. Outter header is the primary vlan and inner is the secondary
+  ovs-ofctl add-flow -O OpenFlow13 $br table=0,priority=50,vlan_tci=0x0000,dl_src=$vm_mac,actions=push_vlan:0x8100,set_field:$sec_vlan_header-\>vlan_vid,push_vlan:0x8100,set_field:$pri_vlan_header-\>vlan_vid,resubmit:$trunk_port
+
+  # BROADCASTS
+  # Create the respective groups
+  # pri_vlan_ports are the list of ports of all iso & comm dev for a give pvlan
+  if [ "$type" != "P" ]
+  then
+    pri_vlan_ports=$(add_to_ports "$pri_vlan_ports" "$vm_port")
+    mod_group $pri_vlan_header $pri_vlan_ports
+  fi
+  # sec_vlan_ports are the list of ports for a given secondary pvlan
+  sec_vlan_ports=$(add_to_ports "$sec_vlan_ports" "$vm_port")
+  mod_group $sec_vlan $sec_vlan_ports
+
+  # Ensure we have the promiscuous port group because if we don't, it'll fail to create the following rule
+  prom_ports=$(find_port_group $pri_vlan)
+  mod_group $pri_vlan $prom_ports
+
+  # From a device on this switch. Pass it to the trunk port and process it ourselves for other devices on the switch.
+  ovs-ofctl add-flow $br table=0,priority=300,dl_vlan=$pri_vlan,dl_src=$vm_mac,dl_dst=ff:ff:ff:ff:ff:ff,actions=output:$trunk_port,strip_vlan,group:$pri_vlan
+  # Got a packet from the trunk port from out pri vlan, pass it to pri_vlan_group which sends the packet out to the promiscuous devices as well as passes it onto table 1
+  ovs-ofctl add-flow $br table=0,priority=70,dl_vlan=$pri_vlan,dl_dst=ff:ff:ff:ff:ff:ff,actions=strip_vlan,group:$pri_vlan
+  # From a promiscuous device, so send it to all community and isolated devices on this switch. Passed to all promiscuous devices in the prior step ^^
+  ovs-ofctl add-flow $br table=1,priority=70,dl_vlan=$pri_vlan,dl_dst=ff:ff:ff:ff:ff:ff,actions=strip_vlan,group:$pri_vlan_header
+  # Since it's from a community, gotta braodcast it to all community devices
+  if [ "$type" == "C" ]
+  then
+    ovs-ofctl add-flow $br table=1,priority=70,dl_vlan=$sec_vlan,dl_dst=ff:ff:ff:ff:ff:ff,actions=strip_vlan,group:$sec_vlan
+  fi
+  # Allow only dhcp form isolated router to isolated vm
+  if [ "$type" == "I" ]
+  then
+    ovs-ofctl add-flow $br table=1,priority=70,udp,dl_vlan=$sec_vlan,tp_src=67,dl_dst=ff:ff:ff:ff:ff:ff,actions=strip_vlan,group:$sec_vlan
+  fi
+
+else
+  # Delete whatever we've added that's vm specific
+  ovs-ofctl del-flows $br --strict table=0,priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac
+
+  # Need to ge the vmport from the rules as it's already been removed from the switch
+  vm_port=`ovs-ofctl dump-flows $br | grep "priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac" | tr ':' '\n' | tail -n 1`
+  ovs-ofctl del-flows $br --strict table=1,priority=70,dl_vlan=$pri_vlan,dl_dst=$vm_mac
+  if [ "$type" == "C" ]
+  then
+    ovs-ofctl del-flows $br --strict table=1,priority=70,dl_vlan=$sec_vlan,dl_dst=$vm_mac
+  fi
+  if [ "$type" == "I" ]
+  then
+    ovs-ofctl del-flows $br --strict table=1,priority=70,udp,dl_vlan=$sec_vlan,dl_dst=$vm_mac,tp_src=67
+  fi
+
+  ovs-ofctl del-flows $br --strict table=0,priority=60,dl_vlan=$pri_vlan,dl_src=$vm_mac
+  ovs-ofctl del-flows $br --strict table=0,priority=50,vlan_tci=0x0000,dl_src=$vm_mac
+  # For some ovs versions
+  ovs-ofctl del-flows $br --strict table=0,priority=50,vlan_tci=0x0000/0x1fff,dl_src=$vm_mac
+
+  # Remove the port from the groups
+  pri_vlan_ports=$(del_from_ports "$pri_vlan_ports" "$vm_port")
+  mod_group $pri_vlan_header $pri_vlan_ports
+  sec_vlan_ports=$(del_from_ports "$sec_vlan_ports" "$vm_port")
+  mod_group $sec_vlan $sec_vlan_ports
+
+  # Remove vm specific rules
+  ovs-ofctl del-flows $br --strict table=0,priority=300,dl_vlan=$pri_vlan,dl_src=$vm_mac,dl_dst=ff:ff:ff:ff:ff:ff
+
+  # If the vm is going to be migrated but not yet removed. Remove the rules if it's the only vm in the vlan
+  res1=`ovs-vsctl --column _uuid find port tag=$pri_vlan | wc -l`
+  res2=`find_port $vm_mac | wc -l`
+  if [ "$res1" -eq 1 ] && [ "$res2" -eq 1 ]
+  then
+    cleanup_flows
+  fi
+
+  # If no more vms exist on this host, clear up all the rules
+  result=`ovs-vsctl find port tag=$pri_vlan`
+  if [ -z "$result" ]
+  then
+    cleanup_flows
+  fi
+
+fi
diff --git a/scripts/vm/network/security_group.py b/scripts/vm/network/security_group.py
index 680177e..6732f64 100755
--- a/scripts/vm/network/security_group.py
+++ b/scripts/vm/network/security_group.py
@@ -148,7 +148,7 @@
 def destroy_network_rules_for_nic(vm_name, vm_ip, vm_mac, vif, sec_ips):
     try:
         rules = execute("""iptables-save -t filter | awk '/ %s / { sub(/-A/, "-D", $1) ; print }'""" % vif ).split("\n")
-        for rule in filter(None, rules):
+        for rule in [_f for _f in rules if _f]:
             try:
                 execute("iptables " + rule)
             except:
@@ -158,7 +158,7 @@
 
     try:
         dnats = execute("""iptables-save -t nat | awk '/ %s / { sub(/-A/, "-D", $1) ; print }'""" % vif ).split("\n")
-        for dnat in filter(None, dnats):
+        for dnat in [_f for _f in dnats if _f]:
             try:
                 execute("iptables -t nat " + dnat)
             except:
@@ -185,7 +185,7 @@
         logging.debug("Ignoring failure to delete ebtable rules for vm: " + vm_name)
 
 def get_bridge_physdev(brname):
-    physdev = execute("bridge -o link show | awk '/master %s / && !/^[0-9]+: vnet/ {print $2}' | head -1" % brname)
+    physdev = execute("bridge -o link show | awk '/master %s / && !/^[0-9]+: vnet/ {print $2}' | head -1 | cut -d ':' -f1" % brname)
     return physdev.strip()
 
 
@@ -205,14 +205,14 @@
     destroy_ebtables_rules(vm_name, vif)
 
     chains = [vmchain_default, vmchain, vmchain_egress]
-    for chain in filter(None, chains):
+    for chain in [_f for _f in chains if _f]:
         try:
             execute("iptables -F " + chain)
             execute('ip6tables -F ' + chain)
         except:
             logging.debug("Ignoring failure to flush chain: " + chain)
 
-    for chain in filter(None, chains):
+    for chain in [_f for _f in chains if _f]:
         try:
             execute("iptables -X " + chain)
             execute('ip6tables -X ' + chain)
@@ -229,7 +229,7 @@
     if vif:
         try:
             dnats = execute("""iptables -t nat -S | awk '/%s/ { sub(/-A/, "-D", $1) ; print }'""" % vif ).split("\n")
-            for dnat in filter(None, dnats):
+            for dnat in [_f for _f in dnats if _f]:
                 try:
                     execute("iptables -t nat " + dnat)
                 except:
@@ -247,14 +247,14 @@
     delcmd = "ebtables -t nat -L PREROUTING | grep " + eb_vm_chain
     delcmds = []
     try:
-        delcmds = filter(None, execute(delcmd).split('\n'))
+        delcmds = [_f for _f in execute(delcmd).split('\n') if _f]
         delcmds = ["-D PREROUTING " + x for x in delcmds ]
     except:
         pass
     postcmds = []
     try:
         postcmd = "ebtables -t nat -L POSTROUTING | grep " + eb_vm_chain
-        postcmds = filter(None, execute(postcmd).split('\n'))
+        postcmds = [_f for _f in execute(postcmd).split('\n') if _f]
         postcmds = ["-D POSTROUTING " + x for x in postcmds]
     except:
         pass
@@ -493,7 +493,7 @@
     if action and action.strip() == "-A":
         action = "-I"
 
-    for ip in filter(None, ips):
+    for ip in [_f for _f in ips if _f]:
         logging.debug("ip = " + ip)
         if ip == 0 or ip == "0":
             continue
@@ -510,7 +510,7 @@
         rules = execute("iptables-save |grep -w %s |grep -w %s |grep -w %s" % (brfw, vif, vmchain_default))
     except:
         rules = None
-    if rules is None or rules is "":
+    if not rules:
         logging.debug("iptables rules do not exist, programming default rules for %s %s" % (vm_name,vif))
         default_network_rules(vm_name, vm_id, vm_ip, vm_ip6, vm_mac, vif, brname, sec_ips, is_first_nic)
     else:
@@ -519,7 +519,7 @@
             rules = execute("ebtables -t nat -L PREROUTING | grep %s |grep -w %s" % (vmchain_in, vif))
         except:
             rules = None
-        if rules is None or rules is "":
+        if not rules:
             logging.debug("ebtables rules do not exist, programming default ebtables rules for %s %s" % (vm_name,vif))
             default_ebtables_rules(vm_name, vm_ip, vm_mac, vif, is_first_nic)
             ips = sec_ips.split(';')
@@ -736,7 +736,7 @@
     vmchain = iptables_chain_name(vm_name)
 
     delcmd = """iptables-save | awk '/BF(.*)physdev-is-bridged(.*)%s/ { sub(/-A/, "-D", $1) ; print }'""" % vmchain
-    delcmds = filter(None, execute(delcmd).split('\n'))
+    delcmds = [_f for _f in execute(delcmd).split('\n') if _f]
     for cmd in delcmds:
         try:
             execute("iptables " + cmd)
@@ -744,7 +744,7 @@
               logging.exception("Ignoring failure to delete rules for vm " + vmName)
 
     delcmd = """ip6tables-save | awk '/BF(.*)physdev-is-bridged(.*)%s/ { sub(/-A/, "-D", $1) ; print }'""" % vmchain
-    delcmds = filter(None, execute(delcmd).split('\n'))
+    delcmds = [_f for _f in execute(delcmd).split('\n') if _f]
     for cmd in delcmds:
         try:
             execute('ip6tables ' + cmd)
@@ -820,7 +820,7 @@
     delete_rules_for_vm_in_bridge_firewall_chain(vm_name)
 
     brName = execute("iptables-save | awk -F '-j ' '/FORWARD -o(.*)physdev-is-bridged(.*)BF/ {print $2}'").strip()
-    if brName is None or brName is "":
+    if not brName:
         brName = "cloudbr0"
     else:
         brName = execute("iptables-save |grep physdev-is-bridged |grep FORWARD |grep BF |grep '\-o' |awk '{print $4}' | head -1").strip()
@@ -847,7 +847,7 @@
         ipts = []
         for cmd in [delcmd, inscmd]:
             logging.debug(cmd)
-            cmds = filter(None, execute(cmd).split('\n'))
+            cmds = [_f for _f in execute(cmd).split('\n') if _f]
             for c in cmds:
                     ipt = "iptables " + c
                     ipts.append(ipt)
@@ -897,7 +897,7 @@
 
     # Delete iptables/bridge rules
     rules = execute("""iptables-save | grep %s | grep '^-A' | sed 's/-A/-D/' """ % bridge_name).split("\n")
-    for rule in filter(None, rules):
+    for rule in [_f for _f in rules if _f]:
         try:
             command = "iptables " + rule
             execute(command)
@@ -945,13 +945,13 @@
                     cleanup.append(vm_name)
 
         bridge_tables = execute("""grep -E '^ebtable_' /proc/modules | cut -f1 -d' ' | sed s/ebtable_//""").split('\n')
-        for table in filter(None, bridge_tables):
+        for table in [_f for _f in bridge_tables if _f]:
             chainscmd = """ebtables -t %s -L | awk '/chain:/ { gsub(/(^.*chain: |-(in|out|ips).*)/, ""); print $1}' | sort | uniq""" % table
             chains = execute(chainscmd).split('\n')
 
         logging.debug(" ebtables chains in the host: %s ", chains)
 
-        for chain in filter(None, chains):
+        for chain in [_f for _f in chains if _f]:
             if 1 in [chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-']]:
                 vm_name = chain
                 vmpresent = False
@@ -1368,13 +1368,13 @@
 
     if brname is None:
         brname = execute("virsh domiflist %s |grep -w '%s' |tr -s ' '|cut -d ' ' -f3" % (vm_name, vm_mac)).strip()
-    if brname is None or brname == "":
+    if not brname:
         print("Cannot find bridge")
         sys.exit(1)
 
     if vif is None:
         vif = execute("virsh domiflist %s |grep -w '%s' |tr -s ' '|cut -d ' ' -f1" % (vm_name, vm_mac)).strip()
-    if vif is None or vif == "":
+    if not vif:
         print("Cannot find vif")
         sys.exit(1)
 
@@ -1451,7 +1451,7 @@
     expected_rules.append("-A %s -m state --state RELATED,ESTABLISHED -j ACCEPT" % (brfw))
     expected_rules.append("-A %s -m physdev --physdev-is-in --physdev-is-bridged -j %s" % (brfw, brfwin))
     expected_rules.append("-A %s -m physdev --physdev-is-out --physdev-is-bridged -j %s" % (brfw, brfwout))
-    phydev = execute("brctl show | awk '/^%s[ \t]/ {print $4}'" % brname ).strip()
+    phydev = execute("ip link show type bridge | awk '/^%s[ \t]/ {print $4}'" % brname ).strip()
     expected_rules.append("-A %s -m physdev --physdev-out %s --physdev-is-bridged -j ACCEPT" % (brfw, phydev))
 
     rules = execute("iptables-save |grep -w %s |grep -v \"^:\"" % brfw).split('\n')
diff --git a/scripts/vm/network/vnet/cloudstack_pluginlib.py b/scripts/vm/network/vnet/cloudstack_pluginlib.py
index 6c24917..87e504e 100755
--- a/scripts/vm/network/vnet/cloudstack_pluginlib.py
+++ b/scripts/vm/network/vnet/cloudstack_pluginlib.py
@@ -17,7 +17,7 @@
 
 # cloudstack_pluginlib for openvswitch on KVM hypervisor
 
-import ConfigParser
+import configparser
 import logging
 import os
 import subprocess
@@ -49,7 +49,7 @@
     log_date_format = DEFAULT_LOG_DATE_FORMAT
     # try to read plugin configuration file
     if os.path.exists(PLUGIN_CONFIG_PATH):
-        config = ConfigParser.ConfigParser()
+        config = configparser.ConfigParser()
         config.read(PLUGIN_CONFIG_PATH)
         try:
             options = config.options('LOGGING')
@@ -67,7 +67,7 @@
             # configuration file contained invalid attributes
             # ignore them
             pass
-        except ConfigParser.NoSectionError:
+        except configparser.NoSectionError:
             # Missing 'Logging' section in configuration file
             pass
 
@@ -114,7 +114,7 @@
         fpid = open(pidFile, "r")
         pid = fpid.readline()
         fpid.close()
-    except IOError, e:
+    except IOError as e:
         return -1
 
     pid = pid[:-1]
@@ -304,11 +304,11 @@
 
   def __repr__(self):
         return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
-                                      in self.__dict__.iteritems()))
+                                      in self.__dict__.items()))
 
   def __str__(self):
         return '{%s}' % str(', '.join('%s : %s' % (k, repr(v)) for (k, v)
-                                      in self.__dict__.iteritems()))
+                                      in self.__dict__.items()))
 
 def configure_bridge_for_network_topology(bridge, this_host_id, json_config):
     vpconfig = jsonLoader(json.loads(json_config)).vpc
diff --git a/scripts/vm/network/vnet/ovstunnel.py b/scripts/vm/network/vnet/ovstunnel.py
index c108c29..230055c 100755
--- a/scripts/vm/network/vnet/ovstunnel.py
+++ b/scripts/vm/network/vnet/ovstunnel.py
@@ -22,7 +22,7 @@
 
 import cloudstack_pluginlib as lib
 import logging
-import commands
+import subprocess
 import os
 import sys
 import subprocess
diff --git a/server/conf/log4j-cloud.xml.in b/server/conf/log4j-cloud.xml.in
index 9dc81e5..b75a479 100755
--- a/server/conf/log4j-cloud.xml.in
+++ b/server/conf/log4j-cloud.xml.in
@@ -37,7 +37,19 @@
          <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1.}] (%t:%x) %m%n"/>
       </layout>
    </appender>
-   
+
+   <appender name="INFO-FILE" class="org.apache.log4j.rolling.RollingFileAppender">
+      <param name="Append" value="false"/>
+      <param name="Threshold" value="INFO"/>
+      <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
+        <param name="FileNamePattern" value="/var/log/cloudstack/management/management-server-info.log.%d{yyyy-MM-dd}.gz"/>
+        <param name="ActiveFileName" value="/var/log/cloudstack/management/management-server-info.log"/>
+      </rollingPolicy>
+      <layout class="org.apache.log4j.EnhancedPatternLayout">
+         <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1.}] (%t:%x) (logid:%X{logcontextid}) %m%n"/>
+      </layout>
+   </appender>
+
    <appender name="APISERVER" class="org.apache.log4j.rolling.RollingFileAppender">
       <param name="Append" value="true"/>
       <param name="Threshold" value="DEBUG"/>
@@ -119,6 +131,19 @@
       <priority value="INFO"/>
    </category>
 
+   <!-- ============================== -->
+   <!-- Add or remove these logger for SNMP, this logger is for SNMP alerts plugin -->
+   <!-- ============================== -->
+
+   <logger name="org.apache.cloudstack.alerts" additivity="false">
+      <level value="WARN"/>
+      <appender-ref ref="SYSLOG"/>
+      <appender-ref ref="CONSOLE"/>
+      <appender-ref ref="FILE"/>
+      <appender-ref ref="SNMP"/>
+      <appender-ref ref="ALERTSYSLOG"/>
+   </logger>
+
    <!-- ======================= -->
    <!-- Setup the Root category -->
    <!-- ======================= -->
@@ -128,6 +153,7 @@
       <appender-ref ref="SYSLOG"/>
       <appender-ref ref="CONSOLE"/>
       <appender-ref ref="FILE"/>
+      <appender-ref ref="INFO-FILE"/>
    </root>
 
 </log4j:configuration>
diff --git a/server/pom.xml b/server/pom.xml
index a3c5a09..72dd1ae 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
@@ -90,6 +90,11 @@
             <artifactId>commons-codec</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>${cs.commons-math3.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.cloudstack</groupId>
             <artifactId>cloud-utils</artifactId>
             <version>${project.version}</version>
diff --git a/server/src/main/java/com/cloud/acl/AffinityGroupAccessChecker.java b/server/src/main/java/com/cloud/acl/AffinityGroupAccessChecker.java
index 1e90973..3a648cd 100644
--- a/server/src/main/java/com/cloud/acl/AffinityGroupAccessChecker.java
+++ b/server/src/main/java/com/cloud/acl/AffinityGroupAccessChecker.java
@@ -23,15 +23,18 @@
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupService;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
+import org.apache.cloudstack.context.CallContext;
 import org.springframework.stereotype.Component;
 
 import com.cloud.domain.DomainVO;
 import com.cloud.exception.PermissionDeniedException;
+import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.ProjectVO;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
+import com.cloud.user.User;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -75,12 +78,22 @@
                 //acl_type account
                 if (caller.getId() != group.getAccountId()) {
                   //check if the group belongs to a project
+                    User user = CallContext.current().getCallingUser();
                     ProjectVO project = _projectDao.findByProjectAccountId(group.getAccountId());
                     if (project != null) {
-                        if (AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canModifyProjectAccount(caller.getId(), group.getAccountId())) {
-                            return true;
-                        } else if (!AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canAccessProjectAccount(caller.getId(), group.getAccountId())) {
-                            return true;
+                        ProjectAccount userProjectAccount = _projectAccountDao.findByProjectIdUserId(project.getId(), user.getAccountId(), user.getId());
+                        if (userProjectAccount != null) {
+                            if (AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canUserModifyProject(project.getId(), user.getAccountId(), user.getId())) {
+                                return true;
+                            } else if (!AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canUserAccessProjectAccount(user.getAccountId(), user.getId(), group.getAccountId())) {
+                                return true;
+                            }
+                        } else {
+                            if (AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canModifyProjectAccount(caller.getId(), group.getAccountId())) {
+                                return true;
+                            } else if (!AccessType.ModifyProject.equals(accessType) && _projectAccountDao.canAccessProjectAccount(caller.getId(), group.getAccountId())) {
+                                return true;
+                            }
                         }
                     }
                     throw new PermissionDeniedException(caller + " does not have permission to operate with resource " + entity);
diff --git a/server/src/main/java/com/cloud/acl/DomainChecker.java b/server/src/main/java/com/cloud/acl/DomainChecker.java
index 5184d66..24b6b2a 100644
--- a/server/src/main/java/com/cloud/acl/DomainChecker.java
+++ b/server/src/main/java/com/cloud/acl/DomainChecker.java
@@ -21,9 +21,15 @@
 import javax.inject.Inject;
 
 import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.acl.ProjectRole;
+import org.apache.cloudstack.acl.ProjectRolePermission;
+import org.apache.cloudstack.acl.ProjectRoleService;
+import org.apache.cloudstack.acl.RolePermissionEntity;
 import org.apache.cloudstack.acl.SecurityChecker;
 import org.apache.cloudstack.affinity.AffinityGroup;
+import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
+import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.dc.DataCenter;
@@ -32,6 +38,7 @@
 import com.cloud.domain.Domain;
 import com.cloud.domain.dao.DomainDao;
 import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.UnavailableCommandException;
 import com.cloud.network.Network;
 import com.cloud.network.NetworkModel;
 import com.cloud.network.vpc.VpcOffering;
@@ -40,8 +47,11 @@
 import com.cloud.offering.NetworkOffering;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.ProjectManager;
 import com.cloud.projects.dao.ProjectAccountDao;
+import com.cloud.projects.dao.ProjectDao;
 import com.cloud.service.dao.ServiceOfferingDetailsDao;
 import com.cloud.storage.LaunchPermissionVO;
 import com.cloud.storage.dao.LaunchPermissionDao;
@@ -51,6 +61,7 @@
 import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.component.AdapterBase;
+import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
 public class DomainChecker extends AdapterBase implements SecurityChecker {
@@ -64,7 +75,7 @@
     @Inject
     ProjectManager _projectMgr;
     @Inject
-    ProjectAccountDao _projecAccountDao;
+    ProjectAccountDao _projectAccountDao;
     @Inject
     NetworkModel _networkMgr;
     @Inject
@@ -79,7 +90,14 @@
     NetworkOfferingDetailsDao networkOfferingDetailsDao;
     @Inject
     VpcOfferingDetailsDao vpcOfferingDetailsDao;
+    @Inject
+    private ProjectRoleService projectRoleService;
+    @Inject
+    private ProjectDao projectDao;
+    @Inject
+    private AccountService accountService;
 
+    public static final Logger s_logger = Logger.getLogger(DomainChecker.class.getName());
     protected DomainChecker() {
         super();
     }
@@ -89,6 +107,11 @@
         if (caller.getState() != Account.State.enabled) {
             throw new PermissionDeniedException(caller + " is disabled.");
         }
+
+        if (domain == null) {
+            throw new PermissionDeniedException(String.format("Provided domain is NULL, cannot check access for account [uuid=%s, name=%s]", caller.getUuid(), caller.getAccountName()));
+        }
+
         long domainId = domain.getId();
 
         if (_accountService.isNormalUser(caller.getId())) {
@@ -107,6 +130,7 @@
         if (user.getRemoved() != null) {
             throw new PermissionDeniedException(user + " is no longer active.");
         }
+
         Account account = _accountDao.findById(user.getAccountId());
         return checkAccess(account, domain);
     }
@@ -115,7 +139,6 @@
     public boolean checkAccess(Account caller, ControlledEntity entity, AccessType accessType)
             throws PermissionDeniedException {
         if (entity instanceof VirtualMachineTemplate) {
-
             VirtualMachineTemplate template = (VirtualMachineTemplate)entity;
             Account owner = _accountDao.findById(template.getAccountId());
             // validate that the template is usable by the account
@@ -154,7 +177,6 @@
         } else {
             if (_accountService.isNormalUser(caller.getId())) {
                 Account account = _accountDao.findById(entity.getAccountId());
-
                 if (account != null && account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
                     //only project owner can delete/modify the project
                     if (accessType != null && accessType == AccessType.ModifyProject) {
@@ -164,6 +186,7 @@
                     } else if (!_projectMgr.canAccessProjectAccount(caller, account.getId())) {
                         throw new PermissionDeniedException(caller + " does not have permission to operate with resource " + entity);
                     }
+                    checkOperationPermitted(caller, entity);
                 } else {
                     if (caller.getId() != entity.getAccountId()) {
                         throw new PermissionDeniedException(caller + " does not have permission to operate with resource " + entity);
@@ -171,10 +194,62 @@
                 }
             }
         }
-
         return true;
     }
 
+    private boolean checkOperationPermitted(Account caller, ControlledEntity entity) {
+        User user = CallContext.current().getCallingUser();
+        Project project = projectDao.findByProjectAccountId(entity.getAccountId());
+        if (project == null) {
+            throw new CloudRuntimeException("Unable to find project to which the entity belongs to");
+        }
+        ProjectAccount projectUser = _projectAccountDao.findByProjectIdUserId(project.getId(), user.getAccountId(), user.getId());
+        String apiCommandName = CallContext.current().getApiName();
+
+        if (accountService.isRootAdmin(caller.getId()) || accountService.isDomainAdmin(caller.getAccountId())) {
+            return true;
+        }
+
+        if (projectUser != null) {
+            if (projectUser.getAccountRole() == ProjectAccount.Role.Admin) {
+                return true;
+            } else {
+                return isPermitted(project, projectUser, apiCommandName);
+            }
+        }
+
+        ProjectAccount projectAccount = _projectAccountDao.findByProjectIdAccountId(project.getId(), caller.getAccountId());
+        if (projectAccount != null) {
+            if (projectAccount.getAccountRole() == ProjectAccount.Role.Admin) {
+                return true;
+            } else {
+                return isPermitted(project, projectAccount, apiCommandName);
+            }
+        }
+        throw new UnavailableCommandException("The given command '" + apiCommandName + "' either does not exist or is not available for the user");
+    }
+
+    private boolean isPermitted(Project project, ProjectAccount projectUser, String apiCommandName) {
+        ProjectRole projectRole = null;
+        if(projectUser.getProjectRoleId() != null) {
+            projectRole = projectRoleService.findProjectRole(projectUser.getProjectRoleId(), project.getId());
+        }
+
+        if (projectRole == null) {
+            return true;
+        }
+
+        for (ProjectRolePermission permission : projectRoleService.findAllProjectRolePermissions(project.getId(), projectRole.getId())) {
+            if (permission.getRule().matches(apiCommandName)) {
+                if (RolePermissionEntity.Permission.ALLOW.equals(permission.getPermission())) {
+                    return true;
+                } else {
+                    throw new PermissionDeniedException("The given command '" + apiCommandName + "' either does not exist or is not available for the user");
+                }
+            }
+        }
+        return true;
+    }
     @Override
     public boolean checkAccess(User user, ControlledEntity entity) throws PermissionDeniedException {
         Account account = _accountDao.findById(user.getAccountId());
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 698d6d7..42f91d1 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
@@ -299,7 +299,7 @@
         }
 
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Looking for speed=" + (offering.getCpu() * offering.getSpeed()) + "Mhz, Ram=" + offering.getRamSize());
+            s_logger.debug("Looking for speed=" + (offering.getCpu() * offering.getSpeed()) + "Mhz, Ram=" + offering.getRamSize() + " MB");
         }
 
         long serviceOfferingId = offering.getId();
diff --git a/server/src/main/java/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java b/server/src/main/java/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java
index ebef518..e71636b 100644
--- a/server/src/main/java/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java
+++ b/server/src/main/java/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java
@@ -57,6 +57,8 @@
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class UserConcentratedAllocator extends AdapterBase implements PodAllocator {
     private final static Logger s_logger = Logger.getLogger(UserConcentratedAllocator.class);
 
@@ -262,7 +264,7 @@
 
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("Counting memory capacity used by vm: " + vm.getId() + ", size: " + so.getRamSize() + "MB, host: " + hostId + ", currently counted: " +
-                                usedCapacity + " Bytes");
+                                toHumanReadableSize(usedCapacity) + " Bytes");
                     }
                 } else if (capacityType == Capacity.CAPACITY_TYPE_CPU) {
                     usedCapacity += so.getCpu() * so.getSpeed();
diff --git a/server/src/main/java/com/cloud/alert/ClusterAlertAdapter.java b/server/src/main/java/com/cloud/alert/ClusterAlertAdapter.java
index 2b7b392..16e87b4 100644
--- a/server/src/main/java/com/cloud/alert/ClusterAlertAdapter.java
+++ b/server/src/main/java/com/cloud/alert/ClusterAlertAdapter.java
@@ -60,7 +60,7 @@
     private void onClusterNodeJoined(Object sender, ClusterNodeJoinEventArgs args) {
         if (s_logger.isDebugEnabled()) {
             for (ManagementServerHostVO mshost : args.getJoinedNodes()) {
-                s_logger.debug("Handle cluster node join alert, joined node: " + mshost.getServiceIP() + ", msidL: " + mshost.getMsid());
+                s_logger.debug("Handle cluster node join alert, joined node: " + mshost.getServiceIP() + ", msid: " + mshost.getMsid());
             }
         }
 
diff --git a/server/src/main/java/com/cloud/api/ApiDBUtils.java b/server/src/main/java/com/cloud/api/ApiDBUtils.java
index 8d476ba..87b9f36 100644
--- a/server/src/main/java/com/cloud/api/ApiDBUtils.java
+++ b/server/src/main/java/com/cloud/api/ApiDBUtils.java
@@ -1142,6 +1142,10 @@
         return s_userDao.findById(userId);
     }
 
+    public static UserAccountJoinVO findUserAccountById(Long id) {
+        return s_userAccountJoinDao.findById(id);
+    }
+
     public static UserVm findUserVmById(Long vmId) {
         return s_userVmDao.findById(vmId);
     }
@@ -1567,6 +1571,10 @@
         return s_vpcDao.findById(vpcId);
     }
 
+    public static VpcVO findVpcByIdIncludingRemoved(long vpcId) {
+        return s_vpcDao.findByIdIncludingRemoved(vpcId);
+    }
+
     public static SnapshotPolicy findSnapshotPolicyById(long policyId) {
         return s_snapshotPolicyDao.findById(policyId);
     }
@@ -1833,6 +1841,7 @@
     }
 
     public static List<ProjectJoinVO> newProjectView(Project proj) {
+
         return s_projectJoinDao.newProjectView(proj);
     }
 
@@ -1999,16 +2008,16 @@
         return s_templateJoinDao.newUpdateResponse(vr);
     }
 
-    public static TemplateResponse newTemplateResponse(ResponseView view, TemplateJoinVO vr) {
-        return s_templateJoinDao.newTemplateResponse(view, vr);
+    public static TemplateResponse newTemplateResponse(EnumSet<DomainDetails> detailsView, ResponseView view, TemplateJoinVO vr) {
+        return s_templateJoinDao.newTemplateResponse(detailsView, view, vr);
     }
 
     public static TemplateResponse newIsoResponse(TemplateJoinVO vr) {
         return s_templateJoinDao.newIsoResponse(vr);
     }
 
-    public static TemplateResponse fillTemplateDetails(ResponseView view, TemplateResponse vrData, TemplateJoinVO vr) {
-        return s_templateJoinDao.setTemplateResponse(view, vrData, vr);
+    public static TemplateResponse fillTemplateDetails(EnumSet<DomainDetails> detailsView, ResponseView view, TemplateResponse vrData, TemplateJoinVO vr) {
+        return s_templateJoinDao.setTemplateResponse(detailsView, view, vrData, vr);
     }
 
     public static List<TemplateJoinVO> newTemplateView(VirtualMachineTemplate vr) {
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index c2d912b..473c501 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.api;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -31,7 +33,6 @@
 
 import javax.inject.Inject;
 
-import com.cloud.resource.RollingMaintenanceManager;
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.affinity.AffinityGroup;
@@ -45,9 +46,6 @@
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.ApplicationLoadBalancerInstanceResponse;
 import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse;
-import org.apache.cloudstack.api.response.RollingMaintenanceHostSkippedResponse;
-import org.apache.cloudstack.api.response.RollingMaintenanceHostUpdatedResponse;
-import org.apache.cloudstack.api.response.RollingMaintenanceResponse;
 import org.apache.cloudstack.api.response.ApplicationLoadBalancerRuleResponse;
 import org.apache.cloudstack.api.response.AsyncJobResponse;
 import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
@@ -68,7 +66,6 @@
 import org.apache.cloudstack.api.response.CreateSSHKeyPairResponse;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainResponse;
-import org.apache.cloudstack.api.response.RouterHealthCheckResultResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.ExtractResponse;
@@ -116,6 +113,10 @@
 import org.apache.cloudstack.api.response.ResourceCountResponse;
 import org.apache.cloudstack.api.response.ResourceLimitResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
+import org.apache.cloudstack.api.response.RollingMaintenanceHostSkippedResponse;
+import org.apache.cloudstack.api.response.RollingMaintenanceHostUpdatedResponse;
+import org.apache.cloudstack.api.response.RollingMaintenanceResponse;
+import org.apache.cloudstack.api.response.RouterHealthCheckResultResponse;
 import org.apache.cloudstack.api.response.SSHKeyPairResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
 import org.apache.cloudstack.api.response.SecurityGroupRuleResponse;
@@ -296,6 +297,7 @@
 import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.ProjectInvitation;
 import com.cloud.region.ha.GlobalLoadBalancerRule;
+import com.cloud.resource.RollingMaintenanceManager;
 import com.cloud.server.ResourceTag;
 import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.service.ServiceOfferingVO;
@@ -349,6 +351,7 @@
 import com.cloud.vm.snapshot.VMSnapshot;
 import com.cloud.vm.snapshot.VMSnapshotVO;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import com.google.common.base.Strings;
 
 public class ApiResponseHelper implements ResponseGenerator {
 
@@ -619,11 +622,13 @@
         vmSnapshotResponse.setDisplayName(vmSnapshot.getDisplayName());
         UserVm vm = ApiDBUtils.findUserVmById(vmSnapshot.getVmId());
         if (vm != null) {
-            vmSnapshotResponse.setVirtualMachineid(vm.getUuid());
+            vmSnapshotResponse.setVirtualMachineId(vm.getUuid());
+            vmSnapshotResponse.setVirtualMachineName(Strings.isNullOrEmpty(vm.getDisplayName()) ? vm.getHostName() : vm.getDisplayName());
             vmSnapshotResponse.setHypervisor(vm.getHypervisorType());
             DataCenterVO datacenter = ApiDBUtils.findZoneById(vm.getDataCenterId());
             if (datacenter != null) {
                 vmSnapshotResponse.setZoneId(datacenter.getUuid());
+                vmSnapshotResponse.setZoneName(datacenter.getName());
             }
         }
         if (vmSnapshot.getParent() != null) {
@@ -896,6 +901,7 @@
             NetworkVO nw = ApiDBUtils.findNetworkById(networkId);
             if (nw != null) {
                 ipResponse.setNetworkId(nw.getUuid());
+                ipResponse.setNetworkName(nw.getName());
             }
         }
         ipResponse.setState(ipAddr.getState().toString());
@@ -1561,7 +1567,7 @@
             tvo = ApiDBUtils.newTemplateView(result, zoneId, readyOnly);
 
         }
-        return ViewResponseHelper.createTemplateResponse(view, tvo.toArray(new TemplateJoinVO[tvo.size()]));
+        return ViewResponseHelper.createTemplateResponse(EnumSet.of(DomainDetails.all), view, tvo.toArray(new TemplateJoinVO[tvo.size()]));
     }
 
     @Override
@@ -1578,7 +1584,7 @@
                     tvo.addAll(ApiDBUtils.newTemplateView(result, zoneId, readyOnly));
             }
         }
-        return ViewResponseHelper.createTemplateResponse(view, tvo.toArray(new TemplateJoinVO[tvo.size()]));
+        return ViewResponseHelper.createTemplateResponse(EnumSet.of(DomainDetails.all), view, tvo.toArray(new TemplateJoinVO[tvo.size()]));
     }
 
     @Override
@@ -2259,6 +2265,7 @@
             Vpc vpc = ApiDBUtils.findVpcById(network.getVpcId());
             if (vpc != null) {
                 response.setVpcId(vpc.getUuid());
+                response.setVpcName(vpc.getName());
             }
         }
         response.setCanUseForDeploy(ApiDBUtils.canUseForDeploy(network));
@@ -2276,6 +2283,7 @@
             NetworkACL acl = ApiDBUtils.findByNetworkACLId(network.getNetworkACLId());
             if (acl != null) {
                 response.setAclId(acl.getUuid());
+                response.setAclName(acl.getName());
             }
         }
 
@@ -2405,6 +2413,7 @@
         NetworkACL acl = ApiDBUtils.findByNetworkACLId(aclItem.getAclId());
         if (acl != null) {
             response.setAclId(acl.getUuid());
+            response.setAclName(acl.getName());
         }
 
         //set tag information
@@ -2539,6 +2548,7 @@
         DataCenter zone = ApiDBUtils.findZoneById(result.getDataCenterId());
         if (zone != null) {
             response.setZoneId(zone.getUuid());
+            response.setZoneName(zone.getName());
         }
         response.setNetworkSpeed(result.getSpeed());
         response.setVlan(result.getVnetString());
@@ -2999,6 +3009,7 @@
         NetworkACL acl =  ApiDBUtils.findByNetworkACLId(result.getNetworkACLId());
         if (acl != null) {
             response.setAclId(acl.getUuid());
+            response.setAclName(acl.getName());
         }
 
         response.setObjectName("privategateway");
@@ -3384,6 +3395,7 @@
                 resourceType = ResourceTag.ResourceObjectType.UserVm;
                 usageRecResponse.setUsageId(vm.getUuid());
                 resourceId = vm.getId();
+                usageRecResponse.setOsTypeId(vm.getGuestOSId());
             }
             //Hypervisor Type
             usageRecResponse.setType(usageRecord.getType());
@@ -3463,8 +3475,15 @@
                 network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString());
                 if (network != null) {
                     resourceType = ResourceObjectType.Network;
-                    resourceId = network.getId();
-                    usageRecResponse.setNetworkId(network.getUuid());
+                    if (network.getTrafficType() == TrafficType.Public) {
+                        VirtualRouter router = ApiDBUtils.findDomainRouterById(usageRecord.getUsageId());
+                        Vpc vpc = ApiDBUtils.findVpcByIdIncludingRemoved(router.getVpcId());
+                        usageRecResponse.setVpcId(vpc.getUuid());
+                        resourceId = vpc.getId();
+                    } else {
+                        usageRecResponse.setNetworkId(network.getUuid());
+                        resourceId = network.getId();
+                    }
                     usageRecResponse.setResourceName(network.getName());
                 }
             }
@@ -3476,7 +3495,13 @@
                     builder.append("Bytes received by network ");
                 }
                 if (network != null) {
-                    builder.append(network.getName()).append(" (").append(network.getUuid()).append(") ");
+                    if (network.getName() != null) {
+                        builder.append(network.getName());
+                    }
+                    if (network.getUuid() != null){
+                        builder.append(" (").append(network.getUuid()).append(") ");
+                    }
+                    builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue())  + " ");
                 }
                 if (vm != null) {
                     builder.append("using router ").append(vm.getInstanceName()).append(" (").append(vm.getUuid()).append(")");
@@ -3513,6 +3538,9 @@
                 if (volume != null) {
                     builder.append(" and volume ").append(volume.getName()).append(" (").append(volume.getUuid()).append(")");
                 }
+                if (usageRecord.getRawUsage()!= null){
+                    builder.append(" " + toHumanReadableSize(usageRecord.getRawUsage().longValue()));
+                }
                 usageRecResponse.setDescription(builder.toString());
             }
         } else if (usageRecord.getUsageType() == UsageTypes.VOLUME) {
@@ -3543,6 +3571,9 @@
                 if (template != null) {
                     builder.append(" and template ").append(template.getName()).append(" (").append(template.getUuid()).append(")");
                 }
+                if (usageRecord.getSize() != null) {
+                    builder.append(" and size " + toHumanReadableSize(usageRecord.getSize()));
+                }
                 usageRecResponse.setDescription(builder.toString());
             }
         } else if (usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO) {
@@ -3570,7 +3601,7 @@
                 }
                 if (tmpl != null) {
                     builder.append(" for ").append(tmpl.getName()).append(" (").append(tmpl.getUuid()).append(") ")
-                            .append("with size ").append(usageRecord.getSize()).append(" and virtual size ").append(usageRecord.getVirtualSize());
+                            .append("with size ").append(toHumanReadableSize(usageRecord.getSize())).append(" and virtual size ").append(toHumanReadableSize(usageRecord.getVirtualSize()));
                 }
                 usageRecResponse.setDescription(builder.toString());
             }
@@ -3589,7 +3620,7 @@
                 builder.append("Snapshot usage ");
                 if (snap != null) {
                     builder.append("for ").append(snap.getName()).append(" (").append(snap.getUuid()).append(") ")
-                            .append("with size ").append(usageRecord.getSize());
+                            .append("with size ").append(toHumanReadableSize(usageRecord.getSize()));
                 }
                 usageRecResponse.setDescription(builder.toString());
             }
@@ -3736,6 +3767,9 @@
                 if (diskOff != null) {
                     builder.append(" using disk offering ").append(diskOff.getName()).append(" (").append(diskOff.getUuid()).append(")");
                 }
+                if (usageRecord.getSize() != null){
+                    builder.append(" and size " + toHumanReadableSize(usageRecord.getSize()));
+                }
                 usageRecResponse.setDescription(builder.toString());
             }
         } else if (usageRecord.getUsageType() == UsageTypes.VOLUME_SECONDARY) {
@@ -3745,7 +3779,7 @@
                 builder.append("Volume on secondary storage usage");
                 if (volume != null) {
                     builder.append(" for ").append(volume.getName()).append(" (").append(volume.getUuid()).append(") ")
-                            .append("with size ").append(usageRecord.getSize());
+                            .append("with size ").append(toHumanReadableSize(usageRecord.getSize()));
                 }
                 usageRecResponse.setDescription(builder.toString());
             }
@@ -3769,7 +3803,7 @@
                 }
                 if (vmInstance != null) {
                     builder.append(" for VM ").append(vmInstance.getHostName()).append(" (").append(vmInstance.getUuid()).append(") ")
-                            .append("with size ").append(usageRecord.getVirtualSize());
+                            .append("with size ").append(toHumanReadableSize(usageRecord.getVirtualSize()));
                 }
                 usageRecResponse.setDescription(builder.toString());
             }
diff --git a/server/src/main/java/com/cloud/api/ApiServer.java b/server/src/main/java/com/cloud/api/ApiServer.java
index 7d096b8..586d80b 100644
--- a/server/src/main/java/com/cloud/api/ApiServer.java
+++ b/server/src/main/java/com/cloud/api/ApiServer.java
@@ -16,49 +16,45 @@
 // under the License.
 package com.cloud.api;
 
-import com.cloud.api.dispatch.DispatchChainFactory;
-import com.cloud.api.dispatch.DispatchTask;
-import com.cloud.api.response.ApiResponseSerializer;
-import com.cloud.domain.Domain;
-import com.cloud.domain.DomainVO;
-import com.cloud.domain.dao.DomainDao;
-import com.cloud.event.ActionEventUtils;
-import com.cloud.event.EventCategory;
-import com.cloud.event.EventTypes;
-import com.cloud.exception.AccountLimitException;
-import com.cloud.exception.CloudAuthenticationException;
-import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.OriginDeniedException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.RequestLimitException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.exception.UnavailableCommandException;
-import com.cloud.storage.VolumeApiService;
-import com.cloud.user.Account;
-import com.cloud.user.AccountManager;
-import com.cloud.user.DomainManager;
-import com.cloud.user.User;
-import com.cloud.user.UserAccount;
-import com.cloud.user.UserVO;
-import com.cloud.utils.ConstantTimeComparator;
-import com.cloud.utils.DateUtil;
-import com.cloud.utils.HttpUtils;
-import com.cloud.utils.Pair;
-import com.cloud.utils.ReflectUtil;
-import com.cloud.utils.StringUtils;
-import com.cloud.utils.net.NetUtils;
-import com.cloud.utils.component.ComponentContext;
-import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.component.PluggableService;
-import com.cloud.utils.concurrency.NamedThreadFactory;
-import com.cloud.utils.db.EntityManager;
-import com.cloud.utils.db.TransactionLegacy;
-import com.cloud.utils.db.UUIDManager;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.exception.ExceptionProxyObject;
-import com.google.gson.reflect.TypeToken;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
 import org.apache.cloudstack.acl.APIChecker;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
@@ -141,43 +137,50 @@
 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.stereotype.Component;
 
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.lang.reflect.Type;
-import java.lang.reflect.Field;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.security.SecureRandom;
-import java.security.Security;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import com.cloud.api.dispatch.DispatchChainFactory;
+import com.cloud.api.dispatch.DispatchTask;
+import com.cloud.api.response.ApiResponseSerializer;
+import com.cloud.domain.Domain;
+import com.cloud.domain.DomainVO;
+import com.cloud.domain.dao.DomainDao;
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.EventCategory;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.AccountLimitException;
+import com.cloud.exception.CloudAuthenticationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.OriginDeniedException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.RequestLimitException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.UnavailableCommandException;
+import com.cloud.projects.dao.ProjectDao;
+import com.cloud.storage.VolumeApiService;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.DomainManager;
+import com.cloud.user.User;
+import com.cloud.user.UserAccount;
+import com.cloud.user.UserVO;
+import com.cloud.utils.ConstantTimeComparator;
+import com.cloud.utils.DateUtil;
+import com.cloud.utils.HttpUtils;
+import com.cloud.utils.Pair;
+import com.cloud.utils.ReflectUtil;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.component.ComponentContext;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.component.PluggableService;
+import com.cloud.utils.concurrency.NamedThreadFactory;
+import com.cloud.utils.db.EntityManager;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.UUIDManager;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionProxyObject;
+import com.cloud.utils.net.NetUtils;
+import com.google.gson.reflect.TypeToken;
 
 @Component
 public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiServerService, Configurable {
@@ -209,6 +212,8 @@
     private EntityManager entityMgr;
     @Inject
     private APIAuthenticationManager authManager;
+    @Inject
+    private ProjectDao projectDao;
 
     private List<PluggableService> pluggableServices;
 
@@ -843,7 +848,6 @@
             // if userId not null, that mean that user is logged in
             if (userId != null) {
                 final User user = ApiDBUtils.findUserById(userId);
-
                 return commandAvailable(remoteAddress, commandName, user);
             } else {
                 // check against every available command to see if the command exists or not
@@ -1204,6 +1208,17 @@
         }
     }
 
+    @Override
+    public boolean isValidApiName(String apiName) {
+        if (apiName == null || apiName.isEmpty())
+            return false;
+
+        if (!s_apiNameCmdClassMap.containsKey(apiName))
+            return false;
+
+        return true;
+    }
+
     // FIXME: rather than isError, we might was to pass in the status code to give more flexibility
     private void writeResponse(final HttpResponse resp, final String responseText, final int statusCode, final String responseType, final String reasonPhrase) {
         try {
diff --git a/server/src/main/java/com/cloud/api/ApiServlet.java b/server/src/main/java/com/cloud/api/ApiServlet.java
index c42980b..ebdc4f8 100644
--- a/server/src/main/java/com/cloud/api/ApiServlet.java
+++ b/server/src/main/java/com/cloud/api/ApiServlet.java
@@ -47,6 +47,8 @@
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 
+import com.cloud.projects.Project;
+import com.cloud.projects.dao.ProjectDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountService;
 import com.cloud.user.User;
@@ -75,6 +77,8 @@
     ManagedContext managedContext;
     @Inject
     APIAuthenticationManager authManager;
+    @Inject
+    private ProjectDao projectDao;
 
     public ApiServlet() {
     }
@@ -202,6 +206,7 @@
                             }
                         }
                         session = req.getSession(true);
+
                         if (ApiServer.EnableSecureSessionCookie.value()) {
                             resp.setHeader("SET-COOKIE", String.format("JSESSIONID=%s;Secure;HttpOnly;Path=/client", session.getId()));
                             if (s_logger.isDebugEnabled()) {
@@ -213,7 +218,7 @@
                     try {
                         responseString = apiAuthenticator.authenticate(command, params, session, remoteAddress, responseType, auditTrailSb, req, resp);
                         if (session != null && session.getAttribute(ApiConstants.SESSIONKEY) != null) {
-                            resp.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly;Path=/", ApiConstants.SESSIONKEY, session.getAttribute(ApiConstants.SESSIONKEY)));
+                            resp.addHeader("SET-COOKIE", String.format("%s=%s;HttpOnly", ApiConstants.SESSIONKEY, session.getAttribute(ApiConstants.SESSIONKEY)));
                         }
                     } catch (ServerApiException e) {
                         httpResponseCode = e.getErrorCode().getHttpCode();
@@ -305,13 +310,14 @@
             } else {
                 CallContext.register(accountMgr.getSystemUser(), accountMgr.getSystemAccount());
             }
-
+            setProjectContext(params);
             if (apiServer.verifyRequest(params, userId, remoteAddress)) {
                 auditTrailSb.insert(0, "(userId=" + CallContext.current().getCallingUserId() + " accountId=" + CallContext.current().getCallingAccount().getId() +
                         " sessionId=" + (session != null ? session.getId() : null) + ")");
 
                 // Add the HTTP method (GET/POST/PUT/DELETE) as well into the params map.
                 params.put("httpmethod", new String[]{req.getMethod()});
+                setProjectContext(params);
                 final String response = apiServer.handleRequest(params, responseType, auditTrailSb);
                 HttpUtils.writeHttpResponse(resp, response != null ? response : "", HttpServletResponse.SC_OK, responseType, ApiServer.JSONcontentType.value());
             } else {
@@ -347,6 +353,41 @@
         }
     }
 
+    private void setProjectContext(Map<String, Object[]> requestParameters) {
+        final String[] command = (String[])requestParameters.get(ApiConstants.COMMAND);
+        if (command == null) {
+            s_logger.info("missing command, ignoring request...");
+            return;
+        }
+
+        final String commandName = command[0];
+        CallContext.current().setApiName(commandName);
+        for (Map.Entry<String, Object[]> entry: requestParameters.entrySet()) {
+            if (entry.getKey().equals(ApiConstants.PROJECT_ID) || isSpecificAPI(commandName)) {
+                String projectId = null;
+                if (isSpecificAPI(commandName)) {
+                    projectId = String.valueOf(requestParameters.entrySet().stream()
+                            .filter(e -> e.getKey().equals(ApiConstants.ID))
+                            .map(Map.Entry::getValue).findFirst().get()[0]);
+                } else {
+                    projectId = String.valueOf(entry.getValue()[0]);
+                }
+                Project project = projectDao.findByUuid(projectId);
+                if (project != null) {
+                    CallContext.current().setProject(project);
+                }
+            }
+        }
+    }
+
+    private boolean isSpecificAPI(String commandName) {
+        List<String> commands = Arrays.asList("suspendProject", "updateProject", "activateProject", "deleteProject");
+        if (commands.contains(commandName)) {
+            return true;
+        }
+        return false;
+    }
+
     //This method will try to get login IP of user even if servlet is behind reverseProxy or loadBalancer
     static InetAddress getClientAddress(final HttpServletRequest request) throws UnknownHostException {
         for(final String header : s_clientAddressHeaders) {
diff --git a/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
index b1051a7..d429986 100644
--- a/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
+++ b/server/src/main/java/com/cloud/api/dispatch/ParamProcessWorker.java
@@ -269,20 +269,24 @@
         doAccessChecks(cmd, entitiesToAccess);
     }
 
-
     private void doAccessChecks(BaseCmd cmd, Map<Object, AccessType> entitiesToAccess) {
         Account caller = CallContext.current().getCallingAccount();
-        // due to deleteAccount design flaw CLOUDSTACK-6588, we should still include those removed account as well to clean up leftover resources from that account
-        Account owner = _accountMgr.getAccount(cmd.getEntityOwnerId());
+        List<Long> entityOwners = cmd.getEntityOwnerIds();
+        Account[] owners = null;
+        if (entityOwners != null) {
+            owners = entityOwners.stream().map(id -> _accountMgr.getAccount(id)).toArray(Account[]::new);
+        } else {
+            owners = new Account[]{_accountMgr.getAccount(cmd.getEntityOwnerId())};
+        }
 
         if (cmd instanceof BaseAsyncCreateCmd) {
             // check that caller can access the owner account.
-            _accountMgr.checkAccess(caller, null, false, owner);
+            _accountMgr.checkAccess(caller, null, false, owners);
         }
 
         if (!entitiesToAccess.isEmpty()) {
             // check that caller can access the owner account.
-            _accountMgr.checkAccess(caller, null, false, owner);
+            _accountMgr.checkAccess(caller, null, false, owners);
             for (Map.Entry<Object,AccessType>entry : entitiesToAccess.entrySet()) {
                 Object entity = entry.getKey();
                 if (entity instanceof ControlledEntity) {
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 c5a1df0..cf01b8d 100644
--- a/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java
@@ -31,6 +31,7 @@
 
 import javax.inject.Inject;
 
+import com.cloud.storage.dao.VMTemplateDetailsDao;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.affinity.AffinityGroupDomainMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -71,7 +72,6 @@
 import org.apache.cloudstack.api.command.user.resource.ListDetailOptionsCmd;
 import org.apache.cloudstack.api.command.user.securitygroup.ListSecurityGroupsCmd;
 import org.apache.cloudstack.api.command.user.tag.ListTagsCmd;
-import org.apache.cloudstack.api.command.user.template.ListTemplateOVFProperties;
 import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd;
 import org.apache.cloudstack.api.command.user.vm.ListVMsCmd;
 import org.apache.cloudstack.api.command.user.vmgroup.ListVMGroupsCmd;
@@ -101,7 +101,6 @@
 import org.apache.cloudstack.api.response.ServiceOfferingResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.StorageTagResponse;
-import org.apache.cloudstack.api.response.TemplateOVFPropertyResponse;
 import org.apache.cloudstack.api.response.TemplateResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
@@ -118,11 +117,13 @@
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.query.QueryService;
 import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
-import com.cloud.agent.api.storage.OVFProperty;
 import com.cloud.api.query.dao.AccountJoinDao;
 import com.cloud.api.query.dao.AffinityGroupJoinDao;
 import com.cloud.api.query.dao.AsyncJobJoinDao;
@@ -196,6 +197,7 @@
 import com.cloud.projects.ProjectVO;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
+import com.cloud.projects.dao.ProjectInvitationDao;
 import com.cloud.resource.ResourceManager;
 import com.cloud.server.ResourceMetaDataService;
 import com.cloud.server.ResourceTag;
@@ -210,11 +212,9 @@
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
 import com.cloud.storage.StoragePoolTagVO;
-import com.cloud.storage.TemplateOVFPropertyVO;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.Volume;
 import com.cloud.storage.dao.StoragePoolTagsDao;
-import com.cloud.storage.dao.TemplateOVFPropertiesDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.tags.ResourceTagVO;
 import com.cloud.tags.dao.ResourceTagDao;
@@ -223,7 +223,9 @@
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.DomainManager;
+import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.Pair;
 import com.cloud.utils.StringUtils;
@@ -399,7 +401,7 @@
     ManagementServerHostDao managementServerHostDao;
 
     @Inject
-    TemplateOVFPropertiesDao templateOVFPropertiesDao;
+    VMTemplateDetailsDao vmTemplateDetailsDao;
 
     @Inject
     public VpcVirtualNetworkApplianceService routerService;
@@ -410,6 +412,18 @@
     @Inject
     private RouterHealthCheckResultDao routerHealthCheckResultDao;
 
+    @Inject
+    private TemplateDataStoreDao templateDataStoreDao;
+
+    @Inject
+    private PrimaryDataStoreDao _storagePoolDao;
+
+    @Inject
+    private ProjectInvitationDao projectInvitationDao;
+
+    @Inject
+    private UserDao userDao;
+
     /*
      * (non-Javadoc)
      *
@@ -906,6 +920,8 @@
         Object affinityGroupId = cmd.getAffinityGroupId();
         Object keyPairName = cmd.getKeyPairName();
         Object serviceOffId = cmd.getServiceOfferingId();
+        Object securityGroupId = cmd.getSecurityGroupId();
+        Object isHaEnabled = cmd.getHaEnabled();
         Object pod = null;
         Object hostId = null;
         Object storageId = null;
@@ -935,6 +951,12 @@
         if (display != null) {
             sb.and("display", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ);
         }
+
+        if (isHaEnabled != null) {
+            sb.and("haEnabled", sb.entity().isHaEnabled(), SearchCriteria.Op.EQ);
+        }
+
+
         if (groupId != null && (Long)groupId != -1) {
             sb.and("instanceGroupId", sb.entity().getInstanceGroupId(), SearchCriteria.Op.EQ);
         }
@@ -952,7 +974,12 @@
         }
 
         if (storageId != null) {
-            sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ);
+            StoragePoolVO poolVO = _storagePoolDao.findById((Long) storageId);
+            if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.IN);
+            } else {
+                sb.and("poolId", sb.entity().getPoolId(), SearchCriteria.Op.EQ);
+            }
         }
 
         if (affinityGroupId != null) {
@@ -967,6 +994,10 @@
             sb.and("displayVm", sb.entity().isDisplayVm(), SearchCriteria.Op.EQ);
         }
 
+        if (securityGroupId != null) {
+            sb.and("securityGroupId", sb.entity().getSecurityGroupId(), SearchCriteria.Op.EQ);
+        }
+
         // populate the search criteria with the values passed in
         SearchCriteria<UserVmJoinVO> sc = sb.create();
 
@@ -992,7 +1023,9 @@
             SearchCriteria<UserVmJoinVO> ssc = _userVmJoinDao.createSearchCriteria();
             ssc.addOr("displayName", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-            ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            if (isRootAdmin) {
+                ssc.addOr("instanceName", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            }
             ssc.addOr("state", SearchCriteria.Op.EQ, keyword);
             sc.addAnd("displayName", SearchCriteria.Op.SC, ssc);
         }
@@ -1001,10 +1034,18 @@
             sc.setParameters("serviceOfferingId", serviceOffId);
         }
 
+        if (securityGroupId != null) {
+            sc.setParameters("securityGroupId", securityGroupId);
+        }
+
         if (display != null) {
             sc.setParameters("display", display);
         }
 
+        if (isHaEnabled != null) {
+            sc.setParameters("haEnabled", isHaEnabled);
+        }
+
         if (ids != null && !ids.isEmpty()) {
             sc.setParameters("idIN", ids.toArray());
         }
@@ -1076,7 +1117,14 @@
             }
 
             if (storageId != null) {
-                sc.setParameters("poolId", storageId);
+                StoragePoolVO poolVO = _storagePoolDao.findById((Long) storageId);
+                if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                    List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster((Long) storageId);
+                    List<Long> childDatastoreIds = childDatastores.stream().map(mo -> mo.getId()).collect(Collectors.toList());
+                    sc.setParameters("poolId", childDatastoreIds.toArray());
+                } else {
+                    sc.setParameters("poolId", storageId);
+                }
             }
         }
 
@@ -1303,7 +1351,7 @@
             ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             ssc.addOr("networkName", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             ssc.addOr("vpcName", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-
+            ssc.addOr("redundantState", SearchCriteria.Op.LIKE, "%" + keyword + "%");
             sc.addAnd("instanceName", SearchCriteria.Op.SC, ssc);
         }
 
@@ -1384,6 +1432,7 @@
         String displayText = cmd.getDisplayText();
         String state = cmd.getState();
         String accountName = cmd.getAccountName();
+        String username = cmd.getUsername();
         Long domainId = cmd.getDomainId();
         String keyword = cmd.getKeyword();
         Long startIndex = cmd.getStartIndex();
@@ -1392,8 +1441,11 @@
         boolean isRecursive = cmd.isRecursive();
         cmd.getTags();
 
+
         Account caller = CallContext.current().getCallingAccount();
+        User user = CallContext.current().getCallingUser();
         Long accountId = null;
+        Long userId = null;
         String path = null;
 
         Filter searchFilter = new Filter(ProjectJoinVO.class, "id", false, startIndex, pageSize);
@@ -1417,11 +1469,23 @@
                     }
                     accountId = owner.getId();
                 }
+                if (!Strings.isNullOrEmpty(username)) {
+                    User owner = userDao.getUserByName(username, domainId);
+                    if (owner == null) {
+                        throw new InvalidParameterValueException("Unable to find user " + username + " in domain " + domainId);
+                    }
+                    userId = owner.getId();
+                    if (accountName == null) {
+                        accountId = owner.getAccountId();
+                    }
+                }
             } else { // domainId == null
                 if (accountName != null) {
                     throw new InvalidParameterValueException("could not find account " + accountName + " because domain is not specified");
                 }
-
+                if (!Strings.isNullOrEmpty(username)) {
+                    throw new InvalidParameterValueException("could not find user " + username + " because domain is not specified");
+                }
             }
         } else {
             if (accountName != null && !accountName.equals(caller.getAccountName())) {
@@ -1432,11 +1496,17 @@
                 throw new PermissionDeniedException("Can't list domain id= " + domainId + " projects; unauthorized");
             }
 
+            if (!Strings.isNullOrEmpty(username) && !username.equals(user.getUsername())) {
+                throw new PermissionDeniedException("Can't list user " + username + " projects; unauthorized");
+            }
+
             accountId = caller.getId();
+            userId = user.getId();
         }
 
         if (domainId == null && accountId == null && (_accountMgr.isNormalUser(caller.getId()) || !listAll)) {
             accountId = caller.getId();
+            userId = user.getId();
         } else if (_accountMgr.isDomainAdmin(caller.getId()) || (isRecursive && !listAll)) {
             DomainVO domain = _domainDao.findById(caller.getDomainId());
             path = domain.getPath();
@@ -1447,7 +1517,19 @@
         }
 
         if (accountId != null) {
-            sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ);
+            if (userId == null) {
+                sb.and().op("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ);
+                sb.and("userIdNull", sb.entity().getUserId(), Op.NULL);
+                sb.cp();
+            } else {
+                sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ);
+            }
+        }
+
+        if (userId != null) {
+            sb.and().op("userId", sb.entity().getUserId(), Op.EQ);
+            sb.or("userIdNull", sb.entity().getUserId(), Op.NULL);
+            sb.cp();
         }
 
         SearchCriteria<ProjectJoinVO> sc = sb.create();
@@ -1472,6 +1554,10 @@
             sc.setParameters("accountId", accountId);
         }
 
+        if (userId != null) {
+            sc.setParameters("userId", userId);
+        }
+
         if (state != null) {
             sc.addAnd("state", Op.EQ, state);
         }
@@ -1523,10 +1609,12 @@
         boolean activeOnly = cmd.isActiveOnly();
         Long startIndex = cmd.getStartIndex();
         Long pageSizeVal = cmd.getPageSizeVal();
+        Long userId = cmd.getUserId();
         boolean isRecursive = cmd.isRecursive();
         boolean listAll = cmd.listAll();
 
         Account caller = CallContext.current().getCallingAccount();
+        User callingUser = CallContext.current().getCallingUser();
         List<Long> permittedAccounts = new ArrayList<Long>();
 
         Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(domainId, isRecursive, null);
@@ -1538,7 +1626,7 @@
         Filter searchFilter = new Filter(ProjectInvitationJoinVO.class, "id", true, startIndex, pageSizeVal);
         SearchBuilder<ProjectInvitationJoinVO> sb = _projectInvitationJoinDao.createSearchBuilder();
         _accountMgr.buildACLViewSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
-
+        ProjectInvitation invitation = projectInvitationDao.findByUserIdProjectId(callingUser.getId(), callingUser.getAccountId(), projectId == null ? -1 : projectId);
         sb.and("projectId", sb.entity().getProjectId(), SearchCriteria.Op.EQ);
         sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
         sb.and("created", sb.entity().getCreated(), SearchCriteria.Op.GT);
@@ -1551,6 +1639,12 @@
             sc.setParameters("projectId", projectId);
         }
 
+        if (invitation != null) {
+            sc.setParameters("userId", invitation.getForUserId());
+        } else if (userId != null) {
+            sc.setParameters("userId", userId);
+        }
+
         if (state != null) {
             sc.setParameters("state", state);
         }
@@ -1564,7 +1658,11 @@
             sc.setParameters("created", new Date((DateUtil.currentGMTTime().getTime()) - _projectMgr.getInvitationTimeout()));
         }
 
-        return _projectInvitationJoinDao.searchAndCount(sc, searchFilter);
+        Pair<List<ProjectInvitationJoinVO>, Integer> projectInvitations = _projectInvitationJoinDao.searchAndCount(sc, searchFilter);
+        List<ProjectInvitationJoinVO> invitations = projectInvitations.first();
+        invitations = invitations.stream().filter(invite -> invite.getUserId() == null || Long.parseLong(invite.getUserId()) == callingUser.getId()).collect(Collectors.toList());
+        return new Pair<>(invitations, invitations.size());
+
 
     }
 
@@ -1580,14 +1678,15 @@
     public Pair<List<ProjectAccountJoinVO>, Integer> listProjectAccountsInternal(ListProjectAccountsCmd cmd) {
         long projectId = cmd.getProjectId();
         String accountName = cmd.getAccountName();
+        Long userId = cmd.getUserId();
         String role = cmd.getRole();
         Long startIndex = cmd.getStartIndex();
         Long pageSizeVal = cmd.getPageSizeVal();
-
+        Long projectRoleId = cmd.getProjectRoleId();
         // long projectId, String accountName, String role, Long startIndex,
         // Long pageSizeVal) {
         Account caller = CallContext.current().getCallingAccount();
-
+        User callingUser = CallContext.current().getCallingUser();
         // check that the project exists
         Project project = _projectDao.findById(projectId);
 
@@ -1597,7 +1696,8 @@
 
         // verify permissions - only accounts belonging to the project can list
         // project's account
-        if (!_accountMgr.isAdmin(caller.getId()) && _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) {
+        if (!_accountMgr.isAdmin(caller.getId()) && _projectAccountDao.findByProjectIdUserId(projectId, callingUser.getAccountId(), callingUser.getId()) == null &&
+        _projectAccountDao.findByProjectIdAccountId(projectId, caller.getAccountId()) == null) {
             throw new PermissionDeniedException("Account " + caller + " is not authorized to list users of the project id=" + projectId);
         }
 
@@ -1610,6 +1710,9 @@
             sb.and("accountName", sb.entity().getAccountName(), Op.EQ);
         }
 
+        if (userId != null) {
+            sb.and("userId", sb.entity().getUserId(), Op.EQ);
+        }
         SearchCriteria<ProjectAccountJoinVO> sc = sb.create();
 
         sc.setParameters("projectId", projectId);
@@ -1622,6 +1725,14 @@
             sc.setParameters("accountName", accountName);
         }
 
+        if (projectRoleId != null) {
+            sc.setParameters("projectRoleId", projectRoleId);
+        }
+
+        if (userId != null) {
+            sc.setParameters("userId", userId);
+        }
+
         return _projectAccountJoinDao.searchAndCount(sc, searchFilter);
     }
 
@@ -1844,7 +1955,14 @@
         sb.and("instanceId", sb.entity().getVmId(), SearchCriteria.Op.EQ);
         sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
         sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
-        sb.and("storageId", sb.entity().getPoolUuid(), SearchCriteria.Op.EQ);
+        if (storageId != null) {
+            StoragePoolVO poolVO = _storagePoolDao.findByUuid(storageId);
+            if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                sb.and("storageId", sb.entity().getPoolUuid(), SearchCriteria.Op.IN);
+            } else {
+                sb.and("storageId", sb.entity().getPoolUuid(), SearchCriteria.Op.EQ);
+            }
+        }
         sb.and("diskOfferingId", sb.entity().getDiskOfferingId(), SearchCriteria.Op.EQ);
         sb.and("display", sb.entity().isDisplayVolume(), SearchCriteria.Op.EQ);
         sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
@@ -1913,7 +2031,14 @@
         }
 
         if (storageId != null) {
-            sc.setParameters("storageId", storageId);
+            StoragePoolVO poolVO = _storagePoolDao.findByUuid(storageId);
+            if (poolVO.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(poolVO.getId());
+                List<String> childDatastoreIds = childDatastores.stream().map(mo -> mo.getUuid()).collect(Collectors.toList());
+                sc.setParameters("storageId", childDatastoreIds.toArray());
+            } else {
+                sc.setParameters("storageId", storageId);
+            }
         }
 
         if (clusterId != null) {
@@ -2304,6 +2429,7 @@
         sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
         sb.and("hostAddress", sb.entity().getHostAddress(), SearchCriteria.Op.EQ);
         sb.and("scope", sb.entity().getScope(), SearchCriteria.Op.EQ);
+        sb.and("parent", sb.entity().getParent(), Op.EQ);
 
         SearchCriteria<StoragePoolJoinVO> sc = sb.create();
 
@@ -2341,6 +2467,7 @@
         if (scopeType != null) {
             sc.setParameters("scope", scopeType.toString());
         }
+        sc.setParameters("parent", 0);
 
         // search Pool details by ids
         Pair<List<StoragePoolJoinVO>, Integer> uniquePoolPair = _poolJoinDao.searchAndCount(sc, searchFilter);
@@ -2462,6 +2589,7 @@
         Object keyword = cmd.getKeyword();
         Long startIndex = cmd.getStartIndex();
         Long pageSize = cmd.getPageSizeVal();
+        Boolean readonly = cmd.getReadonly();
 
         Filter searchFilter = new Filter(ImageStoreJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize);
 
@@ -2474,6 +2602,7 @@
         sb.and("protocol", sb.entity().getProtocol(), SearchCriteria.Op.EQ);
         sb.and("provider", sb.entity().getProviderName(), SearchCriteria.Op.EQ);
         sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ);
+        sb.and("readonly", sb.entity().isReadonly(), Op.EQ);
 
         SearchCriteria<ImageStoreJoinVO> sc = sb.create();
         sc.setParameters("role", DataStoreRole.Image);
@@ -2502,6 +2631,9 @@
         if (protocol != null) {
             sc.setParameters("protocol", protocol);
         }
+        if (readonly != null) {
+            sc.setParameters("readonly", readonly);
+        }
 
         // search Store details by ids
         Pair<List<ImageStoreJoinVO>, Integer> uniqueStorePair = _imageStoreJoinDao.searchAndCount(sc, searchFilter);
@@ -2792,6 +2924,9 @@
         ServiceOfferingVO currentVmOffering = null;
         Boolean isRecursive = cmd.isRecursive();
         Long zoneId = cmd.getZoneId();
+        Integer cpuNumber = cmd.getCpuNumber();
+        Integer memory = cmd.getMemory();
+        Integer cpuSpeed = cmd.getCpuSpeed();
 
         SearchCriteria<ServiceOfferingJoinVO> sc = _srvOfferingJoinDao.createSearchCriteria();
         if (!_accountMgr.isRootAdmin(caller.getId()) && isSystem) {
@@ -2845,35 +2980,7 @@
                 if (caller.getType() == Account.ACCOUNT_TYPE_NORMAL) {
                     throw new InvalidParameterValueException("Only ROOT admins and Domain admins can list service offerings with isrecursive=true");
                 }
-            }/* else { // domain + all ancestors
-                // find all domain Id up to root domain for this account
-                List<Long> domainIds = new ArrayList<Long>();
-                DomainVO domainRecord;
-                if (vmId != null) {
-                    UserVmVO vmInstance = _userVmDao.findById(vmId);
-                    domainRecord = _domainDao.findById(vmInstance.getDomainId());
-                    if (domainRecord == null) {
-                        s_logger.error("Could not find the domainId for vmId:" + vmId);
-                        throw new CloudAuthenticationException("Could not find the domainId for vmId:" + vmId);
-                    }
-                } else {
-                    domainRecord = _domainDao.findById(caller.getDomainId());
-                    if (domainRecord == null) {
-                        s_logger.error("Could not find the domainId for account:" + caller.getAccountName());
-                        throw new CloudAuthenticationException("Could not find the domainId for account:" + caller.getAccountName());
-                    }
-                }
-                domainIds.add(domainRecord.getId());
-                while (domainRecord.getParent() != null) {
-                    domainRecord = _domainDao.findById(domainRecord.getParent());
-                    domainIds.add(domainRecord.getId());
-                }
-
-                SearchCriteria<ServiceOfferingJoinVO> spc = _srvOfferingJoinDao.createSearchCriteria();
-                spc.addOr("domainId", SearchCriteria.Op.IN, domainIds.toArray());
-                spc.addOr("domainId", SearchCriteria.Op.NULL); // include public offering as well
-                sc.addAnd("domainId", SearchCriteria.Op.SC, spc);
-            }*/
+            }
         } else {
             // for root users
             if (caller.getDomainId() != 1 && isSystem) { // NON ROOT admin
@@ -2920,6 +3027,37 @@
             sc.addAnd("zoneId", SearchCriteria.Op.SC, zoneSC);
         }
 
+        if (cpuNumber != null) {
+            SearchCriteria<ServiceOfferingJoinVO> cpuConstraintSearchCriteria = _srvOfferingJoinDao.createSearchCriteria();
+            cpuConstraintSearchCriteria.addAnd("minCpu", Op.LTEQ, cpuNumber);
+            cpuConstraintSearchCriteria.addAnd("maxCpu", Op.GTEQ, cpuNumber);
+
+            SearchCriteria<ServiceOfferingJoinVO> cpuSearchCriteria = _srvOfferingJoinDao.createSearchCriteria();
+            cpuSearchCriteria.addOr("minCpu", Op.NULL);
+            cpuSearchCriteria.addOr("constraints", Op.SC, cpuConstraintSearchCriteria);
+
+            sc.addAnd("cpuConstraints", SearchCriteria.Op.SC, cpuSearchCriteria);
+        }
+
+        if (memory != null) {
+            SearchCriteria<ServiceOfferingJoinVO> memoryConstraintSearchCriteria = _srvOfferingJoinDao.createSearchCriteria();
+            memoryConstraintSearchCriteria.addAnd("minMemory", Op.LTEQ, memory);
+            memoryConstraintSearchCriteria.addAnd("maxMemory", Op.GTEQ, memory);
+
+            SearchCriteria<ServiceOfferingJoinVO> memSearchCriteria = _srvOfferingJoinDao.createSearchCriteria();
+            memSearchCriteria.addOr("minMemory", Op.NULL);
+            memSearchCriteria.addOr("memconstraints", Op.SC, memoryConstraintSearchCriteria);
+
+            sc.addAnd("memoryConstraints", SearchCriteria.Op.SC, memSearchCriteria);
+        }
+
+        if (cpuSpeed != null) {
+            SearchCriteria<ServiceOfferingJoinVO> cpuSpeedSearchCriteria = _srvOfferingJoinDao.createSearchCriteria();
+            cpuSpeedSearchCriteria.addOr("speed", Op.NULL);
+            cpuSpeedSearchCriteria.addOr("speed", Op.EQ, cpuSpeed);
+            sc.addAnd("cpuspeedconstraints", SearchCriteria.Op.SC, cpuSpeedSearchCriteria);
+        }
+
         Pair<List<ServiceOfferingJoinVO>, Integer> result = _srvOfferingJoinDao.searchAndCount(sc, searchFilter);
 
         //Couldn't figure out a smart way to filter offerings based on tags in sql so doing it in Java.
@@ -3200,7 +3338,7 @@
             respView = ResponseView.Full;
         }
 
-        List<TemplateResponse> templateResponses = ViewResponseHelper.createTemplateResponse(respView, result.first().toArray(new TemplateJoinVO[result.first().size()]));
+        List<TemplateResponse> templateResponses = ViewResponseHelper.createTemplateResponse(cmd.getDetails(), respView, result.first().toArray(new TemplateJoinVO[result.first().size()]));
         response.setResponses(templateResponses, result.second());
         return response;
     }
@@ -3307,11 +3445,6 @@
                 domain = _domainDao.findById(Domain.ROOT_DOMAIN);
             }
 
-            // List<HypervisorType> hypers = null;
-            // if (!isIso) {
-            // hypers = _resourceMgr.listAvailHypervisorInZone(null, null);
-            // }
-
             setIdsListToSearchCriteria(sc, ids);
 
             // add criteria for project or not
@@ -3359,17 +3492,6 @@
                 }
             }
 
-            if (!isIso) {
-                // add hypervisor criteria for template case
-                if (hypers != null && !hypers.isEmpty()) {
-                    String[] relatedHypers = new String[hypers.size()];
-                    for (int i = 0; i < hypers.size(); i++) {
-                        relatedHypers[i] = hypers.get(i).toString();
-                    }
-                    sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers);
-                }
-            }
-
             // control different template filters
             if (templateFilter == TemplateFilter.featured || templateFilter == TemplateFilter.community) {
                 sc.addAnd("publicTemplate", SearchCriteria.Op.EQ, true);
@@ -3412,62 +3534,78 @@
                 }
                 sc.addAnd("publicTemplate", SearchCriteria.Op.SC, scc);
             }
+        }
 
-            // add tags criteria
-            if (tags != null && !tags.isEmpty()) {
-                SearchCriteria<TemplateJoinVO> scc = _templateJoinDao.createSearchCriteria();
-                for (Map.Entry<String, String> entry : tags.entrySet()) {
-                    SearchCriteria<TemplateJoinVO> scTag = _templateJoinDao.createSearchCriteria();
-                    scTag.addAnd("tagKey", SearchCriteria.Op.EQ, entry.getKey());
-                    scTag.addAnd("tagValue", SearchCriteria.Op.EQ, entry.getValue());
-                    if (isIso) {
-                        scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.ISO);
-                    } else {
-                        scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.Template);
-                    }
-                    scc.addOr("tagKey", SearchCriteria.Op.SC, scTag);
+        return templateChecks(isIso, hypers, tags, name, keyword, hyperType, onlyReady, bootable, zoneId, showDomr,
+                showRemovedTmpl, parentTemplateId, showUnique, searchFilter, sc);
+
+    }
+
+    private Pair<List<TemplateJoinVO>, Integer> templateChecks(boolean isIso, List<HypervisorType> hypers, Map<String, String> tags, String name, String keyword,
+                                                               HypervisorType hyperType, boolean onlyReady, Boolean bootable, Long zoneId, boolean showDomr,
+                                                               boolean showRemovedTmpl, Long parentTemplateId, Boolean showUnique,
+                                                               Filter searchFilter, SearchCriteria<TemplateJoinVO> sc) {
+        if (!isIso) {
+            // add hypervisor criteria for template case
+            if (hypers != null && !hypers.isEmpty()) {
+                String[] relatedHypers = new String[hypers.size()];
+                for (int i = 0; i < hypers.size(); i++) {
+                    relatedHypers[i] = hypers.get(i).toString();
                 }
-                sc.addAnd("tagKey", SearchCriteria.Op.SC, scc);
+                sc.addAnd("hypervisorType", SearchCriteria.Op.IN, relatedHypers);
             }
+        }
 
-            // other criteria
-
-            if (keyword != null) {
-                sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
-            } else if (name != null) {
-                sc.addAnd("name", SearchCriteria.Op.EQ, name);
+        // add tags criteria
+        if (tags != null && !tags.isEmpty()) {
+            SearchCriteria<TemplateJoinVO> scc = _templateJoinDao.createSearchCriteria();
+            for (Map.Entry<String, String> entry : tags.entrySet()) {
+                SearchCriteria<TemplateJoinVO> scTag = _templateJoinDao.createSearchCriteria();
+                scTag.addAnd("tagKey", SearchCriteria.Op.EQ, entry.getKey());
+                scTag.addAnd("tagValue", SearchCriteria.Op.EQ, entry.getValue());
+                if (isIso) {
+                    scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.ISO);
+                } else {
+                    scTag.addAnd("tagResourceType", SearchCriteria.Op.EQ, ResourceObjectType.Template);
+                }
+                scc.addOr("tagKey", SearchCriteria.Op.SC, scTag);
             }
+            sc.addAnd("tagKey", SearchCriteria.Op.SC, scc);
+        }
 
-            if (isIso) {
-                sc.addAnd("format", SearchCriteria.Op.EQ, "ISO");
+        // other criteria
 
-            } else {
-                sc.addAnd("format", SearchCriteria.Op.NEQ, "ISO");
-            }
+        if (keyword != null) {
+            sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+        } else if (name != null) {
+            sc.addAnd("name", SearchCriteria.Op.EQ, name);
+        }
 
-            if (!hyperType.equals(HypervisorType.None)) {
-                sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType);
-            }
+        SearchCriteria.Op op = isIso ? Op.EQ : Op.NEQ;
+        sc.addAnd("format", op, "ISO");
 
-            if (bootable != null) {
-                sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable);
-            }
+        if (!hyperType.equals(HypervisorType.None)) {
+            sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hyperType);
+        }
 
-            if (onlyReady) {
-                SearchCriteria<TemplateJoinVO> readySc = _templateJoinDao.createSearchCriteria();
-                readySc.addOr("state", SearchCriteria.Op.EQ, TemplateState.Ready);
-                readySc.addOr("format", SearchCriteria.Op.EQ, ImageFormat.BAREMETAL);
-                SearchCriteria<TemplateJoinVO> isoPerhostSc = _templateJoinDao.createSearchCriteria();
-                isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO);
-                isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST);
-                readySc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc);
-                sc.addAnd("state", SearchCriteria.Op.SC, readySc);
-            }
+        if (bootable != null) {
+            sc.addAnd("bootable", SearchCriteria.Op.EQ, bootable);
+        }
 
-            if (!showDomr) {
-                // excluding system template
-                sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM);
-            }
+        if (onlyReady) {
+            SearchCriteria<TemplateJoinVO> readySc = _templateJoinDao.createSearchCriteria();
+            readySc.addOr("state", SearchCriteria.Op.EQ, TemplateState.Ready);
+            readySc.addOr("format", SearchCriteria.Op.EQ, ImageFormat.BAREMETAL);
+            SearchCriteria<TemplateJoinVO> isoPerhostSc = _templateJoinDao.createSearchCriteria();
+            isoPerhostSc.addAnd("format", SearchCriteria.Op.EQ, ImageFormat.ISO);
+            isoPerhostSc.addAnd("templateType", SearchCriteria.Op.EQ, TemplateType.PERHOST);
+            readySc.addOr("templateType", SearchCriteria.Op.SC, isoPerhostSc);
+            sc.addAnd("state", SearchCriteria.Op.SC, readySc);
+        }
+
+        if (!showDomr) {
+            // excluding system template
+            sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM);
         }
 
         if (zoneId != null) {
@@ -3512,7 +3650,6 @@
         // VMTemplateDaoImpl.searchForTemplates and understand why we need to
         // specially handle ISO. The original logic is very twisted and no idea
         // about what the code was doing.
-
     }
 
     // findTemplatesByIdOrTempZonePair returns the templates with the given ids if showUnique is true, or else by the TempZonePair
@@ -3971,29 +4108,6 @@
     }
 
     @Override
-    public ListResponse<TemplateOVFPropertyResponse> listTemplateOVFProperties(ListTemplateOVFProperties cmd) {
-        ListResponse<TemplateOVFPropertyResponse> response = new ListResponse<>();
-        List<TemplateOVFPropertyResponse> result = new ArrayList<>();
-        Long templateId = cmd.getTemplateId();
-        List<TemplateOVFPropertyVO> ovfProperties = templateOVFPropertiesDao.listByTemplateId(templateId);
-        for (OVFProperty property : ovfProperties) {
-            TemplateOVFPropertyResponse propertyResponse = new TemplateOVFPropertyResponse();
-            propertyResponse.setKey(property.getKey());
-            propertyResponse.setType(property.getType());
-            propertyResponse.setValue(property.getValue());
-            propertyResponse.setQualifiers(property.getQualifiers());
-            propertyResponse.setUserConfigurable(property.isUserConfigurable());
-            propertyResponse.setLabel(property.getLabel());
-            propertyResponse.setDescription(property.getDescription());
-            propertyResponse.setPassword(property.isPassword());
-            propertyResponse.setObjectName("ovfproperty");
-            result.add(propertyResponse);
-        }
-        response.setResponses(result);
-        return response;
-    }
-
-    @Override
     public List<RouterHealthCheckResultResponse> listRouterHealthChecks(GetRouterHealthCheckResultsCmd cmd) {
         s_logger.info("Executing health check command " + cmd);
         long routerId = cmd.getRouterId();
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 f4a5bc4..a4de366 100644
--- a/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/query/ViewResponseHelper.java
@@ -26,9 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
-import com.cloud.configuration.Resource;
-import com.cloud.domain.Domain;
-import org.apache.log4j.Logger;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.api.ApiConstants.DomainDetails;
 import org.apache.cloudstack.api.ApiConstants.HostDetails;
@@ -59,6 +57,7 @@
 import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
 
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.query.vo.AccountJoinVO;
@@ -84,8 +83,10 @@
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
-import com.cloud.storage.StoragePoolTagVO;
+import com.cloud.configuration.Resource;
+import com.cloud.domain.Domain;
 import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.StoragePoolTagVO;
 import com.cloud.storage.VolumeStats;
 import com.cloud.user.Account;
 
@@ -216,7 +217,12 @@
             // update user list
             Account caller = CallContext.current().getCallingAccount();
             if (ApiDBUtils.isAdmin(caller)) {
-                List<UserAccountJoinVO> users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId());
+                List<UserAccountJoinVO> users = null;
+                if (proj.getUserUuid() != null) {
+                    users = Collections.singletonList(ApiDBUtils.findUserAccountById(proj.getUserId()));
+                } else {
+                    users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId());
+                }
                 resp.setUsers(ViewResponseHelper.createUserResponse(users.toArray(new UserAccountJoinVO[users.size()])));
             }
             responseList.add(resp);
@@ -575,17 +581,17 @@
         return respList;
     }
 
-    public static List<TemplateResponse> createTemplateResponse(ResponseView view, TemplateJoinVO... templates) {
+    public static List<TemplateResponse> createTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO... templates) {
         LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<String, TemplateResponse>();
         for (TemplateJoinVO vr : templates) {
             TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
             if (vrData == null) {
                 // first time encountering this volume
-                vrData = ApiDBUtils.newTemplateResponse(view, vr);
+                vrData = ApiDBUtils.newTemplateResponse(detailsView, view, vr);
             }
             else{
                 // update tags
-                vrData = ApiDBUtils.fillTemplateDetails(view, vrData, vr);
+                vrData = ApiDBUtils.fillTemplateDetails(detailsView, view, vrData, vr);
             }
             vrDataList.put(vr.getTempZonePair(), vrData);
         }
@@ -601,7 +607,7 @@
                 vrData = ApiDBUtils.newTemplateUpdateResponse(vr);
             } else {
                 // update tags
-                vrData = ApiDBUtils.fillTemplateDetails(view, vrData, vr);
+                vrData = ApiDBUtils.fillTemplateDetails(EnumSet.of(DomainDetails.all), view, vrData, vr);
             }
             vrDataList.put(vr.getId(), vrData);
         }
@@ -617,7 +623,7 @@
                 vrData = ApiDBUtils.newIsoResponse(vr);
             } else {
                 // update tags
-                vrData = ApiDBUtils.fillTemplateDetails(view, vrData, vr);
+                vrData = ApiDBUtils.fillTemplateDetails(EnumSet.of(DomainDetails.all), view, vrData, vr);
             }
             vrDataList.put(vr.getTempZonePair(), vrData);
         }
diff --git a/server/src/main/java/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
index 9220974..a62fbcd 100644
--- a/server/src/main/java/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/DiskOfferingJoinDaoImpl.java
@@ -17,7 +17,13 @@
 package com.cloud.api.query.dao;
 
 import java.util.List;
+import java.util.Map;
 
+import com.cloud.api.ApiDBUtils;
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
+import com.cloud.server.ResourceTag;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -30,10 +36,15 @@
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 
+import javax.inject.Inject;
+
 @Component
 public class DiskOfferingJoinDaoImpl extends GenericDaoBase<DiskOfferingJoinVO, Long> implements DiskOfferingJoinDao {
     public static final Logger s_logger = Logger.getLogger(DiskOfferingJoinDaoImpl.class);
 
+    @Inject
+    VsphereStoragePolicyDao _vsphereStoragePolicyDao;
+
     private final SearchBuilder<DiskOfferingJoinVO> dofIdSearch;
     private final Attribute _typeAttr;
 
@@ -108,6 +119,15 @@
         diskOfferingResponse.setIopsWriteRateMaxLength(offering.getIopsWriteRateMaxLength());
         diskOfferingResponse.setCacheMode(offering.getCacheMode());
         diskOfferingResponse.setObjectName("diskoffering");
+        Map<String, String> offeringDetails = ApiDBUtils.getResourceDetails(offering.getId(), ResourceTag.ResourceObjectType.DiskOffering);
+        if (offeringDetails != null && !offeringDetails.isEmpty()) {
+            String vsphereStoragePolicyId = offeringDetails.get(ApiConstants.STORAGE_POLICY);
+            if (vsphereStoragePolicyId != null) {
+                VsphereStoragePolicyVO vsphereStoragePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(vsphereStoragePolicyId));
+                if (vsphereStoragePolicyVO != null)
+                    diskOfferingResponse.setVsphereStoragePolicy(vsphereStoragePolicyVO.getName());
+            }
+        }
 
         return diskOfferingResponse;
     }
diff --git a/server/src/main/java/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
index 7734489..b91398d 100644
--- a/server/src/main/java/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/ImageStoreJoinDaoImpl.java
@@ -21,6 +21,8 @@
 
 import javax.inject.Inject;
 
+import com.cloud.api.ApiDBUtils;
+import com.cloud.storage.StorageStats;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -65,6 +67,7 @@
         osResponse.setName(ids.getName());
         osResponse.setProviderName(ids.getProviderName());
         osResponse.setProtocol(ids.getProtocol());
+        osResponse.setReadonly(ids.isReadonly());
         String url = ids.getUrl();
         //if store is type cifs, remove the password
         if(ids.getProtocol().equals("cifs".toString())) {
@@ -75,6 +78,12 @@
         osResponse.setZoneId(ids.getZoneUuid());
         osResponse.setZoneName(ids.getZoneName());
 
+        StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(ids.getId());
+        if (secStorageStats != null) {
+            osResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes());
+            osResponse.setDiskSizeUsed(secStorageStats.getByteUsed());
+        }
+
         osResponse.setObjectName("imagestore");
         return osResponse;
     }
diff --git a/server/src/main/java/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java
index ad5db14..67da834 100644
--- a/server/src/main/java/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/ProjectAccountJoinDaoImpl.java
@@ -52,9 +52,11 @@
 
         projectAccountResponse.setProjectId(proj.getProjectUuid());
         projectAccountResponse.setProjectName(proj.getProjectName());
-
+        projectAccountResponse.setProjectRoleId(proj.getProjectRoleUuid());
         projectAccountResponse.setAccountId(proj.getAccountUuid());
         projectAccountResponse.setAccountName(proj.getAccountName());
+        projectAccountResponse.setUserId(proj.getUserUuid());
+        projectAccountResponse.setUsername(proj.getUsername());
         projectAccountResponse.setAccountType(proj.getAccountType());
         projectAccountResponse.setRole(proj.getAccountRole().toString());
         projectAccountResponse.setDomainId(proj.getDomainUuid());
diff --git a/server/src/main/java/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java
index 33a35d9..8e155da 100644
--- a/server/src/main/java/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/ProjectInvitationJoinDaoImpl.java
@@ -57,7 +57,11 @@
 
         if (invite.getAccountName() != null) {
             response.setAccountName(invite.getAccountName());
-        } else {
+        }
+        if (invite.getUserId() != null) {
+            response.setUserId(invite.getUserId());
+        }
+        if (invite.getEmail() != null) {
             response.setEmail(invite.getEmail());
         }
 
diff --git a/server/src/main/java/com/cloud/api/query/dao/ProjectJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/ProjectJoinDaoImpl.java
index bedbaaa..3f384f3 100644
--- a/server/src/main/java/com/cloud/api/query/dao/ProjectJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/ProjectJoinDaoImpl.java
@@ -18,7 +18,10 @@
 
 import java.util.ArrayList;
 import java.util.EnumSet;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 import javax.inject.Inject;
@@ -35,9 +38,14 @@
 import com.cloud.api.query.vo.ProjectJoinVO;
 import com.cloud.api.query.vo.ResourceTagJoinVO;
 import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.cloud.projects.ProjectAccountVO;
+import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.server.ResourceTag.ResourceObjectType;
 import com.cloud.user.Account;
+import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -52,6 +60,10 @@
     private AccountJoinDao _accountJoinDao;
     @Inject
     private AccountDao _accountDao;
+    @Inject
+    private ProjectAccountDao projectAccountDao;
+    @Inject
+    private UserDao userDao;
 
     private final SearchBuilder<ProjectJoinVO> prjSearch;
 
@@ -82,7 +94,22 @@
         response.setDomainId(proj.getDomainUuid());
         response.setDomain(proj.getDomainName());
 
-        response.setOwner(proj.getOwner());
+        List<ProjectAccountVO> projectAccounts = projectAccountDao.listByProjectId(proj.getId());
+        projectAccounts = projectAccounts.stream().filter(projectAccount -> projectAccount.getAccountRole() == ProjectAccount.Role.Admin).collect(Collectors.toList());
+        List<Map<String, String>> ownersList = new ArrayList<>();
+        for (ProjectAccount projectAccount: projectAccounts) {
+            Map<String, String> ownerDetails = new HashMap<>();
+            if (projectAccount.getUserId() != null) {
+                User user = userDao.findById(projectAccount.getUserId());
+                ownerDetails.put("account", _accountDao.findById(projectAccount.getAccountId()).getAccountName());
+                ownerDetails.put("user", user.getUsername());
+                ownerDetails.put("userid", user.getUuid());
+            } else {
+                ownerDetails.put("account", _accountDao.findById(projectAccount.getAccountId()).getAccountName());
+            }
+            ownersList.add(ownerDetails);
+        }
+        response.setOwners(ownersList);
 
         // update tag information
         List<ResourceTagJoinVO> tags = ApiDBUtils.listResourceTagViewByResourceUUID(proj.getUuid(), ResourceObjectType.Project);
diff --git a/server/src/main/java/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java
index add6415..87b0374 100644
--- a/server/src/main/java/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java
@@ -17,7 +17,11 @@
 package com.cloud.api.query.dao;
 
 import java.util.List;
+import java.util.Map;
 
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.response.ServiceOfferingResponse;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -30,10 +34,15 @@
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
 
+import javax.inject.Inject;
+
 @Component
 public class ServiceOfferingJoinDaoImpl extends GenericDaoBase<ServiceOfferingJoinVO, Long> implements ServiceOfferingJoinDao {
     public static final Logger s_logger = Logger.getLogger(ServiceOfferingJoinDaoImpl.class);
 
+    @Inject
+    VsphereStoragePolicyDao _vsphereStoragePolicyDao;
+
     private SearchBuilder<ServiceOfferingJoinVO> sofIdSearch;
 
     protected ServiceOfferingJoinDaoImpl() {
@@ -99,11 +108,23 @@
         offeringResponse.setIopsWriteRate(offering.getIopsWriteRate());
         offeringResponse.setIopsWriteRateMax(offering.getIopsWriteRateMax());
         offeringResponse.setIopsWriteRateMaxLength(offering.getIopsWriteRateMaxLength());
-        offeringResponse.setDetails(ApiDBUtils.getResourceDetails(offering.getId(), ResourceObjectType.ServiceOffering));
+        Map<String, String> offeringDetails = ApiDBUtils.getResourceDetails(offering.getId(), ResourceObjectType.ServiceOffering);
+        offeringResponse.setDetails(offeringDetails);
         offeringResponse.setObjectName("serviceoffering");
         offeringResponse.setIscutomized(offering.isDynamic());
         offeringResponse.setCacheMode(offering.getCacheMode());
 
+        if (offeringDetails != null && !offeringDetails.isEmpty()) {
+            String vsphereStoragePolicyId = offeringDetails.get(ApiConstants.STORAGE_POLICY);
+            if (vsphereStoragePolicyId != null) {
+                VsphereStoragePolicyVO vsphereStoragePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(vsphereStoragePolicyId));
+                if (vsphereStoragePolicyVO != null)
+                    offeringResponse.setVsphereStoragePolicy(vsphereStoragePolicyVO.getName());
+            }
+        }
+
+        offeringResponse.setRootDiskSize(offering.getRootDiskSize());
+
         return offeringResponse;
     }
 
diff --git a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
index b8b312b..d2fe6a5 100644
--- a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
@@ -20,6 +20,7 @@
 import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.capacity.CapacityManager;
 import com.cloud.storage.DataStoreRole;
+import com.cloud.storage.Storage;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.StorageStats;
 import com.cloud.utils.StringUtils;
@@ -32,6 +33,9 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 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.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -52,6 +56,9 @@
     @Inject
     protected PrimaryDataStoreDao storagePoolDao;
 
+    @Inject
+    private StoragePoolDetailsDao storagePoolDetailsDao;
+
     private final SearchBuilder<StoragePoolJoinVO> spSearch;
 
     private final SearchBuilder<StoragePoolJoinVO> spIdSearch;
@@ -94,7 +101,20 @@
             poolResponse.setHypervisor(pool.getHypervisor().toString());
         }
 
+        StoragePoolDetailVO poolType = storagePoolDetailsDao.findDetail(pool.getId(), "pool_type");
+        if (poolType != null) {
+            poolResponse.setType(poolType.getValue());
+        }
         long allocatedSize = pool.getUsedCapacity() + pool.getReservedCapacity();
+        if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+            List<StoragePoolVO> childDatastores = storagePoolDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+            if (childDatastores != null) {
+                for (StoragePoolVO childDatastore: childDatastores) {
+                    StoragePoolJoinVO childDSJoinVO = findById(childDatastore.getId());
+                    allocatedSize += (childDSJoinVO.getUsedCapacity() + childDSJoinVO.getReservedCapacity());
+                }
+            }
+        }
         poolResponse.setDiskSizeTotal(pool.getCapacityBytes());
         poolResponse.setDiskSizeAllocated(allocatedSize);
         poolResponse.setCapacityIops(pool.getCapacityIops());
diff --git a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDao.java b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDao.java
index c9d7eba..58cb886 100644
--- a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDao.java
+++ b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDao.java
@@ -16,8 +16,10 @@
 // under the License.
 package com.cloud.api.query.dao;
 
+import java.util.EnumSet;
 import java.util.List;
 
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.response.TemplateResponse;
 
@@ -30,13 +32,13 @@
 
 public interface TemplateJoinDao extends GenericDao<TemplateJoinVO, Long> {
 
-    TemplateResponse newTemplateResponse(ResponseView view, TemplateJoinVO tmpl);
+    TemplateResponse newTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO tmpl);
 
     TemplateResponse newIsoResponse(TemplateJoinVO tmpl);
 
     TemplateResponse newUpdateResponse(TemplateJoinVO tmpl);
 
-    TemplateResponse setTemplateResponse(ResponseView view, TemplateResponse tmplData, TemplateJoinVO tmpl);
+    TemplateResponse setTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateResponse tmplData, TemplateJoinVO tmpl);
 
     List<TemplateJoinVO> newTemplateView(VirtualMachineTemplate tmpl);
 
diff --git a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
index 3c441e5..a9a971c 100644
--- a/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/TemplateJoinDaoImpl.java
@@ -17,6 +17,7 @@
 package com.cloud.api.query.dao;
 
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -25,6 +26,11 @@
 
 import javax.inject.Inject;
 
+import com.cloud.deployasis.DeployAsIsConstants;
+import com.cloud.deployasis.TemplateDeployAsIsDetailVO;
+import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.utils.security.DigestHelper;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -36,6 +42,9 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 
 import com.cloud.api.ApiDBUtils;
 import com.cloud.api.ApiResponseHelper;
@@ -70,7 +79,13 @@
     @Inject
     private VMTemplateDao _vmTemplateDao;
     @Inject
+    private TemplateDataStoreDao _templateStoreDao;
+    @Inject
+    private ImageStoreDao dataStoreDao;
+    @Inject
     private VMTemplateDetailsDao _templateDetailsDao;
+    @Inject
+    private TemplateDeployAsIsDetailsDao templateDeployAsIsDetailsDao;
 
     private final SearchBuilder<TemplateJoinVO> tmpltIdPairSearch;
 
@@ -108,6 +123,7 @@
         activeTmpltSearch.and("store_id", activeTmpltSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ);
         activeTmpltSearch.and("type", activeTmpltSearch.entity().getTemplateType(), SearchCriteria.Op.EQ);
         activeTmpltSearch.and("templateState", activeTmpltSearch.entity().getTemplateState(), SearchCriteria.Op.EQ);
+        activeTmpltSearch.and("public", activeTmpltSearch.entity().isPublicTemplate(), SearchCriteria.Op.EQ);
         activeTmpltSearch.done();
 
         // select distinct pair (template_id, zone_id)
@@ -140,8 +156,23 @@
     }
 
     @Override
-    public TemplateResponse newTemplateResponse(ResponseView view, TemplateJoinVO template) {
+    public TemplateResponse newTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO template) {
+        List<TemplateDataStoreVO> templatesInStore = _templateStoreDao.listByTemplateNotBypassed(template.getId());
+        List<Map<String, String>> downloadProgressDetails = new ArrayList();
+        HashMap<String, String> downloadDetailInImageStores = null;
+        for (TemplateDataStoreVO templateInStore : templatesInStore) {
+            downloadDetailInImageStores = new HashMap<>();
+            ImageStoreVO datastore = dataStoreDao.findById(templateInStore.getDataStoreId());
+            if (datastore != null) {
+                downloadDetailInImageStores.put("datastore", datastore.getName());
+                downloadDetailInImageStores.put("downloadPercent", Integer.toString(templateInStore.getDownloadPercent()));
+                downloadDetailInImageStores.put("downloadState", (templateInStore.getDownloadState() != null ? templateInStore.getDownloadState().toString() : ""));
+                downloadProgressDetails.add(downloadDetailInImageStores);
+            }
+        }
+
         TemplateResponse templateResponse = new TemplateResponse();
+        templateResponse.setDownloadProgress(downloadProgressDetails);
         templateResponse.setId(template.getUuid());
         templateResponse.setName(template.getName());
         templateResponse.setDisplayText(template.getDisplayText());
@@ -213,8 +244,12 @@
         }
 
         // set details map
-        Map<String, String> details = _templateDetailsDao.listDetailsKeyPairs(template.getId());
-        templateResponse.setDetails(details);
+        if (detailsView.contains(ApiConstants.DomainDetails.all)) {
+            Map<String, String> details = _templateDetailsDao.listDetailsKeyPairs(template.getId());
+            templateResponse.setDetails(details);
+
+            setDeployAsIsDetails(template, templateResponse);
+        }
 
         // update tag information
         long tag_id = template.getTagId();
@@ -223,6 +258,7 @@
         }
 
         templateResponse.setDirectDownload(template.isDirectDownload());
+        templateResponse.setDeployAsIs(template.isDeployAsIs());
         templateResponse.setRequiresHvm(template.isRequiresHvm());
 
         //set template children disks
@@ -245,6 +281,19 @@
         return templateResponse;
     }
 
+    private void setDeployAsIsDetails(TemplateJoinVO template, TemplateResponse templateResponse) {
+        if (template.isDeployAsIs()) {
+            List<TemplateDeployAsIsDetailVO> deployAsIsDetails = templateDeployAsIsDetailsDao.listDetails(template.getId());
+            for (TemplateDeployAsIsDetailVO deployAsIsDetailVO : deployAsIsDetails) {
+                if (deployAsIsDetailVO.getName().startsWith(DeployAsIsConstants.HARDWARE_ITEM_PREFIX)) {
+                    //Do not list hardware items
+                    continue;
+                }
+                templateResponse.addDeployAsIsDetail(deployAsIsDetailVO.getName(), deployAsIsDetailVO.getValue());
+            }
+        }
+    }
+
     //TODO: This is to keep compatibility with 4.1 API, where updateTemplateCmd and updateIsoCmd will return a simpler TemplateResponse
     // compared to listTemplates and listIsos.
     @Override
@@ -290,16 +339,13 @@
     }
 
     @Override
-    public TemplateResponse setTemplateResponse(ResponseView view, TemplateResponse templateResponse, TemplateJoinVO template) {
-
-        // update details map
-        if (template.getDetailName() != null) {
-            Map<String, String> details = templateResponse.getDetails();
-            if (details == null) {
-                details = new HashMap<>();
+    public TemplateResponse setTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateResponse templateResponse, TemplateJoinVO template) {
+        if (detailsView.contains(ApiConstants.DomainDetails.all)) {
+            // update details map
+            String key = template.getDetailName();
+            if (key != null) {
+                templateResponse.addDetail(key, template.getDetailValue());
             }
-            details.put(template.getDetailName(), template.getDetailValue());
-            templateResponse.setDetails(details);
         }
 
         // update tag information
@@ -480,13 +526,14 @@
         sc.setParameters("store_id", storeId);
         sc.setParameters("type", TemplateType.USER);
         sc.setParameters("templateState", VirtualMachineTemplate.State.Active);
+        sc.setParameters("public", Boolean.FALSE);
         return searchIncludingRemoved(sc, null, null, false);
     }
 
     @Override
     public Pair<List<TemplateJoinVO>, Integer> searchIncludingRemovedAndCount(final SearchCriteria<TemplateJoinVO> sc, final Filter filter) {
         List<TemplateJoinVO> objects = searchIncludingRemoved(sc, filter, null, false);
-        Integer count = getCount(sc);
+        Integer count = getCountIncludingRemoved(sc);
         return new Pair<List<TemplateJoinVO>, Integer>(objects, count);
     }
 
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 80c433a..8e489f8 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
@@ -322,8 +322,8 @@
         if (vmDetails != null) {
             Map<String, String> resourceDetails = new HashMap<String, String>();
             for (UserVmDetailVO userVmDetailVO : vmDetails) {
-                if (!userVmDetailVO.getName().startsWith(ApiConstants.OVF_PROPERTIES) ||
-                        (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.OVF_PROPERTIES))) {
+                if (!userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES) ||
+                        (UserVmManager.DisplayVMOVFProperties.value() && userVmDetailVO.getName().startsWith(ApiConstants.PROPERTIES))) {
                     resourceDetails.put(userVmDetailVO.getName(), userVmDetailVO.getValue());
                 }
                 if ((ApiConstants.BootType.UEFI.toString()).equalsIgnoreCase(userVmDetailVO.getName())) {
diff --git a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java
index c797735..2ee0ca1 100644
--- a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java
@@ -24,6 +24,8 @@
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.response.VolumeResponse;
 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.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -51,6 +53,8 @@
     public AccountManager _accountMgr;
     @Inject
     private VmDiskStatisticsDao vmDiskStatsDao;
+    @Inject
+    private PrimaryDataStoreDao primaryDataStoreDao;
 
     private final SearchBuilder<VolumeJoinVO> volSearch;
 
@@ -220,6 +224,14 @@
             String poolName = (poolId == null) ? "none" : volume.getPoolName();
             volResponse.setStoragePoolName(poolName);
             volResponse.setStoragePoolId(volume.getPoolUuid());
+            if (poolId != null) {
+                StoragePoolVO poolVO = primaryDataStoreDao.findById(poolId);
+                if (poolVO != null && poolVO.getParent() != 0L) {
+                    StoragePoolVO datastoreClusterVO = primaryDataStoreDao.findById(poolVO.getParent());
+                    volResponse.setStoragePoolName(datastoreClusterVO.getName());
+                    volResponse.setStoragePoolId(datastoreClusterVO.getUuid());
+                }
+            }
         }
 
         volResponse.setAttached(volume.getAttached());
diff --git a/server/src/main/java/com/cloud/api/query/vo/DiskOfferingJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/DiskOfferingJoinVO.java
index 50559c7..707c2a3 100644
--- a/server/src/main/java/com/cloud/api/query/vo/DiskOfferingJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/DiskOfferingJoinVO.java
@@ -159,6 +159,9 @@
     @Column(name = "state")
     DiskOffering.State state;
 
+    @Column(name = "vsphere_storage_policy")
+    String vsphereStoragePolicy;
+
     public DiskOfferingJoinVO() {
     }
 
@@ -343,4 +346,8 @@
     public void setState(DiskOffering.State state) {
         this.state = state;
     }
+
+    public String getVsphereStoragePolicy() {
+        return vsphereStoragePolicy;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/HostJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/HostJoinVO.java
index 2afe191..d7a3bfe 100644
--- a/server/src/main/java/com/cloud/api/query/vo/HostJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/HostJoinVO.java
@@ -16,6 +16,7 @@
 // under the License.
 package com.cloud.api.query.vo;
 
+import java.util.Arrays;
 import java.util.Date;
 
 import javax.persistence.Column;
@@ -402,4 +403,10 @@
     public boolean isAnnotated() {
         return StringUtils.isNotBlank(annotation);
     }
+
+    public boolean isInMaintenanceStates() {
+        return Arrays.asList(
+                    ResourceState.Maintenance, ResourceState.ErrorInMaintenance, ResourceState.PrepareForMaintenance)
+                .contains(getResourceState());
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/ImageStoreJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/ImageStoreJoinVO.java
index 244f89e..bcc73cb 100644
--- a/server/src/main/java/com/cloud/api/query/vo/ImageStoreJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/ImageStoreJoinVO.java
@@ -67,6 +67,9 @@
     @Enumerated(value = EnumType.STRING)
     private DataStoreRole role;
 
+    @Column(name = "readonly")
+    private boolean readonly = false;
+
     @Column(name = "data_center_id")
     private long zoneId;
 
@@ -128,4 +131,8 @@
     public Date getRemoved() {
         return removed;
     }
+
+    public boolean isReadonly() {
+        return readonly;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/ProjectAccountJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/ProjectAccountJoinVO.java
index 4766de4..473b241 100644
--- a/server/src/main/java/com/cloud/api/query/vo/ProjectAccountJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/ProjectAccountJoinVO.java
@@ -72,6 +72,21 @@
     @Column(name = "project_name")
     private String projectName;
 
+    @Column(name = "user_id")
+    private Long userId;
+
+    @Column(name = "user_name")
+    private String username;
+
+    @Column(name = "project_role_id")
+    private Long projectRoleId;
+
+    @Column(name = "project_role_uuid")
+    private String projectRoleUuid;
+
+    @Column(name = "user_uuid")
+    private String userUuid;
+
     public ProjectAccountJoinVO() {
     }
 
@@ -127,4 +142,21 @@
     public String getProjectName() {
         return projectName;
     }
+
+    public Long getUserId() { return  userId; }
+
+    public Long getProjectRoleId() {
+        return projectRoleId;
+    }
+
+    public String getProjectRoleUuid() {
+        return projectRoleUuid;
+    }
+
+    public String getUserUuid() { return userUuid; }
+
+    public String getUsername() {
+        return username;
+    }
+
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/ProjectInvitationJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/ProjectInvitationJoinVO.java
index 8b49185..3c2d21c 100644
--- a/server/src/main/java/com/cloud/api/query/vo/ProjectInvitationJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/ProjectInvitationJoinVO.java
@@ -83,6 +83,9 @@
     @Column(name = "project_name")
     private String projectName;
 
+    @Column(name = "user_id")
+    private String userId;
+
     public ProjectInvitationJoinVO() {
     }
 
@@ -162,6 +165,8 @@
         return domainPath;
     }
 
+    public String getUserId() { return userId; }
+
     @Override
     public Class<?> getEntityType() {
         return ProjectInvitation.class;
diff --git a/server/src/main/java/com/cloud/api/query/vo/ProjectJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/ProjectJoinVO.java
index b17c9ff..4c7b624 100644
--- a/server/src/main/java/com/cloud/api/query/vo/ProjectJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/ProjectJoinVO.java
@@ -76,6 +76,9 @@
     @Column(name = "domain_path")
     private String domainPath;
 
+    @Column(name = "user_id")
+    private long userId;
+
     @Column(name = "project_account_id")
     private long projectAccountId;
 
@@ -139,4 +142,8 @@
     public long getProjectAccountId() {
         return projectAccountId;
     }
+
+    public long getUserId() {
+        return userId;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/ServiceOfferingJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/ServiceOfferingJoinVO.java
index 4f8932a..4d9b2cd 100644
--- a/server/src/main/java/com/cloud/api/query/vo/ServiceOfferingJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/ServiceOfferingJoinVO.java
@@ -175,6 +175,24 @@
     @Column(name = "cache_mode")
     String cacheMode;
 
+    @Column(name = "min_cpu")
+    Integer minCpu;
+
+    @Column(name = "max_cpu")
+    Integer maxCpu;
+
+    @Column(name = "min_memory")
+    Integer minMemory;
+
+    @Column(name = "max_memory")
+    Integer maxMemory;
+
+    @Column(name = "vsphere_storage_policy")
+    String vsphereStoragePolicy;
+
+    @Column(name = "root_disk_size")
+    private Long rootDiskSize;
+
     public ServiceOfferingJoinVO() {
     }
 
@@ -348,7 +366,6 @@
 
     public Long getIopsWriteRateMaxLength() { return iopsWriteRateMaxLength; }
 
-
     public boolean isDynamic() {
         return cpu == null || speed == null || ramSize == null;
     }
@@ -356,4 +373,28 @@
     public String getCacheMode() {
         return cacheMode;
     }
+
+    public Integer getMinCpu() {
+        return minCpu;
+    }
+
+    public Integer getMaxCpu() {
+        return maxCpu;
+    }
+
+    public Integer getMinMemory() {
+        return minMemory;
+    }
+
+    public Integer getMaxMemory() {
+        return maxMemory;
+    }
+
+    public String getVsphereStoragePolicy() {
+        return vsphereStoragePolicy;
+    }
+
+    public Long getRootDiskSize() {
+        return rootDiskSize ;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/StoragePoolJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/StoragePoolJoinVO.java
index 565e290..1831aaa 100644
--- a/server/src/main/java/com/cloud/api/query/vo/StoragePoolJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/StoragePoolJoinVO.java
@@ -139,6 +139,9 @@
     @Column(name = "storage_provider_name")
     private String storageProviderName;
 
+    @Column(name = "parent")
+    private Long parent;
+
     /**
      * @return the scope
      */
@@ -263,4 +266,8 @@
     public String getStorageProviderName() {
         return storageProviderName;
     }
+
+    public Long getParent() {
+        return parent;
+    }
 }
diff --git a/server/src/main/java/com/cloud/api/query/vo/TemplateJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/TemplateJoinVO.java
index 25e3b0b..91bb763 100644
--- a/server/src/main/java/com/cloud/api/query/vo/TemplateJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/TemplateJoinVO.java
@@ -231,6 +231,9 @@
     @Column(name = "direct_download")
     private boolean directDownload;
 
+    @Column(name = "deploy_as_is")
+    private boolean deployAsIs;
+
     public TemplateJoinVO() {
     }
 
@@ -490,6 +493,10 @@
         return directDownload;
     }
 
+    public boolean isDeployAsIs() {
+        return deployAsIs;
+    }
+
     public Object getParentTemplateId() {
         return parentTemplateId;
     }
diff --git a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
index f851471..fba24e0 100644
--- a/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/main/java/com/cloud/capacity/CapacityManagerImpl.java
@@ -95,6 +95,8 @@
 import com.cloud.vm.dao.VMInstanceDao;
 import com.cloud.vm.snapshot.dao.VMSnapshotDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class CapacityManagerImpl extends ManagerBase implements CapacityManager, StateListener<State, VirtualMachine.Event, VirtualMachine>, Listener, ResourceListener,
         Configurable {
     private static final Logger s_logger = Logger.getLogger(CapacityManagerImpl.class);
@@ -217,7 +219,7 @@
                     long totalCpu = (long)(actualTotalCpu * cpuOvercommitRatio);
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
-                        s_logger.debug("Hosts's actual total RAM: " + actualTotalMem + " and RAM after applying overprovisioning: " + totalMem);
+                        s_logger.debug("Hosts's actual total RAM: " + toHumanReadableSize(actualTotalMem) + " and RAM after applying overprovisioning: " + toHumanReadableSize(totalMem));
                     }
 
                     if (!moveFromReserved) {
@@ -257,8 +259,8 @@
                         ", total with overprovisioning: " + totalCpu + "; new used: " + capacityCpu.getUsedCapacity() + ",reserved:" + capacityCpu.getReservedCapacity() +
                         "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
 
-                    s_logger.debug("release mem from host: " + hostId + ", old used: " + usedMem + ",reserved: " + reservedMem + ", total: " + totalMem + "; new used: " +
-                        capacityMemory.getUsedCapacity() + ",reserved:" + capacityMemory.getReservedCapacity() + "; movedfromreserved: " + moveFromReserved +
+                    s_logger.debug("release mem from host: " + hostId + ", old used: " + toHumanReadableSize(usedMem) + ",reserved: " + toHumanReadableSize(reservedMem) + ", total: " + toHumanReadableSize(totalMem) + "; new used: " +
+                            toHumanReadableSize(capacityMemory.getUsedCapacity()) + ",reserved:" + toHumanReadableSize(capacityMemory.getReservedCapacity()) + "; movedfromreserved: " + moveFromReserved +
                         ",moveToReservered" + moveToReservered);
 
                     _capacityDao.update(capacityCpu.getId(), capacityCpu);
@@ -332,7 +334,7 @@
                     if (s_logger.isDebugEnabled()) {
                         s_logger.debug("We are allocating VM, increasing the used capacity of this host:" + hostId);
                         s_logger.debug("Current Used CPU: " + usedCpu + " , Free CPU:" + freeCpu + " ,Requested CPU: " + cpu);
-                        s_logger.debug("Current Used RAM: " + usedMem + " , Free RAM:" + freeMem + " ,Requested RAM: " + ram);
+                        s_logger.debug("Current Used RAM: " + toHumanReadableSize(usedMem) + " , Free RAM:" + toHumanReadableSize(freeMem) + " ,Requested RAM: " + toHumanReadableSize(ram));
                     }
                     capacityCpu.setUsedCapacity(usedCpu + cpu);
                     capacityMem.setUsedCapacity(usedMem + ram);
@@ -343,7 +345,7 @@
                         if (s_logger.isDebugEnabled()) {
                             s_logger.debug("We are allocating VM to the last host again, so adjusting the reserved capacity if it is not less than required");
                             s_logger.debug("Reserved CPU: " + reservedCpu + " , Requested CPU: " + cpu);
-                            s_logger.debug("Reserved RAM: " + reservedMem + " , Requested RAM: " + ram);
+                            s_logger.debug("Reserved RAM: " + toHumanReadableSize(reservedMem) + " , Requested RAM: " + toHumanReadableSize(ram));
                         }
                         if (reservedCpu >= cpu && reservedMem >= ram) {
                             capacityCpu.setReservedCapacity(reservedCpu - cpu);
@@ -364,8 +366,8 @@
                         actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used:" + capacityCpu.getUsedCapacity() + ", reserved:" +
                         capacityCpu.getReservedCapacity() + "; requested cpu:" + cpu + ",alloc_from_last:" + fromLastHost);
 
-                    s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + usedMem + ", old reserved: " + reservedMem + ", total: " +
-                        totalMem + "; new used: " + capacityMem.getUsedCapacity() + ", reserved: " + capacityMem.getReservedCapacity() + "; requested mem: " + ram +
+                    s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + toHumanReadableSize(usedMem) + ", old reserved: " + toHumanReadableSize(reservedMem) + ", total: " +
+                            toHumanReadableSize(totalMem) + "; new used: " + toHumanReadableSize(capacityMem.getUsedCapacity()) + ", reserved: " + toHumanReadableSize(capacityMem.getReservedCapacity()) + "; requested mem: " + toHumanReadableSize(ram) +
                         ",alloc_from_last:" + fromLastHost);
 
                     long cluster_id = host.getClusterId();
@@ -432,7 +434,7 @@
         boolean hasCapacity = false;
 
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Checking if host: " + hostId + " has enough capacity for requested CPU: " + cpu + " and requested RAM: " + ram +
+            s_logger.debug("Checking if host: " + hostId + " has enough capacity for requested CPU: " + cpu + " and requested RAM: " + toHumanReadableSize(ram) +
                 " , cpuOverprovisioningFactor: " + cpuOvercommitRatio);
         }
 
@@ -474,7 +476,7 @@
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("We need to allocate to the last host again, so checking if there is enough reserved capacity");
                 s_logger.debug("Reserved CPU: " + freeCpu + " , Requested CPU: " + cpu);
-                s_logger.debug("Reserved RAM: " + freeMem + " , Requested RAM: " + ram);
+                s_logger.debug("Reserved RAM: " + toHumanReadableSize(freeMem) + " , Requested RAM: " + toHumanReadableSize(ram));
             }
             /* alloc from reserved */
             if (reservedCpu >= cpu) {
@@ -503,7 +505,7 @@
 
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Free CPU: " + freeCpu + " , Requested CPU: " + cpu);
-                s_logger.debug("Free RAM: " + freeMem + " , Requested RAM: " + ram);
+                s_logger.debug("Free RAM: " + toHumanReadableSize(freeMem) + " , Requested RAM: " + toHumanReadableSize(ram));
             }
             /* alloc from free resource */
             if ((reservedCpuValueToUse + usedCpu + cpu <= totalCpu)) {
@@ -526,17 +528,17 @@
                 ", total with overprovisioning: " + totalCpu + "; requested cpu:" + cpu + ",alloc_from_last_host?:" + checkFromReservedCapacity +
                 " ,considerReservedCapacity?: " + considerReservedCapacity);
 
-            s_logger.debug("STATS: Can alloc MEM from host: " + hostId + ", used: " + usedMem + ", reserved: " + reservedMem + ", total: " + totalMem +
-                "; requested mem: " + ram + ",alloc_from_last_host?:" + checkFromReservedCapacity + " ,considerReservedCapacity?: " + considerReservedCapacity);
+            s_logger.debug("STATS: Can alloc MEM from host: " + hostId + ", used: " + toHumanReadableSize(usedMem) + ", reserved: " + toHumanReadableSize(reservedMem) + ", total: " + toHumanReadableSize(totalMem) +
+                "; requested mem: " + toHumanReadableSize(ram) + ", alloc_from_last_host?: " + checkFromReservedCapacity + " , considerReservedCapacity?: " + considerReservedCapacity);
         } else {
 
             if (checkFromReservedCapacity) {
                 s_logger.debug("STATS: Failed to alloc resource from host: " + hostId + " reservedCpu: " + reservedCpu + ", requested cpu: " + cpu + ", reservedMem: " +
-                    reservedMem + ", requested mem: " + ram);
+                        toHumanReadableSize(reservedMem) + ", requested mem: " + toHumanReadableSize(ram));
             } else {
-                s_logger.debug("STATS: Failed to alloc resource from host: " + hostId + " reservedCpu: " + reservedCpu + ", used cpu: " + usedCpu + ", requested cpu: " +
-                    cpu + ", actual total cpu: " + actualTotalCpu + ", total cpu with overprovisioning: " + totalCpu + ", reservedMem: " + reservedMem + ", used Mem: " +
-                    usedMem + ", requested mem: " + ram + ", total Mem:" + totalMem + " ,considerReservedCapacity?: " + considerReservedCapacity);
+                s_logger.debug("STATS: Failed to alloc resource from host: " + hostId + ", reservedCpu: " + reservedCpu + ", used cpu: " + usedCpu + ", requested cpu: " +
+                    cpu + ", actual total cpu: " + actualTotalCpu + ", total cpu with overprovisioning: " + totalCpu + ", reservedMem: " + toHumanReadableSize(reservedMem) + ", used Mem: " +
+                    toHumanReadableSize(usedMem) + ", requested mem: " + toHumanReadableSize(ram) + ", total Mem:" + toHumanReadableSize(totalMem) + " ,considerReservedCapacity?: " + considerReservedCapacity);
             }
 
             if (s_logger.isDebugEnabled()) {
@@ -833,8 +835,8 @@
             }
 
             if (memCap.getTotalCapacity() != host.getTotalMemory()) {
-                s_logger.debug("Calibrate total memory for host: " + host.getId() + " old total memory:" + memCap.getTotalCapacity() + " new total memory:" +
-                    host.getTotalMemory());
+                s_logger.debug("Calibrate total memory for host: " + host.getId() + " old total memory:" + toHumanReadableSize(memCap.getTotalCapacity()) + " new total memory:" +
+                        toHumanReadableSize(host.getTotalMemory()));
                 memCap.setTotalCapacity(host.getTotalMemory());
 
             }
@@ -845,8 +847,8 @@
             }
 
             if (memCap.getUsedCapacity() == usedMemory && memCap.getReservedCapacity() == reservedMemory) {
-                s_logger.debug("No need to calibrate memory capacity, host:" + host.getId() + " usedMem: " + memCap.getUsedCapacity() + " reservedMem: " +
-                    memCap.getReservedCapacity());
+                s_logger.debug("No need to calibrate memory capacity, host:" + host.getId() + " usedMem: " + toHumanReadableSize(memCap.getUsedCapacity()) + " reservedMem: " +
+                        toHumanReadableSize(memCap.getReservedCapacity()));
             } else {
                 if (memCap.getReservedCapacity() != reservedMemory) {
                     s_logger.debug("Calibrate reserved memory for host: " + host.getId() + " old reservedMem:" + memCap.getReservedCapacity() + " new reservedMem:" +
@@ -859,7 +861,7 @@
                      * state(starting/migrating) that I don't know on which host
                      * they are allocated
                      */
-                    s_logger.debug("Calibrate used memory for host: " + host.getId() + " old usedMem: " + memCap.getUsedCapacity() + " new usedMem: " + usedMemory);
+                    s_logger.debug("Calibrate used memory for host: " + host.getId() + " old usedMem: " + toHumanReadableSize(memCap.getUsedCapacity()) + " new usedMem: " + toHumanReadableSize(usedMemory));
                     memCap.setUsedCapacity(usedMemory);
                 }
             }
@@ -1033,7 +1035,7 @@
                     CapacityVOMem.setReservedCapacity(0);
                     CapacityVOMem.setTotalCapacity(newTotalMem);
                 } else {
-                    s_logger.debug("What? new cpu is :" + newTotalMem + ", old one is " + CapacityVOMem.getUsedCapacity() + "," + CapacityVOMem.getReservedCapacity() +
+                    s_logger.debug("What? new mem is :" + newTotalMem + ", old one is " + CapacityVOMem.getUsedCapacity() + "," + CapacityVOMem.getReservedCapacity() +
                         "," + CapacityVOMem.getTotalCapacity());
                 }
                 _capacityDao.update(CapacityVOMem.getId(), CapacityVOMem);
diff --git a/server/src/main/java/com/cloud/configuration/Config.java b/server/src/main/java/com/cloud/configuration/Config.java
index 3daf720..17418d8 100644
--- a/server/src/main/java/com/cloud/configuration/Config.java
+++ b/server/src/main/java/com/cloud/configuration/Config.java
@@ -1525,7 +1525,7 @@
     AllowUserToCreateProject(
             "Project Defaults",
             ManagementServer.class,
-            Long.class,
+            Boolean.class,
             "allow.user.create.projects",
             "true",
             "If regular user can create a project; true by default",
diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index 5534b74..1db461d 100755
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -39,6 +39,8 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
+import com.cloud.storage.Storage;
 import org.apache.cloudstack.acl.SecurityChecker;
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -240,6 +242,7 @@
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.NicIpAlias;
 import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.dao.NicDao;
 import com.cloud.vm.dao.NicIpAliasDao;
 import com.cloud.vm.dao.NicIpAliasVO;
@@ -386,6 +389,9 @@
     IndirectAgentLB _indirectAgentLB;
     @Inject
     private VMTemplateZoneDao templateZoneDao;
+    @Inject
+    VsphereStoragePolicyDao vsphereStoragePolicyDao;
+
 
     // FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao?
     @Inject
@@ -409,6 +415,12 @@
             "Maximum IOPS read burst duration (seconds). If '0' (zero) then does not check for maximum burst length.", true, ConfigKey.Scope.Global, null);
     public final static ConfigKey<Long> IOPS_MAX_WRITE_LENGTH = new ConfigKey<Long>(Long.class, "vm.disk.iops.maximum.write.length", "Advanced", "0",
             "Maximum IOPS write burst duration (seconds). If '0' (zero) then does not check for maximum burst length.", true, ConfigKey.Scope.Global, null);
+    public static final ConfigKey<Boolean> ADD_HOST_ON_SERVICE_RESTART_KVM = new ConfigKey<Boolean>(Boolean.class, "add.host.on.service.restart.kvm", "Advanced", "true",
+            "Indicates whether the host will be added back to cloudstack after restarting agent service on host. If false it wont be added back even after service restart",
+            true, ConfigKey.Scope.Global, null);
+    public static final ConfigKey<Boolean> SET_HOST_DOWN_TO_MAINTENANCE = new ConfigKey<Boolean>(Boolean.class, "set.host.down.to.maintenance", "Advanced", "false",
+                        "Indicates whether the host in down state can be put into maintenance state so thats its not enabled after it comes back.",
+                        true, ConfigKey.Scope.Zone, null);
 
     private static final String IOPS_READ_RATE = "IOPS Read";
     private static final String IOPS_WRITE_RATE = "IOPS Write";
@@ -420,6 +432,8 @@
 
     private static final Set<Provider> VPC_ONLY_PROVIDERS = Sets.newHashSet(Provider.VPCVirtualRouter, Provider.JuniperContrailVpcRouter, Provider.InternalLbVm);
 
+    private static final long GiB_TO_BYTES = 1024 * 1024 * 1024;
+
     @Override
     public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
         final String maxVolumeSizeInGbString = _configDao.getValue(Config.MaxVolumeSize.key());
@@ -593,6 +607,12 @@
                 }
 
                 _storagePoolDetailsDao.addDetail(resourceId, name, value, true);
+                if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                    List<StoragePoolVO> childDataStores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(resourceId);
+                    for (StoragePoolVO childDataStore: childDataStores) {
+                        _storagePoolDetailsDao.addDetail(childDataStore.getId(), name, value, true);
+                    }
+                }
 
                 break;
 
@@ -1708,7 +1728,7 @@
         }
 
         //check if there are any secondary stores attached to the zone
-        if(!_imageStoreDao.findByScope(new ZoneScope(zoneId)).isEmpty()) {
+        if(!_imageStoreDao.findByZone(new ZoneScope(zoneId), null).isEmpty()) {
             throw new CloudRuntimeException(errorMsg + "there are Secondary storages in this zone");
         }
 
@@ -2340,14 +2360,16 @@
                 details.put(ApiConstants.MAX_CPU_NUMBER, maxCPU.toString());
             }
         } else {
-            if (cpuNumber != null && (cpuNumber.intValue() <= 0 || cpuNumber.longValue() > Integer.MAX_VALUE)) {
-                throw new InvalidParameterValueException("Failed to create service offering " + offeringName + ": specify the cpu number value between 1 and " + Integer.MAX_VALUE);
+            Integer maxCPUCores = VirtualMachineManager.VmServiceOfferingMaxCPUCores.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxCPUCores.value();
+            Integer maxRAMSize = VirtualMachineManager.VmServiceOfferingMaxRAMSize.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxRAMSize.value();
+            if (cpuNumber != null && (cpuNumber.intValue() <= 0 || cpuNumber.longValue() > maxCPUCores)) {
+                throw new InvalidParameterValueException("Failed to create service offering " + offeringName + ": specify the cpu number value between 1 and " + maxCPUCores);
             }
             if (cpuSpeed == null || (cpuSpeed.intValue() < 0 || cpuSpeed.longValue() > Integer.MAX_VALUE)) {
                 throw new InvalidParameterValueException("Failed to create service offering " + offeringName + ": specify the cpu speed value between 0 and " + Integer.MAX_VALUE);
             }
-            if (memory != null && (memory.intValue() < 32 || memory.longValue() > Integer.MAX_VALUE)) {
-                throw new InvalidParameterValueException("Failed to create service offering " + offeringName + ": specify the memory value between 32 and " + Integer.MAX_VALUE + " MB");
+            if (memory != null && (memory.intValue() < 32 || memory.longValue() > maxRAMSize)) {
+                throw new InvalidParameterValueException("Failed to create service offering " + offeringName + ": specify the memory value between 32 and " + maxRAMSize + " MB");
             }
         }
 
@@ -2444,25 +2466,32 @@
             }
         }
 
+        final Long storagePolicyId = cmd.getStoragePolicy();
+        if (storagePolicyId != null) {
+            if (vsphereStoragePolicyDao.findById(storagePolicyId) == null) {
+                throw new InvalidParameterValueException("Please specify a valid vSphere storage policy id");
+            }
+        }
+
         return createServiceOffering(userId, cmd.isSystem(), vmType, cmd.getServiceOfferingName(), cpuNumber, memory, cpuSpeed, cmd.getDisplayText(),
                 cmd.getProvisioningType(), localStorageRequired, offerHA, limitCpuUse, volatileVm, cmd.getTags(), cmd.getDomainIds(), cmd.getZoneIds(), cmd.getHostTag(),
-                cmd.getNetworkRate(), cmd.getDeploymentPlanner(), details, isCustomizedIops, cmd.getMinIops(), cmd.getMaxIops(),
+                cmd.getNetworkRate(), cmd.getDeploymentPlanner(), details, cmd.getRootDiskSize(), isCustomizedIops, cmd.getMinIops(), cmd.getMaxIops(),
                 cmd.getBytesReadRate(), cmd.getBytesReadRateMax(), cmd.getBytesReadRateMaxLength(),
                 cmd.getBytesWriteRate(), cmd.getBytesWriteRateMax(), cmd.getBytesWriteRateMaxLength(),
                 cmd.getIopsReadRate(), cmd.getIopsReadRateMax(), cmd.getIopsReadRateMaxLength(),
                 cmd.getIopsWriteRate(), cmd.getIopsWriteRateMax(), cmd.getIopsWriteRateMaxLength(),
-                cmd.getHypervisorSnapshotReserve(), cmd.getCacheMode());
+                cmd.getHypervisorSnapshotReserve(), cmd.getCacheMode(), storagePolicyId);
     }
 
     protected ServiceOfferingVO createServiceOffering(final long userId, final boolean isSystem, final VirtualMachine.Type vmType,
             final String name, final Integer cpu, final Integer ramSize, final Integer speed, final String displayText, final String provisioningType, final boolean localStorageRequired,
             final boolean offerHA, final boolean limitResourceUse, final boolean volatileVm, String tags, final List<Long> domainIds, List<Long> zoneIds, final String hostTag,
-            final Integer networkRate, final String deploymentPlanner, final Map<String, String> details, final Boolean isCustomizedIops, Long minIops, Long maxIops,
+            final Integer networkRate, final String deploymentPlanner, final Map<String, String> details, Long rootDiskSizeInGiB, final Boolean isCustomizedIops, Long minIops, Long maxIops,
             Long bytesReadRate, Long bytesReadRateMax, Long bytesReadRateMaxLength,
             Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength,
             Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength,
             Long iopsWriteRate, Long iopsWriteRateMax, Long iopsWriteRateMaxLength,
-            final Integer hypervisorSnapshotReserve, String cacheMode) {
+            final Integer hypervisorSnapshotReserve, String cacheMode, final Long storagePolicyID) {
         // Filter child domains when both parent and child domains are present
         List<Long> filteredDomainIds = filterChildSubDomains(domainIds);
 
@@ -2518,47 +2547,20 @@
             }
         }
 
+        if (rootDiskSizeInGiB != null && rootDiskSizeInGiB <= 0L) {
+            throw new InvalidParameterValueException(String.format("The Root disk size is of %s GB but it must be greater than 0.", rootDiskSizeInGiB));
+        } else if (rootDiskSizeInGiB != null) {
+            long rootDiskSizeInBytes = rootDiskSizeInGiB * GiB_TO_BYTES;
+            offering.setDiskSize(rootDiskSizeInBytes);
+        }
 
         offering.setCustomizedIops(isCustomizedIops);
         offering.setMinIops(minIops);
         offering.setMaxIops(maxIops);
 
-        if (bytesReadRate != null && bytesReadRate > 0) {
-            offering.setBytesReadRate(bytesReadRate);
-        }
-        if (bytesReadRateMax != null && bytesReadRateMax > 0) {
-            offering.setBytesReadRateMax(bytesReadRateMax);
-        }
-        if (bytesReadRateMaxLength != null && bytesReadRateMaxLength > 0) {
-            offering.setBytesReadRateMaxLength(bytesReadRateMaxLength);
-        }
-        if (bytesWriteRate != null && bytesWriteRate > 0) {
-            offering.setBytesWriteRate(bytesWriteRate);
-        }
-        if (bytesWriteRateMax != null && bytesWriteRateMax > 0) {
-            offering.setBytesWriteRateMax(bytesWriteRateMax);
-        }
-        if (bytesWriteRateMaxLength != null && bytesWriteRateMaxLength > 0) {
-            offering.setBytesWriteRateMaxLength(bytesWriteRateMaxLength);
-        }
-        if (iopsReadRate != null && iopsReadRate > 0) {
-            offering.setIopsReadRate(iopsReadRate);
-        }
-        if (iopsReadRateMax != null && iopsReadRateMax > 0) {
-            offering.setIopsReadRateMax(iopsReadRateMax);
-        }
-        if (iopsReadRateMaxLength != null && iopsReadRateMaxLength > 0) {
-            offering.setIopsReadRateMaxLength(iopsReadRateMaxLength);
-        }
-        if (iopsWriteRate != null && iopsWriteRate > 0) {
-            offering.setIopsWriteRate(iopsWriteRate);
-        }
-        if (iopsWriteRateMax != null && iopsWriteRateMax > 0) {
-            offering.setIopsWriteRateMax(iopsWriteRateMax);
-        }
-        if (iopsWriteRateMaxLength != null && iopsWriteRateMaxLength > 0) {
-            offering.setIopsWriteRateMaxLength(iopsWriteRateMaxLength);
-        }
+        setBytesRate(offering, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength);
+        setIopsRate(offering, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength);
+
         if(cacheMode != null) {
             offering.setCacheMode(DiskOffering.DiskCacheMode.valueOf(cacheMode.toUpperCase()));
         }
@@ -2602,6 +2604,10 @@
             }
         }
 
+        if (storagePolicyID != null) {
+            detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false));
+        }
+
         if ((offering = _serviceOfferingDao.persist(offering)) != null) {
             for (Long domainId : filteredDomainIds) {
                 detailsVO.add(new ServiceOfferingDetailsVO(offering.getId(), ApiConstants.DOMAIN_ID, String.valueOf(domainId), false));
@@ -2624,6 +2630,48 @@
         }
     }
 
+    private void setIopsRate(DiskOffering offering, Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength, Long iopsWriteRate, Long iopsWriteRateMax, Long iopsWriteRateMaxLength) {
+        if (iopsReadRate != null && iopsReadRate > 0) {
+            offering.setIopsReadRate(iopsReadRate);
+        }
+        if (iopsReadRateMax != null && iopsReadRateMax > 0) {
+            offering.setIopsReadRateMax(iopsReadRateMax);
+        }
+        if (iopsReadRateMaxLength != null && iopsReadRateMaxLength > 0) {
+            offering.setIopsReadRateMaxLength(iopsReadRateMaxLength);
+        }
+        if (iopsWriteRate != null && iopsWriteRate > 0) {
+            offering.setIopsWriteRate(iopsWriteRate);
+        }
+        if (iopsWriteRateMax != null && iopsWriteRateMax > 0) {
+            offering.setIopsWriteRateMax(iopsWriteRateMax);
+        }
+        if (iopsWriteRateMaxLength != null && iopsWriteRateMaxLength > 0) {
+            offering.setIopsWriteRateMaxLength(iopsWriteRateMaxLength);
+        }
+    }
+
+    private void setBytesRate(DiskOffering offering, Long bytesReadRate, Long bytesReadRateMax, Long bytesReadRateMaxLength, Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength) {
+        if (bytesReadRate != null && bytesReadRate > 0) {
+            offering.setBytesReadRate(bytesReadRate);
+        }
+        if (bytesReadRateMax != null && bytesReadRateMax > 0) {
+            offering.setBytesReadRateMax(bytesReadRateMax);
+        }
+        if (bytesReadRateMaxLength != null && bytesReadRateMaxLength > 0) {
+            offering.setBytesReadRateMaxLength(bytesReadRateMaxLength);
+        }
+        if (bytesWriteRate != null && bytesWriteRate > 0) {
+            offering.setBytesWriteRate(bytesWriteRate);
+        }
+        if (bytesWriteRateMax != null && bytesWriteRateMax > 0) {
+            offering.setBytesWriteRateMax(bytesWriteRateMax);
+        }
+        if (bytesWriteRateMaxLength != null && bytesWriteRateMaxLength > 0) {
+            offering.setBytesWriteRateMaxLength(bytesWriteRateMaxLength);
+        }
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_SERVICE_OFFERING_EDIT, eventDescription = "updating service offering")
     public ServiceOffering updateServiceOffering(final UpdateServiceOfferingCmd cmd) {
@@ -2820,7 +2868,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 Integer hypervisorSnapshotReserve, String cacheMode, 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.");
@@ -2890,42 +2938,9 @@
         newDiskOffering.setUseLocalStorage(localStorageRequired);
         newDiskOffering.setDisplayOffering(isDisplayOfferingEnabled);
 
-        if (bytesReadRate != null && bytesReadRate > 0) {
-            newDiskOffering.setBytesReadRate(bytesReadRate);
-        }
-        if (bytesReadRateMax != null && bytesReadRateMax > 0) {
-            newDiskOffering.setBytesReadRateMax(bytesReadRateMax);
-        }
-        if (bytesReadRateMaxLength != null && bytesReadRateMaxLength > 0) {
-            newDiskOffering.setBytesReadRateMaxLength(bytesReadRateMaxLength);
-        }
-        if (bytesWriteRate != null && bytesWriteRate > 0) {
-            newDiskOffering.setBytesWriteRate(bytesWriteRate);
-        }
-        if (bytesWriteRateMax != null && bytesWriteRateMax > 0) {
-            newDiskOffering.setBytesWriteRateMax(bytesWriteRateMax);
-        }
-        if (bytesWriteRateMaxLength != null && bytesWriteRateMaxLength > 0) {
-            newDiskOffering.setBytesWriteRateMaxLength(bytesWriteRateMaxLength);
-        }
-        if (iopsReadRate != null && iopsReadRate > 0) {
-            newDiskOffering.setIopsReadRate(iopsReadRate);
-        }
-        if (iopsReadRateMax != null && iopsReadRateMax > 0) {
-            newDiskOffering.setIopsReadRateMax(iopsReadRateMax);
-        }
-        if (iopsReadRateMaxLength != null && iopsReadRateMaxLength > 0) {
-            newDiskOffering.setIopsReadRateMaxLength(iopsReadRateMaxLength);
-        }
-        if (iopsWriteRate != null && iopsWriteRate > 0) {
-            newDiskOffering.setIopsWriteRate(iopsWriteRate);
-        }
-        if (iopsWriteRateMax != null && iopsWriteRateMax > 0) {
-            newDiskOffering.setIopsWriteRateMax(iopsWriteRateMax);
-        }
-        if (iopsWriteRateMaxLength != null && iopsWriteRateMaxLength > 0) {
-            newDiskOffering.setIopsWriteRateMaxLength(iopsWriteRateMaxLength);
-        }
+        setBytesRate(newDiskOffering, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength);
+        setIopsRate(newDiskOffering, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength);
+
         if (cacheMode != null) {
             newDiskOffering.setCacheMode(DiskOffering.DiskCacheMode.valueOf(cacheMode.toUpperCase()));
         }
@@ -2948,6 +2963,9 @@
                     detailsVO.add(new DiskOfferingDetailVO(offering.getId(), ApiConstants.ZONE_ID, String.valueOf(zoneId), false));
                 }
             }
+            if (storagePolicyID != null) {
+                detailsVO.add(new DiskOfferingDetailVO(offering.getId(), ApiConstants.STORAGE_POLICY, String.valueOf(storagePolicyID), false));
+            }
             if (!detailsVO.isEmpty()) {
                 diskOfferingDetailsDao.saveDetails(detailsVO);
             }
@@ -2969,6 +2987,7 @@
         final String tags = cmd.getTags();
         final List<Long> domainIds = cmd.getDomainIds();
         final List<Long> zoneIds = cmd.getZoneIds();
+        final Long storagePolicyId = cmd.getStoragePolicy();
 
         // check if valid domain
         if (CollectionUtils.isNotEmpty(domainIds)) {
@@ -3008,6 +3027,12 @@
             }
         }
 
+        if (storagePolicyId != null) {
+            if (vsphereStoragePolicyDao.findById(storagePolicyId) == null) {
+                throw new InvalidParameterValueException("Please specify a valid vSphere storage policy id");
+            }
+        }
+
         final Boolean isCustomizedIops = cmd.isCustomizedIops();
         final Long minIops = cmd.getMinIops();
         final Long maxIops = cmd.getMaxIops();
@@ -3038,7 +3063,7 @@
                 localStorageRequired, isDisplayOfferingEnabled, isCustomizedIops, minIops,
                 maxIops, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength,
                 iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength,
-                hypervisorSnapshotReserve, cacheMode);
+                hypervisorSnapshotReserve, cacheMode, storagePolicyId);
     }
 
     /**
@@ -3102,6 +3127,21 @@
         final Boolean displayDiskOffering = cmd.getDisplayOffering();
         final List<Long> domainIds = cmd.getDomainIds();
         final List<Long> zoneIds = cmd.getZoneIds();
+        final String tags = cmd.getTags();
+
+        Long bytesReadRate = cmd.getBytesReadRate();
+        Long bytesReadRateMax = cmd.getBytesReadRateMax();
+        Long bytesReadRateMaxLength = cmd.getBytesReadRateMaxLength();
+        Long bytesWriteRate = cmd.getBytesWriteRate();
+        Long bytesWriteRateMax = cmd.getBytesWriteRateMax();
+        Long bytesWriteRateMaxLength = cmd.getBytesWriteRateMaxLength();
+        Long iopsReadRate = cmd.getIopsReadRate();
+        Long iopsReadRateMax = cmd.getIopsReadRateMax();
+        Long iopsReadRateMaxLength = cmd.getIopsReadRateMaxLength();
+        Long iopsWriteRate = cmd.getIopsWriteRate();
+        Long iopsWriteRateMax = cmd.getIopsWriteRateMax();
+        Long iopsWriteRateMaxLength = cmd.getIopsWriteRateMaxLength();
+        String cacheMode = cmd.getCacheMode();
 
         // Check if diskOffering exists
         final DiskOffering diskOfferingHandle = _entityMgr.findById(DiskOffering.class, diskOfferingId);
@@ -3183,7 +3223,10 @@
             throw new InvalidParameterValueException(String.format("Unable to update disk offering: %s by id user: %s because it is not root-admin or domain-admin", diskOfferingHandle.getUuid(), user.getUuid()));
         }
 
-        final boolean updateNeeded = name != null || displayText != null || sortKey != null || displayDiskOffering != null;
+        boolean updateNeeded = shouldUpdateDiskOffering(name, displayText, sortKey, displayDiskOffering, tags, cacheMode) ||
+                shouldUpdateIopsRateParameters(iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength) ||
+                shouldUpdateBytesRateParameters(bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength);
+
         final boolean detailsUpdateNeeded = !filteredDomainIds.equals(existingDomainIds) || !filteredZoneIds.equals(existingZoneIds);
         if (!updateNeeded && !detailsUpdateNeeded) {
             return _diskOfferingDao.findById(diskOfferingId);
@@ -3207,30 +3250,21 @@
             diskOffering.setDisplayOffering(displayDiskOffering);
         }
 
-        // Note: tag editing commented out for now;keeping the code intact,
-        // might need to re-enable in next releases
-        // if (tags != null)
-        // {
-        // if (tags.trim().isEmpty() && diskOfferingHandle.getTags() == null)
-        // {
-        // //no new tags; no existing tags
-        // diskOffering.setTagsArray(csvTagsToList(null));
-        // }
-        // else if (!tags.trim().isEmpty() && diskOfferingHandle.getTags() !=
-        // null)
-        // {
-        // //new tags + existing tags
-        // List<String> oldTags = csvTagsToList(diskOfferingHandle.getTags());
-        // List<String> newTags = csvTagsToList(tags);
-        // oldTags.addAll(newTags);
-        // diskOffering.setTagsArray(oldTags);
-        // }
-        // else if(!tags.trim().isEmpty())
-        // {
-        // //new tags; NO existing tags
-        // diskOffering.setTagsArray(csvTagsToList(tags));
-        // }
-        // }
+        updateDiskOfferingTagsIfIsNotNull(tags, diskOffering);
+
+        validateMaxRateEqualsOrGreater(iopsReadRate, iopsReadRateMax, IOPS_READ_RATE);
+        validateMaxRateEqualsOrGreater(iopsWriteRate, iopsWriteRateMax, IOPS_WRITE_RATE);
+        validateMaxRateEqualsOrGreater(bytesReadRate, bytesReadRateMax, BYTES_READ_RATE);
+        validateMaxRateEqualsOrGreater(bytesWriteRate, bytesWriteRateMax, BYTES_WRITE_RATE);
+        validateMaximumIopsAndBytesLength(iopsReadRateMaxLength, iopsWriteRateMaxLength, bytesReadRateMaxLength, bytesWriteRateMaxLength);
+
+        setBytesRate(diskOffering, bytesReadRate, bytesReadRateMax, bytesReadRateMaxLength, bytesWriteRate, bytesWriteRateMax, bytesWriteRateMaxLength);
+        setIopsRate(diskOffering, iopsReadRate, iopsReadRateMax, iopsReadRateMaxLength, iopsWriteRate, iopsWriteRateMax, iopsWriteRateMaxLength);
+
+        if (cacheMode != null) {
+            validateCacheMode(cacheMode);
+            diskOffering.setCacheMode(DiskOffering.DiskCacheMode.valueOf(cacheMode.toUpperCase()));
+        }
 
         if (updateNeeded && !_diskOfferingDao.update(diskOfferingId, diskOffering)) {
             return null;
@@ -3267,6 +3301,40 @@
         return _diskOfferingDao.findById(diskOfferingId);
     }
 
+    /**
+     * Check the tags parameters to the diskOffering
+     * <ul>
+     *     <li>If tags is null, do nothing and return.</li>
+     *     <li>If tags is not null, set tag to the diskOffering.</li>
+     *     <li>If tags is an blank string, set null on diskOffering tag.</li>
+     * </ul>
+     */
+    protected void updateDiskOfferingTagsIfIsNotNull(String tags, DiskOfferingVO diskOffering) {
+        if (tags == null) { return; }
+        if (StringUtils.isNotBlank(tags)) {
+            diskOffering.setTags(tags);
+        } else {
+            diskOffering.setTags(null);
+        }
+    }
+
+    /**
+     * Check if it needs to update any parameter when updateDiskoffering is called
+     * Verify if name or displayText are not blank, tags is not null, sortkey and displayDiskOffering is not null
+     */
+    protected boolean shouldUpdateDiskOffering(String name, String displayText, Integer sortKey, Boolean displayDiskOffering, String tags, String cacheMode) {
+        return StringUtils.isNotBlank(name) || StringUtils.isNotBlank(displayText) || tags != null || sortKey != null || displayDiskOffering != null || StringUtils.isNotBlank(cacheMode);
+    }
+
+    protected boolean shouldUpdateBytesRateParameters(Long bytesReadRate, Long bytesReadRateMax, Long bytesReadRateMaxLength, Long bytesWriteRate, Long bytesWriteRateMax, Long bytesWriteRateMaxLength) {
+        return bytesReadRate != null || bytesReadRateMax != null || bytesReadRateMaxLength != null || bytesWriteRate != null ||
+                bytesWriteRateMax != null || bytesWriteRateMaxLength != null;
+    }
+
+    protected boolean shouldUpdateIopsRateParameters(Long iopsReadRate, Long iopsReadRateMax, Long iopsReadRateMaxLength, Long iopsWriteRate, Long iopsWriteRateMax, Long iopsWriteRateMaxLength) {
+        return iopsReadRate != null || iopsReadRateMax != null || iopsReadRateMaxLength != null || iopsWriteRate != null || iopsWriteRateMax != null || iopsWriteRateMaxLength != null;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_DISK_OFFERING_DELETE, eventDescription = "deleting disk offering")
     public boolean deleteDiskOffering(final DeleteDiskOfferingCmd cmd) {
@@ -3412,10 +3480,10 @@
         }
 
         final boolean ipv4 = startIP != null;
-        final boolean ipv6 = startIPv6 != null;
+        final boolean ipv6 = ip6Cidr != null;
 
         if (!ipv4 && !ipv6) {
-            throw new InvalidParameterValueException("StartIP or StartIPv6 is missing in the parameters!");
+            throw new InvalidParameterValueException("StartIP or IPv6 CIDR is missing in the parameters!");
         }
 
         if (ipv4) {
@@ -3781,7 +3849,7 @@
             ipv4 = true;
         }
 
-        if (startIPv6 != null) {
+        if (vlanIp6Cidr != null) {
             ipv6 = true;
         }
 
@@ -4055,8 +4123,9 @@
                     // range
                     final List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlan.getId());
                     for (final IPAddressVO ip : ips) {
+                        final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
                         UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(),
-                                ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                                ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
                     }
                     // increment resource count for dedicated public ip's
                     _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
@@ -4136,8 +4205,9 @@
                         s_logger.warn("Some ip addresses failed to be released as a part of vlan " + vlanDbId + " removal");
                     } else {
                         resourceCountToBeDecrement++;
+                        final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
                         UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getAccountId(), ip.getDataCenterId(), ip.getId(),
-                                ip.getAddress().toString(), ip.isSourceNat(), vlanRange.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                                ip.getAddress().toString(), ip.isSourceNat(), vlanRange.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
                     }
                 }
             } finally {
@@ -4279,8 +4349,9 @@
 
            // generate usage event for dedication of every ip address in the range
             for (final IPAddressVO ip : ips) {
+                final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
                 UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(),
-                        vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                        vlan.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
             }
         } else if (domain != null && !forSystemVms) {
             // Create an DomainVlanMapVO entry
@@ -4373,8 +4444,9 @@
             // generate usage events to remove dedication for every ip in the range that has been disassociated
             for (final IPAddressVO ip : ips) {
                 if (!ipsInUse.contains(ip)) {
+                    final boolean usageHidden = _ipAddrMgr.isUsageHidden(ip);
                     UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE, acctVln.get(0).getAccountId(), ip.getDataCenterId(), ip.getId(), ip.getAddress().toString(),
-                            ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                            ip.isSourceNat(), vlan.getVlanType().toString(), ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
                 }
             }
             // decrement resource count for dedicated public ip's
@@ -6378,6 +6450,7 @@
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {SystemVMUseLocalStorage, IOPS_MAX_READ_LENGTH, IOPS_MAX_WRITE_LENGTH, BYTES_MAX_READ_LENGTH, BYTES_MAX_WRITE_LENGTH};
+        return new ConfigKey<?>[] {SystemVMUseLocalStorage, IOPS_MAX_READ_LENGTH, IOPS_MAX_WRITE_LENGTH,
+                BYTES_MAX_READ_LENGTH, BYTES_MAX_WRITE_LENGTH, ADD_HOST_ON_SERVICE_RESTART_KVM, SET_HOST_DOWN_TO_MAINTENANCE};
     }
 }
diff --git a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java
index 8496301..875bbc5 100644
--- a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java
+++ b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java
@@ -19,6 +19,8 @@
 import com.cloud.utils.component.Manager;
 import com.cloud.vm.ConsoleProxyVO;
 
+import org.apache.cloudstack.framework.config.ConfigKey;
+
 public interface ConsoleProxyManager extends Manager, ConsoleProxyService {
 
     public static final int DEFAULT_PROXY_CAPACITY = 50;
@@ -31,9 +33,14 @@
     public static final int DEFAULT_PROXY_URL_PORT = 80;
     public static final int DEFAULT_PROXY_SESSION_TIMEOUT = 300000;        // 5 minutes
 
+    public static final int DEFAULT_NOVNC_PORT = 8080;
+
     public static final String ALERT_SUBJECT = "proxy-alert";
     public static final String CERTIFICATE_NAME = "CPVMCertificate";
 
+    public static final ConfigKey<Boolean> NoVncConsoleDefault = new ConfigKey<Boolean>("Advanced", Boolean.class, "novnc.console.default", "true",
+        "If true, noVNC console will be default console for virtual machines", true);
+
     public void setManagementState(ConsoleProxyManagementState state);
 
     public ConsoleProxyManagementState getManagementState();
diff --git a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 368fc33..b0eac2b 100644
--- a/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@ -32,6 +32,8 @@
 import org.apache.cloudstack.agent.lb.IndirectAgentLB;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.framework.security.keys.KeysManager;
 import org.apache.cloudstack.framework.security.keystore.KeystoreDao;
@@ -154,7 +156,8 @@
 // Starting, HA, Migrating, Running state are all counted as "Open" for available capacity calculation
 // because sooner or later, it will be driven into Running state
 //
-public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxyManager, VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
+public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxyManager, VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter, Configurable {
+
     private static final Logger s_logger = Logger.getLogger(ConsoleProxyManagerImpl.class);
 
     private static final int DEFAULT_CAPACITY_SCAN_INTERVAL = 30000; // 30 seconds
@@ -1732,6 +1735,10 @@
     public void prepareStop(VirtualMachineProfile profile) {
     }
 
+    @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
     public List<ConsoleProxyAllocator> getConsoleProxyAllocators() {
         return _consoleProxyAllocators;
     }
@@ -1741,4 +1748,14 @@
         _consoleProxyAllocators = consoleProxyAllocators;
     }
 
+    @Override
+    public String getConfigComponentName() {
+        return ConsoleProxyManager.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] { NoVncConsoleDefault };
+    }
+
 }
diff --git a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java
index 7c41439..3527ef7 100644
--- a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java
+++ b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDao.java
@@ -55,4 +55,7 @@
 
     List<DedicatedResourceVO> listByAffinityGroupId(Long affinityGroupId);
 
+    List<Long> findHostsByCluster(Long clusterId);
+
+    List<Long> findHostsByZone(Long zoneId);
 }
\ No newline at end of file
diff --git a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
index c406755..c10ef2d 100644
--- a/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
+++ b/server/src/main/java/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
@@ -16,9 +16,14 @@
 // under the License.
 package com.cloud.dc.dao;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
 import com.cloud.utils.db.Filter;
 import org.springframework.stereotype.Component;
 
@@ -32,10 +37,17 @@
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.JoinBuilder;
+
+import javax.inject.Inject;
 
 @Component
 @DB
 public class DedicatedResourceDaoImpl extends GenericDaoBase<DedicatedResourceVO, Long> implements DedicatedResourceDao {
+
+    @Inject
+    protected HostDao hostDao;
+
     protected final SearchBuilder<DedicatedResourceVO> ZoneSearch;
     protected final SearchBuilder<DedicatedResourceVO> PodSearch;
     protected final SearchBuilder<DedicatedResourceVO> ClusterSearch;
@@ -64,6 +76,8 @@
     protected GenericSearchBuilder<DedicatedResourceVO, Long> ListPodsSearch;
     protected GenericSearchBuilder<DedicatedResourceVO, Long> ListClustersSearch;
     protected GenericSearchBuilder<DedicatedResourceVO, Long> ListHostsSearch;
+    protected SearchBuilder<DedicatedResourceVO> ListHostsByCluster;
+    protected SearchBuilder<DedicatedResourceVO> ListHostsByZone;
 
     protected DedicatedResourceDaoImpl() {
         PodSearch = createSearchBuilder();
@@ -369,4 +383,49 @@
         sc.setParameters("affinityGroupId", affinityGroupId);
         return listBy(sc);
     }
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) {
+        ListHostsByCluster = createSearchBuilder();
+        SearchBuilder<HostVO> clusterHostsSB = hostDao.createSearchBuilder();
+        clusterHostsSB.and("cluster_id", clusterHostsSB.entity().getClusterId(), Op.EQ);
+        clusterHostsSB.and("type", clusterHostsSB.entity().getType(), Op.EQ);
+        ListHostsByCluster.join("clusterHostsSB", clusterHostsSB, clusterHostsSB.entity().getId(), ListHostsByCluster.entity().getHostId(), JoinBuilder.JoinType.INNER);
+        ListHostsByCluster.done();
+
+        ListHostsByZone = createSearchBuilder();
+        SearchBuilder<HostVO> zoneHostsSB = hostDao.createSearchBuilder();
+        zoneHostsSB = hostDao.createSearchBuilder();
+        zoneHostsSB.and("zone_id", zoneHostsSB.entity().getDataCenterId(), Op.EQ);
+        zoneHostsSB.and("type", zoneHostsSB.entity().getType(), Op.EQ);
+        ListHostsByZone.join("zoneHostsSB", zoneHostsSB, zoneHostsSB.entity().getId(), ListHostsByZone.entity().getHostId(), JoinBuilder.JoinType.INNER);
+        ListHostsByZone.done();
+        return true;
+    }
+
+    @Override
+    public List<Long> findHostsByCluster(Long clusterId) {
+        List<Long> hosts = new ArrayList<>();
+        SearchCriteria<DedicatedResourceVO> sc = ListHostsByCluster.create();
+        sc.setJoinParameters("clusterHostsSB", "type", Host.Type.Routing);
+        sc.setJoinParameters("clusterHostsSB","cluster_id", clusterId);
+        List<DedicatedResourceVO> results = customSearch(sc, null);
+        for (DedicatedResourceVO dedicatedResourceVO: results){
+            hosts.add(dedicatedResourceVO.getHostId());
+        }
+        return hosts;
+    }
+
+    @Override
+    public List<Long> findHostsByZone(Long zoneId) {
+        List<Long> hosts = new ArrayList<>();
+        SearchCriteria<DedicatedResourceVO> sc = ListHostsByZone.create();
+        sc.setJoinParameters("zoneHostsSB", "type", Host.Type.Routing);
+        sc.setJoinParameters("zoneHostsSB","zone_id", zoneId);
+        List<DedicatedResourceVO> results = customSearch(sc, null);
+        for (DedicatedResourceVO dedicatedResourceVO: results){
+            hosts.add(dedicatedResourceVO.getHostId());
+        }
+        return hosts;
+    }
 }
diff --git a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index b1e0810..6c00709 100644
--- a/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/main/java/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -30,7 +30,10 @@
 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;
 
@@ -139,6 +142,8 @@
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class DeploymentPlanningManagerImpl extends ManagerBase implements DeploymentPlanningManager, Manager, Listener,
 StateListener<State, VirtualMachine.Event, VirtualMachine> {
 
@@ -170,6 +175,8 @@
     protected VMReservationDao _reservationDao;
     @Inject
     HostDetailsDao _hostDetailsDao;
+    @Inject
+    private VMTemplateDao templateDao;
 
     private static final long INITIAL_RESERVATION_RELEASE_CHECKER_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
     protected long _nodeId = -1;
@@ -272,7 +279,7 @@
             s_logger.debug("DeploymentPlanner allocation algorithm: " + planner);
 
             s_logger.debug("Trying to allocate a host and storage pools from dc:" + plan.getDataCenterId() + ", pod:" + plan.getPodId() + ",cluster:" +
-                    plan.getClusterId() + ", requested cpu: " + cpu_requested + ", requested ram: " + ram_requested);
+                    plan.getClusterId() + ", requested cpu: " + cpu_requested + ", requested ram: " + toHumanReadableSize(ram_requested));
 
             s_logger.debug("Is ROOT volume READY (pool already allocated)?: " + (plan.getPoolId() != null ? "Yes" : "No"));
         }
@@ -317,8 +324,9 @@
                     return null;
                 }
 
+                boolean displayStorage = getDisplayStorageFromVmProfile(vmProfile);
                 if (vm.getHypervisorType() == HypervisorType.BareMetal) {
-                    DeployDestination dest = new DeployDestination(dc, pod, cluster, host, new HashMap<Volume, StoragePool>());
+                    DeployDestination dest = new DeployDestination(dc, pod, cluster, host, new HashMap<Volume, StoragePool>(), displayStorage);
                     s_logger.debug("Returning Deployment Destination: " + dest);
                     return dest;
                 }
@@ -338,7 +346,7 @@
                     suitableHosts.add(host);
                     Pair<Host, Map<Volume, StoragePool>> potentialResources = findPotentialDeploymentResources(
                             suitableHosts, suitableVolumeStoragePools, avoids,
-                            getPlannerUsage(planner, vmProfile, plan, avoids), readyAndReusedVolumes, plan.getPreferredHosts());
+                            getPlannerUsage(planner, vmProfile, plan, avoids), readyAndReusedVolumes, plan.getPreferredHosts(), vm);
                     if (potentialResources != null) {
                         pod = _podDao.findById(host.getPodId());
                         cluster = _clusterDao.findById(host.getClusterId());
@@ -348,7 +356,7 @@
                         for (Volume vol : readyAndReusedVolumes) {
                             storageVolMap.remove(vol);
                         }
-                        DeployDestination dest = new DeployDestination(dc, pod, cluster, host, storageVolMap);
+                        DeployDestination dest = new DeployDestination(dc, pod, cluster, host, storageVolMap, displayStorage);
                         s_logger.debug("Returning Deployment Destination: " + dest);
                         return dest;
                     }
@@ -437,6 +445,7 @@
                                 hostHasCapacity = _capacityMgr.checkIfHostHasCapacity(host.getId(), cpu_requested, ram_requested, false, cpuOvercommitRatio, memoryOvercommitRatio, true);
                         }
 
+                        boolean displayStorage = getDisplayStorageFromVmProfile(vmProfile);
                         if (hostHasCapacity
                                 && hostHasCpuCapability) {
                             s_logger.debug("The last host of this VM is UP and has enough capacity");
@@ -446,7 +455,7 @@
                             Pod pod = _podDao.findById(host.getPodId());
                             Cluster cluster = _clusterDao.findById(host.getClusterId());
                             if (vm.getHypervisorType() == HypervisorType.BareMetal) {
-                                DeployDestination dest = new DeployDestination(dc, pod, cluster, host, new HashMap<Volume, StoragePool>());
+                                DeployDestination dest = new DeployDestination(dc, pod, cluster, host, new HashMap<Volume, StoragePool>(), displayStorage);
                                 s_logger.debug("Returning Deployment Destination: " + dest);
                                 return dest;
                             }
@@ -468,7 +477,7 @@
                                 suitableHosts.add(host);
                                 Pair<Host, Map<Volume, StoragePool>> potentialResources = findPotentialDeploymentResources(
                                         suitableHosts, suitableVolumeStoragePools, avoids,
-                                        getPlannerUsage(planner, vmProfile, plan, avoids), readyAndReusedVolumes, plan.getPreferredHosts());
+                                        getPlannerUsage(planner, vmProfile, plan, avoids), readyAndReusedVolumes, plan.getPreferredHosts(), vm);
                                 if (potentialResources != null) {
                                     Map<Volume, StoragePool> storageVolMap = potentialResources.second();
                                     // remove the reused vol<->pool from
@@ -479,7 +488,7 @@
                                         storageVolMap.remove(vol);
                                     }
                                     DeployDestination dest = new DeployDestination(dc, pod, cluster, host,
-                                            storageVolMap);
+                                            storageVolMap, displayStorage);
                                     s_logger.debug("Returning Deployment Destination: " + dest);
                                     return dest;
                                 }
@@ -552,6 +561,19 @@
         return dest;
     }
 
+    private boolean isDeployAsIs(VirtualMachine vm) {
+        long templateId = vm.getTemplateId();
+        VMTemplateVO template = templateDao.findById(templateId);
+        return template != null && template.isDeployAsIs();
+    }
+
+    /**
+     * Display storage in the logs by default if the template is not deploy-as-is.
+     */
+    private boolean getDisplayStorageFromVmProfile(VirtualMachineProfile vmProfile) {
+        return vmProfile == null || vmProfile.getTemplate() == null || !vmProfile.getTemplate().isDeployAsIs();
+    }
+
     @Override
     public DeploymentPlanner getDeploymentPlannerByName(String plannerName) {
         if (plannerName != null) {
@@ -1108,7 +1130,7 @@
                     // choose the potential host and pool for the VM
                     if (!suitableVolumeStoragePools.isEmpty()) {
                         Pair<Host, Map<Volume, StoragePool>> potentialResources = findPotentialDeploymentResources(suitableHosts, suitableVolumeStoragePools, avoid,
-                                resourceUsageRequired, readyAndReusedVolumes, plan.getPreferredHosts());
+                                resourceUsageRequired, readyAndReusedVolumes, plan.getPreferredHosts(), vmProfile.getVirtualMachine());
 
                         if (potentialResources != null) {
                             Host host = _hostDao.findById(potentialResources.first().getId());
@@ -1118,7 +1140,8 @@
                             for (Volume vol : readyAndReusedVolumes) {
                                 storageVolMap.remove(vol);
                             }
-                            DeployDestination dest = new DeployDestination(dc, pod, clusterVO, host, storageVolMap);
+                            boolean displayStorage = getDisplayStorageFromVmProfile(vmProfile);
+                            DeployDestination dest = new DeployDestination(dc, pod, clusterVO, host, storageVolMap, displayStorage);
                             s_logger.debug("Returning Deployment Destination: " + dest);
                             return dest;
                         }
@@ -1248,7 +1271,7 @@
     }
 
     protected Pair<Host, Map<Volume, StoragePool>> findPotentialDeploymentResources(List<Host> suitableHosts, Map<Volume, List<StoragePool>> suitableVolumeStoragePools,
-            ExcludeList avoid, DeploymentPlanner.PlannerResourceUsage resourceUsageRequired, List<Volume> readyAndReusedVolumes, List<Long> preferredHosts) {
+                                                                                    ExcludeList avoid, PlannerResourceUsage resourceUsageRequired, List<Volume> readyAndReusedVolumes, List<Long> preferredHosts, VirtualMachine vm) {
         s_logger.debug("Trying to find a potenial host and associated storage pools from the suitable host/pool lists for this VM");
 
         boolean hostCanAccessPool = false;
@@ -1270,50 +1293,121 @@
         });
         volumesOrderBySizeDesc.addAll(suitableVolumeStoragePools.keySet());
         boolean multipleVolume = volumesOrderBySizeDesc.size() > 1;
+        boolean deployAsIs = isDeployAsIs(vm);
         for (Host potentialHost : suitableHosts) {
             Map<StoragePool, List<Volume>> volumeAllocationMap = new HashMap<StoragePool, List<Volume>>();
-            for (Volume vol : volumesOrderBySizeDesc) {
-                haveEnoughSpace = false;
-                s_logger.debug("Checking if host: " + potentialHost.getId() + " can access any suitable storage pool for volume: " + vol.getVolumeType());
-                List<StoragePool> volumePoolList = suitableVolumeStoragePools.get(vol);
-                hostCanAccessPool = false;
-                hostAffinityCheck = checkAffinity(potentialHost, preferredHosts);
-                for (StoragePool potentialSPool : volumePoolList) {
-                    if (hostCanAccessSPool(potentialHost, potentialSPool)) {
-                        hostCanAccessPool = true;
-                        if (multipleVolume && !readyAndReusedVolumes.contains(vol)) {
-                            List<Volume> requestVolumes = null;
-                            if (volumeAllocationMap.containsKey(potentialSPool))
-                                requestVolumes = volumeAllocationMap.get(potentialSPool);
-                            else
-                                requestVolumes = new ArrayList<Volume>();
-                            requestVolumes.add(vol);
-
-                            if (!_storageMgr.storagePoolHasEnoughIops(requestVolumes, potentialSPool) ||
-                                !_storageMgr.storagePoolHasEnoughSpace(requestVolumes, potentialSPool, potentialHost.getClusterId()))
-                                continue;
-                            volumeAllocationMap.put(potentialSPool, requestVolumes);
+            if (deployAsIs) {
+                storage = new HashMap<>();
+                // Find the common suitable pools
+                s_logger.debug("Trying to allocate all the VM volumes to a single storage pool");
+                Set<StoragePool> suitablePools = new HashSet<>();
+                List<StoragePool> notAllowedPools = new ArrayList<>();
+                for (List<StoragePool> pools : suitableVolumeStoragePools.values()) {
+                    if (CollectionUtils.isEmpty(suitablePools)) {
+                        // All the suitable pools of the first volume
+                        suitablePools.addAll(pools);
+                    } else {
+                        for (StoragePool pool : pools) {
+                            if (!suitablePools.contains(pool)) {
+                                s_logger.debug("Storage pool " + pool.getUuid() + " not allowed for this VM");
+                                notAllowedPools.add(pool);
+                            }
                         }
-                        storage.put(vol, potentialSPool);
-                        haveEnoughSpace = true;
+                    }
+                }
+                suitablePools.removeAll(notAllowedPools);
+                if (CollectionUtils.isEmpty(suitablePools)) {
+                    s_logger.debug("Could not find a storage pool to fit all the VM volumes on this host");
+                    continue;
+                }
+
+                List<Volume> allVolumes = new ArrayList<>();
+                allVolumes.addAll(volumesOrderBySizeDesc);
+                for (StoragePool storagePool : suitablePools) {
+                    haveEnoughSpace = false;
+                    hostCanAccessPool = false;
+                    hostAffinityCheck = checkAffinity(potentialHost, preferredHosts);
+                    if (hostCanAccessSPool(potentialHost, storagePool)) {
+                        hostCanAccessPool = true;
+                        if (potentialHost.getHypervisorType() == HypervisorType.VMware) {
+                            try {
+                                boolean isStoragePoolStoragepolicyComplaince = _storageMgr.isStoragePoolComplaintWithStoragePolicy(allVolumes, storagePool);
+                                if (!isStoragePoolStoragepolicyComplaince) {
+                                    continue;
+                                }
+                            } catch (StorageUnavailableException e) {
+                                s_logger.warn(String.format("Could not verify storage policy complaince against storage pool %s due to exception %s", storagePool.getUuid(), e.getMessage()));
+                                continue;
+                            }
+                            haveEnoughSpace = true;
+                        }
+                    }
+                    if (hostCanAccessPool && haveEnoughSpace && hostAffinityCheck) {
+                        for (Volume vol : volumesOrderBySizeDesc) {
+                            s_logger.debug("Found a suitable storage pool for all the VM volumes: " + storagePool.getUuid());
+                            storage.put(vol, storagePool);
+                        }
                         break;
                     }
                 }
-                if (!hostCanAccessPool) {
-                    break;
-                }
-                if (!haveEnoughSpace) {
-                    s_logger.warn("insufficient capacity to allocate all volumes");
-                    break;
-                }
-                if (!hostAffinityCheck) {
-                    s_logger.debug("Host affinity check failed");
-                    break;
+            } else {
+                for (Volume vol : volumesOrderBySizeDesc) {
+                    haveEnoughSpace = false;
+                    s_logger.debug("Checking if host: " + potentialHost.getId() + " can access any suitable storage pool for volume: " + vol.getVolumeType());
+                    List<StoragePool> volumePoolList = suitableVolumeStoragePools.get(vol);
+                    hostCanAccessPool = false;
+                    hostAffinityCheck = checkAffinity(potentialHost, preferredHosts);
+                    for (StoragePool potentialSPool : volumePoolList) {
+                        if (hostCanAccessSPool(potentialHost, potentialSPool)) {
+                            hostCanAccessPool = true;
+                            if (multipleVolume && !readyAndReusedVolumes.contains(vol)) {
+                                List<Volume> requestVolumes = null;
+                                if (volumeAllocationMap.containsKey(potentialSPool))
+                                    requestVolumes = volumeAllocationMap.get(potentialSPool);
+                                else
+                                    requestVolumes = new ArrayList<Volume>();
+                                requestVolumes.add(vol);
+
+                                if (potentialHost.getHypervisorType() == HypervisorType.VMware) {
+                                    try {
+                                        boolean isStoragePoolStoragepolicyComplaince = _storageMgr.isStoragePoolComplaintWithStoragePolicy(requestVolumes, potentialSPool);
+                                        if (!isStoragePoolStoragepolicyComplaince) {
+                                            continue;
+                                        }
+                                    } catch (StorageUnavailableException e) {
+                                        s_logger.warn(String.format("Could not verify storage policy complaince against storage pool %s due to exception %s", potentialSPool.getUuid(), e.getMessage()));
+                                        continue;
+                                    }
+                                }
+
+                                if (!_storageMgr.storagePoolHasEnoughIops(requestVolumes, potentialSPool) ||
+                                        !_storageMgr.storagePoolHasEnoughSpace(requestVolumes, potentialSPool, potentialHost.getClusterId()))
+                                    continue;
+                                volumeAllocationMap.put(potentialSPool, requestVolumes);
+                            }
+                            storage.put(vol, potentialSPool);
+                            haveEnoughSpace = true;
+                            break;
+                        }
+                    }
+                    if (!hostCanAccessPool) {
+                        break;
+                    }
+                    if (!haveEnoughSpace) {
+                        s_logger.warn("insufficient capacity to allocate all volumes");
+                        break;
+                    }
+                    if (!hostAffinityCheck) {
+                        s_logger.debug("Host affinity check failed");
+                        break;
+                    }
                 }
             }
+
             if (hostCanAccessPool && haveEnoughSpace && hostAffinityCheck && checkIfHostFitsPlannerUsage(potentialHost.getId(), resourceUsageRequired)) {
                 s_logger.debug("Found a potential host " + "id: " + potentialHost.getId() + " name: " + potentialHost.getName() +
                         " and associated storage pools for this VM");
+                volumeAllocationMap.clear();
                 return new Pair<Host, Map<Volume, StoragePool>>(potentialHost, storage);
             } else {
                 avoid.addHost(potentialHost.getId());
diff --git a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java
index 88f6b95..a93da71 100644
--- a/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java
+++ b/server/src/main/java/com/cloud/deploy/FirstFitPlanner.java
@@ -486,7 +486,7 @@
 
         //we need clusters having enough cpu AND RAM to host this particular VM and order them by aggregate cluster capacity
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Listing clusters in order of aggregate capacity, that have (atleast one host with) enough CPU and RAM capacity under this " +
+            s_logger.debug("Listing clusters in order of aggregate capacity, that have (at least one host with) enough CPU and RAM capacity under this " +
                 (isZone ? "Zone: " : "Pod: ") + id);
         }
         String capacityTypeToOrder = configDao.getValue(Config.HostCapacityTypeToOrderClusters.key());
@@ -521,7 +521,7 @@
 
         //we need pods having enough cpu AND RAM to host this particular VM and order them by aggregate pod capacity
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Listing pods in order of aggregate capacity, that have (atleast one host with) enough CPU and RAM capacity under this Zone: " + zoneId);
+            s_logger.debug("Listing pods in order of aggregate capacity, that have (at least one host with) enough CPU and RAM capacity under this Zone: " + zoneId);
         }
         String capacityTypeToOrder = configDao.getValue(Config.HostCapacityTypeToOrderClusters.key());
         short capacityType = Capacity.CAPACITY_TYPE_CPU;
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 904a488..eaa5fea 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
@@ -67,6 +67,8 @@
 import com.cloud.utils.ssh.SSHCmdHelper;
 import com.trilead.ssh2.Connection;
 
+import static com.cloud.configuration.ConfigurationManagerImpl.ADD_HOST_ON_SERVICE_RESTART_KVM;
+
 public abstract class LibvirtServerDiscoverer extends DiscovererBase implements Discoverer, Listener, ResourceStateAdapter {
     private static final Logger s_logger = Logger.getLogger(LibvirtServerDiscoverer.class);
     private final int _waitTime = 5; /* wait for 5 minutes */
@@ -348,6 +350,7 @@
             _hostDao.saveDetails(connectedHost);
             return resources;
         } catch (DiscoveredWithErrorException e) {
+            s_logger.error("DiscoveredWithErrorException caught and rethrowing, message: "+ e.getMessage());
             throw e;
         } catch (Exception e) {
             String msg = " can't setup agent, due to " + e.toString() + " - " + e.getMessage();
@@ -474,7 +477,7 @@
 
         _resourceMgr.deleteRoutingHost(host, isForced, isForceDeleteStorage);
         try {
-            ShutdownCommand cmd = new ShutdownCommand(ShutdownCommand.DeleteHost, null);
+            ShutdownCommand cmd = new ShutdownCommand(ShutdownCommand.DeleteHost, null, !ADD_HOST_ON_SERVICE_RESTART_KVM.value());
             agentMgr.send(host.getId(), cmd);
         } catch (AgentUnavailableException e) {
             s_logger.warn("Sending ShutdownCommand failed: ", e);
diff --git a/server/src/main/java/com/cloud/network/ExternalDeviceUsageManagerImpl.java b/server/src/main/java/com/cloud/network/ExternalDeviceUsageManagerImpl.java
index 49dc785..c3efbf6 100644
--- a/server/src/main/java/com/cloud/network/ExternalDeviceUsageManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/ExternalDeviceUsageManagerImpl.java
@@ -90,6 +90,8 @@
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.NicDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class ExternalDeviceUsageManagerImpl extends ManagerBase implements ExternalDeviceUsageManager {
 
@@ -312,13 +314,13 @@
 
                     userStats.setCurrentBytesSent(newCurrentBytesSent);
                     if (oldCurrentBytesSent > newCurrentBytesSent) {
-                        s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + ".");
+                        s_logger.warn(warning + "Stored bytes sent: " + toHumanReadableSize(oldCurrentBytesSent) + ", new bytes sent: " + toHumanReadableSize(newCurrentBytesSent) + ".");
                         userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent);
                     }
 
                     userStats.setCurrentBytesReceived(newCurrentBytesReceived);
                     if (oldCurrentBytesReceived > newCurrentBytesReceived) {
-                        s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + ".");
+                        s_logger.warn(warning + "Stored bytes received: " + toHumanReadableSize(oldCurrentBytesReceived) + ", new bytes received: " + toHumanReadableSize(newCurrentBytesReceived) + ".");
                         userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived);
                     }
 
@@ -531,13 +533,13 @@
 
             userStats.setCurrentBytesSent(newCurrentBytesSent);
             if (oldCurrentBytesSent > newCurrentBytesSent) {
-                s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + ".");
+                s_logger.warn(warning + "Stored bytes sent: " + toHumanReadableSize(oldCurrentBytesSent) + ", new bytes sent: " + toHumanReadableSize(newCurrentBytesSent) + ".");
                 userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent);
             }
 
             userStats.setCurrentBytesReceived(newCurrentBytesReceived);
             if (oldCurrentBytesReceived > newCurrentBytesReceived) {
-                s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + ".");
+                s_logger.warn(warning + "Stored bytes received: " + toHumanReadableSize(oldCurrentBytesReceived) + ", new bytes received: " + toHumanReadableSize(newCurrentBytesReceived) + ".");
                 userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived);
             }
 
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index 9ad56fc..e5f06c6 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -101,6 +101,8 @@
 import com.cloud.network.dao.LoadBalancerDao;
 import com.cloud.network.dao.NetworkAccountDao;
 import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkDetailsDao;
+import com.cloud.network.dao.NetworkDetailVO;
 import com.cloud.network.dao.NetworkDomainDao;
 import com.cloud.network.dao.NetworkServiceMapDao;
 import com.cloud.network.dao.PhysicalNetworkDao;
@@ -212,6 +214,8 @@
     @Inject
     NetworkDao _networksDao;
     @Inject
+    NetworkDetailsDao _networkDetailsDao;
+    @Inject
     NicDao _nicDao;
     @Inject
     RulesManager _rulesMgr;
@@ -924,9 +928,10 @@
                                     VlanVO vlan = _vlanDao.findById(addr.getVlanId());
                                     String guestType = vlan.getVlanType().toString();
                                     if (!isIpDedicated(addr)) {
+                                        final boolean usageHidden = isUsageHidden(addr);
                                         UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(), addr.getDataCenterId(), addr.getId(),
-                                                addr.getAddress().toString(),
-                                                addr.isSourceNat(), guestType, addr.getSystem(), addr.getClass().getName(), addr.getUuid());
+                                                addr.getAddress().toString(), addr.isSourceNat(), guestType, addr.getSystem(), usageHidden,
+                                                addr.getClass().getName(), addr.getUuid());
                                     }
                                     if (updateIpResourceCount(addr)) {
                                         _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
@@ -1277,9 +1282,10 @@
                     ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
                     ipaddr.setAllocatedToAccountId(ipOwner.getId());
                     ipaddr = _ipAddressDao.persist(ipaddr);
+                    final boolean usageHidden = isUsageHidden(ipaddr);
 
                     UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN, ipaddr.getId(), ipaddr.getDataCenterId(), ipaddr.getId(),
-                            ipaddr.getAddress().toString(), ipaddr.isSourceNat(), null, ipaddr.getSystem(), ipaddr.getClass().getName(), ipaddr.getUuid());
+                            ipaddr.getAddress().toString(), ipaddr.isSourceNat(), null, ipaddr.getSystem(), usageHidden, ipaddr.getClass().getName(), ipaddr.getUuid());
 
                     return ipaddr;
                 }
@@ -1829,8 +1835,9 @@
                         String guestType = vlan.getVlanType().toString();
                         if (!isIpDedicated(ip)) {
                             String eventType = ip.isPortable() ? EventTypes.EVENT_PORTABLE_IP_RELEASE : EventTypes.EVENT_NET_IP_RELEASE;
+                            final boolean usageHidden = isUsageHidden(ip);
                             UsageEventUtils.publishUsageEvent(eventType, ip.getAllocatedToAccountId(), ip.getDataCenterId(), addrId, ip.getAddress().addr(), ip.isSourceNat(),
-                                    guestType, ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+                                    guestType, ip.getSystem(), usageHidden, ip.getClass().getName(), ip.getUuid());
                         }
                     }
 
@@ -2238,4 +2245,17 @@
         }
         return false;
     }
+
+    @Override
+    public boolean isUsageHidden(IPAddressVO ip) {
+        Long networkId = ip.getAssociatedWithNetworkId();
+        if (networkId == null) {
+            networkId = ip.getSourceNetworkId();
+        }
+        if (networkId == null) {
+            throw new CloudRuntimeException("No network for IP " + ip.getId());
+        }
+        NetworkDetailVO networkDetail = _networkDetailsDao.findDetail(networkId, Network.hideIpAddressUsage);
+        return networkDetail != null && "true".equals(networkDetail.getValue());
+    }
 }
diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
index 031b843..4322478 100644
--- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
@@ -34,6 +34,8 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.StringUtils;
+import org.apache.cloudstack.context.CallContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 
@@ -104,13 +106,16 @@
 import com.cloud.offerings.dao.NetworkOfferingDao;
 import com.cloud.offerings.dao.NetworkOfferingDetailsDao;
 import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
 import com.cloud.projects.dao.ProjectAccountDao;
+import com.cloud.projects.dao.ProjectDao;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
 import com.cloud.user.AccountVO;
 import com.cloud.user.DomainManager;
+import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
-import com.cloud.utils.StringUtils;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
@@ -162,6 +167,8 @@
     PodVlanMapDao _podVlanMapDao;
     @Inject
     VpcGatewayDao _vpcGatewayDao;
+    @Inject
+    ProjectDao projectDao;
 
     private List<NetworkElement> networkElements;
 
@@ -1649,9 +1656,22 @@
                 throw new PermissionDeniedException("Unable to use network with id= " + ((NetworkVO)network).getUuid() +
                     ", network does not have an owner");
             if (owner.getType() != Account.ACCOUNT_TYPE_PROJECT && networkOwner.getType() == Account.ACCOUNT_TYPE_PROJECT) {
-                if (!_projectAccountDao.canAccessProjectAccount(owner.getAccountId(), network.getAccountId())) {
-                    throw new PermissionDeniedException("Unable to use network with id= " + ((NetworkVO)network).getUuid() +
-                        ", permission denied");
+                User user = CallContext.current().getCallingUser();
+                Project project = projectDao.findByProjectAccountId(network.getAccountId());
+                if (project == null) {
+                    throw new CloudRuntimeException("Unable to find project to which the network belongs to");
+                }
+                ProjectAccount projectAccountUser = _projectAccountDao.findByProjectIdUserId(project.getId(), user.getAccountId(), user.getId());
+                if (projectAccountUser != null) {
+                    if (!_projectAccountDao.canUserAccessProjectAccount(user.getAccountId(), user.getId(), network.getAccountId())) {
+                        throw new PermissionDeniedException("Unable to use network with id= " + ((NetworkVO)network).getUuid() +
+                                ", permission denied");
+                    }
+                } else {
+                    if (!_projectAccountDao.canAccessProjectAccount(owner.getAccountId(), network.getAccountId())) {
+                        throw new PermissionDeniedException("Unable to use network with id= " + ((NetworkVO) network).getUuid() +
+                                ", permission denied");
+                    }
                 }
             } else {
                 List<NetworkVO> networkMap = _networksDao.listBy(owner.getId(), network.getId());
@@ -2187,15 +2207,9 @@
 
     @Override
     public void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException {
-        if (!NetUtils.isValidIp6(startIPv6)) {
-            throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
-        }
-        if (!NetUtils.isValidIp6(endIPv6)) {
-            throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
-        }
 
-        if (!(ip6Gateway != null && ip6Cidr != null)) {
-            throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined when startIPv6/endIPv6 are passed in");
+        if (StringUtils.isBlank(ip6Gateway) || StringUtils.isBlank(ip6Cidr)) {
+            throw new InvalidParameterValueException("ip6Gateway and ip6Cidr should be defined for an IPv6 network work properly");
         }
 
         if (!NetUtils.isValidIp6(ip6Gateway)) {
@@ -2204,16 +2218,29 @@
         if (!NetUtils.isValidIp6Cidr(ip6Cidr)) {
             throw new InvalidParameterValueException("Invalid ip6cidr");
         }
-        if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
-            throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
-        }
-        if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
-            throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
-        }
+
         if (!NetUtils.isIp6InNetwork(ip6Gateway, ip6Cidr)) {
             throw new InvalidParameterValueException("ip6Gateway is not in ip6cidr indicated network!");
         }
 
+        if (StringUtils.isNotBlank(startIPv6)) {
+            if (!NetUtils.isValidIp6(startIPv6)) {
+                throw new InvalidParameterValueException("Invalid format for the startIPv6 parameter");
+            }
+            if (!NetUtils.isIp6InNetwork(startIPv6, ip6Cidr)) {
+                throw new InvalidParameterValueException("startIPv6 is not in ip6cidr indicated network!");
+            }
+        }
+
+        if (StringUtils.isNotBlank(endIPv6)) {
+            if (!NetUtils.isValidIp6(endIPv6)) {
+                throw new InvalidParameterValueException("Invalid format for the endIPv6 parameter");
+            }
+            if (!NetUtils.isIp6InNetwork(endIPv6, ip6Cidr)) {
+                throw new InvalidParameterValueException("endIPv6 is not in ip6cidr indicated network!");
+            }
+        }
+
         int cidrSize = NetUtils.getIp6CidrSize(ip6Cidr);
         // we only support cidr == 64
         if (cidrSize != 64) {
@@ -2389,7 +2416,7 @@
     @Override
     public List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId,
                                          String vmName, String vmHostName, long vmId, String vmUuid,
-                                         String guestIpAddress, String publicKey, String password, Boolean isWindows) {
+                                         String guestIpAddress, String publicKey, String password, Boolean isWindows, String hostname) {
 
         DataCenterVO dcVo = _dcDao.findById(datacenterId);
         final String zoneName = dcVo.getName();
@@ -2462,7 +2489,7 @@
 
             vmData.add(new String[]{PASSWORD_DIR, PASSWORD_FILE, password});
         }
-
+        vmData.add(new String[]{METATDATA_DIR, HYPERVISOR_HOST_NAME_FILE, hostname});
         return vmData;
     }
 
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index 7661466..4a4603c 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -726,10 +726,10 @@
         String ip6addr = null;
         //Isolated network can exist in Basic zone only, so no need to verify the zone type
         if (network.getGuestType() == Network.GuestType.Isolated) {
-            if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && org.apache.commons.lang3.StringUtils.isBlank(ipv6Address))) {
+            if ((ipv4Address != null || NetUtils.isIpv4(network.getGateway()) && isBlank(ipv6Address))) {
                 ipaddr = _ipAddrMgr.allocateGuestIP(network, ipv4Address);
             }
-            if (ipv6Address != null) {
+            if (isNotBlank(ipv6Address)) {
                 ip6addr = ipv6AddrMgr.allocateGuestIpv6(network, ipv6Address);
             }
         } else if (network.getGuestType() == Network.GuestType.Shared) {
@@ -763,7 +763,7 @@
             return null;
         }
 
-        if (ipaddr != null || ip6addr != null) {
+        if (isNotBlank(ipaddr) || isNotBlank(ip6addr)) {
             // we got the ip addr so up the nics table and secodary ip
             final String ip4AddrFinal = ipaddr;
             final String ip6AddrFinal = ip6addr;
@@ -1195,7 +1195,7 @@
         if (startIP != null) {
             ipv4 = true;
         }
-        if (startIPv6 != null) {
+        if (isNotBlank(ip6Cidr) && isNotBlank(ip6Gateway)) {
             ipv6 = true;
         }
 
@@ -1273,6 +1273,10 @@
             if (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() != Network.GuestType.Shared) {
                 throw new InvalidParameterValueException("Can only support create IPv6 network with advance shared network!");
             }
+
+            if(isBlank(zone.getIp6Dns1()) && isBlank(zone.getIp6Dns2())) {
+                throw new InvalidParameterValueException("Can only create IPv6 network if the zone has IPv6 DNS! Please configure the zone IPv6 DNS1 and/or IPv6 DNS2.");
+            }
         }
 
         if (isNotBlank(isolatedPvlan) && (zone.getNetworkType() != NetworkType.Advanced || ntwkOff.getGuestType() == GuestType.Isolated)) {
@@ -1551,6 +1555,7 @@
         Map<String, String> tags = cmd.getTags();
         Boolean forVpc = cmd.getForVpc();
         Boolean display = cmd.getDisplay();
+        Long networkOfferingId = cmd.getNetworkOfferingId();
 
         // 1) default is system to false if not specified
         // 2) reset parameter to false if it's specified by the regular user
@@ -1679,29 +1684,29 @@
         if (isSystem == null || !isSystem) {
             if (!permittedAccounts.isEmpty()) {
                 //get account level networks
-                networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType,
-                        skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, permittedAccounts));
+                networksToReturn.addAll(listAccountSpecificNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                        aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, permittedAccounts));
                 //get domain level networks
                 if (domainId != null) {
-                    networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, true,
-                            restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, domainId, false));
+                    networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                            aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, domainId, false));
                 }
             } else {
                 //add account specific networks
-                networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType,
-                        skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, path, isRecursive));
+                networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                        aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, path, isRecursive));
                 //add domain specific networks of domain + parent domains
-                networksToReturn.addAll(listDomainSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType,
-                        skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, path, isRecursive));
+                networksToReturn.addAll(listDomainSpecificNetworksByDomainPath(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                        aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, path, isRecursive));
                 //add networks of subdomains
                 if (domainId == null) {
-                    networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, aclType, true,
-                            restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, caller.getDomainId(), true));
+                    networksToReturn.addAll(listDomainLevelNetworks(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                            aclType, true, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter, caller.getDomainId(), true));
                 }
             }
         } else {
-            networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks,
-                    restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter);
+            networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType, physicalNetworkId, networkOfferingId,
+                    null, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, display), searchFilter);
         }
 
         if (supportedServicesStr != null && !supportedServicesStr.isEmpty() && !networksToReturn.isEmpty()) {
@@ -1748,8 +1753,10 @@
         return new Pair<List<? extends Network>, Integer>(networksToReturn, networksToReturn.size());
     }
 
-    private SearchCriteria<NetworkVO> buildNetworkSearchCriteria(SearchBuilder<NetworkVO> sb, String keyword, Long id, Boolean isSystem, Long zoneId, String guestIpType, String trafficType,
-            Long physicalNetworkId, String aclType, boolean skipProjectNetworks, Boolean restartRequired, Boolean specifyIpRanges, Long vpcId, Map<String, String> tags, Boolean display) {
+    private SearchCriteria<NetworkVO> buildNetworkSearchCriteria(SearchBuilder<NetworkVO> sb, String keyword, Long id,
+            Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId,
+            Long networkOfferingId, String aclType, boolean skipProjectNetworks, Boolean restartRequired,
+            Boolean specifyIpRanges, Long vpcId, Map<String, String> tags, Boolean display) {
 
         SearchCriteria<NetworkVO> sc = sb.create();
 
@@ -1819,6 +1826,10 @@
             }
         }
 
+        if (networkOfferingId != null) {
+            sc.addAnd("networkOfferingId", SearchCriteria.Op.EQ, networkOfferingId);
+        }
+
         return sc;
     }
 
@@ -2752,7 +2763,7 @@
         for (Network tier : migratedTiers) {
             String tierNetworkOfferingUuid = networkToOffering.get(tier.getUuid());
 
-            if (!StringUtils.isNotBlank(tierNetworkOfferingUuid)) {
+            if (!isNotBlank(tierNetworkOfferingUuid)) {
                 throwInvalidIdException("Failed to resume migrating VPC as the specified tierNetworkOfferings is not complete", String.valueOf(tier.getUuid()), "networkUuid");
             }
 
@@ -3057,6 +3068,10 @@
             sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + name + "%");
         }
 
+        if (keyword != null) {
+            sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+        }
+
         Pair<List<PhysicalNetworkVO>, Integer> result = _physicalNetworkDao.searchAndCount(sc, searchFilter);
         return new Pair<List<? extends PhysicalNetwork>, Integer>(result.first(), result.second());
     }
diff --git a/server/src/main/java/com/cloud/network/element/CloudZonesNetworkElement.java b/server/src/main/java/com/cloud/network/element/CloudZonesNetworkElement.java
index cb3fac8..848340b 100644
--- a/server/src/main/java/com/cloud/network/element/CloudZonesNetworkElement.java
+++ b/server/src/main/java/com/cloud/network/element/CloudZonesNetworkElement.java
@@ -55,6 +55,7 @@
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineManager;
 import com.cloud.vm.VirtualMachineProfile;
 import com.cloud.vm.dao.DomainRouterDao;
 import com.cloud.vm.dao.UserVmDao;
@@ -147,7 +148,7 @@
     }
 
     private VmDataCommand generateVmDataCommand(String vmPrivateIpAddress, String userData, String serviceOffering, String zoneName, String guestIpAddress,
-        String vmName, String vmInstanceName, long vmId, String vmUuid, String publicKey) {
+        String vmName, String vmInstanceName, long vmId, String vmUuid, String publicKey, String hostname) {
         VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName, _networkMgr.getExecuteInSeqNtwkElmtCmd());
         // if you add new metadata files, also edit systemvm/patches/debian/config/var/www/html/latest/.htaccess
         cmd.addVmData("userdata", "user-data", userData);
@@ -163,7 +164,7 @@
             setVmInstanceId(vmUuid, cmd);
         }
         cmd.addVmData("metadata", "public-keys", publicKey);
-
+        cmd.addVmData("metadata", "hypervisor-host-name", hostname);
         return cmd;
     }
 
@@ -217,11 +218,11 @@
             }
             String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(uservm.getServiceOfferingId()).getDisplayText();
             String zoneName = _dcDao.findById(network.getDataCenterId()).getName();
-
+            String destHostname = VirtualMachineManager.getHypervisorHostname(dest.getHost() != null ? dest.getHost().getName() : "");
             cmds.addCommand(
                 "vmdata",
                 generateVmDataCommand(nic.getIPv4Address(), userData, serviceOffering, zoneName, nic.getIPv4Address(), uservm.getHostName(), uservm.getInstanceName(),
-                    uservm.getId(), uservm.getUuid(), sshPublicKey));
+                    uservm.getId(), uservm.getUuid(), sshPublicKey, destHostname));
             try {
                 _agentManager.send(dest.getHost().getId(), cmds);
             } catch (OperationTimedoutException e) {
@@ -252,6 +253,11 @@
     }
 
     @Override
+    public boolean saveHypervisorHostname(NicProfile profile, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
+        return true;
+    }
+
+    @Override
     public boolean saveUserData(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException {
         // TODO Auto-generated method stub
         return false;
@@ -261,5 +267,4 @@
     public boolean verifyServicesCombination(Set<Service> services) {
         return true;
     }
-
 }
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 5331222..7482eca 100644
--- a/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
+++ b/server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java
@@ -29,6 +29,7 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.storage.configdrive.ConfigDrive;
 import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.to.TemplateObjectTO;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
@@ -39,13 +40,16 @@
 import com.cloud.agent.api.HandleConfigDriveIsoCommand;
 import com.cloud.agent.api.to.DiskTO;
 import com.cloud.configuration.ConfigurationManager;
+import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.dc.dao.HostPodDao;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.exception.UnsupportedServiceException;
 import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.HypervisorGuruManager;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Capability;
 import com.cloud.network.Network.Provider;
@@ -66,6 +70,7 @@
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.crypt.DBEncryptionUtil;
+import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.fsm.StateMachine2;
@@ -110,11 +115,23 @@
     @Inject
     HostDao _hostDao;
     @Inject
+    HostPodDao _podDao;
+    @Inject
+    ClusterDao _clusterDao;
+    @Inject
     AgentManager agentManager;
     @Inject
     DataStoreManager _dataStoreMgr;
     @Inject
     EndPointSelector _ep;
+    @Inject
+    EntityManager _entityMgr;
+    @Inject
+    ServiceOfferingDao _offeringDao;
+    @Inject
+    ImageStoreDao imgstore;
+    @Inject
+    private HypervisorGuruManager _hvGuruMgr;
 
     private final static Integer CONFIGDRIVEDISKSEQ = 4;
 
@@ -204,8 +221,8 @@
     public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context)
             throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
         return (canHandle(network.getTrafficType())
-                && configureConfigDriveData(profile, nic))
-                && createConfigDriveIso(profile, dest);
+                && configureConfigDriveData(profile, nic, dest))
+                && createConfigDriveIso(profile, dest, null);
     }
 
     @Override
@@ -245,6 +262,19 @@
     }
 
     @Override
+    public boolean saveHypervisorHostname(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
+        if (vm.getVirtualMachine().getType() == VirtualMachine.Type.User) {
+            try {
+                recreateConfigDriveIso(nic, network, vm, dest);
+            } catch (ResourceUnavailableException e) {
+                LOG.error("Failed to add config disk drive due to: ", e);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
     public boolean saveUserData(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
         // saveUserData is called by updateVirtualMachine API which requires VM to be shutdown
         // Upper layers should save userdata in db, we do not need to update/create config drive iso at this point
@@ -325,6 +355,32 @@
     public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
     }
 
+    private void recreateConfigDriveIso(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
+        if (nic.isDefaultNic() && _networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive)) {
+            DiskTO diskToUse = null;
+            for (DiskTO disk : vm.getDisks()) {
+                if (disk.getType() == Volume.Type.ISO && disk.getPath() != null && disk.getPath().contains("configdrive")) {
+                    diskToUse = disk;
+                    break;
+                }
+            }
+            final UserVmVO userVm = _userVmDao.findById(vm.getId());
+
+            if (userVm != null) {
+                final boolean isWindows = isWindows(userVm.getGuestOSId());
+                List<String[]> vmData = _networkModel.generateVmData(userVm.getUserData(), _serviceOfferingDao.findById(userVm.getServiceOfferingId()).getName(), userVm.getDataCenterId(), userVm.getInstanceName(), vm.getHostName(), vm.getId(),
+                        vm.getUuid(), nic.getMacAddress(), userVm.getDetail("SSH.PublicKey"), (String) vm.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows, VirtualMachineManager.getHypervisorHostname(dest.getHost() != null ? dest.getHost().getName() : ""));
+                vm.setVmData(vmData);
+                vm.setConfigDriveLabel(VirtualMachineManager.VmConfigDriveLabel.value());
+                createConfigDriveIso(vm, dest, diskToUse);
+            }
+        }
+    }
+
+    private boolean isWindows(long guestOSId) {
+        return _guestOSCategoryDao.findById(_guestOSDao.findById(guestOSId).getCategoryId()).getName().equalsIgnoreCase("Windows");
+    }
+
     private DataStore findDataStore(VirtualMachineProfile profile, DeployDestination dest) {
         DataStore dataStore = null;
         if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
@@ -422,8 +478,9 @@
         return agentId;
     }
 
-    private boolean createConfigDriveIso(VirtualMachineProfile profile, DeployDestination dest) throws ResourceUnavailableException {
-        final DataStore dataStore = findDataStore(profile, dest);
+    private boolean createConfigDriveIso(VirtualMachineProfile profile, DeployDestination dest, DiskTO disk) throws ResourceUnavailableException {
+        DataStore dataStore = getDatastoreForConfigDriveIso(disk, profile, dest);
+
         final Long agentId = findAgentId(profile, dest, dataStore);
         if (agentId == null || dataStore == null) {
             throw new ResourceUnavailableException("Config drive iso creation failed, agent or datastore not available",
@@ -446,6 +503,28 @@
         return true;
     }
 
+    private DataStore getDatastoreForConfigDriveIso(DiskTO disk, VirtualMachineProfile profile, DeployDestination dest) {
+        DataStore dataStore = null;
+        if (disk != null) {
+            String dId = disk.getData().getDataStore().getUuid();
+            if (VirtualMachineManager.VmConfigDriveOnPrimaryPool.value()) {
+                dataStore = _dataStoreMgr.getDataStore(dId, DataStoreRole.Primary);
+            } else {
+                List<DataStore> dataStores = _dataStoreMgr.listImageStores();
+                String url = disk.getData().getDataStore().getUrl();
+                for(DataStore ds : dataStores) {
+                    if (url.equals(ds.getUri()) && DataStoreRole.Image.equals(ds.getRole())) {
+                        dataStore = ds;
+                        break;
+                    }
+                }
+            }
+        } else {
+            dataStore = findDataStore(profile, dest);
+        }
+        return dataStore;
+    }
+
     private boolean deleteConfigDriveIso(final VirtualMachine vm) throws ResourceUnavailableException {
         DataStore dataStore = _dataStoreMgr.getImageStoreWithFreeCapacity(vm.getDataCenterId());
         Long agentId = findAgentIdForImageStore(dataStore);
@@ -502,7 +581,7 @@
         }
     }
 
-    private boolean configureConfigDriveData(final VirtualMachineProfile profile, final NicProfile nic) {
+    private boolean configureConfigDriveData(final VirtualMachineProfile profile, final NicProfile nic, final DeployDestination dest) {
         final UserVmVO vm = _userVmDao.findById(profile.getId());
         if (vm.getType() != VirtualMachine.Type.User) {
             return false;
@@ -512,9 +591,15 @@
             final String sshPublicKey = getSshKey(profile);
             final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
             boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-
+            String hostname = _hostDao.findById(vm.getHostId()).getName();
+            String destHostname = null;
+            if (dest.getHost() == null ) {
+                destHostname = VirtualMachineManager.getHypervisorHostname(hostname);
+            } else {
+                destHostname = VirtualMachineManager.getHypervisorHostname(dest.getHost().getName());
+            }
             final List<String[]> vmData = _networkModel.generateVmData(vm.getUserData(), serviceOffering, vm.getDataCenterId(), vm.getInstanceName(), vm.getHostName(), vm.getId(),
-                    vm.getUuid(), nic.getIPv4Address(), sshPublicKey, (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
+                    vm.getUuid(), nic.getIPv4Address(), sshPublicKey, (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows, destHostname);
             profile.setVmData(vmData);
             profile.setConfigDriveLabel(VirtualMachineManager.VmConfigDriveLabel.value());
         }
diff --git a/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java b/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java
index 0b664a9..bbc6aa7 100644
--- a/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/main/java/com/cloud/network/element/VirtualRouterElement.java
@@ -31,7 +31,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.vm.VirtualMachineProfileImpl;
 import com.cloud.vm.VmDetailConstants;
+import com.cloud.vm.dao.NicDao;
 import com.google.gson.Gson;
 
 import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
@@ -117,7 +120,7 @@
 
 public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService, DhcpServiceProvider, UserDataServiceProvider, SourceNatServiceProvider,
 StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer,
-NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource, DnsServiceProvider {
+NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource, DnsServiceProvider{
     private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class);
     public static final AutoScaleCounterType AutoScaleCounterCpu = new AutoScaleCounterType("cpu");
     public static final AutoScaleCounterType AutoScaleCounterMemory = new AutoScaleCounterType("memory");
@@ -163,6 +166,10 @@
     DataCenterDao _dcDao;
     @Inject
     NetworkModel _networkModel;
+    @Inject
+    NicDao _nicDao;
+    @Inject
+    VMTemplateDao _templateDao;
 
     @Inject
     NetworkTopologyContext networkTopologyContext;
@@ -766,6 +773,33 @@
     }
 
     @Override
+    public boolean saveHypervisorHostname(NicProfile nicProfile, Network network, VirtualMachineProfile vm, DeployDestination dest) throws ResourceUnavailableException {
+        if (_networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.VirtualRouter) && vm.getVirtualMachine().getType() == VirtualMachine.Type.User) {
+            VirtualMachine uvm = vm.getVirtualMachine();
+            UserVmVO destVm = _userVmDao.findById(uvm.getId());
+            VirtualMachineProfile profile = null;
+
+            if (destVm != null) {
+                destVm.setHostId(dest.getHost().getId());
+                _userVmDao.update(uvm.getId(), destVm);
+                profile = new VirtualMachineProfileImpl(destVm);
+                profile.setDisks(vm.getDisks());
+                profile.setNics(vm.getNics());
+                profile.setVmData(vm.getVmData());
+            } else {
+                profile = vm;
+            }
+
+            updateUserVmData(nicProfile, network, profile);
+            if (destVm != null) {
+                destVm.setHostId(uvm.getHostId());
+                _userVmDao.update(uvm.getId(), destVm);
+            }
+        }
+        return true;
+    }
+
+    @Override
     public boolean saveUserData(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
         if (!canHandle(network, null)) {
             return false;
@@ -1066,6 +1100,8 @@
             }
 
             final VirtualMachineProfile uservm = vm;
+            List<java.lang.String[]> vmData = uservm.getVmData();
+            uservm.setVmData(vmData);
 
             final List<DomainRouterVO> routers = getRouters(network, dest);
 
@@ -1204,6 +1240,19 @@
         return true;
     }
 
+    private void updateUserVmData(final NicProfile nic, final Network network, final VirtualMachineProfile vm) throws ResourceUnavailableException {
+        if (_networkModel.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Service.UserData)) {
+            boolean result = saveUserData(network, nic, vm);
+            if (!result) {
+                s_logger.warn("Failed to update userdata for vm " + vm + " and nic " + nic);
+            } else {
+                s_logger.debug("Successfully saved user data to router");
+            }
+        } else {
+            s_logger.debug("Not applying userdata for nic id=" + nic.getId() + " in vm id=" + vm.getId() + " because it is not supported in network id=" + network.getId());
+        }
+    }
+
     @Override
     public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) {
         if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
@@ -1351,5 +1400,4 @@
             _routerDao.persist(router);
         }
     }
-
 }
diff --git a/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java
index 165cb7d..377f18a 100644
--- a/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/main/java/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -200,6 +200,7 @@
 
         if (network.isRollingRestart()) {
             params.put(VirtualMachineProfile.Param.RollingRestart, true);
+            vpc.setRollingRestart(true);
         }
 
         final RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create()
diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
index 167fba9..262fa4b 100644
--- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
+++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
@@ -68,6 +68,8 @@
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.VlanDao;
+import com.cloud.host.Host;
+import com.cloud.host.dao.HostDao;
 import com.cloud.network.IpAddress;
 import com.cloud.network.Network;
 import com.cloud.network.Network.Provider;
@@ -173,23 +175,29 @@
     private VlanDao _vlanDao;
     @Inject
     private IPAddressDao _ipAddressDao;
-
     @Inject
     private RouterControlHelper _routerControlHelper;
+    @Inject
+    private HostDao _hostDao;
 
     @Autowired
     @Qualifier("networkHelper")
     protected NetworkHelper _networkHelper;
 
     public void createVmDataCommand(final VirtualRouter router, final UserVm vm, final NicVO nic, final String publicKey, final Commands cmds) {
-        final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
-        final String zoneName = _dcDao.findById(router.getDataCenterId()).getName();
-        final IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(nic.getNetworkId(), vm.getId());
-        cmds.addCommand(
-                "vmdata",
-                generateVmDataCommand(router, nic.getIPv4Address(), vm.getUserData(), serviceOffering, zoneName,
-                        staticNatIp == null || staticNatIp.getState() != IpAddress.State.Allocated ? null : staticNatIp.getAddress().addr(), vm.getHostName(), vm.getInstanceName(),
-                        vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId()));
+        if (vm != null && router != null && nic != null) {
+            final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
+            final String zoneName = _dcDao.findById(router.getDataCenterId()).getName();
+            final IPAddressVO staticNatIp = _ipAddressDao.findByVmIdAndNetworkId(nic.getNetworkId(), vm.getId());
+
+            Host host = _hostDao.findById(vm.getHostId());
+            String destHostname = VirtualMachineManager.getHypervisorHostname(host != null ? host.getName() : "");
+            cmds.addCommand(
+                    "vmdata",
+                    generateVmDataCommand(router, nic.getIPv4Address(), vm.getUserData(), serviceOffering, zoneName,
+                            staticNatIp == null || staticNatIp.getState() != IpAddress.State.Allocated ? null : staticNatIp.getAddress().addr(), vm.getHostName(), vm.getInstanceName(),
+                            vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId(), destHostname));
+        }
     }
 
     public void createApplyVpnUsersCommand(final List<? extends VpnUser> users, final VirtualRouter router, final Commands cmds) {
@@ -1031,7 +1039,7 @@
 
     private VmDataCommand generateVmDataCommand(final VirtualRouter router, final String vmPrivateIpAddress, final String userData, final String serviceOffering,
             final String zoneName, final String publicIpAddress, final String vmName, final String vmInstanceName, final long vmId, final String vmUuid, final String publicKey,
-            final long guestNetworkId) {
+            final long guestNetworkId, String hostname) {
         final VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName, _networkModel.getExecuteInSeqNtwkElmtCmd());
 
         cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
@@ -1077,6 +1085,7 @@
         }
         cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier);
 
+        cmd.addVmData("metadata", "hypervisor-host-name", hostname);
         return cmd;
     }
 
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 6edbb44..26b2045 100644
--- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -44,6 +44,7 @@
     static final String RouterTemplateOvm3CK = "router.template.ovm3";
     static final String SetServiceMonitorCK = "network.router.EnableServiceMonitoring";
     static final String RouterAlertsCheckIntervalCK = "router.alerts.check.interval";
+    static final String VirtualRouterServiceOfferingCK = "router.service.offering";
 
     static final String RouterHealthChecksConfigRefreshIntervalCK = "router.health.checks.config.refresh.interval";
     static final String RouterHealthChecksResultFetchIntervalCK = "router.health.checks.results.fetch.interval";
@@ -74,6 +75,9 @@
     static final ConfigKey<Boolean> ExposeDnsAndBootpServer = new ConfigKey<Boolean>(Boolean.class, "expose.dns.externally", "Advanced", "true",
             "open dns, dhcp and bootp on the public interface", true, ConfigKey.Scope.Zone, null);
 
+    static final ConfigKey<String> VirtualRouterServiceOffering = new ConfigKey<String>(String.class, VirtualRouterServiceOfferingCK, "Advanced", "",
+            "Uuid of the service offering used by virtual routers; if NULL - system offering will be used", true, ConfigKey.Scope.Account, null);
+
     // Health checks
     static final ConfigKey<Boolean> RouterHealthChecksEnabled = new ConfigKey<Boolean>(Boolean.class, "router.health.checks.enabled", "Advanced", "true",
             "If true, router health checks are allowed to be executed and read. If false, all scheduled checks and API calls for on demand checks are disabled.",
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 0769258..1103ff9 100644
--- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -270,6 +270,8 @@
 import com.google.gson.JsonSyntaxException;
 import com.google.gson.reflect.TypeToken;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 /**
  * VirtualNetworkApplianceManagerImpl manages the different types of virtual
  * network appliances available in the Cloud Stack.
@@ -793,7 +795,7 @@
                                                     if (s_logger.isDebugEnabled()) {
                                                         s_logger.debug("Received # of bytes that's less than the last one.  "
                                                                 + "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: "
-                                                                + answerFinal.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived());
+                                                                + toHumanReadableSize(answerFinal.getBytesReceived()) + " Stored: " + toHumanReadableSize(stats.getCurrentBytesReceived()));
                                                     }
                                                     stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
                                                 }
@@ -802,7 +804,7 @@
                                                     if (s_logger.isDebugEnabled()) {
                                                         s_logger.debug("Received # of bytes that's less than the last one.  "
                                                                 + "Assuming something went wrong and persisting it. Router: " + answerFinal.getRouterName() + " Reported: "
-                                                                + answerFinal.getBytesSent() + " Stored: " + stats.getCurrentBytesSent());
+                                                                + toHumanReadableSize(answerFinal.getBytesSent()) + " Stored: " + toHumanReadableSize(stats.getCurrentBytesSent()));
                                                     }
                                                     stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
                                                 }
@@ -817,8 +819,8 @@
                                         });
 
                                     } catch (final Exception e) {
-                                        s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() + "; Tx: "
-                                                + answer.getBytesSent());
+                                        s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + toHumanReadableSize(answer.getBytesReceived()) + "; Tx: "
+                                                + toHumanReadableSize(answer.getBytesSent()));
                                     }
                                 }
                             }
@@ -3117,7 +3119,7 @@
                                     if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Received # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Router: "
-                                                    + answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesReceived() + " Stored: " + stats.getCurrentBytesReceived());
+                                                    + answerFinal.getRouterName() + " Reported: " + toHumanReadableSize(answerFinal.getBytesReceived()) + " Stored: " + toHumanReadableSize(stats.getCurrentBytesReceived()));
                                         }
                                         stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
                                     }
@@ -3125,7 +3127,7 @@
                                     if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Received # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Router: "
-                                                    + answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesSent() + " Stored: " + stats.getCurrentBytesSent());
+                                                    + answerFinal.getRouterName() + " Reported: " + toHumanReadableSize(answerFinal.getBytesSent()) + " Stored: " + toHumanReadableSize(stats.getCurrentBytesSent()));
                                         }
                                         stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
                                     }
@@ -3139,8 +3141,8 @@
                                 }
                             });
                         } catch (final Exception e) {
-                            s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + answer.getBytesReceived() + "; Tx: "
-                                    + answer.getBytesSent());
+                            s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + " Rx: " + toHumanReadableSize(answer.getBytesReceived()) + "; Tx: "
+                                    + toHumanReadableSize(answer.getBytesSent()));
                         }
                     }
                 }
@@ -3149,6 +3151,10 @@
     }
 
     @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
+    @Override
     public VirtualRouter findRouter(final long routerId) {
         return _routerDao.findById(routerId);
     }
@@ -3250,6 +3256,7 @@
                 UseExternalDnsServers,
                 RouterVersionCheckEnabled,
                 SetServiceMonitor,
+                VirtualRouterServiceOffering,
                 RouterAlertsCheckInterval,
                 RouterHealthChecksEnabled,
                 RouterHealthChecksBasicInterval,
diff --git a/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java b/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
index fb3626b..88ad0c2 100644
--- a/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java
@@ -20,6 +20,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.Random;
 import java.util.TimeZone;
@@ -27,6 +28,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.mail.Authenticator;
@@ -38,7 +40,9 @@
 import javax.mail.internet.InternetAddress;
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.acl.ProjectRole;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.acl.dao.ProjectRoleDao;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
@@ -74,6 +78,7 @@
 import com.cloud.user.ResourceLimitService;
 import com.cloud.user.User;
 import com.cloud.user.dao.AccountDao;
+import com.cloud.user.dao.UserDao;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.component.ManagerBase;
@@ -122,6 +127,10 @@
     private ProjectInvitationJoinDao _projectInvitationJoinDao;
     @Inject
     protected ResourceTagDao _resourceTagDao;
+    @Inject
+    private ProjectRoleDao projectRoleDao;
+    @Inject
+    private UserDao userDao;
 
     protected boolean _invitationRequired = false;
     protected long _invitationTimeOut = 86400000;
@@ -171,10 +180,38 @@
         return true;
     }
 
+    private User validateUser(Long userId, Long accountId, Long domainId) {
+        User user = null;
+        if (userId != null) {
+            user = userDao.findById(userId);
+            if (user == null ) {
+                throw new InvalidParameterValueException("Invalid user ID provided");
+            }
+            if (user.getAccountId() != accountId || _accountDao.findById(user.getAccountId()).getDomainId() != domainId) {
+                throw new InvalidParameterValueException("User doesn't belong to the specified account or domain");
+            }
+        }
+        return user;
+    }
+
+    private User validateUser(Long userId, Long domainId) {
+        User user = null;
+        if (userId != null) {
+            user = userDao.findById(userId);
+            if (user == null) {
+                throw new InvalidParameterValueException("Invalid user ID provided");
+            }
+            if (_accountDao.findById(user.getAccountId()).getDomainId() != domainId) {
+                throw new InvalidParameterValueException("User doesn't belong to the specified account or domain");
+            }
+        }
+        return user;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project", create = true)
     @DB
-    public Project createProject(final String name, final String displayText, String accountName, final Long domainId) throws ResourceAllocationException {
+    public Project createProject(final String name, final String displayText, String accountName, final Long domainId, final Long userId, final Long accountId) throws ResourceAllocationException {
         Account caller = CallContext.current().getCallingAccount();
         Account owner = caller;
 
@@ -188,6 +225,10 @@
             throw new InvalidParameterValueException("Account name and domain id must be specified together");
         }
 
+        if (userId != null && (accountId == null && domainId == null)) {
+            throw new InvalidParameterValueException("Domain ID and account ID must be provided with User ID");
+        }
+
         if (accountName != null) {
             owner = _accountMgr.finalizeOwner(caller, accountName, domainId, null);
         }
@@ -197,10 +238,16 @@
             throw new InvalidParameterValueException("Project with name " + name + " already exists in domain id=" + owner.getDomainId());
         }
 
+        User user = validateUser(userId, accountId, domainId);
+        if (user != null) {
+            owner = _accountDao.findById(user.getAccountId());
+        }
+
         //do resource limit check
         _resourceLimitMgr.checkResourceLimit(owner, ResourceType.project);
 
         final Account ownerFinal = owner;
+        User finalUser = user;
         return Transaction.execute(new TransactionCallback<Project>() {
             @Override
             public Project doInTransaction(TransactionStatus status) {
@@ -214,7 +261,8 @@
                 Project project = _projectDao.persist(new ProjectVO(name, displayText, ownerFinal.getDomainId(), projectAccount.getId()));
 
                 //assign owner to the project
-                assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin);
+                assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin,
+                        Optional.ofNullable(finalUser).map(User::getId).orElse(null),  null);
 
         if (project != null) {
             CallContext.current().setEventDetails("Project id=" + project.getId());
@@ -241,6 +289,7 @@
             throw new InvalidParameterValueException("Unable to find project by id " + projectId);
         }
 
+        CallContext.current().setProject(project);
         _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
         //at this point enabling project doesn't require anything, so just update the state
@@ -261,6 +310,7 @@
             throw new InvalidParameterValueException("Unable to find project by id " + projectId);
         }
 
+        CallContext.current().setProject(project);
         _accountMgr.checkAccess(ctx.getCallingAccount(), AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
         return deleteProject(ctx.getCallingAccount(), ctx.getCallingUserId(), project);
@@ -277,11 +327,11 @@
         project.setState(State.Disabled);
         boolean updateResult = _projectDao.update(project.getId(), project);
         //owner can be already removed at this point, so adding the conditional check
-        Account projectOwner = getProjectOwner(project.getId());
-        if (projectOwner != null) {
-            _resourceLimitMgr.decrementResourceCount(projectOwner.getId(), ResourceType.project);
+        List<Long> projectOwners = getProjectOwners(project.getId());
+        if (projectOwners != null) {
+            for (Long projectOwner : projectOwners)
+            _resourceLimitMgr.decrementResourceCount(projectOwner, ResourceType.project);
         }
-
                 return updateResult;
             }
         });
@@ -323,7 +373,6 @@
 
             s_logger.debug("Removing all invitations for the project " + project + " as a part of project cleanup...");
             _projectInvitationDao.cleanupInvitations(project.getId());
-
                     return result;
                 }
             });
@@ -364,8 +413,13 @@
     }
 
     @Override
-    public ProjectAccount assignAccountToProject(Project project, long accountId, ProjectAccount.Role accountRole) {
-        return _projectAccountDao.persist(new ProjectAccountVO(project, accountId, accountRole));
+    public ProjectAccount assignAccountToProject(Project project, long accountId, ProjectAccount.Role accountRole, Long userId, Long projectRoleId) {
+        ProjectAccountVO projectAccountVO = new ProjectAccountVO(project, accountId, accountRole, userId, projectRoleId);
+        return _projectAccountDao.persist(projectAccountVO);
+    }
+
+    public ProjectAccount assignUserToProject(Project project, long userId, long accountId, Role userRole, Long projectRoleId) {
+       return assignAccountToProject(project, accountId, userRole, userId, projectRoleId);
     }
 
     @Override
@@ -405,6 +459,15 @@
     }
 
     @Override
+    public List<Long> getProjectOwners(long projectId) {
+        List<? extends ProjectAccount> projectAccounts = _projectAccountDao.getProjectOwners(projectId);
+        if (projectAccounts != null || !projectAccounts.isEmpty()) {
+            return projectAccounts.stream().map(acc -> _accountMgr.getAccount(acc.getAccountId()).getId()).collect(Collectors.toList());
+        }
+        return null;
+    }
+
+    @Override
     public ProjectVO findByProjectAccountId(long projectAccountId) {
         return _projectDao.findByProjectAccountId(projectAccountId);
     }
@@ -415,6 +478,74 @@
     }
 
     @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_USER_ADD, eventDescription = "adding user to project", async = true)
+    public boolean addUserToProject(Long projectId, String username, String email, Long projectRoleId, Role projectRole) {
+        Account caller = CallContext.current().getCallingAccount();
+
+        Project project = getProject(projectId);
+        if (project == null) {
+            InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find project with specified id");
+            ex.addProxyObject(String.valueOf(projectId), "projectId");
+            throw ex;
+        }
+
+        if (project.getState() != State.Active) {
+            InvalidParameterValueException ex =
+                    new InvalidParameterValueException("Can't add user to the specified project id in state=" + project.getState() + " as it isn't currently active");
+            ex.addProxyObject(project.getUuid(), "projectId");
+            throw ex;
+        }
+
+
+        User user = userDao.getUserByName(username, project.getDomainId());
+        if (user == null) {
+            InvalidParameterValueException ex = new InvalidParameterValueException("Invalid user ID provided");
+            ex.addProxyObject(String.valueOf(username), "userId");
+            throw ex;
+        }
+
+        CallContext.current().setProject(project);
+        _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
+
+        Account userAccount = _accountDao.findById(user.getAccountId());
+        if (_projectAccountDao.findByProjectIdAccountId(projectId, userAccount.getAccountId()) != null) {
+            throw new InvalidParameterValueException("User belongs to account " + userAccount.getAccountId() + " which is already part of the project");
+        }
+
+        ProjectAccount projectAccountUser = _projectAccountDao.findByProjectIdUserId(projectId, user.getAccountId(), user.getId());
+        if (projectAccountUser != null) {
+            s_logger.info("User with id: " + user.getId() + " is already added to the project with id: " + projectId);
+            return true;
+        }
+
+        if (projectRoleId != null && projectRoleId < 1L) {
+            throw new InvalidParameterValueException("Invalid project role id provided");
+        }
+
+        ProjectRole role = null;
+        if (projectRoleId != null) {
+            role = projectRoleDao.findById(projectRoleId);
+            if (role == null || !role.getProjectId().equals(projectId)) {
+                throw new InvalidParameterValueException("Invalid project role ID for the given project");
+            }
+        }
+
+        if (_invitationRequired) {
+            return inviteUserToProject(project, user, email, projectRole, role);
+        } else {
+            if (username == null) {
+                throw new InvalidParameterValueException("User information (ID) is required to add user to the project");
+            }
+            if (assignUserToProject(project, user.getId(), user.getAccountId(), projectRole,
+                    Optional.ofNullable(role).map(ProjectRole::getId).orElse(null)) != null) {
+                return true;
+            }
+            s_logger.warn("Failed to add user to project with id: " + projectId);
+            return false;
+        }
+    }
+
+    @Override
     public Project findByNameAndDomainId(String name, long domainId) {
         return _projectDao.findByNameAndDomain(name, domainId);
     }
@@ -429,7 +560,14 @@
             _accountMgr.checkAccess(caller, _domainDao.findById(owner.getDomainId()));
             return true;
         }
-
+        User user = CallContext.current().getCallingUser();
+        ProjectVO project = _projectDao.findByProjectAccountId(accountId);
+        if (project != null) {
+            ProjectAccount userProjectAccount = _projectAccountDao.findByProjectIdUserId(project.getId(), user.getAccountId(), user.getId());
+            if (userProjectAccount != null) {
+                return _projectAccountDao.canUserAccessProjectAccount(user.getAccountId(), user.getId(), accountId);
+            }
+        }
         return _projectAccountDao.canAccessProjectAccount(caller.getId(), accountId);
     }
 
@@ -443,9 +581,29 @@
             _accountMgr.checkAccess(caller, _domainDao.findById(owner.getDomainId()));
             return true;
         }
+
+        User user = CallContext.current().getCallingUser();
+        Project project = CallContext.current().getProject();
+        if (project != null) {
+            ProjectAccountVO projectUser = _projectAccountDao.findByProjectIdUserId(project.getId(), caller.getAccountId(), user.getId());
+            if (projectUser != null) {
+                return _projectAccountDao.canUserModifyProject(project.getId(), caller.getAccountId(), user.getId());
+            }
+        }
         return _projectAccountDao.canModifyProjectAccount(caller.getId(), accountId);
     }
 
+    private void updateProjectAccount(ProjectAccountVO futureOwner, Role newAccRole, Long accountId) throws ResourceAllocationException {
+        _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(accountId), ResourceType.project);
+        futureOwner.setAccountRole(newAccRole);
+        _projectAccountDao.update(futureOwner.getId(), futureOwner);
+        if (newAccRole != null && Role.Admin == newAccRole) {
+            _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.project);
+        } else {
+            _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.project);
+        }
+    }
+
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project", async = true)
@@ -465,47 +623,47 @@
         Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() {
             @Override
             public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException {
-        if (displayText != null) {
-            project.setDisplayText(displayText);
-            _projectDao.update(projectId, project);
-        }
-
-        if (newOwnerName != null) {
-            //check that the new owner exists
-            Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
-            if (futureOwnerAccount == null) {
-                throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
-            }
-            Account currentOwnerAccount = getProjectOwner(projectId);
-            if (currentOwnerAccount == null) {
-                s_logger.error("Unable to find the current owner for the project id=" + projectId);
-                throw new InvalidParameterValueException("Unable to find the current owner for the project id=" + projectId);
-            }
-            if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
-                ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
-                if (futureOwner == null) {
-                            throw new InvalidParameterValueException("Account " + newOwnerName +
-                                " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+                if (displayText != null) {
+                    project.setDisplayText(displayText);
+                    _projectDao.update(projectId, project);
                 }
 
-                //do resource limit check
-                _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
+                if (newOwnerName != null) {
+                    //check that the new owner exists
+                    Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
+                    if (futureOwnerAccount == null) {
+                        throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
+                    }
+                    Account currentOwnerAccount = getProjectOwner(projectId);
+                    if (currentOwnerAccount == null) {
+                        s_logger.error("Unable to find the current owner for the project id=" + projectId);
+                        throw new InvalidParameterValueException("Unable to find the current owner for the project id=" + projectId);
+                    }
+                    if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
+                        ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
+                        if (futureOwner == null) {
+                            throw new InvalidParameterValueException("Account " + newOwnerName +
+                                    " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+                        }
 
-                //unset the role for the old owner
-                ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
-                currentOwner.setAccountRole(Role.Regular);
-                _projectAccountDao.update(currentOwner.getId(), currentOwner);
-                _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
+                        //do resource limit check
+                        _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
 
-                //set new owner
-                futureOwner.setAccountRole(Role.Admin);
-                _projectAccountDao.update(futureOwner.getId(), futureOwner);
-                _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
+                        //unset the role for the old owner
+                        ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
+                        currentOwner.setAccountRole(Role.Regular);
+                        _projectAccountDao.update(currentOwner.getId(), currentOwner);
+                        _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
 
-            } else {
-                s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
-            }
-        }
+                        //set new owner
+                        futureOwner.setAccountRole(Role.Admin);
+                        _projectAccountDao.update(futureOwner.getId(), futureOwner);
+                        _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
+
+                    } else {
+                        s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
+                    }
+                }
             }
         });
 
@@ -514,8 +672,75 @@
     }
 
     @Override
+    @DB
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project", async = true)
+    public Project updateProject(final long projectId, final String displayText, final String newOwnerName, Long userId,
+                                 Role newRole) throws ResourceAllocationException {
+        Account caller = CallContext.current().getCallingAccount();
+
+        //check that the project exists
+        final ProjectVO project = getProject(projectId);
+
+        if (project == null) {
+            throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
+        }
+
+        CallContext.current().setProject(project);
+        //verify permissions
+        _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
+
+        List<? extends  ProjectAccount> projectOwners = _projectAccountDao.getProjectOwners(projectId);
+
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException {
+                if (displayText != null) {
+                    project.setDisplayText(displayText);
+                    _projectDao.update(projectId, project);
+                }
+                if (newOwnerName != null) {
+                    //check that the new owner exists
+                    Account updatedAcc = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
+                    if (updatedAcc == null) {
+                        throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
+                    }
+                    ProjectAccountVO newProjectAcc = _projectAccountDao.findByProjectIdAccountId(projectId, updatedAcc.getAccountId());
+                    if (newProjectAcc == null) {
+                        throw new InvalidParameterValueException("Account " + newOwnerName +
+                                " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+                    }
+
+                    if (isTheOnlyProjectOwner(projectId, newProjectAcc, caller) && newRole != Role.Admin) {
+                        throw new InvalidParameterValueException("Cannot demote the only admin of the project");
+                    }
+                    updateProjectAccount(newProjectAcc, newRole, updatedAcc.getId());
+                } else if (userId != null) {
+                    User user = validateUser(userId, project.getDomainId());
+                    if (user == null) {
+                        throw new InvalidParameterValueException("Unable to find user= " + user.getUsername() + " in domain id = " + project.getDomainId());
+                    }
+                    ProjectAccountVO newProjectUser = _projectAccountDao.findByProjectIdUserId(projectId, user.getAccountId(), userId);
+                    if (newProjectUser == null) {
+                        throw new InvalidParameterValueException("User " + userId +
+                                " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+                    }
+
+                    if (projectOwners.size() == 1 && newProjectUser.getUserId().equals(projectOwners.get(0).getUserId())
+                            && newRole != Role.Admin ) {
+                        throw new InvalidParameterValueException("Cannot demote the only admin of the project");
+                    }
+
+                    updateProjectAccount(newProjectUser, newRole, user.getAccountId());
+
+                }
+            }
+        });
+        return _projectDao.findById(projectId);
+    }
+
+    @Override
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_ADD, eventDescription = "adding account to project", async = true)
-    public boolean addAccountToProject(long projectId, String accountName, String email) {
+    public boolean addAccountToProject(long projectId, String accountName, String email, Long projectRoleId, Role projectRoleType) {
         Account caller = CallContext.current().getCallingAccount();
 
         //check that the project exists
@@ -550,6 +775,7 @@
                 throw ex;
             }
 
+            CallContext.current().setProject(project);
             //verify permissions - only project owner can assign
             _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
@@ -561,13 +787,26 @@
             }
         }
 
+        if (projectRoleId != null && projectRoleId < 1L) {
+            throw new InvalidParameterValueException("Invalid project role id provided");
+        }
+
+        ProjectRole projectRole = null;
+        if (projectRoleId != null) {
+            projectRole = projectRoleDao.findById(projectRoleId);
+            if (projectRole == null || projectRole.getProjectId() != projectId) {
+                throw new InvalidParameterValueException("Invalid project role ID for the given project");
+            }
+        }
+
         if (_invitationRequired) {
-            return inviteAccountToProject(project, account, email);
+            return inviteAccountToProject(project, account, email, projectRoleType, projectRole);
         } else {
             if (account == null) {
                 throw new InvalidParameterValueException("Account information is required for assigning account to the project");
             }
-            if (assignAccountToProject(project, account.getId(), ProjectAccount.Role.Regular) != null) {
+            if (assignAccountToProject(project, account.getId(), projectRoleType, null,
+                    Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
                 return true;
             } else {
                 s_logger.warn("Failed to add account " + accountName + " to project id=" + projectId);
@@ -576,9 +815,10 @@
         }
     }
 
-    private boolean inviteAccountToProject(Project project, Account account, String email) {
+    private boolean inviteAccountToProject(Project project, Account account, String email, Role role,ProjectRole projectRole) {
         if (account != null) {
-            if (createAccountInvitation(project, account.getId()) != null) {
+            if (createAccountInvitation(project, account.getId(), null, role,
+                    Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
                 return true;
             } else {
                 s_logger.warn("Failed to generate invitation for account " + account.getAccountName() + " to project id=" + project);
@@ -589,7 +829,8 @@
         if (email != null) {
             //generate the token
             String token = generateToken(10);
-            if (generateTokenBasedInvitation(project, email, token) != null) {
+            if (generateTokenBasedInvitation(project, null, email, token, role,
+                    Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
                 return true;
             } else {
                 s_logger.warn("Failed to generate invitation for email " + email + " to project id=" + project);
@@ -600,6 +841,37 @@
         return false;
     }
 
+    private boolean inviteUserToProject(Project project, User user, String email, Role role, ProjectRole projectRole) {
+        if (email == null) {
+            if (createAccountInvitation(project, user.getAccountId(), user.getId(), role,
+                    Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
+                return true;
+            } else {
+                s_logger.warn("Failed to generate invitation for account " + user.getUsername()  + " to project id=" + project);
+                return false;
+            }
+        } else {
+            //generate the token
+            String token = generateToken(10);
+            if (generateTokenBasedInvitation(project, user.getId(), email, token, role,
+                    Optional.ofNullable(projectRole).map(ProjectRole::getId).orElse(null)) != null) {
+                return true;
+            } else {
+                s_logger.warn("Failed to generate invitation for email " + email + " to project id=" + project);
+                return false;
+            }
+        }
+    }
+
+    private boolean isTheOnlyProjectOwner(Long projectId, ProjectAccount projectAccount, Account caller) {
+        List<? extends  ProjectAccount> projectOwners = _projectAccountDao.getProjectOwners(projectId);
+        if ((projectOwners.size() == 1 && projectOwners.get(0).getAccountId() == projectAccount.getAccountId()
+                && projectAccount.getAccountRole() == Role.Admin )) {
+            return true;
+        }
+        return false;
+    }
+
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACCOUNT_REMOVE, eventDescription = "removing account from project", async = true)
     public boolean deleteAccountFromProject(long projectId, String accountName) {
@@ -628,11 +900,12 @@
             throw ex;
         }
 
+        CallContext.current().setProject(project);
         //verify permissions
         _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
         //Check if the account exists in the project
-        ProjectAccount projectAccount =  _projectAccountDao.findByProjectIdAccountId(projectId, account.getId());
+        ProjectAccount projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, account.getId());
         if (projectAccount == null) {
             InvalidParameterValueException ex = new InvalidParameterValueException("Account " + accountName + " is not assigned to the project with specified id");
             // Use the projectVO object and not the projectAccount object to inject the projectId.
@@ -641,7 +914,7 @@
         }
 
         //can't remove the owner of the project
-        if (projectAccount.getAccountRole() == Role.Admin) {
+        if (isTheOnlyProjectOwner(projectId, projectAccount, caller)) {
             InvalidParameterValueException ex =
                 new InvalidParameterValueException("Unable to delete account " + accountName +
                     " from the project with specified id as the account is the owner of the project");
@@ -652,18 +925,104 @@
         return deleteAccountFromProject(projectId, account.getId());
     }
 
-    public ProjectInvitation createAccountInvitation(Project project, Long accountId) {
-        if (activeInviteExists(project, accountId, null)) {
-            throw new InvalidParameterValueException("There is already a pending invitation for account id=" + accountId + " to the project id=" + project);
+    @Override
+    public boolean deleteUserFromProject(long projectId, long userId) {
+        Account caller = CallContext.current().getCallingAccount();
+        //check that the project exists
+        Project project = getProject(projectId);
+
+        if (project == null) {
+            InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find project with specified id");
+            ex.addProxyObject(String.valueOf(projectId), "projectId");
+            throw ex;
         }
 
-        ProjectInvitation invitation = _projectInvitationDao.persist(new ProjectInvitationVO(project.getId(), accountId, project.getDomainId(), null, null));
+        User user = userDao.findById(userId);
+        if (user == null) {
+            throw new InvalidParameterValueException("Invalid userId provided");
+        }
+        Account userAcc = _accountDao.findActiveAccountById(user.getAccountId(), project.getDomainId());
+        if (userAcc == null) {
+            InvalidParameterValueException ex =
+                    new InvalidParameterValueException("Unable to find user "+ user.getUsername() + " in domain id=" + project.getDomainId());
+            DomainVO domain = ApiDBUtils.findDomainById(project.getDomainId());
+            String domainUuid = String.valueOf(project.getDomainId());
+            if (domain != null) {
+                domainUuid = domain.getUuid();
+            }
+            ex.addProxyObject(domainUuid, "domainId");
+            throw ex;
+        }
 
-        return invitation;
+        CallContext.current().setProject(project);
+        //verify permissions
+        _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
+
+        //Check if the user exists in the project
+        ProjectAccount projectUser =  _projectAccountDao.findByProjectIdUserId(projectId, user.getAccountId(), user.getId());
+        if (projectUser == null) {
+            deletePendingInvite(projectId, user);
+            InvalidParameterValueException ex = new InvalidParameterValueException("User " + user.getUsername() + " is not assigned to the project with specified id");
+            // Use the projectVO object and not the projectAccount object to inject the projectId.
+            ex.addProxyObject(project.getUuid(), "projectId");
+            throw ex;
+        }
+        return deleteUserFromProject(projectId, user);
+    }
+
+    private void deletePendingInvite(Long projectId, User user) {
+        ProjectInvitation invite = _projectInvitationDao.findByUserIdProjectId(user.getId(), user.getAccountId(),  projectId);
+        if (invite != null) {
+            boolean success = _projectInvitationDao.remove(invite.getId());
+            if (success){
+                s_logger.info("Successfully deleted invite pending for the user : "+user.getUsername());
+            } else {
+                s_logger.info("Failed to delete project invite for user: "+ user.getUsername());
+            }
+        }
     }
 
     @DB
-    public boolean activeInviteExists(final Project project, final Long accountId, final String email) {
+    private boolean deleteUserFromProject(Long projectId, User user) {
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                boolean success = true;
+                ProjectAccountVO projectAccount = _projectAccountDao.findByProjectIdUserId(projectId, user.getAccountId(), user.getId());
+                success = _projectAccountDao.remove(projectAccount.getId());
+
+                if (success) {
+                    s_logger.debug("Removed user " + user.getId() + " from project. Removing any invite sent to the user");
+                    ProjectInvitation invite = _projectInvitationDao.findByUserIdProjectId(user.getId(), user.getAccountId(),  projectId);
+                    if (invite != null) {
+                        success = success && _projectInvitationDao.remove(invite.getId());
+                    }
+                }
+                return success;
+            }
+        });
+    }
+
+    public ProjectInvitation createAccountInvitation(Project project, Long accountId, Long userId, Role role, Long projectRoleId) {
+        if (activeInviteExists(project, accountId, userId, null)) {
+            throw new InvalidParameterValueException("There is already a pending invitation for account id=" + accountId + " to the project id=" + project);
+        }
+
+        ProjectInvitationVO invitationVO = new ProjectInvitationVO(project.getId(), accountId, project.getDomainId(), null, null);
+        if (userId != null) {
+            invitationVO.setForUserId(userId);
+        }
+        if (role != null) {
+            invitationVO.setAccountRole(role);
+        }
+        if (projectRoleId != null) {
+            invitationVO.setProjectRoleId(projectRoleId);
+        }
+        return  _projectInvitationDao.persist(invitationVO);
+    }
+
+    @DB
+    public boolean activeInviteExists(final Project project, final Long accountId, Long userId, final String email) {
         return Transaction.execute(new TransactionCallback<Boolean>() {
             @Override
             public Boolean doInTransaction(TransactionStatus status) {
@@ -671,6 +1030,8 @@
         ProjectInvitationVO invite = null;
         if (accountId != null) {
             invite = _projectInvitationDao.findByAccountIdProjectId(accountId, project.getId());
+        } else if (userId != null) {
+            invite = _projectInvitationDao.findByUserIdProjectId(userId, accountId, project.getId());
         } else if (email != null) {
             invite = _projectInvitationDao.findByEmailAndProjectId(email, project.getId());
         }
@@ -686,6 +1047,8 @@
                 //remove the expired/declined invitation
                 if (accountId != null) {
                     s_logger.debug("Removing invitation in state " + invite.getState() + " for account id=" + accountId + " to project " + project);
+                } else if (userId != null) {
+                    s_logger.debug("Removing invitation in state " + invite.getState() + " for user id=" + userId + " to project " + project);
                 } else if (email != null) {
                     s_logger.debug("Removing invitation in state " + invite.getState() + " for email " + email + " to project " + project);
                 }
@@ -699,13 +1062,24 @@
         });
     }
 
-    public ProjectInvitation generateTokenBasedInvitation(Project project, String email, String token) {
+    public ProjectInvitation generateTokenBasedInvitation(Project project, Long userId, String email, String token, Role role, Long projectRoleId) {
         //verify if the invitation was already generated
-        if (activeInviteExists(project, null, email)) {
+        if (activeInviteExists(project, null, null, email)) {
             throw new InvalidParameterValueException("There is already a pending invitation for email " + email + " to the project id=" + project);
         }
 
-        ProjectInvitation projectInvitation = _projectInvitationDao.persist(new ProjectInvitationVO(project.getId(), null, project.getDomainId(), email, token));
+        ProjectInvitationVO projectInvitationVO = new ProjectInvitationVO(project.getId(), null, project.getDomainId(), email, token);
+        if (userId != null) {
+            projectInvitationVO.setForUserId(userId);
+        }
+        if (role != null) {
+            projectInvitationVO.setAccountRole(role);
+        }
+        if (projectRoleId != null) {
+            projectInvitationVO.setProjectRoleId(projectRoleId);
+        }
+
+        ProjectInvitation projectInvitation = _projectInvitationDao.persist(projectInvitationVO);
         try {
             _emailInvite.sendInvite(token, email, project.getId());
         } catch (Exception ex) {
@@ -726,23 +1100,19 @@
     @Override
     @DB
     @ActionEvent(eventType = EventTypes.EVENT_PROJECT_INVITATION_UPDATE, eventDescription = "updating project invitation", async = true)
-    public boolean updateInvitation(final long projectId, String accountName, String token, final boolean accept) {
+    public boolean updateInvitation(final long projectId, String accountName, Long userId, String token, final boolean accept) {
         Account caller = CallContext.current().getCallingAccount();
         Long accountId = null;
+        User user = null;
         boolean result = true;
 
-        //if accountname and token are null, default accountname to caller's account name
-        if (accountName == null && token == null) {
-            accountName = caller.getAccountName();
-        }
-
         //check that the project exists
         final Project project = getProject(projectId);
 
         if (project == null) {
             throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
         }
-
+        CallContext.current().setProject(project);
         if (accountName != null) {
             //check that account-to-remove exists
             Account account = _accountMgr.getActiveAccountByName(accountName, project.getDomainId());
@@ -752,16 +1122,30 @@
 
             //verify permissions
             _accountMgr.checkAccess(caller, null, true, account);
-
             accountId = account.getId();
+        } else if (userId != null) {
+            user = userDao.findById(userId);
+            if (user == null) {
+                throw new InvalidParameterValueException("Invalid user ID provided. Please provide a valid user ID or " +
+                        "account name whose invitation is to be updated");
+            }
+            Account userAccount = _accountDao.findById(user.getAccountId());
+            if (userAccount.getDomainId() != project.getDomainId()) {
+                throw new InvalidParameterValueException("Unable to find user =" + userId + " in domain id=" + project.getDomainId());
+            }
         } else {
             accountId = caller.getId();
+            user = CallContext.current().getCallingUser();
         }
 
         //check that invitation exists
         ProjectInvitationVO invite = null;
         if (token == null) {
-            invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId, ProjectInvitation.State.Pending);
+            if (accountName != null) {
+                invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId, ProjectInvitation.State.Pending);
+            } else {
+                invite = _projectInvitationDao.findByUserIdProjectId(user.getId(), user.getAccountId(), projectId, ProjectInvitation.State.Pending);
+            }
         } else {
             invite = _projectInvitationDao.findPendingByTokenAndProjectId(token, projectId, ProjectInvitation.State.Pending);
         }
@@ -771,10 +1155,11 @@
                 expireInvitation(invite);
                 throw new InvalidParameterValueException("Invitation is expired for account id=" + accountName + " to the project id=" + projectId);
             } else {
-
                 final ProjectInvitationVO inviteFinal = invite;
                 final Long accountIdFinal = accountId;
                 final String accountNameFinal = accountName;
+                final User finalUser = user;
+                ProjectInvitationVO finalInvite = invite;
                 result = Transaction.execute(new TransactionCallback<Boolean>() {
                     @Override
                     public Boolean doInTransaction(TransactionStatus status) {
@@ -783,25 +1168,32 @@
                 ProjectInvitation.State newState = accept ? ProjectInvitation.State.Completed : ProjectInvitation.State.Declined;
 
                 //update invitation
-                        s_logger.debug("Marking invitation " + inviteFinal + " with state " + newState);
-                        inviteFinal.setState(newState);
-                        result = _projectInvitationDao.update(inviteFinal.getId(), inviteFinal);
+                s_logger.debug("Marking invitation " + inviteFinal + " with state " + newState);
+                inviteFinal.setState(newState);
+                result = _projectInvitationDao.update(inviteFinal.getId(), inviteFinal);
 
                 if (result && accept) {
                     //check if account already exists for the project (was added before invitation got accepted)
-                            ProjectAccount projectAccount =  _projectAccountDao.findByProjectIdAccountId(projectId, accountIdFinal);
-                    if (projectAccount != null) {
-                                s_logger.debug("Account " + accountNameFinal + " already added to the project id=" + projectId);
+                    if (finalInvite.getForUserId() == -1) {
+                        ProjectAccount projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountIdFinal);
+                        if (projectAccount != null) {
+                            s_logger.debug("Account " + accountNameFinal + " already added to the project id=" + projectId);
+                        } else {
+                            assignAccountToProject(project, accountIdFinal, finalInvite.getAccountRole(), null, finalInvite.getProjectRoleId());
+                        }
                     } else {
-                                assignAccountToProject(project, accountIdFinal, ProjectAccount.Role.Regular);
+                        ProjectAccount projectAccount = _projectAccountDao.findByProjectIdUserId(projectId, finalUser.getAccountId(), finalUser.getId());
+                        if (projectAccount != null) {
+                            s_logger.debug("User " + finalUser.getId() + "has already been added to the project id=" + projectId);
+                        } else {
+                            assignUserToProject(project, finalInvite.getForUserId(), finalUser.getAccountId(), finalInvite.getAccountRole(), finalInvite.getProjectRoleId());
+                        }
                     }
                 } else {
-                            s_logger.warn("Failed to update project invitation " + inviteFinal + " with state " + newState);
+                    s_logger.warn("Failed to update project invitation " + inviteFinal + " with state " + newState);
                 }
-
-                        return result;
-                    }
-                });
+                return result;
+             }});
             }
         } else {
             throw new InvalidParameterValueException("Unable to find invitation for account name=" + accountName + " to the project id=" + projectId);
@@ -830,6 +1222,7 @@
             throw ex;
         }
 
+        CallContext.current().setProject(project);
         //verify permissions
         _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
@@ -871,6 +1264,7 @@
             throw ex;
         }
 
+        CallContext.current().setProject(project);
         _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
         if (suspendProject(project)) {
@@ -911,7 +1305,6 @@
         }
         return sb.toString();
     }
-
     class EmailInvite {
         private Session _smtpSession;
         private final String _smtpHost;
@@ -1012,6 +1405,7 @@
         //check that the project exists
         Project project = getProject(invitation.getProjectId());
 
+        CallContext.current().setProject(project);
         //check permissions - only project owner can remove the invitations
         _accountMgr.checkAccess(caller, AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
diff --git a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
index 6945d6f..f2a3caa 100755
--- a/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/main/java/com/cloud/resource/ResourceManagerImpl.java
@@ -33,6 +33,7 @@
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
 import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
 import org.apache.cloudstack.api.command.admin.host.AddHostCmd;
 import org.apache.cloudstack.api.command.admin.host.AddSecondaryStorageCmd;
 import org.apache.cloudstack.api.command.admin.host.CancelMaintenanceCmd;
@@ -179,6 +180,9 @@
 import com.cloud.vm.dao.VMInstanceDao;
 import com.google.gson.Gson;
 
+
+import static com.cloud.configuration.ConfigurationManagerImpl.SET_HOST_DOWN_TO_MAINTENANCE;
+
 @Component
 public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ResourceService, Manager {
     private static final Logger s_logger = Logger.getLogger(ResourceManagerImpl.class);
@@ -1026,12 +1030,26 @@
 
     @Override
     @DB
-    public Cluster updateCluster(final Cluster clusterToUpdate, final String clusterType, final String hypervisor, final String allocationState, final String managedstate) {
+    public Cluster updateCluster(UpdateClusterCmd cmd) {
+        ClusterVO cluster = (ClusterVO) getCluster(cmd.getId());
+        String clusterType = cmd.getClusterType();
+        String hypervisor = cmd.getHypervisor();
+        String allocationState = cmd.getAllocationState();
+        String managedstate = cmd.getManagedstate();
+        String name = cmd.getClusterName();
 
-        final ClusterVO cluster = (ClusterVO)clusterToUpdate;
         // Verify cluster information and update the cluster if needed
         boolean doUpdate = false;
 
+        if (org.apache.commons.lang.StringUtils.isNotBlank(name)) {
+            if(cluster.getHypervisorType() == HypervisorType.VMware) {
+                throw new InvalidParameterValueException("Renaming VMware cluster is not supported as it could cause problems if the updated  cluster name is not mapped on VCenter.");
+            }
+            s_logger.debug("Updating Cluster name to: " + name);
+            cluster.setName(name);
+            doUpdate = true;
+        }
+
         if (hypervisor != null && !hypervisor.isEmpty()) {
             final Hypervisor.HypervisorType hypervisorType = Hypervisor.HypervisorType.getType(hypervisor);
             if (hypervisorType == null) {
@@ -1287,6 +1305,17 @@
             throw new CloudRuntimeException("Host is already in state " + host.getResourceState() + ". Cannot recall for maintenance until resolved.");
         }
 
+        if (SET_HOST_DOWN_TO_MAINTENANCE.valueIn(host.getDataCenterId()) && (host.getStatus() == Status.Down)) {
+            if (host.getResourceState() == ResourceState.Enabled) {
+                _hostDao.updateResourceState(ResourceState.Enabled, ResourceState.Event.AdminAskMaintenance, ResourceState.PrepareForMaintenance, host);
+                _hostDao.updateResourceState(ResourceState.PrepareForMaintenance, ResourceState.Event.InternalEnterMaintenance, ResourceState.Maintenance, host);
+                return _hostDao.findById(hostId);
+            } else if (host.getResourceState() == ResourceState.ErrorInMaintenance) {
+                _hostDao.updateResourceState(ResourceState.ErrorInMaintenance, ResourceState.Event.InternalEnterMaintenance, ResourceState.Maintenance, host);
+                return _hostDao.findById(hostId);
+            }
+        }
+
         if (_hostDao.countBy(host.getClusterId(), ResourceState.PrepareForMaintenance, ResourceState.ErrorInPrepareForMaintenance) > 0) {
             throw new CloudRuntimeException("There are other servers attempting migrations for maintenance. " +
                     "Found hosts in PrepareForMaintenance OR ErrorInPrepareForMaintenance STATUS in cluster " + host.getClusterId());
@@ -1476,8 +1505,9 @@
 
     @Override
     public Host updateHost(final UpdateHostCmd cmd) throws NoTransitionException {
-        final Long hostId = cmd.getId();
-        final Long guestOSCategoryId = cmd.getOsCategoryId();
+        Long hostId = cmd.getId();
+        String name = cmd.getName();
+        Long guestOSCategoryId = cmd.getOsCategoryId();
 
         // Verify that the host exists
         final HostVO host = _hostDao.findById(hostId);
@@ -1494,6 +1524,12 @@
             resourceStateTransitTo(host, resourceEvent, _nodeId);
         }
 
+        if (org.apache.commons.lang.StringUtils.isNotBlank(name)) {
+            s_logger.debug("Updating Host name to: " + name);
+            host.setName(name);
+            _hostDao.update(host.getId(), host);
+        }
+
         if (guestOSCategoryId != null) {
             // Verify that the guest OS Category exists
             if (!(guestOSCategoryId > 0) || _guestOSCategoryDao.findById(guestOSCategoryId) == null) {
diff --git a/server/src/main/java/com/cloud/resource/RollingMaintenanceManagerImpl.java b/server/src/main/java/com/cloud/resource/RollingMaintenanceManagerImpl.java
index 62bb30e..0bc8827 100644
--- a/server/src/main/java/com/cloud/resource/RollingMaintenanceManagerImpl.java
+++ b/server/src/main/java/com/cloud/resource/RollingMaintenanceManagerImpl.java
@@ -49,6 +49,7 @@
 import com.cloud.vm.VirtualMachineProfileImpl;
 import com.cloud.vm.dao.VMInstanceDao;
 import org.apache.cloudstack.affinity.AffinityGroupProcessor;
+import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
 import org.apache.cloudstack.api.command.admin.host.PrepareForMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.resource.StartRollingMaintenanceCmd;
 import org.apache.cloudstack.context.CallContext;
@@ -114,12 +115,15 @@
         return true;
     }
 
-    private void updateCluster(long clusterId, String state) {
+    private void updateCluster(long clusterId, String allocationState) {
         Cluster cluster = resourceManager.getCluster(clusterId);
         if (cluster == null) {
             throw new InvalidParameterValueException("Unable to find the cluster by id=" + clusterId);
         }
-        resourceManager.updateCluster(cluster, "", "", state, "");
+        UpdateClusterCmd updateClusterCmd = new UpdateClusterCmd();
+        updateClusterCmd.setId(clusterId);
+        updateClusterCmd.setAllocationState(allocationState);
+        resourceManager.updateCluster(updateClusterCmd);
     }
 
     private void generateReportAndFinishingEvent(StartRollingMaintenanceCmd cmd, boolean success, String details,
diff --git a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index fbc8a99..bd4e96f 100644
--- a/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/main/java/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -107,6 +107,8 @@
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLimitService, Configurable {
     public static final Logger s_logger = Logger.getLogger(ResourceLimitManagerImpl.class);
@@ -427,8 +429,8 @@
                 long domainResourceLimit = findCorrectResourceLimitForDomain(domain, type);
                 long currentDomainResourceCount = _resourceCountDao.getResourceCount(domainId, ResourceOwnerType.Domain, type);
                 long requestedDomainResourceCount = currentDomainResourceCount + numResources;
-                String messageSuffix = " domain resource limits of Type '" + type + "'" + " for Domain Id = " + domainId + " is exceeded: Domain Resource Limit = " + domainResourceLimit
-                        + ", Current Domain Resource Amount = " + currentDomainResourceCount + ", Requested Resource Amount = " + numResources + ".";
+                String messageSuffix = " domain resource limits of Type '" + type + "'" + " for Domain Id = " + domainId + " is exceeded: Domain Resource Limit = " + toHumanReadableSize(domainResourceLimit)
+                        + ", Current Domain Resource Amount = " + toHumanReadableSize(currentDomainResourceCount) + ", Requested Resource Amount = " + toHumanReadableSize(numResources) + ".";
 
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Checking if" + messageSuffix);
@@ -450,9 +452,20 @@
         long accountResourceLimit = findCorrectResourceLimitForAccount(account, type);
         long currentResourceCount = _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type);
         long requestedResourceCount = currentResourceCount + numResources;
+
+        String convertedAccountResourceLimit = String.valueOf(accountResourceLimit);
+        String convertedCurrentResourceCount = String.valueOf(currentResourceCount);
+        String convertedNumResources = String.valueOf(numResources);
+
+        if (type == ResourceType.secondary_storage || type == ResourceType.primary_storage){
+            convertedAccountResourceLimit = toHumanReadableSize(accountResourceLimit);
+            convertedCurrentResourceCount = toHumanReadableSize(currentResourceCount);
+            convertedNumResources = toHumanReadableSize(numResources);
+        }
+
         String messageSuffix = " amount of resources of Type = '" + type + "' for " + (project == null ? "Account Name = " + account.getAccountName() : "Project Name = " + project.getName())
-                + " in Domain Id = " + account.getDomainId() + " is exceeded: Account Resource Limit = " + accountResourceLimit + ", Current Account Resource Amount = " + currentResourceCount
-                + ", Requested Resource Amount = " + numResources + ".";
+                + " in Domain Id = " + account.getDomainId() + " is exceeded: Account Resource Limit = " + convertedAccountResourceLimit + ", Current Account Resource Amount = " + convertedCurrentResourceCount
+                + ", Requested Resource Amount = " + convertedNumResources + ".";
 
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Checking if" + messageSuffix);
@@ -807,7 +820,11 @@
     @DB
     protected boolean updateResourceCountForAccount(final long accountId, final ResourceType type, final boolean increment, final long delta) {
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Updating resource Type = " + type + " count for Account = " + accountId + " Operation = " + (increment ? "increasing" : "decreasing") + " Amount = " + delta);
+            String convertedDelta = String.valueOf(delta);
+            if (type == ResourceType.secondary_storage || type == ResourceType.primary_storage){
+                convertedDelta = toHumanReadableSize(delta);
+            }
+            s_logger.debug("Updating resource Type = " + type + " count for Account = " + accountId + " Operation = " + (increment ? "increasing" : "decreasing") + " Amount = " + convertedDelta);
         }
         try {
             return Transaction.execute(new TransactionCallback<Boolean>() {
diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
index ca38545..8f0007a 100644
--- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java
@@ -27,10 +27,14 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.TimeZone;
 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;
 import javax.crypto.spec.SecretKeySpec;
@@ -195,8 +199,10 @@
 import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStorageProvidersCmd;
 import org.apache.cloudstack.api.command.admin.storage.ListStorageTagsCmd;
+import org.apache.cloudstack.api.command.admin.storage.MigrateSecondaryStorageDataCmd;
 import org.apache.cloudstack.api.command.admin.storage.PreparePrimaryStorageForMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateCloudToUseObjectStoreCmd;
+import org.apache.cloudstack.api.command.admin.storage.UpdateImageStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd;
 import org.apache.cloudstack.api.command.admin.swift.AddSwiftCmd;
 import org.apache.cloudstack.api.command.admin.swift.ListSwiftsCmd;
@@ -288,7 +294,9 @@
 import org.apache.cloudstack.api.command.admin.zone.MarkDefaultZoneForAccountCmd;
 import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
 import org.apache.cloudstack.api.command.user.account.AddAccountToProjectCmd;
+import org.apache.cloudstack.api.command.user.account.AddUserToProjectCmd;
 import org.apache.cloudstack.api.command.user.account.DeleteAccountFromProjectCmd;
+import org.apache.cloudstack.api.command.user.account.DeleteUserFromProjectCmd;
 import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
 import org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd;
@@ -449,7 +457,6 @@
 import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd;
-import org.apache.cloudstack.api.command.user.template.ListTemplateOVFProperties;
 import org.apache.cloudstack.api.command.user.template.ListTemplatePermissionsCmd;
 import org.apache.cloudstack.api.command.user.template.ListTemplatesCmd;
 import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
@@ -547,6 +554,10 @@
 import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 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.cloudstack.storage.datastore.db.VolumeDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.collections.CollectionUtils;
@@ -562,6 +573,8 @@
 import com.cloud.alert.AlertVO;
 import com.cloud.alert.dao.AlertDao;
 import com.cloud.api.ApiDBUtils;
+import com.cloud.api.query.dao.StoragePoolJoinDao;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.capacity.Capacity;
 import com.cloud.capacity.CapacityVO;
 import com.cloud.capacity.dao.CapacityDao;
@@ -646,8 +659,10 @@
 import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.GuestOsCategory;
 import com.cloud.storage.ScopeType;
+import com.cloud.storage.Storage;
 import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolStatus;
 import com.cloud.storage.Volume;
 import com.cloud.storage.VolumeApiServiceImpl;
 import com.cloud.storage.VolumeVO;
@@ -696,6 +711,7 @@
 import com.cloud.vm.DiskProfile;
 import com.cloud.vm.InstanceGroupVO;
 import com.cloud.vm.SecondaryStorageVmVO;
+import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.UserVmManager;
 import com.cloud.vm.UserVmVO;
 import com.cloud.vm.VMInstanceVO;
@@ -708,15 +724,16 @@
 import com.cloud.vm.dao.InstanceGroupDao;
 import com.cloud.vm.dao.SecondaryStorageVmDao;
 import com.cloud.vm.dao.UserVmDao;
-import com.cloud.vm.dao.VMInstanceDao;
-import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.dao.UserVmDetailsDao;
+import com.cloud.vm.dao.VMInstanceDao;
 
 public class ManagementServerImpl extends ManagerBase implements ManagementServer, Configurable {
     public static final Logger s_logger = Logger.getLogger(ManagementServerImpl.class.getName());
 
     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);
+
     @Inject
     public AccountManager _accountMgr;
     @Inject
@@ -776,6 +793,8 @@
     @Inject
     private PrimaryDataStoreDao _poolDao;
     @Inject
+    private StoragePoolJoinDao _poolJoinDao;
+    @Inject
     private NetworkDao _networkDao;
     @Inject
     private StorageManager _storageMgr;
@@ -829,6 +848,12 @@
     private KeystoreManager _ksMgr;
     @Inject
     private DpdkHelper dpdkHelper;
+    @Inject
+    private PrimaryDataStoreDao _primaryDataStoreDao;
+    @Inject
+    private VolumeDataStoreDao _volumeStoreDao;
+    @Inject
+    private TemplateDataStoreDao _vmTemplateStoreDao;
 
     private LockMasterListener _lockMasterListener;
     private final ScheduledExecutorService _eventExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("EventChecker"));
@@ -933,6 +958,8 @@
     @Override
     public boolean start() {
         s_logger.info("Startup CloudStack management server...");
+        // Set human readable sizes
+        NumbersUtil.enableHumanReadableSizes = _configDao.findByName("display.human.readable.sizes").getValue().equals("true");
 
         if (_lockMasterListener == null) {
             _lockMasterListener = new LockMasterListener(ManagementServerNode.getManagementServerId());
@@ -1124,7 +1151,7 @@
         return new Pair<List<? extends Cluster>, Integer>(result.first(), result.second());
     }
 
-    private HypervisorType getHypervisorType(VMInstanceVO vm, StoragePool srcVolumePool, VirtualMachineProfile profile) {
+    private HypervisorType getHypervisorType(VMInstanceVO vm, StoragePool srcVolumePool) {
         HypervisorType type = null;
         if (vm == null) {
             StoragePoolVO poolVo = _poolDao.findById(srcVolumePool.getId());
@@ -1134,18 +1161,13 @@
                     ClusterVO cluster = _clusterDao.findById(clusterId);
                     type = cluster.getHypervisorType();
                 }
-            } else if (ScopeType.ZONE.equals(poolVo.getScope())) {
-                Long zoneId = poolVo.getDataCenterId();
-                if (zoneId != null) {
-                    DataCenterVO dc = _dcDao.findById(zoneId);
-                }
             }
 
             if (null == type) {
                 type = srcVolumePool.getHypervisor();
             }
         } else {
-            type = profile.getHypervisorType();
+            type = vm.getHypervisorType();
         }
         return type;
     }
@@ -1467,17 +1489,67 @@
         }
 
         StoragePool srcVolumePool = _poolDao.findById(volume.getPoolId());
-        allPools = getAllStoragePoolCompatileWithVolumeSourceStoragePool(srcVolumePool);
+        HypervisorType hypervisorType = getHypervisorType(vm, srcVolumePool);
+        Pair<Host, List<Cluster>> hostClusterPair = getVolumeVmHostClusters(srcVolumePool, vm, hypervisorType);
+        Host vmHost = hostClusterPair.first();
+        List<Cluster> clusters = hostClusterPair.second();
+        allPools = getAllStoragePoolCompatibleWithVolumeSourceStoragePool(srcVolumePool, hypervisorType, clusters);
         allPools.remove(srcVolumePool);
         if (vm != null) {
-            suitablePools = findAllSuitableStoragePoolsForVm(volume, vm, srcVolumePool);
+            suitablePools = findAllSuitableStoragePoolsForVm(volume, vm, vmHost, srcVolumePool,
+                    CollectionUtils.isNotEmpty(clusters) ? clusters.get(0) : null, hypervisorType);
         } else {
-            suitablePools = allPools;
+            suitablePools = findAllSuitableStoragePoolsForDetachedVolume(volume, allPools);
         }
-
+        List<StoragePool> avoidPools = new ArrayList<>();
+        if (srcVolumePool.getParent() != 0L) {
+            StoragePool datastoreCluster = _poolDao.findById(srcVolumePool.getParent());
+            avoidPools.add(datastoreCluster);
+        }
+        abstractDataStoreClustersList((List<StoragePool>) allPools, new ArrayList<StoragePool>());
+        abstractDataStoreClustersList((List<StoragePool>) suitablePools, avoidPools);
         return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
     }
 
+    private void abstractDataStoreClustersList(List<StoragePool> storagePools, List<StoragePool> avoidPools) {
+        Predicate<StoragePool> childDatastorePredicate = pool -> (pool.getParent() != 0);
+        List<StoragePool> childDatastores = storagePools.stream().filter(childDatastorePredicate).collect(Collectors.toList());
+        storagePools.removeAll(avoidPools);
+        if (!childDatastores.isEmpty()) {
+            storagePools.removeAll(childDatastores);
+            Set<Long> parentStoragePoolIds = childDatastores.stream().map(mo -> mo.getParent()).collect(Collectors.toSet());
+            for (Long parentStoragePoolId : parentStoragePoolIds) {
+                StoragePool parentPool = _poolDao.findById(parentStoragePoolId);
+                if (!storagePools.contains(parentPool) && !avoidPools.contains(parentPool))
+                    storagePools.add(parentPool);
+            }
+        }
+    }
+
+    private Pair<Host, List<Cluster>> getVolumeVmHostClusters(StoragePool srcVolumePool, VirtualMachine vm, HypervisorType hypervisorType) {
+        Host host = null;
+        List<Cluster> clusters = new ArrayList<>();
+        Long clusterId = srcVolumePool.getClusterId();
+        if (vm != null) {
+            Long hostId = vm.getHostId();
+            if (hostId == null) {
+                hostId = vm.getLastHostId();
+            }
+            if (hostId != null) {
+                host = _hostDao.findById(hostId);
+            }
+        }
+        if (clusterId == null && host != null) {
+            clusterId = host.getClusterId();
+        }
+        if (clusterId != null && vm != null) {
+            clusters.add(_clusterDao.findById(clusterId));
+        } else {
+            clusters.addAll(_clusterDao.listByDcHyType(srcVolumePool.getDataCenterId(), hypervisorType.toString()));
+        }
+        return new Pair<>(host, clusters);
+    }
+
     /**
      * This method looks for all storage pools that are compatible with the given volume.
      * <ul>
@@ -1485,15 +1557,18 @@
      *  <li>We also all storage available filtering by data center, pod and cluster as the current storage pool used by the given volume.</li>
      * </ul>
      */
-    private List<? extends StoragePool> getAllStoragePoolCompatileWithVolumeSourceStoragePool(StoragePool srcVolumePool) {
+    private List<? extends StoragePool> getAllStoragePoolCompatibleWithVolumeSourceStoragePool(StoragePool srcVolumePool, HypervisorType hypervisorType, List<Cluster> clusters) {
         List<StoragePoolVO> storagePools = new ArrayList<>();
-        List<StoragePoolVO> zoneWideStoragePools = _poolDao.findZoneWideStoragePoolsByTags(srcVolumePool.getDataCenterId(), null);
+        List<StoragePoolVO> zoneWideStoragePools = _poolDao.findZoneWideStoragePoolsByHypervisor(srcVolumePool.getDataCenterId(), hypervisorType);
         if (CollectionUtils.isNotEmpty(zoneWideStoragePools)) {
             storagePools.addAll(zoneWideStoragePools);
         }
-        List<StoragePoolVO> clusterAndLocalStoragePools = _poolDao.listBy(srcVolumePool.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId(), null);
-        if (CollectionUtils.isNotEmpty(clusterAndLocalStoragePools)) {
-            storagePools.addAll(clusterAndLocalStoragePools);
+        if (CollectionUtils.isNotEmpty(clusters)) {
+            List<Long> clusterIds = clusters.stream().map(Cluster::getId).collect(Collectors.toList());
+            List<StoragePoolVO> clusterAndLocalStoragePools = _poolDao.findPoolsInClusters(clusterIds);
+            if (CollectionUtils.isNotEmpty(clusterAndLocalStoragePools)) {
+                storagePools.addAll(clusterAndLocalStoragePools);
+            }
         }
         return storagePools;
     }
@@ -1505,35 +1580,33 @@
      *
      *  Side note: the idea behind this method is to provide power for administrators of manually overriding deployments defined by CloudStack.
      */
-    private List<StoragePool> findAllSuitableStoragePoolsForVm(final VolumeVO volume, VMInstanceVO vm, StoragePool srcVolumePool) {
+    private List<StoragePool> findAllSuitableStoragePoolsForVm(final VolumeVO volume, VMInstanceVO vm, Host vmHost, StoragePool srcVolumePool, Cluster srcCluster, HypervisorType hypervisorType) {
         List<StoragePool> suitablePools = new ArrayList<>();
-
-        HostVO host = _hostDao.findById(vm.getHostId());
-        if (host == null) {
-            host = _hostDao.findById(vm.getLastHostId());
-        }
-
         ExcludeList avoid = new ExcludeList();
         avoid.addPool(srcVolumePool.getId());
-
-        DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId(), null, null, null);
+        Long clusterId = null;
+        Long podId = null;
+        if (srcCluster != null) {
+            clusterId = srcCluster.getId();
+            podId = srcCluster.getPodId();
+        }
+        DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), podId, clusterId,
+                null, null, null, null);
         VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
         // OfflineVmwareMigration: vm might be null here; deal!
-        HypervisorType type = getHypervisorType(vm, srcVolumePool, profile);
 
         DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
-        //This is an override mechanism so we can list the possible local storage pools that a volume in a shared pool might be able to be migrated to
-        DiskProfile diskProfile = new DiskProfile(volume, diskOffering, type);
-        diskProfile.setUseLocalStorage(true);
+        DiskProfile diskProfile = new DiskProfile(volume, diskOffering, hypervisorType);
 
         for (StoragePoolAllocator allocator : _storagePoolAllocators) {
-            List<StoragePool> pools = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL);
+            List<StoragePool> pools = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL, true);
             if (CollectionUtils.isEmpty(pools)) {
                 continue;
             }
             for (StoragePool pool : pools) {
-                boolean isLocalPoolSameHostAsSourcePool = pool.isLocal() && StringUtils.equals(host.getPrivateIpAddress(), pool.getHostAddress());
-                if (isLocalPoolSameHostAsSourcePool || pool.isShared()) {
+                boolean isLocalPoolSameHostAsVmHost = pool.isLocal() &&
+                        (vmHost == null || StringUtils.equals(vmHost.getPrivateIpAddress(), pool.getHostAddress()));
+                if (isLocalPoolSameHostAsVmHost || pool.isShared()) {
                     suitablePools.add(pool);
                 }
 
@@ -1542,6 +1615,29 @@
         return suitablePools;
     }
 
+    private List<StoragePool> findAllSuitableStoragePoolsForDetachedVolume(Volume volume, List<? extends StoragePool> allPools) {
+        List<StoragePool> suitablePools = new ArrayList<>();
+        if (CollectionUtils.isEmpty(allPools)) {
+            return  suitablePools;
+        }
+        DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+        List<String> tags = new ArrayList<>();
+        String[] tagsArray = diskOffering.getTagsArray();
+        if (tagsArray != null && tagsArray.length > 0) {
+            tags = Arrays.asList(tagsArray);
+        }
+        Long[] poolIds = allPools.stream().map(StoragePool::getId).toArray(Long[]::new);
+        List<StoragePoolJoinVO> pools = _poolJoinDao.searchByIds(poolIds);
+        for (StoragePoolJoinVO storagePool : pools) {
+            if (StoragePoolStatus.Up.equals(storagePool.getStatus()) &&
+                    (CollectionUtils.isEmpty(tags) || tags.contains(storagePool.getTag()))) {
+                Optional<? extends StoragePool> match = allPools.stream().filter(x -> x.getId() == storagePool.getId()).findFirst();
+                match.ifPresent(suitablePools::add);
+            }
+        }
+        return suitablePools;
+    }
+
     private Pair<List<HostVO>, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type,
         final Object state, final Object zone, final Object pod, final Object cluster, final Object id, final Object keyword,
         final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion, final Object... excludes) {
@@ -1964,6 +2060,7 @@
         sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ);
         sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
         sb.and("display", sb.entity().isDisplay(), SearchCriteria.Op.EQ);
+        sb.and("forsystemvms", sb.entity().isForSystemVms(), SearchCriteria.Op.EQ);
 
         if (forLoadBalancing != null && forLoadBalancing) {
             final SearchBuilder<LoadBalancerVO> lbSearch = _loadbalancerDao.createSearchBuilder();
@@ -1989,6 +2086,7 @@
 
         final SearchBuilder<VlanVO> vlanSearch = _vlanDao.createSearchBuilder();
         vlanSearch.and("vlanType", vlanSearch.entity().getVlanType(), SearchCriteria.Op.EQ);
+        vlanSearch.and("removed", vlanSearch.entity().getRemoved(), SearchCriteria.Op.NULL);
         sb.join("vlanSearch", vlanSearch, sb.entity().getVlanId(), vlanSearch.entity().getId(), JoinBuilder.JoinType.INNER);
 
         if (isAllocated != null && isAllocated == true) {
@@ -2071,6 +2169,7 @@
             sc.setParameters("state", state);
         }
 
+        sc.setParameters( "forsystemvms", false);
         final Pair<List<IPAddressVO>, Integer> result = _publicIpAddressDao.searchAndCount(sc, searchFilter);
         return new Pair<List<? extends IpAddress>, Integer>(result.first(), result.second());
     }
@@ -2764,6 +2863,7 @@
         cmdList.add(FindStoragePoolsForMigrationCmd.class);
         cmdList.add(PreparePrimaryStorageForMaintenanceCmd.class);
         cmdList.add(UpdateStoragePoolCmd.class);
+        cmdList.add(UpdateImageStoreCmd.class);
         cmdList.add(DestroySystemVmCmd.class);
         cmdList.add(ListSystemVMsCmd.class);
         cmdList.add(MigrateSystemVMCmd.class);
@@ -2813,7 +2913,9 @@
         cmdList.add(MarkDefaultZoneForAccountCmd.class);
         cmdList.add(UpdateZoneCmd.class);
         cmdList.add(AddAccountToProjectCmd.class);
+        cmdList.add(AddUserToProjectCmd.class);
         cmdList.add(DeleteAccountFromProjectCmd.class);
+        cmdList.add(DeleteUserFromProjectCmd.class);
         cmdList.add(ListAccountsCmd.class);
         cmdList.add(ListProjectAccountsCmd.class);
         cmdList.add(AssociateIPAddrCmd.class);
@@ -3152,9 +3254,9 @@
         cmdList.add(RevokeTemplateDirectDownloadCertificateCmd.class);
         cmdList.add(ListMgmtsCmd.class);
         cmdList.add(GetUploadParamsForIsoCmd.class);
-        cmdList.add(ListTemplateOVFProperties.class);
         cmdList.add(GetRouterHealthCheckResultsCmd.class);
         cmdList.add(StartRollingMaintenanceCmd.class);
+        cmdList.add(MigrateSecondaryStorageDataCmd.class);
 
         // Out-of-band management APIs for admins
         cmdList.add(EnableOutOfBandManagementForHostCmd.class);
@@ -3177,7 +3279,7 @@
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {vmPasswordLength, sshKeyLength};
+        return new ConfigKey<?>[] {vmPasswordLength, sshKeyLength, humanReadableSizes};
     }
 
     protected class EventPurgeTask extends ManagedContextRunnable {
@@ -3248,13 +3350,28 @@
         }
     }
 
+    private void cleanupDownloadUrlsInZone(final long zoneId) {
+        // clean download URLs when destroying ssvm
+        // clean only the volumes and templates of the zone to which ssvm belongs to
+        for (VolumeDataStoreVO volume :_volumeStoreDao.listVolumeDownloadUrlsByZoneId(zoneId)) {
+            volume.setExtractUrl(null);
+            _volumeStoreDao.update(volume.getId(), volume);
+        }
+        for (ImageStoreVO imageStore : _imgStoreDao.listStoresByZoneId(zoneId)) {
+            for (TemplateDataStoreVO template : _vmTemplateStoreDao.listTemplateDownloadUrlsByStoreId(imageStore.getId())) {
+                template.setExtractUrl(null);
+                template.setExtractUrlCreated(null);
+                _vmTemplateStoreDao.update(template.getId(), template);
+            }
+        }
+    }
+
     private SecondaryStorageVmVO startSecondaryStorageVm(final long instanceId) {
         return _secStorageVmMgr.startSecStorageVm(instanceId);
     }
 
     private SecondaryStorageVmVO stopSecondaryStorageVm(final VMInstanceVO systemVm, final boolean isForced)
             throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException {
-
         _itMgr.advanceStop(systemVm.getUuid(), isForced);
         return _secStorageVmDao.findById(systemVm.getId());
     }
@@ -3266,6 +3383,7 @@
 
     protected SecondaryStorageVmVO destroySecondaryStorageVm(final long instanceId) {
         final SecondaryStorageVmVO secStorageVm = _secStorageVmDao.findById(instanceId);
+        cleanupDownloadUrlsInZone(secStorageVm.getDataCenterId());
         if (_secStorageVmMgr.destroySecStorageVm(instanceId)) {
             return secStorageVm;
         }
@@ -3297,9 +3415,16 @@
         sb.and("nulltype", sb.entity().getType(), SearchCriteria.Op.IN);
 
         if (storageId != null) {
-            final SearchBuilder<VolumeVO> volumeSearch = _volumeDao.createSearchBuilder();
-            volumeSearch.and("poolId", volumeSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
-            sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
+            StoragePoolVO storagePool = _primaryDataStoreDao.findById(storageId);
+            if (storagePool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                final SearchBuilder<VolumeVO> volumeSearch = _volumeDao.createSearchBuilder();
+                volumeSearch.and("poolId", volumeSearch.entity().getPoolId(), SearchCriteria.Op.IN);
+                sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
+            } else {
+                final SearchBuilder<VolumeVO> volumeSearch = _volumeDao.createSearchBuilder();
+                volumeSearch.and("poolId", volumeSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
+                sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
+            }
         }
 
         final SearchCriteria<VMInstanceVO> sc = sb.create();
@@ -3339,7 +3464,14 @@
         }
 
         if (storageId != null) {
-            sc.setJoinParameters("volumeSearch", "poolId", storageId);
+            StoragePoolVO storagePool = _primaryDataStoreDao.findById(storageId);
+            if (storagePool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                List<StoragePoolVO> childDataStores = _primaryDataStoreDao.listChildStoragePoolsInDatastoreCluster(storageId);
+                List<Long> childDatastoreIds = childDataStores.stream().map(mo -> mo.getId()).collect(Collectors.toList());
+                sc.setJoinParameters("volumeSearch", "poolId", childDatastoreIds.toArray());
+            } else {
+                sc.setJoinParameters("volumeSearch", "poolId", storageId);
+            }
         }
 
         final Pair<List<VMInstanceVO>, Integer> result = _vmInstanceDao.searchAndCount(sc, searchFilter);
diff --git a/server/src/main/java/com/cloud/server/StatsCollector.java b/server/src/main/java/com/cloud/server/StatsCollector.java
index 86f02c2..86db544 100644
--- a/server/src/main/java/com/cloud/server/StatsCollector.java
+++ b/server/src/main/java/com/cloud/server/StatsCollector.java
@@ -36,6 +36,7 @@
 
 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.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector;
 import org.apache.cloudstack.framework.config.ConfigKey;
@@ -142,6 +143,8 @@
 import com.cloud.vm.dao.UserVmDao;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 /**
  * Provides real time stats for various agent resources up to x seconds
  *
@@ -738,15 +741,15 @@
 
                                     if (isCurrentVmDiskStatsDifferentFromPrevious(previousVmDiskStats, vmDiskStat_lock)) {
                                         s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " + "Ignoring current answer. Host: " + host.getName()
-                                                + " . VM: " + vmDiskStat.getVmName() + " Read(Bytes): " + vmDiskStat.getBytesRead() + " write(Bytes): " + vmDiskStat.getBytesWrite()
-                                                + " Read(IO): " + vmDiskStat.getIORead() + " write(IO): " + vmDiskStat.getIOWrite());
+                                                + " . VM: " + vmDiskStat.getVmName() + " Read(Bytes): " + toHumanReadableSize(vmDiskStat.getBytesRead()) + " write(Bytes): " + toHumanReadableSize(vmDiskStat.getBytesWrite())
+                                                + " Read(IO): " + toHumanReadableSize(vmDiskStat.getIORead()) + " write(IO): " + toHumanReadableSize(vmDiskStat.getIOWrite()));
                                         continue;
                                     }
 
                                     if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Read # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: "
-                                                    + host.getName() + " . VM: " + vmDiskStat.getVmName() + " Reported: " + vmDiskStat.getBytesRead() + " Stored: "
+                                                    + host.getName() + " . VM: " + vmDiskStat.getVmName() + " Reported: " + toHumanReadableSize(vmDiskStat.getBytesRead()) + " Stored: "
                                                     + vmDiskStat_lock.getCurrentBytesRead());
                                         }
                                         vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
@@ -755,8 +758,8 @@
                                     if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Write # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: "
-                                                    + host.getName() + " . VM: " + vmDiskStat.getVmName() + " Reported: " + vmDiskStat.getBytesWrite() + " Stored: "
-                                                    + vmDiskStat_lock.getCurrentBytesWrite());
+                                                    + host.getName() + " . VM: " + vmDiskStat.getVmName() + " Reported: " + toHumanReadableSize(vmDiskStat.getBytesWrite()) + " Stored: "
+                                                    + toHumanReadableSize(vmDiskStat_lock.getCurrentBytesWrite()));
                                         }
                                         vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
                                     }
@@ -884,8 +887,8 @@
                                     if (vmNetworkStat_lock.getCurrentBytesSent() > vmNetworkStat.getBytesSent()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Sent # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: "
-                                                    + host.getName() + " . VM: " + vmNetworkStat.getVmName() + " Reported: " + vmNetworkStat.getBytesSent() + " Stored: "
-                                                    + vmNetworkStat_lock.getCurrentBytesSent());
+                                                    + host.getName() + " . VM: " + vmNetworkStat.getVmName() + " Reported: " + toHumanReadableSize(vmNetworkStat.getBytesSent()) + " Stored: "
+                                                    + toHumanReadableSize(vmNetworkStat_lock.getCurrentBytesSent()));
                                         }
                                         vmNetworkStat_lock.setNetBytesSent(vmNetworkStat_lock.getNetBytesSent() + vmNetworkStat_lock.getCurrentBytesSent());
                                     }
@@ -894,8 +897,8 @@
                                     if (vmNetworkStat_lock.getCurrentBytesReceived() > vmNetworkStat.getBytesReceived()) {
                                         if (s_logger.isDebugEnabled()) {
                                             s_logger.debug("Received # of bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: "
-                                                    + host.getName() + " . VM: " + vmNetworkStat.getVmName() + " Reported: " + vmNetworkStat.getBytesReceived() + " Stored: "
-                                                    + vmNetworkStat_lock.getCurrentBytesReceived());
+                                                    + host.getName() + " . VM: " + vmNetworkStat.getVmName() + " Reported: " + toHumanReadableSize(vmNetworkStat.getBytesReceived()) + " Stored: "
+                                                    + toHumanReadableSize(vmNetworkStat_lock.getCurrentBytesReceived()));
                                         }
                                         vmNetworkStat_lock.setNetBytesReceived(vmNetworkStat_lock.getNetBytesReceived() + vmNetworkStat_lock.getCurrentBytesReceived());
                                     }
@@ -987,7 +990,7 @@
                         continue;
                     }
 
-                    Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(store.getId());
+                    String nfsVersion = imageStoreDetailsUtil.getNfsVersion(store.getId());
                     GetStorageStatsCommand command = new GetStorageStatsCommand(store.getTO(), nfsVersion);
                     EndPoint ssAhost = _epSelector.select(store);
                     if (ssAhost == null) {
@@ -998,7 +1001,7 @@
                     Answer answer = ssAhost.sendMessage(command);
                     if (answer != null && answer.getResult()) {
                         storageStats.put(storeId, (StorageStats)answer);
-                        s_logger.trace("HostId: " + storeId + " Used: " + ((StorageStats)answer).getByteUsed() + " Total Available: " + ((StorageStats)answer).getCapacityBytes());
+                        s_logger.trace("HostId: " + storeId + " Used: " + toHumanReadableSize(((StorageStats)answer).getByteUsed()) + " Total Available: " + toHumanReadableSize(((StorageStats)answer).getCapacityBytes()));
                     }
                 }
                 _storageStats = storageStats;
@@ -1018,8 +1021,13 @@
                             storagePoolStats.put(pool.getId(), (StorageStats)answer);
 
                             // Seems like we have dynamically updated the pool size since the prev. size and the current do not match
-                            if (_storagePoolStats.get(poolId) != null && _storagePoolStats.get(poolId).getCapacityBytes() != ((StorageStats)answer).getCapacityBytes()) {
+                            if (pool.getCapacityBytes() != ((StorageStats)answer).getCapacityBytes() ||
+                                    pool.getUsedBytes() != ((StorageStats)answer).getByteUsed()) {
                                 pool.setCapacityBytes(((StorageStats)answer).getCapacityBytes());
+                                if (pool.getStorageProviderName().equalsIgnoreCase(DataStoreProvider.DEFAULT_PRIMARY)) {
+                                    pool.setUsedBytes(((StorageStats) answer).getByteUsed());
+                                    pool.setUpdateTime(new Date());
+                                }
                                 _storagePoolDao.update(pool.getId(), pool);
                             }
                         }
diff --git a/server/src/main/java/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/main/java/com/cloud/servlet/ConsoleProxyServlet.java
index ae9b5c5..b735be8 100644
--- a/server/src/main/java/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/main/java/com/cloud/servlet/ConsoleProxyServlet.java
@@ -41,6 +41,12 @@
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.support.SpringBeanAutowiringSupport;
 
+
+import com.cloud.vm.VmDetailConstants;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import com.cloud.consoleproxy.ConsoleProxyManager;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.host.HostVO;
 import com.cloud.hypervisor.Hypervisor;
@@ -59,10 +65,7 @@
 import com.cloud.vm.UserVmDetailVO;
 import com.cloud.vm.VirtualMachine;
 import com.cloud.vm.VirtualMachineManager;
-import com.cloud.vm.VmDetailConstants;
 import com.cloud.vm.dao.UserVmDetailsDao;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
 
 /**
  * Thumbnail access : /console?cmd=thumbnail&vm=xxx&w=xxx&h=xxx
@@ -478,7 +481,12 @@
             param.setClientTunnelSession(parsedHostInfo.third());
         }
 
-        sb.append("/ajax?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
+        if (param.getHypervHost() != null || !ConsoleProxyManager.NoVncConsoleDefault.value()) {
+            sb.append("/ajax?token=" + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
+        } else {
+            sb.append("/resource/noVNC/vnc.html?port=" + ConsoleProxyManager.DEFAULT_NOVNC_PORT + "&token="
+                + encryptor.encryptObject(ConsoleProxyClientParam.class, param));
+        }
 
         // for console access, we need guest OS type to help implement keyboard
         long guestOs = vm.getGuestOSId();
diff --git a/server/src/main/java/com/cloud/storage/ImageStoreDetailsUtil.java b/server/src/main/java/com/cloud/storage/ImageStoreDetailsUtil.java
index 3e27ce6..1a4a246 100755
--- a/server/src/main/java/com/cloud/storage/ImageStoreDetailsUtil.java
+++ b/server/src/main/java/com/cloud/storage/ImageStoreDetailsUtil.java
@@ -42,11 +42,10 @@
      * Retrieve global secondary storage NFS version default value
      * @return global default value
      */
-    protected Integer getGlobalDefaultNfsVersion(){
+    protected String getGlobalDefaultNfsVersion(){
         ConfigurationVO globalNfsVersion = configurationDao.findByName(CapacityManager.ImageStoreNFSVersion.key());
         Preconditions.checkState(globalNfsVersion != null, "Unable to find global NFS version for version key " + CapacityManager.ImageStoreNFSVersion.key());
-        String value = globalNfsVersion.getValue();
-        return (value != null ? Integer.valueOf(value) : null);
+        return globalNfsVersion.getValue();
     }
     /**
      * Obtain NFS protocol version (if provided) for a store id, if not use default config value<br/>
@@ -54,12 +53,11 @@
      * @return {@code null} if {@code secstorage.nfs.version} is not found for storeId <br/>
      * {@code X} if {@code secstorage.nfs.version} is found found for storeId
      */
-    public Integer getNfsVersion(long storeId) throws NumberFormatException {
+    public String getNfsVersion(long storeId) throws NumberFormatException {
 
         final Map<String, String> storeDetails = imageStoreDetailsDao.getDetails(storeId);
         if (storeDetails != null && storeDetails.containsKey(CapacityManager.ImageStoreNFSVersion.key())) {
-            final String version = storeDetails.get(CapacityManager.ImageStoreNFSVersion.key());
-            return (version != null ? Integer.valueOf(version) : null);
+            return storeDetails.get(CapacityManager.ImageStoreNFSVersion.key());
         }
 
         return getGlobalDefaultNfsVersion();
@@ -68,11 +66,11 @@
 
     /**
      * Obtain NFS protocol version (if provided) for a store uuid.<br/>
-     * @param resourceId image store id
+     * @param storeUuid image store id
      * @return {@code null} if {@code secstorage.nfs.version} is not found for storeUuid <br/>
      * {@code X} if {@code secstorage.nfs.version} is found found for storeUuid
      */
-    public Integer getNfsVersionByUuid(String storeUuid){
+    public String getNfsVersionByUuid(String storeUuid){
         ImageStoreVO imageStore = imageStoreDao.findByUuid(storeUuid);
         if (imageStore != null){
             return getNfsVersion(imageStore.getId());
diff --git a/server/src/main/java/com/cloud/storage/ImageStoreServiceImpl.java b/server/src/main/java/com/cloud/storage/ImageStoreServiceImpl.java
new file mode 100644
index 0000000..43f9cd4
--- /dev/null
+++ b/server/src/main/java/com/cloud/storage/ImageStoreServiceImpl.java
@@ -0,0 +1,163 @@
+// 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.storage;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.api.command.admin.storage.MigrateSecondaryStorageDataCmd;
+import org.apache.cloudstack.api.response.MigrationResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.StorageOrchestrationService;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProvider;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
+import org.apache.cloudstack.storage.ImageStoreService;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
+import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
+import org.apache.commons.lang3.EnumUtils;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class ImageStoreServiceImpl extends ManagerBase implements ImageStoreService {
+
+    private static final Logger s_logger = Logger.getLogger(ImageStoreServiceImpl.class);
+    @Inject
+    ImageStoreDao imageStoreDao;
+    @Inject
+    private AsyncJobManager jobMgr;
+    @Inject
+    private StorageOrchestrationService stgService;
+
+    ConfigKey<Double> ImageStoreImbalanceThreshold = new ConfigKey<>("Advanced", Double.class,
+            "image.store.imbalance.threshold",
+            "0.3",
+            "The storage imbalance threshold that is compared with the standard deviation percentage for a storage utilization metric. " +
+                    "The value is a percentage in decimal format.",
+            true, ConfigKey.Scope.Global);
+
+
+    public Integer numConcurrentCopyTasksPerSSVM = null;
+
+
+
+    @Override
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        return true;
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_IMAGE_STORE_DATA_MIGRATE, eventDescription = "migrating Image store data", async = true)
+    public MigrationResponse migrateData(MigrateSecondaryStorageDataCmd cmd) {
+        Long srcImgStoreId = cmd.getId();
+        ImageStoreVO srcImageVO = imageStoreDao.findById(srcImgStoreId);
+        List<Long> destImgStoreIds = cmd.getMigrateTo();
+        List<String> imagestores = new ArrayList<String>();
+        String migrationType = cmd.getMigrationType();
+
+        // default policy is complete
+        MigrationPolicy policy = MigrationPolicy.COMPLETE;
+
+        if (migrationType != null) {
+            if (!EnumUtils.isValidEnum(MigrationPolicy.class, migrationType.toUpperCase())) {
+                throw new CloudRuntimeException("Not a valid migration policy");
+            }
+            policy = MigrationPolicy.valueOf(migrationType.toUpperCase());
+        }
+
+        String message = null;
+
+        if (srcImageVO == null) {
+            throw new CloudRuntimeException("Cannot find secondary storage with id: " + srcImgStoreId);
+        }
+
+        Long srcStoreDcId = srcImageVO.getDataCenterId();
+        imagestores.add(srcImageVO.getName());
+        if (srcImageVO.getRole() != DataStoreRole.Image) {
+            throw new CloudRuntimeException("Secondary storage is not of Image Role");
+        }
+
+        if (!srcImageVO.getProviderName().equals(DataStoreProvider.NFS_IMAGE)) {
+            throw new InvalidParameterValueException("Migration of datastore objects is supported only for NFS based image stores");
+        }
+
+        if (destImgStoreIds.contains(srcImgStoreId)) {
+            s_logger.debug("One of the destination stores is the same as the source image store ... Ignoring it...");
+            destImgStoreIds.remove(srcImgStoreId);
+        }
+
+        // Validate all the Ids correspond to valid Image stores
+        List<Long> destDatastores = new ArrayList<>();
+        for (Long id : destImgStoreIds) {
+            ImageStoreVO store = imageStoreDao.findById(id);
+            if (store == null) {
+                s_logger.warn("Secondary storage with id: " + id + "is not found. Skipping it...");
+                continue;
+            }
+            if (store.isReadonly()) {
+                s_logger.warn("Secondary storage: "+ id + " cannot be considered for migration as has read-only permission, Skipping it... ");
+                continue;
+            }
+
+            if (!store.getProviderName().equals(DataStoreProvider.NFS_IMAGE)) {
+                s_logger.warn("Destination image store : " + store.getName() + " not NFS based. Store not suitable for migration!");
+                continue;
+            }
+
+            if (srcStoreDcId != null && store.getDataCenterId() != null && !srcStoreDcId.equals(store.getDataCenterId())) {
+                s_logger.warn("Source and destination stores are not in the same zone. Skipping destination store: " + store.getName());
+                continue;
+            }
+
+            destDatastores.add(id);
+            imagestores.add(store.getName());
+        }
+
+        if (destDatastores.size() < 1) {
+            throw new CloudRuntimeException("No destination valid store(s) available to migrate. Could" +
+                    "be due to invalid store ID(s) or store(s) are read-only. Terminating Migration of data");
+        }
+
+        if (isMigrateJobRunning()){
+            message = "A migrate job is in progress, please try again later...";
+            return new MigrationResponse(message, policy.toString(), false);
+        }
+
+        CallContext.current().setEventDetails("Migrating files/data objects " + "from : " + imagestores.get(0) + " to: " + imagestores.subList(1, imagestores.size()));
+        return  stgService.migrateData(srcImgStoreId, destDatastores, policy);
+    }
+
+
+    // Ensures that only one migrate job may occur at a time, in order to reduce load
+    private boolean isMigrateJobRunning() {
+        long count = jobMgr.countPendingJobs(null, MigrateSecondaryStorageDataCmd.class.getName());
+        if (count > 1) {
+            return true;
+        }
+        return false;
+    }
+}
diff --git a/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java b/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
index a2f97e8..0720927 100755
--- a/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
+++ b/server/src/main/java/com/cloud/storage/ImageStoreUploadMonitorImpl.java
@@ -25,6 +25,8 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.utils.Pair;
 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.EndPoint;
@@ -44,6 +46,7 @@
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
+import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
 import org.apache.cloudstack.utils.identity.ManagementServerNode;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
@@ -115,6 +118,8 @@
     private TemplateService templateService;
     @Inject
     private TemplateJoinDao templateJoinDao;
+    @Inject
+    private DeployAsIsHelper deployAsIsHelper;
 
     private long _nodeId;
     private ScheduledExecutorService _executor = null;
@@ -407,12 +412,26 @@
 
                             VMTemplateVO templateUpdate = _templateDao.createForUpdate();
                             templateUpdate.setSize(answer.getVirtualSize());
+                            if (template.getHypervisorType() == Hypervisor.HypervisorType.VMware) {
+                                Pair<String, String> guestOsInfo = answer.getGuestOsInfo();
+                                String minimumHardwareVersion = answer.getMinimumHardwareVersion();
+                                String osType = guestOsInfo.first();
+                                String osDescription = guestOsInfo.second();
+                                s_logger.info("Guest OS information retrieved from the template: " + osType + " - " + osDescription);
+                                try {
+                                    Long guestOsId = deployAsIsHelper.retrieveTemplateGuestOsIdFromGuestOsInfo(template.getId(),
+                                            osType, osDescription, minimumHardwareVersion);
+                                    templateUpdate.setGuestOSId(guestOsId);
+                                } catch (CloudRuntimeException e) {
+                                    s_logger.error("Could not map the guest OS to a CloudStack guest OS", e);
+                                }
+                            }
                             _templateDao.update(tmpTemplate.getId(), templateUpdate);
-                            // For multi-disk OVA, check and create data disk templates
+                            // For multi-disk OVA, check and create data disk templates or root disks as details
                             if (tmpTemplate.getFormat().equals(Storage.ImageFormat.OVA)) {
                                 final DataStore store = dataStoreManager.getDataStore(templateDataStore.getDataStoreId(), templateDataStore.getDataStoreRole());
                                 final TemplateInfo templateInfo = templateFactory.getTemplate(tmpTemplate.getId(), store);
-                                if (!templateService.createOvaDataDiskTemplates(templateInfo)) {
+                                if (!templateService.createOvaDataDiskTemplates(templateInfo, template.isDeployAsIs())) {
                                     tmpTemplateDataStore.setDownloadState(VMTemplateStorageResourceAssoc.Status.ABANDONED);
                                     tmpTemplateDataStore.setState(State.Failed);
                                     stateMachine.transitTo(tmpTemplate, VirtualMachineTemplate.Event.OperationFailed, null, _templateDao);
diff --git a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
index 3c4f007..96589f1 100644
--- a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/StorageManagerImpl.java
@@ -39,6 +39,12 @@
 
 import javax.inject.Inject;
 
+import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.dc.VsphereStoragePolicyVO;
+import com.cloud.dc.dao.VsphereStoragePolicyDao;
+import com.cloud.service.dao.ServiceOfferingDetailsDao;
+import com.cloud.utils.StringUtils;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd;
 import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd;
@@ -81,6 +87,8 @@
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.management.ManagementServerHost;
+import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
+import org.apache.cloudstack.storage.command.CheckDataStoreStoragePolicyComplainceCommand;
 import org.apache.cloudstack.storage.command.DettachCommand;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
 import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao;
@@ -151,7 +159,6 @@
 import com.cloud.resource.ResourceState;
 import com.cloud.server.ConfigurationServer;
 import com.cloud.server.ManagementServer;
-import com.cloud.server.StatsCollector;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.Volume.Type;
@@ -175,7 +182,6 @@
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
-import com.cloud.utils.StringUtils;
 import com.cloud.utils.UriUtils;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.component.ManagerBase;
@@ -199,6 +205,8 @@
 import com.cloud.vm.VirtualMachine.State;
 import com.cloud.vm.dao.VMInstanceDao;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class StorageManagerImpl extends ManagerBase implements StorageManager, ClusterManagerListener, Configurable {
     private static final Logger s_logger = Logger.getLogger(StorageManagerImpl.class);
@@ -296,6 +304,12 @@
     SnapshotService _snapshotService;
     @Inject
     StoragePoolTagsDao _storagePoolTagsDao;
+    @Inject
+    DiskOfferingDetailsDao _diskOfferingDetailsDao;
+    @Inject
+    ServiceOfferingDetailsDao _serviceOfferingDetailsDao;
+    @Inject
+    VsphereStoragePolicyDao _vsphereStoragePolicyDao;
 
     protected List<StoragePoolDiscoverer> _discoverers;
 
@@ -602,6 +616,7 @@
                 params.put("zoneId", host.getDataCenterId());
                 params.put("clusterId", host.getClusterId());
                 params.put("podId", host.getPodId());
+                params.put("hypervisorType", host.getHypervisorType());
                 params.put("url", pInfo.getPoolType().toString() + "://" + pInfo.getHost() + "/" + pInfo.getHostPath());
                 params.put("name", name);
                 params.put("localStorage", true);
@@ -687,6 +702,9 @@
                     && hypervisorType != HypervisorType.Any) {
                 throw new InvalidParameterValueException("zone wide storage pool is not supported for hypervisor type " + hypervisor);
             }
+        } else {
+            ClusterVO clusterVO = _clusterDao.findById(clusterId);
+            hypervisorType = clusterVO.getHypervisorType();
         }
 
         Map<String, String> details = extractApiParamAsMap(cmd.getDetails());
@@ -704,6 +722,7 @@
         params.put("zoneId", zone.getId());
         params.put("clusterId", clusterId);
         params.put("podId", podId);
+        params.put("hypervisorType", hypervisorType);
         params.put("url", cmd.getUrl());
         params.put("tags", cmd.getTags());
         params.put("name", cmd.getStoragePoolName());
@@ -792,11 +811,25 @@
             throw new IllegalArgumentException("Unable to find storage pool with ID: " + id);
         }
 
+        String name = cmd.getName();
+        if(org.apache.commons.lang.StringUtils.isNotBlank(name)) {
+            s_logger.debug("Updating Storage Pool name to: " + name);
+            pool.setName(name);
+            _storagePoolDao.update(pool.getId(), pool);
+        }
+
+
         final List<String> storagePoolTags = cmd.getTags();
         if (storagePoolTags != null) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Updating Storage Pool Tags to :" + storagePoolTags);
             }
+            if (pool.getPoolType() == StoragePoolType.DatastoreCluster) {
+                List<StoragePoolVO> childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+                for (StoragePoolVO childPool : childStoragePools) {
+                    _storagePoolTagsDao.persist(childPool.getId(), storagePoolTags);
+                }
+            }
             _storagePoolTagsDao.persist(pool.getId(), storagePoolTags);
         }
 
@@ -893,10 +926,54 @@
             s_logger.warn("Unable to delete storage id: " + id + " due to it is not in Maintenance state");
             throw new InvalidParameterValueException("Unable to delete storage due to it is not in Maintenance state, id: " + id);
         }
-        Pair<Long, Long> vlms = _volsDao.getCountAndTotalByPool(id);
+
+        if (sPool.getPoolType() == StoragePoolType.DatastoreCluster) {
+            // FR41 yet to handle on failure of deletion of any of the child storage pool
+            if (checkIfDataStoreClusterCanbeDeleted(sPool, forced)) {
+                Transaction.execute(new TransactionCallbackNoReturn() {
+                    @Override
+                    public void doInTransactionWithoutResult(TransactionStatus status) {
+                        List<StoragePoolVO> childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(sPool.getId());
+                        for (StoragePoolVO childPool : childStoragePools) {
+                            deleteDataStoreInternal(childPool, forced);
+                        }
+                    }
+                });
+            } else {
+                throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated " + "non-destroyed vols for this pool");
+            }
+        }
+        return deleteDataStoreInternal(sPool, forced);
+    }
+
+    private boolean checkIfDataStoreClusterCanbeDeleted(StoragePoolVO sPool, boolean forced) {
+        List<StoragePoolVO> childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(sPool.getId());
+        boolean canDelete = true;
+        for (StoragePoolVO childPool : childStoragePools) {
+            Pair<Long, Long> vlms = _volsDao.getCountAndTotalByPool(childPool.getId());
+            if (forced) {
+                if (vlms.first() > 0) {
+                    Pair<Long, Long> nonDstrdVlms = _volsDao.getNonDestroyedCountAndTotalByPool(childPool.getId());
+                    if (nonDstrdVlms.first() > 0) {
+                        canDelete = false;
+                        break;
+                    }
+                }
+            } else {
+                if (vlms.first() > 0) {
+                    canDelete = false;
+                    break;
+                }
+            }
+        }
+        return canDelete;
+    }
+
+    private boolean deleteDataStoreInternal(StoragePoolVO sPool, boolean forced) {
+        Pair<Long, Long> vlms = _volsDao.getCountAndTotalByPool(sPool.getId());
         if (forced) {
             if (vlms.first() > 0) {
-                Pair<Long, Long> nonDstrdVlms = _volsDao.getNonDestroyedCountAndTotalByPool(id);
+                Pair<Long, Long> nonDstrdVlms = _volsDao.getNonDestroyedCountAndTotalByPool(sPool.getId());
                 if (nonDstrdVlms.first() > 0) {
                     throw new CloudRuntimeException("Cannot delete pool " + sPool.getName() + " as there are associated " + "non-destroyed vols for this pool");
                 }
@@ -932,7 +1009,7 @@
         }
 
         _storagePoolDao.releaseFromLockTable(lock.getId());
-        s_logger.trace("Released lock for storage pool " + id);
+        s_logger.trace("Released lock for storage pool " + sPool.getId());
 
         DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(sPool.getStorageProviderName());
         DataStoreLifeCycle lifeCycle = storeProvider.getDataStoreLifeCycle();
@@ -971,13 +1048,13 @@
             BigDecimal overProvFactor = getStorageOverProvisioningFactor(storagePool.getId());
             totalOverProvCapacity = overProvFactor.multiply(new BigDecimal(storagePool.getCapacityBytes())).longValue();
             s_logger.debug("Found storage pool " + storagePool.getName() + " of type " + storagePool.getPoolType().toString() + " with overprovisioning factor " + overProvFactor.toString());
-            s_logger.debug("Total over provisioned capacity calculated is " + overProvFactor + " * " + storagePool.getCapacityBytes());
+            s_logger.debug("Total over provisioned capacity calculated is " + overProvFactor + " * " + toHumanReadableSize(storagePool.getCapacityBytes()));
         } else {
             s_logger.debug("Found storage pool " + storagePool.getName() + " of type " + storagePool.getPoolType().toString());
             totalOverProvCapacity = storagePool.getCapacityBytes();
         }
 
-        s_logger.debug("Total over provisioned capacity of the pool " + storagePool.getName() + " id: " + storagePool.getId() + " is " + totalOverProvCapacity);
+        s_logger.debug("Total over provisioned capacity of the pool " + storagePool.getName() + " id: " + storagePool.getId() + " is " + toHumanReadableSize(totalOverProvCapacity));
         CapacityState capacityState = CapacityState.Enabled;
         if (storagePool.getScope() == ScopeType.ZONE) {
             DataCenterVO dc = ApiDBUtils.findZoneById(storagePool.getDataCenterId());
@@ -1019,7 +1096,7 @@
                 _capacityDao.update(capacity.getId(), capacity);
             }
         }
-        s_logger.debug("Successfully set Capacity - " + totalOverProvCapacity + " for capacity type - " + capacityType + " , DataCenterId - " + storagePool.getDataCenterId() + ", HostOrPoolId - "
+        s_logger.debug("Successfully set Capacity - " + toHumanReadableSize(totalOverProvCapacity) + " for capacity type - " + capacityType + " , DataCenterId - " + storagePool.getDataCenterId() + ", HostOrPoolId - "
                 + storagePool.getId() + ", PodId " + storagePool.getPodId());
     }
 
@@ -1358,7 +1435,7 @@
         // so here we don't need to issue DeleteCommand to resource anymore, only need to remove db entry.
         try {
             // Cleanup templates in template_store_ref
-            List<DataStore> imageStores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(null));
+            List<DataStore> imageStores = _dataStoreMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(null));
             for (DataStore store : imageStores) {
                 try {
                     long storeId = store.getId();
@@ -1461,11 +1538,55 @@
         DataStoreProvider provider = _dataStoreProviderMgr.getDataStoreProvider(primaryStorage.getStorageProviderName());
         DataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle();
         DataStore store = _dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
+
+        if (primaryStorage.getPoolType() == StoragePoolType.DatastoreCluster) {
+            if (primaryStorage.getStatus() == StoragePoolStatus.PrepareForMaintenance) {
+                throw new CloudRuntimeException(String.format("There is already a job running for preparation for maintenance of the storage pool %s", primaryStorage.getUuid()));
+            }
+            handlePrepareDatastoreCluserMaintenance(lifeCycle, primaryStorageId);
+        }
         lifeCycle.maintain(store);
 
         return (PrimaryDataStoreInfo)_dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
     }
 
+    private void handlePrepareDatastoreCluserMaintenance(DataStoreLifeCycle lifeCycle, Long primaryStorageId) {
+        StoragePoolVO datastoreCluster = _storagePoolDao.findById(primaryStorageId);
+        datastoreCluster.setStatus(StoragePoolStatus.PrepareForMaintenance);
+        _storagePoolDao.update(datastoreCluster.getId(), datastoreCluster);
+
+        // Before preparing the datastorecluster to maintenance mode, the storagepools in the datastore cluster needs to put in maintenance
+        List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(primaryStorageId);
+        Transaction.execute(new TransactionCallbackNoReturn() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) {
+                for (StoragePoolVO childDatastore : childDatastores) {
+                    // set the pool state to prepare for maintenance, so that VMs will not migrate to the storagepools in the same cluster
+                    childDatastore.setStatus(StoragePoolStatus.PrepareForMaintenance);
+                    _storagePoolDao.update(childDatastore.getId(), childDatastore);
+                }
+            }
+        });
+        for (Iterator<StoragePoolVO> iteratorChildDatastore = childDatastores.listIterator(); iteratorChildDatastore.hasNext(); ) {
+            DataStore childStore = _dataStoreMgr.getDataStore(iteratorChildDatastore.next().getId(), DataStoreRole.Primary);
+            try {
+                lifeCycle.maintain(childStore);
+            } catch (Exception e) {
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug(String.format("Exception on maintenance preparation of one of the child datastores in datastore cluster %d with error %s", primaryStorageId, e));
+                }
+                // Set to ErrorInMaintenance state of all child storage pools and datastore cluster
+                for (StoragePoolVO childDatastore : childDatastores) {
+                    childDatastore.setStatus(StoragePoolStatus.ErrorInMaintenance);
+                    _storagePoolDao.update(childDatastore.getId(), childDatastore);
+                }
+                datastoreCluster.setStatus(StoragePoolStatus.ErrorInMaintenance);
+                _storagePoolDao.update(datastoreCluster.getId(), datastoreCluster);
+                throw new CloudRuntimeException(String.format("Failed to prepare maintenance mode for datastore cluster %d with error %s %s", primaryStorageId, e.getMessage(), e));
+            }
+        }
+    }
+
     @Override
     @DB
     public PrimaryDataStoreInfo cancelPrimaryStorageForMaintenance(CancelPrimaryStorageMaintenanceCmd cmd) throws ResourceUnavailableException {
@@ -1488,6 +1609,16 @@
         DataStoreProvider provider = _dataStoreProviderMgr.getDataStoreProvider(primaryStorage.getStorageProviderName());
         DataStoreLifeCycle lifeCycle = provider.getDataStoreLifeCycle();
         DataStore store = _dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
+        if (primaryStorage.getPoolType() == StoragePoolType.DatastoreCluster) {
+            primaryStorage.setStatus(StoragePoolStatus.Up);
+            _storagePoolDao.update(primaryStorage.getId(), primaryStorage);
+            //FR41 need to handle when one of the primary stores is unable to cancel the maintenance mode
+            List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(primaryStorageId);
+            for (StoragePoolVO childDatastore : childDatastores) {
+                DataStore childStore = _dataStoreMgr.getDataStore(childDatastore.getId(), DataStoreRole.Primary);
+                lifeCycle.cancelMaintain(childStore);
+            }
+        }
         lifeCycle.cancelMaintain(store);
 
         return (PrimaryDataStoreInfo)_dataStoreMgr.getDataStore(primaryStorage.getId(), DataStoreRole.Primary);
@@ -1720,31 +1851,21 @@
             return true;
         }
 
-        StatsCollector sc = StatsCollector.getInstance();
         double storageUsedThreshold = CapacityManager.StorageCapacityDisableThreshold.valueIn(pool.getDataCenterId());
-        if (sc != null) {
-            long totalSize = pool.getCapacityBytes();
-            StorageStats stats = sc.getStoragePoolStats(pool.getId());
-            if (stats == null) {
-                stats = sc.getStorageStats(pool.getId());
-            }
-            if (stats != null) {
-                double usedPercentage = ((double)stats.getByteUsed() / (double)totalSize);
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Checking pool " + pool.getId() + " for storage, totalSize: " + pool.getCapacityBytes() + ", usedBytes: " + stats.getByteUsed() + ", usedPct: " + usedPercentage
-                            + ", disable threshold: " + storageUsedThreshold);
-                }
-                if (usedPercentage >= storageUsedThreshold) {
-                    if (s_logger.isDebugEnabled()) {
-                        s_logger.debug("Insufficient space on pool: " + pool.getId() + " since its usage percentage: " + usedPercentage + " has crossed the pool.storage.capacity.disablethreshold: "
-                                + storageUsedThreshold);
-                    }
-                    return false;
-                }
-            }
-            return true;
+        long totalSize = pool.getCapacityBytes();
+        double usedPercentage = ((double)pool.getUsedBytes() / (double)totalSize);
+        if (s_logger.isDebugEnabled()) {
+            s_logger.debug("Checking pool " + pool.getId() + " for storage, totalSize: " + pool.getCapacityBytes() + ", usedBytes: " + pool.getUsedBytes() +
+                    ", usedPct: " + usedPercentage + ", disable threshold: " + storageUsedThreshold);
         }
-        return false;
+        if (usedPercentage >= storageUsedThreshold) {
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug("Insufficient space on pool: " + pool.getId() + " since its usage percentage: " + usedPercentage +
+                        " has crossed the pool.storage.capacity.disablethreshold: " + storageUsedThreshold);
+            }
+            return false;
+        }
+        return true;
     }
 
     @Override
@@ -1862,6 +1983,57 @@
         }
     }
 
+    @Override
+    public boolean isStoragePoolComplaintWithStoragePolicy(List<Volume> volumes, StoragePool pool) throws StorageUnavailableException {
+        if (volumes == null || volumes.isEmpty()) {
+            return false;
+        }
+        List<Pair<Volume, Answer>> answers = new ArrayList<Pair<Volume, Answer>>();
+
+        for (Volume volume : volumes) {
+            String storagePolicyId = null;
+            if (volume.getVolumeType() == Type.ROOT) {
+                Long vmId = volume.getInstanceId();
+                if (vmId != null) {
+                    VMInstanceVO vm = _vmInstanceDao.findByIdIncludingRemoved(vmId);
+                    storagePolicyId = _serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(), ApiConstants.STORAGE_POLICY);
+                }
+            } else {
+                storagePolicyId = _diskOfferingDetailsDao.getDetail(volume.getDiskOfferingId(), ApiConstants.STORAGE_POLICY);
+            }
+            if (org.apache.commons.lang.StringUtils.isNotEmpty(storagePolicyId)) {
+                VsphereStoragePolicyVO storagePolicyVO = _vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyId));
+                List<Long> hostIds = getUpHostsInPool(pool.getId());
+                Collections.shuffle(hostIds);
+
+                if (hostIds == null || hostIds.isEmpty()) {
+                    throw new StorageUnavailableException("Unable to send command to the pool " + pool.getName() + " due to there is no enabled hosts up in this cluster", pool.getId());
+                }
+                try {
+                    StorageFilerTO storageFilerTO = new StorageFilerTO(pool);
+                    CheckDataStoreStoragePolicyComplainceCommand cmd = new CheckDataStoreStoragePolicyComplainceCommand(storagePolicyVO.getPolicyId(), storageFilerTO);
+                    long targetHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostIds.get(0), cmd);
+                    Answer answer = _agentMgr.send(targetHostId, cmd);
+                    answers.add(new Pair<>(volume, answer));
+                } catch (AgentUnavailableException e) {
+                    s_logger.debug("Unable to send storage pool command to " + pool + " via " + hostIds.get(0), e);
+                    throw new StorageUnavailableException("Unable to send command to the pool ", pool.getId());
+                } catch (OperationTimedoutException e) {
+                    s_logger.debug("Failed to process storage pool command to " + pool + " via " + hostIds.get(0), e);
+                    throw new StorageUnavailableException("Failed to process storage command to the pool ", pool.getId());
+                }
+            }
+        }
+        // check cummilative result for all volumes
+        for (Pair<Volume, Answer> answer : answers) {
+            if (!answer.second().getResult()) {
+                s_logger.debug(String.format("Storage pool %s is not compliance with storage policy for volume %s", pool.getUuid(), answer.first().getName()));
+                return false;
+            }
+        }
+        return true;
+    }
+
     private boolean checkPoolforSpace(StoragePool pool, long allocatedSizeWithTemplate, long totalAskingSize) {
         // allocated space includes templates
         StoragePoolVO poolVO = _storagePoolDao.findById(pool.getId());
@@ -1874,20 +2046,20 @@
             totalOverProvCapacity = overProvFactor.multiply(new BigDecimal(pool.getCapacityBytes())).longValue();
 
             s_logger.debug("Found storage pool " + poolVO.getName() + " of type " + pool.getPoolType().toString() + " with over-provisioning factor " + overProvFactor.toString());
-            s_logger.debug("Total over-provisioned capacity calculated is " + overProvFactor + " * " + pool.getCapacityBytes());
+            s_logger.debug("Total over-provisioned capacity calculated is " + overProvFactor + " * " + toHumanReadableSize(pool.getCapacityBytes()));
         } else {
             totalOverProvCapacity = pool.getCapacityBytes();
 
             s_logger.debug("Found storage pool " + poolVO.getName() + " of type " + pool.getPoolType().toString());
         }
 
-        s_logger.debug("Total capacity of the pool " + poolVO.getName() + " with ID " + pool.getId() + " is " + totalOverProvCapacity);
+        s_logger.debug("Total capacity of the pool " + poolVO.getName() + " with ID " + pool.getId() + " is " + toHumanReadableSize(totalOverProvCapacity));
 
         double storageAllocatedThreshold = CapacityManager.StorageAllocatedCapacityDisableThreshold.valueIn(pool.getDataCenterId());
 
         if (s_logger.isDebugEnabled()) {
-            s_logger.debug("Checking pool: " + pool.getId() + " for storage allocation , maxSize : " + totalOverProvCapacity + ", totalAllocatedSize : " + allocatedSizeWithTemplate
-                    + ", askingSize : " + totalAskingSize + ", allocated disable threshold: " + storageAllocatedThreshold);
+            s_logger.debug("Checking pool: " + pool.getId() + " for storage allocation , maxSize : " + toHumanReadableSize(totalOverProvCapacity) + ", totalAllocatedSize : " + toHumanReadableSize(allocatedSizeWithTemplate)
+                    + ", askingSize : " + toHumanReadableSize(totalAskingSize) + ", allocated disable threshold: " + storageAllocatedThreshold);
         }
 
         double usedPercentage = (allocatedSizeWithTemplate + totalAskingSize) / (double)(totalOverProvCapacity);
@@ -1903,8 +2075,8 @@
 
         if (totalOverProvCapacity < (allocatedSizeWithTemplate + totalAskingSize)) {
             if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Insufficient un-allocated capacity on: " + pool.getId() + " for storage allocation, not enough storage, maxSize : " + totalOverProvCapacity
-                        + ", totalAllocatedSize : " + allocatedSizeWithTemplate + ", askingSize : " + totalAskingSize);
+                s_logger.debug("Insufficient un-allocated capacity on: " + pool.getId() + " for storage allocation, not enough storage, maxSize : " + toHumanReadableSize(totalOverProvCapacity)
+                        + ", totalAllocatedSize : " + toHumanReadableSize(allocatedSizeWithTemplate) + ", askingSize : " + toHumanReadableSize(totalAskingSize));
             }
 
             return false;
@@ -2147,6 +2319,18 @@
         return discoverImageStore(name, url, providerName, null, details);
     }
 
+    @Override
+    public ImageStore updateImageStoreStatus(Long id, Boolean readonly) {
+        // Input validation
+        ImageStoreVO imageStoreVO = _imageStoreDao.findById(id);
+        if (imageStoreVO == null) {
+            throw new IllegalArgumentException("Unable to find image store with ID: " + id);
+        }
+        imageStoreVO.setReadonly(readonly);
+        _imageStoreDao.update(id, imageStoreVO);
+        return imageStoreVO;
+    }
+
     private void duplicateCacheStoreRecordsToRegionStore(long storeId) {
         _templateStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
         _snapshotStoreDao.duplicateCacheRecordsOnRegionStore(storeId);
@@ -2501,7 +2685,9 @@
                 KvmStorageOnlineMigrationWait,
                 KvmAutoConvergence,
                 MaxNumberOfManagedClusteredFileSystems,
-                PRIMARY_STORAGE_DOWNLOAD_WAIT
+                PRIMARY_STORAGE_DOWNLOAD_WAIT,
+                SecStorageMaxMigrateSessions,
+                MaxDataMigrationWaitTime
         };
     }
 
@@ -2532,6 +2718,15 @@
         return disk;
     }
 
+    @Override
+    public boolean isStoragePoolDatastoreClusterParent(StoragePool pool) {
+        List<StoragePoolVO> childStoragePools = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+        if (childStoragePools != null && !childStoragePools.isEmpty()) {
+            return true;
+        }
+        return false;
+    }
+
     private void setVolumeObjectTOThrottling(VolumeObjectTO volumeTO, final ServiceOffering offering, final DiskOffering diskOffering) {
         volumeTO.setBytesReadRate(getDiskBytesReadRate(offering, diskOffering));
         volumeTO.setBytesWriteRate(getDiskBytesWriteRate(offering, diskOffering));
diff --git a/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java b/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java
index 4ffd7d8..3e8822e 100644
--- a/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java
+++ b/server/src/main/java/com/cloud/storage/StoragePoolAutomationImpl.java
@@ -117,9 +117,11 @@
                 spes = primaryDataStoreDao.listBy(pool.getDataCenterId(), pool.getPodId(), pool.getClusterId(), ScopeType.CLUSTER);
             }
             for (StoragePoolVO sp : spes) {
-                if (sp.getStatus() == StoragePoolStatus.PrepareForMaintenance) {
-                    throw new CloudRuntimeException("Only one storage pool in a cluster can be in PrepareForMaintenance mode, " + sp.getId() +
-                        " is already in  PrepareForMaintenance mode ");
+                if (sp.getParent() != pool.getParent() && sp.getId() != pool.getParent()) { // If Datastore cluster is tried to prepare for maintenance then child storage pools are also kept in PrepareForMaintenance mode
+                    if (sp.getStatus() == StoragePoolStatus.PrepareForMaintenance) {
+                        throw new CloudRuntimeException("Only one storage pool in a cluster can be in PrepareForMaintenance mode, " + sp.getId() +
+                                " is already in  PrepareForMaintenance mode ");
+                    }
                 }
             }
             StoragePool storagePool = (StoragePool)store;
@@ -319,7 +321,7 @@
                 }
             } else {
                 if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("ModifyStoragePool add secceeded");
+                    s_logger.debug("ModifyStoragePool add succeeded");
                 }
             }
         }
diff --git a/server/src/main/java/com/cloud/storage/TemplateProfile.java b/server/src/main/java/com/cloud/storage/TemplateProfile.java
index 304b652..b904094 100644
--- a/server/src/main/java/com/cloud/storage/TemplateProfile.java
+++ b/server/src/main/java/com/cloud/storage/TemplateProfile.java
@@ -52,6 +52,7 @@
     Boolean isDynamicallyScalable;
     TemplateType templateType;
     Boolean directDownload;
+    Boolean deployAsIs;
     Long size;
 
     public TemplateProfile(Long templateId, Long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHvm, String url,
@@ -95,7 +96,7 @@
             Boolean isPublic, Boolean featured, Boolean isExtractable, ImageFormat format, Long guestOsId, List<Long> zoneId,
 
             HypervisorType hypervisorType, String accountName, Long domainId, Long accountId, String chksum, Boolean bootable, String templateTag, Map details,
-            Boolean sshKeyEnabled, Long imageStoreId, Boolean isDynamicallyScalable, TemplateType templateType, Boolean directDownload) {
+            Boolean sshKeyEnabled, Long imageStoreId, Boolean isDynamicallyScalable, TemplateType templateType, Boolean directDownload, Boolean deployAsIs) {
         this(templateId,
             userId,
             name,
@@ -122,6 +123,7 @@
         this.isDynamicallyScalable = isDynamicallyScalable;
         this.templateType = templateType;
         this.directDownload = directDownload;
+        this.deployAsIs = deployAsIs;
     }
 
     public Long getTemplateId() {
@@ -331,4 +333,8 @@
     public void setSize(Long size) {
         this.size = size;
     }
+
+    public boolean isDeployAsIs() {
+        return this.deployAsIs;
+    }
 }
diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
index 35314e8..0adeb83 100644
--- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
@@ -25,11 +25,13 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 
 import javax.inject.Inject;
 
+import com.cloud.dc.Pod;
 import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
@@ -47,6 +49,7 @@
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.HostScope;
+import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
@@ -148,6 +151,8 @@
 import com.cloud.utils.component.ManagerBase;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
+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.TransactionCallbackWithException;
@@ -893,7 +898,7 @@
         DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
         DiskOfferingVO newDiskOffering = null;
 
-        if (cmd.getNewDiskOfferingId() != null && volume.getDiskOfferingId() != cmd.getNewDiskOfferingId()) {
+        if (cmd.getNewDiskOfferingId() != null) {
             newDiskOffering = _diskOfferingDao.findById(cmd.getNewDiskOfferingId());
         }
 
@@ -912,6 +917,12 @@
 
         // if we are to use the existing disk offering
         if (newDiskOffering == null) {
+            if (volume.getVolumeType().equals(Volume.Type.ROOT) && diskOffering.getDiskSize() > 0) {
+                throw new InvalidParameterValueException(
+                        "Failed to resize Root volume. The service offering of this Volume has been configured with a root disk size; "
+                                + "on such case a Root Volume can only be resized when changing to another Service Offering with a Root disk size. "
+                                + "For more details please check out the Official Resizing Volumes documentation.");
+            }
             newSize = cmd.getSize();
             newHypervisorSnapshotReserve = volume.getHypervisorSnapshotReserve();
 
@@ -957,10 +968,6 @@
                 throw new InvalidParameterValueException("Requested disk offering has been removed.");
             }
 
-            if (!DiskOfferingVO.Type.Disk.equals(newDiskOffering.getType())) {
-                throw new InvalidParameterValueException("Requested disk offering type is invalid.");
-            }
-
             if (diskOffering.getTags() != null) {
                 if (!StringUtils.areTagsEqual(diskOffering.getTags(), newDiskOffering.getTags())) {
                     throw new InvalidParameterValueException("The tags on the new and old disk offerings must match.");
@@ -971,7 +978,9 @@
 
             _configMgr.checkDiskOfferingAccess(_accountMgr.getActiveAccountById(volume.getAccountId()), newDiskOffering, _dcDao.findById(volume.getDataCenterId()));
 
-            if (newDiskOffering.isCustomized()) {
+            if (newDiskOffering.getDiskSize() > 0 && DiskOfferingVO.Type.Service.equals(newDiskOffering.getType())) {
+                newSize = newDiskOffering.getDiskSize();
+            } else if (newDiskOffering.isCustomized()) {
                 newSize = cmd.getSize();
 
                 if (newSize == null) {
@@ -988,9 +997,9 @@
                 newSize = newDiskOffering.getDiskSize();
             }
 
-            if (!volume.getSize().equals(newSize) && !volume.getVolumeType().equals(Volume.Type.DATADISK)) {
-                throw new InvalidParameterValueException("Only data volumes can be resized via a new disk offering.");
-            }
+            Long instanceId = volume.getInstanceId();
+            VMInstanceVO vmInstanceVO = _vmInstanceDao.findById(instanceId);
+            checkIfVolumeIsRootAndVmIsRunning(newSize, volume, vmInstanceVO);
 
             if (newDiskOffering.isCustomizedIops() != null && newDiskOffering.isCustomizedIops()) {
                 newMinIops = cmd.getMinIops() != null ? cmd.getMinIops() : volume.getMinIops();
@@ -1139,6 +1148,13 @@
                 shrinkOk);
     }
 
+    private void checkIfVolumeIsRootAndVmIsRunning(Long newSize, VolumeVO volume, VMInstanceVO vmInstanceVO) {
+        if (!volume.getSize().equals(newSize) && volume.getVolumeType().equals(Volume.Type.ROOT) && !State.Stopped.equals(vmInstanceVO.getState())) {
+            throw new InvalidParameterValueException(String.format("Cannot resize ROOT volume [%s] when VM is not on Stopped State. VM %s is in state %.", volume.getName(), vmInstanceVO
+                    .getInstanceName(), vmInstanceVO.getState()));
+        }
+    }
+
     private void validateIops(Long minIops, Long maxIops) {
         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.");
@@ -1500,8 +1516,9 @@
 
         UserVmVO vm = _userVmDao.findById(vmId);
         VolumeVO exstingVolumeOfVm = null;
+        VMTemplateVO template = _templateDao.findById(vm.getTemplateId());
         List<VolumeVO> rootVolumesOfVm = _volsDao.findByInstanceAndType(vmId, Volume.Type.ROOT);
-        if (rootVolumesOfVm.size() > 1) {
+        if (rootVolumesOfVm.size() > 1 && template != null && !template.isDeployAsIs()) {
             throw new CloudRuntimeException("The VM " + vm.getHostName() + " has more than one ROOT volume and is in an invalid state.");
         } else {
             if (!rootVolumesOfVm.isEmpty()) {
@@ -1776,7 +1793,13 @@
             if (pool.getDataCenterId() != volume.getDataCenterId()) {
                 throw new InvalidParameterValueException("Invalid storageId specified; refers to the pool outside of the volume's zone");
             }
-            volume.setPoolId(pool.getId());
+            if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+                List<StoragePoolVO> childDatastores = _storagePoolDao.listChildStoragePoolsInDatastoreCluster(storageId);
+                Collections.shuffle(childDatastores);
+                volume.setPoolId(childDatastores.get(0).getId());
+            } else {
+                volume.setPoolId(pool.getId());
+            }
         }
 
         if (customId != null) {
@@ -2018,6 +2041,14 @@
 
             DataTO volTO = volFactory.getVolume(volume.getId()).getTO();
             DiskTO disk = new DiskTO(volTO, volume.getDeviceId(), volume.getPath(), volume.getVolumeType());
+            Map<String, String> details = new HashMap<String, String>();
+            disk.setDetails(details);
+            if (volume.getPoolId() != null) {
+                StoragePoolVO poolVO = _storagePoolDao.findById(volume.getPoolId());
+                if (poolVO.getParent() != 0L) {
+                    details.put(DiskTO.PROTOCOL_TYPE, Storage.StoragePoolType.DatastoreCluster.toString());
+                }
+            }
 
             DettachCommand cmd = new DettachCommand(disk, vm.getInstanceName());
 
@@ -2039,6 +2070,34 @@
             // Mark the volume as detached
             _volsDao.detachVolume(volume.getId());
 
+            if (answer != null) {
+                String datastoreName = answer.getContextParam("datastoreName");
+                if (datastoreName != null) {
+                    StoragePoolVO storagePoolVO = _storagePoolDao.findByUuid(datastoreName);
+                    if (storagePoolVO != null) {
+                        VolumeVO volumeVO = _volsDao.findById(volumeId);
+                        volumeVO.setPoolId(storagePoolVO.getId());
+                        _volsDao.update(volumeVO.getId(), volumeVO);
+                    } else {
+                        s_logger.warn(String.format("Unable to find datastore %s while updating the new datastore of the volume %d", datastoreName, volumeId));
+                    }
+                }
+
+                String volumePath = answer.getContextParam("volumePath");
+                if (volumePath != null) {
+                    VolumeVO volumeVO = _volsDao.findById(volumeId);
+                    volumeVO.setPath(volumePath);
+                    _volsDao.update(volumeVO.getId(), volumeVO);
+                }
+
+                String chainInfo = answer.getContextParam("chainInfo");
+                if (chainInfo != null) {
+                    VolumeVO volumeVO = _volsDao.findById(volumeId);
+                    volumeVO.setChainInfo(chainInfo);
+                    _volsDao.update(volumeVO.getId(), volumeVO);
+                }
+            }
+
             // volume.getPoolId() should be null if the VM we are detaching the disk from has never been started before
             if (volume.getPoolId() != null) {
                 DataStore dataStore = dataStoreMgr.getDataStore(volume.getPoolId(), DataStoreRole.Primary);
@@ -2198,6 +2257,14 @@
             throw new InvalidParameterValueException("Cannot migrate volume " + vol + "to the destination storage pool " + destPool.getName() + " as the storage pool is in maintenance mode.");
         }
 
+        String poolUuid =  destPool.getUuid();
+        if (destPool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+            DataCenter dc = _entityMgr.findById(DataCenter.class, vol.getDataCenterId());
+            Pod destPoolPod = _entityMgr.findById(Pod.class, destPool.getPodId());
+
+            destPool = _volumeMgr.findChildDataStoreInDataStoreCluster(dc, destPoolPod, destPool.getClusterId(), null, null, destPool.getId());
+        }
+
         if (!storageMgr.storagePoolHasEnoughSpace(Collections.singletonList(vol), destPool)) {
             throw new CloudRuntimeException("Storage pool " + destPool.getName() + " does not have enough space to migrate volume " + vol.getName());
         }
@@ -2205,7 +2272,7 @@
         // OfflineVmwareMigration: check storage tags on disk(offering)s in comparison to destination storage pool
         // OfflineVmwareMigration: if no match return a proper error now
         DiskOfferingVO diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId());
-        if (diskOffering.equals(null)) {
+        if (diskOffering == null) {
             throw new CloudRuntimeException("volume '" + vol.getUuid() + "', has no diskoffering. Migration target cannot be checked.");
         }
         if (!doesTargetStorageSupportDiskOffering(destPool, diskOffering)) {
@@ -2236,6 +2303,19 @@
                 updateMissingRootDiskController(vm, vol.getChainInfo());
             }
         }
+
+        HypervisorType hypervisorType = _volsDao.getHypervisorType(volumeId);
+        if (hypervisorType.equals(HypervisorType.VMware)) {
+            try {
+                boolean isStoragePoolStoragepolicyComplaince = storageMgr.isStoragePoolComplaintWithStoragePolicy(Arrays.asList(vol), destPool);
+                if (!isStoragePoolStoragepolicyComplaince) {
+                    throw new CloudRuntimeException(String.format("Storage pool %s is not storage policy compliance with the volume %s", poolUuid, vol.getUuid()));
+                }
+            } catch (StorageUnavailableException e) {
+                throw new CloudRuntimeException(String.format("Could not verify storage policy compliance against storage pool %s due to exception %s", destPool.getUuid(), e.getMessage()));
+            }
+        }
+
         DiskOfferingVO newDiskOffering = retrieveAndValidateNewDiskOffering(cmd);
         validateConditionsToReplaceDiskOfferingOfVolume(vol, newDiskOffering, destPool);
         if (vm != null) {
@@ -2721,9 +2801,11 @@
         }
 
         // Check if the url already exists
-        VolumeDataStoreVO volumeStoreRef = _volumeStoreDao.findByVolume(volumeId);
-        if (volumeStoreRef != null && volumeStoreRef.getExtractUrl() != null) {
-            return volumeStoreRef.getExtractUrl();
+        SearchCriteria<VolumeDataStoreVO> sc = _volumeStoreDao.createSearchCriteria();
+
+        Optional<String> extractUrl = setExtractVolumeSearchCriteria(sc, volume);
+        if (extractUrl.isPresent()) {
+            return extractUrl.get();
         }
 
         VMInstanceVO vm = null;
@@ -2778,6 +2860,49 @@
         return orchestrateExtractVolume(volume.getId(), zoneId);
     }
 
+    private Optional<String> setExtractVolumeSearchCriteria(SearchCriteria<VolumeDataStoreVO> sc, VolumeVO volume) {
+        final long volumeId = volume.getId();
+        sc.addAnd("state", SearchCriteria.Op.EQ, ObjectInDataStoreStateMachine.State.Ready.toString());
+        sc.addAnd("volumeId", SearchCriteria.Op.EQ, volumeId);
+        sc.addAnd("destroyed", SearchCriteria.Op.EQ, false);
+        // the volume should not change (attached/detached, vm not updated) after created
+        if (volume.getVolumeType() == Volume.Type.ROOT) { // for ROOT disk
+            VMInstanceVO vm = _vmInstanceDao.findById(volume.getInstanceId());
+            sc.addAnd("updated", SearchCriteria.Op.GTEQ, vm.getUpdateTime());
+        } else if (volume.getVolumeType() == Volume.Type.DATADISK && volume.getInstanceId() == null) { // for not attached DATADISK
+            sc.addAnd("updated", SearchCriteria.Op.GTEQ, volume.getUpdated());
+        } else { // for attached DATA DISK
+            VMInstanceVO vm = _vmInstanceDao.findById(volume.getInstanceId());
+            sc.addAnd("updated", SearchCriteria.Op.GTEQ, vm.getUpdateTime());
+            sc.addAnd("updated", SearchCriteria.Op.GTEQ, volume.getUpdated());
+        }
+        Filter filter = new Filter(VolumeDataStoreVO.class, "created", false, 0L, 1L);
+        List<VolumeDataStoreVO> volumeStoreRefs = _volumeStoreDao.search(sc, filter);
+        VolumeDataStoreVO volumeStoreRef = null;
+        if (volumeStoreRefs != null && !volumeStoreRefs.isEmpty()) {
+            volumeStoreRef = volumeStoreRefs.get(0);
+        }
+        if (volumeStoreRef != null && volumeStoreRef.getExtractUrl() != null) {
+            return Optional.ofNullable(volumeStoreRef.getExtractUrl());
+        } else if (volumeStoreRef != null) {
+            s_logger.debug("volume " + volumeId + " is already installed on secondary storage, install path is " +
+                    volumeStoreRef.getInstallPath());
+            VolumeInfo destVol = volFactory.getVolume(volumeId, DataStoreRole.Image);
+            if (destVol == null) {
+                throw new CloudRuntimeException("Failed to find the volume on a secondary store");
+            }
+            ImageStoreEntity secStore = (ImageStoreEntity) dataStoreMgr.getDataStore(volumeStoreRef.getDataStoreId(), DataStoreRole.Image);
+            String extractUrl = secStore.createEntityExtractUrl(volumeStoreRef.getInstallPath(), volume.getFormat(), destVol);
+            volumeStoreRef = _volumeStoreDao.findByVolume(volumeId);
+            volumeStoreRef.setExtractUrl(extractUrl);
+            volumeStoreRef.setExtractUrlCreated(DateUtil.now());
+            _volumeStoreDao.update(volumeStoreRef.getId(), volumeStoreRef);
+            return Optional.ofNullable(extractUrl);
+        }
+
+        return Optional.empty();
+    }
+
     private String orchestrateExtractVolume(long volumeId, long zoneId) {
         // get latest volume state to make sure that it is not updated by other parallel operations
         VolumeVO volume = _volsDao.findById(volumeId);
@@ -2794,24 +2919,26 @@
 
         // Copy volume from primary to secondary storage
         VolumeInfo srcVol = volFactory.getVolume(volumeId);
-        AsyncCallFuture<VolumeApiResult> cvAnswer = volService.copyVolume(srcVol, secStore);
-        // Check if you got a valid answer.
+        VolumeInfo destVol = volFactory.getVolume(volumeId, DataStoreRole.Image);
         VolumeApiResult cvResult = null;
-        try {
-            cvResult = cvAnswer.get();
-        } catch (InterruptedException e1) {
-            s_logger.debug("failed copy volume", e1);
-            throw new CloudRuntimeException("Failed to copy volume", e1);
-        } catch (ExecutionException e1) {
-            s_logger.debug("failed copy volume", e1);
-            throw new CloudRuntimeException("Failed to copy volume", e1);
+        if (destVol == null) {
+            AsyncCallFuture<VolumeApiResult> cvAnswer = volService.copyVolume(srcVol, secStore);
+            // Check if you got a valid answer.
+            try {
+                cvResult = cvAnswer.get();
+            } catch (InterruptedException e1) {
+                s_logger.debug("failed copy volume", e1);
+                throw new CloudRuntimeException("Failed to copy volume", e1);
+            } catch (ExecutionException e1) {
+                s_logger.debug("failed copy volume", e1);
+                throw new CloudRuntimeException("Failed to copy volume", e1);
+            }
+            if (cvResult == null || cvResult.isFailed()) {
+                String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage.";
+                throw new CloudRuntimeException(errorString);
+            }
         }
-        if (cvResult == null || cvResult.isFailed()) {
-            String errorString = "Failed to copy the volume from the source primary storage pool to secondary storage.";
-            throw new CloudRuntimeException(errorString);
-        }
-
-        VolumeInfo vol = cvResult.getVolume();
+        VolumeInfo vol = cvResult != null ? cvResult.getVolume() : destVol;
 
         String extractUrl = secStore.createEntityExtractUrl(vol.getPath(), vol.getFormat(), vol);
         VolumeDataStoreVO volumeStoreRef = _volumeStoreDao.findByVolume(volumeId);
@@ -3031,6 +3158,14 @@
                     details.put(DiskTO.CHAP_TARGET_USERNAME, chapInfo.getTargetUsername());
                     details.put(DiskTO.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
                 }
+
+                if (volumeToAttach.getPoolId() != null) {
+                    StoragePoolVO poolVO = _storagePoolDao.findById(volumeToAttach.getPoolId());
+                    if (poolVO.getParent() != 0L) {
+                        details.put(DiskTO.PROTOCOL_TYPE, Storage.StoragePoolType.DatastoreCluster.toString());
+                    }
+                }
+
                 _userVmDao.loadDetails(vm);
                 Map<String, String> controllerInfo = new HashMap<String, String>();
                 controllerInfo.put(VmDetailConstants.ROOT_DISK_CONTROLLER, vm.getDetail(VmDetailConstants.ROOT_DISK_CONTROLLER));
@@ -3059,7 +3194,13 @@
 
                     if (volumeToAttachStoragePool.isManaged() && volumeToAttach.getPath() == null) {
                         volumeToAttach.setPath(answer.getDisk().getPath());
+                        _volsDao.update(volumeToAttach.getId(), volumeToAttach);
+                    }
 
+                    String chainInfo = answer.getContextParam("chainInfo");
+                    if (chainInfo != null) {
+                        volumeToAttach = _volsDao.findById(volumeToAttach.getId());
+                        volumeToAttach.setChainInfo(chainInfo);
                         _volsDao.update(volumeToAttach.getId(), volumeToAttach);
                     }
                 } else {
@@ -3120,7 +3261,11 @@
         Integer maxDataVolumesSupported = null;
         if (host != null) {
             _hostDao.loadDetails(host);
-            maxDataVolumesSupported = _hypervisorCapabilitiesDao.getMaxDataVolumesLimit(host.getHypervisorType(), host.getDetail("product_version"));
+            String hypervisorVersion = host.getDetail("product_version");
+            if (org.apache.commons.lang.StringUtils.isBlank(hypervisorVersion)) {
+                hypervisorVersion = host.getHypervisorVersion();
+            }
+            maxDataVolumesSupported = _hypervisorCapabilitiesDao.getMaxDataVolumesLimit(host.getHypervisorType(), hypervisorVersion);
         } else {
             HypervisorType hypervisorType = vm.getHypervisorType();
             if (hypervisorType != null && CollectionUtils.isNotEmpty(supportingDefaultHV) && supportingDefaultHV.contains(hypervisorType)) {
diff --git a/server/src/main/java/com/cloud/storage/download/DownloadListener.java b/server/src/main/java/com/cloud/storage/download/DownloadListener.java
index 51f9d42..25dffb3 100644
--- a/server/src/main/java/com/cloud/storage/download/DownloadListener.java
+++ b/server/src/main/java/com/cloud/storage/download/DownloadListener.java
@@ -297,7 +297,7 @@
         }*/
         else if (cmd instanceof StartupSecondaryStorageCommand) {
             try{
-                List<DataStore> imageStores = _storeMgr.getImageStoresByScope(new ZoneScope(agent.getDataCenterId()));
+                List<DataStore> imageStores = _storeMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(agent.getDataCenterId()));
                 for (DataStore store : imageStores) {
                     _volumeSrv.handleVolumeSync(store);
                     _imageSrv.handleTemplateSync(store);
diff --git a/server/src/main/java/com/cloud/storage/secondary/SecondaryStorageVmManager.java b/server/src/main/java/com/cloud/storage/secondary/SecondaryStorageVmManager.java
index 5c50d46..b57b443 100644
--- a/server/src/main/java/com/cloud/storage/secondary/SecondaryStorageVmManager.java
+++ b/server/src/main/java/com/cloud/storage/secondary/SecondaryStorageVmManager.java
@@ -23,6 +23,7 @@
 import com.cloud.host.HostVO;
 import com.cloud.utils.Pair;
 import com.cloud.utils.component.Manager;
+import com.cloud.vm.SecondaryStorageVm;
 import com.cloud.vm.SecondaryStorageVmVO;
 
 public interface SecondaryStorageVmManager extends Manager {
@@ -31,6 +32,7 @@
     public static final int DEFAULT_SS_VM_CPUMHZ = 500;             // 500 MHz
     public static final int DEFAULT_SS_VM_MTUSIZE = 1500;
     public static final int DEFAULT_SS_VM_CAPACITY = 50;            // max command execution session per SSVM
+    public static final int DEFAULT_MIGRATE_SS_VM_CAPACITY = 2;     // number of concurrent migrate operations to happen per SSVM
     public static final int DEFAULT_STANDBY_CAPACITY = 10;          // standy capacity to reserve per zone
 
     public static final String ALERT_SUBJECT = "secondarystoragevm-alert";
@@ -56,4 +58,6 @@
     public List<HostVO> listUpAndConnectingSecondaryStorageVmHost(Long dcId);
 
     public HostVO pickSsvmHost(HostVO ssHost);
+
+    void allocCapacity(long dataCenterId, SecondaryStorageVm.Role role);
 }
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 5402b0f..f463678 100755
--- a/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -311,7 +311,8 @@
 
         if (snapshotStrategy == null) {
             s_logger.error("Unable to find snaphot strategy to handle snapshot with id '" + snapshotId + "'");
-            return null;
+            String errorMsg = String.format("Revert snapshot command failed for snapshot with id %d, because this command is supported only for KVM hypervisor", snapshotId);
+            throw new CloudRuntimeException(errorMsg);
         }
 
         boolean result = snapshotStrategy.revertSnapshot(snapshotInfo);
@@ -1106,7 +1107,8 @@
             if (hosts != null && !hosts.isEmpty()) {
                 HostVO host = hosts.get(0);
                 if (!hostSupportSnapsthotForVolume(host, volume)) {
-                    throw new CloudRuntimeException("KVM Snapshot is not supported: " + host.getId());
+                    throw new CloudRuntimeException(
+                            "KVM Snapshot is not supported for Running VMs. It is disabled by default due to a possible volume corruption in certain cases. To enable it set global settings kvm.snapshot.enabled to True. See the documentation for more details.");
                 }
             }
         }
diff --git a/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java b/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
index 0d42b76..be8319c 100644
--- a/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
+++ b/server/src/main/java/com/cloud/storage/upload/params/UploadParams.java
@@ -46,4 +46,5 @@
     boolean isDynamicallyScalable();
     boolean isRoutingType();
     boolean isDirectDownload();
+    boolean isDeployAsIs();
 }
diff --git a/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java b/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
index 67b04f7..e5bc1a3 100644
--- a/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
+++ b/server/src/main/java/com/cloud/storage/upload/params/UploadParamsBase.java
@@ -214,6 +214,11 @@
         return false;
     }
 
+    @Override
+    public boolean isDeployAsIs() {
+        return false;
+    }
+
     void setIso(boolean iso) {
         isIso = iso;
     }
diff --git a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
index 85c4a77..055d48f 100644
--- a/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/main/java/com/cloud/template/HypervisorTemplateAdapter.java
@@ -16,10 +16,6 @@
 // under the License.
 package com.cloud.template;
 
-import com.cloud.agent.api.Answer;
-import com.cloud.host.HostVO;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.resource.ResourceManager;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -30,25 +26,23 @@
 import javax.inject.Inject;
 
 import com.cloud.configuration.Config;
+import com.cloud.deployasis.dao.TemplateDeployAsIsDetailsDao;
+import com.cloud.storage.dao.VMTemplateDetailsDao;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
 import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer;
 import org.apache.cloudstack.agent.directdownload.CheckUrlCommand;
-import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd;
-import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
-import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand;
-import org.apache.cloudstack.utils.security.DigestHelper;
-import org.apache.log4j.Logger;
-import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
+import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd;
 import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
 import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
+import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd;
 import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
+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.DataStoreManager;
+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.Scope;
 import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory;
@@ -62,10 +56,15 @@
 import org.apache.cloudstack.framework.async.AsyncRpcContext;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.PublishScope;
+import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
 import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
+import org.apache.cloudstack.utils.security.DigestHelper;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
 import com.cloud.alert.AlertManager;
 import com.cloud.configuration.Resource.ResourceType;
 import com.cloud.dc.DataCenterVO;
@@ -74,11 +73,11 @@
 import com.cloud.event.UsageEventUtils;
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.ResourceAllocationException;
+import com.cloud.host.HostVO;
+import com.cloud.hypervisor.Hypervisor;
 import com.cloud.org.Grouping;
+import com.cloud.resource.ResourceManager;
 import com.cloud.server.StatsCollector;
-import com.cloud.template.VirtualMachineTemplate.State;
-import com.cloud.user.Account;
-import com.cloud.utils.Pair;
 import com.cloud.storage.ScopeType;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.TemplateType;
@@ -89,6 +88,9 @@
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.download.DownloadMonitor;
+import com.cloud.template.VirtualMachineTemplate.State;
+import com.cloud.user.Account;
+import com.cloud.utils.Pair;
 import com.cloud.utils.UriUtils;
 import com.cloud.utils.db.DB;
 import com.cloud.utils.db.EntityManager;
@@ -126,6 +128,10 @@
     ResourceManager resourceManager;
     @Inject
     VMTemplateDao templateDao;
+    @Inject
+    private VMTemplateDetailsDao templateDetailsDao;
+    @Inject
+    private TemplateDeployAsIsDetailsDao templateDeployAsIsDetailsDao;
 
     @Override
     public String getName() {
@@ -241,7 +247,7 @@
 
     private void createTemplateWithinZone(Long zId, TemplateProfile profile, VMTemplateVO template) {
         // find all eligible image stores for this zone scope
-        List<DataStore> imageStores = storeMgr.getImageStoresByScope(new ZoneScope(zId));
+        List<DataStore> imageStores = storeMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(zId));
         if (imageStores == null || imageStores.size() == 0) {
             throw new CloudRuntimeException("Unable to find image store to download template " + profile.getTemplate());
         }
@@ -308,7 +314,7 @@
                     zoneId = profile.getZoneIdList().get(0);
 
                 // find all eligible image stores for this zone scope
-                List<DataStore> imageStores = storeMgr.getImageStoresByScope(new ZoneScope(zoneId));
+                List<DataStore> imageStores = storeMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(zoneId));
                 if (imageStores == null || imageStores.size() == 0) {
                     throw new CloudRuntimeException("Unable to find image store to download template " + profile.getTemplate());
                 }
@@ -592,6 +598,12 @@
             Pair<Class<?>, Long> tmplt = new Pair<Class<?>, Long>(VirtualMachineTemplate.class, template.getId());
             _messageBus.publish(_name, EntityManager.MESSAGE_REMOVE_ENTITY_EVENT, PublishScope.LOCAL, tmplt);
 
+            // Remove template details
+            templateDetailsDao.removeDetails(template.getId());
+
+            // Remove deploy-as-is details (if any)
+            templateDeployAsIsDetailsDao.removeDetails(template.getId());
+
         }
         return success;
 
diff --git a/server/src/main/java/com/cloud/template/TemplateAdapter.java b/server/src/main/java/com/cloud/template/TemplateAdapter.java
index c048cea..86dd0d3 100644
--- a/server/src/main/java/com/cloud/template/TemplateAdapter.java
+++ b/server/src/main/java/com/cloud/template/TemplateAdapter.java
@@ -72,13 +72,12 @@
 
     boolean delete(TemplateProfile profile);
 
-    TemplateProfile prepare(boolean isIso, Long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url,
-        Boolean isPublic, Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneId, HypervisorType hypervisorType, String accountName,
-        Long domainId, String chksum, Boolean bootable, Map details, boolean directDownload) throws ResourceAllocationException;
+    TemplateProfile prepare(boolean isIso, Long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url, Boolean isPublic,
+                            Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneId, HypervisorType hypervisorType, String accountName, Long domainId, String chksum, Boolean bootable, Map details, boolean directDownload,
+                            boolean deployAsIs) throws ResourceAllocationException;
 
-    TemplateProfile prepare(boolean isIso, long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url,
-        Boolean isPublic, Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneId, HypervisorType hypervisorType, String chksum,
-        Boolean bootable, String templateTag, Account templateOwner, Map details, Boolean sshKeyEnabled, String imageStoreUuid, Boolean isDynamicallyScalable,
-        TemplateType templateType, boolean directDownload) throws ResourceAllocationException;
+    TemplateProfile prepare(boolean isIso, long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url, Boolean isPublic,
+                            Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneId, HypervisorType hypervisorType, String chksum, Boolean bootable, String templateTag, Account templateOwner, Map details, Boolean sshKeyEnabled, String imageStoreUuid, Boolean isDynamicallyScalable,
+                            TemplateType templateType, boolean directDownload, boolean deployAsIs) throws ResourceAllocationException;
 
 }
diff --git a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
index 0e88c14..880b708 100644
--- a/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
+++ b/server/src/main/java/com/cloud/template/TemplateAdapterBase.java
@@ -23,12 +23,15 @@
 
 import javax.inject.Inject;
 
+import com.cloud.deployasis.DeployAsIsConstants;
 import com.cloud.storage.upload.params.IsoUploadParams;
 import com.cloud.storage.upload.params.TemplateUploadParams;
 import com.cloud.storage.upload.params.UploadParams;
+import com.cloud.vm.VmDetailConstants;
 import org.apache.cloudstack.api.command.user.iso.GetUploadParamsForIsoCmd;
 import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.log4j.Logger;
 
@@ -129,16 +132,16 @@
     @Override
     public TemplateProfile prepare(boolean isIso, Long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url,
         Boolean isPublic, Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneId, HypervisorType hypervisorType, String accountName,
-        Long domainId, String chksum, Boolean bootable, Map details, boolean directDownload) throws ResourceAllocationException {
+        Long domainId, String chksum, Boolean bootable, Map details, boolean directDownload, boolean deployAsIs) throws ResourceAllocationException {
         return prepare(isIso, userId, name, displayText, bits, passwordEnabled, requiresHVM, url, isPublic, featured, isExtractable, format, guestOSId, zoneId,
-            hypervisorType, chksum, bootable, null, null, details, false, null, false, TemplateType.USER, directDownload);
+            hypervisorType, chksum, bootable, null, null, details, false, null, false, TemplateType.USER, directDownload, deployAsIs);
     }
 
     @Override
     public TemplateProfile prepare(boolean isIso, long userId, String name, String displayText, Integer bits, Boolean passwordEnabled, Boolean requiresHVM, String url,
         Boolean isPublic, Boolean featured, Boolean isExtractable, String format, Long guestOSId, List<Long> zoneIdList, HypervisorType hypervisorType, String chksum,
         Boolean bootable, String templateTag, Account templateOwner, Map details, Boolean sshkeyEnabled, String imageStoreUuid, Boolean isDynamicallyScalable,
-        TemplateType templateType, boolean directDownload) throws ResourceAllocationException {
+        TemplateType templateType, boolean directDownload, boolean deployAsIs) throws ResourceAllocationException {
         //Long accountId = null;
         // parameters verification
 
@@ -167,6 +170,10 @@
             if (requiresHVM == null) {
                 requiresHVM = true;
             }
+            if (deployAsIs) {
+                s_logger.info("Setting default guest OS for deploy-as-is template while the template registration is not completed");
+                guestOSId = getDefaultDeployAsIsGuestOsId();
+            }
         }
 
         if (isExtractable == null) {
@@ -257,7 +264,7 @@
         CallContext.current().setEventDetails("Id: " + id + " name: " + name);
         return new TemplateProfile(id, userId, name, displayText, bits, passwordEnabled, requiresHVM, url, isPublic, featured, isExtractable, imgfmt, guestOSId, zoneIdList,
             hypervisorType, templateOwner.getAccountName(), templateOwner.getDomainId(), templateOwner.getAccountId(), chksum, bootable, templateTag, details,
-            sshkeyEnabled, null, isDynamicallyScalable, templateType, directDownload);
+            sshkeyEnabled, null, isDynamicallyScalable, templateType, directDownload, deployAsIs);
 
     }
 
@@ -283,9 +290,23 @@
                     + EnumUtils.listValues(HypervisorType.values()).replace("None, ", ""));
         }
 
+        Map details = cmd.getDetails();
+        if (hypervisorType == HypervisorType.VMware) {
+            if (MapUtils.isNotEmpty(details)) {
+                if (details.containsKey(VmDetailConstants.ROOT_DISK_CONTROLLER)) {
+                    s_logger.info("Ignoring the rootDiskController detail provided, as we honour what is defined in the template");
+                    details.remove(VmDetailConstants.ROOT_DISK_CONTROLLER);
+                }
+                if (details.containsKey(VmDetailConstants.NIC_ADAPTER)) {
+                    s_logger.info("Ignoring the nicAdapter detail provided, as we honour what is defined in the template");
+                    details.remove(VmDetailConstants.NIC_ADAPTER);
+                }
+            }
+        }
         return prepare(false, CallContext.current().getCallingUserId(), cmd.getTemplateName(), cmd.getDisplayText(), cmd.getBits(), cmd.isPasswordEnabled(), cmd.getRequiresHvm(),
                 cmd.getUrl(), cmd.isPublic(), cmd.isFeatured(), cmd.isExtractable(), cmd.getFormat(), cmd.getOsTypeId(), zoneId, hypervisorType, cmd.getChecksum(), true,
-                cmd.getTemplateTag(), owner, cmd.getDetails(), cmd.isSshKeyEnabled(), null, cmd.isDynamicallyScalable(), isRouting ? TemplateType.ROUTING : TemplateType.USER, cmd.isDirectDownload());
+                cmd.getTemplateTag(), owner, details, cmd.isSshKeyEnabled(), null, cmd.isDynamicallyScalable(), isRouting ? TemplateType.ROUTING : TemplateType.USER,
+                cmd.isDirectDownload(), cmd.isDeployAsIs());
 
     }
 
@@ -316,15 +337,25 @@
                 params.isExtractable(), params.getFormat(), params.getGuestOSId(), zoneList,
                 params.getHypervisorType(), params.getChecksum(), params.isBootable(), params.getTemplateTag(), owner,
                 params.getDetails(), params.isSshKeyEnabled(), params.getImageStoreUuid(),
-                params.isDynamicallyScalable(), params.isRoutingType() ? TemplateType.ROUTING : TemplateType.USER, params.isDirectDownload());
+                params.isDynamicallyScalable(), params.isRoutingType() ? TemplateType.ROUTING : TemplateType.USER, params.isDirectDownload(), false);
+    }
+
+    private Long getDefaultDeployAsIsGuestOsId() {
+        GuestOS deployAsIsGuestOs = ApiDBUtils.findGuestOSByDisplayName(DeployAsIsConstants.DEFAULT_GUEST_OS_DEPLOY_AS_IS);
+        return deployAsIsGuestOs.getId();
     }
 
     @Override
     public TemplateProfile prepare(GetUploadParamsForTemplateCmd cmd) throws ResourceAllocationException {
+        Long osTypeId = cmd.getOsTypeId();
+        if (osTypeId == null) {
+            s_logger.info("Setting the default guest OS for deploy-as-is templates while the template upload is not completed");
+            osTypeId = getDefaultDeployAsIsGuestOsId();
+        }
         UploadParams params = new TemplateUploadParams(CallContext.current().getCallingUserId(), cmd.getName(),
                 cmd.getDisplayText(), cmd.getBits(), BooleanUtils.toBoolean(cmd.isPasswordEnabled()),
                 BooleanUtils.toBoolean(cmd.getRequiresHvm()), BooleanUtils.toBoolean(cmd.isPublic()),
-                BooleanUtils.toBoolean(cmd.isFeatured()), BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getFormat(), cmd.getOsTypeId(),
+                BooleanUtils.toBoolean(cmd.isFeatured()), BooleanUtils.toBoolean(cmd.isExtractable()), cmd.getFormat(), osTypeId,
                 cmd.getZoneId(), HypervisorType.getType(cmd.getHypervisor()), cmd.getChecksum(),
                 cmd.getTemplateTag(), cmd.getEntityOwnerId(), cmd.getDetails(), BooleanUtils.toBoolean(cmd.isSshKeyEnabled()),
                 BooleanUtils.toBoolean(cmd.isDynamicallyScalable()), BooleanUtils.toBoolean(cmd.isRoutingType()));
@@ -358,7 +389,7 @@
 
         return prepare(true, CallContext.current().getCallingUserId(), cmd.getIsoName(), cmd.getDisplayText(), 64, cmd.isPasswordEnabled(), true, cmd.getUrl(), cmd.isPublic(),
             cmd.isFeatured(), cmd.isExtractable(), ImageFormat.ISO.toString(), cmd.getOsTypeId(), zoneList, HypervisorType.None, cmd.getChecksum(), cmd.isBootable(), null,
-            owner, null, false, cmd.getImageStoreUuid(), cmd.isDynamicallyScalable(), TemplateType.USER, cmd.isDirectDownload());
+            owner, null, false, cmd.getImageStoreUuid(), cmd.isDynamicallyScalable(), TemplateType.USER, cmd.isDirectDownload(), false);
     }
 
     protected VMTemplateVO persistTemplate(TemplateProfile profile, VirtualMachineTemplate.State initialState) {
@@ -367,7 +398,7 @@
             new VMTemplateVO(profile.getTemplateId(), profile.getName(), profile.getFormat(), profile.isPublic(), profile.isFeatured(), profile.isExtractable(),
                 profile.getTemplateType(), profile.getUrl(), profile.isRequiresHVM(), profile.getBits(), profile.getAccountId(), profile.getCheckSum(),
                 profile.getDisplayText(), profile.isPasswordEnabled(), profile.getGuestOsId(), profile.isBootable(), profile.getHypervisorType(),
-                profile.getTemplateTag(), profile.getDetails(), profile.isSshKeyEnabled(), profile.IsDynamicallyScalable(), profile.isDirectDownload());
+                profile.getTemplateTag(), profile.getDetails(), profile.isSshKeyEnabled(), profile.IsDynamicallyScalable(), profile.isDirectDownload(), profile.isDeployAsIs());
         template.setState(initialState);
 
         if (profile.isDirectDownload()) {
diff --git a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
index 0240a61..550f53b 100755
--- a/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/main/java/com/cloud/template/TemplateManagerImpl.java
@@ -32,6 +32,7 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.agent.api.to.DatadiskTO;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListTemplateOrIsoPermissionsCmd;
@@ -544,6 +545,9 @@
                 if (tmpltStoreRef != null) {
                     if (tmpltStoreRef.getDownloadState() == com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
                         tmpltStore = (ImageStoreEntity)store;
+                        if (tmpltStoreRef.getExtractUrl() != null) {
+                            return tmpltStoreRef.getExtractUrl();
+                        }
                         break;
                     }
                 }
@@ -616,6 +620,18 @@
 
     private void prepareTemplateInOneStoragePool(final VMTemplateVO template, final StoragePoolVO pool) {
         s_logger.info("Schedule to preload template " + template.getId() + " into primary storage " + pool.getId());
+        if (pool.getPoolType() == Storage.StoragePoolType.DatastoreCluster) {
+            List<StoragePoolVO> childDataStores = _poolDao.listChildStoragePoolsInDatastoreCluster(pool.getId());
+            s_logger.debug("Schedule to preload template " + template.getId() + " into child datastores of DataStore cluster: " + pool.getId());
+            for (StoragePoolVO childDataStore :  childDataStores) {
+                prepareTemplateInOneStoragePoolInternal(template, childDataStore);
+            }
+        } else {
+            prepareTemplateInOneStoragePoolInternal(template, pool);
+        }
+    }
+
+    private void prepareTemplateInOneStoragePoolInternal(final VMTemplateVO template, final StoragePoolVO pool) {
         _preloadExecutor.execute(new ManagedContextRunnable() {
             @Override
             protected void runInContext() {
@@ -657,7 +673,7 @@
         VMTemplateStoragePoolVO templateStoragePoolRef = null;
         TemplateDataStoreVO templateStoreRef = null;
 
-        templateStoragePoolRef = _tmpltPoolDao.findByPoolTemplate(poolId, templateId);
+        templateStoragePoolRef = _tmpltPoolDao.findByPoolTemplate(poolId, templateId, null);
         if (templateStoragePoolRef != null) {
             templateStoragePoolRef.setMarkedForGC(false);
             _tmpltPoolDao.update(templateStoragePoolRef.getId(), templateStoragePoolRef);
@@ -697,7 +713,7 @@
                     return null;
                 }
 
-                return _tmpltPoolDao.findByPoolTemplate(poolId, templateId);
+                return _tmpltPoolDao.findByPoolTemplate(poolId, templateId, null);
             } catch (Exception ex) {
                 s_logger.debug("failed to copy template from image store:" + srcSecStore.getName() + " to primary storage");
             }
@@ -754,7 +770,7 @@
         long tmpltId = template.getId();
         long dstZoneId = dstZone.getId();
         // find all eligible image stores for the destination zone
-        List<DataStore> dstSecStores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(dstZoneId));
+        List<DataStore> dstSecStores = _dataStoreMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(dstZoneId));
         if (dstSecStores == null || dstSecStores.isEmpty()) {
             throw new StorageUnavailableException("Destination zone is not ready, no image store associated", DataCenter.class, dstZone.getId());
         }
@@ -1009,7 +1025,7 @@
         }
 
         PrimaryDataStore pool = (PrimaryDataStore)_dataStoreMgr.getPrimaryDataStore(templatePoolVO.getPoolId());
-        TemplateInfo template = _tmplFactory.getTemplate(templatePoolRef.getTemplateId(), pool);
+        TemplateInfo template = _tmplFactory.getTemplateOnPrimaryStorage(templatePoolRef.getTemplateId(), pool, templatePoolRef.getDeploymentOption());
 
         try {
             if (s_logger.isDebugEnabled()) {
@@ -1885,7 +1901,7 @@
         }
         privateTemplate = new VMTemplateVO(nextTemplateId, name, ImageFormat.RAW, isPublic, featured, isExtractable,
                 TemplateType.USER, null, requiresHvmValue, bitsValue, templateOwner.getId(), null, description,
-                passwordEnabledValue, guestOS.getId(), true, hyperType, templateTag, cmd.getDetails(), sshKeyEnabledValue, isDynamicScalingEnabled, false);
+                passwordEnabledValue, guestOS.getId(), true, hyperType, templateTag, cmd.getDetails(), sshKeyEnabledValue, isDynamicScalingEnabled, false, false);
 
         if (sourceTemplateId != null) {
             if (s_logger.isDebugEnabled()) {
@@ -2092,6 +2108,9 @@
             if (templateType != null && cmd.isRoutingType() != null && (TemplateType.ROUTING.equals(templateType) != cmd.isRoutingType())) {
                 throw new InvalidParameterValueException("Please specify a valid templatetype (consistent with isrouting parameter).");
             }
+            if (templateType != null && (templateType == TemplateType.SYSTEM || templateType == TemplateType.BUILTIN) && !template.isCrossZones()) {
+                throw new InvalidParameterValueException("System and Builtin templates must be cross zone");
+            }
         }
 
         // update is needed if any of the fields below got filled by the user
@@ -2235,4 +2254,16 @@
     public void setTemplateAdapters(List<TemplateAdapter> adapters) {
         _adapters = adapters;
     }
+
+    @Override
+    public List<DatadiskTO> getTemplateDisksOnImageStore(Long templateId, DataStoreRole role, String configurationId) {
+        TemplateInfo templateObject = _tmplFactory.getTemplate(templateId, role);
+        if (templateObject == null) {
+            String msg = String.format("Could not find template %s downloaded on store with role %s", templateId, role.toString());
+            s_logger.error(msg);
+            throw new CloudRuntimeException(msg);
+        }
+        return _tmpltSvr.getTemplateDatadisksOnImageStore(templateObject, configurationId);
+    }
+
 }
diff --git a/server/src/main/java/com/cloud/usage/UsageServiceImpl.java b/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
index 4f09d13..2d8d937 100644
--- a/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
+++ b/server/src/main/java/com/cloud/usage/UsageServiceImpl.java
@@ -347,6 +347,9 @@
             }
         }
 
+        // Filter out hidden usages
+        sc.addAnd("isHidden", SearchCriteria.Op.EQ, false);
+
         if ((adjustedStartDate != null) && (adjustedEndDate != null) && adjustedStartDate.before(adjustedEndDate)) {
             sc.addAnd("startDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
             sc.addAnd("endDate", SearchCriteria.Op.BETWEEN, adjustedStartDate, adjustedEndDate);
diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
index 98b4aa8..a20090c 100644
--- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java
@@ -37,7 +37,6 @@
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
-
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.QuerySelector;
 import org.apache.cloudstack.acl.Role;
@@ -507,14 +506,12 @@
         ControlledEntity prevEntity = null;
         if (sameOwner) {
             for (ControlledEntity entity : entities) {
-                if (sameOwner) {
-                    if (ownerId == null) {
-                        ownerId = entity.getAccountId();
-                    } else if (ownerId.longValue() != entity.getAccountId()) {
-                        throw new PermissionDeniedException("Entity " + entity + " and entity " + prevEntity + " belong to different accounts");
-                    }
-                    prevEntity = entity;
+                if (ownerId == null) {
+                    ownerId = entity.getAccountId();
+                } else if (ownerId.longValue() != entity.getAccountId()) {
+                    throw new PermissionDeniedException("Entity " + entity + " and entity " + prevEntity + " belong to different accounts");
                 }
+                prevEntity = entity;
             }
         }
 
@@ -523,6 +520,7 @@
             if (s_logger.isTraceEnabled()) {
                 s_logger.trace("No need to make permission check for System/RootAdmin account, returning true");
             }
+
             return;
         }
 
@@ -2036,7 +2034,7 @@
                 return caller;
             }
         } else {
-            if ((accountName == null && domainId != null) || (accountName != null && domainId == null)) {
+            if (accountName != null && domainId == null) {
                 throw new InvalidParameterValueException("AccountName and domainId must be specified together");
             }
             // regular user can't create/list resources for other people
diff --git a/server/src/main/java/com/cloud/user/DomainManagerImpl.java b/server/src/main/java/com/cloud/user/DomainManagerImpl.java
index 4c29559..918223e 100644
--- a/server/src/main/java/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/main/java/com/cloud/user/DomainManagerImpl.java
@@ -24,6 +24,7 @@
 
 import javax.inject.Inject;
 
+import com.cloud.domain.dao.DomainDetailsDao;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
 import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
@@ -124,6 +125,8 @@
     private NetworkDomainDao _networkDomainDao;
     @Inject
     private ConfigurationManager _configMgr;
+    @Inject
+    private DomainDetailsDao _domainDetailsDao;
 
     @Inject
     MessageBus _messageBus;
@@ -333,6 +336,7 @@
                     s_logger.debug("Domain specific Virtual IP ranges " + " are successfully released as a part of domain id=" + domain.getId() + " cleanup.");
                 }
 
+                cleanupDomainDetails(domain.getId());
                 cleanupDomainOfferings(domain.getId());
                 CallContext.current().putContextParameter(Domain.class, domain.getUuid());
                 return true;
@@ -447,6 +451,10 @@
         _messageBus.publish(_name, MESSAGE_REMOVE_DOMAIN_EVENT, PublishScope.LOCAL, domain);
     }
 
+    protected void cleanupDomainDetails(Long domainId) {
+        _domainDetailsDao.deleteDetails(domainId);
+    }
+
     protected void cleanupDomainOfferings(Long domainId) {
         if (domainId == null) {
             return;
diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
index 684434b..d94c00c 100644
--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java
@@ -48,9 +48,16 @@
 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;
+import org.apache.cloudstack.affinity.AffinityGroupVMMapVO;
 import org.apache.cloudstack.affinity.AffinityGroupVO;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
@@ -77,6 +84,7 @@
 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;
@@ -254,9 +262,9 @@
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolStatus;
-import com.cloud.storage.TemplateOVFPropertyVO;
 import com.cloud.storage.VMTemplateStorageResourceAssoc;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.VMTemplateZoneVO;
@@ -267,7 +275,6 @@
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
 import com.cloud.storage.dao.SnapshotDao;
-import com.cloud.storage.dao.TemplateOVFPropertiesDao;
 import com.cloud.storage.dao.VMTemplateDao;
 import com.cloud.storage.dao.VMTemplateZoneDao;
 import com.cloud.storage.dao.VolumeDao;
@@ -327,6 +334,8 @@
 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);
 
@@ -500,7 +509,11 @@
     @Inject
     private ResourceTagDao resourceTagDao;
     @Inject
-    private TemplateOVFPropertiesDao templateOVFPropertiesDao;
+    private TemplateDeployAsIsDetailsDao templateDeployAsIsDetailsDao;
+    @Inject
+    private UserVmDeployAsIsDetailsDao userVmDeployAsIsDetailsDao;
+    @Inject
+    private StorageManager storageMgr;
 
     private ScheduledExecutorService _executor = null;
     private ScheduledExecutorService _vmIpFetchExecutor = null;
@@ -788,7 +801,7 @@
                     return true;
                 }
 
-                if (rebootVirtualMachine(userId, vmId) == null) {
+                if (rebootVirtualMachine(userId, vmId, false) == null) {
                     s_logger.warn("Failed to reboot the vm " + vmInstance);
                     return false;
                 } else {
@@ -899,7 +912,7 @@
                 s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset");
                 return true;
             }
-            if (rebootVirtualMachine(userId, vmId) == null) {
+            if (rebootVirtualMachine(userId, vmId, false) == null) {
                 s_logger.warn("Failed to reboot the vm " + vmInstance);
                 return false;
             } else {
@@ -936,9 +949,13 @@
         return status;
     }
 
-    private UserVm rebootVirtualMachine(long userId, long vmId) throws InsufficientCapacityException, ResourceUnavailableException {
+    private UserVm rebootVirtualMachine(long userId, long vmId, boolean enterSetup) throws InsufficientCapacityException, ResourceUnavailableException {
         UserVmVO vm = _vmDao.findById(vmId);
 
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("reboot %s with enterSetup set to %s", vm.getInstanceName(), Boolean.toString(enterSetup)));
+        }
+
         if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) {
             s_logger.warn("Vm id=" + vmId + " doesn't exist");
             return null;
@@ -971,8 +988,18 @@
             } catch (Exception ex){
                 throw new CloudRuntimeException("Router start failed due to" + ex);
             }finally {
-                s_logger.info("Rebooting vm " + vm.getInstanceName());
-                _itMgr.reboot(vm.getUuid(), null);
+                if (s_logger.isInfoEnabled()) {
+                    s_logger.info(String.format("Rebooting vm %s%s.", vm.getInstanceName(), enterSetup? " entering hardware setup menu" : " as is"));
+                }
+                Map<VirtualMachineProfile.Param,Object> params = null;
+                if (enterSetup) {
+                    params = new HashMap();
+                    params.put(VirtualMachineProfile.Param.BootIntoSetup, Boolean.TRUE);
+                    if (s_logger.isTraceEnabled()) {
+                        s_logger.trace(String.format("Adding %s to paramlist", VirtualMachineProfile.Param.BootIntoSetup));
+                    }
+                }
+                _itMgr.reboot(vm.getUuid(), params);
             }
             return _vmDao.findById(vmId);
         } else {
@@ -1014,7 +1041,10 @@
             newServiceOffering.setDynamicFlag(true);
             validateCustomParameters(newServiceOffering, cmd.getDetails());
             newServiceOffering = _offeringDao.getComputeOffering(newServiceOffering, customParameters);
+        } else {
+            validateOfferingMaxResource(newServiceOffering);
         }
+
         ServiceOfferingVO currentServiceOffering = _offeringDao.findByIdIncludingRemoved(vmInstance.getId(), vmInstance.getServiceOfferingId());
 
         int newCpu = newServiceOffering.getCpu();
@@ -1060,6 +1090,17 @@
         return userVm;
     }
 
+    private void validateOfferingMaxResource(ServiceOfferingVO offering) {
+        Integer maxCPUCores = VirtualMachineManager.VmServiceOfferingMaxCPUCores.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxCPUCores.value();
+        if (offering.getCpu() > maxCPUCores) {
+            throw new InvalidParameterValueException("Invalid cpu cores value, please choose another service offering with cpu cores between 1 and " + maxCPUCores);
+        }
+        Integer maxRAMSize = VirtualMachineManager.VmServiceOfferingMaxRAMSize.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxRAMSize.value();
+        if (offering.getRamSize() > maxRAMSize) {
+            throw new InvalidParameterValueException("Invalid memory value, please choose another service offering with memory between 32 and " + maxRAMSize + " MB");
+        }
+    }
+
     @Override
     public void validateCustomParameters(ServiceOfferingVO serviceOffering, Map<String, String> customParameters) {
         //TODO need to validate custom cpu, and memory against min/max CPU/Memory ranges from service_offering_details table
@@ -1069,8 +1110,9 @@
                 int minCPU = NumbersUtil.parseInt(offeringDetails.get(ApiConstants.MIN_CPU_NUMBER), 1);
                 int maxCPU = NumbersUtil.parseInt(offeringDetails.get(ApiConstants.MAX_CPU_NUMBER), Integer.MAX_VALUE);
                 int cpuNumber = NumbersUtil.parseInt(customParameters.get(UsageEventVO.DynamicParameters.cpuNumber.name()), -1);
-                if (cpuNumber < minCPU || cpuNumber > maxCPU) {
-                    throw new InvalidParameterValueException(String.format("Invalid cpu cores value, specify a value between %d and %d", minCPU, maxCPU));
+                Integer maxCPUCores = VirtualMachineManager.VmServiceOfferingMaxCPUCores.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxCPUCores.value();
+                if (cpuNumber < minCPU || cpuNumber > maxCPU || cpuNumber > maxCPUCores) {
+                    throw new InvalidParameterValueException(String.format("Invalid cpu cores value, specify a value between %d and %d", minCPU, Math.min(maxCPUCores, maxCPU)));
                 }
             } else if (customParameters.containsKey(UsageEventVO.DynamicParameters.cpuNumber.name())) {
                 throw new InvalidParameterValueException("The cpu cores of this offering id:" + serviceOffering.getUuid()
@@ -1091,8 +1133,9 @@
                 int minMemory = NumbersUtil.parseInt(offeringDetails.get(ApiConstants.MIN_MEMORY), 32);
                 int maxMemory = NumbersUtil.parseInt(offeringDetails.get(ApiConstants.MAX_MEMORY), Integer.MAX_VALUE);
                 int memory = NumbersUtil.parseInt(customParameters.get(UsageEventVO.DynamicParameters.memory.name()), -1);
-                if (memory < minMemory || memory > maxMemory) {
-                    throw new InvalidParameterValueException(String.format("Invalid memory value, specify a value between %d and %d", minMemory, maxMemory));
+                Integer maxRAMSize = VirtualMachineManager.VmServiceOfferingMaxRAMSize.value() == 0 ? Integer.MAX_VALUE: VirtualMachineManager.VmServiceOfferingMaxRAMSize.value();
+                if (memory < minMemory || memory > maxMemory || memory > maxRAMSize) {
+                    throw new InvalidParameterValueException(String.format("Invalid memory value, specify a value between %d and %d", minMemory, Math.min(maxRAMSize, maxMemory)));
                 }
             } else if (customParameters.containsKey(UsageEventVO.DynamicParameters.memory.name())) {
                 throw new InvalidParameterValueException("The memory of this offering id:" + serviceOffering.getUuid() + " is not customizable. This is predefined in the template.");
@@ -1120,6 +1163,8 @@
             newServiceOffering.setDynamicFlag(true);
             validateCustomParameters(newServiceOffering, customParameters);
             newServiceOffering = _offeringDao.getComputeOffering(newServiceOffering, customParameters);
+        } else {
+            validateOfferingMaxResource(newServiceOffering);
         }
         ServiceOfferingVO currentServiceOffering = _offeringDao.findByIdIncludingRemoved(vmInstance.getId(), vmInstance.getServiceOfferingId());
 
@@ -1141,12 +1186,27 @@
         // Check that the specified service offering ID is valid
         _itMgr.checkIfCanUpgrade(vmInstance, newServiceOffering);
 
-        resizeRootVolumeOfVmWithNewOffering(vmInstance, newServiceOffering);
-
         // Check if the new service offering can be applied to vm instance
         ServiceOffering newSvcOffering = _offeringDao.findById(svcOffId);
         _accountMgr.checkAccess(owner, newSvcOffering, _dcDao.findById(vmInstance.getDataCenterId()));
 
+        DiskOfferingVO newRootDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId());
+
+        List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId());
+
+        for (final VolumeVO rootVolumeOfVm : vols) {
+            DiskOfferingVO currentRootDiskOffering = _diskOfferingDao.findById(rootVolumeOfVm.getDiskOfferingId());
+
+            ResizeVolumeCmd resizeVolumeCmd = prepareResizeVolumeCmd(rootVolumeOfVm, currentRootDiskOffering, newRootDiskOffering);
+
+            if (rootVolumeOfVm.getDiskOfferingId() != newRootDiskOffering.getId()) {
+                rootVolumeOfVm.setDiskOfferingId(newRootDiskOffering.getId());
+                _volsDao.update(rootVolumeOfVm.getId(), rootVolumeOfVm);
+            }
+
+            _volumeService.resizeVolume(resizeVolumeCmd);
+        }
+
         _itMgr.upgradeVmDb(vmId, newServiceOffering, currentServiceOffering);
 
         // Increment or decrement CPU and Memory count accordingly.
@@ -1167,19 +1227,49 @@
 
     }
 
+    /**
+     * Prepares the Resize Volume Command and verifies if the disk offering from the new service offering can be resized.
+     * <br>
+     * If the Service Offering was configured with a root disk size (size > 0) then it can only resize to an offering with a larger disk
+     * or to an offering with a root size of zero, which is the default behavior.
+     */
+    protected ResizeVolumeCmd prepareResizeVolumeCmd(VolumeVO rootVolume, DiskOfferingVO currentRootDiskOffering, DiskOfferingVO newRootDiskOffering) {
+        if (rootVolume == null) {
+            throw new InvalidParameterValueException("Could not find Root volume for the VM while preparing the Resize Volume Command.");
+        }
+        if (currentRootDiskOffering == null) {
+            throw new InvalidParameterValueException("Could not find Disk Offering matching the provided current Root Offering ID.");
+        }
+        if (newRootDiskOffering == null) {
+            throw new InvalidParameterValueException("Could not find Disk Offering matching the provided Offering ID for resizing Root volume.");
+        }
+
+        ResizeVolumeCmd resizeVolumeCmd = new ResizeVolumeCmd(rootVolume.getId(), newRootDiskOffering.getMinIops(), newRootDiskOffering.getMaxIops());
+
+        long newNewOfferingRootSizeInBytes = newRootDiskOffering.getDiskSize();
+        long newNewOfferingRootSizeInGiB = newNewOfferingRootSizeInBytes / GiB_TO_BYTES;
+        long currentRootDiskOfferingGiB = currentRootDiskOffering.getDiskSize() / GiB_TO_BYTES;
+        if (newNewOfferingRootSizeInBytes > currentRootDiskOffering.getDiskSize()) {
+            resizeVolumeCmd = new ResizeVolumeCmd(rootVolume.getId(), newRootDiskOffering.getMinIops(), newRootDiskOffering.getMaxIops(), newRootDiskOffering.getId());
+            s_logger.debug(String.format("Preparing command to resize VM Root disk from %d GB to %d GB; current offering: %s, new offering: %s.", currentRootDiskOfferingGiB,
+                    newNewOfferingRootSizeInGiB, currentRootDiskOffering.getName(), newRootDiskOffering.getName()));
+        } else if (newNewOfferingRootSizeInBytes > 0l && newNewOfferingRootSizeInBytes < currentRootDiskOffering.getDiskSize()) {
+            throw new InvalidParameterValueException(String.format(
+                    "Failed to resize Root volume. The new Service Offering [id: %d, name: %s] has a smaller disk size [%d GB] than the current disk [%d GB].",
+                    newRootDiskOffering.getId(), newRootDiskOffering.getName(), newNewOfferingRootSizeInGiB, currentRootDiskOfferingGiB));
+        }
+        return resizeVolumeCmd;
+    }
+
     private void resizeRootVolumeOfVmWithNewOffering(VMInstanceVO vmInstance, ServiceOfferingVO newServiceOffering)
             throws ResourceAllocationException {
         DiskOfferingVO newROOTDiskOffering = _diskOfferingDao.findById(newServiceOffering.getId());
-
         List<VolumeVO> vols = _volsDao.findReadyRootVolumesByInstance(vmInstance.getId());
 
         for (final VolumeVO rootVolumeOfVm : vols) {
             rootVolumeOfVm.setDiskOfferingId(newROOTDiskOffering.getId());
-
             ResizeVolumeCmd resizeVolumeCmd = new ResizeVolumeCmd(rootVolumeOfVm.getId(), newROOTDiskOffering.getMinIops(), newROOTDiskOffering.getMaxIops());
-
             _volumeService.resizeVolume(resizeVolumeCmd);
-
             _volsDao.update(rootVolumeOfVm.getId(), rootVolumeOfVm);
         }
     }
@@ -1464,16 +1554,10 @@
         Integer chosenID = nic.getDeviceId();
         Integer existingID = existing.getDeviceId();
 
-        nic.setDefaultNic(true);
-        nic.setDeviceId(existingID);
-        existingVO.setDefaultNic(false);
-        existingVO.setDeviceId(chosenID);
-
-        nic = _nicDao.persist(nic);
-        existingVO = _nicDao.persist(existingVO);
-
         Network newdefault = null;
-        newdefault = _networkModel.getDefaultNetworkForVm(vmId);
+        if (_itMgr.updateDefaultNicForVM(vmInstance, nic, existingVO)) {
+            newdefault = _networkModel.getDefaultNetworkForVm(vmId);
+        }
 
         if (newdefault == null) {
             nic.setDefaultNic(false);
@@ -1850,7 +1934,7 @@
 
                     // #2 migrate the vm if host doesn't have capacity or is in avoid set
                     if (!existingHostHasCapacity) {
-                        _itMgr.findHostAndMigrate(vmInstance.getUuid(), newServiceOfferingId, excludes);
+                        _itMgr.findHostAndMigrate(vmInstance.getUuid(), newServiceOfferingId, customParameters, excludes);
                     }
 
                     // #3 scale the vm now
@@ -1964,6 +2048,7 @@
 
     @Override
     @DB
+    @ActionEvent(eventType = EventTypes.EVENT_VM_RECOVER, eventDescription = "Recovering VM")
     public UserVm recoverVirtualMachine(RecoverVMCmd cmd) throws ResourceAllocationException, CloudRuntimeException {
 
         final Long vmId = cmd.getId();
@@ -2481,24 +2566,6 @@
                         }
                     }
                 }
-                for (String detailName : details.keySet()) {
-                    if (detailName.startsWith(ApiConstants.OVF_PROPERTIES)) {
-                        String ovfPropKey = detailName.replace(ApiConstants.OVF_PROPERTIES + "-", "");
-                        TemplateOVFPropertyVO ovfPropertyVO = templateOVFPropertiesDao.findByTemplateAndKey(vmInstance.getTemplateId(), ovfPropKey);
-                        if (ovfPropertyVO != null && ovfPropertyVO.isPassword()) {
-                            details.put(detailName, DBEncryptionUtil.encrypt(details.get(detailName)));
-                        }
-                    } else if (VmDetailConstants.CPU_CORE_PER_SOCKET.equals(detailName)) {
-                        try {
-                            final int val = Integer.parseInt(details.get(detailName));
-                            if (val <= 0) {
-                                throw new InvalidParameterValueException("Please enter a positive integer value for the vm setting: " + detailName);
-                            }
-                        } catch (final NumberFormatException e) {
-                            throw new InvalidParameterValueException("Please enter an integer value for vm setting: " + detailName);
-                        }
-                    }
-                }
                 vmInstance.setDetails(details);
                 _vmDao.saveDetails(vmInstance);
             }
@@ -2797,7 +2864,19 @@
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_VM_START, eventDescription = "starting Vm", async = true)
     public UserVm startVirtualMachine(StartVMCmd cmd) throws ExecutionException, ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException, ResourceAllocationException {
-        return startVirtualMachine(cmd.getId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), null, cmd.getDeploymentPlanner()).first();
+        Map<VirtualMachineProfile.Param, Object> additonalParams = null;
+        if (cmd.getBootIntoSetup() != null) {
+            if (additonalParams == null) {
+                additonalParams = new HashMap<>();
+            }
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace(String.format("Adding %s into the param map", VirtualMachineProfile.Param.BootIntoSetup.getName()));
+            }
+
+            additonalParams.put(VirtualMachineProfile.Param.BootIntoSetup, cmd.getBootIntoSetup());
+        }
+
+        return startVirtualMachine(cmd.getId(), cmd.getPodId(), cmd.getClusterId(), cmd.getHostId(), additonalParams, cmd.getDeploymentPlanner()).first();
     }
 
     @Override
@@ -2827,7 +2906,11 @@
             throw new InvalidParameterValueException("Unable to find service offering: " + serviceOfferingId + " corresponding to the vm");
         }
 
-        UserVm userVm = rebootVirtualMachine(CallContext.current().getCallingUserId(), vmId);
+        Boolean enterSetup = cmd.getBootIntoSetup();
+        if (enterSetup != null && enterSetup && !HypervisorType.VMware.equals(vmInstance.getHypervisorType())) {
+            throw new InvalidParameterValueException("Booting into a hardware setup menu is not implemented on " + vmInstance.getHypervisorType());
+        }
+        UserVm userVm = rebootVirtualMachine(CallContext.current().getCallingUserId(), vmId, enterSetup == null ? false : cmd.getBootIntoSetup());
         if (userVm != null ) {
             // update the vmIdCountMap if the vm is in advanced shared network with out services
             final List<NicVO> nics = _nicDao.listByVmId(vmId);
@@ -2874,14 +2957,20 @@
         }
         s_logger.debug("Found no ongoing snapshots on volume of type ROOT, for the vm with id " + vmId);
 
-        List<VolumeVO> volumes = getVolumesFromIds(cmd);
+        List<VolumeVO> volumesToBeDeleted = getVolumesFromIds(cmd);
 
-        checkForUnattachedVolumes(vmId, volumes);
-        validateVolumes(volumes);
+        checkForUnattachedVolumes(vmId, volumesToBeDeleted);
+        validateVolumes(volumesToBeDeleted);
 
         stopVirtualMachine(vmId, VmDestroyForcestop.value());
 
-        detachVolumesFromVm(volumes);
+        if (vm.getHypervisorType() == HypervisorType.VMware) {
+            List<VolumeVO> allVolumes = _volsDao.findByInstance(vm.getId());
+            allVolumes.removeIf(vol -> vol.getVolumeType() == Volume.Type.ROOT);
+            detachVolumesFromVm(allVolumes);
+        } else {
+            detachVolumesFromVm(volumesToBeDeleted);
+        }
 
         UserVm destroyedVm = destroyVm(vmId, expunge);
         if (expunge) {
@@ -2890,7 +2979,7 @@
             }
         }
 
-        deleteVolumesFromVm(volumes);
+        deleteVolumesFromVm(volumesToBeDeleted);
 
         return destroyedVm;
     }
@@ -3282,56 +3371,10 @@
 
         List<HypervisorType> vpcSupportedHTypes = _vpcMgr.getSupportedVpcHypervisors();
         if (networkIdList == null || networkIdList.isEmpty()) {
-            NetworkVO defaultNetwork = null;
-
-            // if no network is passed in
-            // Check if default virtual network offering has
-            // Availability=Required. If it's true, search for corresponding
-            // network
-            // * if network is found, use it. If more than 1 virtual network is
-            // found, throw an error
-            // * if network is not found, create a new one and use it
-
-            List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
-            if (requiredOfferings.size() < 1) {
-                throw new InvalidParameterValueException("Unable to find network offering with availability=" + Availability.Required
-                        + " to automatically create the network as a part of vm creation");
-            }
-
-            if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
-                // get Virtual networks
-                List<? extends Network> virtualNetworks = _networkModel.listNetworksForAccount(owner.getId(), zone.getId(), Network.GuestType.Isolated);
-                if (virtualNetworks == null) {
-                    throw new InvalidParameterValueException("No (virtual) networks are found for account " + owner);
-                }
-                if (virtualNetworks.isEmpty()) {
-                    long physicalNetworkId = _networkModel.findPhysicalNetworkId(zone.getId(), requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
-                    // Validate physical network
-                    PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
-                    if (physicalNetwork == null) {
-                        throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: "
-                                + requiredOfferings.get(0).getTags());
-                    }
-                    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);
-                    if (newNetwork != null) {
-                        defaultNetwork = _networkDao.findById(newNetwork.getId());
-                    }
-                } else if (virtualNetworks.size() > 1) {
-                    throw new InvalidParameterValueException("More than 1 default Isolated networks are found for account " + owner + "; please specify networkIds");
-                } else {
-                    defaultNetwork = _networkDao.findById(virtualNetworks.get(0).getId());
-                }
-            } else {
-                throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
-            }
-
+            NetworkVO defaultNetwork = getDefaultNetwork(zone, owner, false);
             if (defaultNetwork != null) {
                 networkList.add(defaultNetwork);
             }
-
         } else {
             for (Long networkId : networkIdList) {
                 NetworkVO network = _networkDao.findById(networkId);
@@ -3368,6 +3411,91 @@
                 dataDiskTemplateToDiskOfferingMap, userVmOVFPropertiesMap);
     }
 
+    private NetworkVO getNetworkToAddToNetworkList(VirtualMachineTemplate template, Account owner, HypervisorType hypervisor,
+            List<HypervisorType> vpcSupportedHTypes, Long networkId) {
+        NetworkVO network = _networkDao.findById(networkId);
+        if (network == null) {
+            throw new InvalidParameterValueException("Unable to find network by id " + networkId);
+        }
+        if (network.getVpcId() != null) {
+            // Only ISOs, XenServer, KVM, and VmWare template types are
+            // supported for vpc networks
+            if (template.getFormat() != ImageFormat.ISO && !vpcSupportedHTypes.contains(template.getHypervisorType())) {
+                throw new InvalidParameterValueException("Can't create vm from template with hypervisor " + template.getHypervisorType() + " in vpc network " + network);
+            } else if (template.getFormat() == ImageFormat.ISO && !vpcSupportedHTypes.contains(hypervisor)) {
+                // Only XenServer, KVM, and VMware hypervisors are supported
+                // for vpc networks
+                throw new InvalidParameterValueException("Can't create vm of hypervisor type " + hypervisor + " in vpc network");
+            }
+        }
+
+        _networkModel.checkNetworkPermissions(owner, network);
+
+        // don't allow to use system networks
+        NetworkOffering networkOffering = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId());
+        if (networkOffering.isSystemOnly()) {
+            throw new InvalidParameterValueException("Network id=" + networkId + " is system only and can't be used for vm deployment");
+        }
+        return network;
+    }
+
+    private NetworkVO getDefaultNetwork(DataCenter zone, Account owner, boolean selectAny) throws InsufficientCapacityException, ResourceAllocationException {
+        NetworkVO defaultNetwork = null;
+
+        // if no network is passed in
+        // Check if default virtual network offering has
+        // Availability=Required. If it's true, search for corresponding
+        // network
+        // * if network is found, use it. If more than 1 virtual network is
+        // found, throw an error
+        // * if network is not found, create a new one and use it
+
+        List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
+        if (requiredOfferings.size() < 1) {
+            throw new InvalidParameterValueException("Unable to find network offering with availability=" + Availability.Required
+                    + " to automatically create the network as a part of vm creation");
+        }
+
+        if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
+            // get Virtual networks
+            List<? extends Network> virtualNetworks = _networkModel.listNetworksForAccount(owner.getId(), zone.getId(), Network.GuestType.Isolated);
+            if (virtualNetworks == null) {
+                throw new InvalidParameterValueException("No (virtual) networks are found for account " + owner);
+            }
+            if (virtualNetworks.isEmpty()) {
+                defaultNetwork = createDefaultNetworkForAccount(zone, owner, requiredOfferings);
+            } else if (virtualNetworks.size() > 1 && !selectAny) {
+                throw new InvalidParameterValueException("More than 1 default Isolated networks are found for account " + owner + "; please specify networkIds");
+            } else {
+                defaultNetwork = _networkDao.findById(virtualNetworks.get(0).getId());
+            }
+        } else {
+            throw new InvalidParameterValueException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
+        }
+
+        return defaultNetwork;
+    }
+
+    private NetworkVO createDefaultNetworkForAccount(DataCenter zone, Account owner, List<NetworkOfferingVO> requiredOfferings)
+            throws InsufficientCapacityException, ResourceAllocationException {
+        NetworkVO defaultNetwork = null;
+        long physicalNetworkId = _networkModel.findPhysicalNetworkId(zone.getId(), requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
+        // Validate physical network
+        PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+        if (physicalNetwork == null) {
+            throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: "
+                    + requiredOfferings.get(0).getTags());
+        }
+        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);
+        if (newNetwork != null) {
+            defaultNetwork = _networkDao.findById(newNetwork.getId());
+        }
+        return defaultNetwork;
+    }
+
     private void verifyExtraDhcpOptionsNetwork(Map<String, Map<Integer, String>> dhcpOptionsMap, List<NetworkVO> networkList) throws InvalidParameterValueException {
         if (dhcpOptionsMap != null) {
             for (String networkUuid : dhcpOptionsMap.keySet()) {
@@ -3454,29 +3582,14 @@
             offering.setDynamicFlag(true);
             validateCustomParameters(offering, customParameters);
             offering = _offeringDao.getComputeOffering(offering, customParameters);
+        } else {
+            validateOfferingMaxResource(offering);
         }
         // check if account/domain is with in resource limits to create a new vm
         boolean isIso = Storage.ImageFormat.ISO == template.getFormat();
-        long size = 0;
-        // custom root disk size, resizes base template to larger size
-        if (customParameters.containsKey(VmDetailConstants.ROOT_DISK_SIZE)) {
-            // only KVM, XenServer and VMware supports rootdisksize override
-            if (!(hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.XenServer || hypervisorType == HypervisorType.VMware || hypervisorType == HypervisorType.Simulator)) {
-                throw new InvalidParameterValueException("Hypervisor " + hypervisorType + " does not support rootdisksize override");
-            }
 
-            Long rootDiskSize = NumbersUtil.parseLong(customParameters.get(VmDetailConstants.ROOT_DISK_SIZE), -1);
-            if (rootDiskSize <= 0) {
-                throw new InvalidParameterValueException("Root disk size should be a positive number.");
-            }
-            size = rootDiskSize * GiB_TO_BYTES;
-        } else {
-            // For baremetal, size can be null
-            Long templateSize = _templateDao.findById(template.getId()).getSize();
-            if (templateSize != null) {
-                size = templateSize;
-            }
-        }
+        long size = configureCustomRootDiskSize(customParameters, template, hypervisorType, offering);
+
         if (diskOfferingId != null) {
             DiskOfferingVO diskOffering = _diskOfferingDao.findById(diskOfferingId);
             if (diskOffering != null && diskOffering.isCustomized()) {
@@ -3619,12 +3732,11 @@
             sshPublicKey = pair.getPublicKey();
         }
 
-        List<Pair<NetworkVO, NicProfile>> networks = new ArrayList<Pair<NetworkVO, NicProfile>>();
-
-        LinkedHashMap<String, NicProfile> networkNicMap = new LinkedHashMap<String, NicProfile>();
+        LinkedHashMap<String, List<NicProfile>> networkNicMap = new LinkedHashMap<>();
 
         short defaultNetworkNumber = 0;
         boolean securityGroupEnabled = false;
+        int networkIndex = 0;
         for (NetworkVO network : networkList) {
             if ((network.getDataCenterId() != zone.getId())) {
                 if (!network.isStrechedL2Network()) {
@@ -3662,7 +3774,7 @@
             }
 
             NicProfile profile = new NicProfile(requestedIpPair.getIp4Address(), requestedIpPair.getIp6Address(), requestedIpPair.getMacAddress());
-
+            profile.setOrderIndex(networkIndex);
             if (defaultNetworkNumber == 0) {
                 defaultNetworkNumber++;
                 // if user requested specific ip for default network, add it
@@ -3689,13 +3801,16 @@
                 }
             }
 
-            networks.add(new Pair<NetworkVO, NicProfile>(network, profile));
-
             if (_networkModel.isSecurityGroupSupportedInNetwork(network)) {
                 securityGroupEnabled = true;
             }
-
-            networkNicMap.put(network.getUuid(), profile);
+            List<NicProfile> profiles = networkNicMap.get(network.getUuid());
+            if (CollectionUtils.isEmpty(profiles)) {
+                profiles = new ArrayList<>();
+            }
+            profiles.add(profile);
+            networkNicMap.put(network.getUuid(), profiles);
+            networkIndex++;
         }
 
         if (securityGroupIdList != null && !securityGroupIdList.isEmpty() && !securityGroupEnabled) {
@@ -3791,6 +3906,46 @@
         return vm;
     }
 
+    /**
+     * Configures the Root disk size via User`s custom parameters.
+     * If the Service Offering has the Root Disk size field configured then the User`s root disk custom parameter is overwritten by the service offering.
+     */
+    protected long configureCustomRootDiskSize(Map<String, String> customParameters, VMTemplateVO template, HypervisorType hypervisorType, ServiceOfferingVO serviceOffering) {
+        verifyIfHypervisorSupportsRootdiskSizeOverride(hypervisorType);
+        DiskOfferingVO diskOffering = _diskOfferingDao.findById(serviceOffering.getId());
+        long rootDiskSizeInBytes = diskOffering.getDiskSize();
+        if (rootDiskSizeInBytes > 0) { //if the size at DiskOffering is not zero then the Service Offering had it configured, it holds priority over the User custom size
+            long rootDiskSizeInGiB = rootDiskSizeInBytes / GiB_TO_BYTES;
+            customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, String.valueOf(rootDiskSizeInGiB));
+            return rootDiskSizeInBytes;
+        }
+
+        if (customParameters.containsKey(VmDetailConstants.ROOT_DISK_SIZE)) {
+            Long rootDiskSize = NumbersUtil.parseLong(customParameters.get(VmDetailConstants.ROOT_DISK_SIZE), -1);
+            if (rootDiskSize <= 0) {
+                throw new InvalidParameterValueException("Root disk size should be a positive number.");
+            }
+            return rootDiskSize * GiB_TO_BYTES;
+        } else {
+            // For baremetal, size can be 0 (zero)
+            Long templateSize = _templateDao.findById(template.getId()).getSize();
+            if (templateSize != null) {
+                return templateSize;
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * Only KVM, XenServer and VMware supports rootdisksize override
+     * @throws InvalidParameterValueException if the hypervisor does not support rootdisksize override
+     */
+    protected void verifyIfHypervisorSupportsRootdiskSizeOverride(HypervisorType hypervisorType) {
+        if (!(hypervisorType == HypervisorType.KVM || hypervisorType == HypervisorType.XenServer || hypervisorType == HypervisorType.VMware || hypervisorType == HypervisorType.Simulator)) {
+            throw new InvalidParameterValueException("Hypervisor " + hypervisorType + " does not support rootdisksize override");
+        }
+    }
+
     private void checkIfHostNameUniqueInNtwkDomain(String hostName, List<? extends Network> networkList) {
         // Check that hostName is unique in the network domain
         Map<String, List<Long>> ntwkDomains = new HashMap<String, List<Long>>();
@@ -3814,7 +3969,7 @@
                 // * verify that there are no duplicates
                 if (hostNames.contains(hostName)) {
                     throw new InvalidParameterValueException("The vm with hostName " + hostName + " already exists in the network domain: " + ntwkDomain.getKey() + "; network="
-                            + _networkModel.getNetwork(ntwkId));
+                            + ((_networkModel.getNetwork(ntwkId) != null) ? _networkModel.getNetwork(ntwkId).getName() : "<unknown>"));
                 }
             }
         }
@@ -3826,7 +3981,7 @@
 
     private UserVmVO commitUserVm(final boolean isImport, final DataCenter zone, final Host host, final Host lastHost, final VirtualMachineTemplate template, final String hostName, final String displayName, final Account owner,
                                   final Long diskOfferingId, final Long diskSize, final String userData, final Account caller, final Boolean isDisplayVm, final String keyboard,
-                                  final long accountId, final long userId, final ServiceOffering offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, NicProfile> networkNicMap,
+                                  final long accountId, final long userId, final ServiceOffering offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, List<NicProfile>> networkNicMap,
                                   final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map<String, String> customParameters,
                                   final Map<String, Map<Integer, String>> extraDhcpOptionMap, final Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap,
                                   final Map<String, String> userVmOVFPropertiesMap, final VirtualMachine.PowerState powerState) throws InsufficientCapacityException {
@@ -3933,27 +4088,7 @@
                 }
                 vm.setDetail(VmDetailConstants.DEPLOY_VM, "true");
 
-                if (MapUtils.isNotEmpty(userVmOVFPropertiesMap)) {
-                    for (String key : userVmOVFPropertiesMap.keySet()) {
-                        String detailKey = ApiConstants.OVF_PROPERTIES + "-" + key;
-                        String value = userVmOVFPropertiesMap.get(key);
-
-                        // Sanitize boolean values to expected format and encrypt passwords
-                        if (StringUtils.isNotBlank(value)) {
-                            if (value.equalsIgnoreCase("True")) {
-                                value = "True";
-                            } else if (value.equalsIgnoreCase("False")) {
-                                value = "False";
-                            } else {
-                                TemplateOVFPropertyVO ovfPropertyVO = templateOVFPropertiesDao.findByTemplateAndKey(vm.getTemplateId(), key);
-                                if (ovfPropertyVO.isPassword()) {
-                                    value = DBEncryptionUtil.encrypt(value);
-                                }
-                            }
-                        }
-                        vm.setDetail(detailKey, value);
-                    }
-                }
+                persistVMDeployAsIsProperties(vm, userVmOVFPropertiesMap);
 
                 _vmDao.saveDetails(vm);
                 if (!isImport) {
@@ -3998,9 +4133,42 @@
         });
     }
 
+    /**
+     * take the properties and set them on the vm.
+     * consider should we be complete, and make sure all default values are copied as well if known?
+     * I.E. iterate over the template details as well to copy any that are not defined yet.
+     */
+    private void persistVMDeployAsIsProperties(UserVmVO vm, Map<String, String> userVmOVFPropertiesMap) {
+        if (MapUtils.isNotEmpty(userVmOVFPropertiesMap)) {
+            for (String key : userVmOVFPropertiesMap.keySet()) {
+                String detailKey = key;
+                String value = userVmOVFPropertiesMap.get(key);
+
+                // Sanitize boolean values to expected format and encrypt passwords
+                if (StringUtils.isNotBlank(value)) {
+                    if (value.equalsIgnoreCase("True")) {
+                        value = "True";
+                    } else if (value.equalsIgnoreCase("False")) {
+                        value = "False";
+                    } else {
+                        OVFPropertyTO propertyTO = templateDeployAsIsDetailsDao.findPropertyByTemplateAndKey(vm.getTemplateId(), key);
+                        if (propertyTO != null && propertyTO.isPassword()) {
+                            value = DBEncryptionUtil.encrypt(value);
+                        }
+                    }
+                }
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace(String.format("setting property '%s' as '%s' with value '%s'", key, detailKey, value));
+                }
+                UserVmDeployAsIsDetailVO detail = new UserVmDeployAsIsDetailVO(vm.getId(), detailKey, value);
+                userVmDeployAsIsDetailsDao.persist(detail);
+            }
+        }
+    }
+
     private UserVmVO commitUserVm(final DataCenter zone, final VirtualMachineTemplate template, final String hostName, final String displayName, final Account owner,
             final Long diskOfferingId, final Long diskSize, final String userData, final Account caller, final Boolean isDisplayVm, final String keyboard,
-            final long accountId, final long userId, final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, NicProfile> networkNicMap,
+            final long accountId, final long userId, final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, List<NicProfile>> networkNicMap,
             final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map<String, String> customParameters, final Map<String,
             Map<Integer, String>> extraDhcpOptionMap, final Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap,
             Map<String, String> userVmOVFPropertiesMap) throws InsufficientCapacityException {
@@ -4016,8 +4184,7 @@
     {
         // rootdisksize must be larger than template.
         if ((rootDiskSize << 30) < templateVO.getSize()) {
-            Long templateVOSizeGB = templateVO.getSize() / GiB_TO_BYTES;
-            String error = "Unsupported: rootdisksize override is smaller than template size " + templateVO.getSize() + "B (" + templateVOSizeGB + "GB)";
+            String error = "Unsupported: rootdisksize override is smaller than template size " + toHumanReadableSize(templateVO.getSize());
             s_logger.error(error);
             throw new InvalidParameterValueException(error);
         } else if ((rootDiskSize << 30) > templateVO.getSize()) {
@@ -4028,10 +4195,10 @@
                 s_logger.error(error);
                 throw new InvalidParameterValueException(error);
             } else {
-                s_logger.debug("Rootdisksize override validation successful. Template root disk size " + (templateVO.getSize() / GiB_TO_BYTES) + "GB Root disk size specified " + rootDiskSize + "GB");
+                s_logger.debug("Rootdisksize override validation successful. Template root disk size " + toHumanReadableSize(templateVO.getSize()) + " Root disk size specified " + rootDiskSize + " GB");
             }
         } else {
-            s_logger.debug("Root disk size specified is " + (rootDiskSize << 30) + "B and Template root disk size is " + templateVO.getSize() + "B. Both are equal so no need to override");
+            s_logger.debug("Root disk size specified is " + toHumanReadableSize(rootDiskSize << 30) + " and Template root disk size is " + toHumanReadableSize(templateVO.getSize()) + ". Both are equal so no need to override");
             customParameters.remove(VmDetailConstants.ROOT_DISK_SIZE);
         }
     }
@@ -4159,15 +4326,15 @@
                                             || (previousvmNetworkStats.getCurrentBytesReceived() != vmNetworkStat_lock.getCurrentBytesReceived()))) {
                                 s_logger.debug("vm network stats changed from the time GetNmNetworkStatsCommand was sent. " +
                                         "Ignoring current answer. Host: " + host.getName()  + " . VM: " + vmNetworkStat.getVmName() +
-                                        " Sent(Bytes): " + vmNetworkStat.getBytesSent() + " Received(Bytes): " + vmNetworkStat.getBytesReceived());
+                                        " Sent(Bytes): " + toHumanReadableSize(vmNetworkStat.getBytesSent()) + " Received(Bytes): " + toHumanReadableSize(vmNetworkStat.getBytesReceived()));
                                 continue;
                             }
 
                             if (vmNetworkStat_lock.getCurrentBytesSent() > vmNetworkStat.getBytesSent()) {
                                 if (s_logger.isDebugEnabled()) {
-                                    s_logger.debug("Sent # of bytes that's less than the last one.  " +
+                                   s_logger.debug("Sent # of bytes that's less than the last one.  " +
                                             "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmNetworkStat.getVmName() +
-                                            " Reported: " + vmNetworkStat.getBytesSent() + " Stored: " + vmNetworkStat_lock.getCurrentBytesSent());
+                                            " Reported: " + toHumanReadableSize(vmNetworkStat.getBytesSent()) + " Stored: " + toHumanReadableSize(vmNetworkStat_lock.getCurrentBytesSent()));
                                 }
                                 vmNetworkStat_lock.setNetBytesSent(vmNetworkStat_lock.getNetBytesSent() + vmNetworkStat_lock.getCurrentBytesSent());
                             }
@@ -4177,7 +4344,7 @@
                                 if (s_logger.isDebugEnabled()) {
                                     s_logger.debug("Received # of bytes that's less than the last one.  " +
                                             "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmNetworkStat.getVmName() +
-                                            " Reported: " + vmNetworkStat.getBytesReceived() + " Stored: " + vmNetworkStat_lock.getCurrentBytesReceived());
+                                            " Reported: " + toHumanReadableSize(vmNetworkStat.getBytesReceived()) + " Stored: " + toHumanReadableSize(vmNetworkStat_lock.getCurrentBytesReceived()));
                                 }
                                 vmNetworkStat_lock.setNetBytesReceived(vmNetworkStat_lock.getNetBytesReceived() + vmNetworkStat_lock.getCurrentBytesReceived());
                             }
@@ -4249,7 +4416,7 @@
         Long podId = null;
         Long clusterId = null;
         Long hostId = cmd.getHostId();
-        Map<VirtualMachineProfile.Param, Object> additonalParams = null;
+        Map<VirtualMachineProfile.Param, Object> additonalParams =  new HashMap<>();
         Map<Long, DiskOffering> diskOfferingMap = cmd.getDataDiskTemplateToDiskOfferingMap();
         if (cmd instanceof DeployVMCmdByAdmin) {
             DeployVMCmdByAdmin adminCmd = (DeployVMCmdByAdmin)cmd;
@@ -4257,16 +4424,19 @@
             clusterId = adminCmd.getClusterId();
         }
         if (MapUtils.isNotEmpty(cmd.getDetails()) && cmd.getDetails().containsKey(ApiConstants.BootType.UEFI.toString())) {
-            additonalParams = new HashMap<VirtualMachineProfile.Param, Object>();
             Map<String, String> map = cmd.getDetails();
             additonalParams.put(VirtualMachineProfile.Param.UefiFlag, "Yes");
             additonalParams.put(VirtualMachineProfile.Param.BootType, ApiConstants.BootType.UEFI.toString());
             additonalParams.put(VirtualMachineProfile.Param.BootMode, map.get(ApiConstants.BootType.UEFI.toString()));
         }
+        if (cmd.getBootIntoSetup() != null) {
+            additonalParams.put(VirtualMachineProfile.Param.BootIntoSetup, cmd.getBootIntoSetup());
+        }
         return startVirtualMachine(vmId, podId, clusterId, hostId, diskOfferingMap, additonalParams, cmd.getDeploymentPlanner());
     }
 
-    private UserVm startVirtualMachine(long vmId, Long podId, Long clusterId, Long hostId, Map<Long, DiskOffering> diskOfferingMap, Map<VirtualMachineProfile.Param, Object> additonalParams, String deploymentPlannerToUse)
+    private UserVm startVirtualMachine(long vmId, Long podId, Long clusterId, Long hostId, Map<Long, DiskOffering> diskOfferingMap
+            , Map<VirtualMachineProfile.Param, Object> additonalParams, String deploymentPlannerToUse)
             throws ResourceUnavailableException,
             InsufficientCapacityException, ConcurrentOperationException, ResourceAllocationException {
         UserVmVO vm = _vmDao.findById(vmId);
@@ -4327,9 +4497,9 @@
             if (_networkModel.isSharedNetworkWithoutServices(network.getId())) {
                 final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText();
                 boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows");
-
+                String destHostname = VirtualMachineManager.getHypervisorHostname(dest.getHost() != null ? dest.getHost().getName() : "");
                 List<String[]> vmData = _networkModel.generateVmData(vm.getUserData(), serviceOffering, vm.getDataCenterId(), vm.getInstanceName(), vm.getHostName(), vm.getId(),
-                        vm.getUuid(), defaultNic.getIPv4Address(), vm.getDetail(VmDetailConstants.SSH_PUBLIC_KEY), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows);
+                        vm.getUuid(), defaultNic.getIPv4Address(), vm.getDetail(VmDetailConstants.SSH_PUBLIC_KEY), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows, destHostname);
                 String vmName = vm.getInstanceName();
                 String configDriveIsoRootFolder = "/tmp";
                 String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso";
@@ -4601,7 +4771,8 @@
     }
 
     @Override
-    public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long podId, Long clusterId, Long hostId, Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse)
+    public Pair<UserVmVO, Map<VirtualMachineProfile.Param, Object>> startVirtualMachine(long vmId, Long podId, Long clusterId, Long hostId,
+            Map<VirtualMachineProfile.Param, Object> additionalParams, String deploymentPlannerToUse)
             throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException, ResourceAllocationException {
         // Input validation
         final Account callerAccount = CallContext.current().getCallingAccount();
@@ -4617,6 +4788,10 @@
             throw new InvalidParameterValueException("unable to find a virtual machine with id " + vmId);
         }
 
+        if (vm.getState()== State.Running) {
+            throw new InvalidParameterValueException("The virtual machine "+ vm.getUuid()+ " ("+ vm.getDisplayName()+ ") is already running");
+        }
+
         _accountMgr.checkAccess(callerAccount, null, true, vm);
 
         Account owner = _accountDao.findById(vm.getAccountId());
@@ -4704,11 +4879,18 @@
             // use it to encrypt & save the vm password
             encryptAndStorePassword(vm, password);
 
-            params = new HashMap<VirtualMachineProfile.Param, Object>();
-            if (additionalParams != null) {
-                params.putAll(additionalParams);
+            params = createParameterInParameterMap(params, additionalParams, VirtualMachineProfile.Param.VmPassword, password);
+        }
+
+        if(null != additionalParams && additionalParams.containsKey(VirtualMachineProfile.Param.BootIntoSetup)) {
+            if (! HypervisorType.VMware.equals(vm.getHypervisorType())) {
+                throw new InvalidParameterValueException(ApiConstants.BOOT_INTO_SETUP + " makes no sense for " + vm.getHypervisorType());
             }
-            params.put(VirtualMachineProfile.Param.VmPassword, password);
+            Object paramValue = additionalParams.get(VirtualMachineProfile.Param.BootIntoSetup);
+            if (s_logger.isTraceEnabled()) {
+                    s_logger.trace("It was specified whether to enter setup mode: " + paramValue.toString());
+            }
+            params = createParameterInParameterMap(params, additionalParams, VirtualMachineProfile.Param.BootIntoSetup, paramValue);
         }
 
         VirtualMachineEntity vmEntity = _orchSrvc.getVirtualMachine(vm.getUuid());
@@ -4743,6 +4925,24 @@
         return vmParamPair;
     }
 
+    private Map<VirtualMachineProfile.Param, Object> createParameterInParameterMap(Map<VirtualMachineProfile.Param, Object> params, Map<VirtualMachineProfile.Param, Object> parameterMap, VirtualMachineProfile.Param parameter,
+            Object parameterValue) {
+        if (s_logger.isTraceEnabled()) {
+            s_logger.trace(String.format("createParameterInParameterMap(%s, %s)", parameter, parameterValue));
+        }
+        if (params == null) {
+            if (s_logger.isTraceEnabled()) {
+                s_logger.trace("creating new Parameter map");
+            }
+            params = new HashMap<>();
+            if (parameterMap != null) {
+                params.putAll(parameterMap);
+            }
+        }
+        params.put(parameter, parameterValue);
+        return params;
+    }
+
     private Pod getDestinationPod(Long podId, boolean isRootAdmin) {
         Pod destinationPod = null;
         if (podId != null) {
@@ -4938,7 +5138,7 @@
                             if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
                                 if (s_logger.isDebugEnabled()) {
                                     s_logger.debug("Read # of Bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: " + host.getName()
-                                    + " . VM: " + vmDiskStat.getVmName() + " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+                                    + " . VM: " + vmDiskStat.getVmName() + " Reported: " + toHumanReadableSize(vmDiskStat.getBytesRead()) + " Stored: " + toHumanReadableSize(vmDiskStat_lock.getCurrentBytesRead()));
                                 }
                                 vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
                             }
@@ -4946,8 +5146,8 @@
                             if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
                                 if (s_logger.isDebugEnabled()) {
                                     s_logger.debug("Write # of Bytes that's less than the last one.  " + "Assuming something went wrong and persisting it. Host: " + host.getName()
-                                    + " . VM: " + vmDiskStat.getVmName() + " Reported: " + vmDiskStat.getBytesWrite() + " Stored: "
-                                    + vmDiskStat_lock.getCurrentBytesWrite());
+                                    + " . VM: " + vmDiskStat.getVmName() + " Reported: " + toHumanReadableSize(vmDiskStat.getBytesWrite()) + " Stored: "
+                                    + toHumanReadableSize(vmDiskStat_lock.getCurrentBytesWrite()));
                                 }
                                 vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
                             }
@@ -5001,7 +5201,7 @@
             throw new PermissionDeniedException("Expunging a vm can only be done by an Admin. Or when the allow.user.expunge.recover.vm key is set.");
         }
 
-        _vmSnapshotMgr.deleteVMSnapshotsFromDB(vmId);
+        _vmSnapshotMgr.deleteVMSnapshotsFromDB(vmId, false);
 
         boolean status;
 
@@ -5066,6 +5266,11 @@
             throw new InvalidParameterValueException("Unable to use template " + templateId);
         }
 
+        // Bootmode and boottype are not supported on VMWare dpeloy-as-is templates (since 4.15)
+        if (template.isDeployAsIs() && (cmd.getBootMode() != null || cmd.getBootType() != null)) {
+            throw new InvalidParameterValueException("Boot type and boot mode are not supported on VMware, as we honour what is defined in the template.");
+        }
+
         Long diskOfferingId = cmd.getDiskOfferingId();
         DiskOffering diskOffering = null;
         if (diskOfferingId != null) {
@@ -5084,6 +5289,12 @@
             }
         }
 
+        List<Long> networkIds = cmd.getNetworkIds();
+        LinkedHashMap<Integer, Long> userVmNetworkMap = getVmOvfNetworkMapping(zone, owner, template, cmd.getVmNetworkMap());
+        if (MapUtils.isNotEmpty(userVmNetworkMap)) {
+            networkIds = new ArrayList<>(userVmNetworkMap.values());
+        }
+
         String ipAddress = cmd.getIpAddress();
         String ip6Address = cmd.getIp6Address();
         String macAddress = cmd.getMacAddress();
@@ -5098,9 +5309,9 @@
         Boolean displayVm = cmd.isDisplayVm();
         String keyboard = cmd.getKeyboard();
         Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap = cmd.getDataDiskTemplateToDiskOfferingMap();
-        Map<String, String> userVmOVFProperties = cmd.getVmOVFProperties();
+        Map<String, String> userVmOVFProperties = cmd.getVmProperties();
         if (zone.getNetworkType() == NetworkType.Basic) {
-            if (cmd.getNetworkIds() != null) {
+            if (networkIds != null) {
                 throw new InvalidParameterValueException("Can't specify network Ids in Basic zone");
             } else {
                 vm = createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, getSecurityGroupIdList(cmd), owner, name, displayName, diskOfferingId,
@@ -5110,7 +5321,7 @@
             }
         } else {
             if (zone.isSecurityGroupEnabled())  {
-                vm = createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, cmd.getNetworkIds(), getSecurityGroupIdList(cmd), owner, name,
+                vm = createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, networkIds, getSecurityGroupIdList(cmd), owner, name,
                         displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard,
                         cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap(),
                         dataDiskTemplateToDiskOfferingMap, userVmOVFProperties);
@@ -5119,7 +5330,7 @@
                 if (cmd.getSecurityGroupIdList() != null && !cmd.getSecurityGroupIdList().isEmpty()) {
                     throw new InvalidParameterValueException("Can't create vm with security groups; security group feature is not enabled per zone");
                 }
-                vm = createAdvancedVirtualMachine(zone, serviceOffering, template, cmd.getNetworkIds(), owner, name, displayName, diskOfferingId, size, group,
+                vm = createAdvancedVirtualMachine(zone, serviceOffering, template, networkIds, owner, name, displayName, diskOfferingId, size, group,
                         cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(),
                         cmd.getCustomId(), cmd.getDhcpOptionsMap(), dataDiskTemplateToDiskOfferingMap, userVmOVFProperties);
             }
@@ -5497,6 +5708,12 @@
         }
 
         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());
+
+            destPool = volumeMgr.findChildDataStoreInDataStoreCluster(dc, destPoolPod, destPool.getClusterId(), null, null, destPool.getId());
+        }
 
         _itMgr.storageMigration(vm.getUuid(), destPool);
         return _vmDao.findById(vm.getId());
@@ -6026,6 +6243,17 @@
                     }
                     volToPoolObjectMap.put(Long.valueOf(volume.getId()), Long.valueOf(pool.getId()));
                 }
+                HypervisorType hypervisorType = _volsDao.getHypervisorType(volume.getId());
+                if (hypervisorType.equals(HypervisorType.VMware)) {
+                    try {
+                        boolean isStoragePoolStoragepolicyComplaince = storageMgr.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()));
+                        }
+                    } catch (StorageUnavailableException e) {
+                        throw new CloudRuntimeException(String.format("Could not verify storage policy compliance against storage pool %s due to exception %s", pool.getUuid(), e.getMessage()));
+                    }
+                }
             }
         }
 
@@ -6094,6 +6322,10 @@
             throw new InvalidParameterValueException("The new account owner " + cmd.getAccountName() + " is disabled.");
         }
 
+        if (cmd.getProjectId() != null && cmd.getDomainId() == null) {
+            throw new InvalidParameterValueException("Please provide a valid domain ID; cannot assign VM to a project if domain ID is NULL.");
+        }
+
         //check caller has access to both the old and new account
         _accountMgr.checkAccess(caller, null, true, oldAccount);
         _accountMgr.checkAccess(caller, null, true, newAccount);
@@ -6603,44 +6835,10 @@
         return _itMgr.restoreVirtualMachine(vm.getId(), newTemplateId);
     }
 
-    @Override
-    public UserVm restoreVirtualMachine(final Account caller, final long vmId, final Long newTemplateId) throws InsufficientCapacityException, ResourceUnavailableException {
-        Long userId = caller.getId();
-        _userDao.findById(userId);
-        UserVmVO vm = _vmDao.findById(vmId);
-        Account owner = _accountDao.findById(vm.getAccountId());
-        boolean needRestart = false;
-
-        // Input validation
-        if (owner == null) {
-            throw new InvalidParameterValueException("The owner of " + vm + " does not exist: " + vm.getAccountId());
-        }
-
-        if (owner.getState() == Account.State.disabled) {
-            throw new PermissionDeniedException("The owner of " + vm + " is disabled: " + vm.getAccountId());
-        }
-
-        if (vm.getState() != VirtualMachine.State.Running && vm.getState() != VirtualMachine.State.Stopped) {
-            throw new CloudRuntimeException("Vm " + vm.getUuid() + " currently in " + vm.getState() + " state, restore vm can only execute when VM in Running or Stopped");
-        }
-
-        if (vm.getState() == VirtualMachine.State.Running) {
-            needRestart = true;
-        }
-
-        List<VolumeVO> rootVols = _volsDao.findByInstanceAndType(vmId, Volume.Type.ROOT);
-        if (rootVols.isEmpty()) {
-            InvalidParameterValueException ex = new InvalidParameterValueException("Can not find root volume for VM " + vm.getUuid());
-            ex.addProxyObject(vm.getUuid(), "vmId");
-            throw ex;
-        }
-        if (rootVols.size() > 1) {
-            InvalidParameterValueException ex = new InvalidParameterValueException("There are " + rootVols.size() + " root volumes for VM " + vm.getUuid());
-            ex.addProxyObject(vm.getUuid(), "vmId");
-            throw ex;
-        }
-        VolumeVO root = rootVols.get(0);
-        if ( !Volume.State.Allocated.equals(root.getState()) || newTemplateId != null ){
+    private VMTemplateVO getRestoreVirtualMachineTemplate(Account caller, Long newTemplateId, List<VolumeVO> rootVols, UserVmVO vm) {
+        VMTemplateVO template = null;
+        if (CollectionUtils.isNotEmpty(rootVols)) {
+            VolumeVO root = rootVols.get(0);
             Long templateId = root.getTemplateId();
             boolean isISO = false;
             if (templateId == null) {
@@ -6648,14 +6846,6 @@
                 isISO = true;
                 templateId = vm.getIsoId();
             }
-
-            // If target VM has associated VM snapshots then don't allow restore of VM
-            List<VMSnapshotVO> vmSnapshots = _vmSnapshotDao.findByVm(vmId);
-            if (vmSnapshots.size() > 0) {
-                throw new InvalidParameterValueException("Unable to restore VM, please remove VM snapshots before restoring VM");
-            }
-
-            VMTemplateVO template = null;
             //newTemplateId can be either template or ISO id. In the following snippet based on the vm deployment (from template or ISO) it is handled accordingly
             if (newTemplateId != null) {
                 template = _templateDao.findById(newTemplateId);
@@ -6681,110 +6871,171 @@
                     throw ex;
                 }
             }
+        }
 
-            checkRestoreVmFromTemplate(vm, template);
+        return template;
+    }
 
-            if (needRestart) {
-                try {
-                    _itMgr.stop(vm.getUuid());
-                } catch (ResourceUnavailableException e) {
-                    s_logger.debug("Stop vm " + vm.getUuid() + " failed", e);
-                    CloudRuntimeException ex = new CloudRuntimeException("Stop vm failed for specified vmId");
-                    ex.addProxyObject(vm.getUuid(), "vmId");
-                    throw ex;
-                }
+    @Override
+    public UserVm restoreVirtualMachine(final Account caller, final long vmId, final Long newTemplateId) throws InsufficientCapacityException, ResourceUnavailableException {
+        Long userId = caller.getId();
+        _userDao.findById(userId);
+        UserVmVO vm = _vmDao.findById(vmId);
+        Account owner = _accountDao.findById(vm.getAccountId());
+        boolean needRestart = false;
+
+        // Input validation
+        if (owner == null) {
+            throw new InvalidParameterValueException("The owner of " + vm + " does not exist: " + vm.getAccountId());
+        }
+
+        if (owner.getState() == Account.State.disabled) {
+            throw new PermissionDeniedException("The owner of " + vm + " is disabled: " + vm.getAccountId());
+        }
+
+        if (vm.getState() != VirtualMachine.State.Running && vm.getState() != VirtualMachine.State.Stopped) {
+            throw new CloudRuntimeException("Vm " + vm.getUuid() + " currently in " + vm.getState() + " state, restore vm can only execute when VM in Running or Stopped");
+        }
+
+        if (vm.getState() == VirtualMachine.State.Running) {
+            needRestart = true;
+        }
+
+        VMTemplateVO currentTemplate = _templateDao.findById(vm.getTemplateId());
+        List<VolumeVO> rootVols = _volsDao.findByInstanceAndType(vmId, Volume.Type.ROOT);
+        if (rootVols.isEmpty()) {
+            InvalidParameterValueException ex = new InvalidParameterValueException("Can not find root volume for VM " + vm.getUuid());
+            ex.addProxyObject(vm.getUuid(), "vmId");
+            throw ex;
+        }
+        if (rootVols.size() > 1 && currentTemplate != null && !currentTemplate.isDeployAsIs()) {
+            InvalidParameterValueException ex = new InvalidParameterValueException("There are " + rootVols.size() + " root volumes for VM " + vm.getUuid());
+            ex.addProxyObject(vm.getUuid(), "vmId");
+            throw ex;
+        }
+
+        // If target VM has associated VM snapshots then don't allow restore of VM
+        List<VMSnapshotVO> vmSnapshots = _vmSnapshotDao.findByVm(vmId);
+        if (vmSnapshots.size() > 0) {
+            throw new InvalidParameterValueException("Unable to restore VM, please remove VM snapshots before restoring VM");
+        }
+
+        VMTemplateVO template = getRestoreVirtualMachineTemplate(caller, newTemplateId, rootVols, vm);
+        checkRestoreVmFromTemplate(vm, template);
+
+        if (needRestart) {
+            try {
+                _itMgr.stop(vm.getUuid());
+            } catch (ResourceUnavailableException e) {
+                s_logger.debug("Stop vm " + vm.getUuid() + " failed", e);
+                CloudRuntimeException ex = new CloudRuntimeException("Stop vm failed for specified vmId");
+                ex.addProxyObject(vm.getUuid(), "vmId");
+                throw ex;
             }
+        }
 
-            /* If new template/ISO is provided allocate a new volume from new template/ISO otherwise allocate new volume from original template/ISO */
-            Volume newVol = null;
-            if (newTemplateId != null) {
-                if (isISO) {
-                    newVol = volumeMgr.allocateDuplicateVolume(root, null);
-                    vm.setIsoId(newTemplateId);
-                    vm.setGuestOSId(template.getGuestOSId());
-                    vm.setTemplateId(newTemplateId);
-                    _vmDao.update(vmId, vm);
+        List<Volume> newVols = new ArrayList<>();
+        for (VolumeVO root : rootVols) {
+            if ( !Volume.State.Allocated.equals(root.getState()) || newTemplateId != null ){
+                Long templateId = root.getTemplateId();
+                boolean isISO = false;
+                if (templateId == null) {
+                    // Assuming that for a vm deployed using ISO, template ID is set to NULL
+                    isISO = true;
+                    templateId = vm.getIsoId();
+                }
+
+                /* If new template/ISO is provided allocate a new volume from new template/ISO otherwise allocate new volume from original template/ISO */
+                Volume newVol = null;
+                if (newTemplateId != null) {
+                    if (isISO) {
+                        newVol = volumeMgr.allocateDuplicateVolume(root, null);
+                        vm.setIsoId(newTemplateId);
+                        vm.setGuestOSId(template.getGuestOSId());
+                        vm.setTemplateId(newTemplateId);
+                        _vmDao.update(vmId, vm);
+                    } else {
+                        newVol = volumeMgr.allocateDuplicateVolume(root, newTemplateId);
+                        vm.setGuestOSId(template.getGuestOSId());
+                        vm.setTemplateId(newTemplateId);
+                        _vmDao.update(vmId, vm);
+                    }
                 } else {
-                    newVol = volumeMgr.allocateDuplicateVolume(root, newTemplateId);
-                    vm.setGuestOSId(template.getGuestOSId());
-                    vm.setTemplateId(newTemplateId);
-                    _vmDao.update(vmId, vm);
+                    newVol = volumeMgr.allocateDuplicateVolume(root, null);
                 }
-            } else {
-                newVol = volumeMgr.allocateDuplicateVolume(root, null);
-            }
+                newVols.add(newVol);
 
-            // 1. Save usage event and update resource count for user vm volumes
-            _resourceLimitMgr.incrementResourceCount(newVol.getAccountId(), ResourceType.volume, newVol.isDisplay());
-            _resourceLimitMgr.incrementResourceCount(newVol.getAccountId(), ResourceType.primary_storage, newVol.isDisplay(), new Long(newVol.getSize()));
-            // 2. Create Usage event for the newly created volume
-            UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, newVol.getAccountId(), newVol.getDataCenterId(), newVol.getId(), newVol.getName(), newVol.getDiskOfferingId(), template.getId(), newVol.getSize());
-            _usageEventDao.persist(usageEvent);
+                // 1. Save usage event and update resource count for user vm volumes
+                _resourceLimitMgr.incrementResourceCount(newVol.getAccountId(), ResourceType.volume, newVol.isDisplay());
+                _resourceLimitMgr.incrementResourceCount(newVol.getAccountId(), ResourceType.primary_storage, newVol.isDisplay(), new Long(newVol.getSize()));
+                // 2. Create Usage event for the newly created volume
+                UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, newVol.getAccountId(), newVol.getDataCenterId(), newVol.getId(), newVol.getName(), newVol.getDiskOfferingId(), template.getId(), newVol.getSize());
+                _usageEventDao.persist(usageEvent);
 
-            handleManagedStorage(vm, root);
+                handleManagedStorage(vm, root);
 
-            _volsDao.attachVolume(newVol.getId(), vmId, newVol.getDeviceId());
+                _volsDao.attachVolume(newVol.getId(), vmId, newVol.getDeviceId());
 
-            // Detach, destroy and create the usage event for the old root volume.
-            _volsDao.detachVolume(root.getId());
-            volumeMgr.destroyVolume(root);
+                // Detach, destroy and create the usage event for the old root volume.
+                _volsDao.detachVolume(root.getId());
+                volumeMgr.destroyVolume(root);
 
-            // For VMware hypervisor since the old root volume is replaced by the new root volume, force expunge old root volume if it has been created in storage
-            if (vm.getHypervisorType() == HypervisorType.VMware) {
-                VolumeInfo volumeInStorage = volFactory.getVolume(root.getId());
-                if (volumeInStorage != null) {
-                    s_logger.info("Expunging volume " + root.getId() + " from primary data store");
-                    AsyncCallFuture<VolumeApiResult> future = _volService.expungeVolumeAsync(volFactory.getVolume(root.getId()));
-                    try {
-                        future.get();
-                    } catch (Exception e) {
-                        s_logger.debug("Failed to expunge volume:" + root.getId(), e);
-                    }
-                }
-            }
-
-            Map<VirtualMachineProfile.Param, Object> params = null;
-            String password = null;
-
-            if (template.isEnablePassword()) {
-                password = _mgr.generateRandomPassword();
-                boolean result = resetVMPasswordInternal(vmId, password);
-                if (!result) {
-                    throw new CloudRuntimeException("VM reset is completed but failed to reset password for the virtual machine ");
-                }
-                vm.setPassword(password);
-            }
-
-            if (needRestart) {
-                try {
-                    if (vm.getDetail(VmDetailConstants.PASSWORD) != null) {
-                        params = new HashMap<VirtualMachineProfile.Param, Object>();
-                        params.put(VirtualMachineProfile.Param.VmPassword, password);
-                    }
-                    _itMgr.start(vm.getUuid(), params);
-                    vm = _vmDao.findById(vmId);
-                    if (template.isEnablePassword()) {
-                        // this value is not being sent to the backend; need only for api
-                        // display purposes
-                        vm.setPassword(password);
-                        if (vm.isUpdateParameters()) {
-                            vm.setUpdateParameters(false);
-                            _vmDao.loadDetails(vm);
-                            if (vm.getDetail(VmDetailConstants.PASSWORD) != null) {
-                                userVmDetailsDao.removeDetail(vm.getId(), VmDetailConstants.PASSWORD);
-                            }
-                            _vmDao.update(vm.getId(), vm);
+                // For VMware hypervisor since the old root volume is replaced by the new root volume, force expunge old root volume if it has been created in storage
+                if (vm.getHypervisorType() == HypervisorType.VMware) {
+                    VolumeInfo volumeInStorage = volFactory.getVolume(root.getId());
+                    if (volumeInStorage != null) {
+                        s_logger.info("Expunging volume " + root.getId() + " from primary data store");
+                        AsyncCallFuture<VolumeApiResult> future = _volService.expungeVolumeAsync(volFactory.getVolume(root.getId()));
+                        try {
+                            future.get();
+                        } catch (Exception e) {
+                            s_logger.debug("Failed to expunge volume:" + root.getId(), e);
                         }
                     }
-                } catch (Exception e) {
-                    s_logger.debug("Unable to start VM " + vm.getUuid(), e);
-                    CloudRuntimeException ex = new CloudRuntimeException("Unable to start VM with specified id" + e.getMessage());
-                    ex.addProxyObject(vm.getUuid(), "vmId");
-                    throw ex;
                 }
             }
         }
 
+        Map<VirtualMachineProfile.Param, Object> params = null;
+        String password = null;
+
+        if (template.isEnablePassword()) {
+            password = _mgr.generateRandomPassword();
+            boolean result = resetVMPasswordInternal(vmId, password);
+            if (!result) {
+                throw new CloudRuntimeException("VM reset is completed but failed to reset password for the virtual machine ");
+            }
+            vm.setPassword(password);
+        }
+        if (needRestart) {
+            try {
+                if (vm.getDetail(VmDetailConstants.PASSWORD) != null) {
+                    params = new HashMap<>();
+                    params.put(VirtualMachineProfile.Param.VmPassword, password);
+                }
+                _itMgr.start(vm.getUuid(), params);
+                vm = _vmDao.findById(vmId);
+                if (template.isEnablePassword()) {
+                    // this value is not being sent to the backend; need only for api
+                    // display purposes
+                    vm.setPassword(password);
+                    if (vm.isUpdateParameters()) {
+                        vm.setUpdateParameters(false);
+                        _vmDao.loadDetails(vm);
+                        if (vm.getDetail(VmDetailConstants.PASSWORD) != null) {
+                            userVmDetailsDao.removeDetail(vm.getId(), VmDetailConstants.PASSWORD);
+                        }
+                        _vmDao.update(vm.getId(), vm);
+                    }
+                }
+            } catch (Exception e) {
+                s_logger.debug("Unable to start VM " + vm.getUuid(), e);
+                CloudRuntimeException ex = new CloudRuntimeException("Unable to start VM with specified id" + e.getMessage());
+                ex.addProxyObject(vm.getUuid(), "vmId");
+                throw ex;
+            }
+        }
+
         s_logger.debug("Restore VM " + vmId + " done successfully");
         return vm;
 
@@ -6948,6 +7199,10 @@
         }
     }
 
+    @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
     private void encryptAndStorePassword(UserVmVO vm, String password) {
         String sshPublicKey = vm.getDetail(VmDetailConstants.SSH_PUBLIC_KEY);
         if (sshPublicKey != null && !sshPublicKey.equals("") && password != null && !password.equals("saved_password")) {
@@ -7109,4 +7364,178 @@
                 id, instanceName, uuidName, hypervisorType, customParameters,
                 null, null, null, powerState);
     }
-}
\ No newline at end of file
+
+    @Override
+    public boolean unmanageUserVM(Long vmId) {
+        UserVmVO vm = _vmDao.findById(vmId);
+        if (vm == null || vm.getRemoved() != null) {
+            throw new InvalidParameterValueException("Unable to find a VM with ID = " + vmId);
+        }
+
+        vm = _vmDao.acquireInLockTable(vm.getId());
+        boolean result;
+        try {
+            if (vm.getState() != State.Running && vm.getState() != State.Stopped) {
+                s_logger.debug("VM ID = " + vmId + " is not running or stopped, cannot be unmanaged");
+                return false;
+            }
+
+            if (vm.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
+                throw new UnsupportedServiceException("Unmanaging a VM is currently allowed for VMware VMs only");
+            }
+
+            List<VolumeVO> volumes = _volsDao.findByInstance(vm.getId());
+            checkUnmanagingVMOngoingVolumeSnapshots(vm);
+            checkUnmanagingVMVolumes(vm, volumes);
+
+            result = _itMgr.unmanage(vm.getUuid());
+            if (result) {
+                cleanupUnmanageVMResources(vm.getId());
+                unmanageVMFromDB(vm.getId());
+                publishUnmanageVMUsageEvents(vm, volumes);
+            } else {
+                throw new CloudRuntimeException("Error while unmanaging VM: " + vm.getUuid());
+            }
+        } catch (Exception e) {
+            s_logger.error("Could not unmanage VM " + vm.getUuid(), e);
+            throw new CloudRuntimeException(e);
+        } finally {
+            _vmDao.releaseFromLockTable(vm.getId());
+        }
+
+        return true;
+    }
+
+    /*
+        Generate usage events related to unmanaging a VM
+     */
+    private void publishUnmanageVMUsageEvents(UserVmVO vm, List<VolumeVO> volumes) {
+        postProcessingUnmanageVMVolumes(volumes, vm);
+        postProcessingUnmanageVM(vm);
+    }
+
+    /*
+        Cleanup the VM from resources and groups
+     */
+    private void cleanupUnmanageVMResources(long vmId) {
+        cleanupVmResources(vmId);
+        removeVMFromAffinityGroups(vmId);
+    }
+
+    private void unmanageVMFromDB(long vmId) {
+        VMInstanceVO vm = _vmInstanceDao.findById(vmId);
+        userVmDetailsDao.removeDetails(vmId);
+        vm.setState(State.Expunging);
+        vm.setRemoved(new Date());
+        _vmInstanceDao.update(vm.getId(), vm);
+    }
+
+    /*
+        Remove VM from affinity groups after unmanaging
+     */
+    private void removeVMFromAffinityGroups(long vmId) {
+        List<AffinityGroupVMMapVO> affinityGroups = _affinityGroupVMMapDao.listByInstanceId(vmId);
+        if (affinityGroups.size() > 0) {
+            s_logger.debug("Cleaning up VM from affinity groups after unmanaging");
+            for (AffinityGroupVMMapVO map : affinityGroups) {
+                _affinityGroupVMMapDao.expunge(map.getId());
+            }
+        }
+    }
+
+    /*
+        Decrement VM resources and generate usage events after unmanaging VM
+     */
+    private void postProcessingUnmanageVM(UserVmVO vm) {
+        ServiceOfferingVO offering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
+        Long cpu = offering.getCpu() != null ? new Long(offering.getCpu()) : 0L;
+        Long ram = offering.getRamSize() != null ? new Long(offering.getRamSize()) : 0L;
+        // First generate a VM stop event if the VM was not stopped already
+        if (vm.getState() != State.Stopped) {
+            UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_STOP, vm.getAccountId(), vm.getDataCenterId(),
+                    vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(),
+                    vm.getHypervisorType().toString(), VirtualMachine.class.getName(), vm.getUuid(), vm.isDisplayVm());
+            resourceCountDecrement(vm.getAccountId(), vm.isDisplayVm(), cpu, ram);
+        }
+
+        // VM destroy usage event
+        UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(),
+                vm.getId(), vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(),
+                vm.getHypervisorType().toString(), VirtualMachine.class.getName(), vm.getUuid(), vm.isDisplayVm());
+        resourceCountDecrement(vm.getAccountId(), vm.isDisplayVm(), cpu, ram);
+    }
+
+    /*
+        Decrement resources for volumes and generate usage event for ROOT volume after unmanaging VM.
+        Usage events for DATA disks are published by the transition listener: @see VolumeStateListener#postStateTransitionEvent
+     */
+    private void postProcessingUnmanageVMVolumes(List<VolumeVO> volumes, UserVmVO vm) {
+        for (VolumeVO volume : volumes) {
+            if (volume.getVolumeType() == Volume.Type.ROOT) {
+                //
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(),
+                        Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
+            }
+            _resourceLimitMgr.decrementResourceCount(vm.getAccountId(), ResourceType.volume);
+            _resourceLimitMgr.decrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
+        }
+    }
+
+    private void checkUnmanagingVMOngoingVolumeSnapshots(UserVmVO vm) {
+        s_logger.debug("Checking if there are any ongoing snapshots on the ROOT volumes associated with VM with ID " + vm.getId());
+        if (checkStatusOfVolumeSnapshots(vm.getId(), Volume.Type.ROOT)) {
+            throw new CloudRuntimeException("There is/are unbacked up snapshot(s) on ROOT volume, vm unmanage is not permitted, please try again later.");
+        }
+        s_logger.debug("Found no ongoing snapshots on volume of type ROOT, for the vm with id " + vm.getId());
+    }
+
+    private void checkUnmanagingVMVolumes(UserVmVO vm, List<VolumeVO> volumes) {
+        for (VolumeVO volume : volumes) {
+            if (volume.getInstanceId() == null || !volume.getInstanceId().equals(vm.getId())) {
+                throw new CloudRuntimeException("Invalid state for volume with ID " + volume.getId() + " of VM " +
+                        vm.getId() +": it is not attached to VM");
+            } else if (volume.getVolumeType() != Volume.Type.ROOT && volume.getVolumeType() != Volume.Type.DATADISK) {
+                throw new CloudRuntimeException("Invalid type for volume with ID " + volume.getId() +
+                        ": ROOT or DATADISK expected but got " + volume.getVolumeType());
+            }
+        }
+    }
+
+    private LinkedHashMap<Integer, Long> getVmOvfNetworkMapping(DataCenter zone, Account owner, VirtualMachineTemplate template, Map<Integer, Long> vmNetworkMapping) throws InsufficientCapacityException, ResourceAllocationException {
+        LinkedHashMap<Integer, Long> mapping = new LinkedHashMap<>();
+        if (ImageFormat.OVA.equals(template.getFormat())) {
+            List<OVFNetworkTO> OVFNetworkTOList =
+                    templateDeployAsIsDetailsDao.listNetworkRequirementsByTemplateId(template.getId());
+            if (CollectionUtils.isNotEmpty(OVFNetworkTOList)) {
+                Network lastMappedNetwork = null;
+                for (OVFNetworkTO OVFNetworkTO : OVFNetworkTOList) {
+                    Long networkId = vmNetworkMapping.get(OVFNetworkTO.getInstanceID());
+                    if (networkId == null && lastMappedNetwork == null) {
+                        lastMappedNetwork = getNetworkForOvfNetworkMapping(zone, owner);
+                    }
+                    if (networkId == null) {
+                        networkId = lastMappedNetwork.getId();
+                    }
+                    mapping.put(OVFNetworkTO.getInstanceID(), networkId);
+                }
+            }
+        }
+        return mapping;
+    }
+
+    private Network getNetworkForOvfNetworkMapping(DataCenter zone, Account owner) throws InsufficientCapacityException, ResourceAllocationException {
+        Network network = null;
+        if (zone.isSecurityGroupEnabled()) {
+            network = _networkModel.getNetworkWithSGWithFreeIPs(zone.getId());
+            if (network == null) {
+                throw new InvalidParameterValueException("No network with security enabled is found in zone ID: " + zone.getUuid());
+            }
+        } else {
+            network = getDefaultNetwork(zone, owner, true);
+            if (network == null) {
+                throw new InvalidParameterValueException(String.format("Default network not found for zone ID: %s and account ID: %s", zone.getUuid(), owner.getUuid()));
+            }
+        }
+        return network;
+    }
+}
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 39d7530..a117af2 100644
--- a/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/main/java/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -1312,7 +1312,7 @@
     }
 
     @Override
-    public boolean deleteVMSnapshotsFromDB(Long vmId) {
+    public boolean deleteVMSnapshotsFromDB(Long vmId, boolean unmanage) {
         List<VMSnapshotVO> listVmSnapshots = _vmSnapshotDao.findByVm(vmId);
         if (listVmSnapshots == null || listVmSnapshots.isEmpty()) {
             return true;
@@ -1320,7 +1320,7 @@
         for (VMSnapshotVO snapshot : listVmSnapshots) {
             try {
                 VMSnapshotStrategy strategy = findVMSnapshotStrategy(snapshot);
-                if (! strategy.deleteVMSnapshotFromDB(snapshot)) {
+                if (! strategy.deleteVMSnapshotFromDB(snapshot, unmanage)) {
                     s_logger.error("Couldn't delete vm snapshot with id " + snapshot.getId());
                     return false;
                 }
diff --git a/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java
new file mode 100644
index 0000000..90d8e1e
--- /dev/null
+++ b/server/src/main/java/org/apache/cloudstack/acl/ProjectRoleManagerImpl.java
@@ -0,0 +1,315 @@
+// 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.acl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.acl.dao.ProjectRoleDao;
+import org.apache.cloudstack.acl.dao.ProjectRolePermissionsDao;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
+import org.apache.cloudstack.api.command.admin.acl.project.CreateProjectRoleCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.CreateProjectRolePermissionCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.DeleteProjectRoleCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.DeleteProjectRolePermissionCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.ListProjectRolePermissionsCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.ListProjectRolesCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.UpdateProjectRoleCmd;
+import org.apache.cloudstack.api.command.admin.acl.project.UpdateProjectRolePermissionCmd;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.cloud.projects.dao.ProjectAccountDao;
+import com.cloud.projects.dao.ProjectDao;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import com.cloud.user.User;
+import com.cloud.user.dao.AccountDao;
+import com.cloud.utils.ListUtils;
+import com.cloud.utils.component.ManagerBase;
+import com.cloud.utils.component.PluggableService;
+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.google.common.base.Strings;
+
+public class ProjectRoleManagerImpl extends ManagerBase implements ProjectRoleService, PluggableService {
+    @Inject
+    ProjectAccountDao projAccDao;
+    @Inject
+    ProjectRoleDao projRoleDao;
+    @Inject
+    ProjectDao projectDao;
+    @Inject
+    AccountDao accountDao;
+    @Inject
+    ProjectRolePermissionsDao projRolePermissionsDao;
+    @Inject
+    AccountService accountService;
+
+    private static final Logger LOGGER = Logger.getLogger(ProjectRoleManagerImpl.class);
+
+    private Project validateProjectId(Long projectId) {
+        Project project = projectDao.findById(projectId);
+        if (project == null) {
+            throw new CloudRuntimeException("Invalid project id provided");
+        }
+        return project;
+    }
+
+    private void checkAccess(Long projectId) {
+        Project project = validateProjectId(projectId);
+        CallContext.current().setProject(project);
+
+        if (!isEnabled()) {
+            throw new PermissionDeniedException("Dynamic api checker is not enabled, aborting role operation");
+        }
+
+        User user = getCurrentUser();
+        Account callerAcc = accountDao.findById(user.getAccountId());
+
+        if (callerAcc == null || callerAcc.getRoleId() == null) {
+            throw new PermissionDeniedException("Restricted API called by an invalid user account");
+        }
+
+        if (accountService.isRootAdmin(callerAcc.getId()) || accountService.isDomainAdmin(callerAcc.getAccountId())) {
+            return;
+        }
+
+        ProjectAccount projectAccount = projAccDao.findByProjectIdUserId(projectId, callerAcc.getAccountId(), user.getId());
+        if (projectAccount == null) {
+            projectAccount = projAccDao.findByProjectIdAccountId(projectId, callerAcc.getAccountId());
+            if (projectAccount == null) {
+                throw new PermissionDeniedException("User/Account not part of project");
+            }
+        }
+        if (ProjectAccount.Role.Admin != projectAccount.getAccountRole()) {
+            throw new PermissionDeniedException("User unauthorized to perform operation in the project");
+        }
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_CREATE, eventDescription = "creating Project Role")
+    public ProjectRole createProjectRole(Long projectId, String name, String description) {
+        checkAccess(projectId);
+        return Transaction.execute(new TransactionCallback<ProjectRoleVO>() {
+            @Override
+            public ProjectRoleVO doInTransaction(TransactionStatus status) {
+                return projRoleDao.persist(new ProjectRoleVO(name, description, projectId));
+            }
+        });
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_UPDATE, eventDescription = "updating Project Role")
+    public ProjectRole updateProjectRole(ProjectRole role, Long projectId, String name, String description) {
+        checkAccess(projectId);
+        ProjectRoleVO projectRoleVO = (ProjectRoleVO) role;
+        if (!Strings.isNullOrEmpty(name)) {
+            projectRoleVO.setName(name);
+        }
+        if (!Strings.isNullOrEmpty(description)) {
+            projectRoleVO.setDescription(description);
+        }
+        projRoleDao.update(role.getId(), projectRoleVO);
+        return projectRoleVO;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return RoleService.EnableDynamicApiChecker.value();
+    }
+
+    @Override
+    public ProjectRole findProjectRole(Long roleId, Long projectId) {
+        if (projectId == null || projectId < 1L || projectDao.findById(projectId) == null) {
+            LOGGER.warn("Invalid project ID provided");
+            return null;
+        }
+
+        if (roleId != null && roleId < 1L) {
+            LOGGER.warn(String.format("Project Role ID is invalid [%s]", roleId));
+            return null;
+        }
+
+        ProjectRoleVO role = projRoleDao.findById(roleId);
+        if (role == null) {
+            LOGGER.warn(String.format("Project Role not found [id=%s]", roleId));
+            return null;
+        }
+        if (!(role.getProjectId().equals(projectId))) {
+            LOGGER.warn(String.format("Project role : %s doesn't belong to the project" + role.getName()));
+            return null;
+        }
+        return role;
+    }
+
+    @Override
+    public List<ProjectRole> findProjectRoles(Long projectId) {
+        if (projectId == null || projectId < 1L || projectDao.findById(projectId) == null) {
+            LOGGER.warn("Invalid project ID provided");
+            return null;
+        }
+        return ListUtils.toListOfInterface(projRoleDao.findAllRoles(projectId));
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_PERMISSION_CREATE, eventDescription = "Creating Project Role Permission")
+    public ProjectRolePermission createProjectRolePermission(CreateProjectRolePermissionCmd cmd) {
+        Long projectId = cmd.getProjectId();
+        Long projectRoleId = cmd.getProjectRoleId();
+        Rule rule = cmd.getRule();
+        Permission permission = cmd.getPermission();
+        String description = cmd.getDescription();
+        checkAccess(projectId);
+        return Transaction.execute(new TransactionCallback<ProjectRolePermissionVO>() {
+            @Override
+            public ProjectRolePermissionVO doInTransaction(TransactionStatus status) {
+                try {
+                    return projRolePermissionsDao.persist(new ProjectRolePermissionVO(projectId, projectRoleId, rule.toString(), permission, description));
+                } catch (Exception e) {
+                    throw new CloudRuntimeException("Project role permission for " + rule.toString()+ " seems to already exist.");
+                }
+            }
+        });
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_PERMISSION_UPDATE, eventDescription = "updating Project Role Permission order")
+    public boolean updateProjectRolePermission(Long projectId, ProjectRole projectRole, List<ProjectRolePermission> rolePermissionsOrder) {
+        checkAccess(projectId);
+        return projectRole != null && rolePermissionsOrder != null && projRolePermissionsDao.update(projectRole, projectId, rolePermissionsOrder);
+
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_PERMISSION_UPDATE, eventDescription = "updating Project Role Permission")
+    public boolean updateProjectRolePermission(Long projectId, ProjectRole projectRole, ProjectRolePermission projectRolePermission, Permission newPermission) {
+        checkAccess(projectId);
+        return projectRole != null && projRolePermissionsDao.update(projectRole, projectRolePermission, newPermission);
+    }
+
+    @Override
+    public ProjectRolePermission findProjectRolePermission(Long projRolePermissionId) {
+        if (projRolePermissionId == null) {
+            return null;
+        }
+        return projRolePermissionsDao.findById(projRolePermissionId);
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_PERMISSION_DELETE, eventDescription = "deleting Project Role Permission")
+    public boolean deleteProjectRolePermission(ProjectRolePermission projectRolePermission) {
+        checkAccess(projectRolePermission.getProjectId());
+        return projRolePermissionsDao.remove(projectRolePermission.getId());
+    }
+
+    @Override
+    public List<ProjectRolePermission> findAllProjectRolePermissions(Long projectId, Long projectRoleId) {
+        List<? extends ProjectRolePermission> permissions = projRolePermissionsDao.findAllByRoleIdSorted(projectRoleId, projectId);
+        if (permissions != null) {
+            return new ArrayList<>(permissions);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<ProjectRole> findProjectRolesByName(Long projectId, String roleName) {
+        List<? extends ProjectRole> roles = null;
+        if (StringUtils.isNotBlank(roleName)) {
+            roles = projRoleDao.findByName(roleName, projectId);
+        }
+        return ListUtils.toListOfInterface(roles);
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_PROJECT_ROLE_DELETE, eventDescription = "deleting Project Role")
+    public boolean deleteProjectRole(ProjectRole role, Long projectId) {
+        checkAccess(projectId);
+        if (role == null) {
+            return false;
+        }
+
+        Long roleProjectId = role.getProjectId();
+        if (role.getProjectId() != null && !roleProjectId.equals(projectId)) {
+            throw new PermissionDeniedException("Not authorized to delete the given project role");
+        }
+
+        List<? extends ProjectAccount> users = projAccDao.listUsersOrAccountsByRole(role.getId());
+        if (users != null && users.size() != 0) {
+            throw new PermissionDeniedException("Found users that have the project role in use, cannot delete the Project Role");
+        }
+        return Transaction.execute(new TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                List<? extends ProjectRolePermission> rolePermissions = projRolePermissionsDao.findAllByRoleIdSorted(role.getId(), projectId);
+                if (rolePermissions != null && !rolePermissions.isEmpty()) {
+                    for (ProjectRolePermission rolePermission : rolePermissions) {
+                        projRolePermissionsDao.remove(rolePermission.getId());
+                    }
+                }
+                if (projRoleDao.remove(role.getId())) {
+                    ProjectRoleVO projRoleVO = projRoleDao.findByIdIncludingRemoved(role.getId());
+                    projRoleVO.setName(null);
+                    return projRoleDao.update(role.getId(), projRoleVO);
+                }
+                return false;
+            }
+        });
+    }
+
+    protected Account getCurrentAccount() {
+        return CallContext.current().getCallingAccount();
+    }
+
+    private Long getProjectIdOfAccount() {
+        Project project = projectDao.findByProjectAccountId(getCurrentAccount().getAccountId());
+        if (project != null) {
+            return project.getId();
+        }
+        return null;
+    }
+
+    protected User getCurrentUser() {
+        return CallContext.current().getCallingUser();
+    }
+
+    @Override
+    public List<Class<?>> getCommands() {
+        List<Class<?>> cmdList = new ArrayList<Class<?>>();
+        cmdList.add(CreateProjectRoleCmd.class);
+        cmdList.add(ListProjectRolesCmd.class);
+        cmdList.add(UpdateProjectRoleCmd.class);
+        cmdList.add(DeleteProjectRoleCmd.class);
+        cmdList.add(CreateProjectRolePermissionCmd.class);
+        cmdList.add(ListProjectRolePermissionsCmd.class);
+        cmdList.add(UpdateProjectRolePermissionCmd.class);
+        cmdList.add(DeleteProjectRolePermissionCmd.class);
+        return cmdList;
+    }
+}
diff --git a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java
index 3283062..dce518c 100644
--- a/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/acl/RoleManagerImpl.java
@@ -20,21 +20,25 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import javax.inject.Inject;
 
 import org.apache.cloudstack.acl.dao.RoleDao;
 import org.apache.cloudstack.acl.dao.RolePermissionsDao;
+import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.command.admin.acl.CreateRoleCmd;
 import org.apache.cloudstack.api.command.admin.acl.CreateRolePermissionCmd;
 import org.apache.cloudstack.api.command.admin.acl.DeleteRoleCmd;
 import org.apache.cloudstack.api.command.admin.acl.DeleteRolePermissionCmd;
+import org.apache.cloudstack.api.command.admin.acl.ImportRoleCmd;
 import org.apache.cloudstack.api.command.admin.acl.ListRolePermissionsCmd;
 import org.apache.cloudstack.api.command.admin.acl.ListRolesCmd;
 import org.apache.cloudstack.api.command.admin.acl.UpdateRoleCmd;
 import org.apache.cloudstack.api.command.admin.acl.UpdateRolePermissionCmd;
+import org.apache.cloudstack.acl.RolePermissionEntity.Permission;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
@@ -56,6 +60,7 @@
 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.google.common.base.Strings;
 
 public class RoleManagerImpl extends ManagerBase implements RoleService, Configurable, PluggableService {
@@ -71,7 +76,7 @@
     @Inject
     private AccountManager accountManager;
 
-    private void checkCallerAccess() {
+    public void checkCallerAccess() {
         if (!isEnabled()) {
             throw new PermissionDeniedException("Dynamic api checker is not enabled, aborting role operation");
         }
@@ -81,7 +86,7 @@
         }
         Role callerRole = findRole(caller.getRoleId());
         if (callerRole == null || callerRole.getRoleType() != RoleType.Admin) {
-            throw new PermissionDeniedException("Restricted API called by an user account of non-Admin role type");
+            throw new PermissionDeniedException("Restricted API called by a user account of non-Admin role type");
         }
     }
 
@@ -126,11 +131,12 @@
     }
 
     @Override
-    public RolePermission findRolePermissionByUuid(final String uuid) {
-        if (Strings.isNullOrEmpty(uuid)) {
+    public RolePermission findRolePermissionByRoleIdAndRule(final Long roleId, final String rule) {
+        if (roleId == null || Strings.isNullOrEmpty(rule)) {
             return null;
         }
-        return rolePermissionsDao.findByUuid(uuid);
+
+        return rolePermissionsDao.findByRoleIdAndRule(roleId, rule);
     }
 
     @Override
@@ -149,9 +155,98 @@
     }
 
     @Override
+    @ActionEvent(eventType = EventTypes.EVENT_ROLE_CREATE, eventDescription = "creating role by cloning another role")
+    public Role createRole(String name, Role role, String description) {
+        checkCallerAccess();
+        return Transaction.execute(new TransactionCallback<RoleVO>() {
+            @Override
+            public RoleVO doInTransaction(TransactionStatus status) {
+                RoleVO newRoleVO = roleDao.persist(new RoleVO(name, role.getRoleType(), description));
+                if (newRoleVO == null) {
+                    throw new CloudRuntimeException("Unable to create the role: " + name + ", failed to persist in DB");
+                }
+
+                List<RolePermissionVO> rolePermissions = rolePermissionsDao.findAllByRoleIdSorted(role.getId());
+                if (rolePermissions != null && !rolePermissions.isEmpty()) {
+                    for (RolePermissionVO permission : rolePermissions) {
+                        rolePermissionsDao.persist(new RolePermissionVO(newRoleVO.getId(), permission.getRule().toString(), permission.getPermission(), permission.getDescription()));
+                    }
+                }
+
+                return newRoleVO;
+            }
+        });
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_ROLE_IMPORT, eventDescription = "importing Role")
+    public Role importRole(String name, RoleType type, String description, List<Map<String, Object>> rules, boolean forced) {
+        checkCallerAccess();
+        if (Strings.isNullOrEmpty(name)) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role name provided");
+        }
+        if (type == null || type == RoleType.Unknown) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role type provided");
+        }
+
+        List<RoleVO> existingRoles = roleDao.findByName(name);
+        if (CollectionUtils.isNotEmpty(existingRoles) && !forced) {
+            throw new CloudRuntimeException("Role already exists");
+        }
+
+        return Transaction.execute(new TransactionCallback<RoleVO>() {
+            @Override
+            public RoleVO doInTransaction(TransactionStatus status) {
+                RoleVO newRole = null;
+                RoleVO existingRole = roleDao.findByNameAndType(name, type);
+                if (existingRole != null) {
+                    if (existingRole.isDefault()) {
+                        throw new CloudRuntimeException("Failed to import the role: " + name + ", default role cannot be overriden");
+                    }
+
+                    //Cleanup old role permissions
+                    List<? extends RolePermission> rolePermissions = rolePermissionsDao.findAllByRoleIdSorted(existingRole.getId());
+                    if (rolePermissions != null && !rolePermissions.isEmpty()) {
+                        for (RolePermission rolePermission : rolePermissions) {
+                            rolePermissionsDao.remove(rolePermission.getId());
+                        }
+                    }
+
+                    existingRole.setName(name);
+                    existingRole.setRoleType(type);
+                    existingRole.setDescription(description);
+                    roleDao.update(existingRole.getId(), existingRole);
+
+                    newRole = existingRole;
+                } else {
+                    newRole = roleDao.persist(new RoleVO(name, type, description));
+                }
+
+                if (newRole == null) {
+                    throw new CloudRuntimeException("Unable to import the role: " + name + ", failed to persist in DB");
+                }
+
+                if (rules != null && !rules.isEmpty()) {
+                    for (Map<String, Object> ruleDetail : rules) {
+                        Rule rule = (Rule)ruleDetail.get(ApiConstants.RULE);
+                        RolePermission.Permission rulePermission = (RolePermission.Permission) ruleDetail.get(ApiConstants.PERMISSION);
+                        String ruleDescription = (String) ruleDetail.get(ApiConstants.DESCRIPTION);
+
+                        rolePermissionsDao.persist(new RolePermissionVO(newRole.getId(), rule.toString(), rulePermission, ruleDescription));
+                    }
+                }
+                return newRole;
+            }
+        });
+    }
+
+    @Override
     @ActionEvent(eventType = EventTypes.EVENT_ROLE_UPDATE, eventDescription = "updating Role")
     public Role updateRole(final Role role, final String name, final RoleType roleType, final String description) {
         checkCallerAccess();
+        if (role.isDefault()) {
+            throw new PermissionDeniedException("Default roles cannot be updated");
+        }
 
         if (roleType != null && roleType == RoleType.Unknown) {
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unknown is not a valid role type");
@@ -161,9 +256,6 @@
             roleVO.setName(name);
         }
         if (roleType != null) {
-            if (role.getId() <= RoleType.User.getId()) {
-                throw new PermissionDeniedException("The role type of default roles cannot be changed");
-            }
             List<? extends Account> accounts = accountDao.findAccountsByRole(role.getId());
             if (accounts == null || accounts.isEmpty()) {
                 roleVO.setRoleType(roleType);
@@ -186,7 +278,7 @@
         if (role == null) {
             return false;
         }
-        if (role.getId() <= RoleType.User.getId()) {
+        if (role.isDefault()) {
             throw new PermissionDeniedException("Default roles cannot be deleted");
         }
         List<? extends Account> accounts = accountDao.findAccountsByRole(role.getId());
@@ -214,8 +306,16 @@
 
     @Override
     @ActionEvent(eventType = EventTypes.EVENT_ROLE_PERMISSION_CREATE, eventDescription = "creating Role Permission")
-    public RolePermission createRolePermission(final Role role, final Rule rule, final RolePermission.Permission permission, final String description) {
+    public RolePermission createRolePermission(final Role role, final Rule rule, final Permission permission, final String description) {
         checkCallerAccess();
+        if (role.isDefault()) {
+            throw new PermissionDeniedException("Role permission cannot be added for Default roles");
+        }
+
+        if (findRolePermissionByRoleIdAndRule(role.getId(), rule.toString()) != null) {
+            throw new PermissionDeniedException("Rule already exists for the role: " + role.getName());
+        }
+
         return Transaction.execute(new TransactionCallback<RolePermissionVO>() {
             @Override
             public RolePermissionVO doInTransaction(TransactionStatus status) {
@@ -228,12 +328,18 @@
     @ActionEvent(eventType = EventTypes.EVENT_ROLE_PERMISSION_UPDATE, eventDescription = "updating Role Permission order")
     public boolean updateRolePermission(final Role role, final List<RolePermission> newOrder) {
         checkCallerAccess();
+        if (role.isDefault()) {
+            throw new PermissionDeniedException("Role permission cannot be updated for Default roles");
+        }
         return role != null && newOrder != null && rolePermissionsDao.update(role, newOrder);
     }
 
     @Override
-    public boolean updateRolePermission(Role role, RolePermission rolePermission, RolePermission.Permission permission) {
+    public boolean updateRolePermission(Role role, RolePermission rolePermission, Permission permission) {
         checkCallerAccess();
+        if (role.isDefault()) {
+            throw new PermissionDeniedException("Role permission cannot be updated for Default roles");
+        }
         return role != null && rolePermissionsDao.update(role, rolePermission, permission);
     }
 
@@ -241,6 +347,10 @@
     @ActionEvent(eventType = EventTypes.EVENT_ROLE_PERMISSION_DELETE, eventDescription = "deleting Role Permission")
     public boolean deleteRolePermission(final RolePermission rolePermission) {
         checkCallerAccess();
+        Role role = findRole(rolePermission.getRoleId());
+        if (role.isDefault()) {
+            throw new PermissionDeniedException("Role permission cannot be deleted for Default roles");
+        }
         return rolePermission != null && rolePermissionsDao.remove(rolePermission.getId());
     }
 
@@ -329,6 +439,18 @@
     }
 
     @Override
+    public Permission getRolePermission(String permission) {
+        if (Strings.isNullOrEmpty(permission)) {
+            return null;
+        }
+        if (!permission.equalsIgnoreCase(RolePermission.Permission.ALLOW.toString()) &&
+                !permission.equalsIgnoreCase(RolePermission.Permission.DENY.toString())) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Values for permission parameter should be: allow or deny");
+        }
+        return permission.equalsIgnoreCase(RolePermission.Permission.ALLOW.toString()) ? RolePermission.Permission.ALLOW : RolePermission.Permission.DENY;
+    }
+
+    @Override
     public String getConfigComponentName() {
         return RoleService.class.getSimpleName();
     }
@@ -342,6 +464,7 @@
     public List<Class<?>> getCommands() {
         final List<Class<?>> cmdList = new ArrayList<>();
         cmdList.add(CreateRoleCmd.class);
+        cmdList.add(ImportRoleCmd.class);
         cmdList.add(ListRolesCmd.class);
         cmdList.add(UpdateRoleCmd.class);
         cmdList.add(DeleteRoleCmd.class);
diff --git a/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java b/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
index 49ad215..0184a44 100644
--- a/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/diagnostics/DiagnosticsServiceImpl.java
@@ -372,7 +372,7 @@
      * @return a valid secondary storage with less than DiskQuotaPercentageThreshold set by global config
      */
     private DataStore getImageStore(Long zoneId) {
-        List<DataStore> stores = storeMgr.getImageStoresByScope(new ZoneScope(zoneId));
+        List<DataStore> stores = storeMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(zoneId));
         if (CollectionUtils.isEmpty(stores)) {
             throw new CloudRuntimeException("No Secondary storage found in Zone with Id: " + zoneId);
         }
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 a05c4b9..dcbc965 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
@@ -263,13 +263,13 @@
 
         Answer answer = sendDirectDownloadCommand(cmd, template, poolId, host);
 
-        VMTemplateStoragePoolVO sPoolRef = vmTemplatePoolDao.findByPoolTemplate(poolId, templateId);
+        VMTemplateStoragePoolVO sPoolRef = vmTemplatePoolDao.findByPoolTemplate(poolId, templateId, null);
         if (sPoolRef == null) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("Not found (templateId:" + templateId + " poolId: " + poolId + ") in template_spool_ref, persisting it");
             }
             DirectDownloadAnswer ans = (DirectDownloadAnswer) answer;
-            sPoolRef = new VMTemplateStoragePoolVO(poolId, templateId);
+            sPoolRef = new VMTemplateStoragePoolVO(poolId, templateId, null);
             sPoolRef.setDownloadPercent(100);
             sPoolRef.setDownloadState(VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
             sPoolRef.setState(ObjectInDataStoreStateMachine.State.Ready);
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 c602475..ae34748 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
@@ -125,7 +125,7 @@
         final String chain = certCmd.getChain();
         final String name = certCmd.getName();
 
-        validate(cert, key, password, chain);
+        validate(cert, key, password, chain, certCmd.getEnabledRevocationCheck());
         s_logger.debug("Certificate Validation succeeded");
 
         final String fingerPrint = CertificateHelper.generateFingerPrint(parseCertificate(cert));
@@ -278,7 +278,7 @@
         return certResponseList;
     }
 
-    private void validate(final String certInput, final String keyInput, final String password, final String chainInput) {
+    private void validate(final String certInput, final String keyInput, final String password, final String chainInput, boolean revocationEnabled) {
         try {
             List<Certificate> chain = null;
             final Certificate cert = parseCertificate(certInput);
@@ -292,7 +292,7 @@
             validateKeys(cert.getPublicKey(), key);
 
             if (chainInput != null) {
-                validateChain(chain, cert);
+                validateChain(chain, cert, revocationEnabled);
             }
         } catch (final IOException | CertificateException e) {
             throw new IllegalStateException("Parsing certificate/key failed: " + e.getMessage(), e);
@@ -388,7 +388,7 @@
         }
     }
 
-    private void validateChain(final List<Certificate> chain, final Certificate cert) {
+    private void validateChain(final List<Certificate> chain, final Certificate cert, boolean revocationEnabled) {
 
         final List<Certificate> certs = new ArrayList<Certificate>();
         final Set<TrustAnchor> anchors = new HashSet<TrustAnchor>();
@@ -410,7 +410,7 @@
         PKIXBuilderParameters params = null;
         try {
             params = new PKIXBuilderParameters(anchors, target);
-            params.setRevocationEnabled(false);
+            params.setRevocationEnabled(revocationEnabled);
             params.addCertStore(CertStore.getInstance("Collection", new CollectionCertStoreParameters(certs)));
             final CertPathBuilder builder = CertPathBuilder.getInstance("PKIX", "BC");
             builder.build(params);
@@ -458,4 +458,4 @@
 
         return certificateFactory.generateCertificate(bais);
     }
-}
\ No newline at end of file
+}
diff --git a/server/src/main/java/org/apache/cloudstack/network/topology/BasicNetworkTopology.java b/server/src/main/java/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
index a7fbe31..20b4535 100644
--- a/server/src/main/java/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
+++ b/server/src/main/java/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
@@ -349,7 +349,6 @@
         final Long podId = null;
 
         final UserdataToRouterRules userdataToRouterRules = new UserdataToRouterRules(network, nic, profile);
-
         return applyRules(network, router, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(userdataToRouterRules));
     }
 
diff --git a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java
index 9c346d7..0bb1977 100644
--- a/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java
+++ b/server/src/main/java/org/apache/cloudstack/outofbandmanagement/PowerOperationTask.java
@@ -17,7 +17,11 @@
 
 package org.apache.cloudstack.outofbandmanagement;
 
+import com.cloud.event.ActionEventUtils;
+import com.cloud.event.EventTypes;
+import com.cloud.event.EventVO;
 import com.cloud.host.Host;
+import org.apache.cloudstack.context.CallContext;
 import org.apache.log4j.Logger;
 
 public class PowerOperationTask implements Runnable {
@@ -43,8 +47,14 @@
         try {
             service.executePowerOperation(host, powerOperation, null);
         } catch (Exception e) {
-            LOG.warn(String.format("Out-of-band management background task operation=%s for host id=%d failed with: %s",
-                    powerOperation.name(), host.getId(), e.getMessage()));
+            LOG.warn(String.format("Out-of-band management background task operation=%s for host %s failed with: %s",
+                    powerOperation.name(), host.getName(), e.getMessage()));
+
+            String eventMessage = String
+                    .format("Error while issuing out-of-band management action %s for host: %s", powerOperation.name(), host.getName());
+
+            ActionEventUtils.onCreatedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_WARN,
+                    EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, true, eventMessage);
         }
     }
 }
diff --git a/server/src/main/java/org/apache/cloudstack/storage/NfsMountManager.java b/server/src/main/java/org/apache/cloudstack/storage/NfsMountManager.java
index a4e413c..a4612e2 100644
--- a/server/src/main/java/org/apache/cloudstack/storage/NfsMountManager.java
+++ b/server/src/main/java/org/apache/cloudstack/storage/NfsMountManager.java
@@ -19,5 +19,5 @@
 
 public interface NfsMountManager {
 
-    String getMountPoint(String storageUrl, Integer nfsVersion);
+    String getMountPoint(String storageUrl, String nfsVersion);
 }
diff --git a/server/src/main/java/org/apache/cloudstack/storage/NfsMountManagerImpl.java b/server/src/main/java/org/apache/cloudstack/storage/NfsMountManagerImpl.java
index 479ee12..b6105d5 100644
--- a/server/src/main/java/org/apache/cloudstack/storage/NfsMountManagerImpl.java
+++ b/server/src/main/java/org/apache/cloudstack/storage/NfsMountManagerImpl.java
@@ -60,7 +60,7 @@
         this.timeout = timeout;
     }
 
-    public String getMountPoint(String storageUrl, Integer nfsVersion) {
+    public String getMountPoint(String storageUrl, String nfsVersion) {
         String mountPoint = storageMounts.get(storageUrl);
         if (mountPoint != null) {
             return mountPoint;
@@ -84,7 +84,7 @@
         return mountPoint;
     }
 
-    private String mount(String path, String parent, Integer nfsVersion) {
+    private String mount(String path, String parent, String nfsVersion) {
         String mountPoint = setupMountPoint(parent);
         if (mountPoint == null) {
             s_logger.warn("Unable to create a mount point");
diff --git a/server/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelper.java b/server/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelper.java
new file mode 100644
index 0000000..a04b043
--- /dev/null
+++ b/server/src/main/java/org/apache/cloudstack/storage/image/deployasis/DeployAsIsHelper.java
@@ -0,0 +1,33 @@
+// 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.image.deployasis;
+
+import com.cloud.agent.api.storage.DownloadAnswer;
+import com.cloud.agent.api.to.NicTO;
+import com.cloud.vm.VirtualMachineProfile;
+import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
+
+import java.util.Map;
+
+public interface DeployAsIsHelper {
+
+    boolean persistTemplateDeployAsIsDetails(long templateId, DownloadAnswer answer, TemplateDataStoreVO tmpltStoreVO);
+    Map<String, String> getVirtualMachineDeployAsIsProperties(VirtualMachineProfile vmId);
+    Map<Integer, String> getAllocatedVirtualMachineNicsAdapterMapping(VirtualMachineProfile vm, NicTO[] nics);
+    Long retrieveTemplateGuestOsIdFromGuestOsInfo(long templateId, String guestOsType, String guestOsDescription,
+                                                  String minimumHardwareVersion);
+}
diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
new file mode 100644
index 0000000..501ca63
--- /dev/null
+++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java
@@ -0,0 +1,1395 @@
+// 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.vm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import com.cloud.agent.api.PrepareUnmanageVMInstanceAnswer;
+import com.cloud.agent.api.PrepareUnmanageVMInstanceCommand;
+import com.cloud.event.ActionEvent;
+import com.cloud.exception.UnsupportedServiceException;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ResponseGenerator;
+import org.apache.cloudstack.api.ResponseObject;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.vm.ImportUnmanagedInstanceCmd;
+import org.apache.cloudstack.api.command.admin.vm.ListUnmanagedInstancesCmd;
+import org.apache.cloudstack.api.command.admin.vm.UnmanageVMInstanceCmd;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.NicResponse;
+import org.apache.cloudstack.api.response.UnmanagedInstanceDiskResponse;
+import org.apache.cloudstack.api.response.UnmanagedInstanceResponse;
+import org.apache.cloudstack.api.response.UserVmResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
+import org.apache.cloudstack.framework.config.ConfigKey;
+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.apache.cloudstack.utils.volume.VirtualMachineDiskInfo;
+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.api.Answer;
+import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
+import com.cloud.agent.api.GetUnmanagedInstancesCommand;
+import com.cloud.capacity.CapacityManager;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.Resource;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.deploy.DataCenterDeployment;
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlanner;
+import com.cloud.deploy.DeploymentPlanningManager;
+import com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+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.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.offering.DiskOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.org.Cluster;
+import com.cloud.resource.ResourceManager;
+import com.cloud.serializer.GsonHelper;
+import com.cloud.server.ManagementService;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.GuestOS;
+import com.cloud.storage.GuestOSHypervisor;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeApiService;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.storage.dao.GuestOSHypervisorDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import com.cloud.user.ResourceLimitService;
+import com.cloud.user.UserVO;
+import com.cloud.user.dao.UserDao;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.UserVmManager;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachineManager;
+import com.cloud.vm.VirtualMachineProfile;
+import com.cloud.vm.VirtualMachineProfileImpl;
+import com.cloud.vm.VmDetailConstants;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.VMInstanceDao;
+import com.google.common.base.Strings;
+import com.google.gson.Gson;
+
+public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager {
+    public static final String VM_IMPORT_DEFAULT_TEMPLATE_NAME = "system-default-vm-import-dummy-template.iso";
+    private static final Logger LOGGER = Logger.getLogger(UnmanagedVMsManagerImpl.class);
+
+    @Inject
+    private AgentManager agentManager;
+    @Inject
+    private DataCenterDao dataCenterDao;
+    @Inject
+    private ClusterDao clusterDao;
+    @Inject
+    private HostDao hostDao;
+    @Inject
+    private AccountService accountService;
+    @Inject
+    private UserDao userDao;
+    @Inject
+    private VMTemplateDao templateDao;
+    @Inject
+    private VMTemplatePoolDao templatePoolDao;
+    @Inject
+    private ServiceOfferingDao serviceOfferingDao;
+    @Inject
+    private DiskOfferingDao diskOfferingDao;
+    @Inject
+    private ResourceManager resourceManager;
+    @Inject
+    private ResourceLimitService resourceLimitService;
+    @Inject
+    private UserVmManager userVmManager;
+    @Inject
+    private ResponseGenerator responseGenerator;
+    @Inject
+    private VolumeOrchestrationService volumeManager;
+    @Inject
+    private VolumeDao volumeDao;
+    @Inject
+    private PrimaryDataStoreDao primaryDataStoreDao;
+    @Inject
+    private NetworkDao networkDao;
+    @Inject
+    private NetworkOrchestrationService networkOrchestrationService;
+    @Inject
+    private VMInstanceDao vmDao;
+    @Inject
+    private CapacityManager capacityManager;
+    @Inject
+    private VolumeApiService volumeApiService;
+    @Inject
+    private DeploymentPlanningManager deploymentPlanningManager;
+    @Inject
+    private VirtualMachineManager virtualMachineManager;
+    @Inject
+    private ManagementService managementService;
+    @Inject
+    private NicDao nicDao;
+    @Inject
+    private NetworkModel networkModel;
+    @Inject
+    private ConfigurationDao configurationDao;
+    @Inject
+    private GuestOSDao guestOSDao;
+    @Inject
+    private GuestOSHypervisorDao guestOSHypervisorDao;
+    @Inject
+    private VMSnapshotDao vmSnapshotDao;
+    @Inject
+    private SnapshotDao snapshotDao;
+    @Inject
+    private UserVmDao userVmDao;
+
+    protected Gson gson;
+
+    public UnmanagedVMsManagerImpl() {
+        gson = GsonHelper.getGsonLogger();
+    }
+
+    private VMTemplateVO createDefaultDummyVmImportTemplate() {
+        VMTemplateVO template = null;
+        try {
+            template = VMTemplateVO.createSystemIso(templateDao.getNextInSequence(Long.class, "id"), VM_IMPORT_DEFAULT_TEMPLATE_NAME, VM_IMPORT_DEFAULT_TEMPLATE_NAME, true,
+                    "", true, 64, Account.ACCOUNT_ID_SYSTEM, "",
+                    "VM Import Default Template", false, 1);
+            template.setState(VirtualMachineTemplate.State.Inactive);
+            template = templateDao.persist(template);
+            if (template == null) {
+                return null;
+            }
+            templateDao.remove(template.getId());
+            template = templateDao.findByName(VM_IMPORT_DEFAULT_TEMPLATE_NAME);
+        } catch (Exception e) {
+            LOGGER.error("Unable to create default dummy template for VM import", e);
+        }
+        return template;
+    }
+
+    private UnmanagedInstanceResponse createUnmanagedInstanceResponse(UnmanagedInstanceTO instance, Cluster cluster, Host host) {
+        UnmanagedInstanceResponse response = new UnmanagedInstanceResponse();
+        response.setName(instance.getName());
+        if (cluster != null) {
+            response.setClusterId(cluster.getUuid());
+        }
+        if (host != null) {
+            response.setHostId(host.getUuid());
+        }
+        response.setPowerState(instance.getPowerState().toString());
+        response.setCpuCores(instance.getCpuCores());
+        response.setCpuSpeed(instance.getCpuSpeed());
+        response.setCpuCoresPerSocket(instance.getCpuCoresPerSocket());
+        response.setMemory(instance.getMemory());
+        response.setOperatingSystemId(instance.getOperatingSystemId());
+        response.setOperatingSystem(instance.getOperatingSystem());
+        response.setObjectName("unmanagedinstance");
+
+        if (instance.getDisks() != null) {
+            for (UnmanagedInstanceTO.Disk disk : instance.getDisks()) {
+                UnmanagedInstanceDiskResponse diskResponse = new UnmanagedInstanceDiskResponse();
+                diskResponse.setDiskId(disk.getDiskId());
+                if (!Strings.isNullOrEmpty(disk.getLabel())) {
+                    diskResponse.setLabel(disk.getLabel());
+                }
+                diskResponse.setCapacity(disk.getCapacity());
+                diskResponse.setController(disk.getController());
+                diskResponse.setControllerUnit(disk.getControllerUnit());
+                diskResponse.setPosition(disk.getPosition());
+                diskResponse.setImagePath(disk.getImagePath());
+                diskResponse.setDatastoreName(disk.getDatastoreName());
+                diskResponse.setDatastoreHost(disk.getDatastoreHost());
+                diskResponse.setDatastorePath(disk.getDatastorePath());
+                diskResponse.setDatastoreType(disk.getDatastoreType());
+                response.addDisk(diskResponse);
+            }
+        }
+
+        if (instance.getNics() != null) {
+            for (UnmanagedInstanceTO.Nic nic : instance.getNics()) {
+                NicResponse nicResponse = new NicResponse();
+                nicResponse.setId(nic.getNicId());
+                nicResponse.setNetworkName(nic.getNetwork());
+                nicResponse.setMacAddress(nic.getMacAddress());
+                if (!Strings.isNullOrEmpty(nic.getAdapterType())) {
+                    nicResponse.setAdapterType(nic.getAdapterType());
+                }
+                if (!CollectionUtils.isEmpty(nic.getIpAddress())) {
+                    nicResponse.setIpAddresses(nic.getIpAddress());
+                }
+                nicResponse.setVlanId(nic.getVlan());
+                nicResponse.setIsolatedPvlanId(nic.getPvlan());
+                nicResponse.setIsolatedPvlanType(nic.getPvlanType());
+                response.addNic(nicResponse);
+            }
+        }
+        return response;
+    }
+
+    private List<String> getAdditionalNameFilters(Cluster cluster) {
+        List<String> additionalNameFilter = new ArrayList<>();
+        if (cluster == null) {
+            return additionalNameFilter;
+        }
+        if (cluster.getHypervisorType() == Hypervisor.HypervisorType.VMware) {
+            // VMWare considers some templates as VM and they are not filtered by VirtualMachineMO.isTemplate()
+            List<VMTemplateStoragePoolVO> templates = templatePoolDao.listAll();
+            for (VMTemplateStoragePoolVO template : templates) {
+                additionalNameFilter.add(template.getInstallPath());
+            }
+
+            // VMWare considers some removed volumes as VM
+            List<VolumeVO> volumes = volumeDao.findIncludingRemovedByZone(cluster.getDataCenterId());
+            for (VolumeVO volumeVO : volumes) {
+                if (volumeVO.getRemoved() == null) {
+                    continue;
+                }
+                if (Strings.isNullOrEmpty(volumeVO.getChainInfo())) {
+                    continue;
+                }
+                List<String> volumeFileNames = new ArrayList<>();
+                try {
+                    VirtualMachineDiskInfo diskInfo = gson.fromJson(volumeVO.getChainInfo(), VirtualMachineDiskInfo.class);
+                    String[] files = diskInfo.getDiskChain();
+                    if (files.length == 1) {
+                        continue;
+                    }
+                    boolean firstFile = true;
+                    for (final String file : files) {
+                        if (firstFile) {
+                            firstFile = false;
+                            continue;
+                        }
+                        String path = file;
+                        String[] split = path.split(" ");
+                        path = split[split.length - 1];
+                        split = path.split("/");
+                        ;
+                        path = split[split.length - 1];
+                        split = path.split("\\.");
+                        path = split[0];
+                        if (!Strings.isNullOrEmpty(path)) {
+                            if (!additionalNameFilter.contains(path)) {
+                                volumeFileNames.add(path);
+                            }
+                            if (path.contains("-")) {
+                                split = path.split("-");
+                                path = split[0];
+                                if (!Strings.isNullOrEmpty(path) && !path.equals("ROOT") && !additionalNameFilter.contains(path)) {
+                                    volumeFileNames.add(path);
+                                }
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+                    LOGGER.warn(String.format("Unable to find volume file name for volume ID: %s while adding filters unmanaged VMs", volumeVO.getUuid()), e);
+                }
+                if (!volumeFileNames.isEmpty()) {
+                    additionalNameFilter.addAll(volumeFileNames);
+                }
+            }
+        }
+        return additionalNameFilter;
+    }
+
+    private List<String> getHostManagedVms(Host host) {
+        List<String> managedVms = new ArrayList<>();
+        List<VMInstanceVO> instances = vmDao.listByHostId(host.getId());
+        for (VMInstanceVO instance : instances) {
+            managedVms.add(instance.getInstanceName());
+        }
+        instances = vmDao.listByLastHostIdAndStates(host.getId(),
+                VirtualMachine.State.Stopped, VirtualMachine.State.Destroyed,
+                VirtualMachine.State.Expunging, VirtualMachine.State.Error,
+                VirtualMachine.State.Unknown, VirtualMachine.State.Shutdown);
+        for (VMInstanceVO instance : instances) {
+            managedVms.add(instance.getInstanceName());
+        }
+        return managedVms;
+    }
+
+    private boolean hostSupportsServiceOffering(HostVO host, ServiceOffering serviceOffering) {
+        if (host == null) {
+            return false;
+        }
+        if (serviceOffering == null) {
+            return false;
+        }
+        if (Strings.isNullOrEmpty(serviceOffering.getHostTag())) {
+            return true;
+        }
+        hostDao.loadHostTags(host);
+        return host.getHostTags() != null && host.getHostTags().contains(serviceOffering.getHostTag());
+    }
+
+    private boolean storagePoolSupportsDiskOffering(StoragePool pool, DiskOffering diskOffering) {
+        if (pool == null) {
+            return false;
+        }
+        if (diskOffering == null) {
+            return false;
+        }
+        return volumeApiService.doesTargetStorageSupportDiskOffering(pool, diskOffering.getTags());
+    }
+
+    private boolean storagePoolSupportsServiceOffering(StoragePool pool, ServiceOffering serviceOffering) {
+        if (pool == null) {
+            return false;
+        }
+        if (serviceOffering == null) {
+            return false;
+        }
+        return volumeApiService.doesTargetStorageSupportDiskOffering(pool, serviceOffering.getTags());
+    }
+
+    private ServiceOfferingVO getUnmanagedInstanceServiceOffering(final UnmanagedInstanceTO instance, ServiceOfferingVO serviceOffering, final Account owner, final DataCenter zone, final Map<String, String> details)
+            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
+        if (instance == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM is not valid"));
+        }
+        if (serviceOffering == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering is not valid"));
+        }
+        accountService.checkAccess(owner, serviceOffering, zone);
+        final Integer cpu = instance.getCpuCores();
+        final Integer memory = instance.getMemory();
+        Integer cpuSpeed = instance.getCpuSpeed() == null ? 0 : instance.getCpuSpeed();
+        if (cpu == null || cpu == 0) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("CPU cores for VM (%s) not valid", instance.getName()));
+        }
+        if (memory == null || memory == 0) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Memory for VM (%s) not valid", instance.getName()));
+        }
+        if (serviceOffering.isDynamic()) {
+            if (details.containsKey(VmDetailConstants.CPU_SPEED)) {
+                try {
+                    cpuSpeed = Integer.parseInt(details.get(VmDetailConstants.CPU_SPEED));
+                } catch (Exception e) {
+                }
+            }
+            Map<String, String> parameters = new HashMap<>();
+            parameters.put(VmDetailConstants.CPU_NUMBER, String.valueOf(cpu));
+            parameters.put(VmDetailConstants.MEMORY, String.valueOf(memory));
+            if (serviceOffering.getSpeed() == null && cpuSpeed > 0) {
+                parameters.put(VmDetailConstants.CPU_SPEED, String.valueOf(cpuSpeed));
+            }
+            serviceOffering.setDynamicFlag(true);
+            userVmManager.validateCustomParameters(serviceOffering, parameters);
+            serviceOffering = serviceOfferingDao.getComputeOffering(serviceOffering, parameters);
+        } else {
+            if (!cpu.equals(serviceOffering.getCpu()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %d CPU cores do not match VM CPU cores %d and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getCpu(), cpu, instance.getPowerState()));
+            }
+            if (!memory.equals(serviceOffering.getRamSize()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %dMB memory does not match VM memory %dMB and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getRamSize(), memory, instance.getPowerState()));
+            }
+            if (cpuSpeed != null && cpuSpeed > 0 && !cpuSpeed.equals(serviceOffering.getSpeed()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %dMHz CPU speed does not match VM CPU speed %dMHz and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getSpeed(), cpuSpeed, instance.getPowerState()));
+            }
+        }
+        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.cpu, new Long(serviceOffering.getCpu()));
+        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.memory, new Long(serviceOffering.getRamSize()));
+        return serviceOffering;
+    }
+
+    private Map<String, Network.IpAddresses> getNicIpAddresses(final List<UnmanagedInstanceTO.Nic> nics, final Map<String, Network.IpAddresses> callerNicIpAddressMap) {
+        Map<String, Network.IpAddresses> nicIpAddresses = new HashMap<>();
+        for (UnmanagedInstanceTO.Nic nic : nics) {
+            Network.IpAddresses ipAddresses = null;
+            if (MapUtils.isNotEmpty(callerNicIpAddressMap) && callerNicIpAddressMap.containsKey(nic.getNicId())) {
+                ipAddresses = callerNicIpAddressMap.get(nic.getNicId());
+            }
+            // If IP is set to auto-assign, check NIC doesn't have more that one IP from SDK
+            if (ipAddresses != null && ipAddresses.getIp4Address() != null && ipAddresses.getIp4Address().equals("auto") && !CollectionUtils.isEmpty(nic.getIpAddress())) {
+                if (nic.getIpAddress().size() > 1) {
+                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple IP addresses (%s, %s) present for nic ID: %s. IP address cannot be assigned automatically, only single IP address auto-assigning supported", nic.getIpAddress().get(0), nic.getIpAddress().get(1), nic.getNicId()));
+                }
+                String address = nic.getIpAddress().get(0);
+                if (NetUtils.isValidIp4(address)) {
+                    ipAddresses.setIp4Address(address);
+                }
+            }
+            if (ipAddresses != null) {
+                nicIpAddresses.put(nic.getNicId(), ipAddresses);
+            }
+        }
+        return nicIpAddresses;
+    }
+
+    private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final DataCenter zone, final Cluster cluster) {
+        StoragePool storagePool = null;
+        final String dsHost = disk.getDatastoreHost();
+        final String dsPath = disk.getDatastorePath();
+        final String dsType = disk.getDatastoreType();
+        final String dsName = disk.getDatastoreName();
+        if (dsType != null) {
+            List<StoragePoolVO> pools = primaryDataStoreDao.listPoolByHostPath(dsHost, dsPath);
+            for (StoragePool pool : pools) {
+                if (pool.getDataCenterId() == zone.getId() &&
+                        (pool.getClusterId() == null || pool.getClusterId().equals(cluster.getId()))) {
+                    storagePool = pool;
+                    break;
+                }
+            }
+        }
+
+        if (storagePool == null) {
+            List<StoragePoolVO> pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId());
+            pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId()));
+            for (StoragePool pool : pools) {
+                if (pool.getPath().endsWith(dsName)) {
+                    storagePool = pool;
+                    break;
+                }
+            }
+        }
+        if (storagePool == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Storage pool for disk %s(%s) with datastore: %s not found in zone ID: %s", disk.getLabel(), disk.getDiskId(), disk.getDatastoreName(), zone.getUuid()));
+        }
+        return storagePool;
+    }
+
+    private Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> getRootAndDataDisks(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> dataDiskOfferingMap) {
+        UnmanagedInstanceTO.Disk rootDisk = null;
+        List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
+        if (disks.size() == 1) {
+            rootDisk = disks.get(0);
+            return new Pair<>(rootDisk, dataDisks);
+        }
+        Set<String> callerDiskIds = dataDiskOfferingMap.keySet();
+        if (callerDiskIds.size() != disks.size() - 1) {
+            String msg = String.format("VM has total %d disks for which %d disk offering mappings provided. %d disks need a disk offering for import", disks.size(), callerDiskIds.size(), disks.size()-1);
+            LOGGER.error(String.format("%s. %s parameter can be used to provide disk offerings for the disks", msg, ApiConstants.DATADISK_OFFERING_LIST));
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, msg);
+        }
+        List<String> diskIdsWithoutOffering = new ArrayList<>();
+        for (UnmanagedInstanceTO.Disk disk : disks) {
+            String diskId = disk.getDiskId();
+            if (!callerDiskIds.contains(diskId)) {
+                diskIdsWithoutOffering.add(diskId);
+                rootDisk = disk;
+            } else {
+                dataDisks.add(disk);
+            }
+        }
+        if (diskIdsWithoutOffering.size() > 1) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM has total %d disks, disk offering mapping not provided for %d disks. Disk IDs that may need a disk offering - %s", disks.size(), diskIdsWithoutOffering.size()-1, String.join(", ", diskIdsWithoutOffering)));
+        }
+        return new Pair<>(rootDisk, dataDisks);
+    }
+
+    private void checkUnmanagedDiskAndOfferingForImport(UnmanagedInstanceTO.Disk disk, DiskOffering diskOffering, ServiceOffering serviceOffering, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
+            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
+        if (serviceOffering == null && diskOffering == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Disk offering for disk ID: %s not found during VM import", disk.getDiskId()));
+        }
+        if (diskOffering != null) {
+            accountService.checkAccess(owner, diskOffering, zone);
+        }
+        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.volume);
+        if (disk.getCapacity() == null || disk.getCapacity() == 0) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of disk(ID: %s) is found invalid during VM import", disk.getDiskId()));
+        }
+        if (diskOffering != null && !diskOffering.isCustomized() && diskOffering.getDiskSize() == 0) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of fixed disk offering(ID: %s) is found invalid during VM import", diskOffering.getUuid()));
+        }
+        if (diskOffering != null && !diskOffering.isCustomized() && diskOffering.getDiskSize() < disk.getCapacity()) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of disk offering(ID: %s) %dGB is found less than the size of disk(ID: %s) %dGB during VM import", diskOffering.getUuid(), (diskOffering.getDiskSize() / Resource.ResourceType.bytesToGiB), disk.getDiskId(), (disk.getCapacity() / (Resource.ResourceType.bytesToGiB))));
+        }
+        StoragePool storagePool = getStoragePool(disk, zone, cluster);
+        if (diskOffering != null && !migrateAllowed && !storagePoolSupportsDiskOffering(storagePool, diskOffering)) {
+            throw new InvalidParameterValueException(String.format("Disk offering: %s is not compatible with storage pool: %s of unmanaged disk: %s", diskOffering.getUuid(), storagePool.getUuid(), disk.getDiskId()));
+        }
+        if (serviceOffering != null && !migrateAllowed && !storagePoolSupportsServiceOffering(storagePool, serviceOffering)) {
+            throw new InvalidParameterValueException(String.format("Service offering: %s is not compatible with storage pool: %s of unmanaged disk: %s", serviceOffering.getUuid(), storagePool.getUuid(), disk.getDiskId()));
+        }
+    }
+
+    private void checkUnmanagedDiskAndOfferingForImport(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> diskOfferingMap, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
+            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
+        String diskController = null;
+        for (UnmanagedInstanceTO.Disk disk : disks) {
+            if (disk == null) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve disk details for VM"));
+            }
+            if (!diskOfferingMap.containsKey(disk.getDiskId())) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Disk offering for disk ID: %s not found during VM import", disk.getDiskId()));
+            }
+            if (Strings.isNullOrEmpty(diskController)) {
+                diskController = disk.getController();
+            } else {
+                if (!diskController.equals(disk.getController())) {
+                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple data disk controllers of different type (%s, %s) are not supported for import. Please make sure that all data disk controllers are of the same type", diskController, disk.getController()));
+                }
+            }
+            checkUnmanagedDiskAndOfferingForImport(disk, diskOfferingDao.findById(diskOfferingMap.get(disk.getDiskId())), null, owner, zone, cluster, migrateAllowed);
+        }
+    }
+
+    private void checkUnmanagedNicAndNetworkForImport(UnmanagedInstanceTO.Nic nic, Network network, final DataCenter zone, final Account owner, final boolean autoAssign) throws ServerApiException {
+        if (nic == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
+        }
+        if (network == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
+        }
+        if (network.getDataCenterId() != zone.getId()) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network(ID: %s) for nic(ID: %s) belongs to a different zone than VM to be imported", network.getUuid(), nic.getNicId()));
+        }
+        networkModel.checkNetworkPermissions(owner, network);
+        if (!autoAssign && network.getGuestType().equals(Network.GuestType.Isolated)) {
+            return;
+        }
+
+        String networkBroadcastUri = network.getBroadcastUri() == null ? null : network.getBroadcastUri().toString();
+        if (nic.getVlan() != null && nic.getVlan() != 0 && nic.getPvlan() == null &&
+                (Strings.isNullOrEmpty(networkBroadcastUri) ||
+                        !networkBroadcastUri.equals(String.format("vlan://%d", nic.getVlan())))) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VLAN of network(ID: %s) %s is found different from the VLAN of nic(ID: %s) vlan://%d during VM import", network.getUuid(), networkBroadcastUri, nic.getNicId(), nic.getVlan()));
+        }
+        if (nic.getVlan() != null && nic.getVlan() != 0 && nic.getPvlan() != null && nic.getPvlan() != 0 &&
+                (Strings.isNullOrEmpty(network.getBroadcastUri().toString()) ||
+                        !networkBroadcastUri.equals(String.format("pvlan://%d-i%d", nic.getVlan(), nic.getPvlan())))) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("PVLAN of network(ID: %s) %s is found different from the VLAN of nic(ID: %s) pvlan://%d-i%d during VM import", network.getUuid(), networkBroadcastUri, nic.getNicId(), nic.getVlan(), nic.getPvlan()));
+        }
+    }
+
+    private void checkUnmanagedNicAndNetworkHostnameForImport(UnmanagedInstanceTO.Nic nic, Network network, final String hostName) throws ServerApiException {
+        if (nic == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
+        }
+        if (network == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
+        }
+        // Check for duplicate hostname in network, get all vms hostNames in the network
+        List<String> hostNames = vmDao.listDistinctHostNames(network.getId());
+        if (CollectionUtils.isNotEmpty(hostNames) && hostNames.contains(hostName)) {
+            throw new InvalidParameterValueException("The vm with hostName " + hostName + " already exists in the network domain: " + network.getNetworkDomain() + "; network="
+                    + network);
+        }
+    }
+
+    private void checkUnmanagedNicIpAndNetworkForImport(UnmanagedInstanceTO.Nic nic, Network network, final Network.IpAddresses ipAddresses) throws ServerApiException {
+        if (nic == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
+        }
+        if (network == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
+        }
+        // Check IP is assigned for non L2 networks
+        if (!network.getGuestType().equals(Network.GuestType.L2) && (ipAddresses == null || Strings.isNullOrEmpty(ipAddresses.getIp4Address()))) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("NIC(ID: %s) needs a valid IP address for it to be associated with network(ID: %s). %s parameter of API can be used for this", nic.getNicId(), network.getUuid(), ApiConstants.NIC_IP_ADDRESS_LIST));
+        }
+        // If network is non L2, IP v4 is assigned and not set to auto-assign, check it is available for network
+        if (!network.getGuestType().equals(Network.GuestType.L2) && ipAddresses != null && !Strings.isNullOrEmpty(ipAddresses.getIp4Address()) && !ipAddresses.getIp4Address().equals("auto")) {
+            Set<Long> ips = networkModel.getAvailableIps(network, ipAddresses.getIp4Address());
+            if (CollectionUtils.isEmpty(ips) || !ips.contains(NetUtils.ip2Long(ipAddresses.getIp4Address()))) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("IP address %s for NIC(ID: %s) is not available in network(ID: %s)", ipAddresses.getIp4Address(), nic.getNicId(), network.getUuid()));
+            }
+        }
+    }
+
+    private Map<String, Long> getUnmanagedNicNetworkMap(List<UnmanagedInstanceTO.Nic> nics, final Map<String, Long> callerNicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap, final DataCenter zone, final String hostName, final Account owner) throws ServerApiException {
+        Map<String, Long> nicNetworkMap = new HashMap<>();
+        String nicAdapter = null;
+        for (UnmanagedInstanceTO.Nic nic : nics) {
+            if (Strings.isNullOrEmpty(nicAdapter)) {
+                nicAdapter = nic.getAdapterType();
+            } else {
+                if (!nicAdapter.equals(nic.getAdapterType())) {
+                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple network adapter of different type (%s, %s) are not supported for import. Please make sure that all network adapters are of the same type", nicAdapter, nic.getAdapterType()));
+                }
+            }
+            Network network = null;
+            Network.IpAddresses ipAddresses = null;
+            if (MapUtils.isNotEmpty(callerNicIpAddressMap) && callerNicIpAddressMap.containsKey(nic.getNicId())) {
+                ipAddresses = callerNicIpAddressMap.get(nic.getNicId());
+            }
+            if (!callerNicNetworkMap.containsKey(nic.getNicId())) {
+                if (nic.getVlan() != null && nic.getVlan() != 0) {
+                    // Find a suitable network
+                    List<NetworkVO> networks = networkDao.listByZone(zone.getId());
+                    for (NetworkVO networkVO : networks) {
+                        if (networkVO.getTrafficType() == Networks.TrafficType.None || Networks.TrafficType.isSystemNetwork(networkVO.getTrafficType())) {
+                            continue;
+                        }
+                        try {
+                            checkUnmanagedNicAndNetworkForImport(nic, networkVO, zone, owner, true);
+                            network = networkVO;
+                        } catch (Exception e) {
+                        }
+                        if (network != null) {
+                            checkUnmanagedNicAndNetworkHostnameForImport(nic, network, hostName);
+                            checkUnmanagedNicIpAndNetworkForImport(nic, network, ipAddresses);
+                            break;
+                        }
+                    }
+                }
+            } else {
+                network = networkDao.findById(callerNicNetworkMap.get(nic.getNicId()));
+                checkUnmanagedNicAndNetworkForImport(nic, network, zone, owner, false);
+                checkUnmanagedNicAndNetworkHostnameForImport(nic, network, hostName);
+                checkUnmanagedNicIpAndNetworkForImport(nic, network, ipAddresses);
+            }
+            if (network == null) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Suitable network for nic(ID: %s) not found during VM import", nic.getNicId()));
+            }
+            nicNetworkMap.put(nic.getNicId(), network.getId());
+        }
+        return nicNetworkMap;
+    }
+
+    private Pair<DiskProfile, StoragePool> importDisk(UnmanagedInstanceTO.Disk disk, VirtualMachine vm, Cluster cluster, DiskOffering diskOffering,
+                                                      Volume.Type type, String name, Long diskSize, Long minIops, Long maxIops, VirtualMachineTemplate template,
+                                                      Account owner, Long deviceId) {
+        final DataCenter zone = dataCenterDao.findById(vm.getDataCenterId());
+        final String path = Strings.isNullOrEmpty(disk.getFileBaseName()) ? disk.getImagePath() : disk.getFileBaseName();
+        String chainInfo = disk.getChainInfo();
+        if (Strings.isNullOrEmpty(chainInfo)) {
+            VirtualMachineDiskInfo diskInfo = new VirtualMachineDiskInfo();
+            diskInfo.setDiskDeviceBusName(String.format("%s%d:%d", disk.getController(), disk.getControllerUnit(), disk.getPosition()));
+            diskInfo.setDiskChain(new String[]{disk.getImagePath()});
+            chainInfo = gson.toJson(diskInfo);
+        }
+        StoragePool storagePool = getStoragePool(disk, zone, cluster);
+        DiskProfile profile = volumeManager.importVolume(type, name, diskOffering, diskSize,
+                minIops, maxIops, vm, template, owner, deviceId, storagePool.getId(), path, chainInfo);
+
+        return new Pair<DiskProfile, StoragePool>(profile, storagePool);
+    }
+
+    private NicProfile importNic(UnmanagedInstanceTO.Nic nic, VirtualMachine vm, Network network, Network.IpAddresses ipAddresses, boolean isDefaultNic, boolean forced) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
+        Pair<NicProfile, Integer> result = networkOrchestrationService.importNic(nic.getMacAddress(), 0, network, isDefaultNic, vm, ipAddresses, forced);
+        if (result == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("NIC ID: %s import failed", nic.getNicId()));
+        }
+        return result.first();
+    }
+
+    private void cleanupFailedImportVM(final UserVm userVm) {
+        if (userVm == null) {
+            return;
+        }
+        VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm);
+        // Remove all volumes
+        volumeDao.deleteVolumesByInstance(userVm.getId());
+        // Remove all nics
+        try {
+            networkOrchestrationService.release(profile, true);
+        } catch (Exception e) {
+            LOGGER.error(String.format("Unable to release NICs for unsuccessful import unmanaged VM: %s", userVm.getInstanceName()), e);
+            nicDao.removeNicsForInstance(userVm.getId());
+        }
+        // Remove vm
+        vmDao.remove(userVm.getId());
+    }
+
+    private UserVm migrateImportedVM(HostVO sourceHost, VirtualMachineTemplate template, ServiceOfferingVO serviceOffering, UserVm userVm, final Account owner, List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList) {
+        UserVm vm = userVm;
+        if (vm == null) {
+            LOGGER.error(String.format("Failed to check migrations need during VM import"));
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to check migrations need during VM import"));
+        }
+        if (sourceHost == null || serviceOffering == null || diskProfileStoragePoolList == null) {
+            LOGGER.error(String.format("Failed to check migrations need during import, VM: %s", userVm.getInstanceName()));
+            cleanupFailedImportVM(vm);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to check migrations need during import, VM: %s", userVm.getInstanceName()));
+        }
+        if (!hostSupportsServiceOffering(sourceHost, serviceOffering)) {
+            LOGGER.debug(String.format("VM %s needs to be migrated", vm.getUuid()));
+            final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, template, serviceOffering, owner, null);
+            DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
+            excludeList.addHost(sourceHost.getId());
+            final DataCenterDeployment plan = new DataCenterDeployment(sourceHost.getDataCenterId(), sourceHost.getPodId(), sourceHost.getClusterId(), null, null, null);
+            DeployDestination dest = null;
+            try {
+                dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
+            } catch (Exception e) {
+                LOGGER.warn(String.format("VM import failed for unmanaged vm: %s during vm migration, finding deployment destination", vm.getInstanceName()), e);
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration, finding deployment destination", vm.getInstanceName()));
+            }
+            if (dest != null) {
+                if (LOGGER.isDebugEnabled()) {
+                    LOGGER.debug(" Found " + dest + " for migrating the vm to");
+                }
+            }
+            if (dest == null) {
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration, no deployment destination found", vm.getInstanceName()));
+            }
+            try {
+                if (vm.getState().equals(VirtualMachine.State.Stopped)) {
+                    VMInstanceVO vmInstanceVO = vmDao.findById(userVm.getId());
+                    vmInstanceVO.setHostId(dest.getHost().getId());
+                    vmInstanceVO.setLastHostId(dest.getHost().getId());
+                    vmDao.update(vmInstanceVO.getId(), vmInstanceVO);
+                } else {
+                    virtualMachineManager.migrate(vm.getUuid(), sourceHost.getId(), dest);
+                }
+                vm = userVmManager.getUserVm(vm.getId());
+            } catch (Exception e) {
+                LOGGER.error(String.format("VM import failed for unmanaged vm: %s during vm migration", vm.getInstanceName()), e);
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration. %s", userVm.getInstanceName(), e.getMessage()));
+            }
+        }
+        for (Pair<DiskProfile, StoragePool> diskProfileStoragePool : diskProfileStoragePoolList) {
+            if (diskProfileStoragePool == null ||
+                    diskProfileStoragePool.first() == null ||
+                    diskProfileStoragePool.second() == null) {
+                continue;
+            }
+            DiskProfile profile = diskProfileStoragePool.first();
+            DiskOffering dOffering = diskOfferingDao.findById(profile.getDiskOfferingId());
+            if (dOffering == null) {
+                continue;
+            }
+            VolumeVO volumeVO = volumeDao.findById(profile.getVolumeId());
+            if (volumeVO == null) {
+                continue;
+            }
+            boolean poolSupportsOfferings = storagePoolSupportsDiskOffering(diskProfileStoragePool.second(), dOffering);
+            if (poolSupportsOfferings && profile.getType() == Volume.Type.ROOT) {
+                poolSupportsOfferings = storagePoolSupportsServiceOffering(diskProfileStoragePool.second(), serviceOffering);
+            }
+            if (poolSupportsOfferings) {
+                continue;
+            }
+            LOGGER.debug(String.format("Volume %s needs to be migrated", volumeVO.getUuid()));
+            Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForMigrationOfVolume(profile.getVolumeId());
+            if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume ID: %s migration as no suitable pool(s) found", userVm.getInstanceName(), volumeVO.getUuid()));
+            }
+            List<? extends StoragePool> storagePools = poolsPair.second();
+            StoragePool storagePool = null;
+            if (CollectionUtils.isNotEmpty(storagePools)) {
+                for (StoragePool pool : storagePools) {
+                    if (diskProfileStoragePool.second().getId() != pool.getId() &&
+                            storagePoolSupportsDiskOffering(pool, dOffering) &&
+                            (!profile.getType().equals(Volume.Type.ROOT) ||
+                                    profile.getType().equals(Volume.Type.ROOT) && storagePoolSupportsServiceOffering(pool, serviceOffering))) {
+                        storagePool = pool;
+                        break;
+                    }
+                }
+            }
+            // For zone-wide pools, at times, suitable storage pools are not returned therefore consider all pools.
+            if (storagePool == null && CollectionUtils.isNotEmpty(poolsPair.first())) {
+                storagePools = poolsPair.first();
+                for (StoragePool pool : storagePools) {
+                    if (diskProfileStoragePool.second().getId() != pool.getId() &&
+                            storagePoolSupportsDiskOffering(pool, dOffering) &&
+                            (!profile.getType().equals(Volume.Type.ROOT) ||
+                                    profile.getType().equals(Volume.Type.ROOT) && storagePoolSupportsServiceOffering(pool, serviceOffering))) {
+                        storagePool = pool;
+                        break;
+                    }
+                }
+            }
+            if (storagePool == null) {
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume ID: %s migration as no suitable pool found", userVm.getInstanceName(), volumeVO.getUuid()));
+            } else {
+                LOGGER.debug(String.format("Found storage pool %s(%s) for migrating the volume %s to", storagePool.getName(), storagePool.getUuid(), volumeVO.getUuid()));
+            }
+            try {
+                Volume volume = null;
+                if (vm.getState().equals(VirtualMachine.State.Running)) {
+                    volume = volumeManager.liveMigrateVolume(volumeVO, storagePool);
+                } else {
+                    volume = volumeManager.migrateVolume(volumeVO, storagePool);
+                }
+                if (volume == null) {
+                    String msg = "";
+                    if (vm.getState().equals(VirtualMachine.State.Running)) {
+                        msg = String.format("Live migration for volume ID: %s to destination pool ID: %s failed", volumeVO.getUuid(), storagePool.getUuid());
+                    } else {
+                        msg = String.format("Migration for volume ID: %s to destination pool ID: %s failed", volumeVO.getUuid(), storagePool.getUuid());
+                    }
+                    LOGGER.error(msg);
+                    throw new CloudRuntimeException(msg);
+                }
+            } catch (Exception e) {
+                LOGGER.error(String.format("VM import failed for unmanaged vm: %s during volume migration", vm.getInstanceName()), e);
+                cleanupFailedImportVM(vm);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume migration. %s", userVm.getInstanceName(), Strings.nullToEmpty(e.getMessage())));
+            }
+        }
+        return userVm;
+    }
+
+    private void publishVMUsageUpdateResourceCount(final UserVm userVm, ServiceOfferingVO serviceOfferingVO) {
+        if (userVm == null || serviceOfferingVO == null) {
+            LOGGER.error("Failed to publish usage records during VM import");
+            cleanupFailedImportVM(userVm);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm during publishing usage records"));
+        }
+        try {
+            if (!serviceOfferingVO.isDynamic()) {
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), userVm.getHostName(), serviceOfferingVO.getId(), userVm.getTemplateId(),
+                        userVm.getHypervisorType().toString(), VirtualMachine.class.getName(), userVm.getUuid(), userVm.isDisplayVm());
+            } else {
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, userVm.getAccountId(), userVm.getAccountId(), userVm.getDataCenterId(), userVm.getHostName(), serviceOfferingVO.getId(), userVm.getTemplateId(),
+                        userVm.getHypervisorType().toString(), VirtualMachine.class.getName(), userVm.getUuid(), userVm.getDetails(), userVm.isDisplayVm());
+            }
+            if (userVm.getState() == VirtualMachine.State.Running) {
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_START, userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), userVm.getHostName(), serviceOfferingVO.getId(), userVm.getTemplateId(),
+                        userVm.getHypervisorType().toString(), VirtualMachine.class.getName(), userVm.getUuid(), userVm.isDisplayVm());
+            }
+        } catch (Exception e) {
+            LOGGER.error(String.format("Failed to publish usage records during VM import for unmanaged vm %s", userVm.getInstanceName()), e);
+            cleanupFailedImportVM(userVm);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm %s during publishing usage records", userVm.getInstanceName()));
+        }
+        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.user_vm, userVm.isDisplayVm());
+        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.cpu, userVm.isDisplayVm(), new Long(serviceOfferingVO.getCpu()));
+        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.memory, userVm.isDisplayVm(), new Long(serviceOfferingVO.getRamSize()));
+        // Save usage event and update resource count for user vm volumes
+        List<VolumeVO> volumes = volumeDao.findByInstance(userVm.getId());
+        for (VolumeVO volume : volumes) {
+            try {
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), null, volume.getSize(),
+                        Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
+            } catch (Exception e) {
+                LOGGER.error(String.format("Failed to publish volume ID: %s usage records during VM import", volume.getUuid()), e);
+            }
+            resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.volume, volume.isDisplayVolume());
+            resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.primary_storage, volume.isDisplayVolume(), volume.getSize());
+        }
+
+        List<NicVO> nics = nicDao.listByVmId(userVm.getId());
+        for (NicVO nic : nics) {
+            try {
+                NetworkVO network = networkDao.findById(nic.getNetworkId());
+                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(),
+                        Long.toString(nic.getId()), network.getNetworkOfferingId(), null, 1L, VirtualMachine.class.getName(), userVm.getUuid(), userVm.isDisplay());
+            } catch (Exception e) {
+                LOGGER.error(String.format("Failed to publish network usage records during VM import. %s", Strings.nullToEmpty(e.getMessage())));
+            }
+        }
+    }
+
+    private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host,
+                                                final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId,
+                                                final ServiceOfferingVO serviceOffering, final Map<String, Long> dataDiskOfferingMap,
+                                                final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
+                                                final Map<String, String> details, final boolean migrateAllowed, final boolean forced) {
+        UserVm userVm = null;
+
+        ServiceOfferingVO validatedServiceOffering = null;
+        try {
+            validatedServiceOffering = getUnmanagedInstanceServiceOffering(unmanagedInstance, serviceOffering, owner, zone, details);
+        } catch (Exception e) {
+            LOGGER.error("Service offering for VM import not compatible", e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import VM: %s. %s", unmanagedInstance.getName(), Strings.nullToEmpty(e.getMessage())));
+        }
+
+        Map<String, String> allDetails = new HashMap<>(details);
+        if (validatedServiceOffering.isDynamic()) {
+            allDetails.put(VmDetailConstants.CPU_NUMBER, String.valueOf(validatedServiceOffering.getCpu()));
+            allDetails.put(VmDetailConstants.MEMORY, String.valueOf(validatedServiceOffering.getRamSize()));
+            if (serviceOffering.getSpeed() == null) {
+                allDetails.put(VmDetailConstants.CPU_SPEED, String.valueOf(validatedServiceOffering.getSpeed()));
+            }
+        }
+
+        if (!migrateAllowed && !hostSupportsServiceOffering(host, validatedServiceOffering)) {
+            throw new InvalidParameterValueException(String.format("Service offering: %s is not compatible with host: %s of unmanaged VM: %s", serviceOffering.getUuid(), host.getUuid(), instanceName));
+        }
+        // Check disks and supplied disk offerings
+        List<UnmanagedInstanceTO.Disk> unmanagedInstanceDisks = unmanagedInstance.getDisks();
+        if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
+        }
+        Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
+        final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
+        final List<UnmanagedInstanceTO.Disk> dataDisks = rootAndDataDisksPair.second();
+        if (rootDisk == null || Strings.isNullOrEmpty(rootDisk.getController())) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
+        }
+        allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController());
+        try {
+            checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
+            if (CollectionUtils.isNotEmpty(dataDisks)) { // Data disk(s) present
+                checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
+                allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController());
+            }
+            resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.volume, unmanagedInstanceDisks.size());
+        } catch (ResourceAllocationException e) {
+            LOGGER.error(String.format("Volume resource allocation error for owner: %s", owner.getUuid()), e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resource allocation error for owner: %s. %s", owner.getUuid(), Strings.nullToEmpty(e.getMessage())));
+        }
+        // Check NICs and supplied networks
+        Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
+        Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner);
+        if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
+            allDetails.put(VmDetailConstants.NIC_ADAPTER, unmanagedInstance.getNics().get(0).getAdapterType());
+        }
+        VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff;
+        if (unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn)) {
+            powerState = VirtualMachine.PowerState.PowerOn;
+        }
+        try {
+            userVm = userVmManager.importVM(zone, host, template, instanceName, displayName, owner,
+                    null, caller, true, null, owner.getAccountId(), userId,
+                    validatedServiceOffering, null, hostName,
+                    cluster.getHypervisorType(), allDetails, powerState);
+        } catch (InsufficientCapacityException ice) {
+            LOGGER.error(String.format("Failed to import vm name: %s", instanceName), ice);
+            throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ice.getMessage());
+        }
+        if (userVm == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
+        }
+        List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
+        try {
+            if (rootDisk.getCapacity() == null || rootDisk.getCapacity() == 0) {
+                throw new InvalidParameterValueException(String.format("Root disk ID: %s size is invalid", rootDisk.getDiskId()));
+            }
+            Long minIops = null;
+            if (details.containsKey("minIops")) {
+                minIops = Long.parseLong(details.get("minIops"));
+            }
+            Long maxIops = null;
+            if (details.containsKey("maxIops")) {
+                maxIops = Long.parseLong(details.get("maxIops"));
+            }
+            diskProfileStoragePoolList.add(importDisk(rootDisk, userVm, cluster, serviceOffering, Volume.Type.ROOT, String.format("ROOT-%d", userVm.getId()),
+                    (rootDisk.getCapacity() / Resource.ResourceType.bytesToGiB), minIops, maxIops,
+                    template, owner, null));
+            for (UnmanagedInstanceTO.Disk disk : dataDisks) {
+                if (disk.getCapacity() == null || disk.getCapacity() == 0) {
+                    throw new InvalidParameterValueException(String.format("Disk ID: %s size is invalid", rootDisk.getDiskId()));
+                }
+                DiskOffering offering = diskOfferingDao.findById(dataDiskOfferingMap.get(disk.getDiskId()));
+                diskProfileStoragePoolList.add(importDisk(disk, userVm, cluster, offering, Volume.Type.DATADISK, String.format("DATA-%d-%s", userVm.getId(), disk.getDiskId()),
+                        (disk.getCapacity() / Resource.ResourceType.bytesToGiB), offering.getMinIops(), offering.getMaxIops(),
+                        template, owner, null));
+            }
+        } catch (Exception e) {
+            LOGGER.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
+            cleanupFailedImportVM(userVm);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, Strings.nullToEmpty(e.getMessage())));
+        }
+        try {
+            boolean firstNic = true;
+            for (UnmanagedInstanceTO.Nic nic : unmanagedInstance.getNics()) {
+                Network network = networkDao.findById(allNicNetworkMap.get(nic.getNicId()));
+                Network.IpAddresses ipAddresses = nicIpAddressMap.get(nic.getNicId());
+                importNic(nic, userVm, network, ipAddresses, firstNic, forced);
+                firstNic = false;
+            }
+        } catch (Exception e) {
+            LOGGER.error(String.format("Failed to import NICs while importing vm: %s", instanceName), e);
+            cleanupFailedImportVM(userVm);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import NICs while importing vm: %s. %s", instanceName, Strings.nullToEmpty(e.getMessage())));
+        }
+        if (migrateAllowed) {
+            userVm = migrateImportedVM(host, template, validatedServiceOffering, userVm, owner, diskProfileStoragePoolList);
+        }
+        publishVMUsageUpdateResourceCount(userVm, validatedServiceOffering);
+        return userVm;
+    }
+
+    @Override
+    public ListResponse<UnmanagedInstanceResponse> listUnmanagedInstances(ListUnmanagedInstancesCmd cmd) {
+        final Account caller = CallContext.current().getCallingAccount();
+        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+            throw new PermissionDeniedException(String.format("Cannot perform this operation, Calling account is not root admin: %s", caller.getUuid()));
+        }
+        final Long clusterId = cmd.getClusterId();
+        if (clusterId == null) {
+            throw new InvalidParameterValueException(String.format("Cluster ID cannot be null"));
+        }
+        final Cluster cluster = clusterDao.findById(clusterId);
+        if (cluster == null) {
+            throw new InvalidParameterValueException(String.format("Cluster ID: %d cannot be found", clusterId));
+        }
+        if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
+            throw new InvalidParameterValueException(String.format("VM ingestion is currently not supported for hypervisor: %s", cluster.getHypervisorType().toString()));
+        }
+        List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
+        List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
+        List<UnmanagedInstanceResponse> responses = new ArrayList<>();
+        for (HostVO host : hosts) {
+            if (host.isInMaintenanceStates()) {
+                continue;
+            }
+            List<String> managedVms = new ArrayList<>();
+            managedVms.addAll(additionalNameFilters);
+            managedVms.addAll(getHostManagedVms(host));
+
+            GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand();
+            command.setInstanceName(cmd.getName());
+            command.setManagedInstancesNames(managedVms);
+            Answer answer = agentManager.easySend(host.getId(), command);
+            if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
+                continue;
+            }
+            GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
+            HashMap<String, UnmanagedInstanceTO> unmanagedInstances = new HashMap<>();
+            unmanagedInstances.putAll(unmanagedInstancesAnswer.getUnmanagedInstances());
+            Set<String> keys = unmanagedInstances.keySet();
+            for (String key : keys) {
+                responses.add(createUnmanagedInstanceResponse(unmanagedInstances.get(key), cluster, host));
+            }
+        }
+        ListResponse<UnmanagedInstanceResponse> listResponses = new ListResponse<>();
+        listResponses.setResponses(responses, responses.size());
+        return listResponses;
+    }
+
+    @Override
+    public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) {
+        final Account caller = CallContext.current().getCallingAccount();
+        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
+            throw new PermissionDeniedException(String.format("Cannot perform this operation, Calling account is not root admin: %s", caller.getUuid()));
+        }
+        final Long clusterId = cmd.getClusterId();
+        if (clusterId == null) {
+            throw new InvalidParameterValueException(String.format("Cluster ID cannot be null"));
+        }
+        final Cluster cluster = clusterDao.findById(clusterId);
+        if (cluster == null) {
+            throw new InvalidParameterValueException(String.format("Cluster ID: %d cannot be found", clusterId));
+        }
+        if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
+            throw new InvalidParameterValueException(String.format("VM import is currently not supported for hypervisor: %s", cluster.getHypervisorType().toString()));
+        }
+        final DataCenter zone = dataCenterDao.findById(cluster.getDataCenterId());
+        final String instanceName = cmd.getName();
+        if (Strings.isNullOrEmpty(instanceName)) {
+            throw new InvalidParameterValueException(String.format("Instance name cannot be empty"));
+        }
+        if (cmd.getDomainId() != null && Strings.isNullOrEmpty(cmd.getAccountName())) {
+            throw new InvalidParameterValueException("domainid parameter must be specified with account parameter");
+        }
+        final Account owner = accountService.getActiveAccountById(cmd.getEntityOwnerId());
+        long userId = CallContext.current().getCallingUserId();
+        List<UserVO> userVOs = userDao.listByAccount(owner.getAccountId());
+        if (CollectionUtils.isNotEmpty(userVOs)) {
+            userId = userVOs.get(0).getId();
+        }
+        VMTemplateVO template = null;
+        final Long templateId = cmd.getTemplateId();
+        if (templateId == null) {
+            template = templateDao.findByName(VM_IMPORT_DEFAULT_TEMPLATE_NAME);
+            if (template == null) {
+                template = createDefaultDummyVmImportTemplate();
+                if (template == null) {
+                    throw new InvalidParameterValueException(String.format("Default VM import template with unique name: %s for hypervisor: %s cannot be created. Please use templateid paramter for import", VM_IMPORT_DEFAULT_TEMPLATE_NAME, cluster.getHypervisorType().toString()));
+                }
+            }
+        } else {
+            template = templateDao.findById(templateId);
+        }
+        if (template == null) {
+            throw new InvalidParameterValueException(String.format("Template ID: %d cannot be found", templateId));
+        }
+        final Long serviceOfferingId = cmd.getServiceOfferingId();
+        if (serviceOfferingId == null) {
+            throw new InvalidParameterValueException(String.format("Service offering ID cannot be null"));
+        }
+        final ServiceOfferingVO serviceOffering = serviceOfferingDao.findById(serviceOfferingId);
+        if (serviceOffering == null) {
+            throw new InvalidParameterValueException(String.format("Service offering ID: %d cannot be found", serviceOfferingId));
+        }
+        accountService.checkAccess(owner, serviceOffering, zone);
+        try {
+            resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.user_vm, 1);
+        } catch (ResourceAllocationException e) {
+            LOGGER.error(String.format("VM resource allocation error for account: %s", owner.getUuid()), e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM resource allocation error for account: %s. %s", owner.getUuid(), Strings.nullToEmpty(e.getMessage())));
+        }
+        String displayName = cmd.getDisplayName();
+        if (Strings.isNullOrEmpty(displayName)) {
+            displayName = instanceName;
+        }
+        String hostName = cmd.getHostName();
+        if (Strings.isNullOrEmpty(hostName)) {
+            if (!NetUtils.verifyDomainNameLabel(instanceName, true)) {
+                throw new InvalidParameterValueException(String.format("Please provide hostname for the VM. VM name contains unsupported characters for it to be used as hostname"));
+            }
+            hostName = instanceName;
+        }
+        if (!NetUtils.verifyDomainNameLabel(hostName, true)) {
+            throw new InvalidParameterValueException("Invalid VM hostname. VM hostname can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
+                    + "and the hyphen ('-'), must be between 1 and 63 characters long, and can't start or end with \"-\" and can't start with digit");
+        }
+        if (cluster.getHypervisorType().equals(Hypervisor.HypervisorType.VMware) &&
+                Boolean.parseBoolean(configurationDao.getValue(Config.SetVmInternalNameUsingDisplayName.key()))) {
+            // If global config vm.instancename.flag is set to true, then CS will set guest VM's name as it appears on the hypervisor, to its hostname.
+            // In case of VMware since VM name must be unique within a DC, check if VM with the same hostname already exists in the zone.
+            VMInstanceVO vmByHostName = vmDao.findVMByHostNameInZone(hostName, zone.getId());
+            if (vmByHostName != null && vmByHostName.getState() != VirtualMachine.State.Expunging) {
+                throw new InvalidParameterValueException(String.format("Failed to import VM: %s. There already exists a VM by the hostname: %s in zone: %s", instanceName, hostName, zone.getUuid()));
+            }
+        }
+        final Map<String, Long> nicNetworkMap = cmd.getNicNetworkList();
+        final Map<String, Network.IpAddresses> nicIpAddressMap = cmd.getNicIpAddressList();
+        final Map<String, Long> dataDiskOfferingMap = cmd.getDataDiskToDiskOfferingList();
+        final Map<String, String> details = cmd.getDetails();
+        final boolean forced = cmd.isForced();
+        List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
+        UserVm userVm = null;
+        List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
+        for (HostVO host : hosts) {
+            if (host.isInMaintenanceStates()) {
+                continue;
+            }
+            List<String> managedVms = new ArrayList<>();
+            managedVms.addAll(additionalNameFilters);
+            managedVms.addAll(getHostManagedVms(host));
+            GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand(instanceName);
+            command.setManagedInstancesNames(managedVms);
+            Answer answer = agentManager.easySend(host.getId(), command);
+            if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
+                continue;
+            }
+            GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
+            HashMap<String, UnmanagedInstanceTO> unmanagedInstances = unmanagedInstancesAnswer.getUnmanagedInstances();
+            if (MapUtils.isEmpty(unmanagedInstances)) {
+                continue;
+            }
+            Set<String> names = unmanagedInstances.keySet();
+            for (String name : names) {
+                if (instanceName.equals(name)) {
+                    UnmanagedInstanceTO unmanagedInstance = unmanagedInstances.get(name);
+                    if (unmanagedInstance == null) {
+                        throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve details for unmanaged VM: %s", name));
+                    }
+                    if (template.getName().equals(VM_IMPORT_DEFAULT_TEMPLATE_NAME)) {
+                        String osName = unmanagedInstance.getOperatingSystem();
+                        GuestOS guestOS = null;
+                        if (!Strings.isNullOrEmpty(osName)) {
+                            guestOS = guestOSDao.listByDisplayName(osName);
+                        }
+                        GuestOSHypervisor guestOSHypervisor = null;
+                        if (guestOS != null) {
+                            guestOSHypervisor = guestOSHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
+                        }
+                        if (guestOSHypervisor == null && !Strings.isNullOrEmpty(unmanagedInstance.getOperatingSystemId())) {
+                            guestOSHypervisor = guestOSHypervisorDao.findByOsNameAndHypervisor(unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
+                        }
+                        if (guestOSHypervisor == null) {
+                            if (guestOS != null) {
+                                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to find hypervisor guest OS ID: %s details for unmanaged VM: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", guestOS.getUuid(), name, host.getHypervisorType().toString(), host.getHypervisorVersion()));
+                            }
+                            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve guest OS details for unmanaged VM: %s with OS name: %s, OS ID: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", name, osName, unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion()));
+                        }
+                        template.setGuestOSId(guestOSHypervisor.getGuestOsId());
+                    }
+                    userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host,
+                            template, displayName, hostName, caller, owner, userId,
+                            serviceOffering, dataDiskOfferingMap,
+                            nicNetworkMap, nicIpAddressMap,
+                            details, cmd.getMigrateAllowed(), forced);
+                    break;
+                }
+            }
+            if (userVm != null) {
+                break;
+            }
+        }
+        if (userVm == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to find unmanaged vm with name: %s in cluster: %s", instanceName, cluster.getUuid()));
+        }
+        return responseGenerator.createUserVmResponse(ResponseObject.ResponseView.Full, "virtualmachine", userVm).get(0);
+    }
+
+    @Override
+    public List<Class<?>> getCommands() {
+        final List<Class<?>> cmdList = new ArrayList<Class<?>>();
+        cmdList.add(ListUnmanagedInstancesCmd.class);
+        cmdList.add(ImportUnmanagedInstanceCmd.class);
+        cmdList.add(UnmanageVMInstanceCmd.class);
+        return cmdList;
+    }
+
+    /**
+     * Perform validations before attempting to unmanage a VM from CloudStack:
+     * - VM must not have any associated volume snapshot
+     * - VM must not have an attached ISO
+     */
+    private void performUnmanageVMInstancePrechecks(VMInstanceVO vmVO) {
+        if (hasVolumeSnapshotsPriorToUnmanageVM(vmVO)) {
+            throw new UnsupportedServiceException("Cannot unmanage VM with id = " + vmVO.getUuid() +
+                    " as there are volume snapshots for its volume(s). Please remove snapshots before unmanaging.");
+        }
+
+        if (hasISOAttached(vmVO)) {
+            throw new UnsupportedServiceException("Cannot unmanage VM with id = " + vmVO.getUuid() +
+                    " as there is an ISO attached. Please detach ISO before unmanaging.");
+        }
+    }
+
+    private boolean hasVolumeSnapshotsPriorToUnmanageVM(VMInstanceVO vmVO) {
+        List<VolumeVO> volumes = volumeDao.findByInstance(vmVO.getId());
+        for (VolumeVO volume : volumes) {
+            List<SnapshotVO> snaps = snapshotDao.listByVolumeId(volume.getId());
+            if (CollectionUtils.isNotEmpty(snaps)) {
+                for (SnapshotVO snap : snaps) {
+                    if (snap.getState() != Snapshot.State.Destroyed && snap.getRemoved() == null) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean hasISOAttached(VMInstanceVO vmVO) {
+        UserVmVO userVM = userVmDao.findById(vmVO.getId());
+        if (userVM == null) {
+            throw new InvalidParameterValueException("Could not find user VM with ID = " + vmVO.getUuid());
+        }
+        return userVM.getIsoId() != null;
+    }
+
+    /**
+     * Find a suitable host within the scope of the VM to unmanage to verify the VM exists
+     */
+    private Long findSuitableHostId(VMInstanceVO vmVO) {
+        Long hostId = vmVO.getHostId();
+        if (hostId == null) {
+            long zoneId = vmVO.getDataCenterId();
+            List<HostVO> hosts = hostDao.listAllHostsUpByZoneAndHypervisor(zoneId, vmVO.getHypervisorType());
+            for (HostVO host : hosts) {
+                if (host.isInMaintenanceStates() || host.getState() != Status.Up || host.getStatus() != Status.Up) {
+                    continue;
+                }
+                hostId = host.getId();
+                break;
+            }
+        }
+
+        if (hostId == null) {
+            throw new CloudRuntimeException("Cannot find a host to verify if the VM to unmanage " +
+                    "with id = " + vmVO.getUuid() + " exists.");
+        }
+        return hostId;
+    }
+
+    @Override
+    @ActionEvent(eventType = EventTypes.EVENT_VM_UNMANAGE, eventDescription = "unmanaging VM", async = true)
+    public boolean unmanageVMInstance(long vmId) {
+        VMInstanceVO vmVO = vmDao.findById(vmId);
+        if (vmVO == null || vmVO.getRemoved() != null) {
+            throw new InvalidParameterValueException("Could not find VM to unmanage, it is either removed or not existing VM");
+        } else if (vmVO.getState() != VirtualMachine.State.Running && vmVO.getState() != VirtualMachine.State.Stopped) {
+            throw new InvalidParameterValueException("VM with id = " + vmVO.getUuid() + " must be running or stopped to be unmanaged");
+        } else if (vmVO.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
+            throw new UnsupportedServiceException("Unmanage VM is currently allowed for VMware VMs only");
+        } else if (vmVO.getType() != VirtualMachine.Type.User) {
+            throw new UnsupportedServiceException("Unmanage VM is currently allowed for guest VMs only");
+        }
+
+        performUnmanageVMInstancePrechecks(vmVO);
+
+        Long hostId = findSuitableHostId(vmVO);
+        String instanceName = vmVO.getInstanceName();
+
+        if (!existsVMToUnmanage(instanceName, hostId)) {
+            throw new CloudRuntimeException("VM with id = " + vmVO.getUuid() + " is not found in the hypervisor");
+        }
+
+        return userVmManager.unmanageUserVM(vmId);
+    }
+
+    /**
+     * Verify the VM to unmanage exists on the hypervisor
+     */
+    private boolean existsVMToUnmanage(String instanceName, Long hostId) {
+        PrepareUnmanageVMInstanceCommand command = new PrepareUnmanageVMInstanceCommand();
+        command.setInstanceName(instanceName);
+        Answer ans = agentManager.easySend(hostId, command);
+        if (!(ans instanceof PrepareUnmanageVMInstanceAnswer)) {
+            throw new CloudRuntimeException("Error communicating with host " + hostId);
+        }
+        PrepareUnmanageVMInstanceAnswer answer = (PrepareUnmanageVMInstanceAnswer) ans;
+        if (!answer.getResult()) {
+            LOGGER.error("Error verifying VM " + instanceName + " exists on host with ID = " + hostId + ": " + answer.getDetails());
+        }
+        return answer.getResult();
+    }
+
+    @Override
+    public String getConfigComponentName() {
+        return UnmanagedVMsManagerImpl.class.getSimpleName();
+    }
+
+    @Override
+    public ConfigKey<?>[] getConfigKeys() {
+        return new ConfigKey<?>[] { UnmanageVMPreserveNic };
+    }
+}
diff --git a/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java
deleted file mode 100644
index a3ee04e..0000000
--- a/server/src/main/java/org/apache/cloudstack/vm/VmImportManagerImpl.java
+++ /dev/null
@@ -1,1244 +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.
-
-package org.apache.cloudstack.vm;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.ApiErrorCode;
-import org.apache.cloudstack.api.ResponseGenerator;
-import org.apache.cloudstack.api.ResponseObject;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.command.admin.vm.ImportUnmanagedInstanceCmd;
-import org.apache.cloudstack.api.command.admin.vm.ListUnmanagedInstancesCmd;
-import org.apache.cloudstack.api.response.ListResponse;
-import org.apache.cloudstack.api.response.NicResponse;
-import org.apache.cloudstack.api.response.UnmanagedInstanceDiskResponse;
-import org.apache.cloudstack.api.response.UnmanagedInstanceResponse;
-import org.apache.cloudstack.api.response.UserVmResponse;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
-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.apache.cloudstack.utils.volume.VirtualMachineDiskInfo;
-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.api.Answer;
-import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
-import com.cloud.agent.api.GetUnmanagedInstancesCommand;
-import com.cloud.capacity.CapacityManager;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.Resource;
-import com.cloud.dc.DataCenter;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.deploy.DataCenterDeployment;
-import com.cloud.deploy.DeployDestination;
-import com.cloud.deploy.DeploymentPlanner;
-import com.cloud.deploy.DeploymentPlanningManager;
-import com.cloud.event.EventTypes;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.InsufficientAddressCapacityException;
-import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.InsufficientVirtualNetworkCapacityException;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.ResourceAllocationException;
-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.network.Network;
-import com.cloud.network.NetworkModel;
-import com.cloud.network.Networks;
-import com.cloud.network.dao.NetworkDao;
-import com.cloud.network.dao.NetworkVO;
-import com.cloud.offering.DiskOffering;
-import com.cloud.offering.ServiceOffering;
-import com.cloud.org.Cluster;
-import com.cloud.resource.ResourceManager;
-import com.cloud.serializer.GsonHelper;
-import com.cloud.server.ManagementService;
-import com.cloud.service.ServiceOfferingVO;
-import com.cloud.service.dao.ServiceOfferingDao;
-import com.cloud.storage.GuestOS;
-import com.cloud.storage.GuestOSHypervisor;
-import com.cloud.storage.Storage;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeApiService;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.DiskOfferingDao;
-import com.cloud.storage.dao.GuestOSDao;
-import com.cloud.storage.dao.GuestOSHypervisorDao;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VMTemplatePoolDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.template.VirtualMachineTemplate;
-import com.cloud.user.Account;
-import com.cloud.user.AccountService;
-import com.cloud.user.ResourceLimitService;
-import com.cloud.user.UserVO;
-import com.cloud.user.dao.UserDao;
-import com.cloud.uservm.UserVm;
-import com.cloud.utils.Pair;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.DiskProfile;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.UserVmManager;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachineManager;
-import com.cloud.vm.VirtualMachineProfile;
-import com.cloud.vm.VirtualMachineProfileImpl;
-import com.cloud.vm.VmDetailConstants;
-import com.cloud.vm.dao.NicDao;
-import com.cloud.vm.dao.VMInstanceDao;
-import com.google.common.base.Strings;
-import com.google.gson.Gson;
-
-public class VmImportManagerImpl implements VmImportService {
-    public static final String VM_IMPORT_DEFAULT_TEMPLATE_NAME = "system-default-vm-import-dummy-template.iso";
-    private static final Logger LOGGER = Logger.getLogger(VmImportManagerImpl.class);
-
-    @Inject
-    private AgentManager agentManager;
-    @Inject
-    private DataCenterDao dataCenterDao;
-    @Inject
-    private ClusterDao clusterDao;
-    @Inject
-    private HostDao hostDao;
-    @Inject
-    private AccountService accountService;
-    @Inject
-    private UserDao userDao;
-    @Inject
-    private VMTemplateDao templateDao;
-    @Inject
-    private VMTemplatePoolDao templatePoolDao;
-    @Inject
-    private ServiceOfferingDao serviceOfferingDao;
-    @Inject
-    private DiskOfferingDao diskOfferingDao;
-    @Inject
-    private ResourceManager resourceManager;
-    @Inject
-    private ResourceLimitService resourceLimitService;
-    @Inject
-    private UserVmManager userVmManager;
-    @Inject
-    private ResponseGenerator responseGenerator;
-    @Inject
-    private VolumeOrchestrationService volumeManager;
-    @Inject
-    private VolumeDao volumeDao;
-    @Inject
-    private PrimaryDataStoreDao primaryDataStoreDao;
-    @Inject
-    private NetworkDao networkDao;
-    @Inject
-    private NetworkOrchestrationService networkOrchestrationService;
-    @Inject
-    private VMInstanceDao vmDao;
-    @Inject
-    private CapacityManager capacityManager;
-    @Inject
-    private VolumeApiService volumeApiService;
-    @Inject
-    private DeploymentPlanningManager deploymentPlanningManager;
-    @Inject
-    private VirtualMachineManager virtualMachineManager;
-    @Inject
-    private ManagementService managementService;
-    @Inject
-    private NicDao nicDao;
-    @Inject
-    private NetworkModel networkModel;
-    @Inject
-    private ConfigurationDao configurationDao;
-    @Inject
-    private GuestOSDao guestOSDao;
-    @Inject
-    private GuestOSHypervisorDao guestOSHypervisorDao;
-
-    protected Gson gson;
-
-    public VmImportManagerImpl() {
-        gson = GsonHelper.getGsonLogger();
-    }
-
-    private VMTemplateVO createDefaultDummyVmImportTemplate() {
-        VMTemplateVO template = null;
-        try {
-            template = VMTemplateVO.createSystemIso(templateDao.getNextInSequence(Long.class, "id"), VM_IMPORT_DEFAULT_TEMPLATE_NAME, VM_IMPORT_DEFAULT_TEMPLATE_NAME, true,
-                    "", true, 64, Account.ACCOUNT_ID_SYSTEM, "",
-                    "VM Import Default Template", false, 1);
-            template.setState(VirtualMachineTemplate.State.Inactive);
-            template = templateDao.persist(template);
-            if (template == null) {
-                return null;
-            }
-            templateDao.remove(template.getId());
-            template = templateDao.findByName(VM_IMPORT_DEFAULT_TEMPLATE_NAME);
-        } catch (Exception e) {
-            LOGGER.error("Unable to create default dummy template for VM import", e);
-        }
-        return template;
-    }
-
-    private UnmanagedInstanceResponse createUnmanagedInstanceResponse(UnmanagedInstanceTO instance, Cluster cluster, Host host) {
-        UnmanagedInstanceResponse response = new UnmanagedInstanceResponse();
-        response.setName(instance.getName());
-        if (cluster != null) {
-            response.setClusterId(cluster.getUuid());
-        }
-        if (host != null) {
-            response.setHostId(host.getUuid());
-        }
-        response.setPowerState(instance.getPowerState().toString());
-        response.setCpuCores(instance.getCpuCores());
-        response.setCpuSpeed(instance.getCpuSpeed());
-        response.setCpuCoresPerSocket(instance.getCpuCoresPerSocket());
-        response.setMemory(instance.getMemory());
-        response.setOperatingSystemId(instance.getOperatingSystemId());
-        response.setOperatingSystem(instance.getOperatingSystem());
-        response.setObjectName("unmanagedinstance");
-
-        if (instance.getDisks() != null) {
-            for (UnmanagedInstanceTO.Disk disk : instance.getDisks()) {
-                UnmanagedInstanceDiskResponse diskResponse = new UnmanagedInstanceDiskResponse();
-                diskResponse.setDiskId(disk.getDiskId());
-                if (!Strings.isNullOrEmpty(disk.getLabel())) {
-                    diskResponse.setLabel(disk.getLabel());
-                }
-                diskResponse.setCapacity(disk.getCapacity());
-                diskResponse.setController(disk.getController());
-                diskResponse.setControllerUnit(disk.getControllerUnit());
-                diskResponse.setPosition(disk.getPosition());
-                diskResponse.setImagePath(disk.getImagePath());
-                diskResponse.setDatastoreName(disk.getDatastoreName());
-                diskResponse.setDatastoreHost(disk.getDatastoreHost());
-                diskResponse.setDatastorePath(disk.getDatastorePath());
-                diskResponse.setDatastoreType(disk.getDatastoreType());
-                response.addDisk(diskResponse);
-            }
-        }
-
-        if (instance.getNics() != null) {
-            for (UnmanagedInstanceTO.Nic nic : instance.getNics()) {
-                NicResponse nicResponse = new NicResponse();
-                nicResponse.setId(nic.getNicId());
-                nicResponse.setNetworkName(nic.getNetwork());
-                nicResponse.setMacAddress(nic.getMacAddress());
-                if (!Strings.isNullOrEmpty(nic.getAdapterType())) {
-                    nicResponse.setAdapterType(nic.getAdapterType());
-                }
-                if (!CollectionUtils.isEmpty(nic.getIpAddress())) {
-                    nicResponse.setIpAddresses(nic.getIpAddress());
-                }
-                nicResponse.setVlanId(nic.getVlan());
-                nicResponse.setIsolatedPvlanId(nic.getPvlan());
-                nicResponse.setIsolatedPvlanType(nic.getPvlanType());
-                response.addNic(nicResponse);
-            }
-        }
-        return response;
-    }
-
-    private List<String> getAdditionalNameFilters(Cluster cluster) {
-        List<String> additionalNameFilter = new ArrayList<>();
-        if (cluster == null) {
-            return additionalNameFilter;
-        }
-        if (cluster.getHypervisorType() == Hypervisor.HypervisorType.VMware) {
-            // VMWare considers some templates as VM and they are not filtered by VirtualMachineMO.isTemplate()
-            List<VMTemplateStoragePoolVO> templates = templatePoolDao.listAll();
-            for (VMTemplateStoragePoolVO template : templates) {
-                additionalNameFilter.add(template.getInstallPath());
-            }
-
-            // VMWare considers some removed volumes as VM
-            List<VolumeVO> volumes = volumeDao.findIncludingRemovedByZone(cluster.getDataCenterId());
-            for (VolumeVO volumeVO : volumes) {
-                if (volumeVO.getRemoved() == null) {
-                    continue;
-                }
-                if (Strings.isNullOrEmpty(volumeVO.getChainInfo())) {
-                    continue;
-                }
-                List<String> volumeFileNames = new ArrayList<>();
-                try {
-                    VirtualMachineDiskInfo diskInfo = gson.fromJson(volumeVO.getChainInfo(), VirtualMachineDiskInfo.class);
-                    String[] files = diskInfo.getDiskChain();
-                    if (files.length == 1) {
-                        continue;
-                    }
-                    boolean firstFile = true;
-                    for (final String file : files) {
-                        if (firstFile) {
-                            firstFile = false;
-                            continue;
-                        }
-                        String path = file;
-                        String[] split = path.split(" ");
-                        path = split[split.length - 1];
-                        split = path.split("/");
-                        ;
-                        path = split[split.length - 1];
-                        split = path.split("\\.");
-                        path = split[0];
-                        if (!Strings.isNullOrEmpty(path)) {
-                            if (!additionalNameFilter.contains(path)) {
-                                volumeFileNames.add(path);
-                            }
-                            if (path.contains("-")) {
-                                split = path.split("-");
-                                path = split[0];
-                                if (!Strings.isNullOrEmpty(path) && !path.equals("ROOT") && !additionalNameFilter.contains(path)) {
-                                    volumeFileNames.add(path);
-                                }
-                            }
-                        }
-                    }
-                } catch (Exception e) {
-                    LOGGER.warn(String.format("Unable to find volume file name for volume ID: %s while adding filters unmanaged VMs", volumeVO.getUuid()), e);
-                }
-                if (!volumeFileNames.isEmpty()) {
-                    additionalNameFilter.addAll(volumeFileNames);
-                }
-            }
-        }
-        return additionalNameFilter;
-    }
-
-    private List<String> getHostManagedVms(Host host) {
-        List<String> managedVms = new ArrayList<>();
-        List<VMInstanceVO> instances = vmDao.listByHostId(host.getId());
-        for (VMInstanceVO instance : instances) {
-            managedVms.add(instance.getInstanceName());
-        }
-        instances = vmDao.listByLastHostIdAndStates(host.getId(),
-                VirtualMachine.State.Stopped, VirtualMachine.State.Destroyed,
-                VirtualMachine.State.Expunging, VirtualMachine.State.Error,
-                VirtualMachine.State.Unknown, VirtualMachine.State.Shutdown);
-        for (VMInstanceVO instance : instances) {
-            managedVms.add(instance.getInstanceName());
-        }
-        return managedVms;
-    }
-
-    private boolean hostSupportsServiceOffering(HostVO host, ServiceOffering serviceOffering) {
-        if (host == null) {
-            return false;
-        }
-        if (serviceOffering == null) {
-            return false;
-        }
-        if (Strings.isNullOrEmpty(serviceOffering.getHostTag())) {
-            return true;
-        }
-        hostDao.loadHostTags(host);
-        return host.getHostTags() != null && host.getHostTags().contains(serviceOffering.getHostTag());
-    }
-
-    private boolean storagePoolSupportsDiskOffering(StoragePool pool, DiskOffering diskOffering) {
-        if (pool == null) {
-            return false;
-        }
-        if (diskOffering == null) {
-            return false;
-        }
-        return volumeApiService.doesTargetStorageSupportDiskOffering(pool, diskOffering.getTags());
-    }
-
-    private boolean storagePoolSupportsServiceOffering(StoragePool pool, ServiceOffering serviceOffering) {
-        if (pool == null) {
-            return false;
-        }
-        if (serviceOffering == null) {
-            return false;
-        }
-        return volumeApiService.doesTargetStorageSupportDiskOffering(pool, serviceOffering.getTags());
-    }
-
-    private ServiceOfferingVO getUnmanagedInstanceServiceOffering(final UnmanagedInstanceTO instance, ServiceOfferingVO serviceOffering, final Account owner, final DataCenter zone, final Map<String, String> details)
-            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
-        if (instance == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM is not valid"));
-        }
-        if (serviceOffering == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering is not valid"));
-        }
-        accountService.checkAccess(owner, serviceOffering, zone);
-        final Integer cpu = instance.getCpuCores();
-        final Integer memory = instance.getMemory();
-        Integer cpuSpeed = instance.getCpuSpeed() == null ? 0 : instance.getCpuSpeed();
-        if (cpu == null || cpu == 0) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("CPU cores for VM not valid"));
-        }
-        if (memory == null || memory == 0) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Memory for VM not valid", instance.getName()));
-        }
-        if (serviceOffering.isDynamic()) {
-            if (details.containsKey(VmDetailConstants.CPU_SPEED)) {
-                try {
-                    cpuSpeed = Integer.parseInt(details.get(VmDetailConstants.CPU_SPEED));
-                } catch (Exception e) {
-                }
-            }
-            Map<String, String> parameters = new HashMap<>();
-            parameters.put(VmDetailConstants.CPU_NUMBER, String.valueOf(cpu));
-            parameters.put(VmDetailConstants.MEMORY, String.valueOf(memory));
-            if (serviceOffering.getSpeed() == null && cpuSpeed > 0) {
-                parameters.put(VmDetailConstants.CPU_SPEED, String.valueOf(cpuSpeed));
-            }
-            serviceOffering.setDynamicFlag(true);
-            userVmManager.validateCustomParameters(serviceOffering, parameters);
-            serviceOffering = serviceOfferingDao.getComputeOffering(serviceOffering, parameters);
-        } else {
-            if (!cpu.equals(serviceOffering.getCpu()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %d CPU cores does not matches VM CPU cores %d  and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getCpu(), cpu, instance.getPowerState()));
-            }
-            if (!memory.equals(serviceOffering.getRamSize()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %dMB memory does not matches VM memory %dMB and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getRamSize(), memory, instance.getPowerState()));
-            }
-            if (cpuSpeed != null && cpuSpeed > 0 && !cpuSpeed.equals(serviceOffering.getSpeed()) && !instance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOff)) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Service offering (%s) %dMHz CPU speed does not matches VM CPU speed %dMHz and VM is not in powered off state (Power state: %s)", serviceOffering.getUuid(), serviceOffering.getSpeed(), cpuSpeed, instance.getPowerState()));
-            }
-        }
-        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.cpu, new Long(serviceOffering.getCpu()));
-        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.memory, new Long(serviceOffering.getRamSize()));
-        return serviceOffering;
-    }
-
-    private Map<String, Network.IpAddresses> getNicIpAddresses(final List<UnmanagedInstanceTO.Nic> nics, final Map<String, Network.IpAddresses> callerNicIpAddressMap) {
-        Map<String, Network.IpAddresses> nicIpAddresses = new HashMap<>();
-        for (UnmanagedInstanceTO.Nic nic : nics) {
-            Network.IpAddresses ipAddresses = null;
-            if (MapUtils.isNotEmpty(callerNicIpAddressMap) && callerNicIpAddressMap.containsKey(nic.getNicId())) {
-                ipAddresses = callerNicIpAddressMap.get(nic.getNicId());
-            }
-            // If IP is set to auto-assign, check NIC doesn't have more that one IP from SDK
-            if (ipAddresses != null && ipAddresses.getIp4Address() != null && ipAddresses.getIp4Address().equals("auto") && !CollectionUtils.isEmpty(nic.getIpAddress())) {
-                if (nic.getIpAddress().size() > 1) {
-                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple IP addresses (%s, %s) present for nic ID: %s. IP address cannot be assigned automatically, only single IP address auto-assigning supported", nic.getIpAddress().get(0), nic.getIpAddress().get(1), nic.getNicId()));
-                }
-                String address = nic.getIpAddress().get(0);
-                if (NetUtils.isValidIp4(address)) {
-                    ipAddresses.setIp4Address(address);
-                }
-            }
-            if (ipAddresses != null) {
-                nicIpAddresses.put(nic.getNicId(), ipAddresses);
-            }
-        }
-        return nicIpAddresses;
-    }
-
-    private StoragePool getStoragePool(final UnmanagedInstanceTO.Disk disk, final DataCenter zone, final Cluster cluster) {
-        StoragePool storagePool = null;
-        final String dsHost = disk.getDatastoreHost();
-        final String dsPath = disk.getDatastorePath();
-        final String dsType = disk.getDatastoreType();
-        final String dsName = disk.getDatastoreName();
-        if (dsType.equals("VMFS")) {
-            List<StoragePoolVO> pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId());
-            pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId()));
-            for (StoragePool pool : pools) {
-                if (pool.getPoolType() != Storage.StoragePoolType.VMFS) {
-                    continue;
-                }
-                if (pool.getPath().endsWith(dsName)) {
-                    storagePool = pool;
-                    break;
-                }
-            }
-        } else {
-            List<StoragePoolVO> pools = primaryDataStoreDao.listPoolByHostPath(dsHost, dsPath);
-            for (StoragePool pool : pools) {
-                if (pool.getDataCenterId() == zone.getId() &&
-                        (pool.getClusterId() == null || pool.getClusterId().equals(cluster.getId()))) {
-                    storagePool = pool;
-                    break;
-                }
-            }
-        }
-        if (storagePool == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Storage pool for disk %s(%s) with datastore: %s not found in zone ID: %s", disk.getLabel(), disk.getDiskId(), disk.getDatastoreName(), zone.getUuid()));
-        }
-        return storagePool;
-    }
-
-    private Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> getRootAndDataDisks(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> dataDiskOfferingMap) {
-        UnmanagedInstanceTO.Disk rootDisk = null;
-        List<UnmanagedInstanceTO.Disk> dataDisks = new ArrayList<>();
-        if (disks.size() == 1) {
-            rootDisk = disks.get(0);
-            return new Pair<>(rootDisk, dataDisks);
-        }
-        Set<String> callerDiskIds = dataDiskOfferingMap.keySet();
-        if (callerDiskIds.size() != disks.size() - 1) {
-            String msg = String.format("VM has total %d disks for which %d disk offering mappings provided. %d disks need a disk offering for import", disks.size(), callerDiskIds.size(), disks.size()-1);
-            LOGGER.error(String.format("%s. %s parameter can be used to provide disk offerings for the disks", msg, ApiConstants.DATADISK_OFFERING_LIST));
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, msg);
-        }
-        List<String> diskIdsWithoutOffering = new ArrayList<>();
-        for (UnmanagedInstanceTO.Disk disk : disks) {
-            String diskId = disk.getDiskId();
-            if (!callerDiskIds.contains(diskId)) {
-                diskIdsWithoutOffering.add(diskId);
-                rootDisk = disk;
-            } else {
-                dataDisks.add(disk);
-            }
-        }
-        if (diskIdsWithoutOffering.size() > 1) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM has total %d disks, disk offering mapping not provided for %d disks. Disk IDs that may need a disk offering - %s", disks.size(), diskIdsWithoutOffering.size()-1, String.join(", ", diskIdsWithoutOffering)));
-        }
-        return new Pair<>(rootDisk, dataDisks);
-    }
-
-    private void checkUnmanagedDiskAndOfferingForImport(UnmanagedInstanceTO.Disk disk, DiskOffering diskOffering, ServiceOffering serviceOffering, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
-            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
-        if (serviceOffering == null && diskOffering == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Disk offering for disk ID: %s not found during VM import", disk.getDiskId()));
-        }
-        if (diskOffering != null) {
-            accountService.checkAccess(owner, diskOffering, zone);
-        }
-        resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.volume);
-        if (disk.getCapacity() == null || disk.getCapacity() == 0) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of disk(ID: %s) is found invalid during VM import", disk.getDiskId()));
-        }
-        if (diskOffering != null && !diskOffering.isCustomized() && diskOffering.getDiskSize() == 0) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of fixed disk offering(ID: %s) is found invalid during VM import", diskOffering.getUuid()));
-        }
-        if (diskOffering != null && !diskOffering.isCustomized() && diskOffering.getDiskSize() < disk.getCapacity()) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Size of disk offering(ID: %s) %dGB is found less than the size of disk(ID: %s) %dGB during VM import", diskOffering.getUuid(), (diskOffering.getDiskSize() / Resource.ResourceType.bytesToGiB), disk.getDiskId(), (disk.getCapacity() / (Resource.ResourceType.bytesToGiB))));
-        }
-        StoragePool storagePool = getStoragePool(disk, zone, cluster);
-        if (diskOffering != null && !migrateAllowed && !storagePoolSupportsDiskOffering(storagePool, diskOffering)) {
-            throw new InvalidParameterValueException(String.format("Disk offering: %s is not compatible with storage pool: %s of unmanaged disk: %s", diskOffering.getUuid(), storagePool.getUuid(), disk.getDiskId()));
-        }
-        if (serviceOffering != null && !migrateAllowed && !storagePoolSupportsServiceOffering(storagePool, serviceOffering)) {
-            throw new InvalidParameterValueException(String.format("Service offering: %s is not compatible with storage pool: %s of unmanaged disk: %s", serviceOffering.getUuid(), storagePool.getUuid(), disk.getDiskId()));
-        }
-    }
-
-    private void checkUnmanagedDiskAndOfferingForImport(List<UnmanagedInstanceTO.Disk> disks, final Map<String, Long> diskOfferingMap, final Account owner, final DataCenter zone, final Cluster cluster, final boolean migrateAllowed)
-            throws ServerApiException, PermissionDeniedException, ResourceAllocationException {
-        String diskController = null;
-        for (UnmanagedInstanceTO.Disk disk : disks) {
-            if (disk == null) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve disk details for VM"));
-            }
-            if (!diskOfferingMap.containsKey(disk.getDiskId())) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Disk offering for disk ID: %s not found during VM import", disk.getDiskId()));
-            }
-            if (Strings.isNullOrEmpty(diskController)) {
-                diskController = disk.getController();
-            } else {
-                if (!diskController.equals(disk.getController())) {
-                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple data disk controllers of different type (%s, %s) are not supported for import. Please make sure that all data disk controllers are of the same type", diskController, disk.getController()));
-                }
-            }
-            checkUnmanagedDiskAndOfferingForImport(disk, diskOfferingDao.findById(diskOfferingMap.get(disk.getDiskId())), null, owner, zone, cluster, migrateAllowed);
-        }
-    }
-
-    private void checkUnmanagedNicAndNetworkForImport(UnmanagedInstanceTO.Nic nic, Network network, final DataCenter zone, final Account owner, final boolean autoAssign) throws ServerApiException {
-        if (nic == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
-        }
-        if (network == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
-        }
-        if (network.getDataCenterId() != zone.getId()) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network(ID: %s) for nic(ID: %s) belongs to a different zone than VM to be imported", network.getUuid(), nic.getNicId()));
-        }
-        networkModel.checkNetworkPermissions(owner, network);
-        if (!autoAssign && network.getGuestType().equals(Network.GuestType.Isolated)) {
-            return;
-        }
-
-        String networkBroadcastUri = network.getBroadcastUri() == null ? null : network.getBroadcastUri().toString();
-        if (nic.getVlan() != null && nic.getVlan() != 0 && nic.getPvlan() == null &&
-                (Strings.isNullOrEmpty(networkBroadcastUri) ||
-                        !networkBroadcastUri.equals(String.format("vlan://%d", nic.getVlan())))) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VLAN of network(ID: %s) %s is found different from the VLAN of nic(ID: %s) vlan://%d during VM import", network.getUuid(), networkBroadcastUri, nic.getNicId(), nic.getVlan()));
-        }
-        if (nic.getVlan() != null && nic.getVlan() != 0 && nic.getPvlan() != null && nic.getPvlan() != 0 &&
-                (Strings.isNullOrEmpty(network.getBroadcastUri().toString()) ||
-                        !networkBroadcastUri.equals(String.format("pvlan://%d-i%d", nic.getVlan(), nic.getPvlan())))) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("PVLAN of network(ID: %s) %s is found different from the VLAN of nic(ID: %s) pvlan://%d-i%d during VM import", network.getUuid(), networkBroadcastUri, nic.getNicId(), nic.getVlan(), nic.getPvlan()));
-        }
-    }
-
-    private void checkUnmanagedNicAndNetworkHostnameForImport(UnmanagedInstanceTO.Nic nic, Network network, final String hostName) throws ServerApiException {
-        if (nic == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
-        }
-        if (network == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
-        }
-        // Check for duplicate hostname in network, get all vms hostNames in the network
-        List<String> hostNames = vmDao.listDistinctHostNames(network.getId());
-        if (CollectionUtils.isNotEmpty(hostNames) && hostNames.contains(hostName)) {
-            throw new InvalidParameterValueException("The vm with hostName " + hostName + " already exists in the network domain: " + network.getNetworkDomain() + "; network="
-                    + network);
-        }
-    }
-
-    private void checkUnmanagedNicIpAndNetworkForImport(UnmanagedInstanceTO.Nic nic, Network network, final Network.IpAddresses ipAddresses) throws ServerApiException {
-        if (nic == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve NIC details during VM import"));
-        }
-        if (network == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Network for nic ID: %s not found during VM import", nic.getNicId()));
-        }
-        // Check IP is assigned for non L2 networks
-        if (!network.getGuestType().equals(Network.GuestType.L2) && (ipAddresses == null || Strings.isNullOrEmpty(ipAddresses.getIp4Address()))) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("NIC(ID: %s) needs a valid IP address for it to be associated with network(ID: %s). %s parameter of API can be used for this", nic.getNicId(), network.getUuid(), ApiConstants.NIC_IP_ADDRESS_LIST));
-        }
-        // If network is non L2, IP v4 is assigned and not set to auto-assign, check it is available for network
-        if (!network.getGuestType().equals(Network.GuestType.L2) && ipAddresses != null && !Strings.isNullOrEmpty(ipAddresses.getIp4Address()) && !ipAddresses.getIp4Address().equals("auto")) {
-            Set<Long> ips = networkModel.getAvailableIps(network, ipAddresses.getIp4Address());
-            if (CollectionUtils.isEmpty(ips) || !ips.contains(NetUtils.ip2Long(ipAddresses.getIp4Address()))) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("IP address %s for NIC(ID: %s) is not available in network(ID: %s)", ipAddresses.getIp4Address(), nic.getNicId(), network.getUuid()));
-            }
-        }
-    }
-
-    private Map<String, Long> getUnmanagedNicNetworkMap(List<UnmanagedInstanceTO.Nic> nics, final Map<String, Long> callerNicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap, final DataCenter zone, final String hostName, final Account owner) throws ServerApiException {
-        Map<String, Long> nicNetworkMap = new HashMap<>();
-        String nicAdapter = null;
-        for (UnmanagedInstanceTO.Nic nic : nics) {
-            if (Strings.isNullOrEmpty(nicAdapter)) {
-                nicAdapter = nic.getAdapterType();
-            } else {
-                if (!nicAdapter.equals(nic.getAdapterType())) {
-                    throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Multiple network adapter of different type (%s, %s) are not supported for import. Please make sure that all network adapters are of the same type", nicAdapter, nic.getAdapterType()));
-                }
-            }
-            Network network = null;
-            Network.IpAddresses ipAddresses = null;
-            if (MapUtils.isNotEmpty(callerNicIpAddressMap) && callerNicIpAddressMap.containsKey(nic.getNicId())) {
-                ipAddresses = callerNicIpAddressMap.get(nic.getNicId());
-            }
-            if (!callerNicNetworkMap.containsKey(nic.getNicId())) {
-                if (nic.getVlan() != null && nic.getVlan() != 0) {
-                    // Find a suitable network
-                    List<NetworkVO> networks = networkDao.listByZone(zone.getId());
-                    for (NetworkVO networkVO : networks) {
-                        if (networkVO.getTrafficType() == Networks.TrafficType.None || Networks.TrafficType.isSystemNetwork(networkVO.getTrafficType())) {
-                            continue;
-                        }
-                        try {
-                            checkUnmanagedNicAndNetworkForImport(nic, networkVO, zone, owner, true);
-                            network = networkVO;
-                        } catch (Exception e) {
-                        }
-                        if (network != null) {
-                            checkUnmanagedNicAndNetworkHostnameForImport(nic, network, hostName);
-                            checkUnmanagedNicIpAndNetworkForImport(nic, network, ipAddresses);
-                            break;
-                        }
-                    }
-                }
-            } else {
-                network = networkDao.findById(callerNicNetworkMap.get(nic.getNicId()));
-                checkUnmanagedNicAndNetworkForImport(nic, network, zone, owner, false);
-                checkUnmanagedNicAndNetworkHostnameForImport(nic, network, hostName);
-                checkUnmanagedNicIpAndNetworkForImport(nic, network, ipAddresses);
-            }
-            if (network == null) {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Suitable network for nic(ID: %s) not found during VM import", nic.getNicId()));
-            }
-            nicNetworkMap.put(nic.getNicId(), network.getId());
-        }
-        return nicNetworkMap;
-    }
-
-    private Pair<DiskProfile, StoragePool> importDisk(UnmanagedInstanceTO.Disk disk, VirtualMachine vm, Cluster cluster, DiskOffering diskOffering,
-                                                      Volume.Type type, String name, Long diskSize, Long minIops, Long maxIops, VirtualMachineTemplate template,
-                                                      Account owner, Long deviceId) {
-        final DataCenter zone = dataCenterDao.findById(vm.getDataCenterId());
-        final String path = Strings.isNullOrEmpty(disk.getFileBaseName()) ? disk.getImagePath() : disk.getFileBaseName();
-        String chainInfo = disk.getChainInfo();
-        if (Strings.isNullOrEmpty(chainInfo)) {
-            VirtualMachineDiskInfo diskInfo = new VirtualMachineDiskInfo();
-            diskInfo.setDiskDeviceBusName(String.format("%s%d:%d", disk.getController(), disk.getControllerUnit(), disk.getPosition()));
-            diskInfo.setDiskChain(new String[]{disk.getImagePath()});
-            chainInfo = gson.toJson(diskInfo);
-        }
-        StoragePool storagePool = getStoragePool(disk, zone, cluster);
-        DiskProfile profile = volumeManager.importVolume(type, name, diskOffering, diskSize,
-                minIops, maxIops, vm, template, owner, deviceId, storagePool.getId(), path, chainInfo);
-
-        return new Pair<DiskProfile, StoragePool>(profile, storagePool);
-    }
-
-    private NicProfile importNic(UnmanagedInstanceTO.Nic nic, VirtualMachine vm, Network network, Network.IpAddresses ipAddresses, boolean isDefaultNic) throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException {
-        Pair<NicProfile, Integer> result = networkOrchestrationService.importNic(nic.getMacAddress(), 0, network, isDefaultNic, vm, ipAddresses);
-        if (result == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("NIC ID: %s import failed", nic.getNicId()));
-        }
-        return result.first();
-    }
-
-    private void cleanupFailedImportVM(final UserVm userVm) {
-        if (userVm == null) {
-            return;
-        }
-        VirtualMachineProfile profile = new VirtualMachineProfileImpl(userVm);
-        // Remove all volumes
-        volumeDao.deleteVolumesByInstance(userVm.getId());
-        // Remove all nics
-        try {
-            networkOrchestrationService.release(profile, true);
-        } catch (Exception e) {
-            LOGGER.error(String.format("Unable to release NICs for unsuccessful import unmanaged VM: %s", userVm.getInstanceName()), e);
-            nicDao.removeNicsForInstance(userVm.getId());
-        }
-        // Remove vm
-        vmDao.remove(userVm.getId());
-    }
-
-    private UserVm migrateImportedVM(HostVO sourceHost, VirtualMachineTemplate template, ServiceOfferingVO serviceOffering, UserVm userVm, final Account owner, List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList) {
-        UserVm vm = userVm;
-        if (vm == null) {
-            LOGGER.error(String.format("Failed to check migrations need during VM import"));
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to check migrations need during VM import"));
-        }
-        if (sourceHost == null || serviceOffering == null || diskProfileStoragePoolList == null) {
-            LOGGER.error(String.format("Failed to check migrations need during import, VM: %s", userVm.getInstanceName()));
-            cleanupFailedImportVM(vm);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to check migrations need during import, VM: %s", userVm.getInstanceName()));
-        }
-        if (!hostSupportsServiceOffering(sourceHost, serviceOffering)) {
-            LOGGER.debug(String.format("VM %s needs to be migrated", vm.getUuid()));
-            final VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm, template, serviceOffering, owner, null);
-            DeploymentPlanner.ExcludeList excludeList = new DeploymentPlanner.ExcludeList();
-            excludeList.addHost(sourceHost.getId());
-            final DataCenterDeployment plan = new DataCenterDeployment(sourceHost.getDataCenterId(), sourceHost.getPodId(), sourceHost.getClusterId(), null, null, null);
-            DeployDestination dest = null;
-            try {
-                dest = deploymentPlanningManager.planDeployment(profile, plan, excludeList, null);
-            } catch (Exception e) {
-                LOGGER.warn(String.format("VM import failed for unmanaged vm: %s during vm migration, finding deployment destination", vm.getInstanceName()), e);
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration, finding deployment destination", vm.getInstanceName()));
-            }
-            if (dest != null) {
-                if (LOGGER.isDebugEnabled()) {
-                    LOGGER.debug(" Found " + dest + " for migrating the vm to");
-                }
-            }
-            if (dest == null) {
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration, no deployment destination found", vm.getInstanceName()));
-            }
-            try {
-                if (vm.getState().equals(VirtualMachine.State.Stopped)) {
-                    VMInstanceVO vmInstanceVO = vmDao.findById(userVm.getId());
-                    vmInstanceVO.setHostId(dest.getHost().getId());
-                    vmInstanceVO.setLastHostId(dest.getHost().getId());
-                    vmDao.update(vmInstanceVO.getId(), vmInstanceVO);
-                } else {
-                    virtualMachineManager.migrate(vm.getUuid(), sourceHost.getId(), dest);
-                }
-                vm = userVmManager.getUserVm(vm.getId());
-            } catch (Exception e) {
-                LOGGER.error(String.format("VM import failed for unmanaged vm: %s during vm migration", vm.getInstanceName()), e);
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during vm migration. %s", userVm.getInstanceName(), e.getMessage()));
-            }
-        }
-        for (Pair<DiskProfile, StoragePool> diskProfileStoragePool : diskProfileStoragePoolList) {
-            if (diskProfileStoragePool == null ||
-                    diskProfileStoragePool.first() == null ||
-                    diskProfileStoragePool.second() == null) {
-                continue;
-            }
-            DiskProfile profile = diskProfileStoragePool.first();
-            DiskOffering dOffering = diskOfferingDao.findById(profile.getDiskOfferingId());
-            if (dOffering == null) {
-                continue;
-            }
-            VolumeVO volumeVO = volumeDao.findById(profile.getVolumeId());
-            if (volumeVO == null) {
-                continue;
-            }
-            boolean poolSupportsOfferings = storagePoolSupportsDiskOffering(diskProfileStoragePool.second(), dOffering);
-            if (poolSupportsOfferings && profile.getType() == Volume.Type.ROOT) {
-                poolSupportsOfferings = storagePoolSupportsServiceOffering(diskProfileStoragePool.second(), serviceOffering);
-            }
-            if (poolSupportsOfferings) {
-                continue;
-            }
-            LOGGER.debug(String.format("Volume %s needs to be migrated", volumeVO.getUuid()));
-            Pair<List<? extends StoragePool>, List<? extends StoragePool>> poolsPair = managementService.listStoragePoolsForMigrationOfVolume(profile.getVolumeId());
-            if (CollectionUtils.isEmpty(poolsPair.first()) && CollectionUtils.isEmpty(poolsPair.second())) {
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume ID: %s migration as no suitable pool(s) found", userVm.getInstanceName(), volumeVO.getUuid()));
-            }
-            List<? extends StoragePool> storagePools = poolsPair.second();
-            StoragePool storagePool = null;
-            if (CollectionUtils.isNotEmpty(storagePools)) {
-                for (StoragePool pool : storagePools) {
-                    if (diskProfileStoragePool.second().getId() != pool.getId() &&
-                            storagePoolSupportsDiskOffering(pool, dOffering) &&
-                            (!profile.getType().equals(Volume.Type.ROOT) ||
-                                    profile.getType().equals(Volume.Type.ROOT) && storagePoolSupportsServiceOffering(pool, serviceOffering))) {
-                        storagePool = pool;
-                        break;
-                    }
-                }
-            }
-            // For zone-wide pools, at times, suitable storage pools are not returned therefore consider all pools.
-            if (storagePool == null && CollectionUtils.isNotEmpty(poolsPair.first())) {
-                storagePools = poolsPair.first();
-                for (StoragePool pool : storagePools) {
-                    if (diskProfileStoragePool.second().getId() != pool.getId() &&
-                            storagePoolSupportsDiskOffering(pool, dOffering) &&
-                            (!profile.getType().equals(Volume.Type.ROOT) ||
-                                    profile.getType().equals(Volume.Type.ROOT) && storagePoolSupportsServiceOffering(pool, serviceOffering))) {
-                        storagePool = pool;
-                        break;
-                    }
-                }
-            }
-            if (storagePool == null) {
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume ID: %s migration as no suitable pool found", userVm.getInstanceName(), volumeVO.getUuid()));
-            } else {
-                LOGGER.debug(String.format("Found storage pool %s(%s) for migrating the volume %s to", storagePool.getName(), storagePool.getUuid(), volumeVO.getUuid()));
-            }
-            try {
-                Volume volume = null;
-                if (vm.getState().equals(VirtualMachine.State.Running)) {
-                    volume = volumeManager.liveMigrateVolume(volumeVO, storagePool);
-                } else {
-                    volume = volumeManager.migrateVolume(volumeVO, storagePool);
-                }
-                if (volume == null) {
-                    String msg = "";
-                    if (vm.getState().equals(VirtualMachine.State.Running)) {
-                        msg = String.format("Live migration for volume ID: %s to destination pool ID: %s failed", volumeVO.getUuid(), storagePool.getUuid());
-                    } else {
-                        msg = String.format("Migration for volume ID: %s to destination pool ID: %s failed", volumeVO.getUuid(), storagePool.getUuid());
-                    }
-                    LOGGER.error(msg);
-                    throw new CloudRuntimeException(msg);
-                }
-            } catch (Exception e) {
-                LOGGER.error(String.format("VM import failed for unmanaged vm: %s during volume migration", vm.getInstanceName()), e);
-                cleanupFailedImportVM(vm);
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm: %s during volume migration. %s", userVm.getInstanceName(), Strings.nullToEmpty(e.getMessage())));
-            }
-        }
-        return userVm;
-    }
-
-    private void publishVMUsageUpdateResourceCount(final UserVm userVm, ServiceOfferingVO serviceOfferingVO) {
-        if (userVm == null || serviceOfferingVO == null) {
-            LOGGER.error("Failed to publish usage records during VM import");
-            cleanupFailedImportVM(userVm);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm during publishing usage records"));
-        }
-        try {
-            if (!serviceOfferingVO.isDynamic()) {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_IMPORT, userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), userVm.getHostName(), serviceOfferingVO.getId(), userVm.getTemplateId(),
-                        userVm.getHypervisorType().toString(), VirtualMachine.class.getName(), userVm.getUuid(), userVm.isDisplayVm());
-            } else {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_IMPORT, userVm.getAccountId(), userVm.getAccountId(), userVm.getDataCenterId(), userVm.getHostName(), serviceOfferingVO.getId(), userVm.getTemplateId(),
-                        userVm.getHypervisorType().toString(), VirtualMachine.class.getName(), userVm.getUuid(), userVm.getDetails(), userVm.isDisplayVm());
-            }
-        } catch (Exception e) {
-            LOGGER.error(String.format("Failed to publish usage records during VM import for unmanaged vm %s", userVm.getInstanceName()), e);
-            cleanupFailedImportVM(userVm);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed for unmanaged vm %s during publishing usage records", userVm.getInstanceName()));
-        }
-        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.user_vm, userVm.isDisplayVm());
-        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.cpu, userVm.isDisplayVm(), new Long(serviceOfferingVO.getCpu()));
-        resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.memory, userVm.isDisplayVm(), new Long(serviceOfferingVO.getRamSize()));
-        // Save usage event and update resource count for user vm volumes
-        List<VolumeVO> volumes = volumeDao.findByInstance(userVm.getId());
-        for (VolumeVO volume : volumes) {
-            try {
-                UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), null, volume.getSize(),
-                        Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume());
-            } catch (Exception e) {
-                LOGGER.error(String.format("Failed to publish volume ID: %s usage records during VM import", volume.getUuid()), e);
-            }
-            resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.volume, volume.isDisplayVolume());
-            resourceLimitService.incrementResourceCount(userVm.getAccountId(), Resource.ResourceType.primary_storage, volume.isDisplayVolume(), volume.getSize());
-        }
-    }
-
-    private UserVm importVirtualMachineInternal(final UnmanagedInstanceTO unmanagedInstance, final String instanceName, final DataCenter zone, final Cluster cluster, final HostVO host,
-                                                final VirtualMachineTemplate template, final String displayName, final String hostName, final Account caller, final Account owner, final Long userId,
-                                                final ServiceOfferingVO serviceOffering, final Map<String, Long> dataDiskOfferingMap,
-                                                final Map<String, Long> nicNetworkMap, final Map<String, Network.IpAddresses> callerNicIpAddressMap,
-                                                final Map<String, String> details, final boolean migrateAllowed) {
-        UserVm userVm = null;
-
-        ServiceOfferingVO validatedServiceOffering = null;
-        try {
-            validatedServiceOffering = getUnmanagedInstanceServiceOffering(unmanagedInstance, serviceOffering, owner, zone, details);
-        } catch (Exception e) {
-            LOGGER.error("Service offering for VM import not compatible", e);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import VM: %s. %s", unmanagedInstance.getName(), Strings.nullToEmpty(e.getMessage())));
-        }
-
-        Map<String, String> allDetails = new HashMap<>(details);
-        if (validatedServiceOffering.isDynamic()) {
-            allDetails.put(VmDetailConstants.CPU_NUMBER, String.valueOf(validatedServiceOffering.getCpu()));
-            allDetails.put(VmDetailConstants.MEMORY, String.valueOf(validatedServiceOffering.getRamSize()));
-            if (serviceOffering.getSpeed() == null) {
-                allDetails.put(VmDetailConstants.CPU_SPEED, String.valueOf(validatedServiceOffering.getSpeed()));
-            }
-        }
-
-        if (!migrateAllowed && !hostSupportsServiceOffering(host, validatedServiceOffering)) {
-            throw new InvalidParameterValueException(String.format("Service offering: %s is not compatible with host: %s of unmanaged VM: %s", serviceOffering.getUuid(), host.getUuid(), instanceName));
-        }
-        // Check disks and supplied disk offerings
-        List<UnmanagedInstanceTO.Disk> unmanagedInstanceDisks = unmanagedInstance.getDisks();
-        if (CollectionUtils.isEmpty(unmanagedInstanceDisks)) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("No attached disks found for the unmanaged VM: %s", instanceName));
-        }
-        Pair<UnmanagedInstanceTO.Disk, List<UnmanagedInstanceTO.Disk>> rootAndDataDisksPair = getRootAndDataDisks(unmanagedInstanceDisks, dataDiskOfferingMap);
-        final UnmanagedInstanceTO.Disk rootDisk = rootAndDataDisksPair.first();
-        final List<UnmanagedInstanceTO.Disk> dataDisks = rootAndDataDisksPair.second();
-        if (rootDisk == null || Strings.isNullOrEmpty(rootDisk.getController())) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM import failed. Unable to retrieve root disk details for VM: %s ", instanceName));
-        }
-        allDetails.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDisk.getController());
-        try {
-            checkUnmanagedDiskAndOfferingForImport(rootDisk, null, validatedServiceOffering, owner, zone, cluster, migrateAllowed);
-            if (CollectionUtils.isNotEmpty(dataDisks)) { // Data disk(s) present
-                checkUnmanagedDiskAndOfferingForImport(dataDisks, dataDiskOfferingMap, owner, zone, cluster, migrateAllowed);
-                allDetails.put(VmDetailConstants.DATA_DISK_CONTROLLER, dataDisks.get(0).getController());
-            }
-            resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.volume, unmanagedInstanceDisks.size());
-        } catch (ResourceAllocationException e) {
-            LOGGER.error(String.format("Volume resource allocation error for owner: %s", owner.getUuid()), e);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Volume resource allocation error for owner: %s. %s", owner.getUuid(), Strings.nullToEmpty(e.getMessage())));
-        }
-        // Check NICs and supplied networks
-        Map<String, Network.IpAddresses> nicIpAddressMap = getNicIpAddresses(unmanagedInstance.getNics(), callerNicIpAddressMap);
-        Map<String, Long> allNicNetworkMap = getUnmanagedNicNetworkMap(unmanagedInstance.getNics(), nicNetworkMap, nicIpAddressMap, zone, hostName, owner);
-        if (!CollectionUtils.isEmpty(unmanagedInstance.getNics())) {
-            allDetails.put(VmDetailConstants.NIC_ADAPTER, unmanagedInstance.getNics().get(0).getAdapterType());
-        }
-        VirtualMachine.PowerState powerState = VirtualMachine.PowerState.PowerOff;
-        if (unmanagedInstance.getPowerState().equals(UnmanagedInstanceTO.PowerState.PowerOn)) {
-            powerState = VirtualMachine.PowerState.PowerOn;
-        }
-        try {
-            userVm = userVmManager.importVM(zone, host, template, instanceName, displayName, owner,
-                    null, caller, true, null, owner.getAccountId(), userId,
-                    validatedServiceOffering, null, hostName,
-                    cluster.getHypervisorType(), allDetails, powerState);
-        } catch (InsufficientCapacityException ice) {
-            LOGGER.error(String.format("Failed to import vm name: %s", instanceName), ice);
-            throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ice.getMessage());
-        }
-        if (userVm == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import vm name: %s", instanceName));
-        }
-        List<Pair<DiskProfile, StoragePool>> diskProfileStoragePoolList = new ArrayList<>();
-        try {
-            if (rootDisk.getCapacity() == null || rootDisk.getCapacity() == 0) {
-                throw new InvalidParameterValueException(String.format("Root disk ID: %s size is invalid", rootDisk.getDiskId()));
-            }
-            Long minIops = null;
-            if (details.containsKey("minIops")) {
-                minIops = Long.parseLong(details.get("minIops"));
-            }
-            Long maxIops = null;
-            if (details.containsKey("maxIops")) {
-                maxIops = Long.parseLong(details.get("maxIops"));
-            }
-            diskProfileStoragePoolList.add(importDisk(rootDisk, userVm, cluster, serviceOffering, Volume.Type.ROOT, String.format("ROOT-%d", userVm.getId()),
-                    (rootDisk.getCapacity() / Resource.ResourceType.bytesToGiB), minIops, maxIops,
-                    template, owner, null));
-            for (UnmanagedInstanceTO.Disk disk : dataDisks) {
-                if (disk.getCapacity() == null || disk.getCapacity() == 0) {
-                    throw new InvalidParameterValueException(String.format("Disk ID: %s size is invalid", rootDisk.getDiskId()));
-                }
-                DiskOffering offering = diskOfferingDao.findById(dataDiskOfferingMap.get(disk.getDiskId()));
-                diskProfileStoragePoolList.add(importDisk(disk, userVm, cluster, offering, Volume.Type.DATADISK, String.format("DATA-%d-%s", userVm.getId(), disk.getDiskId()),
-                        (disk.getCapacity() / Resource.ResourceType.bytesToGiB), offering.getMinIops(), offering.getMaxIops(),
-                        template, owner, null));
-            }
-        } catch (Exception e) {
-            LOGGER.error(String.format("Failed to import volumes while importing vm: %s", instanceName), e);
-            cleanupFailedImportVM(userVm);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import volumes while importing vm: %s. %s", instanceName, Strings.nullToEmpty(e.getMessage())));
-        }
-        try {
-            boolean firstNic = true;
-            for (UnmanagedInstanceTO.Nic nic : unmanagedInstance.getNics()) {
-                Network network = networkDao.findById(allNicNetworkMap.get(nic.getNicId()));
-                Network.IpAddresses ipAddresses = nicIpAddressMap.get(nic.getNicId());
-                importNic(nic, userVm, network, ipAddresses, firstNic);
-                firstNic = false;
-            }
-        } catch (Exception e) {
-            LOGGER.error(String.format("Failed to import NICs while importing vm: %s", instanceName), e);
-            cleanupFailedImportVM(userVm);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to import NICs while importing vm: %s. %s", instanceName, Strings.nullToEmpty(e.getMessage())));
-        }
-        if (migrateAllowed) {
-            userVm = migrateImportedVM(host, template, validatedServiceOffering, userVm, owner, diskProfileStoragePoolList);
-        }
-        publishVMUsageUpdateResourceCount(userVm, validatedServiceOffering);
-        return userVm;
-    }
-
-    @Override
-    public ListResponse<UnmanagedInstanceResponse> listUnmanagedInstances(ListUnmanagedInstancesCmd cmd) {
-        final Account caller = CallContext.current().getCallingAccount();
-        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
-            throw new PermissionDeniedException(String.format("Cannot perform this operation, Calling account is not root admin: %s", caller.getUuid()));
-        }
-        final Long clusterId = cmd.getClusterId();
-        if (clusterId == null) {
-            throw new InvalidParameterValueException(String.format("Cluster ID cannot be null"));
-        }
-        final Cluster cluster = clusterDao.findById(clusterId);
-        if (cluster == null) {
-            throw new InvalidParameterValueException(String.format("Cluster ID: %d cannot be found", clusterId));
-        }
-        if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
-            throw new InvalidParameterValueException(String.format("VM ingestion is currently not supported for hypervisor: %s", cluster.getHypervisorType().toString()));
-        }
-        List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
-        List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
-        List<UnmanagedInstanceResponse> responses = new ArrayList<>();
-        for (HostVO host : hosts) {
-            if (host.isInMaintenanceStates()) {
-                continue;
-            }
-            List<String> managedVms = new ArrayList<>();
-            managedVms.addAll(additionalNameFilters);
-            managedVms.addAll(getHostManagedVms(host));
-
-            GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand();
-            command.setInstanceName(cmd.getName());
-            command.setManagedInstancesNames(managedVms);
-            Answer answer = agentManager.easySend(host.getId(), command);
-            if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
-                continue;
-            }
-            GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
-            HashMap<String, UnmanagedInstanceTO> unmanagedInstances = new HashMap<>();
-            unmanagedInstances.putAll(unmanagedInstancesAnswer.getUnmanagedInstances());
-            Set<String> keys = unmanagedInstances.keySet();
-            for (String key : keys) {
-                responses.add(createUnmanagedInstanceResponse(unmanagedInstances.get(key), cluster, host));
-            }
-        }
-        ListResponse<UnmanagedInstanceResponse> listResponses = new ListResponse<>();
-        listResponses.setResponses(responses, responses.size());
-        return listResponses;
-    }
-
-    @Override
-    public UserVmResponse importUnmanagedInstance(ImportUnmanagedInstanceCmd cmd) {
-        final Account caller = CallContext.current().getCallingAccount();
-        if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
-            throw new PermissionDeniedException(String.format("Cannot perform this operation, Calling account is not root admin: %s", caller.getUuid()));
-        }
-        final Long clusterId = cmd.getClusterId();
-        if (clusterId == null) {
-            throw new InvalidParameterValueException(String.format("Cluster ID cannot be null"));
-        }
-        final Cluster cluster = clusterDao.findById(clusterId);
-        if (cluster == null) {
-            throw new InvalidParameterValueException(String.format("Cluster ID: %d cannot be found", clusterId));
-        }
-        if (cluster.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
-            throw new InvalidParameterValueException(String.format("VM import is currently not supported for hypervisor: %s", cluster.getHypervisorType().toString()));
-        }
-        final DataCenter zone = dataCenterDao.findById(cluster.getDataCenterId());
-        final String instanceName = cmd.getName();
-        if (Strings.isNullOrEmpty(instanceName)) {
-            throw new InvalidParameterValueException(String.format("Instance name cannot be empty"));
-        }
-        if (cmd.getDomainId() != null && Strings.isNullOrEmpty(cmd.getAccountName())) {
-            throw new InvalidParameterValueException("domainid parameter must be specified with account parameter");
-        }
-        final Account owner = accountService.getActiveAccountById(cmd.getEntityOwnerId());
-        long userId = CallContext.current().getCallingUserId();
-        List<UserVO> userVOs = userDao.listByAccount(owner.getAccountId());
-        if (CollectionUtils.isNotEmpty(userVOs)) {
-            userId = userVOs.get(0).getId();
-        }
-        VMTemplateVO template = null;
-        final Long templateId = cmd.getTemplateId();
-        if (templateId == null) {
-            template = templateDao.findByName(VM_IMPORT_DEFAULT_TEMPLATE_NAME);
-            if (template == null) {
-                template = createDefaultDummyVmImportTemplate();
-                if (template == null) {
-                    throw new InvalidParameterValueException(String.format("Default VM import template with unique name: %s for hypervisor: %s cannot be created. Please use templateid paramter for import", VM_IMPORT_DEFAULT_TEMPLATE_NAME, cluster.getHypervisorType().toString()));
-                }
-            }
-        } else {
-            template = templateDao.findById(templateId);
-        }
-        if (template == null) {
-            throw new InvalidParameterValueException(String.format("Template ID: %d cannot be found", templateId));
-        }
-        final Long serviceOfferingId = cmd.getServiceOfferingId();
-        if (serviceOfferingId == null) {
-            throw new InvalidParameterValueException(String.format("Service offering ID cannot be null"));
-        }
-        final ServiceOfferingVO serviceOffering = serviceOfferingDao.findById(serviceOfferingId);
-        if (serviceOffering == null) {
-            throw new InvalidParameterValueException(String.format("Service offering ID: %d cannot be found", serviceOfferingId));
-        }
-        accountService.checkAccess(owner, serviceOffering, zone);
-        try {
-            resourceLimitService.checkResourceLimit(owner, Resource.ResourceType.user_vm, 1);
-        } catch (ResourceAllocationException e) {
-            LOGGER.error(String.format("VM resource allocation error for account: %s", owner.getUuid()), e);
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("VM resource allocation error for account: %s. %s", owner.getUuid(), Strings.nullToEmpty(e.getMessage())));
-        }
-        String displayName = cmd.getDisplayName();
-        if (Strings.isNullOrEmpty(displayName)) {
-            displayName = instanceName;
-        }
-        String hostName = cmd.getHostName();
-        if (Strings.isNullOrEmpty(hostName)) {
-            if (!NetUtils.verifyDomainNameLabel(instanceName, true)) {
-                throw new InvalidParameterValueException(String.format("Please provide hostname for the VM. VM name contains unsupported characters for it to be used as hostname"));
-            }
-            hostName = instanceName;
-        }
-        if (!NetUtils.verifyDomainNameLabel(hostName, true)) {
-            throw new InvalidParameterValueException("Invalid VM hostname. VM hostname can contain ASCII letters 'a' through 'z', the digits '0' through '9', "
-                    + "and the hyphen ('-'), must be between 1 and 63 characters long, and can't start or end with \"-\" and can't start with digit");
-        }
-        if (cluster.getHypervisorType().equals(Hypervisor.HypervisorType.VMware) &&
-                Boolean.parseBoolean(configurationDao.getValue(Config.SetVmInternalNameUsingDisplayName.key()))) {
-            // If global config vm.instancename.flag is set to true, then CS will set guest VM's name as it appears on the hypervisor, to its hostname.
-            // In case of VMware since VM name must be unique within a DC, check if VM with the same hostname already exists in the zone.
-            VMInstanceVO vmByHostName = vmDao.findVMByHostNameInZone(hostName, zone.getId());
-            if (vmByHostName != null && vmByHostName.getState() != VirtualMachine.State.Expunging) {
-                throw new InvalidParameterValueException(String.format("Failed to import VM: %s. There already exists a VM by the hostname: %s in zone: %s", instanceName, hostName, zone.getUuid()));
-            }
-        }
-        final Map<String, Long> nicNetworkMap = cmd.getNicNetworkList();
-        final Map<String, Network.IpAddresses> nicIpAddressMap = cmd.getNicIpAddressList();
-        final Map<String, Long> dataDiskOfferingMap = cmd.getDataDiskToDiskOfferingList();
-        final Map<String, String> details = cmd.getDetails();
-        List<HostVO> hosts = resourceManager.listHostsInClusterByStatus(clusterId, Status.Up);
-        UserVm userVm = null;
-        List<String> additionalNameFilters = getAdditionalNameFilters(cluster);
-        for (HostVO host : hosts) {
-            if (host.isInMaintenanceStates()) {
-                continue;
-            }
-            List<String> managedVms = new ArrayList<>();
-            managedVms.addAll(additionalNameFilters);
-            managedVms.addAll(getHostManagedVms(host));
-            GetUnmanagedInstancesCommand command = new GetUnmanagedInstancesCommand(instanceName);
-            command.setManagedInstancesNames(managedVms);
-            Answer answer = agentManager.easySend(host.getId(), command);
-            if (!(answer instanceof GetUnmanagedInstancesAnswer)) {
-                continue;
-            }
-            GetUnmanagedInstancesAnswer unmanagedInstancesAnswer = (GetUnmanagedInstancesAnswer) answer;
-            HashMap<String, UnmanagedInstanceTO> unmanagedInstances = unmanagedInstancesAnswer.getUnmanagedInstances();
-            if (MapUtils.isEmpty(unmanagedInstances)) {
-                continue;
-            }
-            Set<String> names = unmanagedInstances.keySet();
-            for (String name : names) {
-                if (instanceName.equals(name)) {
-                    UnmanagedInstanceTO unmanagedInstance = unmanagedInstances.get(name);
-                    if (unmanagedInstance == null) {
-                        throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve details for unmanaged VM: %s", name));
-                    }
-                    if (template.getName().equals(VM_IMPORT_DEFAULT_TEMPLATE_NAME)) {
-                        String osName = unmanagedInstance.getOperatingSystem();
-                        GuestOS guestOS = null;
-                        if (!Strings.isNullOrEmpty(osName)) {
-                            guestOS = guestOSDao.listByDisplayName(osName);
-                        }
-                        GuestOSHypervisor guestOSHypervisor = null;
-                        if (guestOS != null) {
-                            guestOSHypervisor = guestOSHypervisorDao.findByOsIdAndHypervisor(guestOS.getId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
-                        }
-                        if (guestOSHypervisor == null && !Strings.isNullOrEmpty(unmanagedInstance.getOperatingSystemId())) {
-                            guestOSHypervisor = guestOSHypervisorDao.findByOsNameAndHypervisor(unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion());
-                        }
-                        if (guestOSHypervisor == null) {
-                            if (guestOS != null) {
-                                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to find hypervisor guest OS ID: %s details for unmanaged VM: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", guestOS.getUuid(), name, host.getHypervisorType().toString(), host.getHypervisorVersion()));
-                            }
-                            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Unable to retrieve guest OS details for unmanaged VM: %s with OS name: %s, OS ID: %s for hypervisor: %s version: %s. templateid parameter can be used to assign template for VM", name, osName, unmanagedInstance.getOperatingSystemId(), host.getHypervisorType().toString(), host.getHypervisorVersion()));
-                        }
-                        template.setGuestOSId(guestOSHypervisor.getGuestOsId());
-                    }
-                    userVm = importVirtualMachineInternal(unmanagedInstance, instanceName, zone, cluster, host,
-                            template, displayName, hostName, caller, owner, userId,
-                            serviceOffering, dataDiskOfferingMap,
-                            nicNetworkMap, nicIpAddressMap,
-                            details, cmd.getMigrateAllowed());
-                    break;
-                }
-            }
-            if (userVm != null) {
-                break;
-            }
-        }
-        if (userVm == null) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, String.format("Failed to find unmanaged vm with name: %s in cluster: %s", instanceName, cluster.getUuid()));
-        }
-        return responseGenerator.createUserVmResponse(ResponseObject.ResponseView.Full, "virtualmachine", userVm).get(0);
-    }
-
-    @Override
-    public List<Class<?>> getCommands() {
-        final List<Class<?>> cmdList = new ArrayList<Class<?>>();
-        cmdList.add(ListUnmanagedInstancesCmd.class);
-        cmdList.add(ImportUnmanagedInstanceCmd.class);
-        return cmdList;
-    }
-}
diff --git a/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java b/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java
index 4ff5fa2..24bc501 100644
--- a/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java
+++ b/server/src/main/java/org/cloud/network/router/deployment/RouterDeploymentDefinition.java
@@ -54,6 +54,7 @@
 import com.cloud.network.dao.UserIpv6AddressDao;
 import com.cloud.network.dao.VirtualRouterProviderDao;
 import com.cloud.network.router.NetworkHelper;
+import com.cloud.network.router.VirtualNetworkApplianceManager;
 import com.cloud.network.router.VirtualRouter.Role;
 import com.cloud.network.vpc.Vpc;
 import com.cloud.offering.ServiceOffering;
@@ -389,9 +390,35 @@
         serviceOfferingId = serviceOffering.getId();
     }
 
+    protected void findAccountServiceOfferingId(long accountId) {
+        String accountRouterOffering = VirtualNetworkApplianceManager.VirtualRouterServiceOffering.valueIn(accountId);
+        String globalRouterOffering = VirtualNetworkApplianceManager.VirtualRouterServiceOffering.value();
+        if (accountRouterOffering != null) {
+            verifyServiceOfferingByUuid(accountRouterOffering);
+        }
+        if (serviceOfferingId == null && globalRouterOffering != accountRouterOffering) {
+            verifyServiceOfferingByUuid(globalRouterOffering);
+        }
+    }
+
+    private void verifyServiceOfferingByUuid(String offeringUuid) {
+        logger.debug("Verifying router service offering with uuid : " + offeringUuid);
+        ServiceOfferingVO serviceOffering = serviceOfferingDao.findByUuid(offeringUuid);
+        if (serviceOffering != null && serviceOffering.isSystemUse()) {
+            boolean isLocalStorage = ConfigurationManagerImpl.SystemVMUseLocalStorage.valueIn(dest.getDataCenter().getId());
+            if (isLocalStorage == serviceOffering.isUseLocalStorage()) {
+                logger.debug(String.format("Service offering %s (uuid: %s) will be used on virtual router", serviceOffering.getName(), serviceOffering.getUuid()));
+                serviceOfferingId = serviceOffering.getId();
+            }
+        }
+    }
+
     protected void findServiceOfferingId() {
         serviceOfferingId = networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId();
         if (serviceOfferingId == null) {
+            findAccountServiceOfferingId(guestNetwork.getAccountId());
+        }
+        if (serviceOfferingId == null) {
             findDefaultServiceOfferingId();
         }
     }
@@ -482,4 +509,4 @@
 
         return needReset;
     }
-}
\ No newline at end of file
+}
diff --git a/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java b/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java
index f584918..91efece 100644
--- a/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java
+++ b/server/src/main/java/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java
@@ -160,6 +160,9 @@
     protected void findServiceOfferingId() {
         serviceOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
         if (serviceOfferingId == null) {
+            findAccountServiceOfferingId(vpc.getAccountId());
+        }
+        if (serviceOfferingId == null) {
             findDefaultServiceOfferingId();
         }
     }
diff --git a/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 1c90a97..672f7c0 100644
--- a/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/src/main/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -39,6 +39,8 @@
 
     <bean id="roleManagerImpl" class="org.apache.cloudstack.acl.RoleManagerImpl" />
 
+    <bean id="projRoleManagerImpl" class="org.apache.cloudstack.acl.ProjectRoleManagerImpl" />
+
     <bean id="accountManagerImpl" class="com.cloud.user.AccountManagerImpl">
         <property name="userAuthenticators"
             value="#{userAuthenticatorsRegistry.registered}" />
@@ -260,6 +262,8 @@
 
     <bean id="vMSnapshotManagerImpl" class="com.cloud.vm.snapshot.VMSnapshotManagerImpl" />
 
+    <bean id="imageStoreServiceImpl" class="com.cloud.storage.ImageStoreServiceImpl" />
+
     <bean id="AffinityGroupServiceImpl"
         class="org.apache.cloudstack.affinity.AffinityGroupServiceImpl">
         <property name="affinityGroupProcessors"
diff --git a/server/src/main/resources/META-INF/cloudstack/server-compute/spring-server-compute-context.xml b/server/src/main/resources/META-INF/cloudstack/server-compute/spring-server-compute-context.xml
index ca707a0..0215abf 100644
--- a/server/src/main/resources/META-INF/cloudstack/server-compute/spring-server-compute-context.xml
+++ b/server/src/main/resources/META-INF/cloudstack/server-compute/spring-server-compute-context.xml
@@ -35,6 +35,6 @@
         <property name="name" value="LXCGuru" />
     </bean>
 
-    <bean id="vmImportService" class="org.apache.cloudstack.vm.VmImportManagerImpl" />
+    <bean id="vmImportService" class="org.apache.cloudstack.vm.UnmanagedVMsManagerImpl" />
 
 </beans>
diff --git a/server/src/test/java/com/cloud/api/query/dao/TemplateJoinDaoImplTest.java b/server/src/test/java/com/cloud/api/query/dao/TemplateJoinDaoImplTest.java
index a6b33ed..d4cbf91 100755
--- a/server/src/test/java/com/cloud/api/query/dao/TemplateJoinDaoImplTest.java
+++ b/server/src/test/java/com/cloud/api/query/dao/TemplateJoinDaoImplTest.java
@@ -115,5 +115,4 @@
         ReflectionTestUtils.setField(template, "detailName", detailName);
         ReflectionTestUtils.setField(template, "detailValue", detailValue);
     }
-
 }
\ No newline at end of file
diff --git a/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java b/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java
index e695329..3d18d1a 100644
--- a/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java
+++ b/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java
@@ -24,6 +24,7 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -56,6 +57,7 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
 
 import com.cloud.api.query.dao.NetworkOfferingJoinDao;
 import com.cloud.api.query.vo.NetworkOfferingJoinVO;
@@ -87,6 +89,7 @@
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkVO;
 import com.cloud.projects.ProjectManager;
+import com.cloud.storage.DiskOfferingVO;
 import com.cloud.storage.VolumeVO;
 import com.cloud.storage.dao.VolumeDao;
 import com.cloud.user.Account;
@@ -108,6 +111,7 @@
 
     private static final Logger s_logger = Logger.getLogger(ConfigurationManagerTest.class);
 
+    @Spy
     @InjectMocks
     ConfigurationManagerImpl configurationMgr = new ConfigurationManagerImpl();
 
@@ -163,11 +167,12 @@
     ImageStoreDao _imageStoreDao;
     @Mock
     ConfigurationDao _configDao;
+    @Mock
+    DiskOfferingVO diskOfferingVOMock;
 
     VlanVO vlan = new VlanVO(Vlan.VlanType.VirtualNetwork, "vlantag", "vlangateway", "vlannetmask", 1L, "iprange", 1L, 1L, null, null, null);
 
     private static final String MAXIMUM_DURATION_ALLOWED = "3600";
-
     @Mock
     Network network;
     @Mock
@@ -694,7 +699,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -712,7 +717,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -730,7 +735,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -744,7 +749,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -758,7 +763,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -776,7 +781,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(arrayList);
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -794,7 +799,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(arrayList);
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(new ArrayList<PhysicalNetworkVO>());
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -812,7 +817,7 @@
         Mockito.when(_vmInstanceDao.listByZoneId(anyLong())).thenReturn(new ArrayList<VMInstanceVO>());
         Mockito.when(_volumeDao.findByDc(anyLong())).thenReturn(new ArrayList<VolumeVO>());
         Mockito.when(_physicalNetworkDao.listByZone(anyLong())).thenReturn(arrayList);
-        Mockito.when(_imageStoreDao.findByScope(any(ZoneScope.class))).thenReturn(new ArrayList<ImageStoreVO>());
+        Mockito.when(_imageStoreDao.findByZone(any(ZoneScope.class), anyBoolean())).thenReturn(new ArrayList<ImageStoreVO>());
 
         configurationMgr.checkIfZoneIsDeletable(new Random().nextLong());
     }
@@ -938,4 +943,63 @@
     public void validateMaximumIopsAndBytesLengthTestDefaultLengthConfigs() {
         configurationMgr.validateMaximumIopsAndBytesLength(36000l, 36000l, 36000l, 36000l);
     }
+
+    @Test
+    public void shouldUpdateDiskOfferingTests(){
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyBoolean(), Mockito.anyString(), Mockito.anyString()));
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(Mockito.anyString(), nullable(String.class), nullable(Integer.class), nullable(Boolean.class), nullable(String.class), nullable(String.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(nullable(String.class), Mockito.anyString(), nullable(Integer.class), nullable(Boolean.class), nullable(String.class), nullable(String.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(nullable(String.class), nullable(String.class), Mockito.anyInt(), nullable(Boolean.class), nullable(String.class), nullable(String.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(nullable(String.class), nullable(String.class), nullable(int.class), Mockito.anyBoolean(), nullable(String.class), nullable(String.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateDiskOffering(nullable(String.class), nullable(String.class), nullable(int.class), nullable(Boolean.class), Mockito.anyString(), Mockito.anyString()));
+    }
+
+    @Test
+    public void shouldUpdateDiskOfferingTestFalse(){
+        Assert.assertFalse(configurationMgr.shouldUpdateDiskOffering(null, null, null, null, null, null));
+    }
+
+    @Test
+    public void shouldUpdateIopsRateParametersTestFalse() {
+        Assert.assertFalse(configurationMgr.shouldUpdateIopsRateParameters(null, null, null, null, null, null));
+    }
+
+    @Test
+    public void shouldUpdateIopsRateParametersTests(){
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong()));
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateIopsRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong()));
+    }
+
+    @Test
+    public void shouldUpdateBytesRateParametersTestFalse() {
+        Assert.assertFalse(configurationMgr.shouldUpdateBytesRateParameters(null, null, null, null, null, null));
+    }
+
+    @Test
+    public void shouldUpdateBytesRateParametersTests(){
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong()));
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong(), nullable(Long.class)));
+        Assert.assertTrue(configurationMgr.shouldUpdateBytesRateParameters(nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), nullable(Long.class), Mockito.anyLong()));
+    }
+
+    @Test
+    public void updateDiskOfferingTagsIfIsNotNullTestWhenTagsIsNull(){
+        Mockito.doNothing().when(configurationMgr).updateDiskOfferingTagsIfIsNotNull(null, diskOfferingVOMock);
+        this.configurationMgr.updateDiskOfferingTagsIfIsNotNull(null, diskOfferingVOMock);
+        Mockito.verify(configurationMgr, Mockito.times(1)).updateDiskOfferingTagsIfIsNotNull(null, diskOfferingVOMock);
+    }
+    @Test
+    public void updateDiskOfferingTagsIfIsNotNullTestWhenTagsIsNotNull(){
+        String tags = "tags";
+        Mockito.doNothing().when(configurationMgr).updateDiskOfferingTagsIfIsNotNull(tags, diskOfferingVOMock);
+        this.configurationMgr.updateDiskOfferingTagsIfIsNotNull(tags, diskOfferingVOMock);
+        Mockito.verify(configurationMgr, Mockito.times(1)).updateDiskOfferingTagsIfIsNotNull(tags, diskOfferingVOMock);
+    }
 }
diff --git a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
index a35cec5..6fd57fc 100644
--- a/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
+++ b/server/src/test/java/com/cloud/network/MockNetworkModelImpl.java
@@ -898,7 +898,7 @@
     }
 
     @Override
-    public List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId, String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows) {
+    public List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId, String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows, String hostname) {
         return null;
     }
 
diff --git a/server/src/test/java/com/cloud/network/NetworkModelTest.java b/server/src/test/java/com/cloud/network/NetworkModelTest.java
index cd24a0b..af14cbd 100644
--- a/server/src/test/java/com/cloud/network/NetworkModelTest.java
+++ b/server/src/test/java/com/cloud/network/NetworkModelTest.java
@@ -35,6 +35,7 @@
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.network.dao.PhysicalNetworkDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
 import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
@@ -90,6 +91,11 @@
     private static final long PHYSICAL_NETWORK_1_ID = 1L;
     private static final long PHYSICAL_NETWORK_2_ID = 2L;
 
+    private static final String IPV6_CIDR = "fd59:16ba:559b:243d::/64";
+    private static final String IPV6_GATEWAY = "fd59:16ba:559b:243d::1";
+    private static final String START_IPV6 = "fd59:16ba:559b:243d:0:0:0:2";
+    private static final String END_IPV6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff";
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -194,4 +200,67 @@
                 addProviderToPhysicalNetwork(anyLong(), eq(Provider.ConfigDrive.getName()), isNull(Long.class), isNull(List.class));
     }
 
+    @Test
+    public void checkIp6ParametersTestAllGood() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestCidr32() {
+        String ipv6cidr = "fd59:16ba:559b:243d::/32";
+        String endipv6 = "fd59:16ba:ffff:ffff:ffff:ffff:ffff:ffff";
+        networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestCidr63() {
+        String ipv6cidr = "fd59:16ba:559b:243d::/63";
+        String endipv6 = "fd59:16ba:559b:243d:ffff:ffff:ffff:ffff";
+        networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestCidr65() {
+        String ipv6cidr = "fd59:16ba:559b:243d::/65";
+        String endipv6 = "fd59:16ba:559b:243d:7fff:ffff:ffff:ffff";
+        networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestCidr120() {
+        String ipv6cidr = "fd59:16ba:559b:243d::/120";
+        String endipv6 = "fd59:16ba:559b:243d:0:0:0:ff";
+        networkModel.checkIp6Parameters(START_IPV6, endipv6, IPV6_GATEWAY,ipv6cidr);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullGateway() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,IPV6_CIDR);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullCidr() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, IPV6_GATEWAY,null);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void checkIp6ParametersTestNullCidrAndNulGateway() {
+        networkModel.checkIp6Parameters(START_IPV6, END_IPV6, null,null);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullStartIpv6() {
+        networkModel.checkIp6Parameters(null, END_IPV6, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullEndIpv6() {
+        networkModel.checkIp6Parameters(START_IPV6, null, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
+    @Test
+    public void checkIp6ParametersTestNullStartAndEndIpv6() {
+        networkModel.checkIp6Parameters(null, null, IPV6_GATEWAY,IPV6_CIDR);
+    }
+
 }
diff --git a/server/src/test/java/com/cloud/network/dao/NetworkDaoTest.java b/server/src/test/java/com/cloud/network/dao/NetworkDaoTest.java
index ca91869..ec7da94 100644
--- a/server/src/test/java/com/cloud/network/dao/NetworkDaoTest.java
+++ b/server/src/test/java/com/cloud/network/dao/NetworkDaoTest.java
@@ -52,4 +52,14 @@
         Assert.assertFalse(dao.isNetworkOverlappingRequestedPvlan(existingPrimaryVlan, existingSecondaryVlan, Network.PVlanType.Community,
                 existingPrimaryVlan, requestedVlan, Network.PVlanType.Community));
     }
+
+    public void testNetworkOverlappingVlanPvlanTrue() {
+        Assert.assertTrue(dao.isNetworkOverlappingRequestedPvlan(existingPrimaryVlan, existingSecondaryVlan, existingPrimaryVlan));
+        Assert.assertTrue(dao.isNetworkOverlappingRequestedPvlan(existingPrimaryVlan, existingSecondaryVlan, existingSecondaryVlan));
+    }
+
+    public void testNetworkOverlappingVlanPvlanFalse() {
+        Assert.assertFalse(dao.isNetworkOverlappingRequestedPvlan(existingPrimaryVlan, existingSecondaryVlan, requestedVlan));
+    }
+
 }
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 d4f96c9..5d206f4 100644
--- a/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java
+++ b/server/src/test/java/com/cloud/network/element/ConfigDriveNetworkElementTest.java
@@ -36,6 +36,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.context.CallContext;
 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.EndPoint;
@@ -83,6 +84,7 @@
 import com.cloud.storage.GuestOSVO;
 import com.cloud.storage.dao.GuestOSCategoryDao;
 import com.cloud.storage.dao.GuestOSDao;
+import com.cloud.user.Account;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateListener;
 import com.cloud.utils.fsm.StateMachine2;
@@ -100,6 +102,7 @@
 import com.google.common.collect.Maps;
 
 @RunWith(PowerMockRunner.class)
+@PrepareForTest(CallContext.class)
 public class ConfigDriveNetworkElementTest {
 
     public static final String CLOUD_ID = "xx";
@@ -146,6 +149,7 @@
     @Mock private UserVmVO virtualMachine;
     @Mock private IPAddressVO publicIp;
     @Mock private AgentManager agentManager;
+    @Mock private CallContext callContextMock;
 
     @InjectMocks private final ConfigDriveNetworkElement _configDrivesNetworkElement = new ConfigDriveNetworkElement();
     @InjectMocks @Spy private NetworkModelImpl _networkModel = new NetworkModelImpl();
@@ -157,7 +161,6 @@
         _configDrivesNetworkElement._networkModel = _networkModel;
 
         when(_dataStoreMgr.getImageStoreWithFreeCapacity(DATACENTERID)).thenReturn(dataStore);
-
         when(_ep.select(dataStore)).thenReturn(endpoint);
         when(_vmDao.findById(VMID)).thenReturn(virtualMachine);
         when(_dcDao.findById(DATACENTERID)).thenReturn(dataCenterVO);
@@ -173,6 +176,7 @@
         when(serviceOfferingVO.getDisplayText()).thenReturn(VMOFFERING);
         when(guestOSVO.getCategoryId()).thenReturn(0L);
         when(virtualMachine.getGuestOSId()).thenReturn(0L);
+        when(virtualMachine.getHostId()).thenReturn(0L);
         when(virtualMachine.getType()).thenReturn(VirtualMachine.Type.User);
         when(virtualMachine.getId()).thenReturn(VMID);
         when(virtualMachine.getServiceOfferingId()).thenReturn(SOID);
@@ -254,10 +258,12 @@
 
     @Test
     @SuppressWarnings("unchecked")
-    @PrepareForTest({ConfigDriveBuilder.class})
+    @PrepareForTest({ConfigDriveBuilder.class, CallContext.class})
     public void testAddPasswordAndUserData() throws Exception {
         PowerMockito.mockStatic(ConfigDriveBuilder.class);
-
+        PowerMockito.mockStatic(CallContext.class);
+        PowerMockito.when(CallContext.current()).thenReturn(callContextMock);
+        Mockito.doReturn(Mockito.mock(Account.class)).when(callContextMock).getCallingAccount();
         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");
 
@@ -273,11 +279,14 @@
         when(_userVmDetailsDao.findDetail(anyLong(), anyString())).thenReturn(userVmDetailVO);
         when(_ipAddressDao.findByAssociatedVmId(VMID)).thenReturn(publicIp);
         when(publicIp.getAddress()).thenReturn(new Ip("7.7.7.7"));
+        when(_hostDao.findById(virtualMachine.getHostId())).thenReturn(hostVO);
+        when(_hostDao.findById(virtualMachine.getHostId()).getName()).thenReturn("dest-hyp-host-name");
 
         Map<VirtualMachineProfile.Param, Object> parms = Maps.newHashMap();
         parms.put(VirtualMachineProfile.Param.VmPassword, PASSWORD);
         parms.put(VirtualMachineProfile.Param.VmSshPubKey, PUBLIC_KEY);
         VirtualMachineProfile profile = new VirtualMachineProfileImpl(virtualMachine, null, serviceOfferingVO, null, parms);
+        profile.setConfigDriveLabel("testlabel");
         assertTrue(_configDrivesNetworkElement.addPasswordAndUserdata(
                 network, nicp, profile, deployDestination, null));
 
diff --git a/server/src/test/java/com/cloud/projects/MockProjectManagerImpl.java b/server/src/test/java/com/cloud/projects/MockProjectManagerImpl.java
index 46946aa..f8af30f 100644
--- a/server/src/test/java/com/cloud/projects/MockProjectManagerImpl.java
+++ b/server/src/test/java/com/cloud/projects/MockProjectManagerImpl.java
@@ -31,7 +31,7 @@
 public class MockProjectManagerImpl extends ManagerBase implements ProjectManager {
 
     @Override
-    public Project createProject(String name, String displayText, String accountName, Long domainId) throws ResourceAllocationException {
+    public Project createProject(String name, String displayText, String accountName, Long domainId, Long userId, Long accountId) throws ResourceAllocationException {
         // TODO Auto-generated method stub
         return null;
     }
@@ -49,7 +49,7 @@
     }
 
     @Override
-    public ProjectAccount assignAccountToProject(Project project, long accountId, Role accountRole) {
+    public ProjectAccount assignAccountToProject(Project project, long accountId, Role accountRole, Long userId, Long projectRoleId) {
         // TODO Auto-generated method stub
         return null;
     }
@@ -61,6 +61,12 @@
     }
 
     @Override
+    public List<Long> getProjectOwners(long projectId) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
     public boolean unassignAccountFromProject(long projectId, long accountId) {
         // TODO Auto-generated method stub
         return false;
@@ -80,12 +86,17 @@
 
     @Override
     public Project updateProject(long id, String displayText, String newOwnerName) throws ResourceAllocationException {
+        return null;
+    }
+
+    @Override
+    public Project updateProject(long id, String displayText, String newOwnerName, Long userId, Role newRole) throws ResourceAllocationException {
         // TODO Auto-generated method stub
         return null;
     }
 
     @Override
-    public boolean addAccountToProject(long projectId, String accountName, String email) {
+    public boolean addAccountToProject(long projectId, String accountName, String email, Long projectRoleId, Role projectRoleType) {
         // TODO Auto-generated method stub
         return false;
     }
@@ -97,7 +108,13 @@
     }
 
     @Override
-    public boolean updateInvitation(long projectId, String accountName, String token, boolean accept) {
+    public boolean deleteUserFromProject(long projectId, long userId) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public boolean updateInvitation(long projectId, String accountName, Long userId, String token, boolean accept) {
         // TODO Auto-generated method stub
         return false;
     }
@@ -203,4 +220,9 @@
         return null;
     }
 
+    @Override
+    public boolean addUserToProject(Long projectId, String username, String email, Long projectRoleId, Role projectRole) {
+        // TODO Auto-generated method stub
+        return false;
+    }
 }
diff --git a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
index 8ce60df..5fc9a4d 100755
--- a/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
+++ b/server/src/test/java/com/cloud/resource/MockResourceManagerImpl.java
@@ -25,6 +25,7 @@
 
 import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd;
 import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd;
+import org.apache.cloudstack.api.command.admin.cluster.UpdateClusterCmd;
 import org.apache.cloudstack.api.command.admin.host.AddHostCmd;
 import org.apache.cloudstack.api.command.admin.host.AddSecondaryStorageCmd;
 import org.apache.cloudstack.api.command.admin.host.CancelMaintenanceCmd;
@@ -109,7 +110,7 @@
      * @see com.cloud.resource.ResourceService#updateCluster(com.cloud.org.Cluster, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
      */
     @Override
-    public Cluster updateCluster(final Cluster cluster, final String clusterType, final String hypervisor, final String allocationState, final String managedstate) {
+    public Cluster updateCluster(UpdateClusterCmd cmd) {
         // TODO Auto-generated method stub
         return null;
     }
diff --git a/server/src/test/java/com/cloud/storage/ImageStoreDetailsUtilTest.java b/server/src/test/java/com/cloud/storage/ImageStoreDetailsUtilTest.java
index 7efbe08..a294bb5 100755
--- a/server/src/test/java/com/cloud/storage/ImageStoreDetailsUtilTest.java
+++ b/server/src/test/java/com/cloud/storage/ImageStoreDetailsUtilTest.java
@@ -37,8 +37,8 @@
 
     private final static long STORE_ID = 1l;
     private final static String STORE_UUID = "aaaa-aaaa-aaaa-aaaa";
-    private final static Integer NFS_VERSION = 3;
-    private final static Integer NFS_VERSION_DEFAULT = 2;
+    private final static String NFS_VERSION = "3";
+    private final static String NFS_VERSION_DEFAULT = "2";
 
     ImageStoreDetailsUtil imageStoreDetailsUtil = new ImageStoreDetailsUtil();
 
@@ -69,7 +69,7 @@
 
     @Test
     public void testGetNfsVersion(){
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
         assertEquals(NFS_VERSION, nfsVersion);
     }
 
@@ -79,7 +79,7 @@
         imgStoreDetails.put("other.prop", "propValue");
         when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails);
 
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
         assertEquals(NFS_VERSION_DEFAULT, nfsVersion);
     }
 
@@ -88,26 +88,26 @@
         Map<String, String> imgStoreDetails = new HashMap<String, String>();
         when(imgStoreDetailsDao.getDetails(STORE_ID)).thenReturn(imgStoreDetails);
 
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersion(STORE_ID);
         assertEquals(NFS_VERSION_DEFAULT, nfsVersion);
     }
 
     @Test
     public void testGetNfsVersionByUuid(){
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
         assertEquals(NFS_VERSION, nfsVersion);
     }
 
     @Test
     public void testGetNfsVersionByUuidNoImgStore(){
         when(imgStoreDao.findByUuid(STORE_UUID)).thenReturn(null);
-        Integer nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
+        String nfsVersion = imageStoreDetailsUtil.getNfsVersionByUuid(STORE_UUID);
         assertEquals(NFS_VERSION_DEFAULT, nfsVersion);
     }
 
     @Test
     public void testGetGlobalDefaultNfsVersion(){
-        Integer globalDefaultNfsVersion = imageStoreDetailsUtil.getGlobalDefaultNfsVersion();
+        String globalDefaultNfsVersion = imageStoreDetailsUtil.getGlobalDefaultNfsVersion();
         assertEquals(NFS_VERSION_DEFAULT, globalDefaultNfsVersion);
     }
 }
diff --git a/server/src/test/java/com/cloud/template/TemplateManagerImplTest.java b/server/src/test/java/com/cloud/template/TemplateManagerImplTest.java
index bd21643..47180cd 100755
--- a/server/src/test/java/com/cloud/template/TemplateManagerImplTest.java
+++ b/server/src/test/java/com/cloud/template/TemplateManagerImplTest.java
@@ -119,6 +119,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Matchers.anyLong;
@@ -287,7 +288,7 @@
 
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(mockTemplateStore);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(mockTemplateStore);
 
         doNothing().when(mockTemplateStore).setMarkedForGC(anyBoolean());
 
@@ -309,7 +310,7 @@
 
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(null);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(null);
         when(templateDataStoreDao.findByTemplateZoneDownloadStatus(202l, 1l, VMTemplateStorageResourceAssoc.Status.DOWNLOADED)).thenReturn(null);
 
         VMTemplateStoragePoolVO returnObject = templateManager.prepareTemplateForCreate(mockTemplate, (StoragePool) mockPrimaryDataStore);
@@ -332,7 +333,7 @@
 
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(null);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(null);
         when(templateDataStoreDao.findByTemplateZoneDownloadStatus(202l, 1l, VMTemplateStorageResourceAssoc.Status.DOWNLOADED)).thenReturn(mockTemplateDataStore);
         when(storagePoolHostDao.listByHostStatus(2l, Status.Up)).thenReturn(null);
 
@@ -361,7 +362,7 @@
         when(vmTemplateDao.findById(anyLong())).thenReturn(mockTemplate);
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(mockTemplateStore);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(mockTemplateStore);
         when(primaryDataStoreDao.findById(anyLong())).thenReturn(mockPool);
 
         doNothing().when(mockTemplateStore).setMarkedForGC(anyBoolean());
@@ -390,7 +391,7 @@
         when(vmTemplateDao.findById(anyLong())).thenReturn(mockTemplate);
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(mockTemplateStore);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(mockTemplateStore);
         when(primaryDataStoreDao.findById(anyLong())).thenReturn(mockPool);
 
         doNothing().when(mockTemplateStore).setMarkedForGC(anyBoolean());
@@ -432,7 +433,7 @@
         when(vmTemplateDao.findById(anyLong())).thenReturn(mockTemplate);
         when(dataStoreManager.getPrimaryDataStore(anyLong())).thenReturn(mockPrimaryDataStore);
         when(vmTemplateDao.findById(anyLong(), anyBoolean())).thenReturn(mockTemplate);
-        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong())).thenReturn(mockTemplateStore);
+        when(vmTemplatePoolDao.findByPoolTemplate(anyLong(), anyLong(), nullable(String.class))).thenReturn(mockTemplateStore);
         when(primaryDataStoreDao.findById(2l)).thenReturn(mockPool1);
         when(primaryDataStoreDao.findById(3l)).thenReturn(mockPool2);
         when(primaryDataStoreDao.findById(4l)).thenReturn(mockPool3);
diff --git a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
index d8415ff..e37507b 100644
--- a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
+++ b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java
@@ -42,6 +42,8 @@
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.exception.PermissionDeniedException;
 import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccountVO;
 import com.cloud.server.auth.UserAuthenticator;
 import com.cloud.server.auth.UserAuthenticator.ActionOnFailedAuthentication;
 import com.cloud.user.Account.State;
@@ -82,6 +84,12 @@
     @Mock
     private Account accountMock;
 
+    @Mock
+    private ProjectAccountVO projectAccountVO;
+    @Mock
+    private Project project;
+
+
     @Before
     public void beforeTest() {
         Mockito.doReturn(accountMockId).when(accountMock).getId();
@@ -360,7 +368,6 @@
         Mockito.doReturn(Account.ACCOUNT_ID_SYSTEM).when(userVoMock).getAccountId();
         Mockito.doReturn(Account.ACCOUNT_ID_SYSTEM).when(accountMock).getId();
         Mockito.doReturn(callingAccount).when(_accountDao).findById(Account.ACCOUNT_ID_SYSTEM);
-
         accountManagerImpl.retrieveAndValidateAccount(userVoMock);
     }
 
diff --git a/server/src/test/java/com/cloud/user/DomainManagerImplTest.java b/server/src/test/java/com/cloud/user/DomainManagerImplTest.java
index d8f564d..2e9b540 100644
--- a/server/src/test/java/com/cloud/user/DomainManagerImplTest.java
+++ b/server/src/test/java/com/cloud/user/DomainManagerImplTest.java
@@ -22,6 +22,7 @@
 import java.util.List;
 import java.util.UUID;
 
+import com.cloud.domain.dao.DomainDetailsDao;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
@@ -92,6 +93,8 @@
     MessageBus _messageBus;
     @Mock
     ConfigurationManager _configMgr;
+    @Mock
+    DomainDetailsDao _domainDetailsDao;
 
     @Spy
     @InjectMocks
@@ -191,6 +194,7 @@
         domainManager.deleteDomain(DOMAIN_ID, testDomainCleanup);
         Mockito.verify(domainManager).deleteDomain(domain, testDomainCleanup);
         Mockito.verify(domainManager).removeDomainWithNoAccountsForCleanupNetworksOrDedicatedResources(domain);
+        Mockito.verify(domainManager).cleanupDomainDetails(DOMAIN_ID);
         Mockito.verify(domainManager).cleanupDomainOfferings(DOMAIN_ID);
         Mockito.verify(lock).unlock();
     }
diff --git a/server/src/test/java/com/cloud/vm/DeploymentPlanningManagerImplTest.java b/server/src/test/java/com/cloud/vm/DeploymentPlanningManagerImplTest.java
index e73c0c6..d356570 100644
--- a/server/src/test/java/com/cloud/vm/DeploymentPlanningManagerImplTest.java
+++ b/server/src/test/java/com/cloud/vm/DeploymentPlanningManagerImplTest.java
@@ -29,6 +29,8 @@
 import javax.naming.ConfigurationException;
 
 import com.cloud.host.Host;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.dao.VMTemplateDao;
 import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -141,6 +143,9 @@
     @Inject
     UserVmDetailsDao vmDetailsDao;
 
+    @Inject
+    VMTemplateDao templateDao;
+
     @Mock
     Host host;
 
@@ -162,6 +167,10 @@
         Mockito.when(_plannerHostReserveDao.findById(Matchers.anyLong())).thenReturn(reservationVO);
         Mockito.when(_affinityGroupVMMapDao.countAffinityGroupsForVm(Matchers.anyLong())).thenReturn(0L);
 
+        VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
+        Mockito.when(template.isDeployAsIs()).thenReturn(false);
+        Mockito.when(templateDao.findById(Mockito.anyLong())).thenReturn(template);
+
         VMInstanceVO vm = new VMInstanceVO();
         Mockito.when(vmProfile.getVirtualMachine()).thenReturn(vm);
 
@@ -456,6 +465,11 @@
             return Mockito.mock(HostGpuGroupsDao.class);
         }
 
+        @Bean
+        public VMTemplateDao vmTemplateDao() {
+            return Mockito.mock(VMTemplateDao.class);
+        }
+
         public static class Library implements TypeFilter {
 
             @Override
diff --git a/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java b/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
index f9f91d1..da59f07 100644
--- a/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
+++ b/server/src/test/java/com/cloud/vm/UserVmManagerImplTest.java
@@ -32,11 +32,19 @@
 import java.util.List;
 import java.util.Map;
 
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.VMTemplateDao;
 import org.apache.cloudstack.api.BaseCmd.HTTPMethod;
 import org.apache.cloudstack.api.command.user.vm.UpdateVMCmd;
+import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -82,6 +90,9 @@
     private ServiceOfferingDao _serviceOfferingDao;
 
     @Mock
+    private DiskOfferingDao diskOfferingDao;
+
+    @Mock
     private ServiceOfferingVO serviceOfferingVO;
 
     @Mock
@@ -131,8 +142,18 @@
     @Mock
     private UserVO callerUser;
 
+    @Mock
+    private VMTemplateDao templateDao;
+
     private long vmId = 1l;
 
+    private static final long GiB_TO_BYTES = 1024 * 1024 * 1024;
+
+    private Map<String, String> customParameters = new HashMap<>();
+
+    private DiskOfferingVO smallerDisdkOffering = prepareDiskOffering(5l * GiB_TO_BYTES, 1l, 1L, 2L);
+    private DiskOfferingVO largerDisdkOffering = prepareDiskOffering(10l * GiB_TO_BYTES, 2l, 10L, 20L);
+
     @Before
     public void beforeTest() {
 
@@ -144,6 +165,8 @@
 
         Mockito.when(callerAccount.getType()).thenReturn(Account.ACCOUNT_TYPE_ADMIN);
         CallContext.register(callerUser, callerAccount);
+
+        customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, "123");
     }
 
     @After
@@ -380,4 +403,159 @@
         assertTrue(userVmManagerImpl.isValidKeyValuePair("param:key-2=value2"));
         assertTrue(userVmManagerImpl.isValidKeyValuePair("my.config.v0=False"));
     }
+
+    @Test
+    public void configureCustomRootDiskSizeTest() {
+        String vmDetailsRootDiskSize = "123";
+        Map<String, String> customParameters = new HashMap<>();
+        customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, vmDetailsRootDiskSize);
+        long expectedRootDiskSize = 123l * GiB_TO_BYTES;
+        long offeringRootDiskSize = 0l;
+        prepareAndRunConfigureCustomRootDiskSizeTest(customParameters, expectedRootDiskSize, 1, offeringRootDiskSize);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void configureCustomRootDiskSizeTestExpectExceptionZero() {
+        String vmDetailsRootDiskSize = "0";
+        Map<String, String> customParameters = new HashMap<>();
+        customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, vmDetailsRootDiskSize);
+        long expectedRootDiskSize = 0l;
+        long offeringRootDiskSize = 0l;
+        prepareAndRunConfigureCustomRootDiskSizeTest(customParameters, expectedRootDiskSize, 1, offeringRootDiskSize);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void configureCustomRootDiskSizeTestExpectExceptionNegativeNum() {
+        String vmDetailsRootDiskSize = "-123";
+        Map<String, String> customParameters = new HashMap<>();
+        customParameters.put(VmDetailConstants.ROOT_DISK_SIZE, vmDetailsRootDiskSize);
+        long expectedRootDiskSize = -123l * GiB_TO_BYTES;
+        long offeringRootDiskSize = 0l;
+        prepareAndRunConfigureCustomRootDiskSizeTest(customParameters, expectedRootDiskSize, 1, offeringRootDiskSize);
+    }
+
+    @Test
+    public void configureCustomRootDiskSizeTestEmptyParameters() {
+        Map<String, String> customParameters = new HashMap<>();
+        long expectedRootDiskSize = 99l * GiB_TO_BYTES;
+        long offeringRootDiskSize = 0l;
+        prepareAndRunConfigureCustomRootDiskSizeTest(customParameters, expectedRootDiskSize, 1, offeringRootDiskSize);
+    }
+
+    @Test
+    public void configureCustomRootDiskSizeTestEmptyParametersAndOfferingRootSize() {
+        Map<String, String> customParameters = new HashMap<>();
+        long expectedRootDiskSize = 10l * GiB_TO_BYTES;
+        long offeringRootDiskSize = 10l * GiB_TO_BYTES;;
+
+        prepareAndRunConfigureCustomRootDiskSizeTest(customParameters, expectedRootDiskSize, 1, offeringRootDiskSize);
+    }
+
+    private void prepareAndRunConfigureCustomRootDiskSizeTest(Map<String, String> customParameters, long expectedRootDiskSize, int timesVerifyIfHypervisorSupports, Long offeringRootDiskSize) {
+        VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
+        Mockito.when(template.getId()).thenReturn(1l);
+        Mockito.when(template.getSize()).thenReturn(99L * GiB_TO_BYTES);
+        ServiceOfferingVO offering = Mockito.mock(ServiceOfferingVO.class);
+        Mockito.when(offering.getId()).thenReturn(1l);
+        Mockito.when(templateDao.findById(Mockito.anyLong())).thenReturn(template);
+
+        DiskOfferingVO diskfferingVo = Mockito.mock(DiskOfferingVO.class);
+        Mockito.when(diskOfferingDao.findById(Mockito.anyLong())).thenReturn(diskfferingVo);
+
+        Mockito.when(diskfferingVo.getDiskSize()).thenReturn(offeringRootDiskSize);
+
+        long rootDiskSize = userVmManagerImpl.configureCustomRootDiskSize(customParameters, template, Hypervisor.HypervisorType.KVM, offering);
+
+        Assert.assertEquals(expectedRootDiskSize, rootDiskSize);
+        Mockito.verify(userVmManagerImpl, Mockito.times(timesVerifyIfHypervisorSupports)).verifyIfHypervisorSupportsRootdiskSizeOverride(Mockito.any());
+    }
+
+    @Test
+    public void verifyIfHypervisorSupportRootdiskSizeOverrideTest() {
+        Hypervisor.HypervisorType[] hypervisorTypeArray = Hypervisor.HypervisorType.values();
+        int exceptionCounter = 0;
+        int expectedExceptionCounter = hypervisorTypeArray.length - 4;
+
+        for(int i = 0; i < hypervisorTypeArray.length; i++) {
+            if (Hypervisor.HypervisorType.KVM == hypervisorTypeArray[i]
+                    || Hypervisor.HypervisorType.XenServer == hypervisorTypeArray[i]
+                    || Hypervisor.HypervisorType.VMware == hypervisorTypeArray[i]
+                    || Hypervisor.HypervisorType.Simulator == hypervisorTypeArray[i]) {
+                userVmManagerImpl.verifyIfHypervisorSupportsRootdiskSizeOverride(hypervisorTypeArray[i]);
+            } else {
+                try {
+                    userVmManagerImpl.verifyIfHypervisorSupportsRootdiskSizeOverride(hypervisorTypeArray[i]);
+                } catch (InvalidParameterValueException e) {
+                    exceptionCounter ++;
+                }
+            }
+        }
+
+        Assert.assertEquals(expectedExceptionCounter, exceptionCounter);
+    }
+
+    @Test (expected = InvalidParameterValueException.class)
+    public void prepareResizeVolumeCmdTestRootVolumeNull() {
+        DiskOfferingVO newRootDiskOffering = Mockito.mock(DiskOfferingVO.class);
+        DiskOfferingVO currentRootDiskOffering = Mockito.mock(DiskOfferingVO.class);
+        userVmManagerImpl.prepareResizeVolumeCmd(null, currentRootDiskOffering, newRootDiskOffering);
+    }
+
+    @Test (expected = InvalidParameterValueException.class)
+    public void prepareResizeVolumeCmdTestCurrentRootDiskOffering() {
+        DiskOfferingVO newRootDiskOffering = Mockito.mock(DiskOfferingVO.class);
+        VolumeVO rootVolumeOfVm = Mockito.mock(VolumeVO.class);
+        userVmManagerImpl.prepareResizeVolumeCmd(rootVolumeOfVm, null, newRootDiskOffering);
+    }
+
+    @Test (expected = InvalidParameterValueException.class)
+    public void prepareResizeVolumeCmdTestNewRootDiskOffering() {
+        VolumeVO rootVolumeOfVm = Mockito.mock(VolumeVO.class);
+        DiskOfferingVO currentRootDiskOffering = Mockito.mock(DiskOfferingVO.class);
+        userVmManagerImpl.prepareResizeVolumeCmd(rootVolumeOfVm, currentRootDiskOffering, null);
+    }
+
+    @Test
+    public void prepareResizeVolumeCmdTestNewOfferingLarger() {
+        prepareAndRunResizeVolumeTest(2L, 10L, 20L, smallerDisdkOffering, largerDisdkOffering);
+    }
+
+    @Test
+    public void prepareResizeVolumeCmdTestSameOfferingSize() {
+        prepareAndRunResizeVolumeTest(null, 1L, 2L, smallerDisdkOffering, smallerDisdkOffering);
+    }
+
+    @Test
+    public void prepareResizeVolumeCmdTestOfferingRootSizeZero() {
+        DiskOfferingVO rootSizeZero = prepareDiskOffering(0l, 3l, 100L, 200L);
+        prepareAndRunResizeVolumeTest(null, 100L, 200L, smallerDisdkOffering, rootSizeZero);
+    }
+
+    @Test (expected = InvalidParameterValueException.class)
+    public void prepareResizeVolumeCmdTestNewOfferingSmaller() {
+        prepareAndRunResizeVolumeTest(2L, 10L, 20L, largerDisdkOffering, smallerDisdkOffering);
+    }
+
+    private void prepareAndRunResizeVolumeTest(Long expectedOfferingId, long expectedMinIops, long expectedMaxIops, DiskOfferingVO currentRootDiskOffering, DiskOfferingVO newRootDiskOffering) {
+        long rootVolumeId = 1l;
+        VolumeVO rootVolumeOfVm = Mockito.mock(VolumeVO.class);
+        Mockito.when(rootVolumeOfVm.getId()).thenReturn(rootVolumeId);
+
+        ResizeVolumeCmd resizeVolumeCmd = userVmManagerImpl.prepareResizeVolumeCmd(rootVolumeOfVm, currentRootDiskOffering, newRootDiskOffering);
+
+        Assert.assertEquals(rootVolumeId, resizeVolumeCmd.getId().longValue());
+        Assert.assertEquals(expectedOfferingId, resizeVolumeCmd.getNewDiskOfferingId());
+        Assert.assertEquals(expectedMinIops, resizeVolumeCmd.getMinIops().longValue());
+        Assert.assertEquals(expectedMaxIops, resizeVolumeCmd.getMaxIops().longValue());
+    }
+
+    private DiskOfferingVO prepareDiskOffering(long rootSize, long diskOfferingId, long offeringMinIops, long offeringMaxIops) {
+        DiskOfferingVO newRootDiskOffering = Mockito.mock(DiskOfferingVO.class);
+        Mockito.when(newRootDiskOffering.getDiskSize()).thenReturn(rootSize);
+        Mockito.when(newRootDiskOffering.getId()).thenReturn(diskOfferingId);
+        Mockito.when(newRootDiskOffering.getMinIops()).thenReturn(offeringMinIops);
+        Mockito.when(newRootDiskOffering.getMaxIops()).thenReturn(offeringMaxIops);
+        Mockito.when(newRootDiskOffering.getName()).thenReturn("OfferingName");
+        return newRootDiskOffering;
+    }
 }
diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
index 0cc10ea..1b2b0b5 100644
--- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java
@@ -941,6 +941,11 @@
     }
 
     @Override
+    public void setHypervisorHostname(VirtualMachineProfile vm, DeployDestination dest, boolean migrationSuccessful) {
+        return;
+    }
+
+    @Override
     public void prepareNicForMigration(VirtualMachineProfile vm, DeployDestination dest) {
         // TODO Auto-generated method stub
 
@@ -985,7 +990,11 @@
     }
 
     @Override
-    public Pair<NicProfile, Integer> importNic(String macAddress, int deviceId, Network network, Boolean isDefaultNic, VirtualMachine vm, IpAddresses ipAddresses) {
+    public Pair<NicProfile, Integer> importNic(String macAddress, int deviceId, Network network, Boolean isDefaultNic, VirtualMachine vm, IpAddresses ipAddresses, boolean forced) {
         return null;
     }
+
+    @Override
+    public void unmanageNics(VirtualMachineProfile vm) {
+    }
 }
diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
index 56670d2..a731f7c 100644
--- a/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
+++ b/server/src/test/java/com/cloud/vpc/MockNetworkModelImpl.java
@@ -913,7 +913,7 @@
     }
 
     @Override
-    public List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId, String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows) {
+    public List<String[]> generateVmData(String userData, String serviceOffering, long datacenterId, String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows, String hostname) {
         return null;
     }
 
diff --git a/server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java b/server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java
index 1a7c1f7..a20ac6f 100644
--- a/server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java
+++ b/server/src/test/java/com/cloud/vpc/dao/MockNetworkDaoImpl.java
@@ -250,4 +250,9 @@
     public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri, Network.PVlanType pVlanType) {
         return null;
     }
+
+    @Override
+    public List<NetworkVO> listByPhysicalNetworkPvlan(long physicalNetworkId, String broadcastUri) {
+        return null;
+    }
 }
diff --git a/server/src/test/java/org/apache/cloudstack/network/ssl/CertServiceTest.java b/server/src/test/java/org/apache/cloudstack/network/ssl/CertServiceTest.java
index a8514f9..7008a81 100644
--- a/server/src/test/java/org/apache/cloudstack/network/ssl/CertServiceTest.java
+++ b/server/src/test/java/org/apache/cloudstack/network/ssl/CertServiceTest.java
@@ -140,9 +140,74 @@
         chainField.setAccessible(true);
         chainField.set(uploadCmd, chain);
 
+        final Field enabledRevocationCheckField = klazz.getDeclaredField("enabledRevocationCheck");
+        enabledRevocationCheckField.setAccessible(true);
+        enabledRevocationCheckField.set(uploadCmd, Boolean.FALSE);
+
         certService.uploadSslCert(uploadCmd);
     }
 
+    @Test
+    /**
+     * Given a certificate signed by a CA and a valid CA chain, but without any info for revocation checking, upload should fail.
+     */
+    public void runUploadSslCertWithNoRevocationInfo() throws Exception {
+        Assume.assumeTrue(isOpenJdk() || isJCEInstalled());
+
+        TransactionLegacy.open("runUploadSslCertWithCAChain");
+
+        final String certFile = URLDecoder.decode(getClass().getResource("/certs/rsa_ca_signed.crt").getFile(),Charset.defaultCharset().name());
+        final String keyFile = URLDecoder.decode(getClass().getResource("/certs/rsa_ca_signed.key").getFile(),Charset.defaultCharset().name());
+        final String chainFile = URLDecoder.decode(getClass().getResource("/certs/root_chain.crt").getFile(),Charset.defaultCharset().name());
+
+        final String cert = readFileToString(new File(certFile));
+        final String key = readFileToString(new File(keyFile));
+        final String chain = readFileToString(new File(chainFile));
+
+        final CertServiceImpl certService = new CertServiceImpl();
+
+        //setting mock objects
+        certService._accountMgr = Mockito.mock(AccountManager.class);
+        final Account account = new AccountVO("testaccount", 1, "networkdomain", (short)0, UUID.randomUUID().toString());
+        when(certService._accountMgr.getAccount(anyLong())).thenReturn(account);
+
+        certService._domainDao = Mockito.mock(DomainDao.class);
+        final DomainVO domain = new DomainVO("networkdomain", 1L, 1L, "networkdomain");
+        when(certService._domainDao.findByIdIncludingRemoved(anyLong())).thenReturn(domain);
+
+        certService._sslCertDao = Mockito.mock(SslCertDao.class);
+        when(certService._sslCertDao.persist(Matchers.any(SslCertVO.class))).thenReturn(new SslCertVO());
+
+        certService._accountDao = Mockito.mock(AccountDao.class);
+        when(certService._accountDao.findByIdIncludingRemoved(anyLong())).thenReturn((AccountVO)account);
+
+        //creating the command
+        final UploadSslCertCmd uploadCmd = new UploadSslCertCmdExtn();
+        final Class<?> klazz = uploadCmd.getClass().getSuperclass();
+
+        final Field certField = klazz.getDeclaredField("cert");
+        certField.setAccessible(true);
+        certField.set(uploadCmd, cert);
+
+        final Field keyField = klazz.getDeclaredField("key");
+        keyField.setAccessible(true);
+        keyField.set(uploadCmd, key);
+
+        final Field chainField = klazz.getDeclaredField("chain");
+        chainField.setAccessible(true);
+        chainField.set(uploadCmd, chain);
+
+        try {
+            certService.uploadSslCert(uploadCmd);
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("Invalid certificate chain"));
+            Throwable cause = e.getCause();
+            Assert.assertTrue(cause.getMessage().contains("Certification path could not be validated"));
+            cause = cause.getCause();
+            Assert.assertTrue(cause.getMessage().contains("No CRLs found"));
+        }
+    }
+
     //    @Test
     /**
      * Given a Self-signed Certificate with encrypted key, upload should succeed
diff --git a/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java
new file mode 100644
index 0000000..32b0e43
--- /dev/null
+++ b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java
@@ -0,0 +1,430 @@
+// 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.vm;
+
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import com.cloud.exception.UnsupportedServiceException;
+import com.cloud.storage.SnapshotVO;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.vm.NicVO;
+import com.cloud.vm.dao.NicDao;
+import com.cloud.vm.dao.UserVmDao;
+import com.cloud.vm.snapshot.VMSnapshotVO;
+import com.cloud.vm.snapshot.dao.VMSnapshotDao;
+import org.apache.cloudstack.api.ResponseGenerator;
+import org.apache.cloudstack.api.ResponseObject;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.vm.ImportUnmanagedInstanceCmd;
+import org.apache.cloudstack.api.command.admin.vm.ListUnmanagedInstancesCmd;
+import org.apache.cloudstack.api.response.UserVmResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
+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.After;
+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.MockitoAnnotations;
+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.Answer;
+import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
+import com.cloud.agent.api.GetUnmanagedInstancesCommand;
+import com.cloud.configuration.Resource;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.event.UsageEventUtils;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.hypervisor.Hypervisor;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.NetworkVO;
+import com.cloud.offering.DiskOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.resource.ResourceManager;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.VMTemplateStoragePoolVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeApiService;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.dao.DiskOfferingDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplatePoolDao;
+import com.cloud.storage.dao.VolumeDao;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import com.cloud.user.AccountVO;
+import com.cloud.user.ResourceLimitService;
+import com.cloud.user.User;
+import com.cloud.user.UserVO;
+import com.cloud.user.dao.UserDao;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.vm.DiskProfile;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.UserVmManager;
+import com.cloud.vm.UserVmVO;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.dao.VMInstanceDao;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(UsageEventUtils.class)
+public class UnmanagedVMsManagerImplTest {
+
+    @InjectMocks
+    private UnmanagedVMsManager unmanagedVMsManager = new UnmanagedVMsManagerImpl();
+
+    @Mock
+    private UserVmManager userVmManager;
+    @Mock
+    private ClusterDao clusterDao;
+    @Mock
+    private ResourceManager resourceManager;
+    @Mock
+    private VMTemplatePoolDao templatePoolDao;
+    @Mock
+    private AgentManager agentManager;
+    @Mock
+    private AccountService accountService;
+    @Mock
+    private UserDao userDao;
+    @Mock
+    private DataCenterDao dataCenterDao;
+    @Mock
+    private VMTemplateDao templateDao;
+    @Mock
+    private VMInstanceDao vmDao;
+    @Mock
+    private ServiceOfferingDao serviceOfferingDao;
+    @Mock
+    private DiskOfferingDao diskOfferingDao;
+    @Mock
+    private NetworkDao networkDao;
+    @Mock
+    private NetworkOrchestrationService networkOrchestrationService;
+    @Mock
+    private VolumeOrchestrationService volumeManager;
+    @Mock
+    public ResponseGenerator responseGenerator;
+    @Mock
+    private VolumeDao volumeDao;
+    @Mock
+    private ResourceLimitService resourceLimitService;
+    @Mock
+    private PrimaryDataStoreDao primaryDataStoreDao;
+    @Mock
+    private VolumeApiService volumeApiService;
+    @Mock
+    private NetworkModel networkModel;
+    @Mock
+    private ConfigurationDao configurationDao;
+    @Mock
+    private VMSnapshotDao vmSnapshotDao;
+    @Mock
+    private SnapshotDao snapshotDao;
+    @Mock
+    private UserVmDao userVmDao;
+    @Mock
+    private NicDao nicDao;
+
+    @Mock
+    private VMInstanceVO virtualMachine;
+    @Mock
+    private NicVO nicVO;
+
+    private static final long virtualMachineId = 1L;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+
+        AccountVO account = new AccountVO("admin", 1L, "", Account.ACCOUNT_TYPE_ADMIN, "uuid");
+        UserVO user = new UserVO(1, "adminuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
+        CallContext.register(user, account);
+
+        UnmanagedInstanceTO instance = new UnmanagedInstanceTO();
+        instance.setName("TestInstance");
+        instance.setCpuCores(2);
+        instance.setCpuCoresPerSocket(1);
+        instance.setCpuSpeed(1000);
+        instance.setMemory(1024);
+        instance.setOperatingSystem("CentOS 7");
+        List<UnmanagedInstanceTO.Disk> instanceDisks = new ArrayList<>();
+        UnmanagedInstanceTO.Disk instanceDisk = new UnmanagedInstanceTO.Disk();
+        instanceDisk.setDiskId("1000-1");
+        instanceDisk.setLabel("DiskLabel");
+        instanceDisk.setController("scsi");
+        instanceDisk.setImagePath("[b6ccf44a1fa13e29b3667b4954fa10ee] TestInstance/ROOT-1.vmdk");
+        instanceDisk.setCapacity(5242880L);
+        instanceDisk.setDatastoreName("Test");
+        instanceDisk.setDatastoreHost("Test");
+        instanceDisk.setDatastorePath("Test");
+        instanceDisk.setDatastoreType("NFS");
+        instanceDisks.add(instanceDisk);
+        instance.setDisks(instanceDisks);
+        List<UnmanagedInstanceTO.Nic> instanceNics = new ArrayList<>();
+        UnmanagedInstanceTO.Nic instanceNic = new UnmanagedInstanceTO.Nic();
+        instanceNic.setNicId("NIC 1");
+        instanceNic.setAdapterType("VirtualE1000E");
+        instanceNic.setMacAddress("02:00:2e:0f:00:02");
+        instanceNic.setVlan(1024);
+        instanceNics.add(instanceNic);
+        instance.setNics(instanceNics);
+        instance.setPowerState(UnmanagedInstanceTO.PowerState.PowerOn);
+
+        ClusterVO clusterVO = new ClusterVO(1L, 1L, "Cluster");
+        clusterVO.setHypervisorType(Hypervisor.HypervisorType.VMware.toString());
+        when(clusterDao.findById(Mockito.anyLong())).thenReturn(clusterVO);
+        when(configurationDao.getValue(Mockito.anyString())).thenReturn(null);
+        doNothing().when(resourceLimitService).checkResourceLimit(any(Account.class), any(Resource.ResourceType.class), anyLong());
+        List<HostVO> hosts = new ArrayList<>();
+        HostVO hostVO = Mockito.mock(HostVO.class);
+        when(hostVO.isInMaintenanceStates()).thenReturn(false);
+        hosts.add(hostVO);
+        when(resourceManager.listHostsInClusterByStatus(Mockito.anyLong(), Mockito.any(Status.class))).thenReturn(hosts);
+        List<VMTemplateStoragePoolVO> templates = new ArrayList<>();
+        when(templatePoolDao.listAll()).thenReturn(templates);
+        List<VolumeVO> volumes = new ArrayList<>();
+        when(volumeDao.findIncludingRemovedByZone(Mockito.anyLong())).thenReturn(volumes);
+        List<VMInstanceVO> vms = new ArrayList<>();
+        when(vmDao.listByHostId(Mockito.anyLong())).thenReturn(vms);
+        when(vmDao.listByLastHostIdAndStates(Mockito.anyLong())).thenReturn(vms);
+        GetUnmanagedInstancesCommand cmd = Mockito.mock(GetUnmanagedInstancesCommand.class);
+        HashMap<String, UnmanagedInstanceTO> map = new HashMap<>();
+        map.put(instance.getName(), instance);
+        Answer answer = new GetUnmanagedInstancesAnswer(cmd, "", map);
+        when(agentManager.easySend(Mockito.anyLong(), Mockito.any(GetUnmanagedInstancesCommand.class))).thenReturn(answer);
+        DataCenterVO zone = Mockito.mock(DataCenterVO.class);
+        when(zone.getId()).thenReturn(1L);
+        when(dataCenterDao.findById(Mockito.anyLong())).thenReturn(zone);
+        when(accountService.getActiveAccountById(Mockito.anyLong())).thenReturn(Mockito.mock(Account.class));
+        List<UserVO> users = new ArrayList<>();
+        users.add(Mockito.mock(UserVO.class));
+        when(userDao.listByAccount(Mockito.anyLong())).thenReturn(users);
+        VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
+        when(template.getId()).thenReturn(1L);
+        when(template.getName()).thenReturn("Template");
+        when(templateDao.findById(Mockito.anyLong())).thenReturn(template);
+        when(templateDao.findByName(Mockito.anyString())).thenReturn(template);
+        ServiceOfferingVO serviceOffering = Mockito.mock(ServiceOfferingVO.class);
+        when(serviceOffering.getId()).thenReturn(1L);
+        when(serviceOffering.getTags()).thenReturn("");
+        when(serviceOffering.isDynamic()).thenReturn(false);
+        when(serviceOffering.getCpu()).thenReturn(instance.getCpuCores());
+        when(serviceOffering.getRamSize()).thenReturn(instance.getMemory());
+        when(serviceOffering.getSpeed()).thenReturn(instance.getCpuSpeed());
+        when(serviceOfferingDao.findById(Mockito.anyLong())).thenReturn(serviceOffering);
+        DiskOfferingVO diskOfferingVO = Mockito.mock(DiskOfferingVO.class);
+        when(diskOfferingVO.isCustomized()).thenReturn(false);
+        when(diskOfferingVO.getDiskSize()).thenReturn(Long.MAX_VALUE);
+        when(diskOfferingDao.findById(Mockito.anyLong())).thenReturn(diskOfferingVO);
+        UserVmVO userVm = Mockito.mock(UserVmVO.class);
+        when(userVm.getAccountId()).thenReturn(1L);
+        when(userVm.getDataCenterId()).thenReturn(1L);
+        when(userVm.getHostName()).thenReturn(instance.getName());
+        when(userVm.getTemplateId()).thenReturn(1L);
+        when(userVm.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.VMware);
+        when(userVm.getUuid()).thenReturn("abcd");
+        when(userVm.isDisplayVm()).thenReturn(true);
+        // Skip usage publishing and resource increment for test
+        when(userVm.getType()).thenReturn(VirtualMachine.Type.Instance);
+        userVm.setInstanceName(instance.getName());
+        userVm.setHostName(instance.getName());
+        StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
+        when(poolVO.getDataCenterId()).thenReturn(1L);
+        when(poolVO.getClusterId()).thenReturn(clusterVO.getId());
+        List<StoragePoolVO> pools = new ArrayList<>();
+        pools.add(poolVO);
+        when(primaryDataStoreDao.listPoolByHostPath(Mockito.anyString(), Mockito.anyString())).thenReturn(pools);
+        when(userVmManager.importVM(nullable(DataCenter.class), nullable(Host.class), nullable(VirtualMachineTemplate.class), nullable(String.class), nullable(String.class),
+                nullable(Account.class), nullable(String.class), nullable(Account.class), nullable(Boolean.class), nullable(String.class),
+                nullable(Long.class), nullable(Long.class), nullable(ServiceOffering.class), nullable(String.class),
+                nullable(String.class), nullable(Hypervisor.HypervisorType.class), nullable(Map.class), nullable(VirtualMachine.PowerState.class))).thenReturn(userVm);
+        when(volumeApiService.doesTargetStorageSupportDiskOffering(Mockito.any(StoragePool.class), Mockito.anyString())).thenReturn(true);
+        NetworkVO networkVO = Mockito.mock(NetworkVO.class);
+        when(networkVO.getGuestType()).thenReturn(Network.GuestType.L2);
+        when(networkVO.getBroadcastUri()).thenReturn(URI.create(String.format("vlan://%d", instanceNic.getVlan())));
+        when(networkVO.getDataCenterId()).thenReturn(1L);
+        when(networkDao.findById(Mockito.anyLong())).thenReturn(networkVO);
+        List<NetworkVO> networks = new ArrayList<>();
+        networks.add(networkVO);
+        when(networkDao.listByZone(Mockito.anyLong())).thenReturn(networks);
+        doNothing().when(networkModel).checkNetworkPermissions(Mockito.any(Account.class), Mockito.any(Network.class));
+        doNothing().when(networkModel).checkRequestedIpAddresses(Mockito.anyLong(), Mockito.any(Network.IpAddresses.class));
+        NicProfile profile = Mockito.mock(NicProfile.class);
+        Integer deviceId = 100;
+        Pair<NicProfile, Integer> pair = new Pair<NicProfile, Integer>(profile, deviceId);
+        when(networkOrchestrationService.importNic(nullable(String.class), nullable(Integer.class), nullable(Network.class), nullable(Boolean.class), nullable(VirtualMachine.class), nullable(Network.IpAddresses.class), anyBoolean())).thenReturn(pair);
+        when(volumeManager.importVolume(Mockito.any(Volume.Type.class), Mockito.anyString(), Mockito.any(DiskOffering.class), Mockito.anyLong(),
+                Mockito.anyLong(), Mockito.anyLong(), Mockito.any(VirtualMachine.class), Mockito.any(VirtualMachineTemplate.class),
+                Mockito.any(Account.class), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyString())).thenReturn(Mockito.mock(DiskProfile.class));
+        when(volumeDao.findByInstance(Mockito.anyLong())).thenReturn(volumes);
+        List<UserVmResponse> userVmResponses = new ArrayList<>();
+        UserVmResponse userVmResponse = new UserVmResponse();
+        userVmResponse.setInstanceName(instance.getName());
+        userVmResponses.add(userVmResponse);
+        when(responseGenerator.createUserVmResponse(Mockito.any(ResponseObject.ResponseView.class), Mockito.anyString(), Mockito.any(UserVm.class))).thenReturn(userVmResponses);
+
+        when(vmDao.findById(virtualMachineId)).thenReturn(virtualMachine);
+        when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Running);
+        when(virtualMachine.getInstanceName()).thenReturn("i-2-7-VM");
+        when(virtualMachine.getId()).thenReturn(virtualMachineId);
+        VolumeVO volumeVO = mock(VolumeVO.class);
+        when(volumeDao.findByInstance(virtualMachineId)).thenReturn(Collections.singletonList(volumeVO));
+        when(volumeVO.getInstanceId()).thenReturn(virtualMachineId);
+        when(volumeVO.getId()).thenReturn(virtualMachineId);
+        when(nicDao.listByVmId(virtualMachineId)).thenReturn(Collections.singletonList(nicVO));
+        when(nicVO.getNetworkId()).thenReturn(1L);
+        when(networkDao.findById(1L)).thenReturn(networkVO);
+    }
+
+    @After
+    public void tearDown() {
+        CallContext.unregister();
+    }
+
+    @Test
+    public void listUnmanagedInstancesTest() {
+        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
+        unmanagedVMsManager.listUnmanagedInstances(cmd);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void listUnmanagedInstancesInvalidHypervisorTest() {
+        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
+        ClusterVO cluster = new ClusterVO(1, 1, "Cluster");
+        cluster.setHypervisorType(Hypervisor.HypervisorType.KVM.toString());
+        when(clusterDao.findById(Mockito.anyLong())).thenReturn(cluster);
+        unmanagedVMsManager.listUnmanagedInstances(cmd);
+    }
+
+    @Test(expected = PermissionDeniedException.class)
+    public void listUnmanagedInstancesInvalidCallerTest() {
+        CallContext.unregister();
+        AccountVO account = new AccountVO("user", 1L, "", Account.ACCOUNT_TYPE_NORMAL, "uuid");
+        UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
+        CallContext.register(user, account);
+        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
+        unmanagedVMsManager.listUnmanagedInstances(cmd);
+    }
+
+    @Test
+    public void importUnmanagedInstanceTest() {
+        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
+        when(importUnmanageInstanceCmd.getName()).thenReturn("TestInstance");
+        when(importUnmanageInstanceCmd.getAccountName()).thenReturn(null);
+        when(importUnmanageInstanceCmd.getDomainId()).thenReturn(null);
+        PowerMockito.mockStatic(UsageEventUtils.class);
+        unmanagedVMsManager.importUnmanagedInstance(importUnmanageInstanceCmd);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void importUnmanagedInstanceInvalidHostnameTest() {
+        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
+        when(importUnmanageInstanceCmd.getName()).thenReturn("TestInstance");
+        when(importUnmanageInstanceCmd.getName()).thenReturn("some name");
+        when(importUnmanageInstanceCmd.getMigrateAllowed()).thenReturn(false);
+        unmanagedVMsManager.importUnmanagedInstance(importUnmanageInstanceCmd);
+    }
+
+    @Test(expected = ServerApiException.class)
+    public void importUnmanagedInstanceMissingInstanceTest() {
+        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
+        when(importUnmanageInstanceCmd.getName()).thenReturn("SomeInstance");
+        when(importUnmanageInstanceCmd.getAccountName()).thenReturn(null);
+        when(importUnmanageInstanceCmd.getDomainId()).thenReturn(null);
+        unmanagedVMsManager.importUnmanagedInstance(importUnmanageInstanceCmd);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void unmanageVMInstanceMissingInstanceTest() {
+        long notExistingId = 10L;
+        unmanagedVMsManager.unmanageVMInstance(notExistingId);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void unmanageVMInstanceDestroyedInstanceTest() {
+        when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Destroyed);
+        unmanagedVMsManager.unmanageVMInstance(virtualMachineId);
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void unmanageVMInstanceExpungedInstanceTest() {
+        when(virtualMachine.getState()).thenReturn(VirtualMachine.State.Expunging);
+        unmanagedVMsManager.unmanageVMInstance(virtualMachineId);
+    }
+
+    @Test(expected = UnsupportedServiceException.class)
+    public void unmanageVMInstanceExistingVMSnapshotsTest() {
+        when(vmSnapshotDao.findByVm(virtualMachineId)).thenReturn(Arrays.asList(new VMSnapshotVO(), new VMSnapshotVO()));
+        unmanagedVMsManager.unmanageVMInstance(virtualMachineId);
+    }
+
+    @Test(expected = UnsupportedServiceException.class)
+    public void unmanageVMInstanceExistingVolumeSnapshotsTest() {
+        when(snapshotDao.listByVolumeId(virtualMachineId)).thenReturn(Arrays.asList(new SnapshotVO(), new SnapshotVO()));
+        unmanagedVMsManager.unmanageVMInstance(virtualMachineId);
+    }
+
+    @Test(expected = UnsupportedServiceException.class)
+    public void unmanageVMInstanceExistingISOAttachedTest() {
+        UserVmVO userVmVO = mock(UserVmVO.class);
+        when(userVmDao.findById(virtualMachineId)).thenReturn(userVmVO);
+        when(userVmVO.getIsoId()).thenReturn(3L);
+        unmanagedVMsManager.unmanageVMInstance(virtualMachineId);
+    }
+}
\ No newline at end of file
diff --git a/server/src/test/java/org/apache/cloudstack/vm/VmImportManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/vm/VmImportManagerImplTest.java
deleted file mode 100644
index ad2bf08..0000000
--- a/server/src/test/java/org/apache/cloudstack/vm/VmImportManagerImplTest.java
+++ /dev/null
@@ -1,353 +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.
-
-package org.apache.cloudstack.vm;
-
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.when;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.cloudstack.api.ResponseGenerator;
-import org.apache.cloudstack.api.ResponseObject;
-import org.apache.cloudstack.api.ServerApiException;
-import org.apache.cloudstack.api.command.admin.vm.ImportUnmanagedInstanceCmd;
-import org.apache.cloudstack.api.command.admin.vm.ListUnmanagedInstancesCmd;
-import org.apache.cloudstack.api.response.UserVmResponse;
-import org.apache.cloudstack.context.CallContext;
-import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
-import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
-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.After;
-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.MockitoAnnotations;
-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.Answer;
-import com.cloud.agent.api.GetUnmanagedInstancesAnswer;
-import com.cloud.agent.api.GetUnmanagedInstancesCommand;
-import com.cloud.configuration.Resource;
-import com.cloud.dc.ClusterVO;
-import com.cloud.dc.DataCenter;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.ClusterDao;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.event.UsageEventUtils;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.host.Host;
-import com.cloud.host.HostVO;
-import com.cloud.host.Status;
-import com.cloud.hypervisor.Hypervisor;
-import com.cloud.network.Network;
-import com.cloud.network.NetworkModel;
-import com.cloud.network.dao.NetworkDao;
-import com.cloud.network.dao.NetworkVO;
-import com.cloud.offering.DiskOffering;
-import com.cloud.offering.ServiceOffering;
-import com.cloud.resource.ResourceManager;
-import com.cloud.service.ServiceOfferingVO;
-import com.cloud.service.dao.ServiceOfferingDao;
-import com.cloud.storage.DiskOfferingVO;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.VMTemplateStoragePoolVO;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeApiService;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.dao.DiskOfferingDao;
-import com.cloud.storage.dao.VMTemplateDao;
-import com.cloud.storage.dao.VMTemplatePoolDao;
-import com.cloud.storage.dao.VolumeDao;
-import com.cloud.template.VirtualMachineTemplate;
-import com.cloud.user.Account;
-import com.cloud.user.AccountService;
-import com.cloud.user.AccountVO;
-import com.cloud.user.ResourceLimitService;
-import com.cloud.user.User;
-import com.cloud.user.UserVO;
-import com.cloud.user.dao.UserDao;
-import com.cloud.uservm.UserVm;
-import com.cloud.utils.Pair;
-import com.cloud.vm.DiskProfile;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.UserVmManager;
-import com.cloud.vm.UserVmVO;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.dao.VMInstanceDao;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(UsageEventUtils.class)
-public class VmImportManagerImplTest {
-
-    @InjectMocks
-    private VmImportService vmIngestionService = new VmImportManagerImpl();
-
-    @Mock
-    private UserVmManager userVmManager;
-    @Mock
-    private ClusterDao clusterDao;
-    @Mock
-    private ResourceManager resourceManager;
-    @Mock
-    private VMTemplatePoolDao templatePoolDao;
-    @Mock
-    private AgentManager agentManager;
-    @Mock
-    private AccountService accountService;
-    @Mock
-    private UserDao userDao;
-    @Mock
-    private DataCenterDao dataCenterDao;
-    @Mock
-    private VMTemplateDao templateDao;
-    @Mock
-    private VMInstanceDao vmDao;
-    @Mock
-    private ServiceOfferingDao serviceOfferingDao;
-    @Mock
-    private DiskOfferingDao diskOfferingDao;
-    @Mock
-    private NetworkDao networkDao;
-    @Mock
-    private NetworkOrchestrationService networkOrchestrationService;
-    @Mock
-    private VolumeOrchestrationService volumeManager;
-    @Mock
-    public ResponseGenerator responseGenerator;
-    @Mock
-    private VolumeDao volumeDao;
-    @Mock
-    private ResourceLimitService resourceLimitService;
-    @Mock
-    private PrimaryDataStoreDao primaryDataStoreDao;
-    @Mock
-    private VolumeApiService volumeApiService;
-    @Mock
-    private NetworkModel networkModel;
-    @Mock
-    private ConfigurationDao configurationDao;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        AccountVO account = new AccountVO("admin", 1L, "", Account.ACCOUNT_TYPE_ADMIN, "uuid");
-        UserVO user = new UserVO(1, "adminuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
-        CallContext.register(user, account);
-
-        UnmanagedInstanceTO instance = new UnmanagedInstanceTO();
-        instance.setName("TestInstance");
-        instance.setCpuCores(2);
-        instance.setCpuCoresPerSocket(1);
-        instance.setCpuSpeed(1000);
-        instance.setMemory(1024);
-        instance.setOperatingSystem("CentOS 7");
-        List<UnmanagedInstanceTO.Disk> instanceDisks = new ArrayList<>();
-        UnmanagedInstanceTO.Disk instanceDisk = new UnmanagedInstanceTO.Disk();
-        instanceDisk.setDiskId("1000-1");
-        instanceDisk.setLabel("DiskLabel");
-        instanceDisk.setController("scsi");
-        instanceDisk.setImagePath("[b6ccf44a1fa13e29b3667b4954fa10ee] TestInstance/ROOT-1.vmdk");
-        instanceDisk.setCapacity(5242880L);
-        instanceDisk.setDatastoreName("Test");
-        instanceDisk.setDatastoreHost("Test");
-        instanceDisk.setDatastorePath("Test");
-        instanceDisk.setDatastoreType("NFS");
-        instanceDisks.add(instanceDisk);
-        instance.setDisks(instanceDisks);
-        List<UnmanagedInstanceTO.Nic> instanceNics = new ArrayList<>();
-        UnmanagedInstanceTO.Nic instanceNic = new UnmanagedInstanceTO.Nic();
-        instanceNic.setNicId("NIC 1");
-        instanceNic.setAdapterType("VirtualE1000E");
-        instanceNic.setMacAddress("02:00:2e:0f:00:02");
-        instanceNic.setVlan(1024);
-        instanceNics.add(instanceNic);
-        instance.setNics(instanceNics);
-        instance.setPowerState(UnmanagedInstanceTO.PowerState.PowerOn);
-
-        ClusterVO clusterVO = new ClusterVO(1L, 1L, "Cluster");
-        clusterVO.setHypervisorType(Hypervisor.HypervisorType.VMware.toString());
-        when(clusterDao.findById(Mockito.anyLong())).thenReturn(clusterVO);
-        when(configurationDao.getValue(Mockito.anyString())).thenReturn(null);
-        doNothing().when(resourceLimitService).checkResourceLimit(any(Account.class), any(Resource.ResourceType.class), anyLong());
-        List<HostVO> hosts = new ArrayList<>();
-        HostVO hostVO = Mockito.mock(HostVO.class);
-        when(hostVO.isInMaintenanceStates()).thenReturn(false);
-        hosts.add(hostVO);
-        when(resourceManager.listHostsInClusterByStatus(Mockito.anyLong(), Mockito.any(Status.class))).thenReturn(hosts);
-        List<VMTemplateStoragePoolVO> templates = new ArrayList<>();
-        when(templatePoolDao.listAll()).thenReturn(templates);
-        List<VolumeVO> volumes = new ArrayList<>();
-        when(volumeDao.findIncludingRemovedByZone(Mockito.anyLong())).thenReturn(volumes);
-        List<VMInstanceVO> vms = new ArrayList<>();
-        when(vmDao.listByHostId(Mockito.anyLong())).thenReturn(vms);
-        when(vmDao.listByLastHostIdAndStates(Mockito.anyLong())).thenReturn(vms);
-        GetUnmanagedInstancesCommand cmd = Mockito.mock(GetUnmanagedInstancesCommand.class);
-        HashMap<String, UnmanagedInstanceTO> map = new HashMap<>();
-        map.put(instance.getName(), instance);
-        Answer answer = new GetUnmanagedInstancesAnswer(cmd, "", map);
-        when(agentManager.easySend(Mockito.anyLong(), Mockito.any(GetUnmanagedInstancesCommand.class))).thenReturn(answer);
-        DataCenterVO zone = Mockito.mock(DataCenterVO.class);
-        when(zone.getId()).thenReturn(1L);
-        when(dataCenterDao.findById(Mockito.anyLong())).thenReturn(zone);
-        when(accountService.getActiveAccountById(Mockito.anyLong())).thenReturn(Mockito.mock(Account.class));
-        List<UserVO> users = new ArrayList<>();
-        users.add(Mockito.mock(UserVO.class));
-        when(userDao.listByAccount(Mockito.anyLong())).thenReturn(users);
-        VMTemplateVO template = Mockito.mock(VMTemplateVO.class);
-        when(template.getId()).thenReturn(1L);
-        when(template.getName()).thenReturn("Template");
-        when(templateDao.findById(Mockito.anyLong())).thenReturn(template);
-        when(templateDao.findByName(Mockito.anyString())).thenReturn(template);
-        ServiceOfferingVO serviceOffering = Mockito.mock(ServiceOfferingVO.class);
-        when(serviceOffering.getId()).thenReturn(1L);
-        when(serviceOffering.getTags()).thenReturn("");
-        when(serviceOffering.isDynamic()).thenReturn(false);
-        when(serviceOffering.getCpu()).thenReturn(instance.getCpuCores());
-        when(serviceOffering.getRamSize()).thenReturn(instance.getMemory());
-        when(serviceOffering.getSpeed()).thenReturn(instance.getCpuSpeed());
-        when(serviceOfferingDao.findById(Mockito.anyLong())).thenReturn(serviceOffering);
-        DiskOfferingVO diskOfferingVO = Mockito.mock(DiskOfferingVO.class);
-        when(diskOfferingVO.isCustomized()).thenReturn(false);
-        when(diskOfferingVO.getDiskSize()).thenReturn(Long.MAX_VALUE);
-        when(diskOfferingDao.findById(Mockito.anyLong())).thenReturn(diskOfferingVO);
-        UserVmVO userVm = Mockito.mock(UserVmVO.class);
-        when(userVm.getAccountId()).thenReturn(1L);
-        when(userVm.getDataCenterId()).thenReturn(1L);
-        when(userVm.getHostName()).thenReturn(instance.getName());
-        when(userVm.getTemplateId()).thenReturn(1L);
-        when(userVm.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.VMware);
-        when(userVm.getUuid()).thenReturn("abcd");
-        when(userVm.isDisplayVm()).thenReturn(true);
-        // Skip usage publishing and resource increment for test
-        when(userVm.getType()).thenReturn(VirtualMachine.Type.Instance);
-        userVm.setInstanceName(instance.getName());
-        userVm.setHostName(instance.getName());
-        StoragePoolVO poolVO = Mockito.mock(StoragePoolVO.class);
-        when(poolVO.getDataCenterId()).thenReturn(1L);
-        when(poolVO.getClusterId()).thenReturn(clusterVO.getId());
-        List<StoragePoolVO> pools = new ArrayList<>();
-        pools.add(poolVO);
-        when(primaryDataStoreDao.listPoolByHostPath(Mockito.anyString(), Mockito.anyString())).thenReturn(pools);
-        when(userVmManager.importVM(nullable(DataCenter.class), nullable(Host.class), nullable(VirtualMachineTemplate.class), nullable(String.class), nullable(String.class),
-                nullable(Account.class), nullable(String.class), nullable(Account.class), nullable(Boolean.class), nullable(String.class),
-                nullable(Long.class), nullable(Long.class), nullable(ServiceOffering.class), nullable(String.class),
-                nullable(String.class), nullable(Hypervisor.HypervisorType.class), nullable(Map.class), nullable(VirtualMachine.PowerState.class))).thenReturn(userVm);
-        when(volumeApiService.doesTargetStorageSupportDiskOffering(Mockito.any(StoragePool.class), Mockito.anyString())).thenReturn(true);
-        NetworkVO networkVO = Mockito.mock(NetworkVO.class);
-        when(networkVO.getGuestType()).thenReturn(Network.GuestType.L2);
-        when(networkVO.getBroadcastUri()).thenReturn(URI.create(String.format("vlan://%d", instanceNic.getVlan())));
-        when(networkVO.getDataCenterId()).thenReturn(1L);
-        when(networkDao.findById(Mockito.anyLong())).thenReturn(networkVO);
-        List<NetworkVO> networks = new ArrayList<>();
-        networks.add(networkVO);
-        when(networkDao.listByZone(Mockito.anyLong())).thenReturn(networks);
-        doNothing().when(networkModel).checkNetworkPermissions(Mockito.any(Account.class), Mockito.any(Network.class));
-        doNothing().when(networkModel).checkRequestedIpAddresses(Mockito.anyLong(), Mockito.any(Network.IpAddresses.class));
-        NicProfile profile = Mockito.mock(NicProfile.class);
-        Integer deviceId = 100;
-        Pair<NicProfile, Integer> pair = new Pair<NicProfile, Integer>(profile, deviceId);
-        when(networkOrchestrationService.importNic(nullable(String.class), nullable(Integer.class), nullable(Network.class), nullable(Boolean.class), nullable(VirtualMachine.class), nullable(Network.IpAddresses.class))).thenReturn(pair);
-        when(volumeManager.importVolume(Mockito.any(Volume.Type.class), Mockito.anyString(), Mockito.any(DiskOffering.class), Mockito.anyLong(),
-                Mockito.anyLong(), Mockito.anyLong(), Mockito.any(VirtualMachine.class), Mockito.any(VirtualMachineTemplate.class),
-                Mockito.any(Account.class), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyString(), Mockito.anyString())).thenReturn(Mockito.mock(DiskProfile.class));
-        when(volumeDao.findByInstance(Mockito.anyLong())).thenReturn(volumes);
-        List<UserVmResponse> userVmResponses = new ArrayList<>();
-        UserVmResponse userVmResponse = new UserVmResponse();
-        userVmResponse.setInstanceName(instance.getName());
-        userVmResponses.add(userVmResponse);
-        when(responseGenerator.createUserVmResponse(Mockito.any(ResponseObject.ResponseView.class), Mockito.anyString(), Mockito.any(UserVm.class))).thenReturn(userVmResponses);
-    }
-
-    @After
-    public void tearDown() {
-        CallContext.unregister();
-    }
-
-    @Test
-    public void listUnmanagedInstancesTest() {
-        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
-        vmIngestionService.listUnmanagedInstances(cmd);
-    }
-
-    @Test(expected = InvalidParameterValueException.class)
-    public void listUnmanagedInstancesInvalidHypervisorTest() {
-        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
-        ClusterVO cluster = new ClusterVO(1, 1, "Cluster");
-        cluster.setHypervisorType(Hypervisor.HypervisorType.KVM.toString());
-        when(clusterDao.findById(Mockito.anyLong())).thenReturn(cluster);
-        vmIngestionService.listUnmanagedInstances(cmd);
-    }
-
-    @Test(expected = PermissionDeniedException.class)
-    public void listUnmanagedInstancesInvalidCallerTest() {
-        CallContext.unregister();
-        AccountVO account = new AccountVO("user", 1L, "", Account.ACCOUNT_TYPE_NORMAL, "uuid");
-        UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString(), User.Source.UNKNOWN);
-        CallContext.register(user, account);
-        ListUnmanagedInstancesCmd cmd = Mockito.mock(ListUnmanagedInstancesCmd.class);
-        vmIngestionService.listUnmanagedInstances(cmd);
-    }
-
-    @Test
-    public void importUnmanagedInstanceTest() {
-        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
-        when(importUnmanageInstanceCmd.getName()).thenReturn("TestInstance");
-        when(importUnmanageInstanceCmd.getAccountName()).thenReturn(null);
-        when(importUnmanageInstanceCmd.getDomainId()).thenReturn(null);
-        PowerMockito.mockStatic(UsageEventUtils.class);
-        vmIngestionService.importUnmanagedInstance(importUnmanageInstanceCmd);
-    }
-
-    @Test(expected = InvalidParameterValueException.class)
-    public void importUnmanagedInstanceInvalidHostnameTest() {
-        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
-        when(importUnmanageInstanceCmd.getName()).thenReturn("TestInstance");
-        when(importUnmanageInstanceCmd.getName()).thenReturn("some name");
-        when(importUnmanageInstanceCmd.getMigrateAllowed()).thenReturn(false);
-        vmIngestionService.importUnmanagedInstance(importUnmanageInstanceCmd);
-    }
-
-    @Test(expected = ServerApiException.class)
-    public void importUnmanagedInstanceMissingInstanceTest() {
-        ImportUnmanagedInstanceCmd importUnmanageInstanceCmd = Mockito.mock(ImportUnmanagedInstanceCmd.class);
-        when(importUnmanageInstanceCmd.getName()).thenReturn("SomeInstance");
-        when(importUnmanageInstanceCmd.getAccountName()).thenReturn(null);
-        when(importUnmanageInstanceCmd.getDomainId()).thenReturn(null);
-        vmIngestionService.importUnmanagedInstance(importUnmanageInstanceCmd);
-    }
-}
\ No newline at end of file
diff --git a/server/src/test/resources/createNetworkOffering.xml b/server/src/test/resources/createNetworkOffering.xml
index 8dee0e8..55343ef 100644
--- a/server/src/test/resources/createNetworkOffering.xml
+++ b/server/src/test/resources/createNetworkOffering.xml
@@ -60,4 +60,5 @@
     <bean id="networkOfferingDetailsDaoImpl" class="com.cloud.offerings.dao.NetworkOfferingDetailsDaoImpl" />

     <bean id="vMTemplateZoneDaoImpl" class="com.cloud.storage.dao.VMTemplateZoneDaoImpl" />

     <bean id="indirectAgentLBImpl" class="org.apache.cloudstack.agent.lb.IndirectAgentLBServiceImpl" />

+    <bean id="VsphereStoragePolicyDaoImpl" class="com.cloud.dc.dao.VsphereStoragePolicyDaoImpl" />

 </beans>

diff --git a/services/console-proxy/pom.xml b/services/console-proxy/pom.xml
index 0960542..10797fb 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 1c9b74b..6b8d4f8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 4c669f4..342bb8a 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -50,6 +50,21 @@
             <artifactId>cloudstack-service-console-proxy-rdpclient</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>javax.websocket</groupId>
+            <artifactId>javax.websocket-api</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${cs.jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty.websocket</groupId>
+            <artifactId>websocket-server</artifactId>
+            <version>${cs.jetty.version}</version>
+        </dependency>
     </dependencies>
     <build>
         <resources>
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java
index 2161de2..7a70a38 100644
--- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxy.java
@@ -32,6 +32,7 @@
 import java.util.concurrent.Executor;
 
 import org.apache.log4j.xml.DOMConfigurator;
+import org.eclipse.jetty.websocket.api.Session;
 
 import com.cloud.consoleproxy.util.Logger;
 import com.cloud.utils.PropertiesUtil;
@@ -344,12 +345,22 @@
             server.createContext("/ajaximg", new ConsoleProxyAjaxImageHandler());
             server.setExecutor(new ThreadExecutor()); // creates a default executor
             server.start();
+
+            ConsoleProxyNoVNCServer noVNCServer = getNoVNCServer();
+            noVNCServer.start();
+
         } catch (Exception e) {
             s_logger.error(e.getMessage(), e);
             System.exit(1);
         }
     }
 
+    private static ConsoleProxyNoVNCServer getNoVNCServer() {
+        if (httpListenPort == 443)
+            return new ConsoleProxyNoVNCServer(ksBits, ksPassword);
+        return new ConsoleProxyNoVNCServer();
+    }
+
     private static void startupHttpCmdPort() {
         try {
             s_logger.info("Listening for HTTP CMDs on port " + httpCmdListenPort);
@@ -395,7 +406,7 @@
         String clientKey = param.getClientMapKey();
         synchronized (connectionMap) {
             viewer = connectionMap.get(clientKey);
-            if (viewer == null) {
+            if (viewer == null || viewer.getClass() == ConsoleProxyNoVncClient.class) {
                 viewer = getClient(param);
                 viewer.initClient(param);
                 connectionMap.put(clientKey, viewer);
@@ -429,7 +440,7 @@
         String clientKey = param.getClientMapKey();
         synchronized (connectionMap) {
             ConsoleProxyClient viewer = connectionMap.get(clientKey);
-            if (viewer == null) {
+            if (viewer == null || viewer.getClass() == ConsoleProxyNoVncClient.class) {
                 authenticationExternally(param);
                 viewer = getClient(param);
                 viewer.initClient(param);
@@ -521,4 +532,40 @@
             new Thread(r).start();
         }
     }
+
+    public static ConsoleProxyNoVncClient getNoVncViewer(ConsoleProxyClientParam param, String ajaxSession,
+            Session session) throws AuthenticationException {
+        boolean reportLoadChange = false;
+        String clientKey = param.getClientMapKey();
+        synchronized (connectionMap) {
+            ConsoleProxyClient viewer = connectionMap.get(clientKey);
+            if (viewer == null || viewer.getClass() != ConsoleProxyNoVncClient.class) {
+                authenticationExternally(param);
+                viewer = new ConsoleProxyNoVncClient(session);
+                viewer.initClient(param);
+
+                connectionMap.put(clientKey, viewer);
+                reportLoadChange = true;
+            } else {
+                if (param.getClientHostPassword() == null || param.getClientHostPassword().isEmpty() ||
+                        !param.getClientHostPassword().equals(viewer.getClientHostPassword()))
+                    throw new AuthenticationException("Cannot use the existing viewer " + viewer + ": bad sid");
+
+                if (!viewer.isFrontEndAlive()) {
+                    authenticationExternally(param);
+                    viewer.initClient(param);
+                    reportLoadChange = true;
+                }
+            }
+
+            if (reportLoadChange) {
+                ConsoleProxyClientStatsCollector statsCollector = getStatsCollector();
+                String loadInfo = statsCollector.getStatsReport();
+                reportLoadInfo(loadInfo);
+                if (s_logger.isDebugEnabled())
+                    s_logger.debug("Report load change : " + loadInfo);
+            }
+            return (ConsoleProxyNoVncClient)viewer;
+        }
+    }
 }
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java
new file mode 100644
index 0000000..349d984
--- /dev/null
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCHandler.java
@@ -0,0 +1,145 @@
+// 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.consoleproxy;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.cloud.consoleproxy.util.Logger;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
+import org.eclipse.jetty.websocket.api.annotations.OnWebSocketFrame;
+import org.eclipse.jetty.websocket.api.annotations.WebSocket;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+import org.eclipse.jetty.websocket.server.WebSocketHandler;
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+
+@WebSocket
+public class ConsoleProxyNoVNCHandler extends WebSocketHandler {
+
+    private ConsoleProxyNoVncClient viewer;
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyNoVNCHandler.class);
+
+    public ConsoleProxyNoVNCHandler() {
+        super();
+    }
+
+    @Override
+    public void configure(WebSocketServletFactory webSocketServletFactory) {
+        webSocketServletFactory.register(ConsoleProxyNoVNCHandler.class);
+    }
+
+    @Override
+    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, ServletException {
+
+        if (this.getWebSocketFactory().isUpgradeRequest(request, response)) {
+            response.addHeader("Sec-WebSocket-Protocol", "binary");
+            if (this.getWebSocketFactory().acceptWebSocket(request, response)) {
+                baseRequest.setHandled(true);
+                return;
+            }
+
+            if (response.isCommitted()) {
+                return;
+            }
+        }
+
+        super.handle(target, baseRequest, request, response);
+    }
+
+    @OnWebSocketConnect
+    public void onConnect(final Session session) throws IOException, InterruptedException {
+
+        String queries = session.getUpgradeRequest().getQueryString();
+        Map<String, String> queryMap = ConsoleProxyHttpHandlerHelper.getQueryMap(queries);
+
+        String host = queryMap.get("host");
+        String portStr = queryMap.get("port");
+        String sid = queryMap.get("sid");
+        String tag = queryMap.get("tag");
+        String ticket = queryMap.get("ticket");
+        String ajaxSessionIdStr = queryMap.get("sess");
+        String console_url = queryMap.get("consoleurl");
+        String console_host_session = queryMap.get("sessionref");
+        String vm_locale = queryMap.get("locale");
+        String hypervHost = queryMap.get("hypervHost");
+        String username = queryMap.get("username");
+        String password = queryMap.get("password");
+
+        if (tag == null)
+            tag = "";
+
+        long ajaxSessionId = 0;
+        int port;
+
+        if (host == null || portStr == null || sid == null)
+            throw new IllegalArgumentException();
+
+        try {
+            port = Integer.parseInt(portStr);
+        } catch (NumberFormatException e) {
+            s_logger.warn("Invalid number parameter in query string: " + portStr);
+            throw new IllegalArgumentException(e);
+        }
+
+        if (ajaxSessionIdStr != null) {
+            try {
+                ajaxSessionId = Long.parseLong(ajaxSessionIdStr);
+            } catch (NumberFormatException e) {
+                s_logger.warn("Invalid number parameter in query string: " + ajaxSessionIdStr);
+                throw new IllegalArgumentException(e);
+            }
+        }
+
+        try {
+            ConsoleProxyClientParam param = new ConsoleProxyClientParam();
+            param.setClientHostAddress(host);
+            param.setClientHostPort(port);
+            param.setClientHostPassword(sid);
+            param.setClientTag(tag);
+            param.setTicket(ticket);
+            param.setClientTunnelUrl(console_url);
+            param.setClientTunnelSession(console_host_session);
+            param.setLocale(vm_locale);
+            param.setHypervHost(hypervHost);
+            param.setUsername(username);
+            param.setPassword(password);
+            viewer = ConsoleProxy.getNoVncViewer(param, ajaxSessionIdStr, session);
+        } catch (Exception e) {
+            s_logger.warn("Failed to create viewer due to " + e.getMessage(), e);
+            return;
+        }
+    }
+
+    @OnWebSocketClose
+    public void onClose(Session session, int statusCode, String reason) throws IOException, InterruptedException {
+        ConsoleProxy.removeViewer(viewer);
+    }
+
+    @OnWebSocketFrame
+    public void onFrame(Frame f) throws IOException {
+        viewer.sendClientFrame(f);
+    }
+}
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCServer.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCServer.java
new file mode 100644
index 0000000..28d179b
--- /dev/null
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVNCServer.java
@@ -0,0 +1,79 @@
+// 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.consoleproxy;
+
+import java.io.ByteArrayInputStream;
+import java.security.KeyStore;
+
+import com.cloud.consoleproxy.util.Logger;
+
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class ConsoleProxyNoVNCServer {
+
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyNoVNCServer.class);
+    private static final int wsPort = 8080;
+
+    private Server server;
+
+    public ConsoleProxyNoVNCServer() {
+        this.server = new Server(wsPort);
+        ConsoleProxyNoVNCHandler handler = new ConsoleProxyNoVNCHandler();
+        this.server.setHandler(handler);
+    }
+
+    public ConsoleProxyNoVNCServer(byte[] ksBits, String ksPassword) {
+        this.server = new Server();
+        ConsoleProxyNoVNCHandler handler = new ConsoleProxyNoVNCHandler();
+        this.server.setHandler(handler);
+
+        try {
+            final HttpConfiguration httpConfig = new HttpConfiguration();
+            httpConfig.setSecureScheme("https");
+            httpConfig.setSecurePort(wsPort);
+
+            final HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
+            httpsConfig.addCustomizer(new SecureRequestCustomizer());
+
+            final SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
+            char[] passphrase = ksPassword != null ? ksPassword.toCharArray() : null;
+            KeyStore ks = KeyStore.getInstance("JKS");
+            ks.load(new ByteArrayInputStream(ksBits), passphrase);
+            sslContextFactory.setKeyStore(ks);
+            sslContextFactory.setKeyStorePassword(ksPassword);
+            sslContextFactory.setKeyManagerPassword(ksPassword);
+
+            final ServerConnector sslConnector = new ServerConnector(server,
+                new SslConnectionFactory(sslContextFactory, "http/1.1"),
+                new HttpConnectionFactory(httpsConfig));
+            sslConnector.setPort(wsPort);
+            server.addConnector(sslConnector);
+        } catch (Exception e) {
+            s_logger.error("Unable to secure server due to exception ", e);
+        }
+    }
+
+    public void start() throws Exception {
+        this.server.start();
+    }
+}
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java
new file mode 100644
index 0000000..97963f8
--- /dev/null
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyNoVncClient.java
@@ -0,0 +1,238 @@
+// 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.consoleproxy;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jetty.websocket.api.Session;
+import org.eclipse.jetty.websocket.api.extensions.Frame;
+
+import java.awt.Image;
+import java.io.IOException;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import com.cloud.consoleproxy.vnc.NoVncClient;
+
+public class ConsoleProxyNoVncClient implements ConsoleProxyClient {
+    private static final Logger s_logger = Logger.getLogger(ConsoleProxyNoVncClient.class);
+    private static int nextClientId = 0;
+
+    private NoVncClient client;
+    private Session session;
+
+    protected int clientId = getNextClientId();
+    protected long ajaxSessionId = 0;
+
+    protected long createTime = System.currentTimeMillis();
+    protected long lastFrontEndActivityTime = System.currentTimeMillis();
+
+    private boolean connectionAlive;
+
+    private ConsoleProxyClientParam clientParam;
+
+    public ConsoleProxyNoVncClient(Session session) {
+        this.session = session;
+    }
+
+    private int getNextClientId() {
+        return ++nextClientId;
+    }
+
+    @Override
+    public void sendClientRawKeyboardEvent(InputEventType event, int code, int modifiers) {
+    }
+
+    @Override
+    public void sendClientMouseEvent(InputEventType event, int x, int y, int code, int modifiers) {
+    }
+
+    @Override
+    public boolean isHostConnected() {
+        return connectionAlive;
+    }
+
+    @Override
+    public boolean isFrontEndAlive() {
+        if (!connectionAlive || System.currentTimeMillis()
+                - getClientLastFrontEndActivityTime() > ConsoleProxy.VIEWER_LINGER_SECONDS * 1000) {
+            s_logger.info("Front end has been idle for too long");
+            return false;
+        }
+        return true;
+    }
+
+    public void sendClientFrame(Frame f) throws IOException {
+        byte[] data = new byte[f.getPayloadLength()];
+        f.getPayload().get(data);
+        client.write(data);
+    }
+
+    @Override
+    public void initClient(ConsoleProxyClientParam param) {
+        setClientParam(param);
+        client = new NoVncClient();
+        connectionAlive = true;
+
+        updateFrontEndActivityTime();
+        Thread worker = new Thread(new Runnable() {
+            public void run() {
+                try {
+
+                    String tunnelUrl = param.getClientTunnelUrl();
+                    String tunnelSession = param.getClientTunnelSession();
+
+                    try {
+                        if (tunnelUrl != null && !tunnelUrl.isEmpty() && tunnelSession != null
+                                && !tunnelSession.isEmpty()) {
+                            URI uri = new URI(tunnelUrl);
+                            s_logger.info("Connect to VNC server via tunnel. url: " + tunnelUrl + ", session: "
+                                    + tunnelSession);
+
+                            ConsoleProxy.ensureRoute(uri.getHost());
+                            client.connectTo(uri.getHost(), uri.getPort(), uri.getPath() + "?" + uri.getQuery(),
+                                    tunnelSession, "https".equalsIgnoreCase(uri.getScheme()));
+                        } else {
+                            s_logger.info("Connect to VNC server directly. host: " + getClientHostAddress() + ", port: "
+                                    + getClientHostPort());
+                            ConsoleProxy.ensureRoute(getClientHostAddress());
+                            client.connectTo(getClientHostAddress(), getClientHostPort());
+                        }
+                    } catch (UnknownHostException e) {
+                        s_logger.error("Unexpected exception", e);
+                    } catch (IOException e) {
+                        s_logger.error("Unexpected exception", e);
+                    } catch (Throwable e) {
+                        s_logger.error("Unexpected exception", e);
+                    }
+
+                    String ver = client.handshake();
+                    session.getRemote().sendBytes(ByteBuffer.wrap(ver.getBytes(), 0, ver.length()));
+
+                    byte[] b = client.authenticate(getClientHostPassword());
+                    session.getRemote().sendBytes(ByteBuffer.wrap(b, 0, 4));
+
+                    int readBytes;
+                    while (connectionAlive) {
+                        b = new byte[100];
+                        readBytes = client.read(b);
+                        if (readBytes == -1) {
+                            break;
+                        }
+                        if (readBytes > 0) {
+                            session.getRemote().sendBytes(ByteBuffer.wrap(b, 0, readBytes));
+                            updateFrontEndActivityTime();
+                        }
+                    }
+                    connectionAlive = false;
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+
+        });
+        worker.start();
+    }
+
+    private void setClientParam(ConsoleProxyClientParam param) {
+        this.clientParam = param;
+    }
+
+    @Override
+    public void closeClient() {
+        this.connectionAlive = false;
+        ConsoleProxy.removeViewer(this);
+    }
+
+    @Override
+    public int getClientId() {
+        return this.clientId;
+    }
+
+    @Override
+    public long getAjaxSessionId() {
+        return this.ajaxSessionId;
+    }
+
+    @Override
+    public AjaxFIFOImageCache getAjaxImageCache() {
+        // Unimplemented
+        return null;
+    }
+
+    @Override
+    public Image getClientScaledImage(int width, int height) {
+        // Unimplemented
+        return null;
+    }
+
+    @Override
+    public String onAjaxClientStart(String title, List<String> languages, String guest) {
+        // Unimplemented
+        return null;
+    }
+
+    @Override
+    public String onAjaxClientUpdate() {
+        // Unimplemented
+        return null;
+    }
+
+    @Override
+    public String onAjaxClientKickoff() {
+        // Unimplemented
+        return null;
+    }
+
+    @Override
+    public long getClientCreateTime() {
+        return createTime;
+    }
+
+    public void updateFrontEndActivityTime() {
+        lastFrontEndActivityTime = System.currentTimeMillis();
+    }
+
+    @Override
+    public long getClientLastFrontEndActivityTime() {
+        return lastFrontEndActivityTime;
+    }
+
+    @Override
+    public String getClientHostAddress() {
+        return clientParam.getClientHostAddress();
+    }
+
+    @Override
+    public int getClientHostPort() {
+        return clientParam.getClientHostPort();
+    }
+
+    @Override
+    public String getClientHostPassword() {
+        return clientParam.getClientHostPassword();
+    }
+
+    @Override
+    public String getClientTag() {
+        if (clientParam.getClientTag() != null)
+            return clientParam.getClientTag();
+        return "";
+    }
+
+}
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
index 8659120..d5dbe08 100644
--- a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/ConsoleProxyResourceHandler.java
@@ -54,6 +54,7 @@
         s_validResourceFolders.put("js", "");
         s_validResourceFolders.put("css", "");
         s_validResourceFolders.put("html", "");
+        s_validResourceFolders.put("noVNC", "");
     }
 
     public ConsoleProxyResourceHandler() {
diff --git a/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/vnc/NoVncClient.java b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/vnc/NoVncClient.java
new file mode 100644
index 0000000..9a43725
--- /dev/null
+++ b/services/console-proxy/server/src/main/java/com/cloud/consoleproxy/vnc/NoVncClient.java
@@ -0,0 +1,219 @@
+// 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.consoleproxy.vnc;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.nio.charset.Charset;
+import java.security.spec.KeySpec;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+
+import com.cloud.consoleproxy.util.Logger;
+import com.cloud.consoleproxy.util.RawHTTP;
+
+public class NoVncClient {
+    private static final Logger s_logger = Logger.getLogger(NoVncClient.class);
+
+    private Socket socket;
+    private DataInputStream is;
+    private DataOutputStream os;
+
+    public NoVncClient() {
+    }
+
+    public void connectTo(String host, int port, String path, String session, boolean useSSL) throws UnknownHostException, IOException {
+        if (port < 0) {
+            if (useSSL)
+                port = 443;
+            else
+                port = 80;
+        }
+
+        RawHTTP tunnel = new RawHTTP("CONNECT", host, port, path, session, useSSL);
+        socket = tunnel.connect();
+        setStreams();
+    }
+
+    public void connectTo(String host, int port) throws UnknownHostException, IOException {
+        // Connect to server
+        s_logger.info("Connecting to VNC server " + host + ":" + port + "...");
+        socket = new Socket(host, port);
+        setStreams();
+    }
+
+    private void setStreams() throws IOException {
+        this.is = new DataInputStream(this.socket.getInputStream());
+        this.os = new DataOutputStream(this.socket.getOutputStream());
+    }
+
+    /**
+     * Handshake with VNC server.
+     */
+    public String handshake() throws IOException {
+
+        // Read protocol version
+        byte[] buf = new byte[12];
+        is.readFully(buf);
+        String rfbProtocol = new String(buf);
+
+        // Server should use RFB protocol 3.x
+        if (!rfbProtocol.contains(RfbConstants.RFB_PROTOCOL_VERSION_MAJOR)) {
+            s_logger.error("Cannot handshake with VNC server. Unsupported protocol version: \"" + rfbProtocol + "\".");
+            throw new RuntimeException(
+                    "Cannot handshake with VNC server. Unsupported protocol version: \"" + rfbProtocol + "\".");
+        }
+
+        // Proxy that we support RFB 3.3 only
+        return RfbConstants.RFB_PROTOCOL_VERSION + "\n";
+    }
+
+    /**
+     * VNC authentication.
+     */
+    public byte[] authenticate(String password)
+            throws IOException {
+        // Read security type
+        int authType = is.readInt();
+
+        switch (authType) {
+            case RfbConstants.CONNECTION_FAILED: {
+                // Server forbids to connect. Read reason and throw exception
+                int length = is.readInt();
+                byte[] buf = new byte[length];
+                is.readFully(buf);
+                String reason = new String(buf, RfbConstants.CHARSET);
+
+                s_logger.error("Authentication to VNC server is failed. Reason: " + reason);
+                throw new RuntimeException("Authentication to VNC server is failed. Reason: " + reason);
+            }
+
+            case RfbConstants.NO_AUTH: {
+                // Client can connect without authorization. Nothing to do.
+                break;
+            }
+
+            case RfbConstants.VNC_AUTH: {
+                s_logger.info("VNC server requires password authentication");
+                doVncAuth(is, os, password);
+                break;
+            }
+
+            default:
+                s_logger.error("Unsupported VNC protocol authorization scheme, scheme code: " + authType + ".");
+                throw new RuntimeException(
+                        "Unsupported VNC protocol authorization scheme, scheme code: " + authType + ".");
+        }
+        // Since we've taken care of the auth, we tell the client that there's no auth
+        // going on
+       return new byte[] { 0, 0, 0, 1 };
+    }
+
+    /**
+     * Encode client password and send it to server.
+     */
+    private void doVncAuth(DataInputStream in, DataOutputStream out, String password) throws IOException {
+
+        // Read challenge
+        byte[] challenge = new byte[16];
+        in.readFully(challenge);
+
+        // Encode challenge with password
+        byte[] response;
+        try {
+            response = encodePassword(challenge, password);
+        } catch (Exception e) {
+            s_logger.error("Cannot encrypt client password to send to server: " + e.getMessage());
+            throw new RuntimeException("Cannot encrypt client password to send to server: " + e.getMessage());
+        }
+
+        // Send encoded challenge
+        out.write(response);
+        out.flush();
+
+        // Read security result
+        int authResult = in.readInt();
+
+        switch (authResult) {
+            case RfbConstants.VNC_AUTH_OK: {
+                // Nothing to do
+                break;
+            }
+
+            case RfbConstants.VNC_AUTH_TOO_MANY:
+                s_logger.error("Connection to VNC server failed: too many wrong attempts.");
+                throw new RuntimeException("Connection to VNC server failed: too many wrong attempts.");
+
+            case RfbConstants.VNC_AUTH_FAILED:
+                s_logger.error("Connection to VNC server failed: wrong password.");
+                throw new RuntimeException("Connection to VNC server failed: wrong password.");
+
+            default:
+                s_logger.error("Connection to VNC server failed, reason code: " + authResult);
+                throw new RuntimeException("Connection to VNC server failed, reason code: " + authResult);
+        }
+    }
+
+    private byte flipByte(byte b) {
+        int b1_8 = (b & 0x1) << 7;
+        int b2_7 = (b & 0x2) << 5;
+        int b3_6 = (b & 0x4) << 3;
+        int b4_5 = (b & 0x8) << 1;
+        int b5_4 = (b & 0x10) >>> 1;
+        int b6_3 = (b & 0x20) >>> 3;
+        int b7_2 = (b & 0x40) >>> 5;
+        int b8_1 = (b & 0x80) >>> 7;
+        byte c = (byte) (b1_8 | b2_7 | b3_6 | b4_5 | b5_4 | b6_3 | b7_2 | b8_1);
+        return c;
+    }
+
+    public byte[] encodePassword(byte[] challenge, String password) throws Exception {
+        // VNC password consist of up to eight ASCII characters.
+        byte[] key = { 0, 0, 0, 0, 0, 0, 0, 0 }; // Padding
+        byte[] passwordAsciiBytes = password.getBytes(Charset.availableCharsets().get("US-ASCII"));
+        System.arraycopy(passwordAsciiBytes, 0, key, 0, Math.min(password.length(), 8));
+
+        // Flip bytes (reverse bits) in key
+        for (int i = 0; i < key.length; i++) {
+            key[i] = flipByte(key[i]);
+        }
+
+        KeySpec desKeySpec = new DESKeySpec(key);
+        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
+        SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);
+        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+
+        byte[] response = cipher.doFinal(challenge);
+        return response;
+    }
+
+    public int read(byte[] b) throws IOException {
+        return is.read(b);
+    }
+
+    public void write(byte[] b) throws IOException {
+        os.write(b);
+    }
+
+}
\ No newline at end of file
diff --git a/services/pom.xml b/services/pom.xml
index ab75fed..03d90f1 100644
--- a/services/pom.xml
+++ b/services/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 2f3fc2e..a5b558c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/PremiumSecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/PremiumSecondaryStorageManagerImpl.java
index ecfc67e..74d1b50 100644
--- a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/PremiumSecondaryStorageManagerImpl.java
+++ b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/PremiumSecondaryStorageManagerImpl.java
@@ -16,6 +16,8 @@
 // under the License.
 package org.apache.cloudstack.secondarystorage;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -27,16 +29,19 @@
 
 import com.cloud.agent.api.Command;
 import com.cloud.configuration.Config;
+import com.cloud.host.Host;
 import com.cloud.host.HostVO;
 import com.cloud.host.Status;
 import com.cloud.host.dao.HostDao;
 import com.cloud.resource.ResourceManager;
 import com.cloud.secstorage.CommandExecLogDao;
 import com.cloud.secstorage.CommandExecLogVO;
+import com.cloud.storage.StorageManager;
 import com.cloud.storage.secondary.SecondaryStorageVmManager;
 import com.cloud.utils.DateUtil;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
+import com.cloud.utils.db.Filter;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
 import com.cloud.utils.db.SearchCriteria;
@@ -51,8 +56,13 @@
     private static final Logger s_logger = Logger.getLogger(PremiumSecondaryStorageManagerImpl.class);
 
     private int _capacityPerSSVM = SecondaryStorageVmManager.DEFAULT_SS_VM_CAPACITY;
+    private int migrateCapPerSSVM = DEFAULT_MIGRATE_SS_VM_CAPACITY;
     private int _standbyCapacity = SecondaryStorageVmManager.DEFAULT_STANDBY_CAPACITY;
     private int _maxExecutionTimeMs = 1800000;
+    private int maxDataMigrationWaitTime = 900000;
+    long currentTime = DateUtil.currentGMTTime().getTime();
+    long nextSpawnTime = currentTime + maxDataMigrationWaitTime;
+    private List<SecondaryStorageVmVO> migrationSSVMS = new ArrayList<>();
 
     @Inject
     SecondaryStorageVmDao _secStorageVmDao;
@@ -63,6 +73,7 @@
     @Inject
     ResourceManager _resourceMgr;
     protected SearchBuilder<CommandExecLogVO> activeCommandSearch;
+    protected SearchBuilder<CommandExecLogVO> activeCopyCommandSearch;
     protected SearchBuilder<HostVO> hostSearch;
 
     @Override
@@ -75,16 +86,27 @@
         int nMaxExecutionMinutes = NumbersUtil.parseInt(_configDao.getValue(Config.SecStorageCmdExecutionTimeMax.key()), 30);
         _maxExecutionTimeMs = nMaxExecutionMinutes * 60 * 1000;
 
+        migrateCapPerSSVM = StorageManager.SecStorageMaxMigrateSessions.value();
+        int nMaxDataMigrationWaitTime = StorageManager.MaxDataMigrationWaitTime.value();
+        maxDataMigrationWaitTime = nMaxDataMigrationWaitTime * 60 * 1000;
+        nextSpawnTime = currentTime + maxDataMigrationWaitTime;
+
         hostSearch = _hostDao.createSearchBuilder();
         hostSearch.and("dc", hostSearch.entity().getDataCenterId(), Op.EQ);
         hostSearch.and("status", hostSearch.entity().getStatus(), Op.EQ);
 
         activeCommandSearch = _cmdExecLogDao.createSearchBuilder();
         activeCommandSearch.and("created", activeCommandSearch.entity().getCreated(), Op.GTEQ);
-        activeCommandSearch.join("hostSearch", hostSearch, activeCommandSearch.entity().getInstanceId(), hostSearch.entity().getId(), JoinType.INNER);
+        activeCommandSearch.join("hostSearch", hostSearch, activeCommandSearch.entity().getHostId(), hostSearch.entity().getId(), JoinType.INNER);
+
+        activeCopyCommandSearch = _cmdExecLogDao.createSearchBuilder();
+        activeCopyCommandSearch.and("created", activeCopyCommandSearch.entity().getCreated(), Op.GTEQ);
+        activeCopyCommandSearch.and("command_name", activeCopyCommandSearch.entity().getCommandName(), Op.EQ);
+        activeCopyCommandSearch.join("hostSearch", hostSearch, activeCopyCommandSearch.entity().getHostId(), hostSearch.entity().getId(), JoinType.INNER);
 
         hostSearch.done();
         activeCommandSearch.done();
+        activeCopyCommandSearch.done();
         return true;
     }
 
@@ -96,7 +118,6 @@
         }
 
         Date cutTime = new Date(DateUtil.currentGMTTime().getTime() - _maxExecutionTimeMs);
-
         _cmdExecLogDao.expungeExpiredRecords(cutTime);
 
         boolean suspendAutoLoading = !reserveStandbyCapacity();
@@ -134,17 +155,52 @@
                 return new Pair<AfterScanAction, Object>(AfterScanAction.nop, null);
             }
 
-            alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(null, dataCenterId, State.Running, State.Migrating, State.Starting);
 
+            alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(null, dataCenterId, State.Running, State.Migrating, State.Starting);
             List<CommandExecLogVO> activeCmds = findActiveCommands(dataCenterId, cutTime);
-            if (alreadyRunning.size() * _capacityPerSSVM - activeCmds.size() < _standbyCapacity) {
-                s_logger.info("secondary storage command execution standby capactiy low (running VMs: " + alreadyRunning.size() + ", active cmds: " + activeCmds.size() +
-                        "), starting a new one");
-                return new Pair<AfterScanAction, Object>(AfterScanAction.expand, SecondaryStorageVm.Role.commandExecutor);
+            List<CommandExecLogVO> copyCmdsInPipeline = findAllActiveCopyCommands(dataCenterId, cutTime);
+            return scaleSSVMOnLoad(alreadyRunning, activeCmds, copyCmdsInPipeline, dataCenterId);
+
+        }
+        return new Pair<AfterScanAction, Object>(AfterScanAction.nop, null);
+    }
+
+    private Pair<AfterScanAction, Object> scaleSSVMOnLoad(List<SecondaryStorageVmVO> alreadyRunning, List<CommandExecLogVO> activeCmds,
+                                                    List<CommandExecLogVO> copyCmdsInPipeline, long dataCenterId) {
+        Integer hostsCount = _hostDao.countAllByTypeInZone(dataCenterId, Host.Type.Routing);
+        Integer maxSsvms = (hostsCount < MaxNumberOfSsvmsForMigration.value()) ? hostsCount : MaxNumberOfSsvmsForMigration.value();
+        int halfLimit = Math.round((float) (alreadyRunning.size() * migrateCapPerSSVM) / 2);
+        currentTime = DateUtil.currentGMTTime().getTime();
+        if (alreadyRunning.size() * _capacityPerSSVM - activeCmds.size() < _standbyCapacity) {
+            s_logger.info("secondary storage command execution standby capactiy low (running VMs: " + alreadyRunning.size() + ", active cmds: " + activeCmds.size() +
+                    "), starting a new one");
+            return new Pair<AfterScanAction, Object>(AfterScanAction.expand, SecondaryStorageVm.Role.commandExecutor);
+        }
+        else if (!copyCmdsInPipeline.isEmpty()  && copyCmdsInPipeline.size() >= halfLimit &&
+                ((Math.abs(currentTime - copyCmdsInPipeline.get(halfLimit - 1).getCreated().getTime()) > maxDataMigrationWaitTime )) &&
+                (currentTime > nextSpawnTime) &&  alreadyRunning.size() <=  maxSsvms) {
+            nextSpawnTime = currentTime + maxDataMigrationWaitTime;
+            s_logger.debug("scaling SSVM to handle migration tasks");
+            return new Pair<AfterScanAction, Object>(AfterScanAction.expand, SecondaryStorageVm.Role.commandExecutor);
+
+        }
+        scaleDownSSVMOnLoad(alreadyRunning, activeCmds, copyCmdsInPipeline);
+        return new Pair<AfterScanAction, Object>(AfterScanAction.nop, null);
+    }
+
+    private void scaleDownSSVMOnLoad(List<SecondaryStorageVmVO> alreadyRunning, List<CommandExecLogVO> activeCmds,
+                               List<CommandExecLogVO> copyCmdsInPipeline)  {
+        int halfLimit = Math.round((float) (alreadyRunning.size() * migrateCapPerSSVM) / 2);
+        if (alreadyRunning.size() > 1 && ( copyCmdsInPipeline.size() < halfLimit && (activeCmds.size() < (((alreadyRunning.size() -1) * _capacityPerSSVM)/2)) )) {
+            Collections.reverse(alreadyRunning);
+            for(SecondaryStorageVmVO vm : alreadyRunning) {
+                long count = activeCmds.stream().filter(cmd -> cmd.getInstanceId() == vm.getId()).count();
+                if (count == 0 && copyCmdsInPipeline.size() == 0 && vm.getRole() != SecondaryStorageVm.Role.templateProcessor) {
+                    destroySecStorageVm(vm.getId());
+                    break;
+                }
             }
         }
-
-        return new Pair<AfterScanAction, Object>(AfterScanAction.nop, null);
     }
 
     @Override
@@ -159,26 +215,33 @@
             if (host != null && host.getStatus() == Status.Up)
                 return new Pair<HostVO, SecondaryStorageVmVO>(host, secStorageVm);
         }
-
         return null;
     }
 
     private List<CommandExecLogVO> findActiveCommands(long dcId, Date cutTime) {
         SearchCriteria<CommandExecLogVO> sc = activeCommandSearch.create();
-
         sc.setParameters("created", cutTime);
         sc.setJoinParameters("hostSearch", "dc", dcId);
         sc.setJoinParameters("hostSearch", "status", Status.Up);
-
+        List<CommandExecLogVO> result = _cmdExecLogDao.search(sc, null);
         return _cmdExecLogDao.search(sc, null);
     }
 
+    private List<CommandExecLogVO> findAllActiveCopyCommands(long dcId, Date cutTime) {
+        SearchCriteria<CommandExecLogVO> sc = activeCopyCommandSearch.create();
+        sc.setParameters("created", cutTime);
+        sc.setParameters("command_name", "DataMigrationCommand");
+        sc.setJoinParameters("hostSearch", "dc", dcId);
+        sc.setJoinParameters("hostSearch", "status", Status.Up);
+        Filter filter = new Filter(CommandExecLogVO.class, "created", true, null, null);
+        return _cmdExecLogDao.search(sc, filter);
+    }
+
     private boolean reserveStandbyCapacity() {
         String value = _configDao.getValue(Config.SystemVMAutoReserveCapacity.key());
         if (value != null && value.equalsIgnoreCase("true")) {
             return true;
         }
-
         return false;
     }
 }
diff --git a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
index a1a3873b..2fc1eed 100644
--- a/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
+++ b/services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java
@@ -106,7 +106,6 @@
 import com.cloud.service.dao.ServiceOfferingDao;
 import com.cloud.storage.ImageStoreDetailsUtil;
 import com.cloud.storage.Storage;
-import com.cloud.storage.UploadVO;
 import com.cloud.storage.VMTemplateVO;
 import com.cloud.storage.dao.SnapshotDao;
 import com.cloud.storage.dao.StoragePoolHostDao;
@@ -266,6 +265,9 @@
     static final ConfigKey<String> NTPServerConfig = new ConfigKey<String>(String.class, "ntp.server.list", "Advanced", null,
             "Comma separated list of NTP servers to configure in Secondary storage VM", false, ConfigKey.Scope.Global, null);
 
+    static final ConfigKey<Integer> MaxNumberOfSsvmsForMigration = new ConfigKey<Integer>("Advanced", Integer.class, "max.ssvm.count", "5",
+            "Number of additional SSVMs to handle migration of data objects concurrently", true, ConfigKey.Scope.Global);
+
     public SecondaryStorageManagerImpl() {
     }
 
@@ -323,7 +325,7 @@
                     setupCmd = new SecStorageSetupCommand(ssStore.getTO(), secUrl, certs);
                 }
 
-                Integer nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
+                String nfsVersion = imageStoreDetailsUtil.getNfsVersion(ssStore.getId());
                 setupCmd.setNfsVersion(nfsVersion);
 
                 //template/volume file upload key
@@ -720,7 +722,7 @@
         return null;
     }
 
-    private void allocCapacity(long dataCenterId, SecondaryStorageVm.Role role) {
+    public void allocCapacity(long dataCenterId, SecondaryStorageVm.Role role) {
         if (s_logger.isTraceEnabled()) {
             s_logger.trace("Allocate secondary storage vm standby capacity for data center : " + dataCenterId);
         }
@@ -744,9 +746,6 @@
                 if (_allocLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_SYNC)) {
                     try {
                         secStorageVm = startNew(dataCenterId, role);
-                        for (UploadVO upload : _uploadDao.listAll()) {
-                            _uploadDao.expunge(upload.getId());
-                        }
                     } finally {
                         _allocLock.unlock();
                     }
@@ -822,7 +821,7 @@
                 return false;
             }
 
-            List<DataStore> stores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(dataCenterId));
+            List<DataStore> stores = _dataStoreMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(dataCenterId));
             if (stores.size() < 1) {
                 s_logger.debug("No image store added  in zone " + dataCenterId + ", wait until it is ready to launch secondary storage vm");
                 return false;
@@ -1203,7 +1202,7 @@
         if (dc.getDns2() != null) {
             buf.append(" dns2=").append(dc.getDns2());
         }
-        Integer nfsVersion = imageStoreDetailsUtil != null ? imageStoreDetailsUtil.getNfsVersion(secStore.getId()) : null;
+        String nfsVersion = imageStoreDetailsUtil != null ? imageStoreDetailsUtil.getNfsVersion(secStore.getId()) : null;
         buf.append(" nfsVersion=").append(nfsVersion);
 
         String bootArgs = buf.toString();
@@ -1374,7 +1373,7 @@
             _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, dataCenterId, State.Running, State.Migrating, State.Starting,
                 State.Stopped, State.Stopping);
         int vmSize = (ssVms == null) ? 0 : ssVms.size();
-        List<DataStore> ssStores = _dataStoreMgr.getImageStoresByScope(new ZoneScope(dataCenterId));
+        List<DataStore> ssStores = _dataStoreMgr.getImageStoresByScopeExcludingReadOnly(new ZoneScope(dataCenterId));
         int storeSize = (ssStores == null) ? 0 : ssStores.size();
         if (storeSize > vmSize) {
             s_logger.info("No secondary storage vms found in datacenter id=" + dataCenterId + ", starting a new one");
@@ -1496,6 +1495,10 @@
 
     }
 
+    @Override
+    public void finalizeUnmanage(VirtualMachine vm) {
+    }
+
     public List<SecondaryStorageVmAllocator> getSecondaryStorageVmAllocators() {
         return _ssVmAllocators;
     }
@@ -1512,7 +1515,7 @@
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {NTPServerConfig};
+        return new ConfigKey<?>[] {NTPServerConfig, MaxNumberOfSsvmsForMigration};
     }
 
 }
diff --git a/services/secondary-storage/pom.xml b/services/secondary-storage/pom.xml
index 53e1961..205bd5a 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.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 eb3a6a2..f1b451c 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java
index c02fe8a..6f189ef 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalNfsSecondaryStorageResource.java
@@ -53,7 +53,7 @@
     }
 
     @Override
-    synchronized public String getRootDir(String secUrl, Integer nfsVersion) {
+    synchronized public String getRootDir(String secUrl, String nfsVersion) {
         try {
             URI uri = new URI(secUrl);
             String dir = mountUri(uri, nfsVersion);
@@ -66,7 +66,7 @@
     }
 
     @Override
-    protected void mount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
+    protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) {
         ensureLocalRootPathExists(localRootPath, uri);
 
         if (mountExists(localRootPath, uri)) {
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java
index c6f6ba8..d953338 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/LocalSecondaryStorageResource.java
@@ -72,7 +72,7 @@
     }
 
     @Override
-    public String getRootDir(String url, Integer nfsVersion) {
+    public String getRootDir(String url, String nfsVersion) {
         return getRootDir();
 
     }
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 f4ae30e..636a336 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
@@ -46,6 +46,7 @@
 import java.nio.file.Path;
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,6 +55,7 @@
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.framework.security.keystore.KeystoreManager;
+import org.apache.cloudstack.storage.NfsMountManagerImpl.PathParser;
 import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CopyCommand;
 import org.apache.cloudstack.storage.command.DeleteCommand;
@@ -67,7 +69,6 @@
 import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder;
 import org.apache.cloudstack.storage.template.DownloadManager;
 import org.apache.cloudstack.storage.template.DownloadManagerImpl;
-import org.apache.cloudstack.storage.NfsMountManagerImpl.PathParser;
 import org.apache.cloudstack.storage.template.UploadEntity;
 import org.apache.cloudstack.storage.template.UploadManager;
 import org.apache.cloudstack.storage.template.UploadManagerImpl;
@@ -190,6 +191,7 @@
     private static final String TEMPLATE_ROOT_DIR = "template/tmpl";
     private static final String VOLUME_ROOT_DIR = "volumes";
     private static final String POST_UPLOAD_KEY_LOCATION = "/etc/cloudstack/agent/ms-psk";
+    private static final String ORIGINAL_FILE_EXTENSION = ".orig";
 
     private static final Map<String, String> updatableConfigData = Maps.newHashMap();
     static {
@@ -232,7 +234,7 @@
     private String _storageIp;
     private String _storageNetmask;
     private String _storageGateway;
-    private Integer _nfsVersion;
+    private String _nfsVersion;
     private final List<String> nfsIps = new ArrayList<String>();
     protected String _parent = "/mnt/SecStorage";
     final private String _tmpltpp = "template.properties";
@@ -262,18 +264,8 @@
      * @param params
      * @return nfsVersion value if exists, null in other case
      */
-    public static Integer retrieveNfsVersionFromParams(Map<String, Object> params) {
-        Integer nfsVersion = null;
-        if (params.get("nfsVersion") != null) {
-            String nfsVersionParam = (String)params.get("nfsVersion");
-            try {
-                nfsVersion = Integer.valueOf(nfsVersionParam);
-            } catch (NumberFormatException e){
-                s_logger.error("Couldn't cast " + nfsVersionParam + " to integer");
-                return null;
-            }
-        }
-        return nfsVersion;
+    public static String retrieveNfsVersionFromParams(Map<String, Object> params) {
+        return (String)params.get("nfsVersion");
     }
 
     @Override
@@ -401,6 +393,7 @@
 
     public Answer execute(GetDatadisksCommand cmd) {
         DataTO srcData = cmd.getData();
+        String configurationId = cmd.getConfigurationId();
         TemplateObjectTO template = (TemplateObjectTO)srcData;
         DataStoreTO srcStore = srcData.getDataStore();
         if (!(srcStore instanceof NfsTO)) {
@@ -445,7 +438,7 @@
 
             Script command = new Script("cp", _timeout, s_logger);
             command.add(ovfFilePath);
-            command.add(ovfFilePath + ".orig");
+            command.add(ovfFilePath + ORIGINAL_FILE_EXTENSION);
             String result = command.execute();
             if (result != null) {
                 String msg = "Unable to rename original OVF, error msg: " + result;
@@ -455,7 +448,7 @@
             s_logger.debug("Reading OVF " + ovfFilePath + " to retrive the number of disks present in OVA");
             OVFHelper ovfHelper = new OVFHelper();
 
-            List<DatadiskTO> disks = ovfHelper.getOVFVolumeInfo(ovfFilePath);
+            List<DatadiskTO> disks = ovfHelper.getOVFVolumeInfoFromFile(ovfFilePath, configurationId);
             return new GetDatadisksAnswer(disks);
         } catch (Exception e) {
             String msg = "Get Datadisk Template Count failed due to " + e.getMessage();
@@ -513,7 +506,7 @@
                         throw new Exception(msg);
                     }
                     command = new Script("cp", _timeout, s_logger);
-                    command.add(ovfFilePath + ".orig");
+                    command.add(ovfFilePath + ORIGINAL_FILE_EXTENSION);
                     command.add(newTmplDirAbsolute);
                     result = command.execute();
                     if (result != null) {
@@ -527,7 +520,7 @@
             // Create OVF for the disk
             String newOvfFilePath = newTmplDirAbsolute + File.separator + ovfFilePath.substring(ovfFilePath.lastIndexOf(File.separator) + 1);
             OVFHelper ovfHelper = new OVFHelper();
-            ovfHelper.rewriteOVFFile(ovfFilePath + ".orig", newOvfFilePath, diskName);
+            ovfHelper.rewriteOVFFileForSingleDisk(ovfFilePath + ORIGINAL_FILE_EXTENSION, newOvfFilePath, diskName);
 
             postCreatePrivateTemplate(newTmplDirAbsolute, templateId, templateUniqueName, physicalSize, virtualSize);
             writeMetaOvaForTemplate(newTmplDirAbsolute, ovfFilePath.substring(ovfFilePath.lastIndexOf(File.separator) + 1), diskName, templateUniqueName, physicalSize);
@@ -965,7 +958,7 @@
         return new CopyCmdAnswer("");
     }
 
-    protected File getFile(String path, String nfsPath, Integer nfsVersion) {
+    protected File getFile(String path, String nfsPath, String nfsVersion) {
         String filePath = getRootDir(nfsPath, nfsVersion) + File.separator + path;
         File f = new File(filePath);
         if (!f.exists()) {
@@ -1054,11 +1047,27 @@
         }
     }
 
+    private boolean shouldPerformDataMigration(DataTO srcData, DataTO destData) {
+        DataStoreTO srcDataStore = srcData.getDataStore();
+        DataStoreTO destDataStore = destData.getDataStore();
+        if (DataStoreRole.Image == srcDataStore.getRole() && DataStoreRole.Image == destDataStore.getRole() &&
+                srcDataStore instanceof NfsTO && destDataStore instanceof NfsTO &&
+                ((srcData.getObjectType() == DataObjectType.TEMPLATE && destData.getObjectType() == DataObjectType.TEMPLATE) ||
+                        (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.SNAPSHOT) ||
+                        (srcData.getObjectType() == DataObjectType.VOLUME && destData.getObjectType() == DataObjectType.VOLUME))) {
+            return true;
+        }
+        return false;
+    }
+
     protected Answer execute(CopyCommand cmd) {
         DataTO srcData = cmd.getSrcTO();
         DataTO destData = cmd.getDestTO();
         DataStoreTO srcDataStore = srcData.getDataStore();
         DataStoreTO destDataStore = destData.getDataStore();
+        if (shouldPerformDataMigration(srcData, destData)) {
+            return copyFromNfsToNfs(cmd);
+        }
 
         if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.TEMPLATE) {
             return createTemplateFromSnapshot(cmd);
@@ -1097,7 +1106,7 @@
         return Long.parseLong(StringUtils.substringAfterLast(StringUtils.substringBeforeLast(key, S3Utils.SEPARATOR), S3Utils.SEPARATOR));
     }
 
-    private String determineStorageTemplatePath(final String storagePath, String dataPath, Integer nfsVersion) {
+    private String determineStorageTemplatePath(final String storagePath, String dataPath, String nfsVersion) {
         return join(asList(getRootDir(storagePath, nfsVersion), dataPath), File.separator);
     }
 
@@ -1264,7 +1273,6 @@
     }
 
     protected File findFile(String path) {
-
         File srcFile = _storage.getFile(path);
         if (!srcFile.exists()) {
             srcFile = _storage.getFile(path + ".qcow2");
@@ -1285,6 +1293,91 @@
         return srcFile;
     }
 
+    protected Answer copyFromNfsToNfs(CopyCommand cmd) {
+        final DataTO srcData = cmd.getSrcTO();
+        final DataTO destData = cmd.getDestTO();
+        DataStoreTO srcDataStore = srcData.getDataStore();
+        NfsTO srcStore = (NfsTO)srcDataStore;
+        DataStoreTO destDataStore = destData.getDataStore();
+        final NfsTO destStore = (NfsTO) destDataStore;
+        try {
+            File srcFile = new File(getDir(srcStore.getUrl(), _nfsVersion), srcData.getPath());
+            File destFile = new File(getDir(destStore.getUrl(), _nfsVersion), destData.getPath());
+
+            if (srcFile == null) {
+                return new CopyCmdAnswer("Can't find source file at path: "+ srcData.getPath() +" on datastore: "+ srcDataStore.getUuid() +" to initiate file transfer");
+            }
+            ImageFormat format = getTemplateFormat(srcFile.getName());
+            if (srcData instanceof TemplateObjectTO || srcData instanceof VolumeObjectTO) {
+                File srcDir = null;
+                if (srcFile.isFile() || srcFile.getName().contains(".")) {
+                    srcDir = new File(srcFile.getParent());
+                } else if (!srcFile.isDirectory()) {
+                    srcDir = new File(srcFile.getParent());
+                } else if (srcFile.isDirectory() && Arrays.stream(srcData.getPath().split(File.separator)).count() == 4) {
+                    destFile = new File(destFile.getPath(), srcFile.getName());
+                }
+                File destDir = null;
+                if (destFile.isFile()) {
+                    destDir = new File(destFile.getParent());
+                }
+                try {
+                    FileUtils.copyDirectory((srcDir == null ? srcFile : srcDir), (destDir == null? destFile : destDir));
+                } catch (IOException e) {
+                    String msg = "Failed to copy file to destination";
+                    s_logger.info(msg);
+                    return new CopyCmdAnswer(msg);
+                }
+            } else {
+                destFile = new File(destFile, srcFile.getName());
+                try {
+                if (srcFile.isFile()) {
+                    FileUtils.copyFile(srcFile, destFile);
+                } else {
+                    // for vmware
+                    srcFile = new File(srcFile.getParent());
+                    FileUtils.copyDirectory(srcFile, destFile);
+                }
+                } catch (IOException e) {
+                    String msg = "Failed to copy file to destination";
+                    s_logger.info(msg);
+                    return new CopyCmdAnswer(msg);
+                }
+            }
+
+            DataTO retObj = null;
+            if (destData.getObjectType() == DataObjectType.TEMPLATE) {
+                TemplateObjectTO newTemplate = new TemplateObjectTO();
+                newTemplate.setPath(destData.getPath() + File.separator + srcFile.getName());
+                newTemplate.setSize(getVirtualSize(srcFile, format));
+                newTemplate.setPhysicalSize(srcFile.length());
+                newTemplate.setFormat(format);
+                retObj = newTemplate;
+            } else if (destData.getObjectType() == DataObjectType.VOLUME) {
+                VolumeObjectTO newVol = new VolumeObjectTO();
+                if (srcFile.isFile()) {
+                    newVol.setPath(destData.getPath() + File.separator + srcFile.getName());
+                } else {
+                    newVol.setPath(srcData.getPath());
+                }
+                newVol.setSize(getVirtualSize(srcFile, format));
+                retObj = newVol;
+            } else if (destData.getObjectType() == DataObjectType.SNAPSHOT) {
+                SnapshotObjectTO newSnapshot = new SnapshotObjectTO();
+                if (srcFile.isFile()) {
+                    newSnapshot.setPath(destData.getPath() + File.separator + destFile.getName());
+                } else {
+                    newSnapshot.setPath(destData.getPath() + File.separator + destFile.getName() + File.separator + destFile.getName());
+                }
+                retObj = newSnapshot;
+            }
+            return new CopyCmdAnswer(retObj);
+            } catch (Exception e) {
+                s_logger.error("failed to copy file" + srcData.getPath(), e);
+                return new CopyCmdAnswer("failed to copy file" + srcData.getPath() + e.toString());
+        }
+    }
+
     protected Answer copyFromNfsToS3(CopyCommand cmd) {
         final DataTO srcData = cmd.getSrcTO();
         final DataTO destData = cmd.getDestTO();
@@ -2185,6 +2278,8 @@
                 answer.setInstallPath(uploadEntity.getTmpltPath());
                 answer.setPhysicalSize(uploadEntity.getPhysicalSize());
                 answer.setDownloadPercent(100);
+                answer.setGuestOsInfo(uploadEntity.getGuestOsInfo());
+                answer.setMinimumHardwareVersion(uploadEntity.getMinimumHardwareVersion());
                 uploadEntityStateMap.remove(entityUuid);
                 return answer;
             } else if (uploadEntity.getUploadState() == UploadEntity.Status.IN_PROGRESS) {
@@ -2443,8 +2538,20 @@
 
     }
 
+    private String getDir(String secUrl, String nfsVersion) {
+        try {
+            URI uri = new URI(secUrl);
+            String dir = mountUri(uri, nfsVersion);
+            return _parent + "/" + dir;
+        } catch (Exception e) {
+            String msg = "GetRootDir for " + secUrl + " failed due to " + e.toString();
+            s_logger.error(msg, e);
+            throw new CloudRuntimeException(msg);
+        }
+    }
+
     @Override
-    synchronized public String getRootDir(String secUrl, Integer nfsVersion) {
+    synchronized public String getRootDir(String secUrl, String nfsVersion) {
         if (!_inSystemVM) {
             return _parent;
         }
@@ -2788,7 +2895,7 @@
      * @return name of folder in _parent that device was mounted.
      * @throws UnknownHostException
      */
-    protected String mountUri(URI uri, Integer nfsVersion) throws UnknownHostException {
+    protected String mountUri(URI uri, String nfsVersion) throws UnknownHostException {
         String uriHostIp = getUriHostIp(uri);
         String nfsPath = uriHostIp + ":" + uri.getPath();
 
@@ -2809,7 +2916,7 @@
         return dir;
     }
 
-    protected void mount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
+    protected void mount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) {
         s_logger.debug("mount " + uri.toString() + " on " + localRootPath + ((nfsVersion != null) ? " nfsVersion=" + nfsVersion : ""));
         ensureLocalRootPathExists(localRootPath, uri);
 
@@ -2825,7 +2932,7 @@
         checkForVolumesDir(localRootPath);
     }
 
-    protected void attemptMount(String localRootPath, String remoteDevice, URI uri, Integer nfsVersion) {
+    protected void attemptMount(String localRootPath, String remoteDevice, URI uri, String nfsVersion) {
         String result;
         s_logger.debug("Make cmdline call to mount " + remoteDevice + " at " + localRootPath + " based on uri " + uri + ((nfsVersion != null) ? " nfsVersion=" + nfsVersion : ""));
         Script command = new Script(!_inSystemVM, "mount", _timeout, s_logger);
@@ -3165,7 +3272,7 @@
 
         if (defaultMaxAccountSecondaryStorageInGB != Resource.RESOURCE_UNLIMITED && (accountDirSizeInGB + contentLengthInGB) > defaultMaxAccountSecondaryStorageInGB) {
             s_logger.error("accountDirSizeInGb: " + accountDirSizeInGB + " defaultMaxAccountSecondaryStorageInGB: " + defaultMaxAccountSecondaryStorageInGB + " contentLengthInGB:"
-                    + contentLengthInGB);
+                    + contentLengthInGB); // extra attention
             String errorMessage = "Maximum number of resources of type secondary_storage for account has exceeded";
             updateStateMapWithError(cmd.getEntityUUID(), errorMessage);
             throw new InvalidParameterValueException(errorMessage);
@@ -3308,6 +3415,14 @@
                 loc.addFormat(info);
                 uploadEntity.setVirtualSize(info.virtualSize);
                 uploadEntity.setPhysicalSize(info.size);
+                if (info.ovfInformationTO != null) {
+                    if (info.ovfInformationTO.getGuestOsInfo() != null) {
+                        uploadEntity.setGuestOsInfo(info.ovfInformationTO.getGuestOsInfo());
+                    }
+                    if (info.ovfInformationTO.getHardwareSection() != null) {
+                        uploadEntity.setMinimumHardwareVersion(info.ovfInformationTO.getHardwareSection().getMinimiumHardwareVersion());
+                    }
+                }
                 break;
             }
         }
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java
index d7e0c7e..3c24b6c 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/resource/SecondaryStorageResource.java
@@ -23,6 +23,6 @@
  */
 public interface SecondaryStorageResource extends ServerResource {
 
-    String getRootDir(String cmd, Integer nfsVersion);
+    String getRootDir(String cmd, String nfsVersion);
 
 }
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/DownloadManagerImpl.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/DownloadManagerImpl.java
index 4149cd1..7ce252a 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/DownloadManagerImpl.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/DownloadManagerImpl.java
@@ -37,7 +37,7 @@
 
 import javax.naming.ConfigurationException;
 
-import com.cloud.agent.api.storage.OVFPropertyTO;
+import com.cloud.agent.api.to.OVFInformationTO;
 import com.cloud.storage.template.Processor;
 import com.cloud.storage.template.S3TemplateDownloader;
 import com.cloud.storage.template.TemplateDownloader;
@@ -62,7 +62,6 @@
 import org.apache.cloudstack.storage.NfsMountManagerImpl.PathParser;
 import org.apache.cloudstack.storage.resource.NfsSecondaryStorageResource;
 import org.apache.cloudstack.storage.resource.SecondaryStorageResource;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.storage.DownloadAnswer;
@@ -87,12 +86,14 @@
 import org.apache.cloudstack.utils.security.ChecksumValue;
 import org.apache.cloudstack.utils.security.DigestHelper;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class DownloadManagerImpl extends ManagerBase implements DownloadManager {
     private String _name;
     StorageLayer _storage;
     public Map<String, Processor> _processors;
     private long _processTimeout;
-    private Integer _nfsVersion;
+    private String _nfsVersion;
 
     public class Completion implements DownloadCompleteCallback {
         private final String jobId;
@@ -125,7 +126,7 @@
         private long templatePhysicalSize;
         private final long id;
         private final ResourceType resourceType;
-        private List<OVFPropertyTO> ovfProperties;
+        private OVFInformationTO ovfInformationTO;
 
         public DownloadJob(TemplateDownloader td, String jobId, long id, String tmpltName, ImageFormat format, boolean hvm, Long accountId, String descr, String cksum,
                 String installPathPrefix, ResourceType resourceType) {
@@ -221,12 +222,12 @@
             this.checksum = checksum;
         }
 
-        public List<OVFPropertyTO> getOvfProperties() {
-            return ovfProperties;
+        public OVFInformationTO getOvfInformationTO() {
+            return ovfInformationTO;
         }
 
-        public void setOvfProperties(List<OVFPropertyTO> ovfProperties) {
-            this.ovfProperties = ovfProperties;
+        public void setOvfInformationTO(OVFInformationTO ovfInformationTO) {
+            this.ovfInformationTO = ovfInformationTO;
         }
     }
 
@@ -268,7 +269,7 @@
         }
         TemplateDownloader td = dj.getTemplateDownloader();
         LOGGER.info("Download Completion for jobId: " + jobId + ", status=" + status);
-        LOGGER.info("local: " + td.getDownloadLocalPath() + ", bytes=" + td.getDownloadedBytes() + ", error=" + td.getDownloadError() + ", pct=" +
+        LOGGER.info("local: " + td.getDownloadLocalPath() + ", bytes=" + toHumanReadableSize(td.getDownloadedBytes()) + ", error=" + td.getDownloadError() + ", pct=" +
                 td.getDownloadPercent());
 
         switch (status) {
@@ -507,7 +508,7 @@
         while (en.hasNext()) {
             Processor processor = en.next();
 
-            FormatInfo info = null;
+            FormatInfo info;
             try {
                 info = processor.process(resourcePath, null, templateName, this._processTimeout);
             } catch (InternalErrorException e) {
@@ -521,8 +522,8 @@
                 }
                 dnld.setTemplatesize(info.virtualSize);
                 dnld.setTemplatePhysicalSize(info.size);
-                if (CollectionUtils.isNotEmpty(info.ovfProperties)) {
-                    dnld.setOvfProperties(info.ovfProperties);
+                if (info.ovfInformationTO != null) {
+                    dnld.setOvfInformationTO(info.ovfInformationTO);
                 }
                 break;
             }
@@ -824,8 +825,8 @@
             answer =
                     new DownloadAnswer(jobId, getDownloadPct(jobId), getDownloadError(jobId), getDownloadStatus2(jobId), getDownloadLocalPath(jobId),
                             getInstallPath(jobId), getDownloadTemplateSize(jobId), getDownloadTemplatePhysicalSize(jobId), getDownloadCheckSum(jobId));
-            if (CollectionUtils.isNotEmpty(dj.getOvfProperties())) {
-                answer.setOvfProperties(dj.getOvfProperties());
+            if (dj.getOvfInformationTO() != null) {
+                answer.setOvfInformationTO(dj.getOvfInformationTO());
             }
             jobs.remove(jobId);
             return answer;
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadEntity.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadEntity.java
index 031a163..6d5154e 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadEntity.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadEntity.java
@@ -19,6 +19,7 @@
 
 
 import com.cloud.storage.Storage;
+import com.cloud.utils.Pair;
 
 public class UploadEntity {
     private long downloadedsize;
@@ -35,6 +36,8 @@
     private String description;
     private long contentLength;
     private long processTimeout;
+    private Pair<String, String> guestOsInfo;
+    private String minimumHardwareVersion;
 
     public static enum ResourceType {
         VOLUME, TEMPLATE
@@ -207,4 +210,20 @@
     public void setContentLength(long contentLength) {
         this.contentLength = contentLength;
     }
+
+    public Pair<String, String> getGuestOsInfo() {
+        return guestOsInfo;
+    }
+
+    public void setGuestOsInfo(Pair<String, String> guestOsInfo) {
+        this.guestOsInfo = guestOsInfo;
+    }
+
+    public void setMinimumHardwareVersion(String minimumHardwareVersion) {
+        this.minimumHardwareVersion = minimumHardwareVersion;
+    }
+
+    public String getMinimumHardwareVersion() {
+        return minimumHardwareVersion;
+    }
 }
diff --git a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
index 29eb4b1..cdda816 100644
--- a/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
+++ b/services/secondary-storage/server/src/main/java/org/apache/cloudstack/storage/template/UploadManagerImpl.java
@@ -53,6 +53,8 @@
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.script.Script;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class UploadManagerImpl extends ManagerBase implements UploadManager {
 
     public class Completion implements UploadCompleteCallback {
@@ -307,12 +309,15 @@
 
         //We just need to remove the UUID.vhd
         String extractUrl = cmd.getExtractUrl();
-        command.add("unlink /var/www/html/userdata/" + extractUrl.substring(extractUrl.lastIndexOf(File.separator) + 1));
-        String result = command.execute();
-        if (result != null) {
-            // FIXME - Ideally should bail out if you cant delete symlink. Not doing it right now.
-            // This is because the ssvm might already be destroyed and the symlinks do not exist.
-            s_logger.warn("Error in deleting symlink :" + result);
+        String result;
+        if (extractUrl != null) {
+            command.add("unlink /var/www/html/userdata/" + extractUrl.substring(extractUrl.lastIndexOf(File.separator) + 1));
+            result = command.execute();
+            if (result != null) {
+                // FIXME - Ideally should bail out if you cant delete symlink. Not doing it right now.
+                // This is because the ssvm might already be destroyed and the symlinks do not exist.
+                s_logger.warn("Error in deleting symlink :" + result);
+            }
         }
 
         // If its a volume also delete the Hard link since it was created only for the purpose of download.
@@ -439,7 +444,7 @@
         }
         TemplateUploader tu = uj.getTemplateUploader();
         s_logger.warn("Upload Completion for jobId: " + jobId + ", status=" + status);
-        s_logger.warn("UploadedBytes=" + tu.getUploadedBytes() + ", error=" + tu.getUploadError() + ", pct=" + tu.getUploadPercent());
+        s_logger.warn("UploadedBytes=" + toHumanReadableSize(tu.getUploadedBytes()) + ", error=" + tu.getUploadError() + ", pct=" + tu.getUploadPercent());
 
         switch (status) {
         case ABORTED:
diff --git a/setup/bindir/cloud-migrate-databases.in b/setup/bindir/cloud-migrate-databases.in
index 95d04d4..e9a4df3 100644
--- a/setup/bindir/cloud-migrate-databases.in
+++ b/setup/bindir/cloud-migrate-databases.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -244,7 +244,7 @@
 	
 	try:
 		props = cloud_utils.read_properties(os.path.join(configdir,'db.properties'))
-	except (IOError,OSError),e:
+	except (IOError,OSError) as e:
 		logging.error("Cannot read from config file: %s",e)
 		logging.error("You may want to point to a specific config directory with the --config= option")
 		return 2
@@ -261,13 +261,13 @@
 	database = props["db.cloud.name"]
 	
 	# tell the migrator to load its steps from the globals list
-	migrator = cloud_utils.Migrator(globals().values())
+	migrator = cloud_utils.Migrator(list(globals().values()))
 	
 	if opts.dumpevolvers:
-		print "Evolution steps:"
-		print "	%s	%s	%s"%("From","To","Evolver in charge")
+		print("Evolution steps:")
+		print("	%s	%s	%s"%("From","To","Evolver in charge"))
 		for f,t,e in migrator.get_evolver_chain():
-			print "	%s	%s	%s"%(f,t,e)
+			print("	%s	%s	%s"%(f,t,e))
 		return
 	
 	#initialize a context with the read configuration
@@ -277,7 +277,7 @@
 		migrator.run(context,dryrun=opts.dryrun,starting_level=opts.fromlevel,ending_level=opts.tolevel)
 	    finally:
 		context.close()
-	except (cloud_utils.NoMigrationPath,cloud_utils.NoMigrator),e:
+	except (cloud_utils.NoMigrationPath,cloud_utils.NoMigrator) as e:
 		logging.error("%s",e)
 		return 4
 
diff --git a/setup/bindir/cloud-set-guest-password-configdrive.in b/setup/bindir/cloud-set-guest-password-configdrive.in
index ad36919..663dbd1 100644
--- a/setup/bindir/cloud-set-guest-password-configdrive.in
+++ b/setup/bindir/cloud-set-guest-password-configdrive.in
@@ -1,4 +1,4 @@
-                                  #!/bin/bash
+#!/bin/bash
 #
 # Init file for Password Download Client
 #
diff --git a/setup/bindir/cloud-set-guest-password.in b/setup/bindir/cloud-set-guest-password.in
index 2c7304b..53dd6a8 100755
--- a/setup/bindir/cloud-set-guest-password.in
+++ b/setup/bindir/cloud-set-guest-password.in
@@ -26,25 +26,61 @@
 # Modify this line to specify the user (default is root)
 user=root
 
-# Add your DHCP lease folders here
-DHCP_FOLDERS="/var/lib/dhclient/* /var/lib/dhcp3/* /var/lib/dhcp/*"
+# Detect main interface name
+NETINT=$(ip -o -4 route show to default | awk '{print $5}')
+
+# Add network provider variables here (default means that interface for network manager is eth0)
+NETPLAN=/etc/netplan
+IFUPDOWN=/etc/network/interfaces
+NETMAN=/etc/sysconfig/network-scripts
+
+# Add dhcp variables
 PASSWORD_SERVER_PORT=8080
 password_received=0
-file_count=0
 error_count=0
+file_count=0
 
-for DHCP_FILE in $DHCP_FOLDERS; do
-	if [ -f $DHCP_FILE ]; then
-		file_count=$((file_count+1))
-		PASSWORD_SERVER_IP=$(grep dhcp-server-identifier $DHCP_FILE | tail -1 | awk '{print $NF}' | tr -d '\;')
+# OS is using netplan
+if [ -d "$NETPLAN" ]; then
+        logger -t "cloud" "Operating System is using netplan"
 
-		if [ -n "$PASSWORD_SERVER_IP" ]; then
-			logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in $DHCP_FILE"
-                        break
-		fi
-	fi
-done
+        PASSWORD_SERVER_IP=$(netplan ip leases $NETINT | grep SERVER_ADDRESS | awk '{split($0,a,"="); print a[2]}')
 
+        if [ -n "$PASSWORD_SERVER_IP" ]; then
+                 logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in netplan config"
+        fi
+fi
+
+# OS is using ifupdown
+if [ -f "$IFUPDOWN" ]; then
+        logger -t "cloud" "Operating System is using ifupdown"
+
+        DHCP_FOLDERS="/var/lib/dhclient/* /var/lib/dhcp3/* /var/lib/dhcp/*"
+
+        for DHCP_FILE in $DHCP_FOLDERS; do
+                if [ -f $DHCP_FILE ]; then
+                        file_count=$((file_count+1))
+                        PASSWORD_SERVER_IP=$(grep dhcp-server-identifier $DHCP_FILE | tail -1 | awk '{print $NF}' | tr -d '\;')
+
+                        if [ -n "$PASSWORD_SERVER_IP" ]; then
+                                logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in $DHCP_FILE"
+                                break
+                        fi
+                fi
+        done
+fi
+
+# OS is using network interfaces
+if [ -d "$NETMAN" ]; then
+        logger -t "cloud" "Operating System is using network manager"
+
+        PASSWORD_SERVER_IP=$(nmcli -f IP4.GATEWAY device show $NETINT | sed 's/ //g' | awk '{split($0,a,":"); print a[2]}')
+        if [ -n "$PASSWORD_SERVER_IP" ]; then
+                logger -t "cloud" "Found password server IP $PASSWORD_SERVER_IP in nmcli output"
+        fi
+fi
+
+#start sequence
 if [ -z "$PASSWORD_SERVER_IP" ] ; then
          logger -t "cloud" "Unable to determine the password server, falling back to data-server"
          PASSWORD_SERVER_IP=data-server
diff --git a/setup/bindir/cloud-setup-databases.in b/setup/bindir/cloud-setup-databases.in
index 53617be..bd23c2b 100755
--- a/setup/bindir/cloud-setup-databases.in
+++ b/setup/bindir/cloud-setup-databases.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -24,7 +24,7 @@
 from random import choice
 import string
 from optparse import OptionParser
-import commands
+import subprocess
 import shutil
 import socket
 
@@ -49,7 +49,7 @@
     stdout, stderr = process.communicate()
     if process.returncode != 0:
         raise Exception(stderr)
-    return stdout
+    return stdout.decode('utf-8')
 
 class DBDeployer(object):
     parser = None
@@ -115,7 +115,7 @@
         sys.stdout.flush()
 
     def putDbProperty(self, key, value):
-        if self.dbDotProperties.has_key(key):
+        if key in self.dbDotProperties:
             (oldValue, index) = self.dbDotProperties[key]
             self.dbDotProperties[key] = (value, index)
         else:
@@ -123,7 +123,7 @@
             self.dbDotPropertiesIndex += 1
 
     def getDbProperty(self, key):
-        if not self.dbDotProperties.has_key(key):
+        if key not in self.dbDotProperties:
             return None
         (value, index) = self.dbDotProperties[key]
         return value
@@ -145,14 +145,14 @@
           mysqlPath = "mysql"
         try:
             mysqlCmds = [mysqlPath, '--user=%s'%kwargs['user'], '--host=%s'%kwargs['host'], '--port=%s'%kwargs['port']]
-            if kwargs.has_key('passwd'):
+            if 'passwd' in kwargs:
                 mysqlCmds.append('--password=%s'%kwargs['passwd'])
-            file(self.tmpMysqlFile, 'w').write(text)
+            open(self.tmpMysqlFile, 'w').write(text)
             mysqlCmds.append('<')
             mysqlCmds.append(self.tmpMysqlFile)
             runCmd(mysqlCmds)
 
-        except Exception, e:
+        except Exception as e:
             err = '''Encountering an error when executing mysql script
 ----------------------------------------------------------------------
 table:
@@ -222,7 +222,7 @@
         for f in ["create-database","create-schema", "create-database-premium","create-schema-premium"]:
             p = os.path.join(self.dbFilesPath,"%s.sql"%f)
             if not os.path.exists(p): continue
-            text = file(p).read()
+            text = open(p).read()
             for t, r in replacements: text = text.replace(t,r)
             self.info("Applying %s"%p)
             self.runMysql(text, p, True)
@@ -235,32 +235,32 @@
             try:
                 output = runCmd(['build-classpath'] + systemjars)
                 systemcp = output.strip()
-            except Exception, e:
+            except Exception as e:
                 systemcp = r"@SYSTEMCLASSPATH@"
             mscp = r"@MSCLASSPATH@"
             depscp = r"@DEPSCLASSPATH@"
             classpath = os.path.pathsep.join([pcp,systemcp,depscp,mscp,conf])
             try:
                 runCmd(["java","-cp",classpath,"com.cloud.test.DatabaseConfig", self.serversetup])
-            except Exception, e:
+            except Exception as e:
                 self.errorAndExit("Apply %s failed"%self.serversetup)
         else:
             p = os.path.join(self.dbFilesPath, 'server-setup.sql')
-            text = file(p).read()
+            text = open(p).read()
             self.info("Applying %s"%p)
             self.runMysql(text, p, True)
             self.info(None, True)
 
         for f in ["templates"]:
             p = os.path.join(self.dbFilesPath,"%s.sql"%f)
-            text = file(p).read()
+            text = open(p).read()
             self.info("Applying %s"%p)
             self.runMysql(text, p, True)
             self.info(None, True)
 
         p = os.path.join(self.dbFilesPath,"schema-level.sql")
         if os.path.isfile(p):
-            text = file(p).read()
+            text = open(p).read()
             self.info("Applying %s"%p)
             self.runMysql(text, p, True)
             self.info(None, True)
@@ -268,7 +268,7 @@
     def prepareDBFiles(self):
         def prepareDBDotProperties():
             dbpPath = os.path.join(self.dbConfPath, 'db.properties')
-            dbproperties = file(dbpPath).read().splitlines()
+            dbproperties = open(dbpPath).read().splitlines()
             newdbp = []
             emptyLine = 0
             for line in dbproperties:
@@ -289,7 +289,7 @@
                         if key == "db.usage.password": value = self.password
                         if key == "db.usage.host": value = self.host
                         if key == "db.usage.port": value = self.port
-                except Exception, e:
+                except Exception as e:
                     err = '''Wrong format in %s (%s):
 Besides comments beginning "#" and empty line, all key-value pairs must be in formula of
                     key=value
@@ -306,7 +306,7 @@
     def finalize(self):
         def finalizeDbProperties():
             entries = []
-            for key in self.dbDotProperties.keys():
+            for key in list(self.dbDotProperties.keys()):
                 (value, index) = self.dbDotProperties[key]
                 if key.startswith("#"):
                     entries.insert(index, key)
@@ -314,7 +314,7 @@
                     entries.insert(index, '')
                 else:
                     entries.insert(index, "%s=%s"%(key, value))
-            file(os.path.join(self.dbConfPath, 'db.properties'), 'w').write('\n'.join(entries))
+            open(os.path.join(self.dbConfPath, 'db.properties'), 'w').write('\n'.join(entries))
 
         self.info("Finalizing setup ...", None)
         finalizeDbProperties()
@@ -326,7 +326,7 @@
             try:
                 ip = socket.gethostbyname(socket.gethostname())
                 return ip
-            except Exception, e:
+            except Exception as e:
                 return "127.0.0.1"
 
         if not self.ip:
@@ -363,7 +363,7 @@
             self.info("Checking local machine hostname ...", None)
             try:
                 output= socket.getfqdn()
-            except Exception, e:
+            except Exception as e:
                 err = "The host name of this computer does not resolve to an IP address.\nPlease use your operating system's network setup tools to fix this ('hostname --fqdn' %s).\n"%e.__str__()
                 self.errorAndExit(err)
             self.info(None, True)
@@ -372,10 +372,10 @@
             self.info("Checking SELinux setup ...", None)
             try:
                 check_selinux()
-            except CheckFailed, e:
+            except CheckFailed as e:
                 self.info("checkSelinux failed with error continuing...", None)
                 self.errorAndContinue(e.__str__())
-            except OSError, e:
+            except OSError as e:
                 if e.errno == 2: pass
                 else:
                     self.info("checkSelinux failed with error continuing...", None)
@@ -389,11 +389,11 @@
     def processEncryptionStuff(self):
         def encrypt(input):
             cmd = ['java','-Djava.security.egd=file:/dev/urandom','-classpath','"' + self.encryptionJarPath + '"','org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI', 'encrypt.sh', 'input=%s'%input, 'password=%s'%self.mgmtsecretkey,'verbose=false']
-            return runCmd(cmd).strip('\r\n')
+            return str(runCmd(cmd)).strip('\r\n')
 
         def saveMgmtServerSecretKey():
             if self.encryptiontype == 'file':
-                file(self.encryptionKeyFile, 'w').write(self.mgmtsecretkey)
+                open(self.encryptionKeyFile, 'w').write(self.mgmtsecretkey)
 
         def formatEncryptResult(value):
             return 'ENC(%s)'%value
@@ -595,9 +595,9 @@
         finally:
             self.postRun()
 
-        print ''
-        print "CloudStack has successfully initialized database, you can check your database configuration in %s"%os.path.join(self.dbConfPath, 'db.properties')
-        print ''
+        print('')
+        print("CloudStack has successfully initialized database, you can check your database configuration in %s"%os.path.join(self.dbConfPath, 'db.properties'))
+        print('')
 
 if __name__ == "__main__":
    o = DBDeployer()
diff --git a/setup/bindir/cloud-setup-encryption.in b/setup/bindir/cloud-setup-encryption.in
index 54447f7..cd9212a 100755
--- a/setup/bindir/cloud-setup-encryption.in
+++ b/setup/bindir/cloud-setup-encryption.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 # -*- coding: utf-8 -*-
 
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -26,7 +26,7 @@
 from random import choice
 import string
 from optparse import OptionParser
-import commands
+import subprocess
 import shutil
 
 # squelch mysqldb spurious warnings
@@ -49,7 +49,7 @@
     stdout, stderr = process.communicate()
     if process.returncode != 0:
         raise Exception(stderr)
-    return stdout
+    return stdout.decode('utf-8')
 
 class DBDeployer(object):
     parser = None
@@ -107,7 +107,7 @@
         sys.stdout.flush()
 
     def putDbProperty(self, key, value):
-        if self.dbDotProperties.has_key(key):
+        if key in self.dbDotProperties:
             (oldValue, index) = self.dbDotProperties[key]
             self.dbDotProperties[key] = (value, index)
         else:
@@ -115,7 +115,7 @@
             self.dbDotPropertiesIndex += 1
     
     def getDbProperty(self, key):
-        if not self.dbDotProperties.has_key(key):
+        if key not in self.dbDotProperties:
             return None
         (value, index) = self.dbDotProperties[key]
         return value
@@ -151,7 +151,7 @@
                 try:
                     if not passed:
                         (key, value) = line.split('=', 1)
-                except Exception, e:
+                except Exception as e:
                     err = '''Wrong format in %s (%s):
 Besides comments beginning "#" and empty line, all key-value pairs must be in formula of
                     key=value
@@ -167,7 +167,7 @@
     def finalize(self):
         def finalizeDbProperties():
             entries = []
-            for key in self.dbDotProperties.keys():
+            for key in list(self.dbDotProperties.keys()):
                 (value, index) = self.dbDotProperties[key]
                 if key.startswith("#"):
                     entries.insert(index, key)
@@ -257,9 +257,9 @@
         finally:
             self.postRun()
         
-        print ''
-        print "CloudStack has successfully setup Encryption"
-        print ''
+        print('')
+        print("CloudStack has successfully setup Encryption")
+        print('')
 
 if __name__ == "__main__":
    o = DBDeployer()
diff --git a/setup/db/create-database-simulator.sql b/setup/db/create-database-simulator.sql
index 8924eda..b61ce1b 100644
--- a/setup/db/create-database-simulator.sql
+++ b/setup/db/create-database-simulator.sql
@@ -20,8 +20,8 @@
 
 CREATE DATABASE `simulator`;
 
-GRANT ALL ON simulator.* to cloud@`localhost` identified by 'cloud';
-GRANT ALL ON simulator.* to cloud@`%` identified by 'cloud';
+GRANT ALL ON simulator.* to cloud@`localhost`;
+GRANT ALL ON simulator.* to cloud@`%`;
 
 GRANT process ON *.* TO cloud@`localhost`;
 GRANT process ON *.* TO cloud@`%`;
diff --git a/setup/db/create-database.sql b/setup/db/create-database.sql
index 51f5656..81e13f9 100644
--- a/setup/db/create-database.sql
+++ b/setup/db/create-database.sql
@@ -55,10 +55,11 @@
 
 CREATE DATABASE `cloud`;
 
-CREATE USER cloud identified by 'cloud';
+CREATE USER cloud@`localhost` identified by 'cloud';
+CREATE USER cloud@`%` identified by 'cloud';
 
-GRANT ALL ON cloud.* to cloud@`localhost` identified by 'cloud';
-GRANT ALL ON cloud.* to cloud@`%` identified by 'cloud';
+GRANT ALL ON cloud.* to cloud@`localhost`;
+GRANT ALL ON cloud.* to cloud@`%`;
 
 GRANT process ON *.* TO cloud@`localhost`;
 GRANT process ON *.* TO cloud@`%`;
diff --git a/systemvm/agent/noVNC/app/error-handler.js b/systemvm/agent/noVNC/app/error-handler.js
new file mode 100644
index 0000000..81a6cba
--- /dev/null
+++ b/systemvm/agent/noVNC/app/error-handler.js
@@ -0,0 +1,66 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+// NB: this should *not* be included as a module until we have
+// native support in the browsers, so that our error handler
+// can catch script-loading errors.
+
+// No ES6 can be used in this file since it's used for the translation
+/* eslint-disable prefer-arrow-callback */
+
+(function _scope() {
+    "use strict";
+
+    // Fallback for all uncought errors
+    function handleError(event, err) {
+        try {
+            const msg = document.getElementById('noVNC_fallback_errormsg');
+
+            // Only show the initial error
+            if (msg.hasChildNodes()) {
+                return false;
+            }
+
+            let div = document.createElement("div");
+            div.classList.add('noVNC_message');
+            div.appendChild(document.createTextNode(event.message));
+            msg.appendChild(div);
+
+            if (event.filename) {
+                div = document.createElement("div");
+                div.className = 'noVNC_location';
+                let text = event.filename;
+                if (event.lineno !== undefined) {
+                    text += ":" + event.lineno;
+                    if (event.colno !== undefined) {
+                        text += ":" + event.colno;
+                    }
+                }
+                div.appendChild(document.createTextNode(text));
+                msg.appendChild(div);
+            }
+
+            if (err && err.stack) {
+                div = document.createElement("div");
+                div.className = 'noVNC_stack';
+                div.appendChild(document.createTextNode(err.stack));
+                msg.appendChild(div);
+            }
+
+            document.getElementById('noVNC_fallback_error')
+                .classList.add("noVNC_open");
+        } catch (exc) {
+            document.write("noVNC encountered an error.");
+        }
+        // Don't return true since this would prevent the error
+        // from being printed to the browser console.
+        return false;
+    }
+    window.addEventListener('error', function onerror(evt) { handleError(evt, evt.error); });
+    window.addEventListener('unhandledrejection', function onreject(evt) { handleError(evt.reason, evt.reason); });
+})();
diff --git a/systemvm/agent/noVNC/app/images/alt.png b/systemvm/agent/noVNC/app/images/alt.png
new file mode 100644
index 0000000..2d5e35e
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/alt.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/clipboard.png b/systemvm/agent/noVNC/app/images/clipboard.png
new file mode 100644
index 0000000..d7fe507
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/clipboard.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/connect.png b/systemvm/agent/noVNC/app/images/connect.png
new file mode 100644
index 0000000..abdbe42
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/connect.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/ctrl.png b/systemvm/agent/noVNC/app/images/ctrl.png
new file mode 100644
index 0000000..fbc9e13
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/ctrl.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/ctrlaltdel.png b/systemvm/agent/noVNC/app/images/ctrlaltdel.png
new file mode 100644
index 0000000..dd04978
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/ctrlaltdel.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/disconnect.png b/systemvm/agent/noVNC/app/images/disconnect.png
new file mode 100644
index 0000000..97eb1a9
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/disconnect.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/drag.png b/systemvm/agent/noVNC/app/images/drag.png
new file mode 100644
index 0000000..f006202
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/drag.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/error.png b/systemvm/agent/noVNC/app/images/error.png
new file mode 100644
index 0000000..04e78e1
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/error.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/esc.png b/systemvm/agent/noVNC/app/images/esc.png
new file mode 100644
index 0000000..e1b1bfa
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/esc.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/expander.png b/systemvm/agent/noVNC/app/images/expander.png
new file mode 100644
index 0000000..2793721
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/expander.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/fullscreen.png b/systemvm/agent/noVNC/app/images/fullscreen.png
new file mode 100644
index 0000000..a7f2634
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/fullscreen.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/handle.png b/systemvm/agent/noVNC/app/images/handle.png
new file mode 100644
index 0000000..cf0e5d5
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/handle.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/handle_bg.png b/systemvm/agent/noVNC/app/images/handle_bg.png
new file mode 100644
index 0000000..efb0357
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/handle_bg.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/Makefile b/systemvm/agent/noVNC/app/images/icons/Makefile
new file mode 100644
index 0000000..be564b4
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/Makefile
@@ -0,0 +1,42 @@
+ICONS := \
+	novnc-16x16.png \
+	novnc-24x24.png \
+	novnc-32x32.png \
+	novnc-48x48.png \
+	novnc-64x64.png
+
+ANDROID_LAUNCHER := \
+	novnc-48x48.png \
+	novnc-72x72.png \
+	novnc-96x96.png \
+	novnc-144x144.png \
+	novnc-192x192.png
+
+IPHONE_LAUNCHER := \
+	novnc-60x60.png \
+	novnc-120x120.png
+
+IPAD_LAUNCHER := \
+	novnc-76x76.png \
+	novnc-152x152.png
+
+ALL_ICONS := $(ICONS) $(ANDROID_LAUNCHER) $(IPHONE_LAUNCHER) $(IPAD_LAUNCHER)
+
+all: $(ALL_ICONS)
+
+novnc-16x16.png: novnc-icon-sm.svg
+	convert -density 90 \
+		-background transparent "$<" "$@"
+novnc-24x24.png: novnc-icon-sm.svg
+	convert -density 135 \
+		-background transparent "$<" "$@"
+novnc-32x32.png: novnc-icon-sm.svg
+	convert -density 180 \
+		-background transparent "$<" "$@"
+
+novnc-%.png: novnc-icon.svg
+	convert -density $$[`echo $* | cut -d x -f 1` * 90 / 48] \
+		-background transparent "$<" "$@"
+
+clean:
+	rm -f *.png
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-120x120.png b/systemvm/agent/noVNC/app/images/icons/novnc-120x120.png
new file mode 100644
index 0000000..40823ef
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-120x120.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-144x144.png b/systemvm/agent/noVNC/app/images/icons/novnc-144x144.png
new file mode 100644
index 0000000..eee71f1
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-144x144.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-152x152.png b/systemvm/agent/noVNC/app/images/icons/novnc-152x152.png
new file mode 100644
index 0000000..0694b2d
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-152x152.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-16x16.png b/systemvm/agent/noVNC/app/images/icons/novnc-16x16.png
new file mode 100644
index 0000000..42108f4
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-16x16.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-192x192.png b/systemvm/agent/noVNC/app/images/icons/novnc-192x192.png
new file mode 100644
index 0000000..ef9201f
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-192x192.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-24x24.png b/systemvm/agent/noVNC/app/images/icons/novnc-24x24.png
new file mode 100644
index 0000000..1106135
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-24x24.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-32x32.png b/systemvm/agent/noVNC/app/images/icons/novnc-32x32.png
new file mode 100644
index 0000000..ff00dc3
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-32x32.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-48x48.png b/systemvm/agent/noVNC/app/images/icons/novnc-48x48.png
new file mode 100644
index 0000000..f24cd6c
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-48x48.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-60x60.png b/systemvm/agent/noVNC/app/images/icons/novnc-60x60.png
new file mode 100644
index 0000000..06b0d60
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-60x60.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-64x64.png b/systemvm/agent/noVNC/app/images/icons/novnc-64x64.png
new file mode 100644
index 0000000..6d0fb34
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-64x64.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-72x72.png b/systemvm/agent/noVNC/app/images/icons/novnc-72x72.png
new file mode 100644
index 0000000..23163a2
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-72x72.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-76x76.png b/systemvm/agent/noVNC/app/images/icons/novnc-76x76.png
new file mode 100644
index 0000000..aef61c4
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-76x76.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-96x96.png b/systemvm/agent/noVNC/app/images/icons/novnc-96x96.png
new file mode 100644
index 0000000..1a77c53
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-96x96.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-icon-sm.svg b/systemvm/agent/noVNC/app/images/icons/novnc-icon-sm.svg
new file mode 100644
index 0000000..aa1c6f1
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-icon-sm.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   viewBox="0 0 16 16"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="novnc-icon-sm.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="45.254834"
+     inkscape:cx="9.722703"
+     inkscape:cy="5.5311896"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4169" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1036.3621)">
+    <rect
+       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4167"
+       width="16"
+       height="15.999992"
+       x="0"
+       y="1036.3622"
+       ry="2.6666584" />
+    <path
+       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="M 2.6666667,1036.3621 C 1.1893373,1036.3621 0,1037.5515 0,1039.0288 l 0,10.6666 c 0,1.4774 1.1893373,2.6667 2.6666667,2.6667 l 4,0 C 11.837333,1052.3621 16,1046.7128 16,1039.6955 l 0,-0.6667 c 0,-1.4773 -1.189337,-2.6667 -2.666667,-2.6667 l -10.6666663,0 z"
+       id="rect4173"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g4381">
+      <g
+         transform="translate(0.25,0.25)"
+         style="fill:#000000;fill-opacity:1"
+         id="g4365">
+        <g
+           style="fill:#000000;fill-opacity:1"
+           id="g4367">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4369"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 C 2.011349,1040.3621 2,1040.3741 2,1040.3981 l 0,2.964 -1,0 0,-4 z"
+             sodipodi:nodetypes="scsccsssscccs" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4371"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
+             sodipodi:nodetypes="sscsscsscsscssssssssss" />
+        </g>
+        <g
+           style="fill:#000000;fill-opacity:1"
+           id="g4373">
+          <path
+             inkscape:connector-curvature="0"
+             id="path4375"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
+             sodipodi:nodetypes="cccccccc" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4377"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
+             sodipodi:nodetypes="ccccccccccc" />
+          <path
+             inkscape:connector-curvature="0"
+             id="path4379"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
+             sodipodi:nodetypes="cssssccscsscscc" />
+        </g>
+      </g>
+      <g
+         id="g4356">
+        <g
+           id="g4347">
+          <path
+             sodipodi:nodetypes="scsccsssscccs"
+             d="m 4.3289754,1039.3621 c 0.1846149,0 0.3419956,0.071 0.4716623,0.2121 C 4.933546,1039.7121 5,1039.8793 5,1040.0759 l 0,3.2862 -1,0 0,-2.964 c 0,-0.024 -0.011592,-0.036 -0.034038,-0.036 l -1.931924,0 c -0.022689,0 -0.034038,0.012 -0.034038,0.036 l 0,2.964 -1,0 0,-4 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4143"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="sscsscsscsscssssssssss"
+             d="m 6.6710244,1039.3621 2.6579513,0 c 0.184775,0 0.3419957,0.071 0.471662,0.2121 C 9.933546,1039.7121 10,1039.8793 10,1040.0759 l 0,2.5724 c 0,0.1966 -0.066454,0.3655 -0.1993623,0.5069 -0.1296663,0.1379 -0.286887,0.2069 -0.471662,0.2069 l -2.6579513,0 c -0.184775,0 -0.3436164,-0.069 -0.4765247,-0.2069 C 6.0648334,1043.0138 6,1042.8449 6,1042.6483 l 0,-2.5724 c 0,-0.1966 0.064833,-0.3638 0.1944997,-0.5017 0.1329083,-0.1414 0.2917497,-0.2121 0.4765247,-0.2121 z m 2.2949386,1 -1.931926,0 C 7.011344,1040.3621 7,1040.3741 7,1040.3981 l 0,1.928 c 0,0.024 0.011347,0.036 0.034037,0.036 l 1.931926,0 c 0.02269,0 0.034037,-0.012 0.034037,-0.036 l 0,-1.928 c 0,-0.024 -0.011347,-0.036 -0.034037,-0.036 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4145"
+             inkscape:connector-curvature="0" />
+        </g>
+        <g
+           id="g4351">
+          <path
+             sodipodi:nodetypes="cccccccc"
+             d="m 3,1047.1121 1,-2.75 1,0 -1.5,4 -1,0 -1.5,-4 1,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4147"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="ccccccccccc"
+             d="m 9,1046.8621 0,-2.5 1,0 0,4 -1,0 -2,-2.5 0,2.5 -1,0 0,-4 1,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4149"
+             inkscape:connector-curvature="0" />
+          <path
+             sodipodi:nodetypes="cssssccscsscscc"
+             d="m 15,1045.3621 -2.96596,0 c -0.02269,0 -0.03404,0.012 -0.03404,0.036 l 0,1.928 c 0,0.024 0.01135,0.036 0.03404,0.036 l 2.96596,0 0,1 -3.324113,0 c -0.188017,0 -0.348479,-0.068 -0.481388,-0.2037 C 11.064833,1048.0192 11,1047.8511 11,1047.6542 l 0,-2.5842 c 0,-0.1969 0.06483,-0.3633 0.194499,-0.4991 0.132909,-0.1392 0.293371,-0.2088 0.481388,-0.2088 l 3.324113,0 z"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path4151"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/systemvm/agent/noVNC/app/images/icons/novnc-icon.svg b/systemvm/agent/noVNC/app/images/icons/novnc-icon.svg
new file mode 100644
index 0000000..1efff91
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/icons/novnc-icon.svg
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 48 48.000001"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="novnc-icon.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="27.187245"
+     inkscape:cy="17.700974"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:object-nodes="true"
+     inkscape:snap-smooth-nodes="true"
+     inkscape:snap-midpoints="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1136"
+     inkscape:window-x="1920"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4169" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1004.3621)">
+    <rect
+       style="opacity:1;fill:#494949;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       id="rect4167"
+       width="48"
+       height="48"
+       x="0"
+       y="1004.3621"
+       ry="7.9999785" />
+    <path
+       style="opacity:1;fill:#313131;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 8,1004.3621 c -4.4319881,0 -8,3.568 -8,8 l 0,32 c 0,4.432 3.5680119,8 8,8 l 12,0 c 15.512,0 28,-16.948 28,-38 l 0,-2 c 0,-4.432 -3.568012,-8 -8,-8 l -32,0 z"
+       id="rect4173"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g4300"
+       style="fill:#000000;fill-opacity:1;stroke:none"
+       transform="translate(0.5,0.5)">
+      <g
+         id="g4302"
+         style="fill:#000000;fill-opacity:1;stroke:none">
+        <path
+           sodipodi:nodetypes="scsccsssscccs"
+           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4304"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="sscsscsscsscssssssssss"
+           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4306"
+           inkscape:connector-curvature="0" />
+      </g>
+      <g
+         id="g4308"
+         style="fill:#000000;fill-opacity:1;stroke:none">
+        <path
+           sodipodi:nodetypes="cccccccc"
+           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4310"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="ccccccccccc"
+           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4312"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="cssssccscsscscc"
+           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           id="path4314"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g4291"
+       style="stroke:none">
+      <g
+         id="g4282"
+         style="stroke:none">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4143"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 11.986926,1016.3621 c 0.554325,0 1.025987,0.2121 1.414987,0.6362 0.398725,0.4138 0.600909,0.9155 0.598087,1.5052 l 0,6.8586 -2,0 0,-6.8914 c 0,-0.072 -0.03404,-0.1086 -0.102113,-0.1086 l -4.7957745,0 C 7.0340375,1018.3621 7,1018.3983 7,1018.4707 l 0,6.8914 -2,0 0,-9 z"
+           sodipodi:nodetypes="scsccsssscccs" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4145"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 17.013073,1016.3621 4.973854,0 c 0.554325,0 1.025987,0.2121 1.414986,0.6362 0.398725,0.4138 0.598087,0.9155 0.598087,1.5052 l 0,4.7172 c 0,0.5897 -0.199362,1.0966 -0.598087,1.5207 -0.388999,0.4138 -0.860661,0.6207 -1.414986,0.6207 l -4.973854,0 c -0.554325,0 -1.030849,-0.2069 -1.429574,-0.6207 C 15.1945,1024.3173 15,1023.8104 15,1023.2207 l 0,-4.7172 c 0,-0.5897 0.1945,-1.0914 0.583499,-1.5052 0.398725,-0.4241 0.875249,-0.6362 1.429574,-0.6362 z m 4.884815,2 -4.795776,0 c -0.06808,0 -0.102112,0.036 -0.102112,0.1086 l 0,4.7828 c 0,0.072 0.03404,0.1086 0.102112,0.1086 l 4.795776,0 c 0.06807,0 0.102112,-0.036 0.102112,-0.1086 l 0,-4.7828 c 0,-0.072 -0.03404,-0.1086 -0.102112,-0.1086 z"
+           sodipodi:nodetypes="sscsscsscsscssssssssss" />
+      </g>
+      <g
+         id="g4286"
+         style="stroke:none">
+        <path
+           inkscape:connector-curvature="0"
+           id="path4147"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 12,1036.9177 4.768114,-8.5556 2.231886,0 -6,11 -2,0 -6,-11 2.2318854,0 z"
+           sodipodi:nodetypes="cccccccc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4149"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 29,1036.3621 0,-8 2,0 0,11 -2,0 -7,-8 0,8 -2,0 0,-11 2,0 z"
+           sodipodi:nodetypes="ccccccccccc" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path4151"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:medium;line-height:125%;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 43,1030.3621 -8.897887,0 c -0.06808,0 -0.102113,0.036 -0.102113,0.1069 l 0,6.7862 c 0,0.071 0.03404,0.1069 0.102113,0.1069 l 8.897887,0 0,2 -8.972339,0 c -0.56405,0 -1.045437,-0.2037 -1.444162,-0.6111 C 32.1945,1038.3334 32,1037.8292 32,1037.2385 l 0,-6.7528 c 0,-0.5907 0.1945,-1.0898 0.583499,-1.4972 0.398725,-0.4176 0.880112,-0.6264 1.444162,-0.6264 l 8.972339,0 z"
+           sodipodi:nodetypes="cssssccscsscscc" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/systemvm/agent/noVNC/app/images/info.png b/systemvm/agent/noVNC/app/images/info.png
new file mode 100644
index 0000000..21e3589
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/info.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/keyboard.png b/systemvm/agent/noVNC/app/images/keyboard.png
new file mode 100644
index 0000000..fe8056b
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/keyboard.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/power.png b/systemvm/agent/noVNC/app/images/power.png
new file mode 100644
index 0000000..7f87135
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/power.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/settings.png b/systemvm/agent/noVNC/app/images/settings.png
new file mode 100644
index 0000000..8d0c0d4
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/settings.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/tab.png b/systemvm/agent/noVNC/app/images/tab.png
new file mode 100644
index 0000000..6adb781
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/tab.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/toggleextrakeys.png b/systemvm/agent/noVNC/app/images/toggleextrakeys.png
new file mode 100644
index 0000000..0f80f6d
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/toggleextrakeys.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/warning.png b/systemvm/agent/noVNC/app/images/warning.png
new file mode 100644
index 0000000..e9dd550
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/warning.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/images/windows.png b/systemvm/agent/noVNC/app/images/windows.png
new file mode 100644
index 0000000..036e1ae
--- /dev/null
+++ b/systemvm/agent/noVNC/app/images/windows.png
Binary files differ
diff --git a/systemvm/agent/noVNC/app/locale/README b/systemvm/agent/noVNC/app/locale/README
new file mode 100644
index 0000000..ca4f548
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/README
@@ -0,0 +1 @@
+DO NOT MODIFY THE FILES IN THIS FOLDER, THEY ARE AUTOMATICALLY GENERATED FROM THE PO-FILES.
diff --git a/systemvm/agent/noVNC/app/locale/cs.json b/systemvm/agent/noVNC/app/locale/cs.json
new file mode 100644
index 0000000..589145e
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/cs.json
@@ -0,0 +1,71 @@
+{
+    "Connecting...": "Připojení...",
+    "Disconnecting...": "Odpojení...",
+    "Reconnecting...": "Obnova připojení...",
+    "Internal error": "Vnitřní chyba",
+    "Must set host": "Hostitel musí být nastavení",
+    "Connected (encrypted) to ": "Připojení (šifrované) k ",
+    "Connected (unencrypted) to ": "Připojení (nešifrované) k ",
+    "Something went wrong, connection is closed": "Něco se pokazilo, odpojeno",
+    "Failed to connect to server": "Chyba připojení k serveru",
+    "Disconnected": "Odpojeno",
+    "New connection has been rejected with reason: ": "Nové připojení bylo odmítnuto s odůvodněním: ",
+    "New connection has been rejected": "Nové připojení bylo odmítnuto",
+    "Password is required": "Je vyžadováno heslo",
+    "noVNC encountered an error:": "noVNC narazilo na chybu:",
+    "Hide/Show the control bar": "Skrýt/zobrazit ovládací panel",
+    "Move/Drag Viewport": "Přesunout/přetáhnout výřez",
+    "viewport drag": "přesun výřezu",
+    "Active Mouse Button": "Aktivní tlačítka myši",
+    "No mousebutton": "Žádné",
+    "Left mousebutton": "Levé tlačítko myši",
+    "Middle mousebutton": "Prostřední tlačítko myši",
+    "Right mousebutton": "Pravé tlačítko myši",
+    "Keyboard": "Klávesnice",
+    "Show Keyboard": "Zobrazit klávesnici",
+    "Extra keys": "Extra klávesy",
+    "Show Extra Keys": "Zobrazit extra klávesy",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Přepnout Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Přepnout Alt",
+    "Send Tab": "Odeslat tabulátor",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Odeslat Esc",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Poslat Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Vypnutí/Restart",
+    "Shutdown/Reboot...": "Vypnutí/Restart...",
+    "Power": "Napájení",
+    "Shutdown": "Vypnout",
+    "Reboot": "Restart",
+    "Reset": "Reset",
+    "Clipboard": "Schránka",
+    "Clear": "Vymazat",
+    "Fullscreen": "Celá obrazovka",
+    "Settings": "Nastavení",
+    "Shared Mode": "Sdílený režim",
+    "View Only": "Pouze prohlížení",
+    "Clip to Window": "Přizpůsobit oknu",
+    "Scaling Mode:": "Přizpůsobení velikosti",
+    "None": "Žádné",
+    "Local Scaling": "Místní",
+    "Remote Resizing": "Vzdálené",
+    "Advanced": "Pokročilé",
+    "Repeater ID:": "ID opakovače",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Šifrování:",
+    "Host:": "Hostitel:",
+    "Port:": "Port:",
+    "Path:": "Cesta",
+    "Automatic Reconnect": "Automatická obnova připojení",
+    "Reconnect Delay (ms):": "Zpoždění připojení (ms)",
+    "Show Dot when No Cursor": "Tečka místo chybějícího kurzoru myši",
+    "Logging:": "Logování:",
+    "Disconnect": "Odpojit",
+    "Connect": "Připojit",
+    "Password:": "Heslo",
+    "Send Password": "Odeslat heslo",
+    "Cancel": "Zrušit"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/de.json b/systemvm/agent/noVNC/app/locale/de.json
new file mode 100644
index 0000000..62e7336
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/de.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Verbinden...",
+    "Disconnecting...": "Verbindung trennen...",
+    "Reconnecting...": "Verbindung wiederherstellen...",
+    "Internal error": "Interner Fehler",
+    "Must set host": "Richten Sie den Server ein",
+    "Connected (encrypted) to ": "Verbunden mit (verschlüsselt) ",
+    "Connected (unencrypted) to ": "Verbunden mit (unverschlüsselt) ",
+    "Something went wrong, connection is closed": "Etwas lief schief, Verbindung wurde getrennt",
+    "Disconnected": "Verbindung zum Server getrennt",
+    "New connection has been rejected with reason: ": "Verbindung wurde aus folgendem Grund abgelehnt: ",
+    "New connection has been rejected": "Verbindung wurde abgelehnt",
+    "Password is required": "Passwort ist erforderlich",
+    "noVNC encountered an error:": "Ein Fehler ist aufgetreten:",
+    "Hide/Show the control bar": "Kontrollleiste verstecken/anzeigen",
+    "Move/Drag Viewport": "Ansichtsfenster verschieben/ziehen",
+    "viewport drag": "Ansichtsfenster ziehen",
+    "Active Mouse Button": "Aktive Maustaste",
+    "No mousebutton": "Keine Maustaste",
+    "Left mousebutton": "Linke Maustaste",
+    "Middle mousebutton": "Mittlere Maustaste",
+    "Right mousebutton": "Rechte Maustaste",
+    "Keyboard": "Tastatur",
+    "Show Keyboard": "Tastatur anzeigen",
+    "Extra keys": "Zusatztasten",
+    "Show Extra Keys": "Zusatztasten anzeigen",
+    "Ctrl": "Strg",
+    "Toggle Ctrl": "Strg umschalten",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt umschalten",
+    "Send Tab": "Tab senden",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Escape senden",
+    "Ctrl+Alt+Del": "Strg+Alt+Entf",
+    "Send Ctrl-Alt-Del": "Strg+Alt+Entf senden",
+    "Shutdown/Reboot": "Herunterfahren/Neustarten",
+    "Shutdown/Reboot...": "Herunterfahren/Neustarten...",
+    "Power": "Energie",
+    "Shutdown": "Herunterfahren",
+    "Reboot": "Neustarten",
+    "Reset": "Zurücksetzen",
+    "Clipboard": "Zwischenablage",
+    "Clear": "Löschen",
+    "Fullscreen": "Vollbild",
+    "Settings": "Einstellungen",
+    "Shared Mode": "Geteilter Modus",
+    "View Only": "Nur betrachten",
+    "Clip to Window": "Auf Fenster begrenzen",
+    "Scaling Mode:": "Skalierungsmodus:",
+    "None": "Keiner",
+    "Local Scaling": "Lokales skalieren",
+    "Remote Resizing": "Serverseitiges skalieren",
+    "Advanced": "Erweitert",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Verschlüsselt",
+    "Host:": "Server:",
+    "Port:": "Port:",
+    "Path:": "Pfad:",
+    "Automatic Reconnect": "Automatisch wiederverbinden",
+    "Reconnect Delay (ms):": "Wiederverbindungsverzögerung (ms):",
+    "Logging:": "Protokollierung:",
+    "Disconnect": "Verbindung trennen",
+    "Connect": "Verbinden",
+    "Password:": "Passwort:",
+    "Cancel": "Abbrechen",
+    "Canvas not supported.": "Canvas nicht unterstützt."
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/el.json b/systemvm/agent/noVNC/app/locale/el.json
new file mode 100644
index 0000000..f801251
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/el.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Συνδέεται...",
+    "Disconnecting...": "Aποσυνδέεται...",
+    "Reconnecting...": "Επανασυνδέεται...",
+    "Internal error": "Εσωτερικό σφάλμα",
+    "Must set host": "Πρέπει να οριστεί ο διακομιστής",
+    "Connected (encrypted) to ": "Συνδέθηκε (κρυπτογραφημένα) με το ",
+    "Connected (unencrypted) to ": "Συνδέθηκε (μη κρυπτογραφημένα) με το ",
+    "Something went wrong, connection is closed": "Κάτι πήγε στραβά, η σύνδεση διακόπηκε",
+    "Disconnected": "Αποσυνδέθηκε",
+    "New connection has been rejected with reason: ": "Η νέα σύνδεση απορρίφθηκε διότι: ",
+    "New connection has been rejected": "Η νέα σύνδεση απορρίφθηκε ",
+    "Password is required": "Απαιτείται ο κωδικός πρόσβασης",
+    "noVNC encountered an error:": "το noVNC αντιμετώπισε ένα σφάλμα:",
+    "Hide/Show the control bar": "Απόκρυψη/Εμφάνιση γραμμής ελέγχου",
+    "Move/Drag Viewport": "Μετακίνηση/Σύρσιμο Θεατού πεδίου",
+    "viewport drag": "σύρσιμο θεατού πεδίου",
+    "Active Mouse Button": "Ενεργό Πλήκτρο Ποντικιού",
+    "No mousebutton": "Χωρίς Πλήκτρο Ποντικιού",
+    "Left mousebutton": "Αριστερό Πλήκτρο Ποντικιού",
+    "Middle mousebutton": "Μεσαίο Πλήκτρο Ποντικιού",
+    "Right mousebutton": "Δεξί Πλήκτρο Ποντικιού",
+    "Keyboard": "Πληκτρολόγιο",
+    "Show Keyboard": "Εμφάνιση Πληκτρολογίου",
+    "Extra keys": "Επιπλέον πλήκτρα",
+    "Show Extra Keys": "Εμφάνιση Επιπλέον Πλήκτρων",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Εναλλαγή Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Εναλλαγή Alt",
+    "Send Tab": "Αποστολή Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Αποστολή Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Αποστολή Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Κλείσιμο/Επανεκκίνηση",
+    "Shutdown/Reboot...": "Κλείσιμο/Επανεκκίνηση...",
+    "Power": "Απενεργοποίηση",
+    "Shutdown": "Κλείσιμο",
+    "Reboot": "Επανεκκίνηση",
+    "Reset": "Επαναφορά",
+    "Clipboard": "Πρόχειρο",
+    "Clear": "Καθάρισμα",
+    "Fullscreen": "Πλήρης Οθόνη",
+    "Settings": "Ρυθμίσεις",
+    "Shared Mode": "Κοινόχρηστη Λειτουργία",
+    "View Only": "Μόνο Θέαση",
+    "Clip to Window": "Αποκοπή στο όριο του Παράθυρου",
+    "Scaling Mode:": "Λειτουργία Κλιμάκωσης:",
+    "None": "Καμία",
+    "Local Scaling": "Τοπική Κλιμάκωση",
+    "Remote Resizing": "Απομακρυσμένη Αλλαγή μεγέθους",
+    "Advanced": "Για προχωρημένους",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Κρυπτογράφηση",
+    "Host:": "Όνομα διακομιστή:",
+    "Port:": "Πόρτα διακομιστή:",
+    "Path:": "Διαδρομή:",
+    "Automatic Reconnect": "Αυτόματη επανασύνδεση",
+    "Reconnect Delay (ms):": "Καθυστέρηση επανασύνδεσης (ms):",
+    "Logging:": "Καταγραφή:",
+    "Disconnect": "Αποσύνδεση",
+    "Connect": "Σύνδεση",
+    "Password:": "Κωδικός Πρόσβασης:",
+    "Cancel": "Ακύρωση",
+    "Canvas not supported.": "Δεν υποστηρίζεται το στοιχείο Canvas"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/es.json b/systemvm/agent/noVNC/app/locale/es.json
new file mode 100644
index 0000000..23f23f4
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/es.json
@@ -0,0 +1,68 @@
+{
+    "Connecting...": "Conectando...",
+    "Connected (encrypted) to ": "Conectado (con encriptación) a",
+    "Connected (unencrypted) to ": "Conectado (sin encriptación) a",
+    "Disconnecting...": "Desconectando...",
+    "Disconnected": "Desconectado",
+    "Must set host": "Debes configurar el host",
+    "Reconnecting...": "Reconectando...",
+    "Password is required": "Contraseña es obligatoria",
+    "Disconnect timeout": "Tiempo de desconexión agotado",
+    "noVNC encountered an error:": "noVNC ha encontrado un error:",
+    "Hide/Show the control bar": "Ocultar/Mostrar la barra de control",
+    "Move/Drag Viewport": "Mover/Arrastrar la ventana",
+    "viewport drag": "Arrastrar la ventana",
+    "Active Mouse Button": "Botón activo del ratón",
+    "No mousebutton": "Ningún botón del ratón",
+    "Left mousebutton": "Botón izquierdo del ratón",
+    "Middle mousebutton": "Botón central del ratón",
+    "Right mousebutton": "Botón derecho del ratón",
+    "Keyboard": "Teclado",
+    "Show Keyboard": "Mostrar teclado",
+    "Extra keys": "Teclas adicionales",
+    "Show Extra Keys": "Mostrar Teclas Adicionales",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Pulsar/Soltar Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Pulsar/Soltar Alt",
+    "Send Tab": "Enviar Tabulación",
+    "Tab": "Tabulación",
+    "Esc": "Esc",
+    "Send Escape": "Enviar Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Enviar Ctrl+Alt+Del",
+    "Shutdown/Reboot": "Apagar/Reiniciar",
+    "Shutdown/Reboot...": "Apagar/Reiniciar...",
+    "Power": "Encender",
+    "Shutdown": "Apagar",
+    "Reboot": "Reiniciar",
+    "Reset": "Restablecer",
+    "Clipboard": "Portapapeles",
+    "Clear": "Vaciar",
+    "Fullscreen": "Pantalla Completa",
+    "Settings": "Configuraciones",
+    "Shared Mode": "Modo Compartido",
+    "View Only": "Solo visualización",
+    "Clip to Window": "Recortar al tamaño de la ventana",
+    "Scaling Mode:": "Modo de escalado:",
+    "None": "Ninguno",
+    "Local Scaling": "Escalado Local",
+    "Local Downscaling": "Reducción de escala local",
+    "Remote Resizing": "Cambio de tamaño remoto",
+    "Advanced": "Avanzado",
+    "Local Cursor": "Cursor Local",
+    "Repeater ID:": "ID del Repetidor",
+    "WebSocket": "WebSocket",
+    "Encrypt": "",
+    "Host:": "Host",
+    "Port:": "Puesto",
+    "Path:": "Ruta",
+    "Automatic Reconnect": "Reconexión automática",
+    "Reconnect Delay (ms):": "Retraso en la reconexión (ms)",
+    "Logging:": "Logging",
+    "Disconnect": "Desconectar",
+    "Connect": "Conectar",
+    "Password:": "Contraseña",
+    "Cancel": "Cancelar",
+    "Canvas not supported.": "Canvas no está soportado"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/ja.json b/systemvm/agent/noVNC/app/locale/ja.json
new file mode 100644
index 0000000..e5fe340
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/ja.json
@@ -0,0 +1,73 @@
+{
+    "Connecting...": "接続しています...",
+    "Disconnecting...": "切断しています...",
+    "Reconnecting...": "再接続しています...",
+    "Internal error": "内部エラー",
+    "Must set host": "ホストを設定する必要があります",
+    "Connected (encrypted) to ": "接続しました (暗号化済み): ",
+    "Connected (unencrypted) to ": "接続しました (暗号化されていません): ",
+    "Something went wrong, connection is closed": "何かが問題で、接続が閉じられました",
+    "Failed to connect to server": "サーバーへの接続に失敗しました",
+    "Disconnected": "切断しました",
+    "New connection has been rejected with reason: ": "新規接続は次の理由で拒否されました: ",
+    "New connection has been rejected": "新規接続は拒否されました",
+    "Password is required": "パスワードが必要です",
+    "noVNC encountered an error:": "noVNC でエラーが発生しました:",
+    "Hide/Show the control bar": "コントロールバーを隠す/表示する",
+    "Move/Drag Viewport": "ビューポートを移動/ドラッグ",
+    "viewport drag": "ビューポートをドラッグ",
+    "Active Mouse Button": "アクティブなマウスボタン",
+    "No mousebutton": "マウスボタンなし",
+    "Left mousebutton": "左マウスボタン",
+    "Middle mousebutton": "中マウスボタン",
+    "Right mousebutton": "右マウスボタン",
+    "Keyboard": "キーボード",
+    "Show Keyboard": "キーボードを表示",
+    "Extra keys": "追加キー",
+    "Show Extra Keys": "追加キーを表示",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl キーを切り替え",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt キーを切り替え",
+    "Toggle Windows": "Windows キーを切り替え",
+    "Windows": "Windows",
+    "Send Tab": "Tab キーを送信",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Escape キーを送信",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del を送信",
+    "Shutdown/Reboot": "シャットダウン/再起動",
+    "Shutdown/Reboot...": "シャットダウン/再起動...",
+    "Power": "電源",
+    "Shutdown": "シャットダウン",
+    "Reboot": "再起動",
+    "Reset": "リセット",
+    "Clipboard": "クリップボード",
+    "Clear": "クリア",
+    "Fullscreen": "全画面表示",
+    "Settings": "設定",
+    "Shared Mode": "共有モード",
+    "View Only": "表示のみ",
+    "Clip to Window": "ウィンドウにクリップ",
+    "Scaling Mode:": "スケーリングモード:",
+    "None": "なし",
+    "Local Scaling": "ローカルスケーリング",
+    "Remote Resizing": "リモートでリサイズ",
+    "Advanced": "高度",
+    "Repeater ID:": "リピーター ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "暗号化",
+    "Host:": "ホスト:",
+    "Port:": "ポート:",
+    "Path:": "パス:",
+    "Automatic Reconnect": "自動再接続",
+    "Reconnect Delay (ms):": "再接続する遅延 (ミリ秒):",
+    "Show Dot when No Cursor": "カーソルがないときにドットを表示",
+    "Logging:": "ロギング:",
+    "Disconnect": "切断",
+    "Connect": "接続",
+    "Password:": "パスワード:",
+    "Send Password": "パスワードを送信",
+    "Cancel": "キャンセル"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/ko.json b/systemvm/agent/noVNC/app/locale/ko.json
new file mode 100644
index 0000000..e4ecddc
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/ko.json
@@ -0,0 +1,70 @@
+{
+    "Connecting...": "연결중...",
+    "Disconnecting...": "연결 해제중...",
+    "Reconnecting...": "재연결중...",
+    "Internal error": "내부 오류",
+    "Must set host": "호스트는 설정되어야 합니다.",
+    "Connected (encrypted) to ": "다음과 (암호화되어) 연결되었습니다:",
+    "Connected (unencrypted) to ": "다음과 (암호화 없이) 연결되었습니다:",
+    "Something went wrong, connection is closed": "무언가 잘못되었습니다, 연결이 닫혔습니다.",
+    "Failed to connect to server": "서버에 연결하지 못했습니다.",
+    "Disconnected": "연결이 해제되었습니다.",
+    "New connection has been rejected with reason: ": "새 연결이 다음 이유로 거부되었습니다:",
+    "New connection has been rejected": "새 연결이 거부되었습니다.",
+    "Password is required": "비밀번호가 필요합니다.",
+    "noVNC encountered an error:": "noVNC에 오류가 발생했습니다:",
+    "Hide/Show the control bar": "컨트롤 바 숨기기/보이기",
+    "Move/Drag Viewport": "움직이기/드래그 뷰포트",
+    "viewport drag": "뷰포트 드래그",
+    "Active Mouse Button": "마우스 버튼 활성화",
+    "No mousebutton": "마우스 버튼 없음",
+    "Left mousebutton": "왼쪽 마우스 버튼",
+    "Middle mousebutton": "중간 마우스 버튼",
+    "Right mousebutton": "오른쪽 마우스 버튼",
+    "Keyboard": "키보드",
+    "Show Keyboard": "키보드 보이기",
+    "Extra keys": "기타 키들",
+    "Show Extra Keys": "기타 키들 보이기",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl 켜기/끄기",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt 켜기/끄기",
+    "Send Tab": "Tab 보내기",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Esc 보내기",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Ctrl+Alt+Del 보내기",
+    "Shutdown/Reboot": "셧다운/리붓",
+    "Shutdown/Reboot...": "셧다운/리붓...",
+    "Power": "전원",
+    "Shutdown": "셧다운",
+    "Reboot": "리붓",
+    "Reset": "리셋",
+    "Clipboard": "클립보드",
+    "Clear": "지우기",
+    "Fullscreen": "전체화면",
+    "Settings": "설정",
+    "Shared Mode": "공유 모드",
+    "View Only": "보기 전용",
+    "Clip to Window": "창에 클립",
+    "Scaling Mode:": "스케일링 모드:",
+    "None": "없음",
+    "Local Scaling": "로컬 스케일링",
+    "Remote Resizing": "원격 크기 조절",
+    "Advanced": "고급",
+    "Repeater ID:": "중계 ID",
+    "WebSocket": "웹소켓",
+    "Encrypt": "암호화",
+    "Host:": "호스트:",
+    "Port:": "포트:",
+    "Path:": "위치:",
+    "Automatic Reconnect": "자동 재연결",
+    "Reconnect Delay (ms):": "재연결 지연 시간 (ms)",
+    "Logging:": "로깅",
+    "Disconnect": "연결 해제",
+    "Connect": "연결",
+    "Password:": "비밀번호:",
+    "Send Password": "비밀번호 전송",
+    "Cancel": "취소"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/nl.json b/systemvm/agent/noVNC/app/locale/nl.json
new file mode 100644
index 0000000..0cdcc92
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/nl.json
@@ -0,0 +1,73 @@
+{
+    "Connecting...": "Verbinden...",
+    "Disconnecting...": "Verbinding verbreken...",
+    "Reconnecting...": "Opnieuw verbinding maken...",
+    "Internal error": "Interne fout",
+    "Must set host": "Host moeten worden ingesteld",
+    "Connected (encrypted) to ": "Verbonden (versleuteld) met ",
+    "Connected (unencrypted) to ": "Verbonden (onversleuteld) met ",
+    "Something went wrong, connection is closed": "Er iets fout gelopen, verbinding werd verbroken",
+    "Failed to connect to server": "Verbinding maken met server is mislukt",
+    "Disconnected": "Verbinding verbroken",
+    "New connection has been rejected with reason: ": "Nieuwe verbinding is geweigerd omwille van de volgende reden: ",
+    "New connection has been rejected": "Nieuwe verbinding is geweigerd",
+    "Password is required": "Wachtwoord is vereist",
+    "noVNC encountered an error:": "noVNC heeft een fout bemerkt:",
+    "Hide/Show the control bar": "Verberg/Toon de bedieningsbalk",
+    "Move/Drag Viewport": "Verplaats/Versleep Kijkvenster",
+    "viewport drag": "kijkvenster slepen",
+    "Active Mouse Button": "Actieve Muisknop",
+    "No mousebutton": "Geen muisknop",
+    "Left mousebutton": "Linker muisknop",
+    "Middle mousebutton": "Middelste muisknop",
+    "Right mousebutton": "Rechter muisknop",
+    "Keyboard": "Toetsenbord",
+    "Show Keyboard": "Toon Toetsenbord",
+    "Extra keys": "Extra toetsen",
+    "Show Extra Keys": "Toon Extra Toetsen",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl omschakelen",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt omschakelen",
+    "Toggle Windows": "Windows omschakelen",
+    "Windows": "Windows",
+    "Send Tab": "Tab Sturen",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Escape Sturen",
+    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
+    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Sturen",
+    "Shutdown/Reboot": "Uitschakelen/Herstarten",
+    "Shutdown/Reboot...": "Uitschakelen/Herstarten...",
+    "Power": "Systeem",
+    "Shutdown": "Uitschakelen",
+    "Reboot": "Herstarten",
+    "Reset": "Resetten",
+    "Clipboard": "Klembord",
+    "Clear": "Wissen",
+    "Fullscreen": "Volledig Scherm",
+    "Settings": "Instellingen",
+    "Shared Mode": "Gedeelde Modus",
+    "View Only": "Alleen Kijken",
+    "Clip to Window": "Randen buiten venster afsnijden",
+    "Scaling Mode:": "Schaalmodus:",
+    "None": "Geen",
+    "Local Scaling": "Lokaal Schalen",
+    "Remote Resizing": "Op Afstand Formaat Wijzigen",
+    "Advanced": "Geavanceerd",
+    "Repeater ID:": "Repeater ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Versleutelen",
+    "Host:": "Host:",
+    "Port:": "Poort:",
+    "Path:": "Pad:",
+    "Automatic Reconnect": "Automatisch Opnieuw Verbinden",
+    "Reconnect Delay (ms):": "Vertraging voor Opnieuw Verbinden (ms):",
+    "Show Dot when No Cursor": "Geef stip weer indien geen cursor",
+    "Logging:": "Logmeldingen:",
+    "Disconnect": "Verbinding verbreken",
+    "Connect": "Verbinden",
+    "Password:": "Wachtwoord:",
+    "Send Password": "Verzend Wachtwoord:",
+    "Cancel": "Annuleren"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/pl.json b/systemvm/agent/noVNC/app/locale/pl.json
new file mode 100644
index 0000000..006ac7a
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/pl.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Łączenie...",
+    "Disconnecting...": "Rozłączanie...",
+    "Reconnecting...": "Łączenie...",
+    "Internal error": "Błąd wewnętrzny",
+    "Must set host": "Host i port są wymagane",
+    "Connected (encrypted) to ": "Połączenie (szyfrowane) z ",
+    "Connected (unencrypted) to ": "Połączenie (nieszyfrowane) z ",
+    "Something went wrong, connection is closed": "Coś poszło źle, połączenie zostało zamknięte",
+    "Disconnected": "Rozłączony",
+    "New connection has been rejected with reason: ": "Nowe połączenie zostało odrzucone z powodu: ",
+    "New connection has been rejected": "Nowe połączenie zostało odrzucone",
+    "Password is required": "Hasło jest wymagane",
+    "noVNC encountered an error:": "noVNC napotkało błąd:",
+    "Hide/Show the control bar": "Pokaż/Ukryj pasek ustawień",
+    "Move/Drag Viewport": "Ruszaj/Przeciągaj Viewport",
+    "viewport drag": "przeciągnij viewport",
+    "Active Mouse Button": "Aktywny Przycisk Myszy",
+    "No mousebutton": "Brak przycisku myszy",
+    "Left mousebutton": "Lewy przycisk myszy",
+    "Middle mousebutton": "Środkowy przycisk myszy",
+    "Right mousebutton": "Prawy przycisk myszy",
+    "Keyboard": "Klawiatura",
+    "Show Keyboard": "Pokaż klawiaturę",
+    "Extra keys": "Przyciski dodatkowe",
+    "Show Extra Keys": "Pokaż przyciski dodatkowe",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Przełącz Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Przełącz Alt",
+    "Send Tab": "Wyślij Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Wyślij Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Wyślij Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Wyłącz/Uruchom ponownie",
+    "Shutdown/Reboot...": "Wyłącz/Uruchom ponownie...",
+    "Power": "Włączony",
+    "Shutdown": "Wyłącz",
+    "Reboot": "Uruchom ponownie",
+    "Reset": "Resetuj",
+    "Clipboard": "Schowek",
+    "Clear": "Wyczyść",
+    "Fullscreen": "Pełny ekran",
+    "Settings": "Ustawienia",
+    "Shared Mode": "Tryb Współdzielenia",
+    "View Only": "Tylko Podgląd",
+    "Clip to Window": "Przytnij do Okna",
+    "Scaling Mode:": "Tryb Skalowania:",
+    "None": "Brak",
+    "Local Scaling": "Skalowanie lokalne",
+    "Remote Resizing": "Skalowanie zdalne",
+    "Advanced": "Zaawansowane",
+    "Repeater ID:": "ID Repeatera:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Szyfrowanie",
+    "Host:": "Host:",
+    "Port:": "Port:",
+    "Path:": "Ścieżka:",
+    "Automatic Reconnect": "Automatycznie wznawiaj połączenie",
+    "Reconnect Delay (ms):": "Opóźnienie wznawiania (ms):",
+    "Logging:": "Poziom logowania:",
+    "Disconnect": "Rozłącz",
+    "Connect": "Połącz",
+    "Password:": "Hasło:",
+    "Cancel": "Anuluj",
+    "Canvas not supported.": "Element Canvas nie jest wspierany."
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/ru.json b/systemvm/agent/noVNC/app/locale/ru.json
new file mode 100644
index 0000000..52e57f3
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/ru.json
@@ -0,0 +1,73 @@
+{
+    "Connecting...": "Подключение...",
+    "Disconnecting...": "Отключение...",
+    "Reconnecting...": "Переподключение...",
+    "Internal error": "Внутренняя ошибка",
+    "Must set host": "Задайте имя сервера или IP",
+    "Connected (encrypted) to ": "Подключено (с шифрованием) к ",
+    "Connected (unencrypted) to ": "Подключено (без шифрования) к ",
+    "Something went wrong, connection is closed": "Что-то пошло не так, подключение разорвано",
+    "Failed to connect to server": "Ошибка подключения к серверу",
+    "Disconnected": "Отключено",
+    "New connection has been rejected with reason: ": "Подключиться не удалось: ",
+    "New connection has been rejected": "Подключиться не удалось",
+    "Password is required": "Требуется пароль",
+    "noVNC encountered an error:": "Ошибка noVNC: ",
+    "Hide/Show the control bar": "Скрыть/Показать контрольную панель",
+    "Move/Drag Viewport": "Переместить окно",
+    "viewport drag": "Переместить окно",
+    "Active Mouse Button": "Активировать кнопки мыши",
+    "No mousebutton": "Отключить кнопки мыши",
+    "Left mousebutton": "Левая кнопка мыши",
+    "Middle mousebutton": "Средняя  кнопка мыши",
+    "Right mousebutton": "Правая кнопка мыши",
+    "Keyboard": "Клавиатура",
+    "Show Keyboard": "Показать клавиатуру",
+    "Extra keys": "Доп. кнопки",
+    "Show Extra Keys": "Показать дополнительные кнопки",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Передать нажатие Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Передать нажатие Alt",
+    "Toggle Windows": "Переключение вкладок",
+    "Windows": "Вкладка",
+    "Send Tab": "Передать нажатие Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Передать нажатие Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Передать нажатие Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Выключить/Перезагрузить",
+    "Shutdown/Reboot...": "Выключить/Перезагрузить...",
+    "Power": "Питание",
+    "Shutdown": "Выключить",
+    "Reboot": "Перезагрузить",
+    "Reset": "Сброс",
+    "Clipboard": "Буфер обмена",
+    "Clear": "Очистить",
+    "Fullscreen": "Во весь экран",
+    "Settings": "Настройки",
+    "Shared Mode": "Общий режим",
+    "View Only": "Просмотр",
+    "Clip to Window": "В окно",
+    "Scaling Mode:": "Масштаб:",
+    "None": "Нет",
+    "Local Scaling": "Локльный масштаб",
+    "Remote Resizing": "Удаленный масштаб",
+    "Advanced": "Дополнительно",
+    "Repeater ID:": "Идентификатор ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Шифрование",
+    "Host:": "Сервер:",
+    "Port:": "Порт:",
+    "Path:": "Путь:",
+    "Automatic Reconnect": "Автоматическое переподключение",
+    "Reconnect Delay (ms):": "Задержка переподключения (мс):",
+    "Show Dot when No Cursor": "Показать точку вместо курсора",
+    "Logging:": "Лог:",
+    "Disconnect": "Отключение",
+    "Connect": "Подключение",
+    "Password:": "Пароль:",
+    "Send Password": "Пароль: ",
+    "Cancel": "Выход"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/sv.json b/systemvm/agent/noVNC/app/locale/sv.json
new file mode 100644
index 0000000..e46df45
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/sv.json
@@ -0,0 +1,72 @@
+{
+    "Connecting...": "Ansluter...",
+    "Disconnecting...": "Kopplar ner...",
+    "Reconnecting...": "Återansluter...",
+    "Internal error": "Internt fel",
+    "Must set host": "Du måste specifiera en värd",
+    "Connected (encrypted) to ": "Ansluten (krypterat) till ",
+    "Connected (unencrypted) to ": "Ansluten (okrypterat) till ",
+    "Something went wrong, connection is closed": "Något gick fel, anslutningen avslutades",
+    "Failed to connect to server": "Misslyckades att ansluta till servern",
+    "Disconnected": "Frånkopplad",
+    "New connection has been rejected with reason: ": "Ny anslutning har blivit nekad med följande skäl: ",
+    "New connection has been rejected": "Ny anslutning har blivit nekad",
+    "Credentials are required": "Användaruppgifter krävs",
+    "noVNC encountered an error:": "noVNC stötte på ett problem:",
+    "Hide/Show the control bar": "Göm/Visa kontrollbaren",
+    "Drag": "Dra",
+    "Move/Drag Viewport": "Flytta/Dra Vyn",
+    "Keyboard": "Tangentbord",
+    "Show Keyboard": "Visa Tangentbord",
+    "Extra keys": "Extraknappar",
+    "Show Extra Keys": "Visa Extraknappar",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Växla Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "Växla Alt",
+    "Toggle Windows": "Växla Windows",
+    "Windows": "Windows",
+    "Send Tab": "Skicka Tab",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "Skicka Escape",
+    "Ctrl+Alt+Del": "Ctrl+Alt+Del",
+    "Send Ctrl-Alt-Del": "Skicka Ctrl-Alt-Del",
+    "Shutdown/Reboot": "Stäng av/Boota om",
+    "Shutdown/Reboot...": "Stäng av/Boota om...",
+    "Power": "Ström",
+    "Shutdown": "Stäng av",
+    "Reboot": "Boota om",
+    "Reset": "Återställ",
+    "Clipboard": "Urklipp",
+    "Clear": "Rensa",
+    "Fullscreen": "Fullskärm",
+    "Settings": "Inställningar",
+    "Shared Mode": "Delat Läge",
+    "View Only": "Endast Visning",
+    "Clip to Window": "Begränsa till Fönster",
+    "Scaling Mode:": "Skalningsläge:",
+    "None": "Ingen",
+    "Local Scaling": "Lokal Skalning",
+    "Remote Resizing": "Ändra Storlek",
+    "Advanced": "Avancerat",
+    "Quality:": "Kvalitet:",
+    "Compression level:": "Kompressionsnivå:",
+    "Repeater ID:": "Repeater-ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Kryptera",
+    "Host:": "Värd:",
+    "Port:": "Port:",
+    "Path:": "Sökväg:",
+    "Automatic Reconnect": "Automatisk Återanslutning",
+    "Reconnect Delay (ms):": "Fördröjning (ms):",
+    "Show Dot when No Cursor": "Visa prick när ingen muspekare finns",
+    "Logging:": "Loggning:",
+    "Version:": "Version:",
+    "Disconnect": "Koppla från",
+    "Connect": "Anslut",
+    "Username:": "Användarnamn:",
+    "Password:": "Lösenord:",
+    "Send Credentials": "Skicka Användaruppgifter",
+    "Cancel": "Avbryt"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/tr.json b/systemvm/agent/noVNC/app/locale/tr.json
new file mode 100644
index 0000000..451c1b8
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/tr.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "Bağlanıyor...",
+    "Disconnecting...": "Bağlantı kesiliyor...",
+    "Reconnecting...": "Yeniden bağlantı kuruluyor...",
+    "Internal error": "İç hata",
+    "Must set host": "Sunucuyu kur",
+    "Connected (encrypted) to ": "Bağlı (şifrelenmiş)",
+    "Connected (unencrypted) to ": "Bağlandı (şifrelenmemiş)",
+    "Something went wrong, connection is closed": "Bir şeyler ters gitti, bağlantı kesildi",
+    "Disconnected": "Bağlantı kesildi",
+    "New connection has been rejected with reason: ": "Bağlantı aşağıdaki nedenlerden dolayı reddedildi: ",
+    "New connection has been rejected": "Bağlantı reddedildi",
+    "Password is required": "Şifre gerekli",
+    "noVNC encountered an error:": "Bir hata oluştu:",
+    "Hide/Show the control bar": "Denetim masasını Gizle/Göster",
+    "Move/Drag Viewport": "Görünümü Taşı/Sürükle",
+    "viewport drag": "Görüntü penceresini sürükle",
+    "Active Mouse Button": "Aktif Fare Düğmesi",
+    "No mousebutton": "Fare düğmesi yok",
+    "Left mousebutton": "Farenin sol düğmesi",
+    "Middle mousebutton": "Farenin orta düğmesi",
+    "Right mousebutton": "Farenin sağ düğmesi",
+    "Keyboard": "Klavye",
+    "Show Keyboard": "Klavye Düzenini Göster",
+    "Extra keys": "Ekstra tuşlar",
+    "Show Extra Keys": "Ekstra tuşları göster",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "Ctrl Değiştir ",
+    "Alt": "Alt",
+    "Toggle Alt": "Alt Değiştir",
+    "Send Tab": "Sekme Gönder",
+    "Tab": "Sekme",
+    "Esc": "Esc",
+    "Send Escape": "Boşluk Gönder",
+    "Ctrl+Alt+Del": "Ctrl + Alt + Del",
+    "Send Ctrl-Alt-Del": "Ctrl-Alt-Del Gönder",
+    "Shutdown/Reboot": "Kapat/Yeniden Başlat",
+    "Shutdown/Reboot...": "Kapat/Yeniden Başlat...",
+    "Power": "Güç",
+    "Shutdown": "Kapat",
+    "Reboot": "Yeniden Başlat",
+    "Reset": "Sıfırla",
+    "Clipboard": "Pano",
+    "Clear": "Temizle",
+    "Fullscreen": "Tam Ekran",
+    "Settings": "Ayarlar",
+    "Shared Mode": "Paylaşım Modu",
+    "View Only": "Sadece Görüntüle",
+    "Clip to Window": "Pencereye Tıkla",
+    "Scaling Mode:": "Ölçekleme Modu:",
+    "None": "Bilinmeyen",
+    "Local Scaling": "Yerel Ölçeklendirme",
+    "Remote Resizing": "Uzaktan Yeniden Boyutlandırma",
+    "Advanced": "Gelişmiş",
+    "Repeater ID:": "Tekralayıcı ID:",
+    "WebSocket": "WebSocket",
+    "Encrypt": "Şifrele",
+    "Host:": "Ana makine:",
+    "Port:": "Port:",
+    "Path:": "Yol:",
+    "Automatic Reconnect": "Otomatik Yeniden Bağlan",
+    "Reconnect Delay (ms):": "Yeniden Bağlanma Süreci (ms):",
+    "Logging:": "Giriş yapılıyor:",
+    "Disconnect": "Bağlantıyı Kes",
+    "Connect": "Bağlan",
+    "Password:": "Parola:",
+    "Cancel": "Vazgeç",
+    "Canvas not supported.": "Tuval desteklenmiyor."
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/zh_CN.json b/systemvm/agent/noVNC/app/locale/zh_CN.json
new file mode 100644
index 0000000..f0aea9a
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/zh_CN.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "连接中...",
+    "Disconnecting...": "正在断开连接...",
+    "Reconnecting...": "重新连接中...",
+    "Internal error": "内部错误",
+    "Must set host": "请提供主机名",
+    "Connected (encrypted) to ": "已连接到(加密)",
+    "Connected (unencrypted) to ": "已连接到(未加密)",
+    "Something went wrong, connection is closed": "发生错误,连接已关闭",
+    "Failed to connect to server": "无法连接到服务器",
+    "Disconnected": "已断开连接",
+    "New connection has been rejected with reason: ": "连接被拒绝,原因:",
+    "New connection has been rejected": "连接被拒绝",
+    "Password is required": "请提供密码",
+    "noVNC encountered an error:": "noVNC 遇到一个错误:",
+    "Hide/Show the control bar": "显示/隐藏控制栏",
+    "Move/Drag Viewport": "拖放显示范围",
+    "viewport drag": "显示范围拖放",
+    "Active Mouse Button": "启动鼠标按鍵",
+    "No mousebutton": "禁用鼠标按鍵",
+    "Left mousebutton": "鼠标左鍵",
+    "Middle mousebutton": "鼠标中鍵",
+    "Right mousebutton": "鼠标右鍵",
+    "Keyboard": "键盘",
+    "Show Keyboard": "显示键盘",
+    "Extra keys": "额外按键",
+    "Show Extra Keys": "显示额外按键",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "切换 Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "切换 Alt",
+    "Send Tab": "发送 Tab 键",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "发送 Escape 键",
+    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
+    "Send Ctrl-Alt-Del": "发送 Ctrl-Alt-Del 键",
+    "Shutdown/Reboot": "关机/重新启动",
+    "Shutdown/Reboot...": "关机/重新启动...",
+    "Power": "电源",
+    "Shutdown": "关机",
+    "Reboot": "重新启动",
+    "Reset": "重置",
+    "Clipboard": "剪贴板",
+    "Clear": "清除",
+    "Fullscreen": "全屏",
+    "Settings": "设置",
+    "Shared Mode": "分享模式",
+    "View Only": "仅查看",
+    "Clip to Window": "限制/裁切窗口大小",
+    "Scaling Mode:": "缩放模式:",
+    "None": "无",
+    "Local Scaling": "本地缩放",
+    "Remote Resizing": "远程调整大小",
+    "Advanced": "高级",
+    "Repeater ID:": "中继站 ID",
+    "WebSocket": "WebSocket",
+    "Encrypt": "加密",
+    "Host:": "主机:",
+    "Port:": "端口:",
+    "Path:": "路径:",
+    "Automatic Reconnect": "自动重新连接",
+    "Reconnect Delay (ms):": "重新连接间隔 (ms):",
+    "Logging:": "日志级别:",
+    "Disconnect": "中断连接",
+    "Connect": "连接",
+    "Password:": "密码:",
+    "Cancel": "取消"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/locale/zh_TW.json b/systemvm/agent/noVNC/app/locale/zh_TW.json
new file mode 100644
index 0000000..8ddf813
--- /dev/null
+++ b/systemvm/agent/noVNC/app/locale/zh_TW.json
@@ -0,0 +1,69 @@
+{
+    "Connecting...": "連線中...",
+    "Disconnecting...": "正在中斷連線...",
+    "Reconnecting...": "重新連線中...",
+    "Internal error": "內部錯誤",
+    "Must set host": "請提供主機資訊",
+    "Connected (encrypted) to ": "已加密連線到",
+    "Connected (unencrypted) to ": "未加密連線到",
+    "Something went wrong, connection is closed": "發生錯誤,連線已關閉",
+    "Failed to connect to server": "無法連線到伺服器",
+    "Disconnected": "連線已中斷",
+    "New connection has been rejected with reason: ": "連線被拒絕,原因:",
+    "New connection has been rejected": "連線被拒絕",
+    "Password is required": "請提供密碼",
+    "noVNC encountered an error:": "noVNC 遇到一個錯誤:",
+    "Hide/Show the control bar": "顯示/隱藏控制列",
+    "Move/Drag Viewport": "拖放顯示範圍",
+    "viewport drag": "顯示範圍拖放",
+    "Active Mouse Button": "啟用滑鼠按鍵",
+    "No mousebutton": "無滑鼠按鍵",
+    "Left mousebutton": "滑鼠左鍵",
+    "Middle mousebutton": "滑鼠中鍵",
+    "Right mousebutton": "滑鼠右鍵",
+    "Keyboard": "鍵盤",
+    "Show Keyboard": "顯示鍵盤",
+    "Extra keys": "額外按鍵",
+    "Show Extra Keys": "顯示額外按鍵",
+    "Ctrl": "Ctrl",
+    "Toggle Ctrl": "切換 Ctrl",
+    "Alt": "Alt",
+    "Toggle Alt": "切換 Alt",
+    "Send Tab": "送出 Tab 鍵",
+    "Tab": "Tab",
+    "Esc": "Esc",
+    "Send Escape": "送出 Escape 鍵",
+    "Ctrl+Alt+Del": "Ctrl-Alt-Del",
+    "Send Ctrl-Alt-Del": "送出 Ctrl-Alt-Del 快捷鍵",
+    "Shutdown/Reboot": "關機/重新啟動",
+    "Shutdown/Reboot...": "關機/重新啟動...",
+    "Power": "電源",
+    "Shutdown": "關機",
+    "Reboot": "重新啟動",
+    "Reset": "重設",
+    "Clipboard": "剪貼簿",
+    "Clear": "清除",
+    "Fullscreen": "全螢幕",
+    "Settings": "設定",
+    "Shared Mode": "分享模式",
+    "View Only": "僅檢視",
+    "Clip to Window": "限制/裁切視窗大小",
+    "Scaling Mode:": "縮放模式:",
+    "None": "無",
+    "Local Scaling": "本機縮放",
+    "Remote Resizing": "遠端調整大小",
+    "Advanced": "進階",
+    "Repeater ID:": "中繼站 ID",
+    "WebSocket": "WebSocket",
+    "Encrypt": "加密",
+    "Host:": "主機:",
+    "Port:": "連接埠:",
+    "Path:": "路徑:",
+    "Automatic Reconnect": "自動重新連線",
+    "Reconnect Delay (ms):": "重新連線間隔 (ms):",
+    "Logging:": "日誌級別:",
+    "Disconnect": "中斷連線",
+    "Connect": "連線",
+    "Password:": "密碼:",
+    "Cancel": "取消"
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/app/localization.js b/systemvm/agent/noVNC/app/localization.js
new file mode 100644
index 0000000..100901c
--- /dev/null
+++ b/systemvm/agent/noVNC/app/localization.js
@@ -0,0 +1,172 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2018 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+/*
+ * Localization Utilities
+ */
+
+export class Localizer {
+    constructor() {
+        // Currently configured language
+        this.language = 'en';
+
+        // Current dictionary of translations
+        this.dictionary = undefined;
+    }
+
+    // Configure suitable language based on user preferences
+    setup(supportedLanguages) {
+        this.language = 'en'; // Default: US English
+
+        /*
+         * Navigator.languages only available in Chrome (32+) and FireFox (32+)
+         * Fall back to navigator.language for other browsers
+         */
+        let userLanguages;
+        if (typeof window.navigator.languages == 'object') {
+            userLanguages = window.navigator.languages;
+        } else {
+            userLanguages = [navigator.language || navigator.userLanguage];
+        }
+
+        for (let i = 0;i < userLanguages.length;i++) {
+            const userLang = userLanguages[i]
+                .toLowerCase()
+                .replace("_", "-")
+                .split("-");
+
+            // Built-in default?
+            if ((userLang[0] === 'en') &&
+                ((userLang[1] === undefined) || (userLang[1] === 'us'))) {
+                return;
+            }
+
+            // First pass: perfect match
+            for (let j = 0; j < supportedLanguages.length; j++) {
+                const supLang = supportedLanguages[j]
+                    .toLowerCase()
+                    .replace("_", "-")
+                    .split("-");
+
+                if (userLang[0] !== supLang[0]) {
+                    continue;
+                }
+                if (userLang[1] !== supLang[1]) {
+                    continue;
+                }
+
+                this.language = supportedLanguages[j];
+                return;
+            }
+
+            // Second pass: fallback
+            for (let j = 0;j < supportedLanguages.length;j++) {
+                const supLang = supportedLanguages[j]
+                    .toLowerCase()
+                    .replace("_", "-")
+                    .split("-");
+
+                if (userLang[0] !== supLang[0]) {
+                    continue;
+                }
+                if (supLang[1] !== undefined) {
+                    continue;
+                }
+
+                this.language = supportedLanguages[j];
+                return;
+            }
+        }
+    }
+
+    // Retrieve localised text
+    get(id) {
+        if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) {
+            return this.dictionary[id];
+        } else {
+            return id;
+        }
+    }
+
+    // Traverses the DOM and translates relevant fields
+    // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate
+    translateDOM() {
+        const self = this;
+
+        function process(elem, enabled) {
+            function isAnyOf(searchElement, items) {
+                return items.indexOf(searchElement) !== -1;
+            }
+
+            function translateAttribute(elem, attr) {
+                const str = self.get(elem.getAttribute(attr));
+                elem.setAttribute(attr, str);
+            }
+
+            function translateTextNode(node) {
+                const str = self.get(node.data.trim());
+                node.data = str;
+            }
+
+            if (elem.hasAttribute("translate")) {
+                if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) {
+                    enabled = true;
+                } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) {
+                    enabled = false;
+                }
+            }
+
+            if (enabled) {
+                if (elem.hasAttribute("abbr") &&
+                    elem.tagName === "TH") {
+                    translateAttribute(elem, "abbr");
+                }
+                if (elem.hasAttribute("alt") &&
+                    isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) {
+                    translateAttribute(elem, "alt");
+                }
+                if (elem.hasAttribute("download") &&
+                    isAnyOf(elem.tagName, ["A", "AREA"])) {
+                    translateAttribute(elem, "download");
+                }
+                if (elem.hasAttribute("label") &&
+                    isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP",
+                                           "OPTION", "TRACK"])) {
+                    translateAttribute(elem, "label");
+                }
+                // FIXME: Should update "lang"
+                if (elem.hasAttribute("placeholder") &&
+                    isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) {
+                    translateAttribute(elem, "placeholder");
+                }
+                if (elem.hasAttribute("title")) {
+                    translateAttribute(elem, "title");
+                }
+                if (elem.hasAttribute("value") &&
+                    elem.tagName === "INPUT" &&
+                    isAnyOf(elem.getAttribute("type"), ["reset", "button", "submit"])) {
+                    translateAttribute(elem, "value");
+                }
+            }
+
+            for (let i = 0; i < elem.childNodes.length; i++) {
+                const node = elem.childNodes[i];
+                if (node.nodeType === node.ELEMENT_NODE) {
+                    process(node, enabled);
+                } else if (node.nodeType === node.TEXT_NODE && enabled) {
+                    translateTextNode(node);
+                }
+            }
+        }
+
+        process(document.body, true);
+    }
+}
+
+export const l10n = new Localizer();
+export default l10n.get.bind(l10n);
diff --git a/systemvm/agent/noVNC/app/sounds/CREDITS b/systemvm/agent/noVNC/app/sounds/CREDITS
new file mode 100644
index 0000000..ec1fb55
--- /dev/null
+++ b/systemvm/agent/noVNC/app/sounds/CREDITS
@@ -0,0 +1,4 @@
+bell
+        Copyright: Dr. Richard Boulanger et al
+        URL: http://www.archive.org/details/Berklee44v12
+        License: CC-BY Attribution 3.0 Unported
diff --git a/systemvm/agent/noVNC/app/sounds/bell.mp3 b/systemvm/agent/noVNC/app/sounds/bell.mp3
new file mode 100644
index 0000000..fdbf149
--- /dev/null
+++ b/systemvm/agent/noVNC/app/sounds/bell.mp3
Binary files differ
diff --git a/systemvm/agent/noVNC/app/sounds/bell.oga b/systemvm/agent/noVNC/app/sounds/bell.oga
new file mode 100644
index 0000000..144d2b3
--- /dev/null
+++ b/systemvm/agent/noVNC/app/sounds/bell.oga
Binary files differ
diff --git a/systemvm/agent/noVNC/app/styles/Orbitron700.ttf b/systemvm/agent/noVNC/app/styles/Orbitron700.ttf
new file mode 100644
index 0000000..e28729d
--- /dev/null
+++ b/systemvm/agent/noVNC/app/styles/Orbitron700.ttf
Binary files differ
diff --git a/systemvm/agent/noVNC/app/styles/Orbitron700.woff b/systemvm/agent/noVNC/app/styles/Orbitron700.woff
new file mode 100644
index 0000000..61db630
--- /dev/null
+++ b/systemvm/agent/noVNC/app/styles/Orbitron700.woff
Binary files differ
diff --git a/systemvm/agent/noVNC/app/styles/base.css b/systemvm/agent/noVNC/app/styles/base.css
new file mode 100644
index 0000000..fd78b79
--- /dev/null
+++ b/systemvm/agent/noVNC/app/styles/base.css
@@ -0,0 +1,970 @@
+/*
+ * noVNC base CSS
+ * Copyright (C) 2019 The noVNC Authors
+ * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
+ * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
+ */
+
+/*
+ * Z index layers:
+ *
+ * 0: Main screen
+ * 10: Control bar
+ * 50: Transition blocker
+ * 60: Connection popups
+ * 100: Status bar
+ * ...
+ * 1000: Javascript crash
+ * ...
+ * 10000: Max (used for polyfills)
+ */
+
+body {
+  margin:0;
+  padding:0;
+  font-family: Helvetica;
+  /*Background image with light grey curve.*/
+  background-color:#494949;
+  background-repeat:no-repeat;
+  background-position:right bottom;
+  height:100%;
+  touch-action: none;
+}
+
+html {
+  height:100%;
+}
+
+.noVNC_only_touch.noVNC_hidden {
+  display: none;
+}
+
+.noVNC_disabled {
+  color: rgb(128, 128, 128);
+}
+
+/* ----------------------------------------
+ * Spinner
+ * ----------------------------------------
+ */
+
+.noVNC_spinner {
+  position: relative;
+}
+.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
+  width: 10px;
+  height: 10px;
+  border-radius: 2px;
+  box-shadow: -60px 10px 0 rgba(255, 255, 255, 0);
+  animation: noVNC_spinner 1.0s linear infinite;
+}
+.noVNC_spinner::before {
+  content: "";
+  position: absolute;
+  left: 0px;
+  top: 0px;
+  animation-delay: -0.1s;
+}
+.noVNC_spinner::after {
+  content: "";
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  animation-delay: 0.1s;
+}
+@keyframes noVNC_spinner {
+  0% { box-shadow: -60px 10px 0 rgba(255, 255, 255, 0); width: 20px; }
+  25% { box-shadow: 20px 10px 0 rgba(255, 255, 255, 1); width: 10px; }
+  50% { box-shadow: 60px 10px 0 rgba(255, 255, 255, 0); width: 10px; }
+}
+
+/* ----------------------------------------
+ * Input Elements
+ * ----------------------------------------
+ */
+
+input:not([type]),
+input[type=date],
+input[type=datetime-local],
+input[type=email],
+input[type=month],
+input[type=number],
+input[type=password],
+input[type=search],
+input[type=tel],
+input[type=text],
+input[type=time],
+input[type=url],
+input[type=week],
+textarea {
+  /* Disable default rendering */
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+
+  margin: 2px;
+  padding: 2px;
+  border: 1px solid rgb(192, 192, 192);
+  border-radius: 5px;
+  color: black;
+  background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240));
+}
+
+input[type=button],
+input[type=color],
+input[type=reset],
+input[type=submit],
+select {
+  /* Disable default rendering */
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  background: none;
+
+  margin: 2px;
+  padding: 2px;
+  border: 1px solid rgb(192, 192, 192);
+  border-bottom-width: 2px;
+  border-radius: 5px;
+  color: black;
+  background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240));
+
+  /* This avoids it jumping around when :active */
+  vertical-align: middle;
+}
+
+input[type=button],
+input[type=color],
+input[type=reset],
+input[type=submit] {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+
+option {
+  color: black;
+  background: white;
+}
+
+input:not([type]):focus,
+input[type=button]:focus,
+input[type=color]:focus,
+input[type=date]:focus,
+input[type=datetime-local]:focus,
+input[type=email]:focus,
+input[type=month]:focus,
+input[type=number]:focus,
+input[type=password]:focus,
+input[type=reset]:focus,
+input[type=search]:focus,
+input[type=submit]:focus,
+input[type=tel]:focus,
+input[type=text]:focus,
+input[type=time]:focus,
+input[type=url]:focus,
+input[type=week]:focus,
+select:focus,
+textarea:focus {
+  box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5);
+  border-color: rgb(74, 144, 217);
+  outline: none;
+}
+
+input[type=button]::-moz-focus-inner,
+input[type=color]::-moz-focus-inner,
+input[type=reset]::-moz-focus-inner,
+input[type=submit]::-moz-focus-inner {
+  border: none;
+}
+
+input:not([type]):disabled,
+input[type=button]:disabled,
+input[type=color]:disabled,
+input[type=date]:disabled,
+input[type=datetime-local]:disabled,
+input[type=email]:disabled,
+input[type=month]:disabled,
+input[type=number]:disabled,
+input[type=password]:disabled,
+input[type=reset]:disabled,
+input[type=search]:disabled,
+input[type=submit]:disabled,
+input[type=tel]:disabled,
+input[type=text]:disabled,
+input[type=time]:disabled,
+input[type=url]:disabled,
+input[type=week]:disabled,
+select:disabled,
+textarea:disabled {
+  color: rgb(128, 128, 128);
+  background: rgb(240, 240, 240);
+}
+
+input[type=button]:active,
+input[type=color]:active,
+input[type=reset]:active,
+input[type=submit]:active,
+select:active {
+  border-bottom-width: 1px;
+  margin-top: 3px;
+}
+
+:root:not(.noVNC_touch) input[type=button]:hover:not(:disabled),
+:root:not(.noVNC_touch) input[type=color]:hover:not(:disabled),
+:root:not(.noVNC_touch) input[type=reset]:hover:not(:disabled),
+:root:not(.noVNC_touch) input[type=submit]:hover:not(:disabled),
+:root:not(.noVNC_touch) select:hover:not(:disabled) {
+  background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250));
+}
+
+/* ----------------------------------------
+ * WebKit centering hacks
+ * ----------------------------------------
+ */
+
+.noVNC_center {
+  /*
+   * This is a workaround because webkit misrenders transforms and
+   * uses non-integer coordinates, resulting in blurry content.
+   * Ideally we'd use "top: 50%; transform: translateY(-50%);" on
+   * the objects instead.
+   */
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+}
+.noVNC_center > * {
+  pointer-events: auto;
+}
+.noVNC_vcenter {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  position: fixed;
+  top: 0;
+  left: 0;
+  height: 100%;
+  pointer-events: none;
+}
+.noVNC_vcenter > * {
+  pointer-events: auto;
+}
+
+/* ----------------------------------------
+ * Layering
+ * ----------------------------------------
+ */
+
+.noVNC_connect_layer {
+  z-index: 60;
+}
+
+/* ----------------------------------------
+ * Fallback error
+ * ----------------------------------------
+ */
+
+#noVNC_fallback_error {
+  z-index: 1000;
+  visibility: hidden;
+}
+#noVNC_fallback_error.noVNC_open {
+  visibility: visible;
+}
+
+#noVNC_fallback_error > div {
+  max-width: 90%;
+  padding: 15px;
+
+  transition: 0.5s ease-in-out;
+
+  transform: translateY(-50px);
+  opacity: 0;
+
+  text-align: center;
+  font-weight: bold;
+  color: #fff;
+
+  border-radius: 10px;
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+  background: rgba(200,55,55,0.8);
+}
+#noVNC_fallback_error.noVNC_open > div {
+  transform: translateY(0);
+  opacity: 1;
+}
+
+#noVNC_fallback_errormsg {
+  font-weight: normal;
+}
+
+#noVNC_fallback_errormsg .noVNC_message {
+  display: inline-block;
+  text-align: left;
+  font-family: monospace;
+  white-space: pre-wrap;
+}
+
+#noVNC_fallback_error .noVNC_location {
+  font-style: italic;
+  font-size: 0.8em;
+  color: rgba(255, 255, 255, 0.8);
+}
+
+#noVNC_fallback_error .noVNC_stack {
+  max-height: 50vh;
+  padding: 10px;
+  margin: 10px;
+  font-size: 0.8em;
+  text-align: left;
+  font-family: monospace;
+  white-space: pre;
+  border: 1px solid rgba(0, 0, 0, 0.5);
+  background: rgba(0, 0, 0, 0.2);
+  overflow: auto;
+}
+
+/* ----------------------------------------
+ * Control Bar
+ * ----------------------------------------
+ */
+
+#noVNC_control_bar_anchor {
+  /* The anchor is needed to get z-stacking to work */
+  position: fixed;
+  z-index: 10;
+
+  transition: 0.5s ease-in-out;
+
+  /* Edge misrenders animations wihthout this */
+  transform: translateX(0);
+}
+:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
+  opacity: 0.8;
+}
+#noVNC_control_bar_anchor.noVNC_right {
+  left: auto;
+  right: 0;
+}
+
+#noVNC_control_bar {
+  position: relative;
+  left: -100%;
+
+  transition: 0.5s ease-in-out;
+
+  background-color: rgb(110, 132, 163);
+  border-radius: 0 10px 10px 0;
+
+}
+#noVNC_control_bar.noVNC_open {
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+  left: 0;
+}
+#noVNC_control_bar::before {
+  /* This extra element is to get a proper shadow */
+  content: "";
+  position: absolute;
+  z-index: -1;
+  height: 100%;
+  width: 30px;
+  left: -30px;
+  transition: box-shadow 0.5s ease-in-out;
+}
+#noVNC_control_bar.noVNC_open::before {
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+.noVNC_right #noVNC_control_bar {
+  left: 100%;
+  border-radius: 10px 0 0 10px;
+}
+.noVNC_right #noVNC_control_bar.noVNC_open {
+  left: 0;
+}
+.noVNC_right #noVNC_control_bar::before {
+  visibility: hidden;
+}
+
+#noVNC_control_bar_handle {
+  position: absolute;
+  left: -15px;
+  top: 0;
+  transform: translateY(35px);
+  width: calc(100% + 30px);
+  height: 50px;
+  z-index: -1;
+  cursor: pointer;
+  border-radius: 5px;
+  background-color: rgb(83, 99, 122);
+  background-image: url("../images/handle_bg.svg");
+  background-repeat: no-repeat;
+  background-position: right;
+  box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
+}
+#noVNC_control_bar_handle:after {
+  content: "";
+  transition: transform 0.5s ease-in-out;
+  background: url("../images/handle.svg");
+  position: absolute;
+  top: 22px; /* (50px-6px)/2 */
+  right: 5px;
+  width: 5px;
+  height: 6px;
+}
+#noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
+  transform: translateX(1px) rotate(180deg);
+}
+:root:not(.noVNC_connected) #noVNC_control_bar_handle {
+  display: none;
+}
+.noVNC_right #noVNC_control_bar_handle {
+  background-position: left;
+}
+.noVNC_right #noVNC_control_bar_handle:after {
+  left: 5px;
+  right: 0;
+  transform: translateX(1px) rotate(180deg);
+}
+.noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
+  transform: none;
+}
+#noVNC_control_bar_handle div {
+  position: absolute;
+  right: -35px;
+  top: 0;
+  width: 50px;
+  height: 50px;
+}
+:root:not(.noVNC_touch) #noVNC_control_bar_handle div {
+  display: none;
+}
+.noVNC_right #noVNC_control_bar_handle div {
+  left: -35px;
+  right: auto;
+}
+
+#noVNC_control_bar .noVNC_scroll {
+  max-height: 100vh; /* Chrome is buggy with 100% */
+  overflow-x: hidden;
+  overflow-y: auto;
+  padding: 0 10px 0 5px;
+}
+.noVNC_right #noVNC_control_bar .noVNC_scroll {
+  padding: 0 5px 0 10px;
+}
+
+/* Control bar hint */
+#noVNC_control_bar_hint {
+  position: fixed;
+  left: calc(100vw - 50px);
+  right: auto;
+  top: 50%;
+  transform: translateY(-50%) scale(0);
+  width: 100px;
+  height: 50%;
+  max-height: 600px;
+
+  visibility: hidden;
+  opacity: 0;
+  transition: 0.2s ease-in-out;
+  background: transparent;
+  box-shadow: 0 0 10px black, inset 0 0 10px 10px rgba(110, 132, 163, 0.8);
+  border-radius: 10px;
+  transition-delay: 0s;
+}
+#noVNC_control_bar_anchor.noVNC_right #noVNC_control_bar_hint{
+  left: auto;
+  right: calc(100vw - 50px);
+}
+#noVNC_control_bar_hint.noVNC_active {
+  visibility: visible;
+  opacity: 1;
+  transition-delay: 0.2s;
+  transform: translateY(-50%) scale(1);
+}
+
+/* General button style */
+.noVNC_button {
+  display: block;
+  padding: 4px 4px;
+  margin: 10px 0;
+  vertical-align: middle;
+  border:1px solid rgba(255, 255, 255, 0.2);
+  border-radius: 6px;
+}
+.noVNC_button.noVNC_selected {
+  border-color: rgba(0, 0, 0, 0.8);
+  background: rgba(0, 0, 0, 0.5);
+}
+.noVNC_button:disabled {
+  opacity: 0.4;
+}
+.noVNC_button:focus {
+  outline: none;
+}
+.noVNC_button:active {
+  padding-top: 5px;
+  padding-bottom: 3px;
+}
+/* Android browsers don't properly update hover state if touch events
+ * are intercepted, but focus should be safe to display */
+:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover,
+.noVNC_button.noVNC_selected:focus {
+  border-color: rgba(0, 0, 0, 0.4);
+  background: rgba(0, 0, 0, 0.2);
+}
+:root:not(.noVNC_touch) .noVNC_button:hover,
+.noVNC_button:focus {
+  background: rgba(255, 255, 255, 0.2);
+}
+.noVNC_button.noVNC_hidden {
+  display: none;
+}
+
+/* Panels */
+.noVNC_panel {
+  transform: translateX(25px);
+
+  transition: 0.5s ease-in-out;
+
+  max-height: 100vh; /* Chrome is buggy with 100% */
+  overflow-x: hidden;
+  overflow-y: auto;
+
+  visibility: hidden;
+  opacity: 0;
+
+  padding: 15px;
+
+  background: #fff;
+  border-radius: 10px;
+  color: #000;
+  border: 2px solid #E0E0E0;
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+.noVNC_panel.noVNC_open {
+  visibility: visible;
+  opacity: 1;
+  transform: translateX(75px);
+}
+.noVNC_right .noVNC_vcenter {
+  left: auto;
+  right: 0;
+}
+.noVNC_right .noVNC_panel {
+  transform: translateX(-25px);
+}
+.noVNC_right .noVNC_panel.noVNC_open {
+  transform: translateX(-75px);
+}
+
+.noVNC_panel hr {
+  border: none;
+  border-top: 1px solid rgb(192, 192, 192);
+}
+
+.noVNC_panel label {
+  display: block;
+  white-space: nowrap;
+}
+
+.noVNC_panel .noVNC_heading {
+  background-color: rgb(110, 132, 163);
+  border-radius: 5px;
+  padding: 5px;
+  /* Compensate for padding in image */
+  padding-right: 8px;
+  color: white;
+  font-size: 20px;
+  margin-bottom: 10px;
+  white-space: nowrap;
+}
+.noVNC_panel .noVNC_heading img {
+  vertical-align: bottom;
+}
+
+.noVNC_submit {
+  float: right;
+}
+
+/* Expanders */
+.noVNC_expander {
+  cursor: pointer;
+}
+.noVNC_expander::before {
+  content: url("../images/expander.svg");
+  display: inline-block;
+  margin-right: 5px;
+  transition: 0.2s ease-in-out;
+}
+.noVNC_expander.noVNC_open::before {
+  transform: rotateZ(90deg);
+}
+.noVNC_expander ~ * {
+  margin: 5px;
+  margin-left: 10px;
+  padding: 5px;
+  background: rgba(0, 0, 0, 0.05);
+  border-radius: 5px;
+}
+.noVNC_expander:not(.noVNC_open) ~ * {
+  display: none;
+}
+
+/* Control bar content */
+
+#noVNC_control_bar .noVNC_logo {
+  font-size: 13px;
+}
+
+:root:not(.noVNC_connected) #noVNC_view_drag_button {
+  display: none;
+}
+
+/* noVNC Touch Device only buttons */
+:root:not(.noVNC_connected) #noVNC_mobile_buttons {
+  display: none;
+}
+:root:not(.noVNC_touch) #noVNC_mobile_buttons {
+  display: none;
+}
+
+/* Extra manual keys */
+:root:not(.noVNC_connected) #noVNC_toggle_extra_keys_button {
+  display: none;
+}
+
+#noVNC_modifiers {
+  background-color: rgb(92, 92, 92);
+  border: none;
+  padding: 0 10px;
+}
+
+/* Shutdown/Reboot */
+:root:not(.noVNC_connected) #noVNC_power_button {
+  display: none;
+}
+#noVNC_power {
+}
+#noVNC_power_buttons {
+  display: none;
+}
+
+#noVNC_power input[type=button] {
+  width: 100%;
+}
+
+/* Clipboard */
+:root:not(.noVNC_connected) #noVNC_clipboard_button {
+  display: none;
+}
+#noVNC_clipboard {
+  /* Full screen, minus padding and left and right margins */
+  max-width: calc(100vw - 2*15px - 75px - 25px);
+}
+#noVNC_clipboard_text {
+  width: 500px;
+  max-width: 100%;
+}
+
+/* Settings */
+#noVNC_settings {
+}
+#noVNC_settings ul {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+}
+#noVNC_setting_port {
+  width: 80px;
+}
+#noVNC_setting_path {
+  width: 100px;
+}
+
+/* Version */
+
+.noVNC_version_wrapper {
+  font-size: small;
+}
+
+.noVNC_version {
+  margin-left: 1rem;
+}
+
+/* Connection Controls */
+:root:not(.noVNC_connected) #noVNC_disconnect_button {
+  display: none;
+}
+
+/* ----------------------------------------
+ * Status Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_status {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  z-index: 100;
+  transform: translateY(-100%);
+
+  cursor: pointer;
+
+  transition: 0.5s ease-in-out;
+
+  visibility: hidden;
+  opacity: 0;
+
+  padding: 5px;
+
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-content: center;
+
+  line-height: 25px;
+  word-wrap: break-word;
+  color: #fff;
+
+  border-bottom: 1px solid rgba(0, 0, 0, 0.9);
+}
+#noVNC_status.noVNC_open {
+  transform: translateY(0);
+  visibility: visible;
+  opacity: 1;
+}
+
+#noVNC_status::before {
+  content: "";
+  display: inline-block;
+  width: 25px;
+  height: 25px;
+  margin-right: 5px;
+}
+
+#noVNC_status.noVNC_status_normal {
+  background: rgba(128,128,128,0.9);
+}
+#noVNC_status.noVNC_status_normal::before {
+  content: url("../images/info.svg") " ";
+}
+#noVNC_status.noVNC_status_error {
+  background: rgba(200,55,55,0.9);
+}
+#noVNC_status.noVNC_status_error::before {
+  content: url("../images/error.svg") " ";
+}
+#noVNC_status.noVNC_status_warn {
+  background: rgba(180,180,30,0.9);
+}
+#noVNC_status.noVNC_status_warn::before {
+  content: url("../images/warning.svg") " ";
+}
+
+/* ----------------------------------------
+ * Connect Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_connect_dlg {
+  transition: 0.5s ease-in-out;
+
+  transform: scale(0, 0);
+  visibility: hidden;
+  opacity: 0;
+}
+#noVNC_connect_dlg.noVNC_open {
+  transform: scale(1, 1);
+  visibility: visible;
+  opacity: 1;
+}
+#noVNC_connect_dlg .noVNC_logo {
+  transition: 0.5s ease-in-out;
+  padding: 10px;
+  margin-bottom: 10px;
+
+  font-size: 80px;
+  text-align: center;
+
+  border-radius: 5px;
+}
+@media (max-width: 440px) {
+  #noVNC_connect_dlg {
+    max-width: calc(100vw - 100px);
+  }
+  #noVNC_connect_dlg .noVNC_logo {
+    font-size: calc(25vw - 30px);
+  }
+}
+#noVNC_connect_button {
+  cursor: pointer;
+
+  padding: 10px;
+
+  color: white;
+  background-color: rgb(110, 132, 163);
+  border-radius: 12px;
+
+  text-align: center;
+  font-size: 20px;
+
+  box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
+}
+#noVNC_connect_button div {
+  margin: 2px;
+  padding: 5px 30px;
+  border: 1px solid rgb(83, 99, 122);
+  border-bottom-width: 2px;
+  border-radius: 5px;
+  background: linear-gradient(to top, rgb(110, 132, 163), rgb(99, 119, 147));
+
+  /* This avoids it jumping around when :active */
+  vertical-align: middle;
+}
+#noVNC_connect_button div:active {
+  border-bottom-width: 1px;
+  margin-top: 3px;
+}
+:root:not(.noVNC_touch) #noVNC_connect_button div:hover {
+  background: linear-gradient(to top, rgb(110, 132, 163), rgb(105, 125, 155));
+}
+
+#noVNC_connect_button img {
+  vertical-align: bottom;
+  height: 1.3em;
+}
+
+/* ----------------------------------------
+ * Password Dialog
+ * ----------------------------------------
+ */
+
+#noVNC_credentials_dlg {
+  position: relative;
+
+  transform: translateY(-50px);
+}
+#noVNC_credentials_dlg.noVNC_open {
+  transform: translateY(0);
+}
+#noVNC_credentials_dlg ul {
+  list-style: none;
+  margin: 0px;
+  padding: 0px;
+}
+.noVNC_hidden {
+  display: none;
+}
+
+
+/* ----------------------------------------
+ * Main Area
+ * ----------------------------------------
+ */
+
+/* Transition screen */
+#noVNC_transition {
+  display: none;
+
+  position: fixed;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+
+  color: white;
+  background: rgba(0, 0, 0, 0.5);
+  z-index: 50;
+
+  /*display: flex;*/
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+}
+:root.noVNC_loading #noVNC_transition,
+:root.noVNC_connecting #noVNC_transition,
+:root.noVNC_disconnecting #noVNC_transition,
+:root.noVNC_reconnecting #noVNC_transition {
+  display: flex;
+}
+:root:not(.noVNC_reconnecting) #noVNC_cancel_reconnect_button {
+  display: none;
+}
+#noVNC_transition_text {
+  font-size: 1.5em;
+}
+
+/* Main container */
+#noVNC_container {
+  width: 100%;
+  height: 100%;
+  background-color: #313131;
+  border-bottom-right-radius: 800px 600px;
+  /*border-top-left-radius: 800px 600px;*/
+}
+
+#noVNC_keyboardinput {
+  width: 1px;
+  height: 1px;
+  background-color: #fff;
+  color: #fff;
+  border: 0;
+  position: absolute;
+  left: -40px;
+  z-index: -1;
+  ime-mode: disabled;
+}
+
+/*Default noVNC logo.*/
+/* From: http://fonts.googleapis.com/css?family=Orbitron:700 */
+@font-face {
+  font-family: 'Orbitron';
+  font-style: normal;
+  font-weight: 700;
+  src: local('?'), url('Orbitron700.woff') format('woff'),
+                   url('Orbitron700.ttf') format('truetype');
+}
+
+.noVNC_logo {
+  color:yellow;
+  font-family: 'Orbitron', 'OrbitronTTF', sans-serif;
+  line-height:90%;
+  text-shadow: 0.1em 0.1em 0 black;
+}
+.noVNC_logo span{
+  color:green;
+}
+
+#noVNC_bell {
+  display: none;
+}
+
+/* ----------------------------------------
+ * Media sizing
+ * ----------------------------------------
+ */
+
+@media screen and (max-width: 640px){
+  #noVNC_logo {
+    font-size: 150px;
+  }
+}
+
+@media screen and (min-width: 321px) and (max-width: 480px) {
+  #noVNC_logo {
+    font-size: 110px;
+  }
+}
+
+@media screen and (max-width: 320px) {
+  #noVNC_logo {
+    font-size: 90px;
+  }
+}
diff --git a/systemvm/agent/noVNC/app/ui.js b/systemvm/agent/noVNC/app/ui.js
new file mode 100644
index 0000000..9158c33
--- /dev/null
+++ b/systemvm/agent/noVNC/app/ui.js
@@ -0,0 +1,1693 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import * as Log from '../core/util/logging.js';
+import _, { l10n } from './localization.js';
+import { isTouchDevice, isSafari, hasScrollbarGutter, dragThreshold }
+    from '../core/util/browser.js';
+import { setCapture, getPointerEvent } from '../core/util/events.js';
+import KeyTable from "../core/input/keysym.js";
+import keysyms from "../core/input/keysymdef.js";
+import Keyboard from "../core/input/keyboard.js";
+import RFB from "../core/rfb.js";
+import * as WebUtil from "./webutil.js";
+
+const PAGE_TITLE = "noVNC";
+
+const UI = {
+
+    connected: false,
+    desktopName: "",
+
+    statusTimeout: null,
+    hideKeyboardTimeout: null,
+    idleControlbarTimeout: null,
+    closeControlbarTimeout: null,
+
+    controlbarGrabbed: false,
+    controlbarDrag: false,
+    controlbarMouseDownClientY: 0,
+    controlbarMouseDownOffsetY: 0,
+
+    lastKeyboardinput: null,
+    defaultKeyboardinputLen: 100,
+
+    inhibitReconnect: true,
+    reconnectCallback: null,
+    reconnectPassword: null,
+
+    fullScreen: false,
+
+    prime() {
+        return WebUtil.initSettings().then(() => {
+            if (document.readyState === "interactive" || document.readyState === "complete") {
+                return UI.start();
+            }
+
+            return new Promise((resolve, reject) => {
+                document.addEventListener('DOMContentLoaded', () => UI.start().then(resolve).catch(reject));
+            });
+        });
+    },
+
+    // Render default UI and initialize settings menu
+    start() {
+
+        UI.initSettings();
+
+        // Translate the DOM
+        l10n.translateDOM();
+
+        WebUtil.fetchJSON('./package.json')
+            .then((packageInfo) => {
+                Array.from(document.getElementsByClassName('noVNC_version')).forEach(el => el.innerText = packageInfo.version);
+            })
+            .catch((err) => {
+                Log.Error("Couldn't fetch package.json: " + err);
+                Array.from(document.getElementsByClassName('noVNC_version_wrapper'))
+                    .concat(Array.from(document.getElementsByClassName('noVNC_version_separator')))
+                    .forEach(el => el.style.display = 'none');
+            });
+
+        // Adapt the interface for touch screen devices
+        if (isTouchDevice) {
+            document.documentElement.classList.add("noVNC_touch");
+            // Remove the address bar
+            setTimeout(() => window.scrollTo(0, 1), 100);
+        }
+
+        // Restore control bar position
+        if (WebUtil.readSetting('controlbar_pos') === 'right') {
+            UI.toggleControlbarSide();
+        }
+
+        UI.initFullscreen();
+
+        // Setup event handlers
+        UI.addControlbarHandlers();
+        UI.addTouchSpecificHandlers();
+        UI.addExtraKeysHandlers();
+        UI.addMachineHandlers();
+        UI.addConnectionControlHandlers();
+        UI.addClipboardHandlers();
+        UI.addSettingsHandlers();
+        document.getElementById("noVNC_status")
+            .addEventListener('click', UI.hideStatus);
+
+        // Bootstrap fallback input handler
+        UI.keyboardinputReset();
+
+        UI.openControlbar();
+
+        UI.updateVisualState('init');
+
+        document.documentElement.classList.remove("noVNC_loading");
+
+        let autoconnect = WebUtil.getConfigVar('autoconnect', false);
+        if (autoconnect === 'true' || autoconnect == '1') {
+            autoconnect = true;
+            UI.connect();
+        } else {
+            autoconnect = false;
+            // Show the connect panel on first load unless autoconnecting
+            UI.openConnectPanel();
+        }
+
+        return Promise.resolve(UI.rfb);
+    },
+
+    initFullscreen() {
+        // Only show the button if fullscreen is properly supported
+        // * Safari doesn't support alphanumerical input while in fullscreen
+        if (!isSafari() &&
+            (document.documentElement.requestFullscreen ||
+             document.documentElement.mozRequestFullScreen ||
+             document.documentElement.webkitRequestFullscreen ||
+             document.body.msRequestFullscreen)) {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.remove("noVNC_hidden");
+            UI.addFullscreenHandlers();
+        }
+    },
+
+    initSettings() {
+        // Logging selection dropdown
+        const llevels = ['error', 'warn', 'info', 'debug'];
+        for (let i = 0; i < llevels.length; i += 1) {
+            UI.addOption(document.getElementById('noVNC_setting_logging'), llevels[i], llevels[i]);
+        }
+
+        // Settings with immediate effects
+        UI.initSetting('logging', 'warn');
+        UI.updateLogging();
+
+        // if port == 80 (or 443) then it won't be present and should be
+        // set manually
+        let port = window.location.port;
+        if (!port) {
+            if (window.location.protocol.substring(0, 5) == 'https') {
+                port = 443;
+            } else if (window.location.protocol.substring(0, 4) == 'http') {
+                port = 80;
+            }
+        }
+
+        /* Populate the controls if defaults are provided in the URL */
+        UI.initSetting('host', window.location.hostname);
+        UI.initSetting('port', port);
+        UI.initSetting('token', window.location.token);
+        UI.initSetting('encrypt', (window.location.protocol === "https:"));
+        UI.initSetting('view_clip', false);
+        UI.initSetting('resize', 'off');
+        UI.initSetting('quality', 6);
+        UI.initSetting('compression', 2);
+        UI.initSetting('shared', true);
+        UI.initSetting('view_only', false);
+        UI.initSetting('show_dot', false);
+        UI.initSetting('path', 'websockify');
+        UI.initSetting('repeaterID', '');
+        UI.initSetting('reconnect', false);
+        UI.initSetting('reconnect_delay', 5000);
+
+        UI.setupSettingLabels();
+    },
+    // Adds a link to the label elements on the corresponding input elements
+    setupSettingLabels() {
+        const labels = document.getElementsByTagName('LABEL');
+        for (let i = 0; i < labels.length; i++) {
+            const htmlFor = labels[i].htmlFor;
+            if (htmlFor != '') {
+                const elem = document.getElementById(htmlFor);
+                if (elem) elem.label = labels[i];
+            } else {
+                // If 'for' isn't set, use the first input element child
+                const children = labels[i].children;
+                for (let j = 0; j < children.length; j++) {
+                    if (children[j].form !== undefined) {
+                        children[j].label = labels[i];
+                        break;
+                    }
+                }
+            }
+        }
+    },
+
+/* ------^-------
+*     /INIT
+* ==============
+* EVENT HANDLERS
+* ------v------*/
+
+    addControlbarHandlers() {
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousemove', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mouseup', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousedown', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('keydown', UI.activateControlbar);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('mousedown', UI.keepControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('keydown', UI.keepControlbar);
+
+        document.getElementById("noVNC_view_drag_button")
+            .addEventListener('click', UI.toggleViewDrag);
+
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mousedown', UI.controlbarHandleMouseDown);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mouseup', UI.controlbarHandleMouseUp);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('mousemove', UI.dragControlbarHandle);
+        // resize events aren't available for elements
+        window.addEventListener('resize', UI.updateControlbarHandle);
+
+        const exps = document.getElementsByClassName("noVNC_expander");
+        for (let i = 0;i < exps.length;i++) {
+            exps[i].addEventListener('click', UI.toggleExpander);
+        }
+    },
+
+    addTouchSpecificHandlers() {
+        document.getElementById("noVNC_keyboard_button")
+            .addEventListener('click', UI.toggleVirtualKeyboard);
+
+        UI.touchKeyboard = new Keyboard(document.getElementById('noVNC_keyboardinput'));
+        UI.touchKeyboard.onkeyevent = UI.keyEvent;
+        UI.touchKeyboard.grab();
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('input', UI.keyInput);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('focus', UI.onfocusVirtualKeyboard);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('blur', UI.onblurVirtualKeyboard);
+        document.getElementById("noVNC_keyboardinput")
+            .addEventListener('submit', () => false);
+
+        document.documentElement
+            .addEventListener('mousedown', UI.keepVirtualKeyboard, true);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchstart', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchmove', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchend', UI.activateControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('input', UI.activateControlbar);
+
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('touchstart', UI.keepControlbar);
+        document.getElementById("noVNC_control_bar")
+            .addEventListener('input', UI.keepControlbar);
+
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchstart', UI.controlbarHandleMouseDown);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchend', UI.controlbarHandleMouseUp);
+        document.getElementById("noVNC_control_bar_handle")
+            .addEventListener('touchmove', UI.dragControlbarHandle);
+    },
+
+    addExtraKeysHandlers() {
+        document.getElementById("noVNC_toggle_extra_keys_button")
+            .addEventListener('click', UI.toggleExtraKeys);
+        document.getElementById("noVNC_toggle_ctrl_button")
+            .addEventListener('click', UI.toggleCtrl);
+        document.getElementById("noVNC_toggle_windows_button")
+            .addEventListener('click', UI.toggleWindows);
+        document.getElementById("noVNC_toggle_alt_button")
+            .addEventListener('click', UI.toggleAlt);
+        document.getElementById("noVNC_send_tab_button")
+            .addEventListener('click', UI.sendTab);
+        document.getElementById("noVNC_send_esc_button")
+            .addEventListener('click', UI.sendEsc);
+        document.getElementById("noVNC_send_ctrl_alt_del_button")
+            .addEventListener('click', UI.sendCtrlAltDel);
+    },
+
+    addMachineHandlers() {
+        document.getElementById("noVNC_shutdown_button")
+            .addEventListener('click', () => UI.rfb.machineShutdown());
+        document.getElementById("noVNC_reboot_button")
+            .addEventListener('click', () => UI.rfb.machineReboot());
+        document.getElementById("noVNC_reset_button")
+            .addEventListener('click', () => UI.rfb.machineReset());
+        document.getElementById("noVNC_power_button")
+            .addEventListener('click', UI.togglePowerPanel);
+    },
+
+    addConnectionControlHandlers() {
+        document.getElementById("noVNC_disconnect_button")
+            .addEventListener('click', UI.disconnect);
+        document.getElementById("noVNC_connect_button")
+            .addEventListener('click', UI.connect);
+        document.getElementById("noVNC_cancel_reconnect_button")
+            .addEventListener('click', UI.cancelReconnect);
+
+        document.getElementById("noVNC_credentials_button")
+            .addEventListener('click', UI.setCredentials);
+    },
+
+    addClipboardHandlers() {
+        document.getElementById("noVNC_clipboard_button")
+            .addEventListener('click', UI.toggleClipboardPanel);
+        document.getElementById("noVNC_clipboard_clear_button")
+            .addEventListener('click', UI.clipboardClear);
+        document.getElementById("noVNC_clipboard_send_button")
+            .addEventListener('click', UI.clipboardSend);
+    },
+
+    // Add a call to save settings when the element changes,
+    // unless the optional parameter changeFunc is used instead.
+    addSettingChangeHandler(name, changeFunc) {
+        const settingElem = document.getElementById("noVNC_setting_" + name);
+        if (changeFunc === undefined) {
+            changeFunc = () => UI.saveSetting(name);
+        }
+        settingElem.addEventListener('change', changeFunc);
+    },
+
+    addSettingsHandlers() {
+        document.getElementById("noVNC_settings_button")
+            .addEventListener('click', UI.toggleSettingsPanel);
+
+        UI.addSettingChangeHandler('encrypt');
+        UI.addSettingChangeHandler('resize');
+        UI.addSettingChangeHandler('resize', UI.applyResizeMode);
+        UI.addSettingChangeHandler('resize', UI.updateViewClip);
+        UI.addSettingChangeHandler('quality');
+        UI.addSettingChangeHandler('quality', UI.updateQuality);
+        UI.addSettingChangeHandler('compression');
+        UI.addSettingChangeHandler('compression', UI.updateCompression);
+        UI.addSettingChangeHandler('view_clip');
+        UI.addSettingChangeHandler('view_clip', UI.updateViewClip);
+        UI.addSettingChangeHandler('shared');
+        UI.addSettingChangeHandler('view_only');
+        UI.addSettingChangeHandler('view_only', UI.updateViewOnly);
+        UI.addSettingChangeHandler('show_dot');
+        UI.addSettingChangeHandler('show_dot', UI.updateShowDotCursor);
+        UI.addSettingChangeHandler('host');
+        UI.addSettingChangeHandler('port');
+        UI.addSettingChangeHandler('path');
+        UI.addSettingChangeHandler('repeaterID');
+        UI.addSettingChangeHandler('logging');
+        UI.addSettingChangeHandler('logging', UI.updateLogging);
+        UI.addSettingChangeHandler('reconnect');
+        UI.addSettingChangeHandler('reconnect_delay');
+    },
+
+    addFullscreenHandlers() {
+        document.getElementById("noVNC_fullscreen_button")
+            .addEventListener('click', UI.toggleFullscreen);
+
+        window.addEventListener('fullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('mozfullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('webkitfullscreenchange', UI.updateFullscreenButton);
+        window.addEventListener('msfullscreenchange', UI.updateFullscreenButton);
+    },
+
+/* ------^-------
+ * /EVENT HANDLERS
+ * ==============
+ *     VISUAL
+ * ------v------*/
+
+    // Disable/enable controls depending on connection state
+    updateVisualState(state) {
+
+        document.documentElement.classList.remove("noVNC_connecting");
+        document.documentElement.classList.remove("noVNC_connected");
+        document.documentElement.classList.remove("noVNC_disconnecting");
+        document.documentElement.classList.remove("noVNC_reconnecting");
+
+        const transitionElem = document.getElementById("noVNC_transition_text");
+        switch (state) {
+            case 'init':
+                break;
+            case 'connecting':
+                transitionElem.textContent = _("Connecting...");
+                document.documentElement.classList.add("noVNC_connecting");
+                break;
+            case 'connected':
+                document.documentElement.classList.add("noVNC_connected");
+                break;
+            case 'disconnecting':
+                transitionElem.textContent = _("Disconnecting...");
+                document.documentElement.classList.add("noVNC_disconnecting");
+                break;
+            case 'disconnected':
+                break;
+            case 'reconnecting':
+                transitionElem.textContent = _("Reconnecting...");
+                document.documentElement.classList.add("noVNC_reconnecting");
+                break;
+            default:
+                Log.Error("Invalid visual state: " + state);
+                UI.showStatus(_("Internal error"), 'error');
+                return;
+        }
+
+        if (UI.connected) {
+            UI.updateViewClip();
+
+            UI.disableSetting('encrypt');
+            UI.disableSetting('shared');
+            UI.disableSetting('host');
+            UI.disableSetting('port');
+            UI.disableSetting('path');
+            UI.disableSetting('repeaterID');
+
+            // Hide the controlbar after 2 seconds
+            UI.closeControlbarTimeout = setTimeout(UI.closeControlbar, 2000);
+        } else {
+            UI.enableSetting('encrypt');
+            UI.enableSetting('shared');
+            UI.enableSetting('host');
+            UI.enableSetting('port');
+            UI.enableSetting('path');
+            UI.enableSetting('repeaterID');
+            UI.updatePowerButton();
+            UI.keepControlbar();
+        }
+
+        // State change closes dialogs as they may not be relevant
+        // anymore
+        UI.closeAllPanels();
+        document.getElementById('noVNC_credentials_dlg')
+            .classList.remove('noVNC_open');
+    },
+
+    showStatus(text, statusType, time) {
+        const statusElem = document.getElementById('noVNC_status');
+
+        if (typeof statusType === 'undefined') {
+            statusType = 'normal';
+        }
+
+        // Don't overwrite more severe visible statuses and never
+        // errors. Only shows the first error.
+        if (statusElem.classList.contains("noVNC_open")) {
+            if (statusElem.classList.contains("noVNC_status_error")) {
+                return;
+            }
+            if (statusElem.classList.contains("noVNC_status_warn") &&
+                statusType === 'normal') {
+                return;
+            }
+        }
+
+        clearTimeout(UI.statusTimeout);
+
+        switch (statusType) {
+            case 'error':
+                statusElem.classList.remove("noVNC_status_warn");
+                statusElem.classList.remove("noVNC_status_normal");
+                statusElem.classList.add("noVNC_status_error");
+                break;
+            case 'warning':
+            case 'warn':
+                statusElem.classList.remove("noVNC_status_error");
+                statusElem.classList.remove("noVNC_status_normal");
+                statusElem.classList.add("noVNC_status_warn");
+                break;
+            case 'normal':
+            case 'info':
+            default:
+                statusElem.classList.remove("noVNC_status_error");
+                statusElem.classList.remove("noVNC_status_warn");
+                statusElem.classList.add("noVNC_status_normal");
+                break;
+        }
+
+        statusElem.textContent = text;
+        statusElem.classList.add("noVNC_open");
+
+        // If no time was specified, show the status for 1.5 seconds
+        if (typeof time === 'undefined') {
+            time = 1500;
+        }
+
+        // Error messages do not timeout
+        if (statusType !== 'error') {
+            UI.statusTimeout = window.setTimeout(UI.hideStatus, time);
+        }
+    },
+
+    hideStatus() {
+        clearTimeout(UI.statusTimeout);
+        document.getElementById('noVNC_status').classList.remove("noVNC_open");
+    },
+
+    activateControlbar(event) {
+        clearTimeout(UI.idleControlbarTimeout);
+        // We manipulate the anchor instead of the actual control
+        // bar in order to avoid creating new a stacking group
+        document.getElementById('noVNC_control_bar_anchor')
+            .classList.remove("noVNC_idle");
+        UI.idleControlbarTimeout = window.setTimeout(UI.idleControlbar, 2000);
+    },
+
+    idleControlbar() {
+        // Don't fade if a child of the control bar has focus
+        if (document.getElementById('noVNC_control_bar')
+            .contains(document.activeElement) && document.hasFocus()) {
+            UI.activateControlbar();
+            return;
+        }
+
+        document.getElementById('noVNC_control_bar_anchor')
+            .classList.add("noVNC_idle");
+    },
+
+    keepControlbar() {
+        clearTimeout(UI.closeControlbarTimeout);
+    },
+
+    openControlbar() {
+        document.getElementById('noVNC_control_bar')
+            .classList.add("noVNC_open");
+    },
+
+    closeControlbar() {
+        UI.closeAllPanels();
+        document.getElementById('noVNC_control_bar')
+            .classList.remove("noVNC_open");
+        UI.rfb.focus();
+    },
+
+    toggleControlbar() {
+        if (document.getElementById('noVNC_control_bar')
+            .classList.contains("noVNC_open")) {
+            UI.closeControlbar();
+        } else {
+            UI.openControlbar();
+        }
+    },
+
+    toggleControlbarSide() {
+        // Temporarily disable animation, if bar is displayed, to avoid weird
+        // movement. The transitionend-event will not fire when display=none.
+        const bar = document.getElementById('noVNC_control_bar');
+        const barDisplayStyle = window.getComputedStyle(bar).display;
+        if (barDisplayStyle !== 'none') {
+            bar.style.transitionDuration = '0s';
+            bar.addEventListener('transitionend', () => bar.style.transitionDuration = '');
+        }
+
+        const anchor = document.getElementById('noVNC_control_bar_anchor');
+        if (anchor.classList.contains("noVNC_right")) {
+            WebUtil.writeSetting('controlbar_pos', 'left');
+            anchor.classList.remove("noVNC_right");
+        } else {
+            WebUtil.writeSetting('controlbar_pos', 'right');
+            anchor.classList.add("noVNC_right");
+        }
+
+        // Consider this a movement of the handle
+        UI.controlbarDrag = true;
+    },
+
+    showControlbarHint(show) {
+        const hint = document.getElementById('noVNC_control_bar_hint');
+        if (show) {
+            hint.classList.add("noVNC_active");
+        } else {
+            hint.classList.remove("noVNC_active");
+        }
+    },
+
+    dragControlbarHandle(e) {
+        if (!UI.controlbarGrabbed) return;
+
+        const ptr = getPointerEvent(e);
+
+        const anchor = document.getElementById('noVNC_control_bar_anchor');
+        if (ptr.clientX < (window.innerWidth * 0.1)) {
+            if (anchor.classList.contains("noVNC_right")) {
+                UI.toggleControlbarSide();
+            }
+        } else if (ptr.clientX > (window.innerWidth * 0.9)) {
+            if (!anchor.classList.contains("noVNC_right")) {
+                UI.toggleControlbarSide();
+            }
+        }
+
+        if (!UI.controlbarDrag) {
+            const dragDistance = Math.abs(ptr.clientY - UI.controlbarMouseDownClientY);
+
+            if (dragDistance < dragThreshold) return;
+
+            UI.controlbarDrag = true;
+        }
+
+        const eventY = ptr.clientY - UI.controlbarMouseDownOffsetY;
+
+        UI.moveControlbarHandle(eventY);
+
+        e.preventDefault();
+        e.stopPropagation();
+        UI.keepControlbar();
+        UI.activateControlbar();
+    },
+
+    // Move the handle but don't allow any position outside the bounds
+    moveControlbarHandle(viewportRelativeY) {
+        const handle = document.getElementById("noVNC_control_bar_handle");
+        const handleHeight = handle.getBoundingClientRect().height;
+        const controlbarBounds = document.getElementById("noVNC_control_bar")
+            .getBoundingClientRect();
+        const margin = 10;
+
+        // These heights need to be non-zero for the below logic to work
+        if (handleHeight === 0 || controlbarBounds.height === 0) {
+            return;
+        }
+
+        let newY = viewportRelativeY;
+
+        // Check if the coordinates are outside the control bar
+        if (newY < controlbarBounds.top + margin) {
+            // Force coordinates to be below the top of the control bar
+            newY = controlbarBounds.top + margin;
+
+        } else if (newY > controlbarBounds.top +
+                   controlbarBounds.height - handleHeight - margin) {
+            // Force coordinates to be above the bottom of the control bar
+            newY = controlbarBounds.top +
+                controlbarBounds.height - handleHeight - margin;
+        }
+
+        // Corner case: control bar too small for stable position
+        if (controlbarBounds.height < (handleHeight + margin * 2)) {
+            newY = controlbarBounds.top +
+                (controlbarBounds.height - handleHeight) / 2;
+        }
+
+        // The transform needs coordinates that are relative to the parent
+        const parentRelativeY = newY - controlbarBounds.top;
+        handle.style.transform = "translateY(" + parentRelativeY + "px)";
+    },
+
+    updateControlbarHandle() {
+        // Since the control bar is fixed on the viewport and not the page,
+        // the move function expects coordinates relative the the viewport.
+        const handle = document.getElementById("noVNC_control_bar_handle");
+        const handleBounds = handle.getBoundingClientRect();
+        UI.moveControlbarHandle(handleBounds.top);
+    },
+
+    controlbarHandleMouseUp(e) {
+        if ((e.type == "mouseup") && (e.button != 0)) return;
+
+        // mouseup and mousedown on the same place toggles the controlbar
+        if (UI.controlbarGrabbed && !UI.controlbarDrag) {
+            UI.toggleControlbar();
+            e.preventDefault();
+            e.stopPropagation();
+            UI.keepControlbar();
+            UI.activateControlbar();
+        }
+        UI.controlbarGrabbed = false;
+        UI.showControlbarHint(false);
+    },
+
+    controlbarHandleMouseDown(e) {
+        if ((e.type == "mousedown") && (e.button != 0)) return;
+
+        const ptr = getPointerEvent(e);
+
+        const handle = document.getElementById("noVNC_control_bar_handle");
+        const bounds = handle.getBoundingClientRect();
+
+        // Touch events have implicit capture
+        if (e.type === "mousedown") {
+            setCapture(handle);
+        }
+
+        UI.controlbarGrabbed = true;
+        UI.controlbarDrag = false;
+
+        UI.showControlbarHint(true);
+
+        UI.controlbarMouseDownClientY = ptr.clientY;
+        UI.controlbarMouseDownOffsetY = ptr.clientY - bounds.top;
+        e.preventDefault();
+        e.stopPropagation();
+        UI.keepControlbar();
+        UI.activateControlbar();
+    },
+
+    toggleExpander(e) {
+        if (this.classList.contains("noVNC_open")) {
+            this.classList.remove("noVNC_open");
+        } else {
+            this.classList.add("noVNC_open");
+        }
+    },
+
+/* ------^-------
+ *    /VISUAL
+ * ==============
+ *    SETTINGS
+ * ------v------*/
+
+    // Initial page load read/initialization of settings
+    initSetting(name, defVal) {
+        // Check Query string followed by cookie
+        let val = WebUtil.getConfigVar(name);
+        if (val === null) {
+            val = WebUtil.readSetting(name, defVal);
+        }
+        WebUtil.setSetting(name, val);
+        UI.updateSetting(name);
+        return val;
+    },
+
+    // Set the new value, update and disable form control setting
+    forceSetting(name, val) {
+        WebUtil.setSetting(name, val);
+        UI.updateSetting(name);
+        UI.disableSetting(name);
+    },
+
+    // Update cookie and form control setting. If value is not set, then
+    // updates from control to current cookie setting.
+    updateSetting(name) {
+
+        // Update the settings control
+        let value = UI.getSetting(name);
+
+        const ctrl = document.getElementById('noVNC_setting_' + name);
+        if (ctrl.type === 'checkbox') {
+            ctrl.checked = value;
+
+        } else if (typeof ctrl.options !== 'undefined') {
+            for (let i = 0; i < ctrl.options.length; i += 1) {
+                if (ctrl.options[i].value === value) {
+                    ctrl.selectedIndex = i;
+                    break;
+                }
+            }
+        } else {
+            /*Weird IE9 error leads to 'null' appearring
+            in textboxes instead of ''.*/
+            if (value === null) {
+                value = "";
+            }
+            ctrl.value = value;
+        }
+    },
+
+    // Save control setting to cookie
+    saveSetting(name) {
+        const ctrl = document.getElementById('noVNC_setting_' + name);
+        let val;
+        if (ctrl.type === 'checkbox') {
+            val = ctrl.checked;
+        } else if (typeof ctrl.options !== 'undefined') {
+            val = ctrl.options[ctrl.selectedIndex].value;
+        } else {
+            val = ctrl.value;
+        }
+        WebUtil.writeSetting(name, val);
+        //Log.Debug("Setting saved '" + name + "=" + val + "'");
+        return val;
+    },
+
+    // Read form control compatible setting from cookie
+    getSetting(name) {
+        const ctrl = document.getElementById('noVNC_setting_' + name);
+        let val = WebUtil.readSetting(name);
+        if (typeof val !== 'undefined' && val !== null && ctrl.type === 'checkbox') {
+            if (val.toString().toLowerCase() in {'0': 1, 'no': 1, 'false': 1}) {
+                val = false;
+            } else {
+                val = true;
+            }
+        }
+        return val;
+    },
+
+    // These helpers compensate for the lack of parent-selectors and
+    // previous-sibling-selectors in CSS which are needed when we want to
+    // disable the labels that belong to disabled input elements.
+    disableSetting(name) {
+        const ctrl = document.getElementById('noVNC_setting_' + name);
+        ctrl.disabled = true;
+        ctrl.label.classList.add('noVNC_disabled');
+    },
+
+    enableSetting(name) {
+        const ctrl = document.getElementById('noVNC_setting_' + name);
+        ctrl.disabled = false;
+        ctrl.label.classList.remove('noVNC_disabled');
+    },
+
+/* ------^-------
+ *   /SETTINGS
+ * ==============
+ *    PANELS
+ * ------v------*/
+
+    closeAllPanels() {
+        UI.closeSettingsPanel();
+        UI.closePowerPanel();
+        UI.closeClipboardPanel();
+        UI.closeExtraKeys();
+    },
+
+/* ------^-------
+ *   /PANELS
+ * ==============
+ * SETTINGS (panel)
+ * ------v------*/
+
+    openSettingsPanel() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        // Refresh UI elements from saved cookies
+        UI.updateSetting('encrypt');
+        UI.updateSetting('view_clip');
+        UI.updateSetting('resize');
+        UI.updateSetting('quality');
+        UI.updateSetting('compression');
+        UI.updateSetting('shared');
+        UI.updateSetting('view_only');
+        UI.updateSetting('path');
+        UI.updateSetting('repeaterID');
+        UI.updateSetting('logging');
+        UI.updateSetting('reconnect');
+        UI.updateSetting('reconnect_delay');
+
+        document.getElementById('noVNC_settings')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_settings_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeSettingsPanel() {
+        document.getElementById('noVNC_settings')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_settings_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleSettingsPanel() {
+        if (document.getElementById('noVNC_settings')
+            .classList.contains("noVNC_open")) {
+            UI.closeSettingsPanel();
+        } else {
+            UI.openSettingsPanel();
+        }
+    },
+
+/* ------^-------
+ *   /SETTINGS
+ * ==============
+ *     POWER
+ * ------v------*/
+
+    openPowerPanel() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_power')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_power_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closePowerPanel() {
+        document.getElementById('noVNC_power')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_power_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    togglePowerPanel() {
+        if (document.getElementById('noVNC_power')
+            .classList.contains("noVNC_open")) {
+            UI.closePowerPanel();
+        } else {
+            UI.openPowerPanel();
+        }
+    },
+
+    // Disable/enable power button
+    updatePowerButton() {
+        if (UI.connected &&
+            UI.rfb.capabilities.power &&
+            !UI.rfb.viewOnly) {
+            document.getElementById('noVNC_power_button')
+                .classList.remove("noVNC_hidden");
+        } else {
+            document.getElementById('noVNC_power_button')
+                .classList.add("noVNC_hidden");
+            // Close power panel if open
+            UI.closePowerPanel();
+        }
+    },
+
+/* ------^-------
+ *    /POWER
+ * ==============
+ *   CLIPBOARD
+ * ------v------*/
+
+    openClipboardPanel() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_clipboard')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_clipboard_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeClipboardPanel() {
+        document.getElementById('noVNC_clipboard')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_clipboard_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleClipboardPanel() {
+        if (document.getElementById('noVNC_clipboard')
+            .classList.contains("noVNC_open")) {
+            UI.closeClipboardPanel();
+        } else {
+            UI.openClipboardPanel();
+            setTimeout(() => document
+                .getElementById('noVNC_clipboard_text').focus(), 100);
+        }
+    },
+
+    clipboardReceive(e) {
+        Log.Debug(">> UI.clipboardReceive: " + e.detail.text.substr(0, 40) + "...");
+        document.getElementById('noVNC_clipboard_text').value = e.detail.text;
+        Log.Debug("<< UI.clipboardReceive");
+    },
+
+    clipboardClear() {
+        document.getElementById('noVNC_clipboard_text').value = "";
+    },
+
+    clipboardSend() {
+        const text = document.getElementById('noVNC_clipboard_text').value;
+        UI.rfb.sendText(text);
+        UI.closeClipboardPanel();
+        UI.focusOnConsole();
+    },
+
+/* ------^-------
+ *  /CLIPBOARD
+ * ==============
+ *  CONNECTION
+ * ------v------*/
+
+    openConnectPanel() {
+        document.getElementById('noVNC_connect_dlg')
+            .classList.add("noVNC_open");
+    },
+
+    closeConnectPanel() {
+        document.getElementById('noVNC_connect_dlg')
+            .classList.remove("noVNC_open");
+    },
+
+    connect(event, password) {
+
+        // Ignore when rfb already exists
+        if (typeof UI.rfb !== 'undefined') {
+            return;
+        }
+
+        const host = UI.getSetting('host');
+        const port = UI.getSetting('port');
+        const path = UI.getSetting('path');
+        const token = UI.getSetting('token')
+
+        if (typeof password === 'undefined') {
+            password = WebUtil.getConfigVar('password');
+            UI.reconnectPassword = password;
+        }
+
+        if (password === null) {
+            password = undefined;
+        }
+
+        UI.hideStatus();
+
+        if (!host) {
+            Log.Error("Can't connect when host is: " + host);
+            UI.showStatus(_("Must set host"), 'error');
+            return;
+        }
+
+        UI.closeConnectPanel();
+
+        UI.updateVisualState('connecting');
+
+        let url;
+
+        url = UI.getSetting('encrypt') ? 'wss' : 'ws';
+
+        url += '://' + host;
+        if (port) {
+            url += ':' + port;
+        }
+        url += '/' + path;
+        url += '?token=' + token;
+
+        UI.rfb = new RFB(document.getElementById('noVNC_container'), url,
+                         { shared: UI.getSetting('shared'),
+                           repeaterID: UI.getSetting('repeaterID'),
+                           credentials: { password: password } });
+        UI.rfb.addEventListener("connect", UI.connectFinished);
+        UI.rfb.addEventListener("disconnect", UI.disconnectFinished);
+        UI.rfb.addEventListener("credentialsrequired", UI.credentials);
+        UI.rfb.addEventListener("securityfailure", UI.securityFailed);
+        UI.rfb.addEventListener("capabilities", UI.updatePowerButton);
+        UI.rfb.addEventListener("clipboard", UI.clipboardReceive);
+        UI.rfb.addEventListener("bell", UI.bell);
+        UI.rfb.addEventListener("desktopname", UI.updateDesktopName);
+        UI.rfb.clipViewport = UI.getSetting('view_clip');
+        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
+        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
+        UI.rfb.qualityLevel = parseInt(UI.getSetting('quality'));
+        UI.rfb.compressionLevel = parseInt(UI.getSetting('compression'));
+        UI.rfb.showDotCursor = UI.getSetting('show_dot');
+
+        UI.updateViewOnly(); // requires UI.rfb
+    },
+
+    disconnect() {
+        UI.rfb.disconnect();
+
+        UI.connected = false;
+
+        // Disable automatic reconnecting
+        UI.inhibitReconnect = true;
+
+        UI.updateVisualState('disconnecting');
+
+        // Don't display the connection settings until we're actually disconnected
+    },
+
+    reconnect() {
+        UI.reconnectCallback = null;
+
+        // if reconnect has been disabled in the meantime, do nothing.
+        if (UI.inhibitReconnect) {
+            return;
+        }
+
+        UI.connect(null, UI.reconnectPassword);
+    },
+
+    cancelReconnect() {
+        if (UI.reconnectCallback !== null) {
+            clearTimeout(UI.reconnectCallback);
+            UI.reconnectCallback = null;
+        }
+
+        UI.updateVisualState('disconnected');
+
+        UI.openControlbar();
+        UI.openConnectPanel();
+    },
+
+    connectFinished(e) {
+        UI.connected = true;
+        UI.inhibitReconnect = false;
+
+        let msg;
+        if (UI.getSetting('encrypt')) {
+            msg = _("Connected");
+        } else {
+            msg = _("Connected")
+        }
+        UI.showStatus(msg);
+        UI.updateVisualState('connected');
+
+        // Do this last because it can only be used on rendered elements
+        UI.rfb.focus();
+    },
+
+    disconnectFinished(e) {
+        const wasConnected = UI.connected;
+
+        // This variable is ideally set when disconnection starts, but
+        // when the disconnection isn't clean or if it is initiated by
+        // the server, we need to do it here as well since
+        // UI.disconnect() won't be used in those cases.
+        UI.connected = false;
+
+        UI.rfb = undefined;
+
+        if (!e.detail.clean) {
+            UI.updateVisualState('disconnected');
+            if (wasConnected) {
+                UI.showStatus(_("Something went wrong, connection is closed"),
+                              'error');
+            } else {
+                UI.showStatus(_("Failed to connect to server"), 'error');
+            }
+        } else if (UI.getSetting('reconnect', false) === true && !UI.inhibitReconnect) {
+            UI.updateVisualState('reconnecting');
+
+            const delay = parseInt(UI.getSetting('reconnect_delay'));
+            UI.reconnectCallback = setTimeout(UI.reconnect, delay);
+            return;
+        } else {
+            UI.updateVisualState('disconnected');
+            UI.showStatus(_("Disconnected"), 'normal');
+        }
+
+        document.title = PAGE_TITLE;
+
+        UI.openControlbar();
+        UI.openConnectPanel();
+    },
+
+    securityFailed(e) {
+        let msg = "";
+        // On security failures we might get a string with a reason
+        // directly from the server. Note that we can't control if
+        // this string is translated or not.
+        if ('reason' in e.detail) {
+            msg = _("New connection has been rejected with reason: ") +
+                e.detail.reason;
+        } else {
+            msg = _("New connection has been rejected");
+        }
+        UI.showStatus(msg, 'error');
+    },
+
+/* ------^-------
+ *  /CONNECTION
+ * ==============
+ *   PASSWORD
+ * ------v------*/
+
+    credentials(e) {
+        // FIXME: handle more types
+
+        document.getElementById("noVNC_username_block").classList.remove("noVNC_hidden");
+        document.getElementById("noVNC_password_block").classList.remove("noVNC_hidden");
+
+        let inputFocus = "none";
+        if (e.detail.types.indexOf("username") === -1) {
+            document.getElementById("noVNC_username_block").classList.add("noVNC_hidden");
+        } else {
+            inputFocus = inputFocus === "none" ? "noVNC_username_input" : inputFocus;
+        }
+        if (e.detail.types.indexOf("password") === -1) {
+            document.getElementById("noVNC_password_block").classList.add("noVNC_hidden");
+        } else {
+            inputFocus = inputFocus === "none" ? "noVNC_password_input" : inputFocus;
+        }
+        document.getElementById('noVNC_credentials_dlg')
+            .classList.add('noVNC_open');
+
+        setTimeout(() => document
+            .getElementById(inputFocus).focus(), 100);
+
+        Log.Warn("Server asked for credentials");
+        UI.showStatus(_("Credentials are required"), "warning");
+    },
+
+    setCredentials(e) {
+        // Prevent actually submitting the form
+        e.preventDefault();
+
+        let inputElemUsername = document.getElementById('noVNC_username_input');
+        const username = inputElemUsername.value;
+
+        let inputElemPassword = document.getElementById('noVNC_password_input');
+        const password = inputElemPassword.value;
+        // Clear the input after reading the password
+        inputElemPassword.value = "";
+
+        UI.rfb.sendCredentials({ username: username, password: password });
+        UI.reconnectPassword = password;
+        document.getElementById('noVNC_credentials_dlg')
+            .classList.remove('noVNC_open');
+    },
+
+/* ------^-------
+ *  /PASSWORD
+ * ==============
+ *   FULLSCREEN
+ * ------v------*/
+
+    toggleFullscreen() {
+        this.fullScreen = !this.fullScreen
+        UI.rfb.scaleViewport = this.fullScreen
+        UI.updateFullscreenButton(this.fullScreen);
+        UI.focusOnConsole();
+    },
+
+    updateFullscreenButton(fullScreen) {
+        if (fullScreen) {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.add("noVNC_selected");
+        } else {
+            document.getElementById('noVNC_fullscreen_button')
+                .classList.remove("noVNC_selected");
+        }
+    },
+
+/* ------^-------
+ *  /FULLSCREEN
+ * ==============
+ *     RESIZE
+ * ------v------*/
+
+    // Apply remote resizing or local scaling
+    applyResizeMode() {
+        if (!UI.rfb) return;
+
+        UI.rfb.scaleViewport = UI.getSetting('resize') === 'scale';
+        UI.rfb.resizeSession = UI.getSetting('resize') === 'remote';
+    },
+
+/* ------^-------
+ *    /RESIZE
+ * ==============
+ * VIEW CLIPPING
+ * ------v------*/
+
+    // Update viewport clipping property for the connection. The normal
+    // case is to get the value from the setting. There are special cases
+    // for when the viewport is scaled or when a touch device is used.
+    updateViewClip() {
+        if (!UI.rfb) return;
+
+        const scaling = UI.getSetting('resize') === 'scale';
+
+        if (scaling) {
+            // Can't be clipping if viewport is scaled to fit
+            UI.forceSetting('view_clip', false);
+            UI.rfb.clipViewport  = false;
+        } else if (!hasScrollbarGutter) {
+            // Some platforms have scrollbars that are difficult
+            // to use in our case, so we always use our own panning
+            UI.forceSetting('view_clip', true);
+            UI.rfb.clipViewport = true;
+        } else {
+            UI.enableSetting('view_clip');
+            UI.rfb.clipViewport = UI.getSetting('view_clip');
+        }
+
+        // Changing the viewport may change the state of
+        // the dragging button
+        UI.updateViewDrag();
+    },
+
+/* ------^-------
+ * /VIEW CLIPPING
+ * ==============
+ *    VIEWDRAG
+ * ------v------*/
+
+    toggleViewDrag() {
+        if (!UI.rfb) return;
+
+        UI.rfb.dragViewport = !UI.rfb.dragViewport;
+        UI.updateViewDrag();
+    },
+
+    updateViewDrag() {
+        if (!UI.connected) return;
+
+        const viewDragButton = document.getElementById('noVNC_view_drag_button');
+
+        if (!UI.rfb.clipViewport && UI.rfb.dragViewport) {
+            // We are no longer clipping the viewport. Make sure
+            // viewport drag isn't active when it can't be used.
+            UI.rfb.dragViewport = false;
+        }
+
+        if (UI.rfb.dragViewport) {
+            viewDragButton.classList.add("noVNC_selected");
+        } else {
+            viewDragButton.classList.remove("noVNC_selected");
+        }
+
+        if (UI.rfb.clipViewport) {
+            viewDragButton.classList.remove("noVNC_hidden");
+        } else {
+            viewDragButton.classList.add("noVNC_hidden");
+        }
+    },
+
+/* ------^-------
+ *   /VIEWDRAG
+ * ==============
+ *    QUALITY
+ * ------v------*/
+
+    updateQuality() {
+        if (!UI.rfb) return;
+
+        UI.rfb.qualityLevel = parseInt(UI.getSetting('quality'));
+    },
+
+/* ------^-------
+ *   /QUALITY
+ * ==============
+ *  COMPRESSION
+ * ------v------*/
+
+    updateCompression() {
+        if (!UI.rfb) return;
+
+        UI.rfb.compressionLevel = parseInt(UI.getSetting('compression'));
+    },
+
+/* ------^-------
+ *  /COMPRESSION
+ * ==============
+ *    KEYBOARD
+ * ------v------*/
+
+    showVirtualKeyboard() {
+        if (!isTouchDevice) return;
+
+        const input = document.getElementById('noVNC_keyboardinput');
+
+        if (document.activeElement == input) return;
+
+        input.focus();
+
+        try {
+            const l = input.value.length;
+            // Move the caret to the end
+            input.setSelectionRange(l, l);
+        } catch (err) {
+            // setSelectionRange is undefined in Google Chrome
+        }
+    },
+
+    hideVirtualKeyboard() {
+        if (!isTouchDevice) return;
+
+        const input = document.getElementById('noVNC_keyboardinput');
+
+        if (document.activeElement != input) return;
+
+        input.blur();
+    },
+
+    toggleVirtualKeyboard() {
+        if (document.getElementById('noVNC_keyboard_button')
+            .classList.contains("noVNC_selected")) {
+            UI.hideVirtualKeyboard();
+        } else {
+            UI.showVirtualKeyboard();
+        }
+    },
+
+    onfocusVirtualKeyboard(event) {
+        document.getElementById('noVNC_keyboard_button')
+            .classList.add("noVNC_selected");
+        if (UI.rfb) {
+            UI.rfb.focusOnClick = false;
+        }
+    },
+
+    onblurVirtualKeyboard(event) {
+        document.getElementById('noVNC_keyboard_button')
+            .classList.remove("noVNC_selected");
+        if (UI.rfb) {
+            UI.rfb.focusOnClick = true;
+        }
+    },
+
+    keepVirtualKeyboard(event) {
+        const input = document.getElementById('noVNC_keyboardinput');
+
+        // Only prevent focus change if the virtual keyboard is active
+        if (document.activeElement != input) {
+            return;
+        }
+
+        // Only allow focus to move to other elements that need
+        // focus to function properly
+        if (event.target.form !== undefined) {
+            switch (event.target.type) {
+                case 'text':
+                case 'email':
+                case 'search':
+                case 'password':
+                case 'tel':
+                case 'url':
+                case 'textarea':
+                case 'select-one':
+                case 'select-multiple':
+                    return;
+            }
+        }
+
+        event.preventDefault();
+    },
+
+    keyboardinputReset() {
+        const kbi = document.getElementById('noVNC_keyboardinput');
+        kbi.value = new Array(UI.defaultKeyboardinputLen).join("_");
+        UI.lastKeyboardinput = kbi.value;
+    },
+
+    keyEvent(keysym, code, down) {
+        if (!UI.rfb) return;
+
+        UI.rfb.sendKey(keysym, code, down);
+    },
+
+    // When normal keyboard events are left uncought, use the input events from
+    // the keyboardinput element instead and generate the corresponding key events.
+    // This code is required since some browsers on Android are inconsistent in
+    // sending keyCodes in the normal keyboard events when using on screen keyboards.
+    keyInput(event) {
+
+        if (!UI.rfb) return;
+
+        const newValue = event.target.value;
+
+        if (!UI.lastKeyboardinput) {
+            UI.keyboardinputReset();
+        }
+        const oldValue = UI.lastKeyboardinput;
+
+        let newLen;
+        try {
+            // Try to check caret position since whitespace at the end
+            // will not be considered by value.length in some browsers
+            newLen = Math.max(event.target.selectionStart, newValue.length);
+        } catch (err) {
+            // selectionStart is undefined in Google Chrome
+            newLen = newValue.length;
+        }
+        const oldLen = oldValue.length;
+
+        let inputs = newLen - oldLen;
+        let backspaces = inputs < 0 ? -inputs : 0;
+
+        // Compare the old string with the new to account for
+        // text-corrections or other input that modify existing text
+        for (let i = 0; i < Math.min(oldLen, newLen); i++) {
+            if (newValue.charAt(i) != oldValue.charAt(i)) {
+                inputs = newLen - i;
+                backspaces = oldLen - i;
+                break;
+            }
+        }
+
+        // Send the key events
+        for (let i = 0; i < backspaces; i++) {
+            UI.rfb.sendKey(KeyTable.XK_BackSpace, "Backspace");
+        }
+        for (let i = newLen - inputs; i < newLen; i++) {
+            UI.rfb.sendKey(keysyms.lookup(newValue.charCodeAt(i)));
+        }
+
+        // Control the text content length in the keyboardinput element
+        if (newLen > 2 * UI.defaultKeyboardinputLen) {
+            UI.keyboardinputReset();
+        } else if (newLen < 1) {
+            // There always have to be some text in the keyboardinput
+            // element with which backspace can interact.
+            UI.keyboardinputReset();
+            // This sometimes causes the keyboard to disappear for a second
+            // but it is required for the android keyboard to recognize that
+            // text has been added to the field
+            event.target.blur();
+            // This has to be ran outside of the input handler in order to work
+            setTimeout(event.target.focus.bind(event.target), 0);
+        } else {
+            UI.lastKeyboardinput = newValue;
+        }
+    },
+
+/* ------^-------
+ *   /KEYBOARD
+ * ==============
+ *   EXTRA KEYS
+ * ------v------*/
+
+    openExtraKeys() {
+        UI.closeAllPanels();
+        UI.openControlbar();
+
+        document.getElementById('noVNC_modifiers')
+            .classList.add("noVNC_open");
+        document.getElementById('noVNC_toggle_extra_keys_button')
+            .classList.add("noVNC_selected");
+    },
+
+    closeExtraKeys() {
+        document.getElementById('noVNC_modifiers')
+            .classList.remove("noVNC_open");
+        document.getElementById('noVNC_toggle_extra_keys_button')
+            .classList.remove("noVNC_selected");
+    },
+
+    toggleExtraKeys() {
+        if (document.getElementById('noVNC_modifiers')
+            .classList.contains("noVNC_open")) {
+            UI.closeExtraKeys();
+        } else  {
+            UI.openExtraKeys();
+        }
+    },
+
+    sendEsc() {
+        UI.sendKey(KeyTable.XK_Escape, "Escape");
+    },
+
+    sendTab() {
+        UI.sendKey(KeyTable.XK_Tab, "Tab");
+    },
+
+    toggleCtrl() {
+        const btn = document.getElementById('noVNC_toggle_ctrl_button');
+        if (btn.classList.contains("noVNC_selected")) {
+            UI.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
+            btn.classList.remove("noVNC_selected");
+        } else {
+            UI.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
+            btn.classList.add("noVNC_selected");
+        }
+    },
+
+    toggleWindows() {
+        const btn = document.getElementById('noVNC_toggle_windows_button');
+        if (btn.classList.contains("noVNC_selected")) {
+            UI.sendKey(KeyTable.XK_Super_L, "MetaLeft", false);
+            btn.classList.remove("noVNC_selected");
+        } else {
+            UI.sendKey(KeyTable.XK_Super_L, "MetaLeft", true);
+            btn.classList.add("noVNC_selected");
+        }
+    },
+
+    toggleAlt() {
+        const btn = document.getElementById('noVNC_toggle_alt_button');
+        if (btn.classList.contains("noVNC_selected")) {
+            UI.sendKey(KeyTable.XK_Alt_L, "AltLeft", false);
+            btn.classList.remove("noVNC_selected");
+        } else {
+            UI.sendKey(KeyTable.XK_Alt_L, "AltLeft", true);
+            btn.classList.add("noVNC_selected");
+        }
+    },
+
+    sendCtrlAltDel() {
+        UI.rfb.sendCtrlAltDel();
+        // See below
+        UI.rfb.focus();
+        UI.idleControlbar();
+    },
+
+    // Move focus to the screen in order to be able to use the
+    // keyboard right after these extra keys.
+    // The exception is when a virtual keyboard is used, because
+    // if we focus the screen the virtual keyboard would be closed.
+    // In this case we focus our special virtual keyboard input
+    // element instead.
+    focusOnConsole() {
+        if (document.getElementById('noVNC_keyboard_button')
+            .classList.contains("noVNC_selected")) {
+            document.getElementById('noVNC_keyboardinput').focus();
+        } else {
+            UI.rfb.focus();
+        }
+    },
+
+    sendKey(keysym, code, down) {
+        UI.rfb.sendKey(keysym, code, down);
+        UI.focusOnConsole()
+        // fade out the controlbar to highlight that
+        // the focus has been moved to the screen
+        UI.idleControlbar();
+    },
+
+/* ------^-------
+ *   /EXTRA KEYS
+ * ==============
+ *     MISC
+ * ------v------*/
+
+    updateViewOnly() {
+        if (!UI.rfb) return;
+        UI.rfb.viewOnly = UI.getSetting('view_only');
+
+        // Hide input related buttons in view only mode
+        if (UI.rfb.viewOnly) {
+            document.getElementById('noVNC_keyboard_button')
+                .classList.add('noVNC_hidden');
+            document.getElementById('noVNC_toggle_extra_keys_button')
+                .classList.add('noVNC_hidden');
+            document.getElementById('noVNC_clipboard_button')
+                .classList.add('noVNC_hidden');
+        } else {
+            document.getElementById('noVNC_keyboard_button')
+                .classList.remove('noVNC_hidden');
+            document.getElementById('noVNC_toggle_extra_keys_button')
+                .classList.remove('noVNC_hidden');
+            document.getElementById('noVNC_clipboard_button')
+                .classList.remove('noVNC_hidden');
+        }
+    },
+
+    updateShowDotCursor() {
+        if (!UI.rfb) return;
+        UI.rfb.showDotCursor = UI.getSetting('show_dot');
+    },
+
+    updateLogging() {
+        WebUtil.initLogging(UI.getSetting('logging'));
+    },
+
+    updateDesktopName(e) {
+        UI.desktopName = e.detail.name;
+        // Display the desktop name in the document title
+        document.title = e.detail.name + " - " + PAGE_TITLE;
+    },
+
+    bell(e) {
+        if (WebUtil.getConfigVar('bell', 'on') === 'on') {
+            const promise = document.getElementById('noVNC_bell').play();
+            // The standards disagree on the return value here
+            if (promise) {
+                promise.catch((e) => {
+                    if (e.name === "NotAllowedError") {
+                        // Ignore when the browser doesn't let us play audio.
+                        // It is common that the browsers require audio to be
+                        // initiated from a user action.
+                    } else {
+                        Log.Error("Unable to play bell: " + e);
+                    }
+                });
+            }
+        }
+    },
+
+    //Helper to add options to dropdown.
+    addOption(selectbox, text, value) {
+        const optn = document.createElement("OPTION");
+        optn.text = text;
+        optn.value = value;
+        selectbox.options.add(optn);
+    },
+
+/* ------^-------
+ *    /MISC
+ * ==============
+ */
+};
+
+// Set up translations
+const LINGUAS = ["cs", "de", "el", "es", "ja", "ko", "nl", "pl", "ru", "sv", "tr", "zh_CN", "zh_TW"];
+l10n.setup(LINGUAS);
+if (l10n.language === "en" || l10n.dictionary !== undefined) {
+    UI.prime();
+} else {
+    WebUtil.fetchJSON('app/locale/' + l10n.language + '.json')
+        .then((translations) => { l10n.dictionary = translations; })
+        .catch(err => Log.Error("Failed to load translations: " + err))
+        .then(UI.prime);
+}
+
+export default UI;
diff --git a/systemvm/agent/noVNC/app/webutil.js b/systemvm/agent/noVNC/app/webutil.js
new file mode 100644
index 0000000..568f0e2
--- /dev/null
+++ b/systemvm/agent/noVNC/app/webutil.js
@@ -0,0 +1,220 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import { initLogging as mainInitLogging } from '../core/util/logging.js';
+
+// init log level reading the logging HTTP param
+export function initLogging(level) {
+    "use strict";
+    if (typeof level !== "undefined") {
+        mainInitLogging(level);
+    } else {
+        const param = document.location.href.match(/logging=([A-Za-z0-9._-]*)/);
+        mainInitLogging(param || undefined);
+    }
+}
+
+// Read a query string variable
+export function getQueryVar(name, defVal) {
+    "use strict";
+    const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
+        match = document.location.href.match(re);
+    if (typeof defVal === 'undefined') { defVal = null; }
+
+    if (match) {
+        return decodeURIComponent(match[1]);
+    }
+
+    return defVal;
+}
+
+// Read a hash fragment variable
+export function getHashVar(name, defVal) {
+    "use strict";
+    const re = new RegExp('.*[&#]' + name + '=([^&]*)'),
+        match = document.location.hash.match(re);
+    if (typeof defVal === 'undefined') { defVal = null; }
+
+    if (match) {
+        return decodeURIComponent(match[1]);
+    }
+
+    return defVal;
+}
+
+// Read a variable from the fragment or the query string
+// Fragment takes precedence
+export function getConfigVar(name, defVal) {
+    "use strict";
+    const val = getHashVar(name);
+
+    if (val === null) {
+        return getQueryVar(name, defVal);
+    }
+
+    return val;
+}
+
+/*
+ * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
+ */
+
+// No days means only for this browser session
+export function createCookie(name, value, days) {
+    "use strict";
+    let date, expires;
+    if (days) {
+        date = new Date();
+        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
+        expires = "; expires=" + date.toGMTString();
+    } else {
+        expires = "";
+    }
+
+    let secure;
+    if (document.location.protocol === "https:") {
+        secure = "; secure";
+    } else {
+        secure = "";
+    }
+    document.cookie = name + "=" + value + expires + "; path=/" + secure;
+}
+
+export function readCookie(name, defaultValue) {
+    "use strict";
+    const nameEQ = name + "=";
+    const ca = document.cookie.split(';');
+
+    for (let i = 0; i < ca.length; i += 1) {
+        let c = ca[i];
+        while (c.charAt(0) === ' ') {
+            c = c.substring(1, c.length);
+        }
+        if (c.indexOf(nameEQ) === 0) {
+            return c.substring(nameEQ.length, c.length);
+        }
+    }
+
+    return (typeof defaultValue !== 'undefined') ? defaultValue : null;
+}
+
+export function eraseCookie(name) {
+    "use strict";
+    createCookie(name, "", -1);
+}
+
+/*
+ * Setting handling.
+ */
+
+let settings = {};
+
+export function initSettings() {
+    settings = {};
+    return Promise.resolve();
+}
+
+// Update the settings cache, but do not write to permanent storage
+export function setSetting(name, value) {
+    settings[name] = value;
+}
+
+// No days means only for this browser session
+export function writeSetting(name, value) {
+    "use strict";
+    if (settings[name] === value) return;
+    settings[name] = value;
+}
+
+export function readSetting(name, defaultValue) {
+    "use strict";
+    let value;
+    value = settings[name];
+
+    if (typeof value === "undefined") {
+        value = null;
+    }
+
+    if (value === null && typeof defaultValue !== "undefined") {
+        return defaultValue;
+    }
+
+    return value;
+}
+
+export function eraseSetting(name) {
+    "use strict";
+    // Deleting here means that next time the setting is read when using local
+    // storage, it will be pulled from local storage again.
+    // If the setting in local storage is changed (e.g. in another tab)
+    // between this delete and the next read, it could lead to an unexpected
+    // value change.
+    delete settings[name];
+}
+
+export function injectParamIfMissing(path, param, value) {
+    // force pretend that we're dealing with a relative path
+    // (assume that we wanted an extra if we pass one in)
+    path = "/" + path;
+
+    const elem = document.createElement('a');
+    elem.href = path;
+
+    const paramEq = encodeURIComponent(param) + "=";
+    let query;
+    if (elem.search) {
+        query = elem.search.slice(1).split('&');
+    } else {
+        query = [];
+    }
+
+    if (!query.some(v => v.startsWith(paramEq))) {
+        query.push(paramEq + encodeURIComponent(value));
+        elem.search = "?" + query.join("&");
+    }
+
+    // some browsers (e.g. IE11) may occasionally omit the leading slash
+    // in the elem.pathname string. Handle that case gracefully.
+    if (elem.pathname.charAt(0) == "/") {
+        return elem.pathname.slice(1) + elem.search + elem.hash;
+    }
+
+    return elem.pathname + elem.search + elem.hash;
+}
+
+// sadly, we can't use the Fetch API until we decide to drop
+// IE11 support or polyfill promises and fetch in IE11.
+// resolve will receive an object on success, while reject
+// will receive either an event or an error on failure.
+export function fetchJSON(path) {
+    return new Promise((resolve, reject) => {
+        // NB: IE11 doesn't support JSON as a responseType
+        const req = new XMLHttpRequest();
+        req.open('GET', path);
+
+        req.onload = () => {
+            if (req.status === 200) {
+                let resObj;
+                try {
+                    resObj = JSON.parse(req.responseText);
+                } catch (err) {
+                    reject(err);
+                }
+                resolve(resObj);
+            } else {
+                reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status));
+            }
+        };
+
+        req.onerror = evt => reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message));
+
+        req.ontimeout = evt => reject(new Error("XHR timed out while trying to load '" + path + "'"));
+
+        req.send();
+    });
+}
diff --git a/systemvm/agent/noVNC/core/base64.js b/systemvm/agent/noVNC/core/base64.js
new file mode 100644
index 0000000..db572c2
--- /dev/null
+++ b/systemvm/agent/noVNC/core/base64.js
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// From: http://hg.mozilla.org/mozilla-central/raw-file/ec10630b1a54/js/src/devtools/jint/sunspider/string-base64.js
+
+import * as Log from './util/logging.js';
+
+export default {
+    /* Convert data (an array of integers) to a Base64 string. */
+    toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''),
+    base64Pad: '=',
+
+    encode(data) {
+        "use strict";
+        let result = '';
+        const length = data.length;
+        const lengthpad = (length % 3);
+        // Convert every three bytes to 4 ascii characters.
+
+        for (let i = 0; i < (length - 2); i += 3) {
+            result += this.toBase64Table[data[i] >> 2];
+            result += this.toBase64Table[((data[i] & 0x03) << 4) + (data[i + 1] >> 4)];
+            result += this.toBase64Table[((data[i + 1] & 0x0f) << 2) + (data[i + 2] >> 6)];
+            result += this.toBase64Table[data[i + 2] & 0x3f];
+        }
+
+        // Convert the remaining 1 or 2 bytes, pad out to 4 characters.
+        const j = length - lengthpad;
+        if (lengthpad === 2) {
+            result += this.toBase64Table[data[j] >> 2];
+            result += this.toBase64Table[((data[j] & 0x03) << 4) + (data[j + 1] >> 4)];
+            result += this.toBase64Table[(data[j + 1] & 0x0f) << 2];
+            result += this.toBase64Table[64];
+        } else if (lengthpad === 1) {
+            result += this.toBase64Table[data[j] >> 2];
+            result += this.toBase64Table[(data[j] & 0x03) << 4];
+            result += this.toBase64Table[64];
+            result += this.toBase64Table[64];
+        }
+
+        return result;
+    },
+
+    /* Convert Base64 data to a string */
+    /* eslint-disable comma-spacing */
+    toBinaryTable: [
+        -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+        -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
+        -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
+        52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,
+        -1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
+        15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
+        -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
+        41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
+    ],
+    /* eslint-enable comma-spacing */
+
+    decode(data, offset = 0) {
+        let dataLength = data.indexOf('=') - offset;
+        if (dataLength < 0) { dataLength = data.length - offset; }
+
+        /* Every four characters is 3 resulting numbers */
+        const resultLength = (dataLength >> 2) * 3 + Math.floor((dataLength % 4) / 1.5);
+        const result = new Array(resultLength);
+
+        // Convert one by one.
+
+        let leftbits = 0; // number of bits decoded, but yet to be appended
+        let leftdata = 0; // bits decoded, but yet to be appended
+        for (let idx = 0, i = offset; i < data.length; i++) {
+            const c = this.toBinaryTable[data.charCodeAt(i) & 0x7f];
+            const padding = (data.charAt(i) === this.base64Pad);
+            // Skip illegal characters and whitespace
+            if (c === -1) {
+                Log.Error("Illegal character code " + data.charCodeAt(i) + " at position " + i);
+                continue;
+            }
+
+            // Collect data into leftdata, update bitcount
+            leftdata = (leftdata << 6) | c;
+            leftbits += 6;
+
+            // If we have 8 or more bits, append 8 bits to the result
+            if (leftbits >= 8) {
+                leftbits -= 8;
+                // Append if not padding.
+                if (!padding) {
+                    result[idx++] = (leftdata >> leftbits) & 0xff;
+                }
+                leftdata &= (1 << leftbits) - 1;
+            }
+        }
+
+        // If there are any bits left, the base64 string was corrupted
+        if (leftbits) {
+            const err = new Error('Corrupted base64 string');
+            err.name = 'Base64-Error';
+            throw err;
+        }
+
+        return result;
+    }
+}; /* End of Base64 namespace */
diff --git a/systemvm/agent/noVNC/core/decoders/copyrect.js b/systemvm/agent/noVNC/core/decoders/copyrect.js
new file mode 100644
index 0000000..9e6391a
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/copyrect.js
@@ -0,0 +1,27 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+export default class CopyRectDecoder {
+    decodeRect(x, y, width, height, sock, display, depth) {
+        if (sock.rQwait("COPYRECT", 4)) {
+            return false;
+        }
+
+        let deltaX = sock.rQshift16();
+        let deltaY = sock.rQshift16();
+
+        if ((width === 0) || (height === 0)) {
+            return true;
+        }
+
+        display.copyImage(deltaX, deltaY, x, y, width, height);
+
+        return true;
+    }
+}
diff --git a/systemvm/agent/noVNC/core/decoders/hextile.js b/systemvm/agent/noVNC/core/decoders/hextile.js
new file mode 100644
index 0000000..ac21eff
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/hextile.js
@@ -0,0 +1,191 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+import * as Log from '../util/logging.js';
+
+export default class HextileDecoder {
+    constructor() {
+        this._tiles = 0;
+        this._lastsubencoding = 0;
+        this._tileBuffer = new Uint8Array(16 * 16 * 4);
+    }
+
+    decodeRect(x, y, width, height, sock, display, depth) {
+        if (this._tiles === 0) {
+            this._tilesX = Math.ceil(width / 16);
+            this._tilesY = Math.ceil(height / 16);
+            this._totalTiles = this._tilesX * this._tilesY;
+            this._tiles = this._totalTiles;
+        }
+
+        while (this._tiles > 0) {
+            let bytes = 1;
+
+            if (sock.rQwait("HEXTILE", bytes)) {
+                return false;
+            }
+
+            let rQ = sock.rQ;
+            let rQi = sock.rQi;
+
+            let subencoding = rQ[rQi];  // Peek
+            if (subencoding > 30) {  // Raw
+                throw new Error("Illegal hextile subencoding (subencoding: " +
+                            subencoding + ")");
+            }
+
+            const currTile = this._totalTiles - this._tiles;
+            const tileX = currTile % this._tilesX;
+            const tileY = Math.floor(currTile / this._tilesX);
+            const tx = x + tileX * 16;
+            const ty = y + tileY * 16;
+            const tw = Math.min(16, (x + width) - tx);
+            const th = Math.min(16, (y + height) - ty);
+
+            // Figure out how much we are expecting
+            if (subencoding & 0x01) {  // Raw
+                bytes += tw * th * 4;
+            } else {
+                if (subencoding & 0x02) {  // Background
+                    bytes += 4;
+                }
+                if (subencoding & 0x04) {  // Foreground
+                    bytes += 4;
+                }
+                if (subencoding & 0x08) {  // AnySubrects
+                    bytes++;  // Since we aren't shifting it off
+
+                    if (sock.rQwait("HEXTILE", bytes)) {
+                        return false;
+                    }
+
+                    let subrects = rQ[rQi + bytes - 1];  // Peek
+                    if (subencoding & 0x10) {  // SubrectsColoured
+                        bytes += subrects * (4 + 2);
+                    } else {
+                        bytes += subrects * 2;
+                    }
+                }
+            }
+
+            if (sock.rQwait("HEXTILE", bytes)) {
+                return false;
+            }
+
+            // We know the encoding and have a whole tile
+            rQi++;
+            if (subencoding === 0) {
+                if (this._lastsubencoding & 0x01) {
+                    // Weird: ignore blanks are RAW
+                    Log.Debug("     Ignoring blank after RAW");
+                } else {
+                    display.fillRect(tx, ty, tw, th, this._background);
+                }
+            } else if (subencoding & 0x01) {  // Raw
+                let pixels = tw * th;
+                // Max sure the image is fully opaque
+                for (let i = 0;i <  pixels;i++) {
+                    rQ[rQi + i * 4 + 3] = 255;
+                }
+                display.blitImage(tx, ty, tw, th, rQ, rQi);
+                rQi += bytes - 1;
+            } else {
+                if (subencoding & 0x02) {  // Background
+                    this._background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
+                    rQi += 4;
+                }
+                if (subencoding & 0x04) {  // Foreground
+                    this._foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
+                    rQi += 4;
+                }
+
+                this._startTile(tx, ty, tw, th, this._background);
+                if (subencoding & 0x08) {  // AnySubrects
+                    let subrects = rQ[rQi];
+                    rQi++;
+
+                    for (let s = 0; s < subrects; s++) {
+                        let color;
+                        if (subencoding & 0x10) {  // SubrectsColoured
+                            color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]];
+                            rQi += 4;
+                        } else {
+                            color = this._foreground;
+                        }
+                        const xy = rQ[rQi];
+                        rQi++;
+                        const sx = (xy >> 4);
+                        const sy = (xy & 0x0f);
+
+                        const wh = rQ[rQi];
+                        rQi++;
+                        const sw = (wh >> 4) + 1;
+                        const sh = (wh & 0x0f) + 1;
+
+                        this._subTile(sx, sy, sw, sh, color);
+                    }
+                }
+                this._finishTile(display);
+            }
+            sock.rQi = rQi;
+            this._lastsubencoding = subencoding;
+            this._tiles--;
+        }
+
+        return true;
+    }
+
+    // start updating a tile
+    _startTile(x, y, width, height, color) {
+        this._tileX = x;
+        this._tileY = y;
+        this._tileW = width;
+        this._tileH = height;
+
+        const red = color[0];
+        const green = color[1];
+        const blue = color[2];
+
+        const data = this._tileBuffer;
+        for (let i = 0; i < width * height * 4; i += 4) {
+            data[i]     = red;
+            data[i + 1] = green;
+            data[i + 2] = blue;
+            data[i + 3] = 255;
+        }
+    }
+
+    // update sub-rectangle of the current tile
+    _subTile(x, y, w, h, color) {
+        const red = color[0];
+        const green = color[1];
+        const blue = color[2];
+        const xend = x + w;
+        const yend = y + h;
+
+        const data = this._tileBuffer;
+        const width = this._tileW;
+        for (let j = y; j < yend; j++) {
+            for (let i = x; i < xend; i++) {
+                const p = (i + (j * width)) * 4;
+                data[p]     = red;
+                data[p + 1] = green;
+                data[p + 2] = blue;
+                data[p + 3] = 255;
+            }
+        }
+    }
+
+    // draw the current tile to the screen
+    _finishTile(display) {
+        display.blitImage(this._tileX, this._tileY,
+                          this._tileW, this._tileH,
+                          this._tileBuffer, 0);
+    }
+}
diff --git a/systemvm/agent/noVNC/core/decoders/raw.js b/systemvm/agent/noVNC/core/decoders/raw.js
new file mode 100644
index 0000000..e8ea178
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/raw.js
@@ -0,0 +1,66 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+export default class RawDecoder {
+    constructor() {
+        this._lines = 0;
+    }
+
+    decodeRect(x, y, width, height, sock, display, depth) {
+        if ((width === 0) || (height === 0)) {
+            return true;
+        }
+
+        if (this._lines === 0) {
+            this._lines = height;
+        }
+
+        const pixelSize = depth == 8 ? 1 : 4;
+        const bytesPerLine = width * pixelSize;
+
+        if (sock.rQwait("RAW", bytesPerLine)) {
+            return false;
+        }
+
+        const curY = y + (height - this._lines);
+        const currHeight = Math.min(this._lines,
+                                    Math.floor(sock.rQlen / bytesPerLine));
+        const pixels = width * currHeight;
+
+        let data = sock.rQ;
+        let index = sock.rQi;
+
+        // Convert data if needed
+        if (depth == 8) {
+            const newdata = new Uint8Array(pixels * 4);
+            for (let i = 0; i < pixels; i++) {
+                newdata[i * 4 + 0] = ((data[index + i] >> 0) & 0x3) * 255 / 3;
+                newdata[i * 4 + 1] = ((data[index + i] >> 2) & 0x3) * 255 / 3;
+                newdata[i * 4 + 2] = ((data[index + i] >> 4) & 0x3) * 255 / 3;
+                newdata[i * 4 + 3] = 255;
+            }
+            data = newdata;
+            index = 0;
+        }
+
+        // Max sure the image is fully opaque
+        for (let i = 0; i < pixels; i++) {
+            data[i * 4 + 3] = 255;
+        }
+
+        display.blitImage(x, curY, width, currHeight, data, index);
+        sock.rQskipBytes(currHeight * bytesPerLine);
+        this._lines -= currHeight;
+        if (this._lines > 0) {
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/systemvm/agent/noVNC/core/decoders/rre.js b/systemvm/agent/noVNC/core/decoders/rre.js
new file mode 100644
index 0000000..6219369
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/rre.js
@@ -0,0 +1,44 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+export default class RREDecoder {
+    constructor() {
+        this._subrects = 0;
+    }
+
+    decodeRect(x, y, width, height, sock, display, depth) {
+        if (this._subrects === 0) {
+            if (sock.rQwait("RRE", 4 + 4)) {
+                return false;
+            }
+
+            this._subrects = sock.rQshift32();
+
+            let color = sock.rQshiftBytes(4);  // Background
+            display.fillRect(x, y, width, height, color);
+        }
+
+        while (this._subrects > 0) {
+            if (sock.rQwait("RRE", 4 + 8)) {
+                return false;
+            }
+
+            let color = sock.rQshiftBytes(4);
+            let sx = sock.rQshift16();
+            let sy = sock.rQshift16();
+            let swidth = sock.rQshift16();
+            let sheight = sock.rQshift16();
+            display.fillRect(x + sx, y + sy, swidth, sheight, color);
+
+            this._subrects--;
+        }
+
+        return true;
+    }
+}
diff --git a/systemvm/agent/noVNC/core/decoders/tight.js b/systemvm/agent/noVNC/core/decoders/tight.js
new file mode 100644
index 0000000..7952707
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/tight.js
@@ -0,0 +1,331 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca)
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+import * as Log from '../util/logging.js';
+import Inflator from "../inflator.js";
+
+export default class TightDecoder {
+    constructor() {
+        this._ctl = null;
+        this._filter = null;
+        this._numColors = 0;
+        this._palette = new Uint8Array(1024);  // 256 * 4 (max palette size * max bytes-per-pixel)
+        this._len = 0;
+
+        this._zlibs = [];
+        for (let i = 0; i < 4; i++) {
+            this._zlibs[i] = new Inflator();
+        }
+    }
+
+    decodeRect(x, y, width, height, sock, display, depth) {
+        if (this._ctl === null) {
+            if (sock.rQwait("TIGHT compression-control", 1)) {
+                return false;
+            }
+
+            this._ctl = sock.rQshift8();
+
+            // Reset streams if the server requests it
+            for (let i = 0; i < 4; i++) {
+                if ((this._ctl >> i) & 1) {
+                    this._zlibs[i].reset();
+                    Log.Info("Reset zlib stream " + i);
+                }
+            }
+
+            // Figure out filter
+            this._ctl = this._ctl >> 4;
+        }
+
+        let ret;
+
+        if (this._ctl === 0x08) {
+            ret = this._fillRect(x, y, width, height,
+                                 sock, display, depth);
+        } else if (this._ctl === 0x09) {
+            ret = this._jpegRect(x, y, width, height,
+                                 sock, display, depth);
+        } else if (this._ctl === 0x0A) {
+            ret = this._pngRect(x, y, width, height,
+                                sock, display, depth);
+        } else if ((this._ctl & 0x08) == 0) {
+            ret = this._basicRect(this._ctl, x, y, width, height,
+                                  sock, display, depth);
+        } else {
+            throw new Error("Illegal tight compression received (ctl: " +
+                                   this._ctl + ")");
+        }
+
+        if (ret) {
+            this._ctl = null;
+        }
+
+        return ret;
+    }
+
+    _fillRect(x, y, width, height, sock, display, depth) {
+        if (sock.rQwait("TIGHT", 3)) {
+            return false;
+        }
+
+        const rQi = sock.rQi;
+        const rQ = sock.rQ;
+
+        display.fillRect(x, y, width, height,
+                         [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2]], false);
+        sock.rQskipBytes(3);
+
+        return true;
+    }
+
+    _jpegRect(x, y, width, height, sock, display, depth) {
+        let data = this._readData(sock);
+        if (data === null) {
+            return false;
+        }
+
+        display.imageRect(x, y, width, height, "image/jpeg", data);
+
+        return true;
+    }
+
+    _pngRect(x, y, width, height, sock, display, depth) {
+        throw new Error("PNG received in standard Tight rect");
+    }
+
+    _basicRect(ctl, x, y, width, height, sock, display, depth) {
+        if (this._filter === null) {
+            if (ctl & 0x4) {
+                if (sock.rQwait("TIGHT", 1)) {
+                    return false;
+                }
+
+                this._filter = sock.rQshift8();
+            } else {
+                // Implicit CopyFilter
+                this._filter = 0;
+            }
+        }
+
+        let streamId = ctl & 0x3;
+
+        let ret;
+
+        switch (this._filter) {
+            case 0: // CopyFilter
+                ret = this._copyFilter(streamId, x, y, width, height,
+                                       sock, display, depth);
+                break;
+            case 1: // PaletteFilter
+                ret = this._paletteFilter(streamId, x, y, width, height,
+                                          sock, display, depth);
+                break;
+            case 2: // GradientFilter
+                ret = this._gradientFilter(streamId, x, y, width, height,
+                                           sock, display, depth);
+                break;
+            default:
+                throw new Error("Illegal tight filter received (ctl: " +
+                                       this._filter + ")");
+        }
+
+        if (ret) {
+            this._filter = null;
+        }
+
+        return ret;
+    }
+
+    _copyFilter(streamId, x, y, width, height, sock, display, depth) {
+        const uncompressedSize = width * height * 3;
+        let data;
+
+        if (uncompressedSize === 0) {
+            return true;
+        }
+
+        if (uncompressedSize < 12) {
+            if (sock.rQwait("TIGHT", uncompressedSize)) {
+                return false;
+            }
+
+            data = sock.rQshiftBytes(uncompressedSize);
+        } else {
+            data = this._readData(sock);
+            if (data === null) {
+                return false;
+            }
+
+            this._zlibs[streamId].setInput(data);
+            data = this._zlibs[streamId].inflate(uncompressedSize);
+            this._zlibs[streamId].setInput(null);
+        }
+
+        let rgbx = new Uint8Array(width * height * 4);
+        for (let i = 0, j = 0; i < width * height * 4; i += 4, j += 3) {
+            rgbx[i]     = data[j];
+            rgbx[i + 1] = data[j + 1];
+            rgbx[i + 2] = data[j + 2];
+            rgbx[i + 3] = 255;  // Alpha
+        }
+
+        display.blitImage(x, y, width, height, rgbx, 0, false);
+
+        return true;
+    }
+
+    _paletteFilter(streamId, x, y, width, height, sock, display, depth) {
+        if (this._numColors === 0) {
+            if (sock.rQwait("TIGHT palette", 1)) {
+                return false;
+            }
+
+            const numColors = sock.rQpeek8() + 1;
+            const paletteSize = numColors * 3;
+
+            if (sock.rQwait("TIGHT palette", 1 + paletteSize)) {
+                return false;
+            }
+
+            this._numColors = numColors;
+            sock.rQskipBytes(1);
+
+            sock.rQshiftTo(this._palette, paletteSize);
+        }
+
+        const bpp = (this._numColors <= 2) ? 1 : 8;
+        const rowSize = Math.floor((width * bpp + 7) / 8);
+        const uncompressedSize = rowSize * height;
+
+        let data;
+
+        if (uncompressedSize === 0) {
+            return true;
+        }
+
+        if (uncompressedSize < 12) {
+            if (sock.rQwait("TIGHT", uncompressedSize)) {
+                return false;
+            }
+
+            data = sock.rQshiftBytes(uncompressedSize);
+        } else {
+            data = this._readData(sock);
+            if (data === null) {
+                return false;
+            }
+
+            this._zlibs[streamId].setInput(data);
+            data = this._zlibs[streamId].inflate(uncompressedSize);
+            this._zlibs[streamId].setInput(null);
+        }
+
+        // Convert indexed (palette based) image data to RGB
+        if (this._numColors == 2) {
+            this._monoRect(x, y, width, height, data, this._palette, display);
+        } else {
+            this._paletteRect(x, y, width, height, data, this._palette, display);
+        }
+
+        this._numColors = 0;
+
+        return true;
+    }
+
+    _monoRect(x, y, width, height, data, palette, display) {
+        // Convert indexed (palette based) image data to RGB
+        // TODO: reduce number of calculations inside loop
+        const dest = this._getScratchBuffer(width * height * 4);
+        const w = Math.floor((width + 7) / 8);
+        const w1 = Math.floor(width / 8);
+
+        for (let y = 0; y < height; y++) {
+            let dp, sp, x;
+            for (x = 0; x < w1; x++) {
+                for (let b = 7; b >= 0; b--) {
+                    dp = (y * width + x * 8 + 7 - b) * 4;
+                    sp = (data[y * w + x] >> b & 1) * 3;
+                    dest[dp]     = palette[sp];
+                    dest[dp + 1] = palette[sp + 1];
+                    dest[dp + 2] = palette[sp + 2];
+                    dest[dp + 3] = 255;
+                }
+            }
+
+            for (let b = 7; b >= 8 - width % 8; b--) {
+                dp = (y * width + x * 8 + 7 - b) * 4;
+                sp = (data[y * w + x] >> b & 1) * 3;
+                dest[dp]     = palette[sp];
+                dest[dp + 1] = palette[sp + 1];
+                dest[dp + 2] = palette[sp + 2];
+                dest[dp + 3] = 255;
+            }
+        }
+
+        display.blitImage(x, y, width, height, dest, 0, false);
+    }
+
+    _paletteRect(x, y, width, height, data, palette, display) {
+        // Convert indexed (palette based) image data to RGB
+        const dest = this._getScratchBuffer(width * height * 4);
+        const total = width * height * 4;
+        for (let i = 0, j = 0; i < total; i += 4, j++) {
+            const sp = data[j] * 3;
+            dest[i]     = palette[sp];
+            dest[i + 1] = palette[sp + 1];
+            dest[i + 2] = palette[sp + 2];
+            dest[i + 3] = 255;
+        }
+
+        display.blitImage(x, y, width, height, dest, 0, false);
+    }
+
+    _gradientFilter(streamId, x, y, width, height, sock, display, depth) {
+        throw new Error("Gradient filter not implemented");
+    }
+
+    _readData(sock) {
+        if (this._len === 0) {
+            if (sock.rQwait("TIGHT", 3)) {
+                return null;
+            }
+
+            let byte;
+
+            byte = sock.rQshift8();
+            this._len = byte & 0x7f;
+            if (byte & 0x80) {
+                byte = sock.rQshift8();
+                this._len |= (byte & 0x7f) << 7;
+                if (byte & 0x80) {
+                    byte = sock.rQshift8();
+                    this._len |= byte << 14;
+                }
+            }
+        }
+
+        if (sock.rQwait("TIGHT", this._len)) {
+            return null;
+        }
+
+        let data = sock.rQshiftBytes(this._len);
+        this._len = 0;
+
+        return data;
+    }
+
+    _getScratchBuffer(size) {
+        if (!this._scratchBuffer || (this._scratchBuffer.length < size)) {
+            this._scratchBuffer = new Uint8Array(size);
+        }
+        return this._scratchBuffer;
+    }
+}
diff --git a/systemvm/agent/noVNC/core/decoders/tightpng.js b/systemvm/agent/noVNC/core/decoders/tightpng.js
new file mode 100644
index 0000000..82f492d
--- /dev/null
+++ b/systemvm/agent/noVNC/core/decoders/tightpng.js
@@ -0,0 +1,27 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+import TightDecoder from './tight.js';
+
+export default class TightPNGDecoder extends TightDecoder {
+    _pngRect(x, y, width, height, sock, display, depth) {
+        let data = this._readData(sock);
+        if (data === null) {
+            return false;
+        }
+
+        display.imageRect(x, y, width, height, "image/png", data);
+
+        return true;
+    }
+
+    _basicRect(ctl, x, y, width, height, sock, display, depth) {
+        throw new Error("BasicCompression received in TightPNG rect");
+    }
+}
diff --git a/systemvm/agent/noVNC/core/deflator.js b/systemvm/agent/noVNC/core/deflator.js
new file mode 100644
index 0000000..fe2a8f7
--- /dev/null
+++ b/systemvm/agent/noVNC/core/deflator.js
@@ -0,0 +1,85 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import { deflateInit, deflate } from "../vendor/pako/lib/zlib/deflate.js";
+import { Z_FULL_FLUSH } from "../vendor/pako/lib/zlib/deflate.js";
+import ZStream from "../vendor/pako/lib/zlib/zstream.js";
+
+export default class Deflator {
+    constructor() {
+        this.strm = new ZStream();
+        this.chunkSize = 1024 * 10 * 10;
+        this.outputBuffer = new Uint8Array(this.chunkSize);
+        this.windowBits = 5;
+
+        deflateInit(this.strm, this.windowBits);
+    }
+
+    deflate(inData) {
+        /* eslint-disable camelcase */
+        this.strm.input = inData;
+        this.strm.avail_in = this.strm.input.length;
+        this.strm.next_in = 0;
+        this.strm.output = this.outputBuffer;
+        this.strm.avail_out = this.chunkSize;
+        this.strm.next_out = 0;
+        /* eslint-enable camelcase */
+
+        let lastRet = deflate(this.strm, Z_FULL_FLUSH);
+        let outData = new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
+
+        if (lastRet < 0) {
+            throw new Error("zlib deflate failed");
+        }
+
+        if (this.strm.avail_in > 0) {
+            // Read chunks until done
+
+            let chunks = [outData];
+            let totalLen = outData.length;
+            do {
+                /* eslint-disable camelcase */
+                this.strm.output = new Uint8Array(this.chunkSize);
+                this.strm.next_out = 0;
+                this.strm.avail_out = this.chunkSize;
+                /* eslint-enable camelcase */
+
+                lastRet = deflate(this.strm, Z_FULL_FLUSH);
+
+                if (lastRet < 0) {
+                    throw new Error("zlib deflate failed");
+                }
+
+                let chunk = new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
+                totalLen += chunk.length;
+                chunks.push(chunk);
+            } while (this.strm.avail_in > 0);
+
+            // Combine chunks into a single data
+
+            let newData = new Uint8Array(totalLen);
+            let offset = 0;
+
+            for (let i = 0; i < chunks.length; i++) {
+                newData.set(chunks[i], offset);
+                offset += chunks[i].length;
+            }
+
+            outData = newData;
+        }
+
+        /* eslint-disable camelcase */
+        this.strm.input = null;
+        this.strm.avail_in = 0;
+        this.strm.next_in = 0;
+        /* eslint-enable camelcase */
+
+        return outData;
+    }
+
+}
diff --git a/systemvm/agent/noVNC/core/des.js b/systemvm/agent/noVNC/core/des.js
new file mode 100644
index 0000000..d2f807b
--- /dev/null
+++ b/systemvm/agent/noVNC/core/des.js
@@ -0,0 +1,266 @@
+/*
+ * Ported from Flashlight VNC ActionScript implementation:
+ *     http://www.wizhelp.com/flashlight-vnc/
+ *
+ * Full attribution follows:
+ *
+ * -------------------------------------------------------------------------
+ *
+ * This DES class has been extracted from package Acme.Crypto for use in VNC.
+ * The unnecessary odd parity code has been removed.
+ *
+ * These changes are:
+ *  Copyright (C) 1999 AT&T Laboratories Cambridge.  All Rights Reserved.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+
+ * DesCipher - the DES encryption method
+ *
+ * The meat of this code is by Dave Zimmerman <dzimm@widget.com>, and is:
+ *
+ * Copyright (c) 1996 Widget Workshop, Inc. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
+ * without fee is hereby granted, provided that this copyright notice is kept
+ * intact.
+ *
+ * WIDGET WORKSHOP MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
+ * OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. WIDGET WORKSHOP SHALL NOT BE LIABLE
+ * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
+ * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
+ * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
+ * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
+ * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
+ * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
+ * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  WIDGET WORKSHOP
+ * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
+ * HIGH RISK ACTIVITIES.
+ *
+ *
+ * The rest is:
+ *
+ * Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * Visit the ACME Labs Java page for up-to-date versions of this and other
+ * fine Java utilities: http://www.acme.com/java/
+ */
+
+/* eslint-disable comma-spacing */
+
+// Tables, permutations, S-boxes, etc.
+const PC2 = [13,16,10,23, 0, 4, 2,27,14, 5,20, 9,22,18,11, 3,
+             25, 7,15, 6,26,19,12, 1,40,51,30,36,46,54,29,39,
+             50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31 ],
+    totrot = [ 1, 2, 4, 6, 8,10,12,14,15,17,19,21,23,25,27,28];
+
+const z = 0x0;
+let a,b,c,d,e,f;
+a=1<<16; b=1<<24; c=a|b; d=1<<2; e=1<<10; f=d|e;
+const SP1 = [c|e,z|z,a|z,c|f,c|d,a|f,z|d,a|z,z|e,c|e,c|f,z|e,b|f,c|d,b|z,z|d,
+             z|f,b|e,b|e,a|e,a|e,c|z,c|z,b|f,a|d,b|d,b|d,a|d,z|z,z|f,a|f,b|z,
+             a|z,c|f,z|d,c|z,c|e,b|z,b|z,z|e,c|d,a|z,a|e,b|d,z|e,z|d,b|f,a|f,
+             c|f,a|d,c|z,b|f,b|d,z|f,a|f,c|e,z|f,b|e,b|e,z|z,a|d,a|e,z|z,c|d];
+a=1<<20; b=1<<31; c=a|b; d=1<<5; e=1<<15; f=d|e;
+const SP2 = [c|f,b|e,z|e,a|f,a|z,z|d,c|d,b|f,b|d,c|f,c|e,b|z,b|e,a|z,z|d,c|d,
+             a|e,a|d,b|f,z|z,b|z,z|e,a|f,c|z,a|d,b|d,z|z,a|e,z|f,c|e,c|z,z|f,
+             z|z,a|f,c|d,a|z,b|f,c|z,c|e,z|e,c|z,b|e,z|d,c|f,a|f,z|d,z|e,b|z,
+             z|f,c|e,a|z,b|d,a|d,b|f,b|d,a|d,a|e,z|z,b|e,z|f,b|z,c|d,c|f,a|e];
+a=1<<17; b=1<<27; c=a|b; d=1<<3; e=1<<9; f=d|e;
+const SP3 = [z|f,c|e,z|z,c|d,b|e,z|z,a|f,b|e,a|d,b|d,b|d,a|z,c|f,a|d,c|z,z|f,
+             b|z,z|d,c|e,z|e,a|e,c|z,c|d,a|f,b|f,a|e,a|z,b|f,z|d,c|f,z|e,b|z,
+             c|e,b|z,a|d,z|f,a|z,c|e,b|e,z|z,z|e,a|d,c|f,b|e,b|d,z|e,z|z,c|d,
+             b|f,a|z,b|z,c|f,z|d,a|f,a|e,b|d,c|z,b|f,z|f,c|z,a|f,z|d,c|d,a|e];
+a=1<<13; b=1<<23; c=a|b; d=1<<0; e=1<<7; f=d|e;
+const SP4 = [c|d,a|f,a|f,z|e,c|e,b|f,b|d,a|d,z|z,c|z,c|z,c|f,z|f,z|z,b|e,b|d,
+             z|d,a|z,b|z,c|d,z|e,b|z,a|d,a|e,b|f,z|d,a|e,b|e,a|z,c|e,c|f,z|f,
+             b|e,b|d,c|z,c|f,z|f,z|z,z|z,c|z,a|e,b|e,b|f,z|d,c|d,a|f,a|f,z|e,
+             c|f,z|f,z|d,a|z,b|d,a|d,c|e,b|f,a|d,a|e,b|z,c|d,z|e,b|z,a|z,c|e];
+a=1<<25; b=1<<30; c=a|b; d=1<<8; e=1<<19; f=d|e;
+const SP5 = [z|d,a|f,a|e,c|d,z|e,z|d,b|z,a|e,b|f,z|e,a|d,b|f,c|d,c|e,z|f,b|z,
+             a|z,b|e,b|e,z|z,b|d,c|f,c|f,a|d,c|e,b|d,z|z,c|z,a|f,a|z,c|z,z|f,
+             z|e,c|d,z|d,a|z,b|z,a|e,c|d,b|f,a|d,b|z,c|e,a|f,b|f,z|d,a|z,c|e,
+             c|f,z|f,c|z,c|f,a|e,z|z,b|e,c|z,z|f,a|d,b|d,z|e,z|z,b|e,a|f,b|d];
+a=1<<22; b=1<<29; c=a|b; d=1<<4; e=1<<14; f=d|e;
+const SP6 = [b|d,c|z,z|e,c|f,c|z,z|d,c|f,a|z,b|e,a|f,a|z,b|d,a|d,b|e,b|z,z|f,
+             z|z,a|d,b|f,z|e,a|e,b|f,z|d,c|d,c|d,z|z,a|f,c|e,z|f,a|e,c|e,b|z,
+             b|e,z|d,c|d,a|e,c|f,a|z,z|f,b|d,a|z,b|e,b|z,z|f,b|d,c|f,a|e,c|z,
+             a|f,c|e,z|z,c|d,z|d,z|e,c|z,a|f,z|e,a|d,b|f,z|z,c|e,b|z,a|d,b|f];
+a=1<<21; b=1<<26; c=a|b; d=1<<1; e=1<<11; f=d|e;
+const SP7 = [a|z,c|d,b|f,z|z,z|e,b|f,a|f,c|e,c|f,a|z,z|z,b|d,z|d,b|z,c|d,z|f,
+             b|e,a|f,a|d,b|e,b|d,c|z,c|e,a|d,c|z,z|e,z|f,c|f,a|e,z|d,b|z,a|e,
+             b|z,a|e,a|z,b|f,b|f,c|d,c|d,z|d,a|d,b|z,b|e,a|z,c|e,z|f,a|f,c|e,
+             z|f,b|d,c|f,c|z,a|e,z|z,z|d,c|f,z|z,a|f,c|z,z|e,b|d,b|e,z|e,a|d];
+a=1<<18; b=1<<28; c=a|b; d=1<<6; e=1<<12; f=d|e;
+const SP8 = [b|f,z|e,a|z,c|f,b|z,b|f,z|d,b|z,a|d,c|z,c|f,a|e,c|e,a|f,z|e,z|d,
+             c|z,b|d,b|e,z|f,a|e,a|d,c|d,c|e,z|f,z|z,z|z,c|d,b|d,b|e,a|f,a|z,
+             a|f,a|z,c|e,z|e,z|d,c|d,z|e,a|f,b|e,z|d,b|d,c|z,c|d,b|z,a|z,b|f,
+             z|z,c|f,a|d,b|d,c|z,b|e,b|f,z|z,c|f,a|e,a|e,z|f,z|f,a|d,b|z,c|e];
+
+/* eslint-enable comma-spacing */
+
+export default class DES {
+    constructor(password) {
+        this.keys = [];
+
+        // Set the key.
+        const pc1m = [], pcr = [], kn = [];
+
+        for (let j = 0, l = 56; j < 56; ++j, l -= 8) {
+            l += l < -5 ? 65 : l < -3 ? 31 : l < -1 ? 63 : l === 27 ? 35 : 0; // PC1
+            const m = l & 0x7;
+            pc1m[j] = ((password[l >>> 3] & (1<<m)) !== 0) ? 1: 0;
+        }
+
+        for (let i = 0; i < 16; ++i) {
+            const m = i << 1;
+            const n = m + 1;
+            kn[m] = kn[n] = 0;
+            for (let o = 28; o < 59; o += 28) {
+                for (let j = o - 28; j < o; ++j) {
+                    const l = j + totrot[i];
+                    pcr[j] = l < o ? pc1m[l] : pc1m[l - 28];
+                }
+            }
+            for (let j = 0; j < 24; ++j) {
+                if (pcr[PC2[j]] !== 0) {
+                    kn[m] |= 1 << (23 - j);
+                }
+                if (pcr[PC2[j + 24]] !== 0) {
+                    kn[n] |= 1 << (23 - j);
+                }
+            }
+        }
+
+        // cookey
+        for (let i = 0, rawi = 0, KnLi = 0; i < 16; ++i) {
+            const raw0 = kn[rawi++];
+            const raw1 = kn[rawi++];
+            this.keys[KnLi] = (raw0 & 0x00fc0000) << 6;
+            this.keys[KnLi] |= (raw0 & 0x00000fc0) << 10;
+            this.keys[KnLi] |= (raw1 & 0x00fc0000) >>> 10;
+            this.keys[KnLi] |= (raw1 & 0x00000fc0) >>> 6;
+            ++KnLi;
+            this.keys[KnLi] = (raw0 & 0x0003f000) << 12;
+            this.keys[KnLi] |= (raw0 & 0x0000003f) << 16;
+            this.keys[KnLi] |= (raw1 & 0x0003f000) >>> 4;
+            this.keys[KnLi] |= (raw1 & 0x0000003f);
+            ++KnLi;
+        }
+    }
+
+    // Encrypt 8 bytes of text
+    enc8(text) {
+        const b = text.slice();
+        let i = 0, l, r, x; // left, right, accumulator
+
+        // Squash 8 bytes to 2 ints
+        l = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
+        r = b[i++]<<24 | b[i++]<<16 | b[i++]<<8 | b[i++];
+
+        x = ((l >>> 4) ^ r) & 0x0f0f0f0f;
+        r ^= x;
+        l ^= (x << 4);
+        x = ((l >>> 16) ^ r) & 0x0000ffff;
+        r ^= x;
+        l ^= (x << 16);
+        x = ((r >>> 2) ^ l) & 0x33333333;
+        l ^= x;
+        r ^= (x << 2);
+        x = ((r >>> 8) ^ l) & 0x00ff00ff;
+        l ^= x;
+        r ^= (x << 8);
+        r = (r << 1) | ((r >>> 31) & 1);
+        x = (l ^ r) & 0xaaaaaaaa;
+        l ^= x;
+        r ^= x;
+        l = (l << 1) | ((l >>> 31) & 1);
+
+        for (let i = 0, keysi = 0; i < 8; ++i) {
+            x = (r << 28) | (r >>> 4);
+            x ^= this.keys[keysi++];
+            let fval =  SP7[x & 0x3f];
+            fval |= SP5[(x >>> 8) & 0x3f];
+            fval |= SP3[(x >>> 16) & 0x3f];
+            fval |= SP1[(x >>> 24) & 0x3f];
+            x = r ^ this.keys[keysi++];
+            fval |= SP8[x & 0x3f];
+            fval |= SP6[(x >>> 8) & 0x3f];
+            fval |= SP4[(x >>> 16) & 0x3f];
+            fval |= SP2[(x >>> 24) & 0x3f];
+            l ^= fval;
+            x = (l << 28) | (l >>> 4);
+            x ^= this.keys[keysi++];
+            fval =  SP7[x & 0x3f];
+            fval |= SP5[(x >>> 8) & 0x3f];
+            fval |= SP3[(x >>> 16) & 0x3f];
+            fval |= SP1[(x >>> 24) & 0x3f];
+            x = l ^ this.keys[keysi++];
+            fval |= SP8[x & 0x0000003f];
+            fval |= SP6[(x >>> 8) & 0x3f];
+            fval |= SP4[(x >>> 16) & 0x3f];
+            fval |= SP2[(x >>> 24) & 0x3f];
+            r ^= fval;
+        }
+
+        r = (r << 31) | (r >>> 1);
+        x = (l ^ r) & 0xaaaaaaaa;
+        l ^= x;
+        r ^= x;
+        l = (l << 31) | (l >>> 1);
+        x = ((l >>> 8) ^ r) & 0x00ff00ff;
+        r ^= x;
+        l ^= (x << 8);
+        x = ((l >>> 2) ^ r) & 0x33333333;
+        r ^= x;
+        l ^= (x << 2);
+        x = ((r >>> 16) ^ l) & 0x0000ffff;
+        l ^= x;
+        r ^= (x << 16);
+        x = ((r >>> 4) ^ l) & 0x0f0f0f0f;
+        l ^= x;
+        r ^= (x << 4);
+
+        // Spread ints to bytes
+        x = [r, l];
+        for (i = 0; i < 8; i++) {
+            b[i] = (x[i>>>2] >>> (8 * (3 - (i % 4)))) % 256;
+            if (b[i] < 0) { b[i] += 256; } // unsigned
+        }
+        return b;
+    }
+
+    // Encrypt 16 bytes of text using passwd as key
+    encrypt(t) {
+        return this.enc8(t.slice(0, 8)).concat(this.enc8(t.slice(8, 16)));
+    }
+}
diff --git a/systemvm/agent/noVNC/core/display.js b/systemvm/agent/noVNC/core/display.js
new file mode 100644
index 0000000..8eaa800
--- /dev/null
+++ b/systemvm/agent/noVNC/core/display.js
@@ -0,0 +1,526 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import * as Log from './util/logging.js';
+import Base64 from "./base64.js";
+import { supportsImageMetadata } from './util/browser.js';
+import { toSigned32bit } from './util/int.js';
+
+export default class Display {
+    constructor(target) {
+        this._drawCtx = null;
+
+        this._renderQ = [];  // queue drawing actions for in-oder rendering
+        this._flushing = false;
+
+        // the full frame buffer (logical canvas) size
+        this._fbWidth = 0;
+        this._fbHeight = 0;
+
+        this._prevDrawStyle = "";
+
+        Log.Debug(">> Display.constructor");
+
+        // The visible canvas
+        this._target = target;
+
+        if (!this._target) {
+            throw new Error("Target must be set");
+        }
+
+        if (typeof this._target === 'string') {
+            throw new Error('target must be a DOM element');
+        }
+
+        if (!this._target.getContext) {
+            throw new Error("no getContext method");
+        }
+
+        this._targetCtx = this._target.getContext('2d');
+
+        // the visible canvas viewport (i.e. what actually gets seen)
+        this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height };
+
+        // The hidden canvas, where we do the actual rendering
+        this._backbuffer = document.createElement('canvas');
+        this._drawCtx = this._backbuffer.getContext('2d');
+
+        this._damageBounds = { left: 0, top: 0,
+                               right: this._backbuffer.width,
+                               bottom: this._backbuffer.height };
+
+        Log.Debug("User Agent: " + navigator.userAgent);
+
+        // Check canvas features
+        if (!('createImageData' in this._drawCtx)) {
+            throw new Error("Canvas does not support createImageData");
+        }
+
+        Log.Debug("<< Display.constructor");
+
+        // ===== PROPERTIES =====
+
+        this._scale = 1.0;
+        this._clipViewport = false;
+
+        // ===== EVENT HANDLERS =====
+
+        this.onflush = () => {}; // A flush request has finished
+    }
+
+    // ===== PROPERTIES =====
+
+    get scale() { return this._scale; }
+    set scale(scale) {
+        this._rescale(scale);
+    }
+
+    get clipViewport() { return this._clipViewport; }
+    set clipViewport(viewport) {
+        this._clipViewport = viewport;
+        // May need to readjust the viewport dimensions
+        const vp = this._viewportLoc;
+        this.viewportChangeSize(vp.w, vp.h);
+        this.viewportChangePos(0, 0);
+    }
+
+    get width() {
+        return this._fbWidth;
+    }
+
+    get height() {
+        return this._fbHeight;
+    }
+
+    // ===== PUBLIC METHODS =====
+
+    viewportChangePos(deltaX, deltaY) {
+        const vp = this._viewportLoc;
+        deltaX = Math.floor(deltaX);
+        deltaY = Math.floor(deltaY);
+
+        if (!this._clipViewport) {
+            deltaX = -vp.w;  // clamped later of out of bounds
+            deltaY = -vp.h;
+        }
+
+        const vx2 = vp.x + vp.w - 1;
+        const vy2 = vp.y + vp.h - 1;
+
+        // Position change
+
+        if (deltaX < 0 && vp.x + deltaX < 0) {
+            deltaX = -vp.x;
+        }
+        if (vx2 + deltaX >= this._fbWidth) {
+            deltaX -= vx2 + deltaX - this._fbWidth + 1;
+        }
+
+        if (vp.y + deltaY < 0) {
+            deltaY = -vp.y;
+        }
+        if (vy2 + deltaY >= this._fbHeight) {
+            deltaY -= (vy2 + deltaY - this._fbHeight + 1);
+        }
+
+        if (deltaX === 0 && deltaY === 0) {
+            return;
+        }
+        Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY);
+
+        vp.x += deltaX;
+        vp.y += deltaY;
+
+        this._damage(vp.x, vp.y, vp.w, vp.h);
+
+        this.flip();
+    }
+
+    viewportChangeSize(width, height) {
+
+        if (!this._clipViewport ||
+            typeof(width) === "undefined" ||
+            typeof(height) === "undefined") {
+
+            Log.Debug("Setting viewport to full display region");
+            width = this._fbWidth;
+            height = this._fbHeight;
+        }
+
+        width = Math.floor(width);
+        height = Math.floor(height);
+
+        if (width > this._fbWidth) {
+            width = this._fbWidth;
+        }
+        if (height > this._fbHeight) {
+            height = this._fbHeight;
+        }
+
+        const vp = this._viewportLoc;
+        if (vp.w !== width || vp.h !== height) {
+            vp.w = width;
+            vp.h = height;
+
+            const canvas = this._target;
+            canvas.width = width;
+            canvas.height = height;
+
+            // The position might need to be updated if we've grown
+            this.viewportChangePos(0, 0);
+
+            this._damage(vp.x, vp.y, vp.w, vp.h);
+            this.flip();
+
+            // Update the visible size of the target canvas
+            this._rescale(this._scale);
+        }
+    }
+
+    absX(x) {
+        if (this._scale === 0) {
+            return 0;
+        }
+        return toSigned32bit(x / this._scale + this._viewportLoc.x);
+    }
+
+    absY(y) {
+        if (this._scale === 0) {
+            return 0;
+        }
+        return toSigned32bit(y / this._scale + this._viewportLoc.y);
+    }
+
+    resize(width, height) {
+        this._prevDrawStyle = "";
+
+        this._fbWidth = width;
+        this._fbHeight = height;
+
+        const canvas = this._backbuffer;
+        if (canvas.width !== width || canvas.height !== height) {
+
+            // We have to save the canvas data since changing the size will clear it
+            let saveImg = null;
+            if (canvas.width > 0 && canvas.height > 0) {
+                saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height);
+            }
+
+            if (canvas.width !== width) {
+                canvas.width = width;
+            }
+            if (canvas.height !== height) {
+                canvas.height = height;
+            }
+
+            if (saveImg) {
+                this._drawCtx.putImageData(saveImg, 0, 0);
+            }
+        }
+
+        // Readjust the viewport as it may be incorrectly sized
+        // and positioned
+        const vp = this._viewportLoc;
+        this.viewportChangeSize(vp.w, vp.h);
+        this.viewportChangePos(0, 0);
+    }
+
+    // Track what parts of the visible canvas that need updating
+    _damage(x, y, w, h) {
+        if (x < this._damageBounds.left) {
+            this._damageBounds.left = x;
+        }
+        if (y < this._damageBounds.top) {
+            this._damageBounds.top = y;
+        }
+        if ((x + w) > this._damageBounds.right) {
+            this._damageBounds.right = x + w;
+        }
+        if ((y + h) > this._damageBounds.bottom) {
+            this._damageBounds.bottom = y + h;
+        }
+    }
+
+    // Update the visible canvas with the contents of the
+    // rendering canvas
+    flip(fromQueue) {
+        if (this._renderQ.length !== 0 && !fromQueue) {
+            this._renderQPush({
+                'type': 'flip'
+            });
+        } else {
+            let x = this._damageBounds.left;
+            let y = this._damageBounds.top;
+            let w = this._damageBounds.right - x;
+            let h = this._damageBounds.bottom - y;
+
+            let vx = x - this._viewportLoc.x;
+            let vy = y - this._viewportLoc.y;
+
+            if (vx < 0) {
+                w += vx;
+                x -= vx;
+                vx = 0;
+            }
+            if (vy < 0) {
+                h += vy;
+                y -= vy;
+                vy = 0;
+            }
+
+            if ((vx + w) > this._viewportLoc.w) {
+                w = this._viewportLoc.w - vx;
+            }
+            if ((vy + h) > this._viewportLoc.h) {
+                h = this._viewportLoc.h - vy;
+            }
+
+            if ((w > 0) && (h > 0)) {
+                // FIXME: We may need to disable image smoothing here
+                //        as well (see copyImage()), but we haven't
+                //        noticed any problem yet.
+                this._targetCtx.drawImage(this._backbuffer,
+                                          x, y, w, h,
+                                          vx, vy, w, h);
+            }
+
+            this._damageBounds.left = this._damageBounds.top = 65535;
+            this._damageBounds.right = this._damageBounds.bottom = 0;
+        }
+    }
+
+    pending() {
+        return this._renderQ.length > 0;
+    }
+
+    flush() {
+        if (this._renderQ.length === 0) {
+            this.onflush();
+        } else {
+            this._flushing = true;
+        }
+    }
+
+    fillRect(x, y, width, height, color, fromQueue) {
+        if (this._renderQ.length !== 0 && !fromQueue) {
+            this._renderQPush({
+                'type': 'fill',
+                'x': x,
+                'y': y,
+                'width': width,
+                'height': height,
+                'color': color
+            });
+        } else {
+            this._setFillColor(color);
+            this._drawCtx.fillRect(x, y, width, height);
+            this._damage(x, y, width, height);
+        }
+    }
+
+    copyImage(oldX, oldY, newX, newY, w, h, fromQueue) {
+        if (this._renderQ.length !== 0 && !fromQueue) {
+            this._renderQPush({
+                'type': 'copy',
+                'oldX': oldX,
+                'oldY': oldY,
+                'x': newX,
+                'y': newY,
+                'width': w,
+                'height': h,
+            });
+        } else {
+            // Due to this bug among others [1] we need to disable the image-smoothing to
+            // avoid getting a blur effect when copying data.
+            //
+            // 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719
+            //
+            // We need to set these every time since all properties are reset
+            // when the the size is changed
+            this._drawCtx.mozImageSmoothingEnabled = false;
+            this._drawCtx.webkitImageSmoothingEnabled = false;
+            this._drawCtx.msImageSmoothingEnabled = false;
+            this._drawCtx.imageSmoothingEnabled = false;
+
+            this._drawCtx.drawImage(this._backbuffer,
+                                    oldX, oldY, w, h,
+                                    newX, newY, w, h);
+            this._damage(newX, newY, w, h);
+        }
+    }
+
+    imageRect(x, y, width, height, mime, arr) {
+        /* The internal logic cannot handle empty images, so bail early */
+        if ((width === 0) || (height === 0)) {
+            return;
+        }
+
+        const img = new Image();
+        img.src = "data: " + mime + ";base64," + Base64.encode(arr);
+
+        this._renderQPush({
+            'type': 'img',
+            'img': img,
+            'x': x,
+            'y': y,
+            'width': width,
+            'height': height
+        });
+    }
+
+    blitImage(x, y, width, height, arr, offset, fromQueue) {
+        if (this._renderQ.length !== 0 && !fromQueue) {
+            // NB(directxman12): it's technically more performant here to use preallocated arrays,
+            // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
+            // this probably isn't getting called *nearly* as much
+            const newArr = new Uint8Array(width * height * 4);
+            newArr.set(new Uint8Array(arr.buffer, 0, newArr.length));
+            this._renderQPush({
+                'type': 'blit',
+                'data': newArr,
+                'x': x,
+                'y': y,
+                'width': width,
+                'height': height,
+            });
+        } else {
+            // NB(directxman12): arr must be an Type Array view
+            let data = new Uint8ClampedArray(arr.buffer,
+                                             arr.byteOffset + offset,
+                                             width * height * 4);
+            let img;
+            if (supportsImageMetadata) {
+                img = new ImageData(data, width, height);
+            } else {
+                img = this._drawCtx.createImageData(width, height);
+                img.data.set(data);
+            }
+            this._drawCtx.putImageData(img, x, y);
+            this._damage(x, y, width, height);
+        }
+    }
+
+    drawImage(img, x, y) {
+        this._drawCtx.drawImage(img, x, y);
+        this._damage(x, y, img.width, img.height);
+    }
+
+    autoscale(containerWidth, containerHeight) {
+        let scaleRatio;
+
+        if (containerWidth === 0 || containerHeight === 0) {
+            scaleRatio = 0;
+
+        } else {
+
+            const vp = this._viewportLoc;
+            const targetAspectRatio = containerWidth / containerHeight;
+            const fbAspectRatio = vp.w / vp.h;
+
+            if (fbAspectRatio >= targetAspectRatio) {
+                scaleRatio = containerWidth / vp.w;
+            } else {
+                scaleRatio = containerHeight / vp.h;
+            }
+        }
+
+        this._rescale(scaleRatio);
+    }
+
+    // ===== PRIVATE METHODS =====
+
+    _rescale(factor) {
+        this._scale = factor;
+        const vp = this._viewportLoc;
+
+        // NB(directxman12): If you set the width directly, or set the
+        //                   style width to a number, the canvas is cleared.
+        //                   However, if you set the style width to a string
+        //                   ('NNNpx'), the canvas is scaled without clearing.
+        const width = factor * vp.w + 'px';
+        const height = factor * vp.h + 'px';
+
+        if ((this._target.style.width !== width) ||
+            (this._target.style.height !== height)) {
+            this._target.style.width = width;
+            this._target.style.height = height;
+        }
+    }
+
+    _setFillColor(color) {
+        const newStyle = 'rgb(' + color[0] + ',' + color[1] + ',' + color[2] + ')';
+        if (newStyle !== this._prevDrawStyle) {
+            this._drawCtx.fillStyle = newStyle;
+            this._prevDrawStyle = newStyle;
+        }
+    }
+
+    _renderQPush(action) {
+        this._renderQ.push(action);
+        if (this._renderQ.length === 1) {
+            // If this can be rendered immediately it will be, otherwise
+            // the scanner will wait for the relevant event
+            this._scanRenderQ();
+        }
+    }
+
+    _resumeRenderQ() {
+        // "this" is the object that is ready, not the
+        // display object
+        this.removeEventListener('load', this._noVNCDisplay._resumeRenderQ);
+        this._noVNCDisplay._scanRenderQ();
+    }
+
+    _scanRenderQ() {
+        let ready = true;
+        while (ready && this._renderQ.length > 0) {
+            const a = this._renderQ[0];
+            switch (a.type) {
+                case 'flip':
+                    this.flip(true);
+                    break;
+                case 'copy':
+                    this.copyImage(a.oldX, a.oldY, a.x, a.y, a.width, a.height, true);
+                    break;
+                case 'fill':
+                    this.fillRect(a.x, a.y, a.width, a.height, a.color, true);
+                    break;
+                case 'blit':
+                    this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true);
+                    break;
+                case 'img':
+                    /* IE tends to set "complete" prematurely, so check dimensions */
+                    if (a.img.complete && (a.img.width !== 0) && (a.img.height !== 0)) {
+                        if (a.img.width !== a.width || a.img.height !== a.height) {
+                            Log.Error("Decoded image has incorrect dimensions. Got " +
+                                      a.img.width + "x" + a.img.height + ". Expected " +
+                                      a.width + "x" + a.height + ".");
+                            return;
+                        }
+                        this.drawImage(a.img, a.x, a.y);
+                    } else {
+                        a.img._noVNCDisplay = this;
+                        a.img.addEventListener('load', this._resumeRenderQ);
+                        // We need to wait for this image to 'load'
+                        // to keep things in-order
+                        ready = false;
+                    }
+                    break;
+            }
+
+            if (ready) {
+                this._renderQ.shift();
+            }
+        }
+
+        if (this._renderQ.length === 0 && this._flushing) {
+            this._flushing = false;
+            this.onflush();
+        }
+    }
+}
diff --git a/systemvm/agent/noVNC/core/encodings.js b/systemvm/agent/noVNC/core/encodings.js
new file mode 100644
index 0000000..51c0992
--- /dev/null
+++ b/systemvm/agent/noVNC/core/encodings.js
@@ -0,0 +1,44 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+export const encodings = {
+    encodingRaw: 0,
+    encodingCopyRect: 1,
+    encodingRRE: 2,
+    encodingHextile: 5,
+    encodingTight: 7,
+    encodingTightPNG: -260,
+
+    pseudoEncodingQualityLevel9: -23,
+    pseudoEncodingQualityLevel0: -32,
+    pseudoEncodingDesktopSize: -223,
+    pseudoEncodingLastRect: -224,
+    pseudoEncodingCursor: -239,
+    pseudoEncodingQEMUExtendedKeyEvent: -258,
+    pseudoEncodingDesktopName: -307,
+    pseudoEncodingExtendedDesktopSize: -308,
+    pseudoEncodingXvp: -309,
+    pseudoEncodingFence: -312,
+    pseudoEncodingContinuousUpdates: -313,
+    pseudoEncodingCompressLevel9: -247,
+    pseudoEncodingCompressLevel0: -256,
+    pseudoEncodingVMwareCursor: 0x574d5664,
+    pseudoEncodingExtendedClipboard: 0xc0a1e5ce
+};
+
+export function encodingName(num) {
+    switch (num) {
+        case encodings.encodingRaw:      return "Raw";
+        case encodings.encodingCopyRect: return "CopyRect";
+        case encodings.encodingRRE:      return "RRE";
+        case encodings.encodingHextile:  return "Hextile";
+        case encodings.encodingTight:    return "Tight";
+        case encodings.encodingTightPNG: return "TightPNG";
+        default:                         return "[unknown encoding " + num + "]";
+    }
+}
diff --git a/systemvm/agent/noVNC/core/inflator.js b/systemvm/agent/noVNC/core/inflator.js
new file mode 100644
index 0000000..4b33760
--- /dev/null
+++ b/systemvm/agent/noVNC/core/inflator.js
@@ -0,0 +1,66 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+import { inflateInit, inflate, inflateReset } from "../vendor/pako/lib/zlib/inflate.js";
+import ZStream from "../vendor/pako/lib/zlib/zstream.js";
+
+export default class Inflate {
+    constructor() {
+        this.strm = new ZStream();
+        this.chunkSize = 1024 * 10 * 10;
+        this.strm.output = new Uint8Array(this.chunkSize);
+        this.windowBits = 5;
+
+        inflateInit(this.strm, this.windowBits);
+    }
+
+    setInput(data) {
+        if (!data) {
+            //FIXME: flush remaining data.
+            /* eslint-disable camelcase */
+            this.strm.input = null;
+            this.strm.avail_in = 0;
+            this.strm.next_in = 0;
+        } else {
+            this.strm.input = data;
+            this.strm.avail_in = this.strm.input.length;
+            this.strm.next_in = 0;
+            /* eslint-enable camelcase */
+        }
+    }
+
+    inflate(expected) {
+        // resize our output buffer if it's too small
+        // (we could just use multiple chunks, but that would cause an extra
+        // allocation each time to flatten the chunks)
+        if (expected > this.chunkSize) {
+            this.chunkSize = expected;
+            this.strm.output = new Uint8Array(this.chunkSize);
+        }
+
+        /* eslint-disable camelcase */
+        this.strm.next_out = 0;
+        this.strm.avail_out = expected;
+        /* eslint-enable camelcase */
+
+        let ret = inflate(this.strm, 0); // Flush argument not used.
+        if (ret < 0) {
+            throw new Error("zlib inflate failed");
+        }
+
+        if (this.strm.next_out != expected) {
+            throw new Error("Incomplete zlib block");
+        }
+
+        return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out);
+    }
+
+    reset() {
+        inflateReset(this.strm);
+    }
+}
diff --git a/systemvm/agent/noVNC/core/input/domkeytable.js b/systemvm/agent/noVNC/core/input/domkeytable.js
new file mode 100644
index 0000000..b84ad45
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/domkeytable.js
@@ -0,0 +1,307 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2018 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+import KeyTable from "./keysym.js";
+
+/*
+ * Mapping between HTML key values and VNC/X11 keysyms for "special"
+ * keys that cannot be handled via their Unicode codepoint.
+ *
+ * See https://www.w3.org/TR/uievents-key/ for possible values.
+ */
+
+const DOMKeyTable = {};
+
+function addStandard(key, standard) {
+    if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\"");
+    if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\"");
+    DOMKeyTable[key] = [standard, standard, standard, standard];
+}
+
+function addLeftRight(key, left, right) {
+    if (left === undefined) throw new Error("Undefined keysym for key \"" + key + "\"");
+    if (right === undefined) throw new Error("Undefined keysym for key \"" + key + "\"");
+    if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\"");
+    DOMKeyTable[key] = [left, left, right, left];
+}
+
+function addNumpad(key, standard, numpad) {
+    if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\"");
+    if (numpad === undefined) throw new Error("Undefined keysym for key \"" + key + "\"");
+    if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\"");
+    DOMKeyTable[key] = [standard, standard, standard, numpad];
+}
+
+// 2.2. Modifier Keys
+
+addLeftRight("Alt", KeyTable.XK_Alt_L, KeyTable.XK_Alt_R);
+addStandard("AltGraph", KeyTable.XK_ISO_Level3_Shift);
+addStandard("CapsLock", KeyTable.XK_Caps_Lock);
+addLeftRight("Control", KeyTable.XK_Control_L, KeyTable.XK_Control_R);
+// - Fn
+// - FnLock
+addLeftRight("Meta", KeyTable.XK_Super_L, KeyTable.XK_Super_R);
+addStandard("NumLock", KeyTable.XK_Num_Lock);
+addStandard("ScrollLock", KeyTable.XK_Scroll_Lock);
+addLeftRight("Shift", KeyTable.XK_Shift_L, KeyTable.XK_Shift_R);
+// - Symbol
+// - SymbolLock
+
+// 2.3. Whitespace Keys
+
+addNumpad("Enter", KeyTable.XK_Return, KeyTable.XK_KP_Enter);
+addStandard("Tab", KeyTable.XK_Tab);
+addNumpad(" ", KeyTable.XK_space, KeyTable.XK_KP_Space);
+
+// 2.4. Navigation Keys
+
+addNumpad("ArrowDown", KeyTable.XK_Down, KeyTable.XK_KP_Down);
+addNumpad("ArrowUp", KeyTable.XK_Up, KeyTable.XK_KP_Up);
+addNumpad("ArrowLeft", KeyTable.XK_Left, KeyTable.XK_KP_Left);
+addNumpad("ArrowRight", KeyTable.XK_Right, KeyTable.XK_KP_Right);
+addNumpad("End", KeyTable.XK_End, KeyTable.XK_KP_End);
+addNumpad("Home", KeyTable.XK_Home, KeyTable.XK_KP_Home);
+addNumpad("PageDown", KeyTable.XK_Next, KeyTable.XK_KP_Next);
+addNumpad("PageUp", KeyTable.XK_Prior, KeyTable.XK_KP_Prior);
+
+// 2.5. Editing Keys
+
+addStandard("Backspace", KeyTable.XK_BackSpace);
+// Browsers send "Clear" for the numpad 5 without NumLock because
+// Windows uses VK_Clear for that key. But Unix expects KP_Begin for
+// that scenario.
+addNumpad("Clear", KeyTable.XK_Clear, KeyTable.XK_KP_Begin);
+addStandard("Copy", KeyTable.XF86XK_Copy);
+// - CrSel
+addStandard("Cut", KeyTable.XF86XK_Cut);
+addNumpad("Delete", KeyTable.XK_Delete, KeyTable.XK_KP_Delete);
+// - EraseEof
+// - ExSel
+addNumpad("Insert", KeyTable.XK_Insert, KeyTable.XK_KP_Insert);
+addStandard("Paste", KeyTable.XF86XK_Paste);
+addStandard("Redo", KeyTable.XK_Redo);
+addStandard("Undo", KeyTable.XK_Undo);
+
+// 2.6. UI Keys
+
+// - Accept
+// - Again (could just be XK_Redo)
+// - Attn
+addStandard("Cancel", KeyTable.XK_Cancel);
+addStandard("ContextMenu", KeyTable.XK_Menu);
+addStandard("Escape", KeyTable.XK_Escape);
+addStandard("Execute", KeyTable.XK_Execute);
+addStandard("Find", KeyTable.XK_Find);
+addStandard("Help", KeyTable.XK_Help);
+addStandard("Pause", KeyTable.XK_Pause);
+// - Play
+// - Props
+addStandard("Select", KeyTable.XK_Select);
+addStandard("ZoomIn", KeyTable.XF86XK_ZoomIn);
+addStandard("ZoomOut", KeyTable.XF86XK_ZoomOut);
+
+// 2.7. Device Keys
+
+addStandard("BrightnessDown", KeyTable.XF86XK_MonBrightnessDown);
+addStandard("BrightnessUp", KeyTable.XF86XK_MonBrightnessUp);
+addStandard("Eject", KeyTable.XF86XK_Eject);
+addStandard("LogOff", KeyTable.XF86XK_LogOff);
+addStandard("Power", KeyTable.XF86XK_PowerOff);
+addStandard("PowerOff", KeyTable.XF86XK_PowerDown);
+addStandard("PrintScreen", KeyTable.XK_Print);
+addStandard("Hibernate", KeyTable.XF86XK_Hibernate);
+addStandard("Standby", KeyTable.XF86XK_Standby);
+addStandard("WakeUp", KeyTable.XF86XK_WakeUp);
+
+// 2.8. IME and Composition Keys
+
+addStandard("AllCandidates", KeyTable.XK_MultipleCandidate);
+addStandard("Alphanumeric", KeyTable.XK_Eisu_Shift); // could also be _Eisu_Toggle
+addStandard("CodeInput", KeyTable.XK_Codeinput);
+addStandard("Compose", KeyTable.XK_Multi_key);
+addStandard("Convert", KeyTable.XK_Henkan);
+// - Dead
+// - FinalMode
+addStandard("GroupFirst", KeyTable.XK_ISO_First_Group);
+addStandard("GroupLast", KeyTable.XK_ISO_Last_Group);
+addStandard("GroupNext", KeyTable.XK_ISO_Next_Group);
+addStandard("GroupPrevious", KeyTable.XK_ISO_Prev_Group);
+// - ModeChange (XK_Mode_switch is often used for AltGr)
+// - NextCandidate
+addStandard("NonConvert", KeyTable.XK_Muhenkan);
+addStandard("PreviousCandidate", KeyTable.XK_PreviousCandidate);
+// - Process
+addStandard("SingleCandidate", KeyTable.XK_SingleCandidate);
+addStandard("HangulMode", KeyTable.XK_Hangul);
+addStandard("HanjaMode", KeyTable.XK_Hangul_Hanja);
+addStandard("JunjuaMode", KeyTable.XK_Hangul_Jeonja);
+addStandard("Eisu", KeyTable.XK_Eisu_toggle);
+addStandard("Hankaku", KeyTable.XK_Hankaku);
+addStandard("Hiragana", KeyTable.XK_Hiragana);
+addStandard("HiraganaKatakana", KeyTable.XK_Hiragana_Katakana);
+addStandard("KanaMode", KeyTable.XK_Kana_Shift); // could also be _Kana_Lock
+addStandard("KanjiMode", KeyTable.XK_Kanji);
+addStandard("Katakana", KeyTable.XK_Katakana);
+addStandard("Romaji", KeyTable.XK_Romaji);
+addStandard("Zenkaku", KeyTable.XK_Zenkaku);
+addStandard("ZenkakuHanaku", KeyTable.XK_Zenkaku_Hankaku);
+
+// 2.9. General-Purpose Function Keys
+
+addStandard("F1", KeyTable.XK_F1);
+addStandard("F2", KeyTable.XK_F2);
+addStandard("F3", KeyTable.XK_F3);
+addStandard("F4", KeyTable.XK_F4);
+addStandard("F5", KeyTable.XK_F5);
+addStandard("F6", KeyTable.XK_F6);
+addStandard("F7", KeyTable.XK_F7);
+addStandard("F8", KeyTable.XK_F8);
+addStandard("F9", KeyTable.XK_F9);
+addStandard("F10", KeyTable.XK_F10);
+addStandard("F11", KeyTable.XK_F11);
+addStandard("F12", KeyTable.XK_F12);
+addStandard("F13", KeyTable.XK_F13);
+addStandard("F14", KeyTable.XK_F14);
+addStandard("F15", KeyTable.XK_F15);
+addStandard("F16", KeyTable.XK_F16);
+addStandard("F17", KeyTable.XK_F17);
+addStandard("F18", KeyTable.XK_F18);
+addStandard("F19", KeyTable.XK_F19);
+addStandard("F20", KeyTable.XK_F20);
+addStandard("F21", KeyTable.XK_F21);
+addStandard("F22", KeyTable.XK_F22);
+addStandard("F23", KeyTable.XK_F23);
+addStandard("F24", KeyTable.XK_F24);
+addStandard("F25", KeyTable.XK_F25);
+addStandard("F26", KeyTable.XK_F26);
+addStandard("F27", KeyTable.XK_F27);
+addStandard("F28", KeyTable.XK_F28);
+addStandard("F29", KeyTable.XK_F29);
+addStandard("F30", KeyTable.XK_F30);
+addStandard("F31", KeyTable.XK_F31);
+addStandard("F32", KeyTable.XK_F32);
+addStandard("F33", KeyTable.XK_F33);
+addStandard("F34", KeyTable.XK_F34);
+addStandard("F35", KeyTable.XK_F35);
+// - Soft1...
+
+// 2.10. Multimedia Keys
+
+// - ChannelDown
+// - ChannelUp
+addStandard("Close", KeyTable.XF86XK_Close);
+addStandard("MailForward", KeyTable.XF86XK_MailForward);
+addStandard("MailReply", KeyTable.XF86XK_Reply);
+addStandard("MailSend", KeyTable.XF86XK_Send);
+// - MediaClose
+addStandard("MediaFastForward", KeyTable.XF86XK_AudioForward);
+addStandard("MediaPause", KeyTable.XF86XK_AudioPause);
+addStandard("MediaPlay", KeyTable.XF86XK_AudioPlay);
+addStandard("MediaRecord", KeyTable.XF86XK_AudioRecord);
+addStandard("MediaRewind", KeyTable.XF86XK_AudioRewind);
+addStandard("MediaStop", KeyTable.XF86XK_AudioStop);
+addStandard("MediaTrackNext", KeyTable.XF86XK_AudioNext);
+addStandard("MediaTrackPrevious", KeyTable.XF86XK_AudioPrev);
+addStandard("New", KeyTable.XF86XK_New);
+addStandard("Open", KeyTable.XF86XK_Open);
+addStandard("Print", KeyTable.XK_Print);
+addStandard("Save", KeyTable.XF86XK_Save);
+addStandard("SpellCheck", KeyTable.XF86XK_Spell);
+
+// 2.11. Multimedia Numpad Keys
+
+// - Key11
+// - Key12
+
+// 2.12. Audio Keys
+
+// - AudioBalanceLeft
+// - AudioBalanceRight
+// - AudioBassBoostDown
+// - AudioBassBoostToggle
+// - AudioBassBoostUp
+// - AudioFaderFront
+// - AudioFaderRear
+// - AudioSurroundModeNext
+// - AudioTrebleDown
+// - AudioTrebleUp
+addStandard("AudioVolumeDown", KeyTable.XF86XK_AudioLowerVolume);
+addStandard("AudioVolumeUp", KeyTable.XF86XK_AudioRaiseVolume);
+addStandard("AudioVolumeMute", KeyTable.XF86XK_AudioMute);
+// - MicrophoneToggle
+// - MicrophoneVolumeDown
+// - MicrophoneVolumeUp
+addStandard("MicrophoneVolumeMute", KeyTable.XF86XK_AudioMicMute);
+
+// 2.13. Speech Keys
+
+// - SpeechCorrectionList
+// - SpeechInputToggle
+
+// 2.14. Application Keys
+
+addStandard("LaunchApplication1", KeyTable.XF86XK_MyComputer);
+addStandard("LaunchApplication2", KeyTable.XF86XK_Calculator);
+addStandard("LaunchCalendar", KeyTable.XF86XK_Calendar);
+addStandard("LaunchMail", KeyTable.XF86XK_Mail);
+addStandard("LaunchMediaPlayer", KeyTable.XF86XK_AudioMedia);
+addStandard("LaunchMusicPlayer", KeyTable.XF86XK_Music);
+addStandard("LaunchPhone", KeyTable.XF86XK_Phone);
+addStandard("LaunchScreenSaver", KeyTable.XF86XK_ScreenSaver);
+addStandard("LaunchSpreadsheet", KeyTable.XF86XK_Excel);
+addStandard("LaunchWebBrowser", KeyTable.XF86XK_WWW);
+addStandard("LaunchWebCam", KeyTable.XF86XK_WebCam);
+addStandard("LaunchWordProcessor", KeyTable.XF86XK_Word);
+
+// 2.15. Browser Keys
+
+addStandard("BrowserBack", KeyTable.XF86XK_Back);
+addStandard("BrowserFavorites", KeyTable.XF86XK_Favorites);
+addStandard("BrowserForward", KeyTable.XF86XK_Forward);
+addStandard("BrowserHome", KeyTable.XF86XK_HomePage);
+addStandard("BrowserRefresh", KeyTable.XF86XK_Refresh);
+addStandard("BrowserSearch", KeyTable.XF86XK_Search);
+addStandard("BrowserStop", KeyTable.XF86XK_Stop);
+
+// 2.16. Mobile Phone Keys
+
+// - A whole bunch...
+
+// 2.17. TV Keys
+
+// - A whole bunch...
+
+// 2.18. Media Controller Keys
+
+// - A whole bunch...
+addStandard("Dimmer", KeyTable.XF86XK_BrightnessAdjust);
+addStandard("MediaAudioTrack", KeyTable.XF86XK_AudioCycleTrack);
+addStandard("RandomToggle", KeyTable.XF86XK_AudioRandomPlay);
+addStandard("SplitScreenToggle", KeyTable.XF86XK_SplitScreen);
+addStandard("Subtitle", KeyTable.XF86XK_Subtitle);
+addStandard("VideoModeNext", KeyTable.XF86XK_Next_VMode);
+
+// Extra: Numpad
+
+addNumpad("=", KeyTable.XK_equal, KeyTable.XK_KP_Equal);
+addNumpad("+", KeyTable.XK_plus, KeyTable.XK_KP_Add);
+addNumpad("-", KeyTable.XK_minus, KeyTable.XK_KP_Subtract);
+addNumpad("*", KeyTable.XK_asterisk, KeyTable.XK_KP_Multiply);
+addNumpad("/", KeyTable.XK_slash, KeyTable.XK_KP_Divide);
+addNumpad(".", KeyTable.XK_period, KeyTable.XK_KP_Decimal);
+addNumpad(",", KeyTable.XK_comma, KeyTable.XK_KP_Separator);
+addNumpad("0", KeyTable.XK_0, KeyTable.XK_KP_0);
+addNumpad("1", KeyTable.XK_1, KeyTable.XK_KP_1);
+addNumpad("2", KeyTable.XK_2, KeyTable.XK_KP_2);
+addNumpad("3", KeyTable.XK_3, KeyTable.XK_KP_3);
+addNumpad("4", KeyTable.XK_4, KeyTable.XK_KP_4);
+addNumpad("5", KeyTable.XK_5, KeyTable.XK_KP_5);
+addNumpad("6", KeyTable.XK_6, KeyTable.XK_KP_6);
+addNumpad("7", KeyTable.XK_7, KeyTable.XK_KP_7);
+addNumpad("8", KeyTable.XK_8, KeyTable.XK_KP_8);
+addNumpad("9", KeyTable.XK_9, KeyTable.XK_KP_9);
+
+export default DOMKeyTable;
diff --git a/systemvm/agent/noVNC/core/input/fixedkeys.js b/systemvm/agent/noVNC/core/input/fixedkeys.js
new file mode 100644
index 0000000..4d09f2f
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/fixedkeys.js
@@ -0,0 +1,129 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2018 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+/*
+ * Fallback mapping between HTML key codes (physical keys) and
+ * HTML key values. This only works for keys that don't vary
+ * between layouts. We also omit those who manage fine by mapping the
+ * Unicode representation.
+ *
+ * See https://www.w3.org/TR/uievents-code/ for possible codes.
+ * See https://www.w3.org/TR/uievents-key/ for possible values.
+ */
+
+/* eslint-disable key-spacing */
+
+export default {
+
+// 3.1.1.1. Writing System Keys
+
+    'Backspace':        'Backspace',
+
+// 3.1.1.2. Functional Keys
+
+    'AltLeft':          'Alt',
+    'AltRight':         'Alt', // This could also be 'AltGraph'
+    'CapsLock':         'CapsLock',
+    'ContextMenu':      'ContextMenu',
+    'ControlLeft':      'Control',
+    'ControlRight':     'Control',
+    'Enter':            'Enter',
+    'MetaLeft':         'Meta',
+    'MetaRight':        'Meta',
+    'ShiftLeft':        'Shift',
+    'ShiftRight':       'Shift',
+    'Tab':              'Tab',
+    // FIXME: Japanese/Korean keys
+
+// 3.1.2. Control Pad Section
+
+    'Delete':           'Delete',
+    'End':              'End',
+    'Help':             'Help',
+    'Home':             'Home',
+    'Insert':           'Insert',
+    'PageDown':         'PageDown',
+    'PageUp':           'PageUp',
+
+// 3.1.3. Arrow Pad Section
+
+    'ArrowDown':        'ArrowDown',
+    'ArrowLeft':        'ArrowLeft',
+    'ArrowRight':       'ArrowRight',
+    'ArrowUp':          'ArrowUp',
+
+// 3.1.4. Numpad Section
+
+    'NumLock':          'NumLock',
+    'NumpadBackspace':  'Backspace',
+    'NumpadClear':      'Clear',
+
+// 3.1.5. Function Section
+
+    'Escape':           'Escape',
+    'F1':               'F1',
+    'F2':               'F2',
+    'F3':               'F3',
+    'F4':               'F4',
+    'F5':               'F5',
+    'F6':               'F6',
+    'F7':               'F7',
+    'F8':               'F8',
+    'F9':               'F9',
+    'F10':              'F10',
+    'F11':              'F11',
+    'F12':              'F12',
+    'F13':              'F13',
+    'F14':              'F14',
+    'F15':              'F15',
+    'F16':              'F16',
+    'F17':              'F17',
+    'F18':              'F18',
+    'F19':              'F19',
+    'F20':              'F20',
+    'F21':              'F21',
+    'F22':              'F22',
+    'F23':              'F23',
+    'F24':              'F24',
+    'F25':              'F25',
+    'F26':              'F26',
+    'F27':              'F27',
+    'F28':              'F28',
+    'F29':              'F29',
+    'F30':              'F30',
+    'F31':              'F31',
+    'F32':              'F32',
+    'F33':              'F33',
+    'F34':              'F34',
+    'F35':              'F35',
+    'PrintScreen':      'PrintScreen',
+    'ScrollLock':       'ScrollLock',
+    'Pause':            'Pause',
+
+// 3.1.6. Media Keys
+
+    'BrowserBack':      'BrowserBack',
+    'BrowserFavorites': 'BrowserFavorites',
+    'BrowserForward':   'BrowserForward',
+    'BrowserHome':      'BrowserHome',
+    'BrowserRefresh':   'BrowserRefresh',
+    'BrowserSearch':    'BrowserSearch',
+    'BrowserStop':      'BrowserStop',
+    'Eject':            'Eject',
+    'LaunchApp1':       'LaunchMyComputer',
+    'LaunchApp2':       'LaunchCalendar',
+    'LaunchMail':       'LaunchMail',
+    'MediaPlayPause':   'MediaPlay',
+    'MediaStop':        'MediaStop',
+    'MediaTrackNext':   'MediaTrackNext',
+    'MediaTrackPrevious': 'MediaTrackPrevious',
+    'Power':            'Power',
+    'Sleep':            'Sleep',
+    'AudioVolumeDown':  'AudioVolumeDown',
+    'AudioVolumeMute':  'AudioVolumeMute',
+    'AudioVolumeUp':    'AudioVolumeUp',
+    'WakeUp':           'WakeUp',
+};
diff --git a/systemvm/agent/noVNC/core/input/gesturehandler.js b/systemvm/agent/noVNC/core/input/gesturehandler.js
new file mode 100644
index 0000000..6fa72d2
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/gesturehandler.js
@@ -0,0 +1,567 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+const GH_NOGESTURE = 0;
+const GH_ONETAP    = 1;
+const GH_TWOTAP    = 2;
+const GH_THREETAP  = 4;
+const GH_DRAG      = 8;
+const GH_LONGPRESS = 16;
+const GH_TWODRAG   = 32;
+const GH_PINCH     = 64;
+
+const GH_INITSTATE = 127;
+
+const GH_MOVE_THRESHOLD = 50;
+const GH_ANGLE_THRESHOLD = 90; // Degrees
+
+// Timeout when waiting for gestures (ms)
+const GH_MULTITOUCH_TIMEOUT = 250;
+
+// Maximum time between press and release for a tap (ms)
+const GH_TAP_TIMEOUT = 1000;
+
+// Timeout when waiting for longpress (ms)
+const GH_LONGPRESS_TIMEOUT = 1000;
+
+// Timeout when waiting to decide between PINCH and TWODRAG (ms)
+const GH_TWOTOUCH_TIMEOUT = 50;
+
+export default class GestureHandler {
+    constructor() {
+        this._target = null;
+
+        this._state = GH_INITSTATE;
+
+        this._tracked = [];
+        this._ignored = [];
+
+        this._waitingRelease = false;
+        this._releaseStart = 0.0;
+
+        this._longpressTimeoutId = null;
+        this._twoTouchTimeoutId = null;
+
+        this._boundEventHandler = this._eventHandler.bind(this);
+    }
+
+    attach(target) {
+        this.detach();
+
+        this._target = target;
+        this._target.addEventListener('touchstart',
+                                      this._boundEventHandler);
+        this._target.addEventListener('touchmove',
+                                      this._boundEventHandler);
+        this._target.addEventListener('touchend',
+                                      this._boundEventHandler);
+        this._target.addEventListener('touchcancel',
+                                      this._boundEventHandler);
+    }
+
+    detach() {
+        if (!this._target) {
+            return;
+        }
+
+        this._stopLongpressTimeout();
+        this._stopTwoTouchTimeout();
+
+        this._target.removeEventListener('touchstart',
+                                         this._boundEventHandler);
+        this._target.removeEventListener('touchmove',
+                                         this._boundEventHandler);
+        this._target.removeEventListener('touchend',
+                                         this._boundEventHandler);
+        this._target.removeEventListener('touchcancel',
+                                         this._boundEventHandler);
+        this._target = null;
+    }
+
+    _eventHandler(e) {
+        let fn;
+
+        e.stopPropagation();
+        e.preventDefault();
+
+        switch (e.type) {
+            case 'touchstart':
+                fn = this._touchStart;
+                break;
+            case 'touchmove':
+                fn = this._touchMove;
+                break;
+            case 'touchend':
+            case 'touchcancel':
+                fn = this._touchEnd;
+                break;
+        }
+
+        for (let i = 0; i < e.changedTouches.length; i++) {
+            let touch = e.changedTouches[i];
+            fn.call(this, touch.identifier, touch.clientX, touch.clientY);
+        }
+    }
+
+    _touchStart(id, x, y) {
+        // Ignore any new touches if there is already an active gesture,
+        // or we're in a cleanup state
+        if (this._hasDetectedGesture() || (this._state === GH_NOGESTURE)) {
+            this._ignored.push(id);
+            return;
+        }
+
+        // Did it take too long between touches that we should no longer
+        // consider this a single gesture?
+        if ((this._tracked.length > 0) &&
+            ((Date.now() - this._tracked[0].started) > GH_MULTITOUCH_TIMEOUT)) {
+            this._state = GH_NOGESTURE;
+            this._ignored.push(id);
+            return;
+        }
+
+        // If we're waiting for fingers to release then we should no longer
+        // recognize new touches
+        if (this._waitingRelease) {
+            this._state = GH_NOGESTURE;
+            this._ignored.push(id);
+            return;
+        }
+
+        this._tracked.push({
+            id: id,
+            started: Date.now(),
+            active: true,
+            firstX: x,
+            firstY: y,
+            lastX: x,
+            lastY: y,
+            angle: 0
+        });
+
+        switch (this._tracked.length) {
+            case 1:
+                this._startLongpressTimeout();
+                break;
+
+            case 2:
+                this._state &= ~(GH_ONETAP | GH_DRAG | GH_LONGPRESS);
+                this._stopLongpressTimeout();
+                break;
+
+            case 3:
+                this._state &= ~(GH_TWOTAP | GH_TWODRAG | GH_PINCH);
+                break;
+
+            default:
+                this._state = GH_NOGESTURE;
+        }
+    }
+
+    _touchMove(id, x, y) {
+        let touch = this._tracked.find(t => t.id === id);
+
+        // If this is an update for a touch we're not tracking, ignore it
+        if (touch === undefined) {
+            return;
+        }
+
+        // Update the touches last position with the event coordinates
+        touch.lastX = x;
+        touch.lastY = y;
+
+        let deltaX = x - touch.firstX;
+        let deltaY = y - touch.firstY;
+
+        // Update angle when the touch has moved
+        if ((touch.firstX !== touch.lastX) ||
+            (touch.firstY !== touch.lastY)) {
+            touch.angle = Math.atan2(deltaY, deltaX) * 180 / Math.PI;
+        }
+
+        if (!this._hasDetectedGesture()) {
+            // Ignore moves smaller than the minimum threshold
+            if (Math.hypot(deltaX, deltaY) < GH_MOVE_THRESHOLD) {
+                return;
+            }
+
+            // Can't be a tap or long press as we've seen movement
+            this._state &= ~(GH_ONETAP | GH_TWOTAP | GH_THREETAP | GH_LONGPRESS);
+            this._stopLongpressTimeout();
+
+            if (this._tracked.length !== 1) {
+                this._state &= ~(GH_DRAG);
+            }
+            if (this._tracked.length !== 2) {
+                this._state &= ~(GH_TWODRAG | GH_PINCH);
+            }
+
+            // We need to figure out which of our different two touch gestures
+            // this might be
+            if (this._tracked.length === 2) {
+
+                // The other touch is the one where the id doesn't match
+                let prevTouch = this._tracked.find(t => t.id !== id);
+
+                // How far the previous touch point has moved since start
+                let prevDeltaMove = Math.hypot(prevTouch.firstX - prevTouch.lastX,
+                                               prevTouch.firstY - prevTouch.lastY);
+
+                // We know that the current touch moved far enough,
+                // but unless both touches moved further than their
+                // threshold we don't want to disqualify any gestures
+                if (prevDeltaMove > GH_MOVE_THRESHOLD) {
+
+                    // The angle difference between the direction of the touch points
+                    let deltaAngle = Math.abs(touch.angle - prevTouch.angle);
+                    deltaAngle = Math.abs(((deltaAngle + 180) % 360) - 180);
+
+                    // PINCH or TWODRAG can be eliminated depending on the angle
+                    if (deltaAngle > GH_ANGLE_THRESHOLD) {
+                        this._state &= ~GH_TWODRAG;
+                    } else {
+                        this._state &= ~GH_PINCH;
+                    }
+
+                    if (this._isTwoTouchTimeoutRunning()) {
+                        this._stopTwoTouchTimeout();
+                    }
+                } else if (!this._isTwoTouchTimeoutRunning()) {
+                    // We can't determine the gesture right now, let's
+                    // wait and see if more events are on their way
+                    this._startTwoTouchTimeout();
+                }
+            }
+
+            if (!this._hasDetectedGesture()) {
+                return;
+            }
+
+            this._pushEvent('gesturestart');
+        }
+
+        this._pushEvent('gesturemove');
+    }
+
+    _touchEnd(id, x, y) {
+        // Check if this is an ignored touch
+        if (this._ignored.indexOf(id) !== -1) {
+            // Remove this touch from ignored
+            this._ignored.splice(this._ignored.indexOf(id), 1);
+
+            // And reset the state if there are no more touches
+            if ((this._ignored.length === 0) &&
+                (this._tracked.length === 0)) {
+                this._state = GH_INITSTATE;
+                this._waitingRelease = false;
+            }
+            return;
+        }
+
+        // We got a touchend before the timer triggered,
+        // this cannot result in a gesture anymore.
+        if (!this._hasDetectedGesture() &&
+            this._isTwoTouchTimeoutRunning()) {
+            this._stopTwoTouchTimeout();
+            this._state = GH_NOGESTURE;
+        }
+
+        // Some gestures don't trigger until a touch is released
+        if (!this._hasDetectedGesture()) {
+            // Can't be a gesture that relies on movement
+            this._state &= ~(GH_DRAG | GH_TWODRAG | GH_PINCH);
+            // Or something that relies on more time
+            this._state &= ~GH_LONGPRESS;
+            this._stopLongpressTimeout();
+
+            if (!this._waitingRelease) {
+                this._releaseStart = Date.now();
+                this._waitingRelease = true;
+
+                // Can't be a tap that requires more touches than we current have
+                switch (this._tracked.length) {
+                    case 1:
+                        this._state &= ~(GH_TWOTAP | GH_THREETAP);
+                        break;
+
+                    case 2:
+                        this._state &= ~(GH_ONETAP | GH_THREETAP);
+                        break;
+                }
+            }
+        }
+
+        // Waiting for all touches to release? (i.e. some tap)
+        if (this._waitingRelease) {
+            // Were all touches released at roughly the same time?
+            if ((Date.now() - this._releaseStart) > GH_MULTITOUCH_TIMEOUT) {
+                this._state = GH_NOGESTURE;
+            }
+
+            // Did too long time pass between press and release?
+            if (this._tracked.some(t => (Date.now() - t.started) > GH_TAP_TIMEOUT)) {
+                this._state = GH_NOGESTURE;
+            }
+
+            let touch = this._tracked.find(t => t.id === id);
+            touch.active = false;
+
+            // Are we still waiting for more releases?
+            if (this._hasDetectedGesture()) {
+                this._pushEvent('gesturestart');
+            } else {
+                // Have we reached a dead end?
+                if (this._state !== GH_NOGESTURE) {
+                    return;
+                }
+            }
+        }
+
+        if (this._hasDetectedGesture()) {
+            this._pushEvent('gestureend');
+        }
+
+        // Ignore any remaining touches until they are ended
+        for (let i = 0; i < this._tracked.length; i++) {
+            if (this._tracked[i].active) {
+                this._ignored.push(this._tracked[i].id);
+            }
+        }
+        this._tracked = [];
+
+        this._state = GH_NOGESTURE;
+
+        // Remove this touch from ignored if it's in there
+        if (this._ignored.indexOf(id) !== -1) {
+            this._ignored.splice(this._ignored.indexOf(id), 1);
+        }
+
+        // We reset the state if ignored is empty
+        if ((this._ignored.length === 0)) {
+            this._state = GH_INITSTATE;
+            this._waitingRelease = false;
+        }
+    }
+
+    _hasDetectedGesture() {
+        if (this._state === GH_NOGESTURE) {
+            return false;
+        }
+        // Check to see if the bitmask value is a power of 2
+        // (i.e. only one bit set). If it is, we have a state.
+        if (this._state & (this._state - 1)) {
+            return false;
+        }
+
+        // For taps we also need to have all touches released
+        // before we've fully detected the gesture
+        if (this._state & (GH_ONETAP | GH_TWOTAP | GH_THREETAP)) {
+            if (this._tracked.some(t => t.active)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    _startLongpressTimeout() {
+        this._stopLongpressTimeout();
+        this._longpressTimeoutId = setTimeout(() => this._longpressTimeout(),
+                                              GH_LONGPRESS_TIMEOUT);
+    }
+
+    _stopLongpressTimeout() {
+        clearTimeout(this._longpressTimeoutId);
+        this._longpressTimeoutId = null;
+    }
+
+    _longpressTimeout() {
+        if (this._hasDetectedGesture()) {
+            throw new Error("A longpress gesture failed, conflict with a different gesture");
+        }
+
+        this._state = GH_LONGPRESS;
+        this._pushEvent('gesturestart');
+    }
+
+    _startTwoTouchTimeout() {
+        this._stopTwoTouchTimeout();
+        this._twoTouchTimeoutId = setTimeout(() => this._twoTouchTimeout(),
+                                             GH_TWOTOUCH_TIMEOUT);
+    }
+
+    _stopTwoTouchTimeout() {
+        clearTimeout(this._twoTouchTimeoutId);
+        this._twoTouchTimeoutId = null;
+    }
+
+    _isTwoTouchTimeoutRunning() {
+        return this._twoTouchTimeoutId !== null;
+    }
+
+    _twoTouchTimeout() {
+        if (this._tracked.length === 0) {
+            throw new Error("A pinch or two drag gesture failed, no tracked touches");
+        }
+
+        // How far each touch point has moved since start
+        let avgM = this._getAverageMovement();
+        let avgMoveH = Math.abs(avgM.x);
+        let avgMoveV = Math.abs(avgM.y);
+
+        // The difference in the distance between where
+        // the touch points started and where they are now
+        let avgD = this._getAverageDistance();
+        let deltaTouchDistance = Math.abs(Math.hypot(avgD.first.x, avgD.first.y) -
+                                          Math.hypot(avgD.last.x, avgD.last.y));
+
+        if ((avgMoveV < deltaTouchDistance) &&
+            (avgMoveH < deltaTouchDistance)) {
+            this._state = GH_PINCH;
+        } else {
+            this._state = GH_TWODRAG;
+        }
+
+        this._pushEvent('gesturestart');
+        this._pushEvent('gesturemove');
+    }
+
+    _pushEvent(type) {
+        let detail = { type: this._stateToGesture(this._state) };
+
+        // For most gesture events the current (average) position is the
+        // most useful
+        let avg = this._getPosition();
+        let pos = avg.last;
+
+        // However we have a slight distance to detect gestures, so for the
+        // first gesture event we want to use the first positions we saw
+        if (type === 'gesturestart') {
+            pos = avg.first;
+        }
+
+        // For these gestures, we always want the event coordinates
+        // to be where the gesture began, not the current touch location.
+        switch (this._state) {
+            case GH_TWODRAG:
+            case GH_PINCH:
+                pos = avg.first;
+                break;
+        }
+
+        detail['clientX'] = pos.x;
+        detail['clientY'] = pos.y;
+
+        // FIXME: other coordinates?
+
+        // Some gestures also have a magnitude
+        if (this._state === GH_PINCH) {
+            let distance = this._getAverageDistance();
+            if (type === 'gesturestart') {
+                detail['magnitudeX'] = distance.first.x;
+                detail['magnitudeY'] = distance.first.y;
+            } else {
+                detail['magnitudeX'] = distance.last.x;
+                detail['magnitudeY'] = distance.last.y;
+            }
+        } else if (this._state === GH_TWODRAG) {
+            if (type === 'gesturestart') {
+                detail['magnitudeX'] = 0.0;
+                detail['magnitudeY'] = 0.0;
+            } else {
+                let movement = this._getAverageMovement();
+                detail['magnitudeX'] = movement.x;
+                detail['magnitudeY'] = movement.y;
+            }
+        }
+
+        let gev = new CustomEvent(type, { detail: detail });
+        this._target.dispatchEvent(gev);
+    }
+
+    _stateToGesture(state) {
+        switch (state) {
+            case GH_ONETAP:
+                return 'onetap';
+            case GH_TWOTAP:
+                return 'twotap';
+            case GH_THREETAP:
+                return 'threetap';
+            case GH_DRAG:
+                return 'drag';
+            case GH_LONGPRESS:
+                return 'longpress';
+            case GH_TWODRAG:
+                return 'twodrag';
+            case GH_PINCH:
+                return 'pinch';
+        }
+
+        throw new Error("Unknown gesture state: " + state);
+    }
+
+    _getPosition() {
+        if (this._tracked.length === 0) {
+            throw new Error("Failed to get gesture position, no tracked touches");
+        }
+
+        let size = this._tracked.length;
+        let fx = 0, fy = 0, lx = 0, ly = 0;
+
+        for (let i = 0; i < this._tracked.length; i++) {
+            fx += this._tracked[i].firstX;
+            fy += this._tracked[i].firstY;
+            lx += this._tracked[i].lastX;
+            ly += this._tracked[i].lastY;
+        }
+
+        return { first: { x: fx / size,
+                          y: fy / size },
+                 last: { x: lx / size,
+                         y: ly / size } };
+    }
+
+    _getAverageMovement() {
+        if (this._tracked.length === 0) {
+            throw new Error("Failed to get gesture movement, no tracked touches");
+        }
+
+        let totalH, totalV;
+        totalH = totalV = 0;
+        let size = this._tracked.length;
+
+        for (let i = 0; i < this._tracked.length; i++) {
+            totalH += this._tracked[i].lastX - this._tracked[i].firstX;
+            totalV += this._tracked[i].lastY - this._tracked[i].firstY;
+        }
+
+        return { x: totalH / size,
+                 y: totalV / size };
+    }
+
+    _getAverageDistance() {
+        if (this._tracked.length === 0) {
+            throw new Error("Failed to get gesture distance, no tracked touches");
+        }
+
+        // Distance between the first and last tracked touches
+
+        let first = this._tracked[0];
+        let last = this._tracked[this._tracked.length - 1];
+
+        let fdx = Math.abs(last.firstX - first.firstX);
+        let fdy = Math.abs(last.firstY - first.firstY);
+
+        let ldx = Math.abs(last.lastX - first.lastX);
+        let ldy = Math.abs(last.lastY - first.lastY);
+
+        return { first: { x: fdx, y: fdy },
+                 last: { x: ldx, y: ldy } };
+    }
+}
diff --git a/systemvm/agent/noVNC/core/input/keyboard.js b/systemvm/agent/noVNC/core/input/keyboard.js
new file mode 100644
index 0000000..9e6af2a
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/keyboard.js
@@ -0,0 +1,388 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+import * as Log from '../util/logging.js';
+import { stopEvent } from '../util/events.js';
+import * as KeyboardUtil from "./util.js";
+import KeyTable from "./keysym.js";
+import * as browser from "../util/browser.js";
+
+//
+// Keyboard event handler
+//
+
+export default class Keyboard {
+    constructor(target) {
+        this._target = target || null;
+
+        this._keyDownList = {};         // List of depressed keys
+                                        // (even if they are happy)
+        this._pendingKey = null;        // Key waiting for keypress
+        this._altGrArmed = false;       // Windows AltGr detection
+
+        // keep these here so we can refer to them later
+        this._eventHandlers = {
+            'keyup': this._handleKeyUp.bind(this),
+            'keydown': this._handleKeyDown.bind(this),
+            'keypress': this._handleKeyPress.bind(this),
+            'blur': this._allKeysUp.bind(this),
+            'checkalt': this._checkAlt.bind(this),
+        };
+
+        // ===== EVENT HANDLERS =====
+
+        this.onkeyevent = () => {}; // Handler for key press/release
+    }
+
+    // ===== PRIVATE METHODS =====
+
+    _sendKeyEvent(keysym, code, down) {
+        if (down) {
+            this._keyDownList[code] = keysym;
+        } else {
+            // Do we really think this key is down?
+            if (!(code in this._keyDownList)) {
+                return;
+            }
+            delete this._keyDownList[code];
+        }
+
+        Log.Debug("onkeyevent " + (down ? "down" : "up") +
+                  ", keysym: " + keysym, ", code: " + code);
+        this.onkeyevent(keysym, code, down);
+    }
+
+    _getKeyCode(e) {
+        const code = KeyboardUtil.getKeycode(e);
+        if (code !== 'Unidentified') {
+            return code;
+        }
+
+        // Unstable, but we don't have anything else to go on
+        // (don't use it for 'keypress' events thought since
+        // WebKit sets it to the same as charCode)
+        if (e.keyCode && (e.type !== 'keypress')) {
+            // 229 is used for composition events
+            if (e.keyCode !== 229) {
+                return 'Platform' + e.keyCode;
+            }
+        }
+
+        // A precursor to the final DOM3 standard. Unfortunately it
+        // is not layout independent, so it is as bad as using keyCode
+        if (e.keyIdentifier) {
+            // Non-character key?
+            if (e.keyIdentifier.substr(0, 2) !== 'U+') {
+                return e.keyIdentifier;
+            }
+
+            const codepoint = parseInt(e.keyIdentifier.substr(2), 16);
+            const char = String.fromCharCode(codepoint).toUpperCase();
+
+            return 'Platform' + char.charCodeAt();
+        }
+
+        return 'Unidentified';
+    }
+
+    _handleKeyDown(e) {
+        const code = this._getKeyCode(e);
+        let keysym = KeyboardUtil.getKeysym(e);
+
+        // Windows doesn't have a proper AltGr, but handles it using
+        // fake Ctrl+Alt. However the remote end might not be Windows,
+        // so we need to merge those in to a single AltGr event. We
+        // detect this case by seeing the two key events directly after
+        // each other with a very short time between them (<50ms).
+        if (this._altGrArmed) {
+            this._altGrArmed = false;
+            clearTimeout(this._altGrTimeout);
+
+            if ((code === "AltRight") &&
+                ((e.timeStamp - this._altGrCtrlTime) < 50)) {
+                // FIXME: We fail to detect this if either Ctrl key is
+                //        first manually pressed as Windows then no
+                //        longer sends the fake Ctrl down event. It
+                //        does however happily send real Ctrl events
+                //        even when AltGr is already down. Some
+                //        browsers detect this for us though and set the
+                //        key to "AltGraph".
+                keysym = KeyTable.XK_ISO_Level3_Shift;
+            } else {
+                this._sendKeyEvent(KeyTable.XK_Control_L, "ControlLeft", true);
+            }
+        }
+
+        // We cannot handle keys we cannot track, but we also need
+        // to deal with virtual keyboards which omit key info
+        if (code === 'Unidentified') {
+            if (keysym) {
+                // If it's a virtual keyboard then it should be
+                // sufficient to just send press and release right
+                // after each other
+                this._sendKeyEvent(keysym, code, true);
+                this._sendKeyEvent(keysym, code, false);
+            }
+
+            stopEvent(e);
+            return;
+        }
+
+        // Alt behaves more like AltGraph on macOS, so shuffle the
+        // keys around a bit to make things more sane for the remote
+        // server. This method is used by RealVNC and TigerVNC (and
+        // possibly others).
+        if (browser.isMac() || browser.isIOS()) {
+            switch (keysym) {
+                case KeyTable.XK_Super_L:
+                    keysym = KeyTable.XK_Alt_L;
+                    break;
+                case KeyTable.XK_Super_R:
+                    keysym = KeyTable.XK_Super_L;
+                    break;
+                case KeyTable.XK_Alt_L:
+                    keysym = KeyTable.XK_Mode_switch;
+                    break;
+                case KeyTable.XK_Alt_R:
+                    keysym = KeyTable.XK_ISO_Level3_Shift;
+                    break;
+            }
+        }
+
+        // Is this key already pressed? If so, then we must use the
+        // same keysym or we'll confuse the server
+        if (code in this._keyDownList) {
+            keysym = this._keyDownList[code];
+        }
+
+        // macOS doesn't send proper key events for modifiers, only
+        // state change events. That gets extra confusing for CapsLock
+        // which toggles on each press, but not on release. So pretend
+        // it was a quick press and release of the button.
+        if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) {
+            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
+            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
+            stopEvent(e);
+            return;
+        }
+
+        // If this is a legacy browser then we'll need to wait for
+        // a keypress event as well
+        // (IE and Edge has a broken KeyboardEvent.key, so we can't
+        // just check for the presence of that field)
+        if (!keysym && (!e.key || browser.isIE() || browser.isEdge())) {
+            this._pendingKey = code;
+            // However we might not get a keypress event if the key
+            // is non-printable, which needs some special fallback
+            // handling
+            setTimeout(this._handleKeyPressTimeout.bind(this), 10, e);
+            return;
+        }
+
+        this._pendingKey = null;
+        stopEvent(e);
+
+        // Possible start of AltGr sequence? (see above)
+        if ((code === "ControlLeft") && browser.isWindows() &&
+            !("ControlLeft" in this._keyDownList)) {
+            this._altGrArmed = true;
+            this._altGrTimeout = setTimeout(this._handleAltGrTimeout.bind(this), 100);
+            this._altGrCtrlTime = e.timeStamp;
+            return;
+        }
+
+        this._sendKeyEvent(keysym, code, true);
+    }
+
+    // Legacy event for browsers without code/key
+    _handleKeyPress(e) {
+        stopEvent(e);
+
+        // Are we expecting a keypress?
+        if (this._pendingKey === null) {
+            return;
+        }
+
+        let code = this._getKeyCode(e);
+        const keysym = KeyboardUtil.getKeysym(e);
+
+        // The key we were waiting for?
+        if ((code !== 'Unidentified') && (code != this._pendingKey)) {
+            return;
+        }
+
+        code = this._pendingKey;
+        this._pendingKey = null;
+
+        if (!keysym) {
+            Log.Info('keypress with no keysym:', e);
+            return;
+        }
+
+        this._sendKeyEvent(keysym, code, true);
+    }
+
+    _handleKeyPressTimeout(e) {
+        // Did someone manage to sort out the key already?
+        if (this._pendingKey === null) {
+            return;
+        }
+
+        let keysym;
+
+        const code = this._pendingKey;
+        this._pendingKey = null;
+
+        // We have no way of knowing the proper keysym with the
+        // information given, but the following are true for most
+        // layouts
+        if ((e.keyCode >= 0x30) && (e.keyCode <= 0x39)) {
+            // Digit
+            keysym = e.keyCode;
+        } else if ((e.keyCode >= 0x41) && (e.keyCode <= 0x5a)) {
+            // Character (A-Z)
+            let char = String.fromCharCode(e.keyCode);
+            // A feeble attempt at the correct case
+            if (e.shiftKey) {
+                char = char.toUpperCase();
+            } else {
+                char = char.toLowerCase();
+            }
+            keysym = char.charCodeAt();
+        } else {
+            // Unknown, give up
+            keysym = 0;
+        }
+
+        this._sendKeyEvent(keysym, code, true);
+    }
+
+    _handleKeyUp(e) {
+        stopEvent(e);
+
+        const code = this._getKeyCode(e);
+
+        // We can't get a release in the middle of an AltGr sequence, so
+        // abort that detection
+        if (this._altGrArmed) {
+            this._altGrArmed = false;
+            clearTimeout(this._altGrTimeout);
+            this._sendKeyEvent(KeyTable.XK_Control_L, "ControlLeft", true);
+        }
+
+        // See comment in _handleKeyDown()
+        if ((browser.isMac() || browser.isIOS()) && (code === 'CapsLock')) {
+            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', true);
+            this._sendKeyEvent(KeyTable.XK_Caps_Lock, 'CapsLock', false);
+            return;
+        }
+
+        this._sendKeyEvent(this._keyDownList[code], code, false);
+
+        // Windows has a rather nasty bug where it won't send key
+        // release events for a Shift button if the other Shift is still
+        // pressed
+        if (browser.isWindows() && ((code === 'ShiftLeft') ||
+                                    (code === 'ShiftRight'))) {
+            if ('ShiftRight' in this._keyDownList) {
+                this._sendKeyEvent(this._keyDownList['ShiftRight'],
+                                   'ShiftRight', false);
+            }
+            if ('ShiftLeft' in this._keyDownList) {
+                this._sendKeyEvent(this._keyDownList['ShiftLeft'],
+                                   'ShiftLeft', false);
+            }
+        }
+    }
+
+    _handleAltGrTimeout() {
+        this._altGrArmed = false;
+        clearTimeout(this._altGrTimeout);
+        this._sendKeyEvent(KeyTable.XK_Control_L, "ControlLeft", true);
+    }
+
+    _allKeysUp() {
+        Log.Debug(">> Keyboard.allKeysUp");
+        for (let code in this._keyDownList) {
+            this._sendKeyEvent(this._keyDownList[code], code, false);
+        }
+        Log.Debug("<< Keyboard.allKeysUp");
+    }
+
+    // Alt workaround for Firefox on Windows, see below
+    _checkAlt(e) {
+        if (e.skipCheckAlt) {
+            return;
+        }
+        if (e.altKey) {
+            return;
+        }
+
+        const target = this._target;
+        const downList = this._keyDownList;
+        ['AltLeft', 'AltRight'].forEach((code) => {
+            if (!(code in downList)) {
+                return;
+            }
+
+            const event = new KeyboardEvent('keyup',
+                                            { key: downList[code],
+                                              code: code });
+            event.skipCheckAlt = true;
+            target.dispatchEvent(event);
+        });
+    }
+
+    // ===== PUBLIC METHODS =====
+
+    grab() {
+        //Log.Debug(">> Keyboard.grab");
+
+        this._target.addEventListener('keydown', this._eventHandlers.keydown);
+        this._target.addEventListener('keyup', this._eventHandlers.keyup);
+        this._target.addEventListener('keypress', this._eventHandlers.keypress);
+
+        // Release (key up) if window loses focus
+        window.addEventListener('blur', this._eventHandlers.blur);
+
+        // Firefox on Windows has broken handling of Alt, so we need to
+        // poll as best we can for releases (still doesn't prevent the
+        // menu from popping up though as we can't call
+        // preventDefault())
+        if (browser.isWindows() && browser.isFirefox()) {
+            const handler = this._eventHandlers.checkalt;
+            ['mousedown', 'mouseup', 'mousemove', 'wheel',
+             'touchstart', 'touchend', 'touchmove',
+             'keydown', 'keyup'].forEach(type =>
+                document.addEventListener(type, handler,
+                                          { capture: true,
+                                            passive: true }));
+        }
+
+        //Log.Debug("<< Keyboard.grab");
+    }
+
+    ungrab() {
+        //Log.Debug(">> Keyboard.ungrab");
+
+        if (browser.isWindows() && browser.isFirefox()) {
+            const handler = this._eventHandlers.checkalt;
+            ['mousedown', 'mouseup', 'mousemove', 'wheel',
+             'touchstart', 'touchend', 'touchmove',
+             'keydown', 'keyup'].forEach(type => document.removeEventListener(type, handler));
+        }
+
+        this._target.removeEventListener('keydown', this._eventHandlers.keydown);
+        this._target.removeEventListener('keyup', this._eventHandlers.keyup);
+        this._target.removeEventListener('keypress', this._eventHandlers.keypress);
+        window.removeEventListener('blur', this._eventHandlers.blur);
+
+        // Release (key up) all keys that are in a down state
+        this._allKeysUp();
+
+        //Log.Debug(">> Keyboard.ungrab");
+    }
+}
diff --git a/systemvm/agent/noVNC/core/input/keysym.js b/systemvm/agent/noVNC/core/input/keysym.js
new file mode 100644
index 0000000..22ba058
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/keysym.js
@@ -0,0 +1,616 @@
+/* eslint-disable key-spacing */
+
+export default {
+    XK_VoidSymbol:                  0xffffff, /* Void symbol */
+
+    XK_BackSpace:                   0xff08, /* Back space, back char */
+    XK_Tab:                         0xff09,
+    XK_Linefeed:                    0xff0a, /* Linefeed, LF */
+    XK_Clear:                       0xff0b,
+    XK_Return:                      0xff0d, /* Return, enter */
+    XK_Pause:                       0xff13, /* Pause, hold */
+    XK_Scroll_Lock:                 0xff14,
+    XK_Sys_Req:                     0xff15,
+    XK_Escape:                      0xff1b,
+    XK_Delete:                      0xffff, /* Delete, rubout */
+
+    /* International & multi-key character composition */
+
+    XK_Multi_key:                   0xff20, /* Multi-key character compose */
+    XK_Codeinput:                   0xff37,
+    XK_SingleCandidate:             0xff3c,
+    XK_MultipleCandidate:           0xff3d,
+    XK_PreviousCandidate:           0xff3e,
+
+    /* Japanese keyboard support */
+
+    XK_Kanji:                       0xff21, /* Kanji, Kanji convert */
+    XK_Muhenkan:                    0xff22, /* Cancel Conversion */
+    XK_Henkan_Mode:                 0xff23, /* Start/Stop Conversion */
+    XK_Henkan:                      0xff23, /* Alias for Henkan_Mode */
+    XK_Romaji:                      0xff24, /* to Romaji */
+    XK_Hiragana:                    0xff25, /* to Hiragana */
+    XK_Katakana:                    0xff26, /* to Katakana */
+    XK_Hiragana_Katakana:           0xff27, /* Hiragana/Katakana toggle */
+    XK_Zenkaku:                     0xff28, /* to Zenkaku */
+    XK_Hankaku:                     0xff29, /* to Hankaku */
+    XK_Zenkaku_Hankaku:             0xff2a, /* Zenkaku/Hankaku toggle */
+    XK_Touroku:                     0xff2b, /* Add to Dictionary */
+    XK_Massyo:                      0xff2c, /* Delete from Dictionary */
+    XK_Kana_Lock:                   0xff2d, /* Kana Lock */
+    XK_Kana_Shift:                  0xff2e, /* Kana Shift */
+    XK_Eisu_Shift:                  0xff2f, /* Alphanumeric Shift */
+    XK_Eisu_toggle:                 0xff30, /* Alphanumeric toggle */
+    XK_Kanji_Bangou:                0xff37, /* Codeinput */
+    XK_Zen_Koho:                    0xff3d, /* Multiple/All Candidate(s) */
+    XK_Mae_Koho:                    0xff3e, /* Previous Candidate */
+
+    /* Cursor control & motion */
+
+    XK_Home:                        0xff50,
+    XK_Left:                        0xff51, /* Move left, left arrow */
+    XK_Up:                          0xff52, /* Move up, up arrow */
+    XK_Right:                       0xff53, /* Move right, right arrow */
+    XK_Down:                        0xff54, /* Move down, down arrow */
+    XK_Prior:                       0xff55, /* Prior, previous */
+    XK_Page_Up:                     0xff55,
+    XK_Next:                        0xff56, /* Next */
+    XK_Page_Down:                   0xff56,
+    XK_End:                         0xff57, /* EOL */
+    XK_Begin:                       0xff58, /* BOL */
+
+
+    /* Misc functions */
+
+    XK_Select:                      0xff60, /* Select, mark */
+    XK_Print:                       0xff61,
+    XK_Execute:                     0xff62, /* Execute, run, do */
+    XK_Insert:                      0xff63, /* Insert, insert here */
+    XK_Undo:                        0xff65,
+    XK_Redo:                        0xff66, /* Redo, again */
+    XK_Menu:                        0xff67,
+    XK_Find:                        0xff68, /* Find, search */
+    XK_Cancel:                      0xff69, /* Cancel, stop, abort, exit */
+    XK_Help:                        0xff6a, /* Help */
+    XK_Break:                       0xff6b,
+    XK_Mode_switch:                 0xff7e, /* Character set switch */
+    XK_script_switch:               0xff7e, /* Alias for mode_switch */
+    XK_Num_Lock:                    0xff7f,
+
+    /* Keypad functions, keypad numbers cleverly chosen to map to ASCII */
+
+    XK_KP_Space:                    0xff80, /* Space */
+    XK_KP_Tab:                      0xff89,
+    XK_KP_Enter:                    0xff8d, /* Enter */
+    XK_KP_F1:                       0xff91, /* PF1, KP_A, ... */
+    XK_KP_F2:                       0xff92,
+    XK_KP_F3:                       0xff93,
+    XK_KP_F4:                       0xff94,
+    XK_KP_Home:                     0xff95,
+    XK_KP_Left:                     0xff96,
+    XK_KP_Up:                       0xff97,
+    XK_KP_Right:                    0xff98,
+    XK_KP_Down:                     0xff99,
+    XK_KP_Prior:                    0xff9a,
+    XK_KP_Page_Up:                  0xff9a,
+    XK_KP_Next:                     0xff9b,
+    XK_KP_Page_Down:                0xff9b,
+    XK_KP_End:                      0xff9c,
+    XK_KP_Begin:                    0xff9d,
+    XK_KP_Insert:                   0xff9e,
+    XK_KP_Delete:                   0xff9f,
+    XK_KP_Equal:                    0xffbd, /* Equals */
+    XK_KP_Multiply:                 0xffaa,
+    XK_KP_Add:                      0xffab,
+    XK_KP_Separator:                0xffac, /* Separator, often comma */
+    XK_KP_Subtract:                 0xffad,
+    XK_KP_Decimal:                  0xffae,
+    XK_KP_Divide:                   0xffaf,
+
+    XK_KP_0:                        0xffb0,
+    XK_KP_1:                        0xffb1,
+    XK_KP_2:                        0xffb2,
+    XK_KP_3:                        0xffb3,
+    XK_KP_4:                        0xffb4,
+    XK_KP_5:                        0xffb5,
+    XK_KP_6:                        0xffb6,
+    XK_KP_7:                        0xffb7,
+    XK_KP_8:                        0xffb8,
+    XK_KP_9:                        0xffb9,
+
+    /*
+     * Auxiliary functions; note the duplicate definitions for left and right
+     * function keys;  Sun keyboards and a few other manufacturers have such
+     * function key groups on the left and/or right sides of the keyboard.
+     * We've not found a keyboard with more than 35 function keys total.
+     */
+
+    XK_F1:                          0xffbe,
+    XK_F2:                          0xffbf,
+    XK_F3:                          0xffc0,
+    XK_F4:                          0xffc1,
+    XK_F5:                          0xffc2,
+    XK_F6:                          0xffc3,
+    XK_F7:                          0xffc4,
+    XK_F8:                          0xffc5,
+    XK_F9:                          0xffc6,
+    XK_F10:                         0xffc7,
+    XK_F11:                         0xffc8,
+    XK_L1:                          0xffc8,
+    XK_F12:                         0xffc9,
+    XK_L2:                          0xffc9,
+    XK_F13:                         0xffca,
+    XK_L3:                          0xffca,
+    XK_F14:                         0xffcb,
+    XK_L4:                          0xffcb,
+    XK_F15:                         0xffcc,
+    XK_L5:                          0xffcc,
+    XK_F16:                         0xffcd,
+    XK_L6:                          0xffcd,
+    XK_F17:                         0xffce,
+    XK_L7:                          0xffce,
+    XK_F18:                         0xffcf,
+    XK_L8:                          0xffcf,
+    XK_F19:                         0xffd0,
+    XK_L9:                          0xffd0,
+    XK_F20:                         0xffd1,
+    XK_L10:                         0xffd1,
+    XK_F21:                         0xffd2,
+    XK_R1:                          0xffd2,
+    XK_F22:                         0xffd3,
+    XK_R2:                          0xffd3,
+    XK_F23:                         0xffd4,
+    XK_R3:                          0xffd4,
+    XK_F24:                         0xffd5,
+    XK_R4:                          0xffd5,
+    XK_F25:                         0xffd6,
+    XK_R5:                          0xffd6,
+    XK_F26:                         0xffd7,
+    XK_R6:                          0xffd7,
+    XK_F27:                         0xffd8,
+    XK_R7:                          0xffd8,
+    XK_F28:                         0xffd9,
+    XK_R8:                          0xffd9,
+    XK_F29:                         0xffda,
+    XK_R9:                          0xffda,
+    XK_F30:                         0xffdb,
+    XK_R10:                         0xffdb,
+    XK_F31:                         0xffdc,
+    XK_R11:                         0xffdc,
+    XK_F32:                         0xffdd,
+    XK_R12:                         0xffdd,
+    XK_F33:                         0xffde,
+    XK_R13:                         0xffde,
+    XK_F34:                         0xffdf,
+    XK_R14:                         0xffdf,
+    XK_F35:                         0xffe0,
+    XK_R15:                         0xffe0,
+
+    /* Modifiers */
+
+    XK_Shift_L:                     0xffe1, /* Left shift */
+    XK_Shift_R:                     0xffe2, /* Right shift */
+    XK_Control_L:                   0xffe3, /* Left control */
+    XK_Control_R:                   0xffe4, /* Right control */
+    XK_Caps_Lock:                   0xffe5, /* Caps lock */
+    XK_Shift_Lock:                  0xffe6, /* Shift lock */
+
+    XK_Meta_L:                      0xffe7, /* Left meta */
+    XK_Meta_R:                      0xffe8, /* Right meta */
+    XK_Alt_L:                       0xffe9, /* Left alt */
+    XK_Alt_R:                       0xffea, /* Right alt */
+    XK_Super_L:                     0xffeb, /* Left super */
+    XK_Super_R:                     0xffec, /* Right super */
+    XK_Hyper_L:                     0xffed, /* Left hyper */
+    XK_Hyper_R:                     0xffee, /* Right hyper */
+
+    /*
+     * Keyboard (XKB) Extension function and modifier keys
+     * (from Appendix C of "The X Keyboard Extension: Protocol Specification")
+     * Byte 3 = 0xfe
+     */
+
+    XK_ISO_Level3_Shift:            0xfe03, /* AltGr */
+    XK_ISO_Next_Group:              0xfe08,
+    XK_ISO_Prev_Group:              0xfe0a,
+    XK_ISO_First_Group:             0xfe0c,
+    XK_ISO_Last_Group:              0xfe0e,
+
+    /*
+     * Latin 1
+     * (ISO/IEC 8859-1: Unicode U+0020..U+00FF)
+     * Byte 3: 0
+     */
+
+    XK_space:                       0x0020, /* U+0020 SPACE */
+    XK_exclam:                      0x0021, /* U+0021 EXCLAMATION MARK */
+    XK_quotedbl:                    0x0022, /* U+0022 QUOTATION MARK */
+    XK_numbersign:                  0x0023, /* U+0023 NUMBER SIGN */
+    XK_dollar:                      0x0024, /* U+0024 DOLLAR SIGN */
+    XK_percent:                     0x0025, /* U+0025 PERCENT SIGN */
+    XK_ampersand:                   0x0026, /* U+0026 AMPERSAND */
+    XK_apostrophe:                  0x0027, /* U+0027 APOSTROPHE */
+    XK_quoteright:                  0x0027, /* deprecated */
+    XK_parenleft:                   0x0028, /* U+0028 LEFT PARENTHESIS */
+    XK_parenright:                  0x0029, /* U+0029 RIGHT PARENTHESIS */
+    XK_asterisk:                    0x002a, /* U+002A ASTERISK */
+    XK_plus:                        0x002b, /* U+002B PLUS SIGN */
+    XK_comma:                       0x002c, /* U+002C COMMA */
+    XK_minus:                       0x002d, /* U+002D HYPHEN-MINUS */
+    XK_period:                      0x002e, /* U+002E FULL STOP */
+    XK_slash:                       0x002f, /* U+002F SOLIDUS */
+    XK_0:                           0x0030, /* U+0030 DIGIT ZERO */
+    XK_1:                           0x0031, /* U+0031 DIGIT ONE */
+    XK_2:                           0x0032, /* U+0032 DIGIT TWO */
+    XK_3:                           0x0033, /* U+0033 DIGIT THREE */
+    XK_4:                           0x0034, /* U+0034 DIGIT FOUR */
+    XK_5:                           0x0035, /* U+0035 DIGIT FIVE */
+    XK_6:                           0x0036, /* U+0036 DIGIT SIX */
+    XK_7:                           0x0037, /* U+0037 DIGIT SEVEN */
+    XK_8:                           0x0038, /* U+0038 DIGIT EIGHT */
+    XK_9:                           0x0039, /* U+0039 DIGIT NINE */
+    XK_colon:                       0x003a, /* U+003A COLON */
+    XK_semicolon:                   0x003b, /* U+003B SEMICOLON */
+    XK_less:                        0x003c, /* U+003C LESS-THAN SIGN */
+    XK_equal:                       0x003d, /* U+003D EQUALS SIGN */
+    XK_greater:                     0x003e, /* U+003E GREATER-THAN SIGN */
+    XK_question:                    0x003f, /* U+003F QUESTION MARK */
+    XK_at:                          0x0040, /* U+0040 COMMERCIAL AT */
+    XK_A:                           0x0041, /* U+0041 LATIN CAPITAL LETTER A */
+    XK_B:                           0x0042, /* U+0042 LATIN CAPITAL LETTER B */
+    XK_C:                           0x0043, /* U+0043 LATIN CAPITAL LETTER C */
+    XK_D:                           0x0044, /* U+0044 LATIN CAPITAL LETTER D */
+    XK_E:                           0x0045, /* U+0045 LATIN CAPITAL LETTER E */
+    XK_F:                           0x0046, /* U+0046 LATIN CAPITAL LETTER F */
+    XK_G:                           0x0047, /* U+0047 LATIN CAPITAL LETTER G */
+    XK_H:                           0x0048, /* U+0048 LATIN CAPITAL LETTER H */
+    XK_I:                           0x0049, /* U+0049 LATIN CAPITAL LETTER I */
+    XK_J:                           0x004a, /* U+004A LATIN CAPITAL LETTER J */
+    XK_K:                           0x004b, /* U+004B LATIN CAPITAL LETTER K */
+    XK_L:                           0x004c, /* U+004C LATIN CAPITAL LETTER L */
+    XK_M:                           0x004d, /* U+004D LATIN CAPITAL LETTER M */
+    XK_N:                           0x004e, /* U+004E LATIN CAPITAL LETTER N */
+    XK_O:                           0x004f, /* U+004F LATIN CAPITAL LETTER O */
+    XK_P:                           0x0050, /* U+0050 LATIN CAPITAL LETTER P */
+    XK_Q:                           0x0051, /* U+0051 LATIN CAPITAL LETTER Q */
+    XK_R:                           0x0052, /* U+0052 LATIN CAPITAL LETTER R */
+    XK_S:                           0x0053, /* U+0053 LATIN CAPITAL LETTER S */
+    XK_T:                           0x0054, /* U+0054 LATIN CAPITAL LETTER T */
+    XK_U:                           0x0055, /* U+0055 LATIN CAPITAL LETTER U */
+    XK_V:                           0x0056, /* U+0056 LATIN CAPITAL LETTER V */
+    XK_W:                           0x0057, /* U+0057 LATIN CAPITAL LETTER W */
+    XK_X:                           0x0058, /* U+0058 LATIN CAPITAL LETTER X */
+    XK_Y:                           0x0059, /* U+0059 LATIN CAPITAL LETTER Y */
+    XK_Z:                           0x005a, /* U+005A LATIN CAPITAL LETTER Z */
+    XK_bracketleft:                 0x005b, /* U+005B LEFT SQUARE BRACKET */
+    XK_backslash:                   0x005c, /* U+005C REVERSE SOLIDUS */
+    XK_bracketright:                0x005d, /* U+005D RIGHT SQUARE BRACKET */
+    XK_asciicircum:                 0x005e, /* U+005E CIRCUMFLEX ACCENT */
+    XK_underscore:                  0x005f, /* U+005F LOW LINE */
+    XK_grave:                       0x0060, /* U+0060 GRAVE ACCENT */
+    XK_quoteleft:                   0x0060, /* deprecated */
+    XK_a:                           0x0061, /* U+0061 LATIN SMALL LETTER A */
+    XK_b:                           0x0062, /* U+0062 LATIN SMALL LETTER B */
+    XK_c:                           0x0063, /* U+0063 LATIN SMALL LETTER C */
+    XK_d:                           0x0064, /* U+0064 LATIN SMALL LETTER D */
+    XK_e:                           0x0065, /* U+0065 LATIN SMALL LETTER E */
+    XK_f:                           0x0066, /* U+0066 LATIN SMALL LETTER F */
+    XK_g:                           0x0067, /* U+0067 LATIN SMALL LETTER G */
+    XK_h:                           0x0068, /* U+0068 LATIN SMALL LETTER H */
+    XK_i:                           0x0069, /* U+0069 LATIN SMALL LETTER I */
+    XK_j:                           0x006a, /* U+006A LATIN SMALL LETTER J */
+    XK_k:                           0x006b, /* U+006B LATIN SMALL LETTER K */
+    XK_l:                           0x006c, /* U+006C LATIN SMALL LETTER L */
+    XK_m:                           0x006d, /* U+006D LATIN SMALL LETTER M */
+    XK_n:                           0x006e, /* U+006E LATIN SMALL LETTER N */
+    XK_o:                           0x006f, /* U+006F LATIN SMALL LETTER O */
+    XK_p:                           0x0070, /* U+0070 LATIN SMALL LETTER P */
+    XK_q:                           0x0071, /* U+0071 LATIN SMALL LETTER Q */
+    XK_r:                           0x0072, /* U+0072 LATIN SMALL LETTER R */
+    XK_s:                           0x0073, /* U+0073 LATIN SMALL LETTER S */
+    XK_t:                           0x0074, /* U+0074 LATIN SMALL LETTER T */
+    XK_u:                           0x0075, /* U+0075 LATIN SMALL LETTER U */
+    XK_v:                           0x0076, /* U+0076 LATIN SMALL LETTER V */
+    XK_w:                           0x0077, /* U+0077 LATIN SMALL LETTER W */
+    XK_x:                           0x0078, /* U+0078 LATIN SMALL LETTER X */
+    XK_y:                           0x0079, /* U+0079 LATIN SMALL LETTER Y */
+    XK_z:                           0x007a, /* U+007A LATIN SMALL LETTER Z */
+    XK_braceleft:                   0x007b, /* U+007B LEFT CURLY BRACKET */
+    XK_bar:                         0x007c, /* U+007C VERTICAL LINE */
+    XK_braceright:                  0x007d, /* U+007D RIGHT CURLY BRACKET */
+    XK_asciitilde:                  0x007e, /* U+007E TILDE */
+
+    XK_nobreakspace:                0x00a0, /* U+00A0 NO-BREAK SPACE */
+    XK_exclamdown:                  0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */
+    XK_cent:                        0x00a2, /* U+00A2 CENT SIGN */
+    XK_sterling:                    0x00a3, /* U+00A3 POUND SIGN */
+    XK_currency:                    0x00a4, /* U+00A4 CURRENCY SIGN */
+    XK_yen:                         0x00a5, /* U+00A5 YEN SIGN */
+    XK_brokenbar:                   0x00a6, /* U+00A6 BROKEN BAR */
+    XK_section:                     0x00a7, /* U+00A7 SECTION SIGN */
+    XK_diaeresis:                   0x00a8, /* U+00A8 DIAERESIS */
+    XK_copyright:                   0x00a9, /* U+00A9 COPYRIGHT SIGN */
+    XK_ordfeminine:                 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */
+    XK_guillemotleft:               0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
+    XK_notsign:                     0x00ac, /* U+00AC NOT SIGN */
+    XK_hyphen:                      0x00ad, /* U+00AD SOFT HYPHEN */
+    XK_registered:                  0x00ae, /* U+00AE REGISTERED SIGN */
+    XK_macron:                      0x00af, /* U+00AF MACRON */
+    XK_degree:                      0x00b0, /* U+00B0 DEGREE SIGN */
+    XK_plusminus:                   0x00b1, /* U+00B1 PLUS-MINUS SIGN */
+    XK_twosuperior:                 0x00b2, /* U+00B2 SUPERSCRIPT TWO */
+    XK_threesuperior:               0x00b3, /* U+00B3 SUPERSCRIPT THREE */
+    XK_acute:                       0x00b4, /* U+00B4 ACUTE ACCENT */
+    XK_mu:                          0x00b5, /* U+00B5 MICRO SIGN */
+    XK_paragraph:                   0x00b6, /* U+00B6 PILCROW SIGN */
+    XK_periodcentered:              0x00b7, /* U+00B7 MIDDLE DOT */
+    XK_cedilla:                     0x00b8, /* U+00B8 CEDILLA */
+    XK_onesuperior:                 0x00b9, /* U+00B9 SUPERSCRIPT ONE */
+    XK_masculine:                   0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */
+    XK_guillemotright:              0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
+    XK_onequarter:                  0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */
+    XK_onehalf:                     0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */
+    XK_threequarters:               0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */
+    XK_questiondown:                0x00bf, /* U+00BF INVERTED QUESTION MARK */
+    XK_Agrave:                      0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */
+    XK_Aacute:                      0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */
+    XK_Acircumflex:                 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+    XK_Atilde:                      0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */
+    XK_Adiaeresis:                  0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */
+    XK_Aring:                       0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */
+    XK_AE:                          0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */
+    XK_Ccedilla:                    0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */
+    XK_Egrave:                      0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */
+    XK_Eacute:                      0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
+    XK_Ecircumflex:                 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+    XK_Ediaeresis:                  0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */
+    XK_Igrave:                      0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */
+    XK_Iacute:                      0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */
+    XK_Icircumflex:                 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+    XK_Idiaeresis:                  0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */
+    XK_ETH:                         0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */
+    XK_Eth:                         0x00d0, /* deprecated */
+    XK_Ntilde:                      0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */
+    XK_Ograve:                      0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */
+    XK_Oacute:                      0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */
+    XK_Ocircumflex:                 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+    XK_Otilde:                      0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */
+    XK_Odiaeresis:                  0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */
+    XK_multiply:                    0x00d7, /* U+00D7 MULTIPLICATION SIGN */
+    XK_Oslash:                      0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
+    XK_Ooblique:                    0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
+    XK_Ugrave:                      0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */
+    XK_Uacute:                      0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */
+    XK_Ucircumflex:                 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+    XK_Udiaeresis:                  0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */
+    XK_Yacute:                      0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */
+    XK_THORN:                       0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */
+    XK_Thorn:                       0x00de, /* deprecated */
+    XK_ssharp:                      0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */
+    XK_agrave:                      0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */
+    XK_aacute:                      0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */
+    XK_acircumflex:                 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
+    XK_atilde:                      0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */
+    XK_adiaeresis:                  0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */
+    XK_aring:                       0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */
+    XK_ae:                          0x00e6, /* U+00E6 LATIN SMALL LETTER AE */
+    XK_ccedilla:                    0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */
+    XK_egrave:                      0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */
+    XK_eacute:                      0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
+    XK_ecircumflex:                 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */
+    XK_ediaeresis:                  0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */
+    XK_igrave:                      0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */
+    XK_iacute:                      0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */
+    XK_icircumflex:                 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */
+    XK_idiaeresis:                  0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */
+    XK_eth:                         0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */
+    XK_ntilde:                      0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */
+    XK_ograve:                      0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */
+    XK_oacute:                      0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */
+    XK_ocircumflex:                 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
+    XK_otilde:                      0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */
+    XK_odiaeresis:                  0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */
+    XK_division:                    0x00f7, /* U+00F7 DIVISION SIGN */
+    XK_oslash:                      0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
+    XK_ooblique:                    0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
+    XK_ugrave:                      0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */
+    XK_uacute:                      0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */
+    XK_ucircumflex:                 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */
+    XK_udiaeresis:                  0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */
+    XK_yacute:                      0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */
+    XK_thorn:                       0x00fe, /* U+00FE LATIN SMALL LETTER THORN */
+    XK_ydiaeresis:                  0x00ff, /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
+
+    /*
+     * Korean
+     * Byte 3 = 0x0e
+     */
+
+    XK_Hangul:                      0xff31, /* Hangul start/stop(toggle) */
+    XK_Hangul_Hanja:                0xff34, /* Start Hangul->Hanja Conversion */
+    XK_Hangul_Jeonja:               0xff38, /* Jeonja mode */
+
+    /*
+     * XFree86 vendor specific keysyms.
+     *
+     * The XFree86 keysym range is 0x10080001 - 0x1008FFFF.
+     */
+
+    XF86XK_ModeLock:                0x1008FF01,
+    XF86XK_MonBrightnessUp:         0x1008FF02,
+    XF86XK_MonBrightnessDown:       0x1008FF03,
+    XF86XK_KbdLightOnOff:           0x1008FF04,
+    XF86XK_KbdBrightnessUp:         0x1008FF05,
+    XF86XK_KbdBrightnessDown:       0x1008FF06,
+    XF86XK_Standby:                 0x1008FF10,
+    XF86XK_AudioLowerVolume:        0x1008FF11,
+    XF86XK_AudioMute:               0x1008FF12,
+    XF86XK_AudioRaiseVolume:        0x1008FF13,
+    XF86XK_AudioPlay:               0x1008FF14,
+    XF86XK_AudioStop:               0x1008FF15,
+    XF86XK_AudioPrev:               0x1008FF16,
+    XF86XK_AudioNext:               0x1008FF17,
+    XF86XK_HomePage:                0x1008FF18,
+    XF86XK_Mail:                    0x1008FF19,
+    XF86XK_Start:                   0x1008FF1A,
+    XF86XK_Search:                  0x1008FF1B,
+    XF86XK_AudioRecord:             0x1008FF1C,
+    XF86XK_Calculator:              0x1008FF1D,
+    XF86XK_Memo:                    0x1008FF1E,
+    XF86XK_ToDoList:                0x1008FF1F,
+    XF86XK_Calendar:                0x1008FF20,
+    XF86XK_PowerDown:               0x1008FF21,
+    XF86XK_ContrastAdjust:          0x1008FF22,
+    XF86XK_RockerUp:                0x1008FF23,
+    XF86XK_RockerDown:              0x1008FF24,
+    XF86XK_RockerEnter:             0x1008FF25,
+    XF86XK_Back:                    0x1008FF26,
+    XF86XK_Forward:                 0x1008FF27,
+    XF86XK_Stop:                    0x1008FF28,
+    XF86XK_Refresh:                 0x1008FF29,
+    XF86XK_PowerOff:                0x1008FF2A,
+    XF86XK_WakeUp:                  0x1008FF2B,
+    XF86XK_Eject:                   0x1008FF2C,
+    XF86XK_ScreenSaver:             0x1008FF2D,
+    XF86XK_WWW:                     0x1008FF2E,
+    XF86XK_Sleep:                   0x1008FF2F,
+    XF86XK_Favorites:               0x1008FF30,
+    XF86XK_AudioPause:              0x1008FF31,
+    XF86XK_AudioMedia:              0x1008FF32,
+    XF86XK_MyComputer:              0x1008FF33,
+    XF86XK_VendorHome:              0x1008FF34,
+    XF86XK_LightBulb:               0x1008FF35,
+    XF86XK_Shop:                    0x1008FF36,
+    XF86XK_History:                 0x1008FF37,
+    XF86XK_OpenURL:                 0x1008FF38,
+    XF86XK_AddFavorite:             0x1008FF39,
+    XF86XK_HotLinks:                0x1008FF3A,
+    XF86XK_BrightnessAdjust:        0x1008FF3B,
+    XF86XK_Finance:                 0x1008FF3C,
+    XF86XK_Community:               0x1008FF3D,
+    XF86XK_AudioRewind:             0x1008FF3E,
+    XF86XK_BackForward:             0x1008FF3F,
+    XF86XK_Launch0:                 0x1008FF40,
+    XF86XK_Launch1:                 0x1008FF41,
+    XF86XK_Launch2:                 0x1008FF42,
+    XF86XK_Launch3:                 0x1008FF43,
+    XF86XK_Launch4:                 0x1008FF44,
+    XF86XK_Launch5:                 0x1008FF45,
+    XF86XK_Launch6:                 0x1008FF46,
+    XF86XK_Launch7:                 0x1008FF47,
+    XF86XK_Launch8:                 0x1008FF48,
+    XF86XK_Launch9:                 0x1008FF49,
+    XF86XK_LaunchA:                 0x1008FF4A,
+    XF86XK_LaunchB:                 0x1008FF4B,
+    XF86XK_LaunchC:                 0x1008FF4C,
+    XF86XK_LaunchD:                 0x1008FF4D,
+    XF86XK_LaunchE:                 0x1008FF4E,
+    XF86XK_LaunchF:                 0x1008FF4F,
+    XF86XK_ApplicationLeft:         0x1008FF50,
+    XF86XK_ApplicationRight:        0x1008FF51,
+    XF86XK_Book:                    0x1008FF52,
+    XF86XK_CD:                      0x1008FF53,
+    XF86XK_Calculater:              0x1008FF54,
+    XF86XK_Clear:                   0x1008FF55,
+    XF86XK_Close:                   0x1008FF56,
+    XF86XK_Copy:                    0x1008FF57,
+    XF86XK_Cut:                     0x1008FF58,
+    XF86XK_Display:                 0x1008FF59,
+    XF86XK_DOS:                     0x1008FF5A,
+    XF86XK_Documents:               0x1008FF5B,
+    XF86XK_Excel:                   0x1008FF5C,
+    XF86XK_Explorer:                0x1008FF5D,
+    XF86XK_Game:                    0x1008FF5E,
+    XF86XK_Go:                      0x1008FF5F,
+    XF86XK_iTouch:                  0x1008FF60,
+    XF86XK_LogOff:                  0x1008FF61,
+    XF86XK_Market:                  0x1008FF62,
+    XF86XK_Meeting:                 0x1008FF63,
+    XF86XK_MenuKB:                  0x1008FF65,
+    XF86XK_MenuPB:                  0x1008FF66,
+    XF86XK_MySites:                 0x1008FF67,
+    XF86XK_New:                     0x1008FF68,
+    XF86XK_News:                    0x1008FF69,
+    XF86XK_OfficeHome:              0x1008FF6A,
+    XF86XK_Open:                    0x1008FF6B,
+    XF86XK_Option:                  0x1008FF6C,
+    XF86XK_Paste:                   0x1008FF6D,
+    XF86XK_Phone:                   0x1008FF6E,
+    XF86XK_Q:                       0x1008FF70,
+    XF86XK_Reply:                   0x1008FF72,
+    XF86XK_Reload:                  0x1008FF73,
+    XF86XK_RotateWindows:           0x1008FF74,
+    XF86XK_RotationPB:              0x1008FF75,
+    XF86XK_RotationKB:              0x1008FF76,
+    XF86XK_Save:                    0x1008FF77,
+    XF86XK_ScrollUp:                0x1008FF78,
+    XF86XK_ScrollDown:              0x1008FF79,
+    XF86XK_ScrollClick:             0x1008FF7A,
+    XF86XK_Send:                    0x1008FF7B,
+    XF86XK_Spell:                   0x1008FF7C,
+    XF86XK_SplitScreen:             0x1008FF7D,
+    XF86XK_Support:                 0x1008FF7E,
+    XF86XK_TaskPane:                0x1008FF7F,
+    XF86XK_Terminal:                0x1008FF80,
+    XF86XK_Tools:                   0x1008FF81,
+    XF86XK_Travel:                  0x1008FF82,
+    XF86XK_UserPB:                  0x1008FF84,
+    XF86XK_User1KB:                 0x1008FF85,
+    XF86XK_User2KB:                 0x1008FF86,
+    XF86XK_Video:                   0x1008FF87,
+    XF86XK_WheelButton:             0x1008FF88,
+    XF86XK_Word:                    0x1008FF89,
+    XF86XK_Xfer:                    0x1008FF8A,
+    XF86XK_ZoomIn:                  0x1008FF8B,
+    XF86XK_ZoomOut:                 0x1008FF8C,
+    XF86XK_Away:                    0x1008FF8D,
+    XF86XK_Messenger:               0x1008FF8E,
+    XF86XK_WebCam:                  0x1008FF8F,
+    XF86XK_MailForward:             0x1008FF90,
+    XF86XK_Pictures:                0x1008FF91,
+    XF86XK_Music:                   0x1008FF92,
+    XF86XK_Battery:                 0x1008FF93,
+    XF86XK_Bluetooth:               0x1008FF94,
+    XF86XK_WLAN:                    0x1008FF95,
+    XF86XK_UWB:                     0x1008FF96,
+    XF86XK_AudioForward:            0x1008FF97,
+    XF86XK_AudioRepeat:             0x1008FF98,
+    XF86XK_AudioRandomPlay:         0x1008FF99,
+    XF86XK_Subtitle:                0x1008FF9A,
+    XF86XK_AudioCycleTrack:         0x1008FF9B,
+    XF86XK_CycleAngle:              0x1008FF9C,
+    XF86XK_FrameBack:               0x1008FF9D,
+    XF86XK_FrameForward:            0x1008FF9E,
+    XF86XK_Time:                    0x1008FF9F,
+    XF86XK_Select:                  0x1008FFA0,
+    XF86XK_View:                    0x1008FFA1,
+    XF86XK_TopMenu:                 0x1008FFA2,
+    XF86XK_Red:                     0x1008FFA3,
+    XF86XK_Green:                   0x1008FFA4,
+    XF86XK_Yellow:                  0x1008FFA5,
+    XF86XK_Blue:                    0x1008FFA6,
+    XF86XK_Suspend:                 0x1008FFA7,
+    XF86XK_Hibernate:               0x1008FFA8,
+    XF86XK_TouchpadToggle:          0x1008FFA9,
+    XF86XK_TouchpadOn:              0x1008FFB0,
+    XF86XK_TouchpadOff:             0x1008FFB1,
+    XF86XK_AudioMicMute:            0x1008FFB2,
+    XF86XK_Switch_VT_1:             0x1008FE01,
+    XF86XK_Switch_VT_2:             0x1008FE02,
+    XF86XK_Switch_VT_3:             0x1008FE03,
+    XF86XK_Switch_VT_4:             0x1008FE04,
+    XF86XK_Switch_VT_5:             0x1008FE05,
+    XF86XK_Switch_VT_6:             0x1008FE06,
+    XF86XK_Switch_VT_7:             0x1008FE07,
+    XF86XK_Switch_VT_8:             0x1008FE08,
+    XF86XK_Switch_VT_9:             0x1008FE09,
+    XF86XK_Switch_VT_10:            0x1008FE0A,
+    XF86XK_Switch_VT_11:            0x1008FE0B,
+    XF86XK_Switch_VT_12:            0x1008FE0C,
+    XF86XK_Ungrab:                  0x1008FE20,
+    XF86XK_ClearGrab:               0x1008FE21,
+    XF86XK_Next_VMode:              0x1008FE22,
+    XF86XK_Prev_VMode:              0x1008FE23,
+    XF86XK_LogWindowTree:           0x1008FE24,
+    XF86XK_LogGrabInfo:             0x1008FE25,
+};
diff --git a/systemvm/agent/noVNC/core/input/keysymdef.js b/systemvm/agent/noVNC/core/input/keysymdef.js
new file mode 100644
index 0000000..951caca
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/keysymdef.js
@@ -0,0 +1,688 @@
+/*
+ * Mapping from Unicode codepoints to X11/RFB keysyms
+ *
+ * This file was automatically generated from keysymdef.h
+ * DO NOT EDIT!
+ */
+
+/* Functions at the bottom */
+
+const codepoints = {
+    0x0100: 0x03c0, // XK_Amacron
+    0x0101: 0x03e0, // XK_amacron
+    0x0102: 0x01c3, // XK_Abreve
+    0x0103: 0x01e3, // XK_abreve
+    0x0104: 0x01a1, // XK_Aogonek
+    0x0105: 0x01b1, // XK_aogonek
+    0x0106: 0x01c6, // XK_Cacute
+    0x0107: 0x01e6, // XK_cacute
+    0x0108: 0x02c6, // XK_Ccircumflex
+    0x0109: 0x02e6, // XK_ccircumflex
+    0x010a: 0x02c5, // XK_Cabovedot
+    0x010b: 0x02e5, // XK_cabovedot
+    0x010c: 0x01c8, // XK_Ccaron
+    0x010d: 0x01e8, // XK_ccaron
+    0x010e: 0x01cf, // XK_Dcaron
+    0x010f: 0x01ef, // XK_dcaron
+    0x0110: 0x01d0, // XK_Dstroke
+    0x0111: 0x01f0, // XK_dstroke
+    0x0112: 0x03aa, // XK_Emacron
+    0x0113: 0x03ba, // XK_emacron
+    0x0116: 0x03cc, // XK_Eabovedot
+    0x0117: 0x03ec, // XK_eabovedot
+    0x0118: 0x01ca, // XK_Eogonek
+    0x0119: 0x01ea, // XK_eogonek
+    0x011a: 0x01cc, // XK_Ecaron
+    0x011b: 0x01ec, // XK_ecaron
+    0x011c: 0x02d8, // XK_Gcircumflex
+    0x011d: 0x02f8, // XK_gcircumflex
+    0x011e: 0x02ab, // XK_Gbreve
+    0x011f: 0x02bb, // XK_gbreve
+    0x0120: 0x02d5, // XK_Gabovedot
+    0x0121: 0x02f5, // XK_gabovedot
+    0x0122: 0x03ab, // XK_Gcedilla
+    0x0123: 0x03bb, // XK_gcedilla
+    0x0124: 0x02a6, // XK_Hcircumflex
+    0x0125: 0x02b6, // XK_hcircumflex
+    0x0126: 0x02a1, // XK_Hstroke
+    0x0127: 0x02b1, // XK_hstroke
+    0x0128: 0x03a5, // XK_Itilde
+    0x0129: 0x03b5, // XK_itilde
+    0x012a: 0x03cf, // XK_Imacron
+    0x012b: 0x03ef, // XK_imacron
+    0x012e: 0x03c7, // XK_Iogonek
+    0x012f: 0x03e7, // XK_iogonek
+    0x0130: 0x02a9, // XK_Iabovedot
+    0x0131: 0x02b9, // XK_idotless
+    0x0134: 0x02ac, // XK_Jcircumflex
+    0x0135: 0x02bc, // XK_jcircumflex
+    0x0136: 0x03d3, // XK_Kcedilla
+    0x0137: 0x03f3, // XK_kcedilla
+    0x0138: 0x03a2, // XK_kra
+    0x0139: 0x01c5, // XK_Lacute
+    0x013a: 0x01e5, // XK_lacute
+    0x013b: 0x03a6, // XK_Lcedilla
+    0x013c: 0x03b6, // XK_lcedilla
+    0x013d: 0x01a5, // XK_Lcaron
+    0x013e: 0x01b5, // XK_lcaron
+    0x0141: 0x01a3, // XK_Lstroke
+    0x0142: 0x01b3, // XK_lstroke
+    0x0143: 0x01d1, // XK_Nacute
+    0x0144: 0x01f1, // XK_nacute
+    0x0145: 0x03d1, // XK_Ncedilla
+    0x0146: 0x03f1, // XK_ncedilla
+    0x0147: 0x01d2, // XK_Ncaron
+    0x0148: 0x01f2, // XK_ncaron
+    0x014a: 0x03bd, // XK_ENG
+    0x014b: 0x03bf, // XK_eng
+    0x014c: 0x03d2, // XK_Omacron
+    0x014d: 0x03f2, // XK_omacron
+    0x0150: 0x01d5, // XK_Odoubleacute
+    0x0151: 0x01f5, // XK_odoubleacute
+    0x0152: 0x13bc, // XK_OE
+    0x0153: 0x13bd, // XK_oe
+    0x0154: 0x01c0, // XK_Racute
+    0x0155: 0x01e0, // XK_racute
+    0x0156: 0x03a3, // XK_Rcedilla
+    0x0157: 0x03b3, // XK_rcedilla
+    0x0158: 0x01d8, // XK_Rcaron
+    0x0159: 0x01f8, // XK_rcaron
+    0x015a: 0x01a6, // XK_Sacute
+    0x015b: 0x01b6, // XK_sacute
+    0x015c: 0x02de, // XK_Scircumflex
+    0x015d: 0x02fe, // XK_scircumflex
+    0x015e: 0x01aa, // XK_Scedilla
+    0x015f: 0x01ba, // XK_scedilla
+    0x0160: 0x01a9, // XK_Scaron
+    0x0161: 0x01b9, // XK_scaron
+    0x0162: 0x01de, // XK_Tcedilla
+    0x0163: 0x01fe, // XK_tcedilla
+    0x0164: 0x01ab, // XK_Tcaron
+    0x0165: 0x01bb, // XK_tcaron
+    0x0166: 0x03ac, // XK_Tslash
+    0x0167: 0x03bc, // XK_tslash
+    0x0168: 0x03dd, // XK_Utilde
+    0x0169: 0x03fd, // XK_utilde
+    0x016a: 0x03de, // XK_Umacron
+    0x016b: 0x03fe, // XK_umacron
+    0x016c: 0x02dd, // XK_Ubreve
+    0x016d: 0x02fd, // XK_ubreve
+    0x016e: 0x01d9, // XK_Uring
+    0x016f: 0x01f9, // XK_uring
+    0x0170: 0x01db, // XK_Udoubleacute
+    0x0171: 0x01fb, // XK_udoubleacute
+    0x0172: 0x03d9, // XK_Uogonek
+    0x0173: 0x03f9, // XK_uogonek
+    0x0178: 0x13be, // XK_Ydiaeresis
+    0x0179: 0x01ac, // XK_Zacute
+    0x017a: 0x01bc, // XK_zacute
+    0x017b: 0x01af, // XK_Zabovedot
+    0x017c: 0x01bf, // XK_zabovedot
+    0x017d: 0x01ae, // XK_Zcaron
+    0x017e: 0x01be, // XK_zcaron
+    0x0192: 0x08f6, // XK_function
+    0x01d2: 0x10001d1, // XK_Ocaron
+    0x02c7: 0x01b7, // XK_caron
+    0x02d8: 0x01a2, // XK_breve
+    0x02d9: 0x01ff, // XK_abovedot
+    0x02db: 0x01b2, // XK_ogonek
+    0x02dd: 0x01bd, // XK_doubleacute
+    0x0385: 0x07ae, // XK_Greek_accentdieresis
+    0x0386: 0x07a1, // XK_Greek_ALPHAaccent
+    0x0388: 0x07a2, // XK_Greek_EPSILONaccent
+    0x0389: 0x07a3, // XK_Greek_ETAaccent
+    0x038a: 0x07a4, // XK_Greek_IOTAaccent
+    0x038c: 0x07a7, // XK_Greek_OMICRONaccent
+    0x038e: 0x07a8, // XK_Greek_UPSILONaccent
+    0x038f: 0x07ab, // XK_Greek_OMEGAaccent
+    0x0390: 0x07b6, // XK_Greek_iotaaccentdieresis
+    0x0391: 0x07c1, // XK_Greek_ALPHA
+    0x0392: 0x07c2, // XK_Greek_BETA
+    0x0393: 0x07c3, // XK_Greek_GAMMA
+    0x0394: 0x07c4, // XK_Greek_DELTA
+    0x0395: 0x07c5, // XK_Greek_EPSILON
+    0x0396: 0x07c6, // XK_Greek_ZETA
+    0x0397: 0x07c7, // XK_Greek_ETA
+    0x0398: 0x07c8, // XK_Greek_THETA
+    0x0399: 0x07c9, // XK_Greek_IOTA
+    0x039a: 0x07ca, // XK_Greek_KAPPA
+    0x039b: 0x07cb, // XK_Greek_LAMDA
+    0x039c: 0x07cc, // XK_Greek_MU
+    0x039d: 0x07cd, // XK_Greek_NU
+    0x039e: 0x07ce, // XK_Greek_XI
+    0x039f: 0x07cf, // XK_Greek_OMICRON
+    0x03a0: 0x07d0, // XK_Greek_PI
+    0x03a1: 0x07d1, // XK_Greek_RHO
+    0x03a3: 0x07d2, // XK_Greek_SIGMA
+    0x03a4: 0x07d4, // XK_Greek_TAU
+    0x03a5: 0x07d5, // XK_Greek_UPSILON
+    0x03a6: 0x07d6, // XK_Greek_PHI
+    0x03a7: 0x07d7, // XK_Greek_CHI
+    0x03a8: 0x07d8, // XK_Greek_PSI
+    0x03a9: 0x07d9, // XK_Greek_OMEGA
+    0x03aa: 0x07a5, // XK_Greek_IOTAdieresis
+    0x03ab: 0x07a9, // XK_Greek_UPSILONdieresis
+    0x03ac: 0x07b1, // XK_Greek_alphaaccent
+    0x03ad: 0x07b2, // XK_Greek_epsilonaccent
+    0x03ae: 0x07b3, // XK_Greek_etaaccent
+    0x03af: 0x07b4, // XK_Greek_iotaaccent
+    0x03b0: 0x07ba, // XK_Greek_upsilonaccentdieresis
+    0x03b1: 0x07e1, // XK_Greek_alpha
+    0x03b2: 0x07e2, // XK_Greek_beta
+    0x03b3: 0x07e3, // XK_Greek_gamma
+    0x03b4: 0x07e4, // XK_Greek_delta
+    0x03b5: 0x07e5, // XK_Greek_epsilon
+    0x03b6: 0x07e6, // XK_Greek_zeta
+    0x03b7: 0x07e7, // XK_Greek_eta
+    0x03b8: 0x07e8, // XK_Greek_theta
+    0x03b9: 0x07e9, // XK_Greek_iota
+    0x03ba: 0x07ea, // XK_Greek_kappa
+    0x03bb: 0x07eb, // XK_Greek_lamda
+    0x03bc: 0x07ec, // XK_Greek_mu
+    0x03bd: 0x07ed, // XK_Greek_nu
+    0x03be: 0x07ee, // XK_Greek_xi
+    0x03bf: 0x07ef, // XK_Greek_omicron
+    0x03c0: 0x07f0, // XK_Greek_pi
+    0x03c1: 0x07f1, // XK_Greek_rho
+    0x03c2: 0x07f3, // XK_Greek_finalsmallsigma
+    0x03c3: 0x07f2, // XK_Greek_sigma
+    0x03c4: 0x07f4, // XK_Greek_tau
+    0x03c5: 0x07f5, // XK_Greek_upsilon
+    0x03c6: 0x07f6, // XK_Greek_phi
+    0x03c7: 0x07f7, // XK_Greek_chi
+    0x03c8: 0x07f8, // XK_Greek_psi
+    0x03c9: 0x07f9, // XK_Greek_omega
+    0x03ca: 0x07b5, // XK_Greek_iotadieresis
+    0x03cb: 0x07b9, // XK_Greek_upsilondieresis
+    0x03cc: 0x07b7, // XK_Greek_omicronaccent
+    0x03cd: 0x07b8, // XK_Greek_upsilonaccent
+    0x03ce: 0x07bb, // XK_Greek_omegaaccent
+    0x0401: 0x06b3, // XK_Cyrillic_IO
+    0x0402: 0x06b1, // XK_Serbian_DJE
+    0x0403: 0x06b2, // XK_Macedonia_GJE
+    0x0404: 0x06b4, // XK_Ukrainian_IE
+    0x0405: 0x06b5, // XK_Macedonia_DSE
+    0x0406: 0x06b6, // XK_Ukrainian_I
+    0x0407: 0x06b7, // XK_Ukrainian_YI
+    0x0408: 0x06b8, // XK_Cyrillic_JE
+    0x0409: 0x06b9, // XK_Cyrillic_LJE
+    0x040a: 0x06ba, // XK_Cyrillic_NJE
+    0x040b: 0x06bb, // XK_Serbian_TSHE
+    0x040c: 0x06bc, // XK_Macedonia_KJE
+    0x040e: 0x06be, // XK_Byelorussian_SHORTU
+    0x040f: 0x06bf, // XK_Cyrillic_DZHE
+    0x0410: 0x06e1, // XK_Cyrillic_A
+    0x0411: 0x06e2, // XK_Cyrillic_BE
+    0x0412: 0x06f7, // XK_Cyrillic_VE
+    0x0413: 0x06e7, // XK_Cyrillic_GHE
+    0x0414: 0x06e4, // XK_Cyrillic_DE
+    0x0415: 0x06e5, // XK_Cyrillic_IE
+    0x0416: 0x06f6, // XK_Cyrillic_ZHE
+    0x0417: 0x06fa, // XK_Cyrillic_ZE
+    0x0418: 0x06e9, // XK_Cyrillic_I
+    0x0419: 0x06ea, // XK_Cyrillic_SHORTI
+    0x041a: 0x06eb, // XK_Cyrillic_KA
+    0x041b: 0x06ec, // XK_Cyrillic_EL
+    0x041c: 0x06ed, // XK_Cyrillic_EM
+    0x041d: 0x06ee, // XK_Cyrillic_EN
+    0x041e: 0x06ef, // XK_Cyrillic_O
+    0x041f: 0x06f0, // XK_Cyrillic_PE
+    0x0420: 0x06f2, // XK_Cyrillic_ER
+    0x0421: 0x06f3, // XK_Cyrillic_ES
+    0x0422: 0x06f4, // XK_Cyrillic_TE
+    0x0423: 0x06f5, // XK_Cyrillic_U
+    0x0424: 0x06e6, // XK_Cyrillic_EF
+    0x0425: 0x06e8, // XK_Cyrillic_HA
+    0x0426: 0x06e3, // XK_Cyrillic_TSE
+    0x0427: 0x06fe, // XK_Cyrillic_CHE
+    0x0428: 0x06fb, // XK_Cyrillic_SHA
+    0x0429: 0x06fd, // XK_Cyrillic_SHCHA
+    0x042a: 0x06ff, // XK_Cyrillic_HARDSIGN
+    0x042b: 0x06f9, // XK_Cyrillic_YERU
+    0x042c: 0x06f8, // XK_Cyrillic_SOFTSIGN
+    0x042d: 0x06fc, // XK_Cyrillic_E
+    0x042e: 0x06e0, // XK_Cyrillic_YU
+    0x042f: 0x06f1, // XK_Cyrillic_YA
+    0x0430: 0x06c1, // XK_Cyrillic_a
+    0x0431: 0x06c2, // XK_Cyrillic_be
+    0x0432: 0x06d7, // XK_Cyrillic_ve
+    0x0433: 0x06c7, // XK_Cyrillic_ghe
+    0x0434: 0x06c4, // XK_Cyrillic_de
+    0x0435: 0x06c5, // XK_Cyrillic_ie
+    0x0436: 0x06d6, // XK_Cyrillic_zhe
+    0x0437: 0x06da, // XK_Cyrillic_ze
+    0x0438: 0x06c9, // XK_Cyrillic_i
+    0x0439: 0x06ca, // XK_Cyrillic_shorti
+    0x043a: 0x06cb, // XK_Cyrillic_ka
+    0x043b: 0x06cc, // XK_Cyrillic_el
+    0x043c: 0x06cd, // XK_Cyrillic_em
+    0x043d: 0x06ce, // XK_Cyrillic_en
+    0x043e: 0x06cf, // XK_Cyrillic_o
+    0x043f: 0x06d0, // XK_Cyrillic_pe
+    0x0440: 0x06d2, // XK_Cyrillic_er
+    0x0441: 0x06d3, // XK_Cyrillic_es
+    0x0442: 0x06d4, // XK_Cyrillic_te
+    0x0443: 0x06d5, // XK_Cyrillic_u
+    0x0444: 0x06c6, // XK_Cyrillic_ef
+    0x0445: 0x06c8, // XK_Cyrillic_ha
+    0x0446: 0x06c3, // XK_Cyrillic_tse
+    0x0447: 0x06de, // XK_Cyrillic_che
+    0x0448: 0x06db, // XK_Cyrillic_sha
+    0x0449: 0x06dd, // XK_Cyrillic_shcha
+    0x044a: 0x06df, // XK_Cyrillic_hardsign
+    0x044b: 0x06d9, // XK_Cyrillic_yeru
+    0x044c: 0x06d8, // XK_Cyrillic_softsign
+    0x044d: 0x06dc, // XK_Cyrillic_e
+    0x044e: 0x06c0, // XK_Cyrillic_yu
+    0x044f: 0x06d1, // XK_Cyrillic_ya
+    0x0451: 0x06a3, // XK_Cyrillic_io
+    0x0452: 0x06a1, // XK_Serbian_dje
+    0x0453: 0x06a2, // XK_Macedonia_gje
+    0x0454: 0x06a4, // XK_Ukrainian_ie
+    0x0455: 0x06a5, // XK_Macedonia_dse
+    0x0456: 0x06a6, // XK_Ukrainian_i
+    0x0457: 0x06a7, // XK_Ukrainian_yi
+    0x0458: 0x06a8, // XK_Cyrillic_je
+    0x0459: 0x06a9, // XK_Cyrillic_lje
+    0x045a: 0x06aa, // XK_Cyrillic_nje
+    0x045b: 0x06ab, // XK_Serbian_tshe
+    0x045c: 0x06ac, // XK_Macedonia_kje
+    0x045e: 0x06ae, // XK_Byelorussian_shortu
+    0x045f: 0x06af, // XK_Cyrillic_dzhe
+    0x0490: 0x06bd, // XK_Ukrainian_GHE_WITH_UPTURN
+    0x0491: 0x06ad, // XK_Ukrainian_ghe_with_upturn
+    0x05d0: 0x0ce0, // XK_hebrew_aleph
+    0x05d1: 0x0ce1, // XK_hebrew_bet
+    0x05d2: 0x0ce2, // XK_hebrew_gimel
+    0x05d3: 0x0ce3, // XK_hebrew_dalet
+    0x05d4: 0x0ce4, // XK_hebrew_he
+    0x05d5: 0x0ce5, // XK_hebrew_waw
+    0x05d6: 0x0ce6, // XK_hebrew_zain
+    0x05d7: 0x0ce7, // XK_hebrew_chet
+    0x05d8: 0x0ce8, // XK_hebrew_tet
+    0x05d9: 0x0ce9, // XK_hebrew_yod
+    0x05da: 0x0cea, // XK_hebrew_finalkaph
+    0x05db: 0x0ceb, // XK_hebrew_kaph
+    0x05dc: 0x0cec, // XK_hebrew_lamed
+    0x05dd: 0x0ced, // XK_hebrew_finalmem
+    0x05de: 0x0cee, // XK_hebrew_mem
+    0x05df: 0x0cef, // XK_hebrew_finalnun
+    0x05e0: 0x0cf0, // XK_hebrew_nun
+    0x05e1: 0x0cf1, // XK_hebrew_samech
+    0x05e2: 0x0cf2, // XK_hebrew_ayin
+    0x05e3: 0x0cf3, // XK_hebrew_finalpe
+    0x05e4: 0x0cf4, // XK_hebrew_pe
+    0x05e5: 0x0cf5, // XK_hebrew_finalzade
+    0x05e6: 0x0cf6, // XK_hebrew_zade
+    0x05e7: 0x0cf7, // XK_hebrew_qoph
+    0x05e8: 0x0cf8, // XK_hebrew_resh
+    0x05e9: 0x0cf9, // XK_hebrew_shin
+    0x05ea: 0x0cfa, // XK_hebrew_taw
+    0x060c: 0x05ac, // XK_Arabic_comma
+    0x061b: 0x05bb, // XK_Arabic_semicolon
+    0x061f: 0x05bf, // XK_Arabic_question_mark
+    0x0621: 0x05c1, // XK_Arabic_hamza
+    0x0622: 0x05c2, // XK_Arabic_maddaonalef
+    0x0623: 0x05c3, // XK_Arabic_hamzaonalef
+    0x0624: 0x05c4, // XK_Arabic_hamzaonwaw
+    0x0625: 0x05c5, // XK_Arabic_hamzaunderalef
+    0x0626: 0x05c6, // XK_Arabic_hamzaonyeh
+    0x0627: 0x05c7, // XK_Arabic_alef
+    0x0628: 0x05c8, // XK_Arabic_beh
+    0x0629: 0x05c9, // XK_Arabic_tehmarbuta
+    0x062a: 0x05ca, // XK_Arabic_teh
+    0x062b: 0x05cb, // XK_Arabic_theh
+    0x062c: 0x05cc, // XK_Arabic_jeem
+    0x062d: 0x05cd, // XK_Arabic_hah
+    0x062e: 0x05ce, // XK_Arabic_khah
+    0x062f: 0x05cf, // XK_Arabic_dal
+    0x0630: 0x05d0, // XK_Arabic_thal
+    0x0631: 0x05d1, // XK_Arabic_ra
+    0x0632: 0x05d2, // XK_Arabic_zain
+    0x0633: 0x05d3, // XK_Arabic_seen
+    0x0634: 0x05d4, // XK_Arabic_sheen
+    0x0635: 0x05d5, // XK_Arabic_sad
+    0x0636: 0x05d6, // XK_Arabic_dad
+    0x0637: 0x05d7, // XK_Arabic_tah
+    0x0638: 0x05d8, // XK_Arabic_zah
+    0x0639: 0x05d9, // XK_Arabic_ain
+    0x063a: 0x05da, // XK_Arabic_ghain
+    0x0640: 0x05e0, // XK_Arabic_tatweel
+    0x0641: 0x05e1, // XK_Arabic_feh
+    0x0642: 0x05e2, // XK_Arabic_qaf
+    0x0643: 0x05e3, // XK_Arabic_kaf
+    0x0644: 0x05e4, // XK_Arabic_lam
+    0x0645: 0x05e5, // XK_Arabic_meem
+    0x0646: 0x05e6, // XK_Arabic_noon
+    0x0647: 0x05e7, // XK_Arabic_ha
+    0x0648: 0x05e8, // XK_Arabic_waw
+    0x0649: 0x05e9, // XK_Arabic_alefmaksura
+    0x064a: 0x05ea, // XK_Arabic_yeh
+    0x064b: 0x05eb, // XK_Arabic_fathatan
+    0x064c: 0x05ec, // XK_Arabic_dammatan
+    0x064d: 0x05ed, // XK_Arabic_kasratan
+    0x064e: 0x05ee, // XK_Arabic_fatha
+    0x064f: 0x05ef, // XK_Arabic_damma
+    0x0650: 0x05f0, // XK_Arabic_kasra
+    0x0651: 0x05f1, // XK_Arabic_shadda
+    0x0652: 0x05f2, // XK_Arabic_sukun
+    0x0e01: 0x0da1, // XK_Thai_kokai
+    0x0e02: 0x0da2, // XK_Thai_khokhai
+    0x0e03: 0x0da3, // XK_Thai_khokhuat
+    0x0e04: 0x0da4, // XK_Thai_khokhwai
+    0x0e05: 0x0da5, // XK_Thai_khokhon
+    0x0e06: 0x0da6, // XK_Thai_khorakhang
+    0x0e07: 0x0da7, // XK_Thai_ngongu
+    0x0e08: 0x0da8, // XK_Thai_chochan
+    0x0e09: 0x0da9, // XK_Thai_choching
+    0x0e0a: 0x0daa, // XK_Thai_chochang
+    0x0e0b: 0x0dab, // XK_Thai_soso
+    0x0e0c: 0x0dac, // XK_Thai_chochoe
+    0x0e0d: 0x0dad, // XK_Thai_yoying
+    0x0e0e: 0x0dae, // XK_Thai_dochada
+    0x0e0f: 0x0daf, // XK_Thai_topatak
+    0x0e10: 0x0db0, // XK_Thai_thothan
+    0x0e11: 0x0db1, // XK_Thai_thonangmontho
+    0x0e12: 0x0db2, // XK_Thai_thophuthao
+    0x0e13: 0x0db3, // XK_Thai_nonen
+    0x0e14: 0x0db4, // XK_Thai_dodek
+    0x0e15: 0x0db5, // XK_Thai_totao
+    0x0e16: 0x0db6, // XK_Thai_thothung
+    0x0e17: 0x0db7, // XK_Thai_thothahan
+    0x0e18: 0x0db8, // XK_Thai_thothong
+    0x0e19: 0x0db9, // XK_Thai_nonu
+    0x0e1a: 0x0dba, // XK_Thai_bobaimai
+    0x0e1b: 0x0dbb, // XK_Thai_popla
+    0x0e1c: 0x0dbc, // XK_Thai_phophung
+    0x0e1d: 0x0dbd, // XK_Thai_fofa
+    0x0e1e: 0x0dbe, // XK_Thai_phophan
+    0x0e1f: 0x0dbf, // XK_Thai_fofan
+    0x0e20: 0x0dc0, // XK_Thai_phosamphao
+    0x0e21: 0x0dc1, // XK_Thai_moma
+    0x0e22: 0x0dc2, // XK_Thai_yoyak
+    0x0e23: 0x0dc3, // XK_Thai_rorua
+    0x0e24: 0x0dc4, // XK_Thai_ru
+    0x0e25: 0x0dc5, // XK_Thai_loling
+    0x0e26: 0x0dc6, // XK_Thai_lu
+    0x0e27: 0x0dc7, // XK_Thai_wowaen
+    0x0e28: 0x0dc8, // XK_Thai_sosala
+    0x0e29: 0x0dc9, // XK_Thai_sorusi
+    0x0e2a: 0x0dca, // XK_Thai_sosua
+    0x0e2b: 0x0dcb, // XK_Thai_hohip
+    0x0e2c: 0x0dcc, // XK_Thai_lochula
+    0x0e2d: 0x0dcd, // XK_Thai_oang
+    0x0e2e: 0x0dce, // XK_Thai_honokhuk
+    0x0e2f: 0x0dcf, // XK_Thai_paiyannoi
+    0x0e30: 0x0dd0, // XK_Thai_saraa
+    0x0e31: 0x0dd1, // XK_Thai_maihanakat
+    0x0e32: 0x0dd2, // XK_Thai_saraaa
+    0x0e33: 0x0dd3, // XK_Thai_saraam
+    0x0e34: 0x0dd4, // XK_Thai_sarai
+    0x0e35: 0x0dd5, // XK_Thai_saraii
+    0x0e36: 0x0dd6, // XK_Thai_saraue
+    0x0e37: 0x0dd7, // XK_Thai_sarauee
+    0x0e38: 0x0dd8, // XK_Thai_sarau
+    0x0e39: 0x0dd9, // XK_Thai_sarauu
+    0x0e3a: 0x0dda, // XK_Thai_phinthu
+    0x0e3f: 0x0ddf, // XK_Thai_baht
+    0x0e40: 0x0de0, // XK_Thai_sarae
+    0x0e41: 0x0de1, // XK_Thai_saraae
+    0x0e42: 0x0de2, // XK_Thai_sarao
+    0x0e43: 0x0de3, // XK_Thai_saraaimaimuan
+    0x0e44: 0x0de4, // XK_Thai_saraaimaimalai
+    0x0e45: 0x0de5, // XK_Thai_lakkhangyao
+    0x0e46: 0x0de6, // XK_Thai_maiyamok
+    0x0e47: 0x0de7, // XK_Thai_maitaikhu
+    0x0e48: 0x0de8, // XK_Thai_maiek
+    0x0e49: 0x0de9, // XK_Thai_maitho
+    0x0e4a: 0x0dea, // XK_Thai_maitri
+    0x0e4b: 0x0deb, // XK_Thai_maichattawa
+    0x0e4c: 0x0dec, // XK_Thai_thanthakhat
+    0x0e4d: 0x0ded, // XK_Thai_nikhahit
+    0x0e50: 0x0df0, // XK_Thai_leksun
+    0x0e51: 0x0df1, // XK_Thai_leknung
+    0x0e52: 0x0df2, // XK_Thai_leksong
+    0x0e53: 0x0df3, // XK_Thai_leksam
+    0x0e54: 0x0df4, // XK_Thai_leksi
+    0x0e55: 0x0df5, // XK_Thai_lekha
+    0x0e56: 0x0df6, // XK_Thai_lekhok
+    0x0e57: 0x0df7, // XK_Thai_lekchet
+    0x0e58: 0x0df8, // XK_Thai_lekpaet
+    0x0e59: 0x0df9, // XK_Thai_lekkao
+    0x2002: 0x0aa2, // XK_enspace
+    0x2003: 0x0aa1, // XK_emspace
+    0x2004: 0x0aa3, // XK_em3space
+    0x2005: 0x0aa4, // XK_em4space
+    0x2007: 0x0aa5, // XK_digitspace
+    0x2008: 0x0aa6, // XK_punctspace
+    0x2009: 0x0aa7, // XK_thinspace
+    0x200a: 0x0aa8, // XK_hairspace
+    0x2012: 0x0abb, // XK_figdash
+    0x2013: 0x0aaa, // XK_endash
+    0x2014: 0x0aa9, // XK_emdash
+    0x2015: 0x07af, // XK_Greek_horizbar
+    0x2017: 0x0cdf, // XK_hebrew_doublelowline
+    0x2018: 0x0ad0, // XK_leftsinglequotemark
+    0x2019: 0x0ad1, // XK_rightsinglequotemark
+    0x201a: 0x0afd, // XK_singlelowquotemark
+    0x201c: 0x0ad2, // XK_leftdoublequotemark
+    0x201d: 0x0ad3, // XK_rightdoublequotemark
+    0x201e: 0x0afe, // XK_doublelowquotemark
+    0x2020: 0x0af1, // XK_dagger
+    0x2021: 0x0af2, // XK_doubledagger
+    0x2022: 0x0ae6, // XK_enfilledcircbullet
+    0x2025: 0x0aaf, // XK_doubbaselinedot
+    0x2026: 0x0aae, // XK_ellipsis
+    0x2030: 0x0ad5, // XK_permille
+    0x2032: 0x0ad6, // XK_minutes
+    0x2033: 0x0ad7, // XK_seconds
+    0x2038: 0x0afc, // XK_caret
+    0x203e: 0x047e, // XK_overline
+    0x20a9: 0x0eff, // XK_Korean_Won
+    0x20ac: 0x20ac, // XK_EuroSign
+    0x2105: 0x0ab8, // XK_careof
+    0x2116: 0x06b0, // XK_numerosign
+    0x2117: 0x0afb, // XK_phonographcopyright
+    0x211e: 0x0ad4, // XK_prescription
+    0x2122: 0x0ac9, // XK_trademark
+    0x2153: 0x0ab0, // XK_onethird
+    0x2154: 0x0ab1, // XK_twothirds
+    0x2155: 0x0ab2, // XK_onefifth
+    0x2156: 0x0ab3, // XK_twofifths
+    0x2157: 0x0ab4, // XK_threefifths
+    0x2158: 0x0ab5, // XK_fourfifths
+    0x2159: 0x0ab6, // XK_onesixth
+    0x215a: 0x0ab7, // XK_fivesixths
+    0x215b: 0x0ac3, // XK_oneeighth
+    0x215c: 0x0ac4, // XK_threeeighths
+    0x215d: 0x0ac5, // XK_fiveeighths
+    0x215e: 0x0ac6, // XK_seveneighths
+    0x2190: 0x08fb, // XK_leftarrow
+    0x2191: 0x08fc, // XK_uparrow
+    0x2192: 0x08fd, // XK_rightarrow
+    0x2193: 0x08fe, // XK_downarrow
+    0x21d2: 0x08ce, // XK_implies
+    0x21d4: 0x08cd, // XK_ifonlyif
+    0x2202: 0x08ef, // XK_partialderivative
+    0x2207: 0x08c5, // XK_nabla
+    0x2218: 0x0bca, // XK_jot
+    0x221a: 0x08d6, // XK_radical
+    0x221d: 0x08c1, // XK_variation
+    0x221e: 0x08c2, // XK_infinity
+    0x2227: 0x08de, // XK_logicaland
+    0x2228: 0x08df, // XK_logicalor
+    0x2229: 0x08dc, // XK_intersection
+    0x222a: 0x08dd, // XK_union
+    0x222b: 0x08bf, // XK_integral
+    0x2234: 0x08c0, // XK_therefore
+    0x223c: 0x08c8, // XK_approximate
+    0x2243: 0x08c9, // XK_similarequal
+    0x2245: 0x1002248, // XK_approxeq
+    0x2260: 0x08bd, // XK_notequal
+    0x2261: 0x08cf, // XK_identical
+    0x2264: 0x08bc, // XK_lessthanequal
+    0x2265: 0x08be, // XK_greaterthanequal
+    0x2282: 0x08da, // XK_includedin
+    0x2283: 0x08db, // XK_includes
+    0x22a2: 0x0bfc, // XK_righttack
+    0x22a3: 0x0bdc, // XK_lefttack
+    0x22a4: 0x0bc2, // XK_downtack
+    0x22a5: 0x0bce, // XK_uptack
+    0x2308: 0x0bd3, // XK_upstile
+    0x230a: 0x0bc4, // XK_downstile
+    0x2315: 0x0afa, // XK_telephonerecorder
+    0x2320: 0x08a4, // XK_topintegral
+    0x2321: 0x08a5, // XK_botintegral
+    0x2395: 0x0bcc, // XK_quad
+    0x239b: 0x08ab, // XK_topleftparens
+    0x239d: 0x08ac, // XK_botleftparens
+    0x239e: 0x08ad, // XK_toprightparens
+    0x23a0: 0x08ae, // XK_botrightparens
+    0x23a1: 0x08a7, // XK_topleftsqbracket
+    0x23a3: 0x08a8, // XK_botleftsqbracket
+    0x23a4: 0x08a9, // XK_toprightsqbracket
+    0x23a6: 0x08aa, // XK_botrightsqbracket
+    0x23a8: 0x08af, // XK_leftmiddlecurlybrace
+    0x23ac: 0x08b0, // XK_rightmiddlecurlybrace
+    0x23b7: 0x08a1, // XK_leftradical
+    0x23ba: 0x09ef, // XK_horizlinescan1
+    0x23bb: 0x09f0, // XK_horizlinescan3
+    0x23bc: 0x09f2, // XK_horizlinescan7
+    0x23bd: 0x09f3, // XK_horizlinescan9
+    0x2409: 0x09e2, // XK_ht
+    0x240a: 0x09e5, // XK_lf
+    0x240b: 0x09e9, // XK_vt
+    0x240c: 0x09e3, // XK_ff
+    0x240d: 0x09e4, // XK_cr
+    0x2423: 0x0aac, // XK_signifblank
+    0x2424: 0x09e8, // XK_nl
+    0x2500: 0x08a3, // XK_horizconnector
+    0x2502: 0x08a6, // XK_vertconnector
+    0x250c: 0x08a2, // XK_topleftradical
+    0x2510: 0x09eb, // XK_uprightcorner
+    0x2514: 0x09ed, // XK_lowleftcorner
+    0x2518: 0x09ea, // XK_lowrightcorner
+    0x251c: 0x09f4, // XK_leftt
+    0x2524: 0x09f5, // XK_rightt
+    0x252c: 0x09f7, // XK_topt
+    0x2534: 0x09f6, // XK_bott
+    0x253c: 0x09ee, // XK_crossinglines
+    0x2592: 0x09e1, // XK_checkerboard
+    0x25aa: 0x0ae7, // XK_enfilledsqbullet
+    0x25ab: 0x0ae1, // XK_enopensquarebullet
+    0x25ac: 0x0adb, // XK_filledrectbullet
+    0x25ad: 0x0ae2, // XK_openrectbullet
+    0x25ae: 0x0adf, // XK_emfilledrect
+    0x25af: 0x0acf, // XK_emopenrectangle
+    0x25b2: 0x0ae8, // XK_filledtribulletup
+    0x25b3: 0x0ae3, // XK_opentribulletup
+    0x25b6: 0x0add, // XK_filledrighttribullet
+    0x25b7: 0x0acd, // XK_rightopentriangle
+    0x25bc: 0x0ae9, // XK_filledtribulletdown
+    0x25bd: 0x0ae4, // XK_opentribulletdown
+    0x25c0: 0x0adc, // XK_filledlefttribullet
+    0x25c1: 0x0acc, // XK_leftopentriangle
+    0x25c6: 0x09e0, // XK_soliddiamond
+    0x25cb: 0x0ace, // XK_emopencircle
+    0x25cf: 0x0ade, // XK_emfilledcircle
+    0x25e6: 0x0ae0, // XK_enopencircbullet
+    0x2606: 0x0ae5, // XK_openstar
+    0x260e: 0x0af9, // XK_telephone
+    0x2613: 0x0aca, // XK_signaturemark
+    0x261c: 0x0aea, // XK_leftpointer
+    0x261e: 0x0aeb, // XK_rightpointer
+    0x2640: 0x0af8, // XK_femalesymbol
+    0x2642: 0x0af7, // XK_malesymbol
+    0x2663: 0x0aec, // XK_club
+    0x2665: 0x0aee, // XK_heart
+    0x2666: 0x0aed, // XK_diamond
+    0x266d: 0x0af6, // XK_musicalflat
+    0x266f: 0x0af5, // XK_musicalsharp
+    0x2713: 0x0af3, // XK_checkmark
+    0x2717: 0x0af4, // XK_ballotcross
+    0x271d: 0x0ad9, // XK_latincross
+    0x2720: 0x0af0, // XK_maltesecross
+    0x27e8: 0x0abc, // XK_leftanglebracket
+    0x27e9: 0x0abe, // XK_rightanglebracket
+    0x3001: 0x04a4, // XK_kana_comma
+    0x3002: 0x04a1, // XK_kana_fullstop
+    0x300c: 0x04a2, // XK_kana_openingbracket
+    0x300d: 0x04a3, // XK_kana_closingbracket
+    0x309b: 0x04de, // XK_voicedsound
+    0x309c: 0x04df, // XK_semivoicedsound
+    0x30a1: 0x04a7, // XK_kana_a
+    0x30a2: 0x04b1, // XK_kana_A
+    0x30a3: 0x04a8, // XK_kana_i
+    0x30a4: 0x04b2, // XK_kana_I
+    0x30a5: 0x04a9, // XK_kana_u
+    0x30a6: 0x04b3, // XK_kana_U
+    0x30a7: 0x04aa, // XK_kana_e
+    0x30a8: 0x04b4, // XK_kana_E
+    0x30a9: 0x04ab, // XK_kana_o
+    0x30aa: 0x04b5, // XK_kana_O
+    0x30ab: 0x04b6, // XK_kana_KA
+    0x30ad: 0x04b7, // XK_kana_KI
+    0x30af: 0x04b8, // XK_kana_KU
+    0x30b1: 0x04b9, // XK_kana_KE
+    0x30b3: 0x04ba, // XK_kana_KO
+    0x30b5: 0x04bb, // XK_kana_SA
+    0x30b7: 0x04bc, // XK_kana_SHI
+    0x30b9: 0x04bd, // XK_kana_SU
+    0x30bb: 0x04be, // XK_kana_SE
+    0x30bd: 0x04bf, // XK_kana_SO
+    0x30bf: 0x04c0, // XK_kana_TA
+    0x30c1: 0x04c1, // XK_kana_CHI
+    0x30c3: 0x04af, // XK_kana_tsu
+    0x30c4: 0x04c2, // XK_kana_TSU
+    0x30c6: 0x04c3, // XK_kana_TE
+    0x30c8: 0x04c4, // XK_kana_TO
+    0x30ca: 0x04c5, // XK_kana_NA
+    0x30cb: 0x04c6, // XK_kana_NI
+    0x30cc: 0x04c7, // XK_kana_NU
+    0x30cd: 0x04c8, // XK_kana_NE
+    0x30ce: 0x04c9, // XK_kana_NO
+    0x30cf: 0x04ca, // XK_kana_HA
+    0x30d2: 0x04cb, // XK_kana_HI
+    0x30d5: 0x04cc, // XK_kana_FU
+    0x30d8: 0x04cd, // XK_kana_HE
+    0x30db: 0x04ce, // XK_kana_HO
+    0x30de: 0x04cf, // XK_kana_MA
+    0x30df: 0x04d0, // XK_kana_MI
+    0x30e0: 0x04d1, // XK_kana_MU
+    0x30e1: 0x04d2, // XK_kana_ME
+    0x30e2: 0x04d3, // XK_kana_MO
+    0x30e3: 0x04ac, // XK_kana_ya
+    0x30e4: 0x04d4, // XK_kana_YA
+    0x30e5: 0x04ad, // XK_kana_yu
+    0x30e6: 0x04d5, // XK_kana_YU
+    0x30e7: 0x04ae, // XK_kana_yo
+    0x30e8: 0x04d6, // XK_kana_YO
+    0x30e9: 0x04d7, // XK_kana_RA
+    0x30ea: 0x04d8, // XK_kana_RI
+    0x30eb: 0x04d9, // XK_kana_RU
+    0x30ec: 0x04da, // XK_kana_RE
+    0x30ed: 0x04db, // XK_kana_RO
+    0x30ef: 0x04dc, // XK_kana_WA
+    0x30f2: 0x04a6, // XK_kana_WO
+    0x30f3: 0x04dd, // XK_kana_N
+    0x30fb: 0x04a5, // XK_kana_conjunctive
+    0x30fc: 0x04b0, // XK_prolongedsound
+};
+
+export default {
+    lookup(u) {
+        // Latin-1 is one-to-one mapping
+        if ((u >= 0x20) && (u <= 0xff)) {
+            return u;
+        }
+
+        // Lookup table (fairly random)
+        const keysym = codepoints[u];
+        if (keysym !== undefined) {
+            return keysym;
+        }
+
+        // General mapping as final fallback
+        return 0x01000000 | u;
+    },
+};
diff --git a/systemvm/agent/noVNC/core/input/uskeysym.js b/systemvm/agent/noVNC/core/input/uskeysym.js
new file mode 100644
index 0000000..97c5ae4
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/uskeysym.js
@@ -0,0 +1,57 @@
+export default {
+    '1': 0x0031, /* U+0031 DIGIT ONE */
+    '2': 0x0032, /* U+0032 DIGIT TWO */
+    '3': 0x0033, /* U+0033 DIGIT THREE */
+    '4': 0x0034, /* U+0034 DIGIT FOUR */
+    '5': 0x0035, /* U+0035 DIGIT FIVE */
+    '6': 0x0036, /* U+0036 DIGIT SIX */
+    '7': 0x0037, /* U+0037 DIGIT SEVEN */
+    '8': 0x0038, /* U+0038 DIGIT EIGHT */
+    '9': 0x0039, /* U+0039 DIGIT NINE */
+    '0': 0x0030, /* U+0030 DIGIT ZERO */
+
+    'a': 0x0061, /* U+0061 LATIN SMALL LETTER A */
+    'b': 0x0062, /* U+0062 LATIN SMALL LETTER B */
+    'c': 0x0063, /* U+0063 LATIN SMALL LETTER C */
+    'd': 0x0064, /* U+0064 LATIN SMALL LETTER D */
+    'e': 0x0065, /* U+0065 LATIN SMALL LETTER E */
+    'f': 0x0066, /* U+0066 LATIN SMALL LETTER F */
+    'g': 0x0067, /* U+0067 LATIN SMALL LETTER G */
+    'h': 0x0068, /* U+0068 LATIN SMALL LETTER H */
+    'i': 0x0069, /* U+0069 LATIN SMALL LETTER I */
+    'j': 0x006a, /* U+006A LATIN SMALL LETTER J */
+    'k': 0x006b, /* U+006B LATIN SMALL LETTER K */
+    'l': 0x006c, /* U+006C LATIN SMALL LETTER L */
+    'm': 0x006d, /* U+006D LATIN SMALL LETTER M */
+    'n': 0x006e, /* U+006E LATIN SMALL LETTER N */
+    'o': 0x006f, /* U+006F LATIN SMALL LETTER O */
+    'p': 0x0070, /* U+0070 LATIN SMALL LETTER P */
+    'q': 0x0071, /* U+0071 LATIN SMALL LETTER Q */
+    'r': 0x0072, /* U+0072 LATIN SMALL LETTER R */
+    's': 0x0073, /* U+0073 LATIN SMALL LETTER S */
+    't': 0x0074, /* U+0074 LATIN SMALL LETTER T */
+    'u': 0x0075, /* U+0075 LATIN SMALL LETTER U */
+    'v': 0x0076, /* U+0076 LATIN SMALL LETTER V */
+    'w': 0x0077, /* U+0077 LATIN SMALL LETTER W */
+    'x': 0x0078, /* U+0078 LATIN SMALL LETTER X */
+    'y': 0x0079, /* U+0079 LATIN SMALL LETTER Y */
+    'z': 0x007a, /* U+007A LATIN SMALL LETTER Z */
+
+    '`': 0x0060, /* U+0060 GRAVE ACCENT */
+    '-': 0x002d, /* U+002D HYPHEN-MINUS */
+    '=': 0x003d, /* U+003D EQUALS SIGN */
+
+    '[': 0x005b, /* U+005B LEFT SQUARE BRACKET */
+    ']': 0x005d, /* U+005D RIGHT SQUARE BRACKET */
+    '\\': 0x005c, /* U+005C REVERSE SOLIDUS */
+
+    ';': 0x003b, /* U+003B SEMICOLON */
+    '\'': 0x0027, /* U+0027 APOSTROPHE */
+
+    ',': 0x002c, /* U+002C COMMA */
+    '.': 0x002e, /* U+002E FULL STOP */
+    '/': 0x002f, /* U+002F SOLIDUS */
+
+    ' ': 0x0020, /* U+0020 SPACE */
+    '\n': 0xff0d
+}
\ No newline at end of file
diff --git a/systemvm/agent/noVNC/core/input/util.js b/systemvm/agent/noVNC/core/input/util.js
new file mode 100644
index 0000000..1b98040
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/util.js
@@ -0,0 +1,208 @@
+import KeyTable from "./keysym.js";
+import keysyms from "./keysymdef.js";
+import vkeys from "./vkeys.js";
+import fixedkeys from "./fixedkeys.js";
+import DOMKeyTable from "./domkeytable.js";
+import * as browser from "../util/browser.js";
+
+// Get 'KeyboardEvent.code', handling legacy browsers
+export function getKeycode(evt) {
+    // Are we getting proper key identifiers?
+    // (unfortunately Firefox and Chrome are crappy here and gives
+    // us an empty string on some platforms, rather than leaving it
+    // undefined)
+    if (evt.code) {
+        // Mozilla isn't fully in sync with the spec yet
+        switch (evt.code) {
+            case 'OSLeft': return 'MetaLeft';
+            case 'OSRight': return 'MetaRight';
+        }
+
+        return evt.code;
+    }
+
+    // The de-facto standard is to use Windows Virtual-Key codes
+    // in the 'keyCode' field for non-printable characters. However
+    // Webkit sets it to the same as charCode in 'keypress' events.
+    if ((evt.type !== 'keypress') && (evt.keyCode in vkeys)) {
+        let code = vkeys[evt.keyCode];
+
+        // macOS has messed up this code for some reason
+        if (browser.isMac() && (code === 'ContextMenu')) {
+            code = 'MetaRight';
+        }
+
+        // The keyCode doesn't distinguish between left and right
+        // for the standard modifiers
+        if (evt.location === 2) {
+            switch (code) {
+                case 'ShiftLeft': return 'ShiftRight';
+                case 'ControlLeft': return 'ControlRight';
+                case 'AltLeft': return 'AltRight';
+            }
+        }
+
+        // Nor a bunch of the numpad keys
+        if (evt.location === 3) {
+            switch (code) {
+                case 'Delete': return 'NumpadDecimal';
+                case 'Insert': return 'Numpad0';
+                case 'End': return 'Numpad1';
+                case 'ArrowDown': return 'Numpad2';
+                case 'PageDown': return 'Numpad3';
+                case 'ArrowLeft': return 'Numpad4';
+                case 'ArrowRight': return 'Numpad6';
+                case 'Home': return 'Numpad7';
+                case 'ArrowUp': return 'Numpad8';
+                case 'PageUp': return 'Numpad9';
+                case 'Enter': return 'NumpadEnter';
+            }
+        }
+
+        return code;
+    }
+
+    return 'Unidentified';
+}
+
+// Get 'KeyboardEvent.key', handling legacy browsers
+export function getKey(evt) {
+    // Are we getting a proper key value?
+    if (evt.key !== undefined) {
+        // IE and Edge use some ancient version of the spec
+        // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/
+        switch (evt.key) {
+            case 'Spacebar': return ' ';
+            case 'Esc': return 'Escape';
+            case 'Scroll': return 'ScrollLock';
+            case 'Win': return 'Meta';
+            case 'Apps': return 'ContextMenu';
+            case 'Up': return 'ArrowUp';
+            case 'Left': return 'ArrowLeft';
+            case 'Right': return 'ArrowRight';
+            case 'Down': return 'ArrowDown';
+            case 'Del': return 'Delete';
+            case 'Divide': return '/';
+            case 'Multiply': return '*';
+            case 'Subtract': return '-';
+            case 'Add': return '+';
+            case 'Decimal': return evt.char;
+        }
+
+        // Mozilla isn't fully in sync with the spec yet
+        switch (evt.key) {
+            case 'OS': return 'Meta';
+            case 'LaunchMyComputer': return 'LaunchApplication1';
+            case 'LaunchCalculator': return 'LaunchApplication2';
+        }
+
+        // iOS leaks some OS names
+        switch (evt.key) {
+            case 'UIKeyInputUpArrow': return 'ArrowUp';
+            case 'UIKeyInputDownArrow': return 'ArrowDown';
+            case 'UIKeyInputLeftArrow': return 'ArrowLeft';
+            case 'UIKeyInputRightArrow': return 'ArrowRight';
+            case 'UIKeyInputEscape': return 'Escape';
+        }
+
+        // Broken behaviour in Chrome
+        if ((evt.key === '\x00') && (evt.code === 'NumpadDecimal')) {
+            return 'Delete';
+        }
+
+        // IE and Edge need special handling, but for everyone else we
+        // can trust the value provided
+        if (!browser.isIE() && !browser.isEdge()) {
+            return evt.key;
+        }
+
+        // IE and Edge have broken handling of AltGraph so we can only
+        // trust them for non-printable characters (and unfortunately
+        // they also specify 'Unidentified' for some problem keys)
+        if ((evt.key.length !== 1) && (evt.key !== 'Unidentified')) {
+            return evt.key;
+        }
+    }
+
+    // Try to deduce it based on the physical key
+    const code = getKeycode(evt);
+    if (code in fixedkeys) {
+        return fixedkeys[code];
+    }
+
+    // If that failed, then see if we have a printable character
+    if (evt.charCode) {
+        return String.fromCharCode(evt.charCode);
+    }
+
+    // At this point we have nothing left to go on
+    return 'Unidentified';
+}
+
+// Get the most reliable keysym value we can get from a key event
+export function getKeysym(evt) {
+    const key = getKey(evt);
+
+    if (key === 'Unidentified') {
+        return null;
+    }
+
+    // First look up special keys
+    if (key in DOMKeyTable) {
+        let location = evt.location;
+
+        // Safari screws up location for the right cmd key
+        if ((key === 'Meta') && (location === 0)) {
+            location = 2;
+        }
+
+        // And for Clear
+        if ((key === 'Clear') && (location === 3)) {
+            let code = getKeycode(evt);
+            if (code === 'NumLock') {
+                location = 0;
+            }
+        }
+
+        if ((location === undefined) || (location > 3)) {
+            location = 0;
+        }
+
+        // The original Meta key now gets confused with the Windows key
+        // https://bugs.chromium.org/p/chromium/issues/detail?id=1020141
+        // https://bugzilla.mozilla.org/show_bug.cgi?id=1232918
+        if (key === 'Meta') {
+            let code = getKeycode(evt);
+            if (code === 'AltLeft') {
+                return KeyTable.XK_Meta_L;
+            } else if (code === 'AltRight') {
+                return KeyTable.XK_Meta_R;
+            }
+        }
+
+        // macOS has Clear instead of NumLock, but the remote system is
+        // probably not macOS, so lying here is probably best...
+        if (key === 'Clear') {
+            let code = getKeycode(evt);
+            if (code === 'NumLock') {
+                return KeyTable.XK_Num_Lock;
+            }
+        }
+
+        return DOMKeyTable[key][location];
+    }
+
+    // Now we need to look at the Unicode symbol instead
+
+    // Special key? (FIXME: Should have been caught earlier)
+    if (key.length !== 1) {
+        return null;
+    }
+
+    const codepoint = key.charCodeAt();
+    if (codepoint) {
+        return keysyms.lookup(codepoint);
+    }
+
+    return null;
+}
diff --git a/systemvm/agent/noVNC/core/input/vkeys.js b/systemvm/agent/noVNC/core/input/vkeys.js
new file mode 100644
index 0000000..f84109b
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/vkeys.js
@@ -0,0 +1,117 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2018 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+/*
+ * Mapping between Microsoft® Windows® Virtual-Key codes and
+ * HTML key codes.
+ */
+
+export default {
+    0x08: 'Backspace',
+    0x09: 'Tab',
+    0x0a: 'NumpadClear',
+    0x0c: 'Numpad5', // IE11 sends evt.keyCode: 12 when numlock is off
+    0x0d: 'Enter',
+    0x10: 'ShiftLeft',
+    0x11: 'ControlLeft',
+    0x12: 'AltLeft',
+    0x13: 'Pause',
+    0x14: 'CapsLock',
+    0x15: 'Lang1',
+    0x19: 'Lang2',
+    0x1b: 'Escape',
+    0x1c: 'Convert',
+    0x1d: 'NonConvert',
+    0x20: 'Space',
+    0x21: 'PageUp',
+    0x22: 'PageDown',
+    0x23: 'End',
+    0x24: 'Home',
+    0x25: 'ArrowLeft',
+    0x26: 'ArrowUp',
+    0x27: 'ArrowRight',
+    0x28: 'ArrowDown',
+    0x29: 'Select',
+    0x2c: 'PrintScreen',
+    0x2d: 'Insert',
+    0x2e: 'Delete',
+    0x2f: 'Help',
+    0x30: 'Digit0',
+    0x31: 'Digit1',
+    0x32: 'Digit2',
+    0x33: 'Digit3',
+    0x34: 'Digit4',
+    0x35: 'Digit5',
+    0x36: 'Digit6',
+    0x37: 'Digit7',
+    0x38: 'Digit8',
+    0x39: 'Digit9',
+    0x5b: 'MetaLeft',
+    0x5c: 'MetaRight',
+    0x5d: 'ContextMenu',
+    0x5f: 'Sleep',
+    0x60: 'Numpad0',
+    0x61: 'Numpad1',
+    0x62: 'Numpad2',
+    0x63: 'Numpad3',
+    0x64: 'Numpad4',
+    0x65: 'Numpad5',
+    0x66: 'Numpad6',
+    0x67: 'Numpad7',
+    0x68: 'Numpad8',
+    0x69: 'Numpad9',
+    0x6a: 'NumpadMultiply',
+    0x6b: 'NumpadAdd',
+    0x6c: 'NumpadDecimal',
+    0x6d: 'NumpadSubtract',
+    0x6e: 'NumpadDecimal', // Duplicate, because buggy on Windows
+    0x6f: 'NumpadDivide',
+    0x70: 'F1',
+    0x71: 'F2',
+    0x72: 'F3',
+    0x73: 'F4',
+    0x74: 'F5',
+    0x75: 'F6',
+    0x76: 'F7',
+    0x77: 'F8',
+    0x78: 'F9',
+    0x79: 'F10',
+    0x7a: 'F11',
+    0x7b: 'F12',
+    0x7c: 'F13',
+    0x7d: 'F14',
+    0x7e: 'F15',
+    0x7f: 'F16',
+    0x80: 'F17',
+    0x81: 'F18',
+    0x82: 'F19',
+    0x83: 'F20',
+    0x84: 'F21',
+    0x85: 'F22',
+    0x86: 'F23',
+    0x87: 'F24',
+    0x90: 'NumLock',
+    0x91: 'ScrollLock',
+    0xa6: 'BrowserBack',
+    0xa7: 'BrowserForward',
+    0xa8: 'BrowserRefresh',
+    0xa9: 'BrowserStop',
+    0xaa: 'BrowserSearch',
+    0xab: 'BrowserFavorites',
+    0xac: 'BrowserHome',
+    0xad: 'AudioVolumeMute',
+    0xae: 'AudioVolumeDown',
+    0xaf: 'AudioVolumeUp',
+    0xb0: 'MediaTrackNext',
+    0xb1: 'MediaTrackPrevious',
+    0xb2: 'MediaStop',
+    0xb3: 'MediaPlayPause',
+    0xb4: 'LaunchMail',
+    0xb5: 'MediaSelect',
+    0xb6: 'LaunchApp1',
+    0xb7: 'LaunchApp2',
+    0xe1: 'AltRight', // Only when it is AltGraph
+};
diff --git a/systemvm/agent/noVNC/core/input/xtscancodes.js b/systemvm/agent/noVNC/core/input/xtscancodes.js
new file mode 100644
index 0000000..514809c
--- /dev/null
+++ b/systemvm/agent/noVNC/core/input/xtscancodes.js
@@ -0,0 +1,171 @@
+/*
+ * This file is auto-generated from keymaps.csv on 2017-05-31 16:20
+ * Database checksum sha256(92fd165507f2a3b8c5b3fa56e425d45788dbcb98cf067a307527d91ce22cab94)
+ * To re-generate, run:
+ *   keymap-gen --lang=js code-map keymaps.csv html atset1
+*/
+export default {
+  "Again": 0xe005, /* html:Again (Again) -> linux:129 (KEY_AGAIN) -> atset1:57349 */
+  "AltLeft": 0x38, /* html:AltLeft (AltLeft) -> linux:56 (KEY_LEFTALT) -> atset1:56 */
+  "AltRight": 0xe038, /* html:AltRight (AltRight) -> linux:100 (KEY_RIGHTALT) -> atset1:57400 */
+  "ArrowDown": 0xe050, /* html:ArrowDown (ArrowDown) -> linux:108 (KEY_DOWN) -> atset1:57424 */
+  "ArrowLeft": 0xe04b, /* html:ArrowLeft (ArrowLeft) -> linux:105 (KEY_LEFT) -> atset1:57419 */
+  "ArrowRight": 0xe04d, /* html:ArrowRight (ArrowRight) -> linux:106 (KEY_RIGHT) -> atset1:57421 */
+  "ArrowUp": 0xe048, /* html:ArrowUp (ArrowUp) -> linux:103 (KEY_UP) -> atset1:57416 */
+  "AudioVolumeDown": 0xe02e, /* html:AudioVolumeDown (AudioVolumeDown) -> linux:114 (KEY_VOLUMEDOWN) -> atset1:57390 */
+  "AudioVolumeMute": 0xe020, /* html:AudioVolumeMute (AudioVolumeMute) -> linux:113 (KEY_MUTE) -> atset1:57376 */
+  "AudioVolumeUp": 0xe030, /* html:AudioVolumeUp (AudioVolumeUp) -> linux:115 (KEY_VOLUMEUP) -> atset1:57392 */
+  "Backquote": 0x29, /* html:Backquote (Backquote) -> linux:41 (KEY_GRAVE) -> atset1:41 */
+  "Backslash": 0x2b, /* html:Backslash (Backslash) -> linux:43 (KEY_BACKSLASH) -> atset1:43 */
+  "Backspace": 0xe, /* html:Backspace (Backspace) -> linux:14 (KEY_BACKSPACE) -> atset1:14 */
+  "BracketLeft": 0x1a, /* html:BracketLeft (BracketLeft) -> linux:26 (KEY_LEFTBRACE) -> atset1:26 */
+  "BracketRight": 0x1b, /* html:BracketRight (BracketRight) -> linux:27 (KEY_RIGHTBRACE) -> atset1:27 */
+  "BrowserBack": 0xe06a, /* html:BrowserBack (BrowserBack) -> linux:158 (KEY_BACK) -> atset1:57450 */
+  "BrowserFavorites": 0xe066, /* html:BrowserFavorites (BrowserFavorites) -> linux:156 (KEY_BOOKMARKS) -> atset1:57446 */
+  "BrowserForward": 0xe069, /* html:BrowserForward (BrowserForward) -> linux:159 (KEY_FORWARD) -> atset1:57449 */
+  "BrowserHome": 0xe032, /* html:BrowserHome (BrowserHome) -> linux:172 (KEY_HOMEPAGE) -> atset1:57394 */
+  "BrowserRefresh": 0xe067, /* html:BrowserRefresh (BrowserRefresh) -> linux:173 (KEY_REFRESH) -> atset1:57447 */
+  "BrowserSearch": 0xe065, /* html:BrowserSearch (BrowserSearch) -> linux:217 (KEY_SEARCH) -> atset1:57445 */
+  "BrowserStop": 0xe068, /* html:BrowserStop (BrowserStop) -> linux:128 (KEY_STOP) -> atset1:57448 */
+  "CapsLock": 0x3a, /* html:CapsLock (CapsLock) -> linux:58 (KEY_CAPSLOCK) -> atset1:58 */
+  "Comma": 0x33, /* html:Comma (Comma) -> linux:51 (KEY_COMMA) -> atset1:51 */
+  "ContextMenu": 0xe05d, /* html:ContextMenu (ContextMenu) -> linux:127 (KEY_COMPOSE) -> atset1:57437 */
+  "ControlLeft": 0x1d, /* html:ControlLeft (ControlLeft) -> linux:29 (KEY_LEFTCTRL) -> atset1:29 */
+  "ControlRight": 0xe01d, /* html:ControlRight (ControlRight) -> linux:97 (KEY_RIGHTCTRL) -> atset1:57373 */
+  "Convert": 0x79, /* html:Convert (Convert) -> linux:92 (KEY_HENKAN) -> atset1:121 */
+  "Copy": 0xe078, /* html:Copy (Copy) -> linux:133 (KEY_COPY) -> atset1:57464 */
+  "Cut": 0xe03c, /* html:Cut (Cut) -> linux:137 (KEY_CUT) -> atset1:57404 */
+  "Delete": 0xe053, /* html:Delete (Delete) -> linux:111 (KEY_DELETE) -> atset1:57427 */
+  "Digit0": 0xb, /* html:Digit0 (Digit0) -> linux:11 (KEY_0) -> atset1:11 */
+  "Digit1": 0x2, /* html:Digit1 (Digit1) -> linux:2 (KEY_1) -> atset1:2 */
+  "Digit2": 0x3, /* html:Digit2 (Digit2) -> linux:3 (KEY_2) -> atset1:3 */
+  "Digit3": 0x4, /* html:Digit3 (Digit3) -> linux:4 (KEY_3) -> atset1:4 */
+  "Digit4": 0x5, /* html:Digit4 (Digit4) -> linux:5 (KEY_4) -> atset1:5 */
+  "Digit5": 0x6, /* html:Digit5 (Digit5) -> linux:6 (KEY_5) -> atset1:6 */
+  "Digit6": 0x7, /* html:Digit6 (Digit6) -> linux:7 (KEY_6) -> atset1:7 */
+  "Digit7": 0x8, /* html:Digit7 (Digit7) -> linux:8 (KEY_7) -> atset1:8 */
+  "Digit8": 0x9, /* html:Digit8 (Digit8) -> linux:9 (KEY_8) -> atset1:9 */
+  "Digit9": 0xa, /* html:Digit9 (Digit9) -> linux:10 (KEY_9) -> atset1:10 */
+  "Eject": 0xe07d, /* html:Eject (Eject) -> linux:162 (KEY_EJECTCLOSECD) -> atset1:57469 */
+  "End": 0xe04f, /* html:End (End) -> linux:107 (KEY_END) -> atset1:57423 */
+  "Enter": 0x1c, /* html:Enter (Enter) -> linux:28 (KEY_ENTER) -> atset1:28 */
+  "Equal": 0xd, /* html:Equal (Equal) -> linux:13 (KEY_EQUAL) -> atset1:13 */
+  "Escape": 0x1, /* html:Escape (Escape) -> linux:1 (KEY_ESC) -> atset1:1 */
+  "F1": 0x3b, /* html:F1 (F1) -> linux:59 (KEY_F1) -> atset1:59 */
+  "F10": 0x44, /* html:F10 (F10) -> linux:68 (KEY_F10) -> atset1:68 */
+  "F11": 0x57, /* html:F11 (F11) -> linux:87 (KEY_F11) -> atset1:87 */
+  "F12": 0x58, /* html:F12 (F12) -> linux:88 (KEY_F12) -> atset1:88 */
+  "F13": 0x5d, /* html:F13 (F13) -> linux:183 (KEY_F13) -> atset1:93 */
+  "F14": 0x5e, /* html:F14 (F14) -> linux:184 (KEY_F14) -> atset1:94 */
+  "F15": 0x5f, /* html:F15 (F15) -> linux:185 (KEY_F15) -> atset1:95 */
+  "F16": 0x55, /* html:F16 (F16) -> linux:186 (KEY_F16) -> atset1:85 */
+  "F17": 0xe003, /* html:F17 (F17) -> linux:187 (KEY_F17) -> atset1:57347 */
+  "F18": 0xe077, /* html:F18 (F18) -> linux:188 (KEY_F18) -> atset1:57463 */
+  "F19": 0xe004, /* html:F19 (F19) -> linux:189 (KEY_F19) -> atset1:57348 */
+  "F2": 0x3c, /* html:F2 (F2) -> linux:60 (KEY_F2) -> atset1:60 */
+  "F20": 0x5a, /* html:F20 (F20) -> linux:190 (KEY_F20) -> atset1:90 */
+  "F21": 0x74, /* html:F21 (F21) -> linux:191 (KEY_F21) -> atset1:116 */
+  "F22": 0xe079, /* html:F22 (F22) -> linux:192 (KEY_F22) -> atset1:57465 */
+  "F23": 0x6d, /* html:F23 (F23) -> linux:193 (KEY_F23) -> atset1:109 */
+  "F24": 0x6f, /* html:F24 (F24) -> linux:194 (KEY_F24) -> atset1:111 */
+  "F3": 0x3d, /* html:F3 (F3) -> linux:61 (KEY_F3) -> atset1:61 */
+  "F4": 0x3e, /* html:F4 (F4) -> linux:62 (KEY_F4) -> atset1:62 */
+  "F5": 0x3f, /* html:F5 (F5) -> linux:63 (KEY_F5) -> atset1:63 */
+  "F6": 0x40, /* html:F6 (F6) -> linux:64 (KEY_F6) -> atset1:64 */
+  "F7": 0x41, /* html:F7 (F7) -> linux:65 (KEY_F7) -> atset1:65 */
+  "F8": 0x42, /* html:F8 (F8) -> linux:66 (KEY_F8) -> atset1:66 */
+  "F9": 0x43, /* html:F9 (F9) -> linux:67 (KEY_F9) -> atset1:67 */
+  "Find": 0xe041, /* html:Find (Find) -> linux:136 (KEY_FIND) -> atset1:57409 */
+  "Help": 0xe075, /* html:Help (Help) -> linux:138 (KEY_HELP) -> atset1:57461 */
+  "Hiragana": 0x77, /* html:Hiragana (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
+  "Home": 0xe047, /* html:Home (Home) -> linux:102 (KEY_HOME) -> atset1:57415 */
+  "Insert": 0xe052, /* html:Insert (Insert) -> linux:110 (KEY_INSERT) -> atset1:57426 */
+  "IntlBackslash": 0x56, /* html:IntlBackslash (IntlBackslash) -> linux:86 (KEY_102ND) -> atset1:86 */
+  "IntlRo": 0x73, /* html:IntlRo (IntlRo) -> linux:89 (KEY_RO) -> atset1:115 */
+  "IntlYen": 0x7d, /* html:IntlYen (IntlYen) -> linux:124 (KEY_YEN) -> atset1:125 */
+  "KanaMode": 0x70, /* html:KanaMode (KanaMode) -> linux:93 (KEY_KATAKANAHIRAGANA) -> atset1:112 */
+  "Katakana": 0x78, /* html:Katakana (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
+  "KeyA": 0x1e, /* html:KeyA (KeyA) -> linux:30 (KEY_A) -> atset1:30 */
+  "KeyB": 0x30, /* html:KeyB (KeyB) -> linux:48 (KEY_B) -> atset1:48 */
+  "KeyC": 0x2e, /* html:KeyC (KeyC) -> linux:46 (KEY_C) -> atset1:46 */
+  "KeyD": 0x20, /* html:KeyD (KeyD) -> linux:32 (KEY_D) -> atset1:32 */
+  "KeyE": 0x12, /* html:KeyE (KeyE) -> linux:18 (KEY_E) -> atset1:18 */
+  "KeyF": 0x21, /* html:KeyF (KeyF) -> linux:33 (KEY_F) -> atset1:33 */
+  "KeyG": 0x22, /* html:KeyG (KeyG) -> linux:34 (KEY_G) -> atset1:34 */
+  "KeyH": 0x23, /* html:KeyH (KeyH) -> linux:35 (KEY_H) -> atset1:35 */
+  "KeyI": 0x17, /* html:KeyI (KeyI) -> linux:23 (KEY_I) -> atset1:23 */
+  "KeyJ": 0x24, /* html:KeyJ (KeyJ) -> linux:36 (KEY_J) -> atset1:36 */
+  "KeyK": 0x25, /* html:KeyK (KeyK) -> linux:37 (KEY_K) -> atset1:37 */
+  "KeyL": 0x26, /* html:KeyL (KeyL) -> linux:38 (KEY_L) -> atset1:38 */
+  "KeyM": 0x32, /* html:KeyM (KeyM) -> linux:50 (KEY_M) -> atset1:50 */
+  "KeyN": 0x31, /* html:KeyN (KeyN) -> linux:49 (KEY_N) -> atset1:49 */
+  "KeyO": 0x18, /* html:KeyO (KeyO) -> linux:24 (KEY_O) -> atset1:24 */
+  "KeyP": 0x19, /* html:KeyP (KeyP) -> linux:25 (KEY_P) -> atset1:25 */
+  "KeyQ": 0x10, /* html:KeyQ (KeyQ) -> linux:16 (KEY_Q) -> atset1:16 */
+  "KeyR": 0x13, /* html:KeyR (KeyR) -> linux:19 (KEY_R) -> atset1:19 */
+  "KeyS": 0x1f, /* html:KeyS (KeyS) -> linux:31 (KEY_S) -> atset1:31 */
+  "KeyT": 0x14, /* html:KeyT (KeyT) -> linux:20 (KEY_T) -> atset1:20 */
+  "KeyU": 0x16, /* html:KeyU (KeyU) -> linux:22 (KEY_U) -> atset1:22 */
+  "KeyV": 0x2f, /* html:KeyV (KeyV) -> linux:47 (KEY_V) -> atset1:47 */
+  "KeyW": 0x11, /* html:KeyW (KeyW) -> linux:17 (KEY_W) -> atset1:17 */
+  "KeyX": 0x2d, /* html:KeyX (KeyX) -> linux:45 (KEY_X) -> atset1:45 */
+  "KeyY": 0x15, /* html:KeyY (KeyY) -> linux:21 (KEY_Y) -> atset1:21 */
+  "KeyZ": 0x2c, /* html:KeyZ (KeyZ) -> linux:44 (KEY_Z) -> atset1:44 */
+  "Lang3": 0x78, /* html:Lang3 (Lang3) -> linux:90 (KEY_KATAKANA) -> atset1:120 */
+  "Lang4": 0x77, /* html:Lang4 (Lang4) -> linux:91 (KEY_HIRAGANA) -> atset1:119 */
+  "Lang5": 0x76, /* html:Lang5 (Lang5) -> linux:85 (KEY_ZENKAKUHANKAKU) -> atset1:118 */
+  "LaunchApp1": 0xe06b, /* html:LaunchApp1 (LaunchApp1) -> linux:157 (KEY_COMPUTER) -> atset1:57451 */
+  "LaunchApp2": 0xe021, /* html:LaunchApp2 (LaunchApp2) -> linux:140 (KEY_CALC) -> atset1:57377 */
+  "LaunchMail": 0xe06c, /* html:LaunchMail (LaunchMail) -> linux:155 (KEY_MAIL) -> atset1:57452 */
+  "MediaPlayPause": 0xe022, /* html:MediaPlayPause (MediaPlayPause) -> linux:164 (KEY_PLAYPAUSE) -> atset1:57378 */
+  "MediaSelect": 0xe06d, /* html:MediaSelect (MediaSelect) -> linux:226 (KEY_MEDIA) -> atset1:57453 */
+  "MediaStop": 0xe024, /* html:MediaStop (MediaStop) -> linux:166 (KEY_STOPCD) -> atset1:57380 */
+  "MediaTrackNext": 0xe019, /* html:MediaTrackNext (MediaTrackNext) -> linux:163 (KEY_NEXTSONG) -> atset1:57369 */
+  "MediaTrackPrevious": 0xe010, /* html:MediaTrackPrevious (MediaTrackPrevious) -> linux:165 (KEY_PREVIOUSSONG) -> atset1:57360 */
+  "MetaLeft": 0xe05b, /* html:MetaLeft (MetaLeft) -> linux:125 (KEY_LEFTMETA) -> atset1:57435 */
+  "MetaRight": 0xe05c, /* html:MetaRight (MetaRight) -> linux:126 (KEY_RIGHTMETA) -> atset1:57436 */
+  "Minus": 0xc, /* html:Minus (Minus) -> linux:12 (KEY_MINUS) -> atset1:12 */
+  "NonConvert": 0x7b, /* html:NonConvert (NonConvert) -> linux:94 (KEY_MUHENKAN) -> atset1:123 */
+  "NumLock": 0x45, /* html:NumLock (NumLock) -> linux:69 (KEY_NUMLOCK) -> atset1:69 */
+  "Numpad0": 0x52, /* html:Numpad0 (Numpad0) -> linux:82 (KEY_KP0) -> atset1:82 */
+  "Numpad1": 0x4f, /* html:Numpad1 (Numpad1) -> linux:79 (KEY_KP1) -> atset1:79 */
+  "Numpad2": 0x50, /* html:Numpad2 (Numpad2) -> linux:80 (KEY_KP2) -> atset1:80 */
+  "Numpad3": 0x51, /* html:Numpad3 (Numpad3) -> linux:81 (KEY_KP3) -> atset1:81 */
+  "Numpad4": 0x4b, /* html:Numpad4 (Numpad4) -> linux:75 (KEY_KP4) -> atset1:75 */
+  "Numpad5": 0x4c, /* html:Numpad5 (Numpad5) -> linux:76 (KEY_KP5) -> atset1:76 */
+  "Numpad6": 0x4d, /* html:Numpad6 (Numpad6) -> linux:77 (KEY_KP6) -> atset1:77 */
+  "Numpad7": 0x47, /* html:Numpad7 (Numpad7) -> linux:71 (KEY_KP7) -> atset1:71 */
+  "Numpad8": 0x48, /* html:Numpad8 (Numpad8) -> linux:72 (KEY_KP8) -> atset1:72 */
+  "Numpad9": 0x49, /* html:Numpad9 (Numpad9) -> linux:73 (KEY_KP9) -> atset1:73 */
+  "NumpadAdd": 0x4e, /* html:NumpadAdd (NumpadAdd) -> linux:78 (KEY_KPPLUS) -> atset1:78 */
+  "NumpadComma": 0x7e, /* html:NumpadComma (NumpadComma) -> linux:121 (KEY_KPCOMMA) -> atset1:126 */
+  "NumpadDecimal": 0x53, /* html:NumpadDecimal (NumpadDecimal) -> linux:83 (KEY_KPDOT) -> atset1:83 */
+  "NumpadDivide": 0xe035, /* html:NumpadDivide (NumpadDivide) -> linux:98 (KEY_KPSLASH) -> atset1:57397 */
+  "NumpadEnter": 0xe01c, /* html:NumpadEnter (NumpadEnter) -> linux:96 (KEY_KPENTER) -> atset1:57372 */
+  "NumpadEqual": 0x59, /* html:NumpadEqual (NumpadEqual) -> linux:117 (KEY_KPEQUAL) -> atset1:89 */
+  "NumpadMultiply": 0x37, /* html:NumpadMultiply (NumpadMultiply) -> linux:55 (KEY_KPASTERISK) -> atset1:55 */
+  "NumpadParenLeft": 0xe076, /* html:NumpadParenLeft (NumpadParenLeft) -> linux:179 (KEY_KPLEFTPAREN) -> atset1:57462 */
+  "NumpadParenRight": 0xe07b, /* html:NumpadParenRight (NumpadParenRight) -> linux:180 (KEY_KPRIGHTPAREN) -> atset1:57467 */
+  "NumpadSubtract": 0x4a, /* html:NumpadSubtract (NumpadSubtract) -> linux:74 (KEY_KPMINUS) -> atset1:74 */
+  "Open": 0x64, /* html:Open (Open) -> linux:134 (KEY_OPEN) -> atset1:100 */
+  "PageDown": 0xe051, /* html:PageDown (PageDown) -> linux:109 (KEY_PAGEDOWN) -> atset1:57425 */
+  "PageUp": 0xe049, /* html:PageUp (PageUp) -> linux:104 (KEY_PAGEUP) -> atset1:57417 */
+  "Paste": 0x65, /* html:Paste (Paste) -> linux:135 (KEY_PASTE) -> atset1:101 */
+  "Pause": 0xe046, /* html:Pause (Pause) -> linux:119 (KEY_PAUSE) -> atset1:57414 */
+  "Period": 0x34, /* html:Period (Period) -> linux:52 (KEY_DOT) -> atset1:52 */
+  "Power": 0xe05e, /* html:Power (Power) -> linux:116 (KEY_POWER) -> atset1:57438 */
+  "PrintScreen": 0x54, /* html:PrintScreen (PrintScreen) -> linux:99 (KEY_SYSRQ) -> atset1:84 */
+  "Props": 0xe006, /* html:Props (Props) -> linux:130 (KEY_PROPS) -> atset1:57350 */
+  "Quote": 0x28, /* html:Quote (Quote) -> linux:40 (KEY_APOSTROPHE) -> atset1:40 */
+  "ScrollLock": 0x46, /* html:ScrollLock (ScrollLock) -> linux:70 (KEY_SCROLLLOCK) -> atset1:70 */
+  "Semicolon": 0x27, /* html:Semicolon (Semicolon) -> linux:39 (KEY_SEMICOLON) -> atset1:39 */
+  "ShiftLeft": 0x2a, /* html:ShiftLeft (ShiftLeft) -> linux:42 (KEY_LEFTSHIFT) -> atset1:42 */
+  "ShiftRight": 0x36, /* html:ShiftRight (ShiftRight) -> linux:54 (KEY_RIGHTSHIFT) -> atset1:54 */
+  "Slash": 0x35, /* html:Slash (Slash) -> linux:53 (KEY_SLASH) -> atset1:53 */
+  "Sleep": 0xe05f, /* html:Sleep (Sleep) -> linux:142 (KEY_SLEEP) -> atset1:57439 */
+  "Space": 0x39, /* html:Space (Space) -> linux:57 (KEY_SPACE) -> atset1:57 */
+  "Suspend": 0xe025, /* html:Suspend (Suspend) -> linux:205 (KEY_SUSPEND) -> atset1:57381 */
+  "Tab": 0xf, /* html:Tab (Tab) -> linux:15 (KEY_TAB) -> atset1:15 */
+  "Undo": 0xe007, /* html:Undo (Undo) -> linux:131 (KEY_UNDO) -> atset1:57351 */
+  "WakeUp": 0xe063, /* html:WakeUp (WakeUp) -> linux:143 (KEY_WAKEUP) -> atset1:57443 */
+};
diff --git a/systemvm/agent/noVNC/core/rfb.js b/systemvm/agent/noVNC/core/rfb.js
new file mode 100644
index 0000000..eda1597
--- /dev/null
+++ b/systemvm/agent/noVNC/core/rfb.js
@@ -0,0 +1,3009 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ */
+
+import { toUnsigned32bit, toSigned32bit } from './util/int.js';
+import * as Log from './util/logging.js';
+import { encodeUTF8, decodeUTF8 } from './util/strings.js';
+import { dragThreshold } from './util/browser.js';
+import { clientToElement } from './util/element.js';
+import { setCapture } from './util/events.js';
+import EventTargetMixin from './util/eventtarget.js';
+import Display from "./display.js";
+import Inflator from "./inflator.js";
+import Deflator from "./deflator.js";
+import Keyboard from "./input/keyboard.js";
+import GestureHandler from "./input/gesturehandler.js";
+import Cursor from "./util/cursor.js";
+import Websock from "./websock.js";
+import DES from "./des.js";
+import KeyTable from "./input/keysym.js";
+import USKeyTable from "./input/uskeysym.js";
+import XtScancode from "./input/xtscancodes.js";
+import { encodings } from "./encodings.js";
+import "./util/polyfill.js";
+
+import RawDecoder from "./decoders/raw.js";
+import CopyRectDecoder from "./decoders/copyrect.js";
+import RREDecoder from "./decoders/rre.js";
+import HextileDecoder from "./decoders/hextile.js";
+import TightDecoder from "./decoders/tight.js";
+import TightPNGDecoder from "./decoders/tightpng.js";
+
+// How many seconds to wait for a disconnect to finish
+const DISCONNECT_TIMEOUT = 3;
+const DEFAULT_BACKGROUND = 'rgb(40, 40, 40)';
+
+// Minimum wait (ms) between two mouse moves
+const MOUSE_MOVE_DELAY = 17;
+
+// Wheel thresholds
+const WHEEL_STEP = 50; // Pixels needed for one step
+const WHEEL_LINE_HEIGHT = 19; // Assumed pixels for one line step
+
+// Gesture thresholds
+const GESTURE_ZOOMSENS = 75;
+const GESTURE_SCRLSENS = 50;
+const DOUBLE_TAP_TIMEOUT = 1000;
+const DOUBLE_TAP_THRESHOLD = 50;
+
+// Extended clipboard pseudo-encoding formats
+const extendedClipboardFormatText   = 1;
+/*eslint-disable no-unused-vars */
+const extendedClipboardFormatRtf    = 1 << 1;
+const extendedClipboardFormatHtml   = 1 << 2;
+const extendedClipboardFormatDib    = 1 << 3;
+const extendedClipboardFormatFiles  = 1 << 4;
+/*eslint-enable */
+
+// Extended clipboard pseudo-encoding actions
+const extendedClipboardActionCaps    = 1 << 24;
+const extendedClipboardActionRequest = 1 << 25;
+const extendedClipboardActionPeek    = 1 << 26;
+const extendedClipboardActionNotify  = 1 << 27;
+const extendedClipboardActionProvide = 1 << 28;
+
+
+export default class RFB extends EventTargetMixin {
+    constructor(target, url, options) {
+        if (!target) {
+            throw new Error("Must specify target");
+        }
+        if (!url) {
+            throw new Error("Must specify URL");
+        }
+
+        super();
+
+        this._target = target;
+        this._url = url;
+
+        // Connection details
+        options = options || {};
+        this._rfbCredentials = options.credentials || {};
+        this._shared = 'shared' in options ? !!options.shared : true;
+        this._repeaterID = options.repeaterID || '';
+        this._wsProtocols = ['binary'];
+
+        // Internal state
+        this._rfbConnectionState = '';
+        this._rfbInitState = '';
+        this._rfbAuthScheme = -1;
+        this._rfbCleanDisconnect = true;
+
+        // Server capabilities
+        this._rfbVersion = 0;
+        this._rfbMaxVersion = 3.8;
+        this._rfbTightVNC = false;
+        this._rfbVeNCryptState = 0;
+        this._rfbXvpVer = 0;
+
+        this._fbWidth = 0;
+        this._fbHeight = 0;
+
+        this._fbName = "";
+
+        this._capabilities = { power: false };
+
+        this._supportsFence = false;
+
+        this._supportsContinuousUpdates = false;
+        this._enabledContinuousUpdates = false;
+
+        this._supportsSetDesktopSize = false;
+        this._screenID = 0;
+        this._screenFlags = 0;
+
+        this._qemuExtKeyEventSupported = false;
+
+        this._clipboardText = null;
+        this._clipboardServerCapabilitiesActions = {};
+        this._clipboardServerCapabilitiesFormats = {};
+
+        // Internal objects
+        this._sock = null;              // Websock object
+        this._display = null;           // Display object
+        this._flushing = false;         // Display flushing state
+        this._keyboard = null;          // Keyboard input handler object
+        this._gestures = null;          // Gesture input handler object
+
+        // Timers
+        this._disconnTimer = null;      // disconnection timer
+        this._resizeTimeout = null;     // resize rate limiting
+        this._mouseMoveTimer = null;
+
+        // Decoder states
+        this._decoders = {};
+
+        this._FBU = {
+            rects: 0,
+            x: 0,
+            y: 0,
+            width: 0,
+            height: 0,
+            encoding: null,
+        };
+
+        // Mouse state
+        this._mousePos = {};
+        this._mouseButtonMask = 0;
+        this._mouseLastMoveTime = 0;
+        this._viewportDragging = false;
+        this._viewportDragPos = {};
+        this._viewportHasMoved = false;
+        this._accumulatedWheelDeltaX = 0;
+        this._accumulatedWheelDeltaY = 0;
+
+        // Gesture state
+        this._gestureLastTapTime = null;
+        this._gestureFirstDoubleTapEv = null;
+        this._gestureLastMagnitudeX = 0;
+        this._gestureLastMagnitudeY = 0;
+
+        // Bound event handlers
+        this._eventHandlers = {
+            focusCanvas: this._focusCanvas.bind(this),
+            windowResize: this._windowResize.bind(this),
+            handleMouse: this._handleMouse.bind(this),
+            handleWheel: this._handleWheel.bind(this),
+            handleGesture: this._handleGesture.bind(this),
+        };
+
+        // main setup
+        Log.Debug(">> RFB.constructor");
+
+        // Create DOM elements
+        this._screen = document.createElement('div');
+        this._screen.style.display = 'flex';
+        this._screen.style.width = '100%';
+        this._screen.style.height = '100%';
+        this._screen.style.overflow = 'auto';
+        this._screen.style.background = DEFAULT_BACKGROUND;
+        this._canvas = document.createElement('canvas');
+        this._canvas.style.margin = 'auto';
+        // Some browsers add an outline on focus
+        this._canvas.style.outline = 'none';
+        // IE miscalculates width without this :(
+        this._canvas.style.flexShrink = '0';
+        this._canvas.width = 0;
+        this._canvas.height = 0;
+        this._canvas.tabIndex = -1;
+        this._screen.appendChild(this._canvas);
+
+        // Cursor
+        this._cursor = new Cursor();
+
+        // XXX: TightVNC 2.8.11 sends no cursor at all until Windows changes
+        // it. Result: no cursor at all until a window border or an edit field
+        // is hit blindly. But there are also VNC servers that draw the cursor
+        // in the framebuffer and don't send the empty local cursor. There is
+        // no way to satisfy both sides.
+        //
+        // The spec is unclear on this "initial cursor" issue. Many other
+        // viewers (TigerVNC, RealVNC, Remmina) display an arrow as the
+        // initial cursor instead.
+        this._cursorImage = RFB.cursors.none;
+
+        // populate decoder array with objects
+        this._decoders[encodings.encodingRaw] = new RawDecoder();
+        this._decoders[encodings.encodingCopyRect] = new CopyRectDecoder();
+        this._decoders[encodings.encodingRRE] = new RREDecoder();
+        this._decoders[encodings.encodingHextile] = new HextileDecoder();
+        this._decoders[encodings.encodingTight] = new TightDecoder();
+        this._decoders[encodings.encodingTightPNG] = new TightPNGDecoder();
+
+        // NB: nothing that needs explicit teardown should be done
+        // before this point, since this can throw an exception
+        try {
+            this._display = new Display(this._canvas);
+        } catch (exc) {
+            Log.Error("Display exception: " + exc);
+            throw exc;
+        }
+        this._display.onflush = this._onFlush.bind(this);
+
+        this._keyboard = new Keyboard(this._canvas);
+        this._keyboard.onkeyevent = this._handleKeyEvent.bind(this);
+
+        this._gestures = new GestureHandler();
+
+        this._sock = new Websock();
+        this._sock.on('message', () => {
+            this._handleMessage();
+        });
+        this._sock.on('open', () => {
+            if ((this._rfbConnectionState === 'connecting') &&
+                (this._rfbInitState === '')) {
+                this._rfbInitState = 'ProtocolVersion';
+                Log.Debug("Starting VNC handshake");
+            } else {
+                this._fail("Unexpected server connection while " +
+                           this._rfbConnectionState);
+            }
+        });
+        this._sock.on('close', (e) => {
+            Log.Debug("WebSocket on-close event");
+            let msg = "";
+            if (e.code) {
+                msg = "(code: " + e.code;
+                if (e.reason) {
+                    msg += ", reason: " + e.reason;
+                }
+                msg += ")";
+            }
+            switch (this._rfbConnectionState) {
+                case 'connecting':
+                    this._fail("Connection closed " + msg);
+                    break;
+                case 'connected':
+                    // Handle disconnects that were initiated server-side
+                    this._updateConnectionState('disconnecting');
+                    this._updateConnectionState('disconnected');
+                    break;
+                case 'disconnecting':
+                    // Normal disconnection path
+                    this._updateConnectionState('disconnected');
+                    break;
+                case 'disconnected':
+                    this._fail("Unexpected server disconnect " +
+                               "when already disconnected " + msg);
+                    break;
+                default:
+                    this._fail("Unexpected server disconnect before connecting " +
+                               msg);
+                    break;
+            }
+            this._sock.off('close');
+        });
+        this._sock.on('error', e => Log.Warn("WebSocket on-error event"));
+
+        // Slight delay of the actual connection so that the caller has
+        // time to set up callbacks
+        setTimeout(this._updateConnectionState.bind(this, 'connecting'));
+
+        Log.Debug("<< RFB.constructor");
+
+        // ===== PROPERTIES =====
+
+        this.dragViewport = false;
+        this.focusOnClick = true;
+
+        this._viewOnly = false;
+        this._clipViewport = false;
+        this._scaleViewport = false;
+        this._resizeSession = false;
+
+        this._showDotCursor = false;
+        if (options.showDotCursor !== undefined) {
+            Log.Warn("Specifying showDotCursor as a RFB constructor argument is deprecated");
+            this._showDotCursor = options.showDotCursor;
+        }
+
+        this._qualityLevel = 6;
+        this._compressionLevel = 2;
+    }
+
+    // ===== PROPERTIES =====
+
+    get viewOnly() { return this._viewOnly; }
+    set viewOnly(viewOnly) {
+        this._viewOnly = viewOnly;
+
+        if (this._rfbConnectionState === "connecting" ||
+            this._rfbConnectionState === "connected") {
+            if (viewOnly) {
+                this._keyboard.ungrab();
+            } else {
+                this._keyboard.grab();
+            }
+        }
+    }
+
+    get capabilities() { return this._capabilities; }
+
+    get touchButton() { return 0; }
+    set touchButton(button) { Log.Warn("Using old API!"); }
+
+    get clipViewport() { return this._clipViewport; }
+    set clipViewport(viewport) {
+        this._clipViewport = viewport;
+        this._updateClip();
+    }
+
+    get scaleViewport() { return this._scaleViewport; }
+    set scaleViewport(scale) {
+        this._scaleViewport = scale;
+        // Scaling trumps clipping, so we may need to adjust
+        // clipping when enabling or disabling scaling
+        if (scale && this._clipViewport) {
+            this._updateClip();
+        }
+        this._updateScale();
+        if (!scale && this._clipViewport) {
+            this._updateClip();
+        }
+    }
+
+    get resizeSession() { return this._resizeSession; }
+    set resizeSession(resize) {
+        this._resizeSession = resize;
+        if (resize) {
+            this._requestRemoteResize();
+        }
+    }
+
+    get showDotCursor() { return this._showDotCursor; }
+    set showDotCursor(show) {
+        this._showDotCursor = show;
+        this._refreshCursor();
+    }
+
+    get background() { return this._screen.style.background; }
+    set background(cssValue) { this._screen.style.background = cssValue; }
+
+    get qualityLevel() {
+        return this._qualityLevel;
+    }
+    set qualityLevel(qualityLevel) {
+        if (!Number.isInteger(qualityLevel) || qualityLevel < 0 || qualityLevel > 9) {
+            Log.Error("qualityLevel must be an integer between 0 and 9");
+            return;
+        }
+
+        if (this._qualityLevel === qualityLevel) {
+            return;
+        }
+
+        this._qualityLevel = qualityLevel;
+
+        if (this._rfbConnectionState === 'connected') {
+            this._sendEncodings();
+        }
+    }
+
+    get compressionLevel() {
+        return this._compressionLevel;
+    }
+    set compressionLevel(compressionLevel) {
+        if (!Number.isInteger(compressionLevel) || compressionLevel < 0 || compressionLevel > 9) {
+            Log.Error("compressionLevel must be an integer between 0 and 9");
+            return;
+        }
+
+        if (this._compressionLevel === compressionLevel) {
+            return;
+        }
+
+        this._compressionLevel = compressionLevel;
+
+        if (this._rfbConnectionState === 'connected') {
+            this._sendEncodings();
+        }
+    }
+
+    // ===== PUBLIC METHODS =====
+
+    disconnect() {
+        this._updateConnectionState('disconnecting');
+        this._sock.off('error');
+        this._sock.off('message');
+        this._sock.off('open');
+    }
+
+    sendCredentials(creds) {
+        this._rfbCredentials = creds;
+        setTimeout(this._initMsg.bind(this), 0);
+    }
+
+    sendText(text) {
+        for (var i = 0; i < text.length; i++) {
+            const character = text.charAt(i);
+            var charCode = USKeyTable[character] || false;
+            if (charCode) {
+                this.sendKey(charCode, character, true);
+                this.sendKey(charCode, character, false);
+            } else {
+                charCode = text.charCodeAt(i)
+                this.sendKey(KeyTable.XK_Shift_L, "ShiftLeft", true);
+                this.sendKey(charCode, character, true);
+                this.sendKey(charCode, character, false);
+                this.sendKey(KeyTable.XK_Shift_L, "ShiftLeft", false);
+            }
+        }
+    }
+
+    sendCtrlAltDel() {
+        if (this._rfbConnectionState !== 'connected' || this._viewOnly) { return; }
+        Log.Info("Sending Ctrl-Alt-Del");
+
+        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
+        this.sendKey(KeyTable.XK_Alt_L, "AltLeft", true);
+        this.sendKey(KeyTable.XK_Delete, "Delete", true);
+        this.sendKey(KeyTable.XK_Delete, "Delete", false);
+        this.sendKey(KeyTable.XK_Alt_L, "AltLeft", false);
+        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
+    }
+
+    sendCtrlEsc() {
+        if (this._rfb_connection_state !== 'connected' || this._viewOnly) { return; }
+        Log.Info("Sending Ctrl-Esc");
+
+        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", true);
+        this.sendKey(KeyTable.XK_Escape, "Escape", true);
+        this.sendKey(KeyTable.XK_Escape, "Escape", false);
+        this.sendKey(KeyTable.XK_Control_L, "ControlLeft", false);
+    }
+
+    machineShutdown() {
+        this._xvpOp(1, 2);
+    }
+
+    machineReboot() {
+        this._xvpOp(1, 3);
+    }
+
+    machineReset() {
+        this._xvpOp(1, 4);
+    }
+
+    // Send a key press. If 'down' is not specified then send a down key
+    // followed by an up key.
+    sendKey(keysym, code, down) {
+        if (this._rfbConnectionState !== 'connected' || this._viewOnly) { return; }
+
+        if (down === undefined) {
+            this.sendKey(keysym, code, true);
+            this.sendKey(keysym, code, false);
+            return;
+        }
+
+        const scancode = XtScancode[code];
+
+        if (this._qemuExtKeyEventSupported && scancode) {
+            // 0 is NoSymbol
+            keysym = keysym || 0;
+
+            Log.Info("Sending key (" + (down ? "down" : "up") + "): keysym " + keysym + ", scancode " + scancode);
+
+            RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode);
+        } else {
+            if (!keysym) {
+                return;
+            }
+            Log.Info("Sending keysym (" + (down ? "down" : "up") + "): " + keysym);
+            RFB.messages.keyEvent(this._sock, keysym, down ? 1 : 0);
+        }
+    }
+
+    focus() {
+        this._canvas.focus();
+    }
+
+    blur() {
+        this._canvas.blur();
+    }
+
+    clipboardPasteFrom(text) {
+        if (this._rfbConnectionState !== 'connected' || this._viewOnly) { return; }
+
+        if (this._clipboardServerCapabilitiesFormats[extendedClipboardFormatText] &&
+            this._clipboardServerCapabilitiesActions[extendedClipboardActionNotify]) {
+
+            this._clipboardText = text;
+            RFB.messages.extendedClipboardNotify(this._sock, [extendedClipboardFormatText]);
+        } else {
+            let data = new Uint8Array(text.length);
+            for (let i = 0; i < text.length; i++) {
+                // FIXME: text can have values outside of Latin1/Uint8
+                data[i] = text.charCodeAt(i);
+            }
+
+            RFB.messages.clientCutText(this._sock, data);
+        }
+    }
+
+    // ===== PRIVATE METHODS =====
+
+    _connect() {
+        Log.Debug(">> RFB.connect");
+
+        Log.Info("connecting to " + this._url);
+
+        try {
+            // WebSocket.onopen transitions to the RFB init states
+            this._sock.open(this._url, this._wsProtocols);
+        } catch (e) {
+            if (e.name === 'SyntaxError') {
+                this._fail("Invalid host or port (" + e + ")");
+            } else {
+                this._fail("Error when opening socket (" + e + ")");
+            }
+        }
+
+        // Make our elements part of the page
+        this._target.appendChild(this._screen);
+
+        this._gestures.attach(this._canvas);
+
+        this._cursor.attach(this._canvas);
+        this._refreshCursor();
+
+        // Monitor size changes of the screen
+        // FIXME: Use ResizeObserver, or hidden overflow
+        window.addEventListener('resize', this._eventHandlers.windowResize);
+
+        // Always grab focus on some kind of click event
+        this._canvas.addEventListener("mousedown", this._eventHandlers.focusCanvas);
+        this._canvas.addEventListener("touchstart", this._eventHandlers.focusCanvas);
+
+        // Mouse events
+        this._canvas.addEventListener('mousedown', this._eventHandlers.handleMouse);
+        this._canvas.addEventListener('mouseup', this._eventHandlers.handleMouse);
+        this._canvas.addEventListener('mousemove', this._eventHandlers.handleMouse);
+        // Prevent middle-click pasting (see handler for why we bind to document)
+        this._canvas.addEventListener('click', this._eventHandlers.handleMouse);
+        // preventDefault() on mousedown doesn't stop this event for some
+        // reason so we have to explicitly block it
+        this._canvas.addEventListener('contextmenu', this._eventHandlers.handleMouse);
+
+        // Wheel events
+        this._canvas.addEventListener("wheel", this._eventHandlers.handleWheel);
+
+        // Gesture events
+        this._canvas.addEventListener("gesturestart", this._eventHandlers.handleGesture);
+        this._canvas.addEventListener("gesturemove", this._eventHandlers.handleGesture);
+        this._canvas.addEventListener("gestureend", this._eventHandlers.handleGesture);
+
+        Log.Debug("<< RFB.connect");
+    }
+
+    _disconnect() {
+        Log.Debug(">> RFB.disconnect");
+        this._cursor.detach();
+        this._canvas.removeEventListener("gesturestart", this._eventHandlers.handleGesture);
+        this._canvas.removeEventListener("gesturemove", this._eventHandlers.handleGesture);
+        this._canvas.removeEventListener("gestureend", this._eventHandlers.handleGesture);
+        this._canvas.removeEventListener("wheel", this._eventHandlers.handleWheel);
+        this._canvas.removeEventListener('mousedown', this._eventHandlers.handleMouse);
+        this._canvas.removeEventListener('mouseup', this._eventHandlers.handleMouse);
+        this._canvas.removeEventListener('mousemove', this._eventHandlers.handleMouse);
+        this._canvas.removeEventListener('click', this._eventHandlers.handleMouse);
+        this._canvas.removeEventListener('contextmenu', this._eventHandlers.handleMouse);
+        this._canvas.removeEventListener("mousedown", this._eventHandlers.focusCanvas);
+        this._canvas.removeEventListener("touchstart", this._eventHandlers.focusCanvas);
+        window.removeEventListener('resize', this._eventHandlers.windowResize);
+        this._keyboard.ungrab();
+        this._gestures.detach();
+        this._sock.close();
+        try {
+            this._target.removeChild(this._screen);
+        } catch (e) {
+            if (e.name === 'NotFoundError') {
+                // Some cases where the initial connection fails
+                // can disconnect before the _screen is created
+            } else {
+                throw e;
+            }
+        }
+        clearTimeout(this._resizeTimeout);
+        clearTimeout(this._mouseMoveTimer);
+        Log.Debug("<< RFB.disconnect");
+    }
+
+    _focusCanvas(event) {
+        if (!this.focusOnClick) {
+            return;
+        }
+
+        this.focus();
+    }
+
+    _setDesktopName(name) {
+        this._fbName = name;
+        this.dispatchEvent(new CustomEvent(
+            "desktopname",
+            { detail: { name: this._fbName } }));
+    }
+
+    _windowResize(event) {
+        // If the window resized then our screen element might have
+        // as well. Update the viewport dimensions.
+        window.requestAnimationFrame(() => {
+            this._updateClip();
+            this._updateScale();
+        });
+
+        if (this._resizeSession) {
+            // Request changing the resolution of the remote display to
+            // the size of the local browser viewport.
+
+            // In order to not send multiple requests before the browser-resize
+            // is finished we wait 0.5 seconds before sending the request.
+            clearTimeout(this._resizeTimeout);
+            this._resizeTimeout = setTimeout(this._requestRemoteResize.bind(this), 500);
+        }
+    }
+
+    // Update state of clipping in Display object, and make sure the
+    // configured viewport matches the current screen size
+    _updateClip() {
+        const curClip = this._display.clipViewport;
+        let newClip = this._clipViewport;
+
+        if (this._scaleViewport) {
+            // Disable viewport clipping if we are scaling
+            newClip = false;
+        }
+
+        if (curClip !== newClip) {
+            this._display.clipViewport = newClip;
+        }
+
+        if (newClip) {
+            // When clipping is enabled, the screen is limited to
+            // the size of the container.
+            const size = this._screenSize();
+            this._display.viewportChangeSize(size.w, size.h);
+            this._fixScrollbars();
+        }
+    }
+
+    _updateScale() {
+        if (!this._scaleViewport) {
+            this._display.scale = 1.0;
+        } else {
+            const size = this._screenSize();
+            this._display.autoscale(size.w, size.h);
+        }
+        this._fixScrollbars();
+    }
+
+    // Requests a change of remote desktop size. This message is an extension
+    // and may only be sent if we have received an ExtendedDesktopSize message
+    _requestRemoteResize() {
+        clearTimeout(this._resizeTimeout);
+        this._resizeTimeout = null;
+
+        if (!this._resizeSession || this._viewOnly ||
+            !this._supportsSetDesktopSize) {
+            return;
+        }
+
+        const size = this._screenSize();
+        RFB.messages.setDesktopSize(this._sock,
+                                    Math.floor(size.w), Math.floor(size.h),
+                                    this._screenID, this._screenFlags);
+
+        Log.Debug('Requested new desktop size: ' +
+                   size.w + 'x' + size.h);
+    }
+
+    // Gets the the size of the available screen
+    _screenSize() {
+        let r = this._screen.getBoundingClientRect();
+        return { w: r.width, h: r.height };
+    }
+
+    _fixScrollbars() {
+        // This is a hack because Chrome screws up the calculation
+        // for when scrollbars are needed. So to fix it we temporarily
+        // toggle them off and on.
+        const orig = this._screen.style.overflow;
+        this._screen.style.overflow = 'hidden';
+        // Force Chrome to recalculate the layout by asking for
+        // an element's dimensions
+        this._screen.getBoundingClientRect();
+        this._screen.style.overflow = orig;
+    }
+
+    /*
+     * Connection states:
+     *   connecting
+     *   connected
+     *   disconnecting
+     *   disconnected - permanent state
+     */
+    _updateConnectionState(state) {
+        const oldstate = this._rfbConnectionState;
+
+        if (state === oldstate) {
+            Log.Debug("Already in state '" + state + "', ignoring");
+            return;
+        }
+
+        // The 'disconnected' state is permanent for each RFB object
+        if (oldstate === 'disconnected') {
+            Log.Error("Tried changing state of a disconnected RFB object");
+            return;
+        }
+
+        // Ensure proper transitions before doing anything
+        switch (state) {
+            case 'connected':
+                if (oldstate !== 'connecting') {
+                    Log.Error("Bad transition to connected state, " +
+                               "previous connection state: " + oldstate);
+                    return;
+                }
+                break;
+
+            case 'disconnected':
+                if (oldstate !== 'disconnecting') {
+                    Log.Error("Bad transition to disconnected state, " +
+                               "previous connection state: " + oldstate);
+                    return;
+                }
+                break;
+
+            case 'connecting':
+                if (oldstate !== '') {
+                    Log.Error("Bad transition to connecting state, " +
+                               "previous connection state: " + oldstate);
+                    return;
+                }
+                break;
+
+            case 'disconnecting':
+                if (oldstate !== 'connected' && oldstate !== 'connecting') {
+                    Log.Error("Bad transition to disconnecting state, " +
+                               "previous connection state: " + oldstate);
+                    return;
+                }
+                break;
+
+            default:
+                Log.Error("Unknown connection state: " + state);
+                return;
+        }
+
+        // State change actions
+
+        this._rfbConnectionState = state;
+
+        Log.Debug("New state '" + state + "', was '" + oldstate + "'.");
+
+        if (this._disconnTimer && state !== 'disconnecting') {
+            Log.Debug("Clearing disconnect timer");
+            clearTimeout(this._disconnTimer);
+            this._disconnTimer = null;
+
+            // make sure we don't get a double event
+            this._sock.off('close');
+        }
+
+        switch (state) {
+            case 'connecting':
+                this._connect();
+                break;
+
+            case 'connected':
+                this.dispatchEvent(new CustomEvent("connect", { detail: {} }));
+                break;
+
+            case 'disconnecting':
+                this._disconnect();
+
+                this._disconnTimer = setTimeout(() => {
+                    Log.Error("Disconnection timed out.");
+                    this._updateConnectionState('disconnected');
+                }, DISCONNECT_TIMEOUT * 1000);
+                break;
+
+            case 'disconnected':
+                this.dispatchEvent(new CustomEvent(
+                    "disconnect", { detail:
+                                    { clean: this._rfbCleanDisconnect } }));
+                break;
+        }
+    }
+
+    /* Print errors and disconnect
+     *
+     * The parameter 'details' is used for information that
+     * should be logged but not sent to the user interface.
+     */
+    _fail(details) {
+        switch (this._rfbConnectionState) {
+            case 'disconnecting':
+                Log.Error("Failed when disconnecting: " + details);
+                break;
+            case 'connected':
+                Log.Error("Failed while connected: " + details);
+                break;
+            case 'connecting':
+                Log.Error("Failed when connecting: " + details);
+                break;
+            default:
+                Log.Error("RFB failure: " + details);
+                break;
+        }
+        this._rfbCleanDisconnect = false; //This is sent to the UI
+
+        // Transition to disconnected without waiting for socket to close
+        this._updateConnectionState('disconnecting');
+        this._updateConnectionState('disconnected');
+
+        return false;
+    }
+
+    _setCapability(cap, val) {
+        this._capabilities[cap] = val;
+        this.dispatchEvent(new CustomEvent("capabilities",
+                                           { detail: { capabilities: this._capabilities } }));
+    }
+
+    _handleMessage() {
+        if (this._sock.rQlen === 0) {
+            Log.Warn("handleMessage called on an empty receive queue");
+            return;
+        }
+
+        switch (this._rfbConnectionState) {
+            case 'disconnected':
+                Log.Error("Got data while disconnected");
+                break;
+            case 'connected':
+                while (true) {
+                    if (this._flushing) {
+                        break;
+                    }
+                    if (!this._normalMsg()) {
+                        break;
+                    }
+                    if (this._sock.rQlen === 0) {
+                        break;
+                    }
+                }
+                break;
+            default:
+                this._initMsg();
+                break;
+        }
+    }
+
+    _handleKeyEvent(keysym, code, down) {
+        this.sendKey(keysym, code, down);
+    }
+
+    _handleMouse(ev) {
+        /*
+         * We don't check connection status or viewOnly here as the
+         * mouse events might be used to control the viewport
+         */
+
+        if (ev.type === 'click') {
+            /*
+             * Note: This is only needed for the 'click' event as it fails
+             *       to fire properly for the target element so we have
+             *       to listen on the document element instead.
+             */
+            if (ev.target !== this._canvas) {
+                return;
+            }
+        }
+
+        // FIXME: if we're in view-only and not dragging,
+        //        should we stop events?
+        ev.stopPropagation();
+        ev.preventDefault();
+
+        if ((ev.type === 'click') || (ev.type === 'contextmenu')) {
+            return;
+        }
+
+        let pos = clientToElement(ev.clientX, ev.clientY,
+                                  this._canvas);
+
+        switch (ev.type) {
+            case 'mousedown':
+                setCapture(this._canvas);
+                this._handleMouseButton(pos.x, pos.y,
+                                        true, 1 << ev.button);
+                break;
+            case 'mouseup':
+                this._handleMouseButton(pos.x, pos.y,
+                                        false, 1 << ev.button);
+                break;
+            case 'mousemove':
+                this._handleMouseMove(pos.x, pos.y);
+                break;
+        }
+    }
+
+    _handleMouseButton(x, y, down, bmask) {
+        if (this.dragViewport) {
+            if (down && !this._viewportDragging) {
+                this._viewportDragging = true;
+                this._viewportDragPos = {'x': x, 'y': y};
+                this._viewportHasMoved = false;
+
+                // Skip sending mouse events
+                return;
+            } else {
+                this._viewportDragging = false;
+
+                // If we actually performed a drag then we are done
+                // here and should not send any mouse events
+                if (this._viewportHasMoved) {
+                    return;
+                }
+
+                // Otherwise we treat this as a mouse click event.
+                // Send the button down event here, as the button up
+                // event is sent at the end of this function.
+                this._sendMouse(x, y, bmask);
+            }
+        }
+
+        // Flush waiting move event first
+        if (this._mouseMoveTimer !== null) {
+            clearTimeout(this._mouseMoveTimer);
+            this._mouseMoveTimer = null;
+            this._sendMouse(x, y, this._mouseButtonMask);
+        }
+
+        if (down) {
+            this._mouseButtonMask |= bmask;
+        } else {
+            this._mouseButtonMask &= ~bmask;
+        }
+
+        this._sendMouse(x, y, this._mouseButtonMask);
+    }
+
+    _handleMouseMove(x, y) {
+        if (this._viewportDragging) {
+            const deltaX = this._viewportDragPos.x - x;
+            const deltaY = this._viewportDragPos.y - y;
+
+            if (this._viewportHasMoved || (Math.abs(deltaX) > dragThreshold ||
+                                           Math.abs(deltaY) > dragThreshold)) {
+                this._viewportHasMoved = true;
+
+                this._viewportDragPos = {'x': x, 'y': y};
+                this._display.viewportChangePos(deltaX, deltaY);
+            }
+
+            // Skip sending mouse events
+            return;
+        }
+
+        this._mousePos = { 'x': x, 'y': y };
+
+        // Limit many mouse move events to one every MOUSE_MOVE_DELAY ms
+        if (this._mouseMoveTimer == null) {
+
+            const timeSinceLastMove = Date.now() - this._mouseLastMoveTime;
+            if (timeSinceLastMove > MOUSE_MOVE_DELAY) {
+                this._sendMouse(x, y, this._mouseButtonMask);
+                this._mouseLastMoveTime = Date.now();
+            } else {
+                // Too soon since the latest move, wait the remaining time
+                this._mouseMoveTimer = setTimeout(() => {
+                    this._handleDelayedMouseMove();
+                }, MOUSE_MOVE_DELAY - timeSinceLastMove);
+            }
+        }
+    }
+
+    _handleDelayedMouseMove() {
+        this._mouseMoveTimer = null;
+        this._sendMouse(this._mousePos.x, this._mousePos.y,
+                        this._mouseButtonMask);
+        this._mouseLastMoveTime = Date.now();
+    }
+
+    _sendMouse(x, y, mask) {
+        if (this._rfbConnectionState !== 'connected') { return; }
+        if (this._viewOnly) { return; } // View only, skip mouse events
+
+        RFB.messages.pointerEvent(this._sock, this._display.absX(x),
+                                  this._display.absY(y), mask);
+    }
+
+    _handleWheel(ev) {
+        if (this._rfbConnectionState !== 'connected') { return; }
+        if (this._viewOnly) { return; } // View only, skip mouse events
+
+        ev.stopPropagation();
+        ev.preventDefault();
+
+        let pos = clientToElement(ev.clientX, ev.clientY,
+                                  this._canvas);
+
+        let dX = ev.deltaX;
+        let dY = ev.deltaY;
+
+        // Pixel units unless it's non-zero.
+        // Note that if deltamode is line or page won't matter since we aren't
+        // sending the mouse wheel delta to the server anyway.
+        // The difference between pixel and line can be important however since
+        // we have a threshold that can be smaller than the line height.
+        if (ev.deltaMode !== 0) {
+            dX *= WHEEL_LINE_HEIGHT;
+            dY *= WHEEL_LINE_HEIGHT;
+        }
+
+        // Mouse wheel events are sent in steps over VNC. This means that the VNC
+        // protocol can't handle a wheel event with specific distance or speed.
+        // Therefor, if we get a lot of small mouse wheel events we combine them.
+        this._accumulatedWheelDeltaX += dX;
+        this._accumulatedWheelDeltaY += dY;
+
+        // Generate a mouse wheel step event when the accumulated delta
+        // for one of the axes is large enough.
+        if (Math.abs(this._accumulatedWheelDeltaX) >= WHEEL_STEP) {
+            if (this._accumulatedWheelDeltaX < 0) {
+                this._handleMouseButton(pos.x, pos.y, true, 1 << 5);
+                this._handleMouseButton(pos.x, pos.y, false, 1 << 5);
+            } else if (this._accumulatedWheelDeltaX > 0) {
+                this._handleMouseButton(pos.x, pos.y, true, 1 << 6);
+                this._handleMouseButton(pos.x, pos.y, false, 1 << 6);
+            }
+
+            this._accumulatedWheelDeltaX = 0;
+        }
+        if (Math.abs(this._accumulatedWheelDeltaY) >= WHEEL_STEP) {
+            if (this._accumulatedWheelDeltaY < 0) {
+                this._handleMouseButton(pos.x, pos.y, true, 1 << 3);
+                this._handleMouseButton(pos.x, pos.y, false, 1 << 3);
+            } else if (this._accumulatedWheelDeltaY > 0) {
+                this._handleMouseButton(pos.x, pos.y, true, 1 << 4);
+                this._handleMouseButton(pos.x, pos.y, false, 1 << 4);
+            }
+
+            this._accumulatedWheelDeltaY = 0;
+        }
+    }
+
+    _fakeMouseMove(ev, elementX, elementY) {
+        this._handleMouseMove(elementX, elementY);
+        this._cursor.move(ev.detail.clientX, ev.detail.clientY);
+    }
+
+    _handleTapEvent(ev, bmask) {
+        let pos = clientToElement(ev.detail.clientX, ev.detail.clientY,
+                                  this._canvas);
+
+        // If the user quickly taps multiple times we assume they meant to
+        // hit the same spot, so slightly adjust coordinates
+
+        if ((this._gestureLastTapTime !== null) &&
+            ((Date.now() - this._gestureLastTapTime) < DOUBLE_TAP_TIMEOUT) &&
+            (this._gestureFirstDoubleTapEv.detail.type === ev.detail.type)) {
+            let dx = this._gestureFirstDoubleTapEv.detail.clientX - ev.detail.clientX;
+            let dy = this._gestureFirstDoubleTapEv.detail.clientY - ev.detail.clientY;
+            let distance = Math.hypot(dx, dy);
+
+            if (distance < DOUBLE_TAP_THRESHOLD) {
+                pos = clientToElement(this._gestureFirstDoubleTapEv.detail.clientX,
+                                      this._gestureFirstDoubleTapEv.detail.clientY,
+                                      this._canvas);
+            } else {
+                this._gestureFirstDoubleTapEv = ev;
+            }
+        } else {
+            this._gestureFirstDoubleTapEv = ev;
+        }
+        this._gestureLastTapTime = Date.now();
+
+        this._fakeMouseMove(this._gestureFirstDoubleTapEv, pos.x, pos.y);
+        this._handleMouseButton(pos.x, pos.y, true, bmask);
+        this._handleMouseButton(pos.x, pos.y, false, bmask);
+    }
+
+    _handleGesture(ev) {
+        let magnitude;
+
+        let pos = clientToElement(ev.detail.clientX, ev.detail.clientY,
+                                  this._canvas);
+        switch (ev.type) {
+            case 'gesturestart':
+                switch (ev.detail.type) {
+                    case 'onetap':
+                        this._handleTapEvent(ev, 0x1);
+                        break;
+                    case 'twotap':
+                        this._handleTapEvent(ev, 0x4);
+                        break;
+                    case 'threetap':
+                        this._handleTapEvent(ev, 0x2);
+                        break;
+                    case 'drag':
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        this._handleMouseButton(pos.x, pos.y, true, 0x1);
+                        break;
+                    case 'longpress':
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        this._handleMouseButton(pos.x, pos.y, true, 0x4);
+                        break;
+
+                    case 'twodrag':
+                        this._gestureLastMagnitudeX = ev.detail.magnitudeX;
+                        this._gestureLastMagnitudeY = ev.detail.magnitudeY;
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        break;
+                    case 'pinch':
+                        this._gestureLastMagnitudeX = Math.hypot(ev.detail.magnitudeX,
+                                                                 ev.detail.magnitudeY);
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        break;
+                }
+                break;
+
+            case 'gesturemove':
+                switch (ev.detail.type) {
+                    case 'onetap':
+                    case 'twotap':
+                    case 'threetap':
+                        break;
+                    case 'drag':
+                    case 'longpress':
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        break;
+                    case 'twodrag':
+                        // Always scroll in the same position.
+                        // We don't know if the mouse was moved so we need to move it
+                        // every update.
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        while ((ev.detail.magnitudeY - this._gestureLastMagnitudeY) > GESTURE_SCRLSENS) {
+                            this._handleMouseButton(pos.x, pos.y, true, 0x8);
+                            this._handleMouseButton(pos.x, pos.y, false, 0x8);
+                            this._gestureLastMagnitudeY += GESTURE_SCRLSENS;
+                        }
+                        while ((ev.detail.magnitudeY - this._gestureLastMagnitudeY) < -GESTURE_SCRLSENS) {
+                            this._handleMouseButton(pos.x, pos.y, true, 0x10);
+                            this._handleMouseButton(pos.x, pos.y, false, 0x10);
+                            this._gestureLastMagnitudeY -= GESTURE_SCRLSENS;
+                        }
+                        while ((ev.detail.magnitudeX - this._gestureLastMagnitudeX) > GESTURE_SCRLSENS) {
+                            this._handleMouseButton(pos.x, pos.y, true, 0x20);
+                            this._handleMouseButton(pos.x, pos.y, false, 0x20);
+                            this._gestureLastMagnitudeX += GESTURE_SCRLSENS;
+                        }
+                        while ((ev.detail.magnitudeX - this._gestureLastMagnitudeX) < -GESTURE_SCRLSENS) {
+                            this._handleMouseButton(pos.x, pos.y, true, 0x40);
+                            this._handleMouseButton(pos.x, pos.y, false, 0x40);
+                            this._gestureLastMagnitudeX -= GESTURE_SCRLSENS;
+                        }
+                        break;
+                    case 'pinch':
+                        // Always scroll in the same position.
+                        // We don't know if the mouse was moved so we need to move it
+                        // every update.
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        magnitude = Math.hypot(ev.detail.magnitudeX, ev.detail.magnitudeY);
+                        if (Math.abs(magnitude - this._gestureLastMagnitudeX) > GESTURE_ZOOMSENS) {
+                            this._handleKeyEvent(KeyTable.XK_Control_L, "ControlLeft", true);
+                            while ((magnitude - this._gestureLastMagnitudeX) > GESTURE_ZOOMSENS) {
+                                this._handleMouseButton(pos.x, pos.y, true, 0x8);
+                                this._handleMouseButton(pos.x, pos.y, false, 0x8);
+                                this._gestureLastMagnitudeX += GESTURE_ZOOMSENS;
+                            }
+                            while ((magnitude -  this._gestureLastMagnitudeX) < -GESTURE_ZOOMSENS) {
+                                this._handleMouseButton(pos.x, pos.y, true, 0x10);
+                                this._handleMouseButton(pos.x, pos.y, false, 0x10);
+                                this._gestureLastMagnitudeX -= GESTURE_ZOOMSENS;
+                            }
+                        }
+                        this._handleKeyEvent(KeyTable.XK_Control_L, "ControlLeft", false);
+                        break;
+                }
+                break;
+
+            case 'gestureend':
+                switch (ev.detail.type) {
+                    case 'onetap':
+                    case 'twotap':
+                    case 'threetap':
+                    case 'pinch':
+                    case 'twodrag':
+                        break;
+                    case 'drag':
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        this._handleMouseButton(pos.x, pos.y, false, 0x1);
+                        break;
+                    case 'longpress':
+                        this._fakeMouseMove(ev, pos.x, pos.y);
+                        this._handleMouseButton(pos.x, pos.y, false, 0x4);
+                        break;
+                }
+                break;
+        }
+    }
+
+    // Message Handlers
+
+    _negotiateProtocolVersion() {
+        if (this._sock.rQwait("version", 12)) {
+            return false;
+        }
+
+        const sversion = this._sock.rQshiftStr(12).substr(4, 7);
+        Log.Info("Server ProtocolVersion: " + sversion);
+        let isRepeater = 0;
+        switch (sversion) {
+            case "000.000":  // UltraVNC repeater
+                isRepeater = 1;
+                break;
+            case "003.003":
+            case "003.006":  // UltraVNC
+            case "003.889":  // Apple Remote Desktop
+                this._rfbVersion = 3.3;
+                break;
+            case "003.007":
+                this._rfbVersion = 3.7;
+                break;
+            case "003.008":
+            case "004.000":  // Intel AMT KVM
+            case "004.001":  // RealVNC 4.6
+            case "005.000":  // RealVNC 5.3
+                this._rfbVersion = 3.8;
+                break;
+            default:
+                return this._fail("Invalid server version " + sversion);
+        }
+
+        if (isRepeater) {
+            let repeaterID = "ID:" + this._repeaterID;
+            while (repeaterID.length < 250) {
+                repeaterID += "\0";
+            }
+            this._sock.sendString(repeaterID);
+            return true;
+        }
+
+        if (this._rfbVersion > this._rfbMaxVersion) {
+            this._rfbVersion = this._rfbMaxVersion;
+        }
+
+        const cversion = "00" + parseInt(this._rfbVersion, 10) +
+                       ".00" + ((this._rfbVersion * 10) % 10);
+        this._sock.sendString("RFB " + cversion + "\n");
+        Log.Debug('Sent ProtocolVersion: ' + cversion);
+
+        this._rfbInitState = 'Security';
+    }
+
+    _negotiateSecurity() {
+        // Polyfill since IE and PhantomJS doesn't have
+        // TypedArray.includes()
+        function includes(item, array) {
+            for (let i = 0; i < array.length; i++) {
+                if (array[i] === item) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        if (this._rfbVersion >= 3.7) {
+            // Server sends supported list, client decides
+            const numTypes = this._sock.rQshift8();
+            if (this._sock.rQwait("security type", numTypes, 1)) { return false; }
+
+            if (numTypes === 0) {
+                this._rfbInitState = "SecurityReason";
+                this._securityContext = "no security types";
+                this._securityStatus = 1;
+                return this._initMsg();
+            }
+
+            const types = this._sock.rQshiftBytes(numTypes);
+            Log.Debug("Server security types: " + types);
+
+            // Look for each auth in preferred order
+            if (includes(1, types)) {
+                this._rfbAuthScheme = 1; // None
+            } else if (includes(22, types)) {
+                this._rfbAuthScheme = 22; // XVP
+            } else if (includes(16, types)) {
+                this._rfbAuthScheme = 16; // Tight
+            } else if (includes(2, types)) {
+                this._rfbAuthScheme = 2; // VNC Auth
+            } else if (includes(19, types)) {
+                this._rfbAuthScheme = 19; // VeNCrypt Auth
+            } else {
+                return this._fail("Unsupported security types (types: " + types + ")");
+            }
+
+            this._sock.send([this._rfbAuthScheme]);
+        } else {
+            // Server decides
+            if (this._sock.rQwait("security scheme", 4)) { return false; }
+            this._rfbAuthScheme = this._sock.rQshift32();
+
+            if (this._rfbAuthScheme == 0) {
+                this._rfbInitState = "SecurityReason";
+                this._securityContext = "authentication scheme";
+                this._securityStatus = 1;
+                return this._initMsg();
+            }
+        }
+
+        this._rfbInitState = 'Authentication';
+        Log.Debug('Authenticating using scheme: ' + this._rfbAuthScheme);
+
+        return this._initMsg(); // jump to authentication
+    }
+
+    _handleSecurityReason() {
+        if (this._sock.rQwait("reason length", 4)) {
+            return false;
+        }
+        const strlen = this._sock.rQshift32();
+        let reason = "";
+
+        if (strlen > 0) {
+            if (this._sock.rQwait("reason", strlen, 4)) { return false; }
+            reason = this._sock.rQshiftStr(strlen);
+        }
+
+        if (reason !== "") {
+            this.dispatchEvent(new CustomEvent(
+                "securityfailure",
+                { detail: { status: this._securityStatus,
+                            reason: reason } }));
+
+            return this._fail("Security negotiation failed on " +
+                              this._securityContext +
+                              " (reason: " + reason + ")");
+        } else {
+            this.dispatchEvent(new CustomEvent(
+                "securityfailure",
+                { detail: { status: this._securityStatus } }));
+
+            return this._fail("Security negotiation failed on " +
+                              this._securityContext);
+        }
+    }
+
+    // authentication
+    _negotiateXvpAuth() {
+        if (this._rfbCredentials.username === undefined ||
+            this._rfbCredentials.password === undefined ||
+            this._rfbCredentials.target === undefined) {
+            this.dispatchEvent(new CustomEvent(
+                "credentialsrequired",
+                { detail: { types: ["username", "password", "target"] } }));
+            return false;
+        }
+
+        const xvpAuthStr = String.fromCharCode(this._rfbCredentials.username.length) +
+                           String.fromCharCode(this._rfbCredentials.target.length) +
+                           this._rfbCredentials.username +
+                           this._rfbCredentials.target;
+        this._sock.sendString(xvpAuthStr);
+        this._rfbAuthScheme = 2;
+        return this._negotiateAuthentication();
+    }
+
+    // VeNCrypt authentication, currently only supports version 0.2 and only Plain subtype
+    _negotiateVeNCryptAuth() {
+
+        // waiting for VeNCrypt version
+        if (this._rfbVeNCryptState == 0) {
+            if (this._sock.rQwait("vencrypt version", 2)) { return false; }
+
+            const major = this._sock.rQshift8();
+            const minor = this._sock.rQshift8();
+
+            if (!(major == 0 && minor == 2)) {
+                return this._fail("Unsupported VeNCrypt version " + major + "." + minor);
+            }
+
+            this._sock.send([0, 2]);
+            this._rfbVeNCryptState = 1;
+        }
+
+        // waiting for ACK
+        if (this._rfbVeNCryptState == 1) {
+            if (this._sock.rQwait("vencrypt ack", 1)) { return false; }
+
+            const res = this._sock.rQshift8();
+
+            if (res != 0) {
+                return this._fail("VeNCrypt failure " + res);
+            }
+
+            this._rfbVeNCryptState = 2;
+        }
+        // must fall through here (i.e. no "else if"), beacause we may have already received
+        // the subtypes length and won't be called again
+
+        if (this._rfbVeNCryptState == 2) { // waiting for subtypes length
+            if (this._sock.rQwait("vencrypt subtypes length", 1)) { return false; }
+
+            const subtypesLength = this._sock.rQshift8();
+            if (subtypesLength < 1) {
+                return this._fail("VeNCrypt subtypes empty");
+            }
+
+            this._rfbVeNCryptSubtypesLength = subtypesLength;
+            this._rfbVeNCryptState = 3;
+        }
+
+        // waiting for subtypes list
+        if (this._rfbVeNCryptState == 3) {
+            if (this._sock.rQwait("vencrypt subtypes", 4 * this._rfbVeNCryptSubtypesLength)) { return false; }
+
+            const subtypes = [];
+            for (let i = 0; i < this._rfbVeNCryptSubtypesLength; i++) {
+                subtypes.push(this._sock.rQshift32());
+            }
+
+            // 256 = Plain subtype
+            if (subtypes.indexOf(256) != -1) {
+                // 0x100 = 256
+                this._sock.send([0, 0, 1, 0]);
+                this._rfbVeNCryptState = 4;
+            } else {
+                return this._fail("VeNCrypt Plain subtype not offered by server");
+            }
+        }
+
+        // negotiated Plain subtype, server waits for password
+        if (this._rfbVeNCryptState == 4) {
+            if (!this._rfbCredentials.username ||
+                !this._rfbCredentials.password) {
+                this.dispatchEvent(new CustomEvent(
+                    "credentialsrequired",
+                    { detail: { types: ["username", "password"] } }));
+                return false;
+            }
+
+            const user = encodeUTF8(this._rfbCredentials.username);
+            const pass = encodeUTF8(this._rfbCredentials.password);
+
+            // XXX we assume lengths are <= 255 (should not be an issue in the real world)
+            this._sock.send([0, 0, 0, user.length]);
+            this._sock.send([0, 0, 0, pass.length]);
+            this._sock.sendString(user);
+            this._sock.sendString(pass);
+
+            this._rfbInitState = "SecurityResult";
+            return true;
+        }
+    }
+
+    _negotiateStdVNCAuth() {
+        if (this._sock.rQwait("auth challenge", 16)) { return false; }
+
+        if (this._rfbCredentials.password === undefined) {
+            this.dispatchEvent(new CustomEvent(
+                "credentialsrequired",
+                { detail: { types: ["password"] } }));
+            return false;
+        }
+
+        // TODO(directxman12): make genDES not require an Array
+        const challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16));
+        const response = RFB.genDES(this._rfbCredentials.password, challenge);
+        this._sock.send(response);
+        this._rfbInitState = "SecurityResult";
+        return true;
+    }
+
+    _negotiateTightUnixAuth() {
+        if (this._rfbCredentials.username === undefined ||
+            this._rfbCredentials.password === undefined) {
+            this.dispatchEvent(new CustomEvent(
+                "credentialsrequired",
+                { detail: { types: ["username", "password"] } }));
+            return false;
+        }
+
+        this._sock.send([0, 0, 0, this._rfbCredentials.username.length]);
+        this._sock.send([0, 0, 0, this._rfbCredentials.password.length]);
+        this._sock.sendString(this._rfbCredentials.username);
+        this._sock.sendString(this._rfbCredentials.password);
+        this._rfbInitState = "SecurityResult";
+        return true;
+    }
+
+    _negotiateTightTunnels(numTunnels) {
+        const clientSupportedTunnelTypes = {
+            0: { vendor: 'TGHT', signature: 'NOTUNNEL' }
+        };
+        const serverSupportedTunnelTypes = {};
+        // receive tunnel capabilities
+        for (let i = 0; i < numTunnels; i++) {
+            const capCode = this._sock.rQshift32();
+            const capVendor = this._sock.rQshiftStr(4);
+            const capSignature = this._sock.rQshiftStr(8);
+            serverSupportedTunnelTypes[capCode] = { vendor: capVendor, signature: capSignature };
+        }
+
+        Log.Debug("Server Tight tunnel types: " + serverSupportedTunnelTypes);
+
+        // Siemens touch panels have a VNC server that supports NOTUNNEL,
+        // but forgets to advertise it. Try to detect such servers by
+        // looking for their custom tunnel type.
+        if (serverSupportedTunnelTypes[1] &&
+            (serverSupportedTunnelTypes[1].vendor === "SICR") &&
+            (serverSupportedTunnelTypes[1].signature === "SCHANNEL")) {
+            Log.Debug("Detected Siemens server. Assuming NOTUNNEL support.");
+            serverSupportedTunnelTypes[0] = { vendor: 'TGHT', signature: 'NOTUNNEL' };
+        }
+
+        // choose the notunnel type
+        if (serverSupportedTunnelTypes[0]) {
+            if (serverSupportedTunnelTypes[0].vendor != clientSupportedTunnelTypes[0].vendor ||
+                serverSupportedTunnelTypes[0].signature != clientSupportedTunnelTypes[0].signature) {
+                return this._fail("Client's tunnel type had the incorrect " +
+                                  "vendor or signature");
+            }
+            Log.Debug("Selected tunnel type: " + clientSupportedTunnelTypes[0]);
+            this._sock.send([0, 0, 0, 0]);  // use NOTUNNEL
+            return false; // wait until we receive the sub auth count to continue
+        } else {
+            return this._fail("Server wanted tunnels, but doesn't support " +
+                              "the notunnel type");
+        }
+    }
+
+    _negotiateTightAuth() {
+        if (!this._rfbTightVNC) {  // first pass, do the tunnel negotiation
+            if (this._sock.rQwait("num tunnels", 4)) { return false; }
+            const numTunnels = this._sock.rQshift32();
+            if (numTunnels > 0 && this._sock.rQwait("tunnel capabilities", 16 * numTunnels, 4)) { return false; }
+
+            this._rfbTightVNC = true;
+
+            if (numTunnels > 0) {
+                this._negotiateTightTunnels(numTunnels);
+                return false;  // wait until we receive the sub auth to continue
+            }
+        }
+
+        // second pass, do the sub-auth negotiation
+        if (this._sock.rQwait("sub auth count", 4)) { return false; }
+        const subAuthCount = this._sock.rQshift32();
+        if (subAuthCount === 0) {  // empty sub-auth list received means 'no auth' subtype selected
+            this._rfbInitState = 'SecurityResult';
+            return true;
+        }
+
+        if (this._sock.rQwait("sub auth capabilities", 16 * subAuthCount, 4)) { return false; }
+
+        const clientSupportedTypes = {
+            'STDVNOAUTH__': 1,
+            'STDVVNCAUTH_': 2,
+            'TGHTULGNAUTH': 129
+        };
+
+        const serverSupportedTypes = [];
+
+        for (let i = 0; i < subAuthCount; i++) {
+            this._sock.rQshift32(); // capNum
+            const capabilities = this._sock.rQshiftStr(12);
+            serverSupportedTypes.push(capabilities);
+        }
+
+        Log.Debug("Server Tight authentication types: " + serverSupportedTypes);
+
+        for (let authType in clientSupportedTypes) {
+            if (serverSupportedTypes.indexOf(authType) != -1) {
+                this._sock.send([0, 0, 0, clientSupportedTypes[authType]]);
+                Log.Debug("Selected authentication type: " + authType);
+
+                switch (authType) {
+                    case 'STDVNOAUTH__':  // no auth
+                        this._rfbInitState = 'SecurityResult';
+                        return true;
+                    case 'STDVVNCAUTH_': // VNC auth
+                        this._rfbAuthScheme = 2;
+                        return this._initMsg();
+                    case 'TGHTULGNAUTH': // UNIX auth
+                        this._rfbAuthScheme = 129;
+                        return this._initMsg();
+                    default:
+                        return this._fail("Unsupported tiny auth scheme " +
+                                          "(scheme: " + authType + ")");
+                }
+            }
+        }
+
+        return this._fail("No supported sub-auth types!");
+    }
+
+    _negotiateAuthentication() {
+        switch (this._rfbAuthScheme) {
+            case 1:  // no auth
+                if (this._rfbVersion >= 3.8) {
+                    this._rfbInitState = 'SecurityResult';
+                    return true;
+                }
+                this._rfbInitState = 'ClientInitialisation';
+                return this._initMsg();
+
+            case 22:  // XVP auth
+                return this._negotiateXvpAuth();
+
+            case 2:  // VNC authentication
+                return this._negotiateStdVNCAuth();
+
+            case 16:  // TightVNC Security Type
+                return this._negotiateTightAuth();
+
+            case 19:  // VeNCrypt Security Type
+                return this._negotiateVeNCryptAuth();
+
+            case 129:  // TightVNC UNIX Security Type
+                return this._negotiateTightUnixAuth();
+
+            default:
+                return this._fail("Unsupported auth scheme (scheme: " +
+                                  this._rfbAuthScheme + ")");
+        }
+    }
+
+    _handleSecurityResult() {
+        if (this._sock.rQwait('VNC auth response ', 4)) { return false; }
+
+        const status = this._sock.rQshift32();
+
+        if (status === 0) { // OK
+            this._rfbInitState = 'ClientInitialisation';
+            Log.Debug('Authentication OK');
+            return this._initMsg();
+        } else {
+            if (this._rfbVersion >= 3.8) {
+                this._rfbInitState = "SecurityReason";
+                this._securityContext = "security result";
+                this._securityStatus = status;
+                return this._initMsg();
+            } else {
+                this.dispatchEvent(new CustomEvent(
+                    "securityfailure",
+                    { detail: { status: status } }));
+
+                return this._fail("Security handshake failed");
+            }
+        }
+    }
+
+    _negotiateServerInit() {
+        if (this._sock.rQwait("server initialization", 24)) { return false; }
+
+        /* Screen size */
+        const width = this._sock.rQshift16();
+        const height = this._sock.rQshift16();
+
+        /* PIXEL_FORMAT */
+        const bpp         = this._sock.rQshift8();
+        const depth       = this._sock.rQshift8();
+        const bigEndian  = this._sock.rQshift8();
+        const trueColor  = this._sock.rQshift8();
+
+        const redMax     = this._sock.rQshift16();
+        const greenMax   = this._sock.rQshift16();
+        const blueMax    = this._sock.rQshift16();
+        const redShift   = this._sock.rQshift8();
+        const greenShift = this._sock.rQshift8();
+        const blueShift  = this._sock.rQshift8();
+        this._sock.rQskipBytes(3);  // padding
+
+        // NB(directxman12): we don't want to call any callbacks or print messages until
+        //                   *after* we're past the point where we could backtrack
+
+        /* Connection name/title */
+        const nameLength = this._sock.rQshift32();
+        if (this._sock.rQwait('server init name', nameLength, 24)) { return false; }
+        let name = this._sock.rQshiftStr(nameLength);
+        name = decodeUTF8(name, true);
+
+        if (this._rfbTightVNC) {
+            if (this._sock.rQwait('TightVNC extended server init header', 8, 24 + nameLength)) { return false; }
+            // In TightVNC mode, ServerInit message is extended
+            const numServerMessages = this._sock.rQshift16();
+            const numClientMessages = this._sock.rQshift16();
+            const numEncodings = this._sock.rQshift16();
+            this._sock.rQskipBytes(2);  // padding
+
+            const totalMessagesLength = (numServerMessages + numClientMessages + numEncodings) * 16;
+            if (this._sock.rQwait('TightVNC extended server init header', totalMessagesLength, 32 + nameLength)) { return false; }
+
+            // we don't actually do anything with the capability information that TIGHT sends,
+            // so we just skip the all of this.
+
+            // TIGHT server message capabilities
+            this._sock.rQskipBytes(16 * numServerMessages);
+
+            // TIGHT client message capabilities
+            this._sock.rQskipBytes(16 * numClientMessages);
+
+            // TIGHT encoding capabilities
+            this._sock.rQskipBytes(16 * numEncodings);
+        }
+
+        // NB(directxman12): these are down here so that we don't run them multiple times
+        //                   if we backtrack
+        Log.Info("Screen: " + width + "x" + height +
+                  ", bpp: " + bpp + ", depth: " + depth +
+                  ", bigEndian: " + bigEndian +
+                  ", trueColor: " + trueColor +
+                  ", redMax: " + redMax +
+                  ", greenMax: " + greenMax +
+                  ", blueMax: " + blueMax +
+                  ", redShift: " + redShift +
+                  ", greenShift: " + greenShift +
+                  ", blueShift: " + blueShift);
+
+        // we're past the point where we could backtrack, so it's safe to call this
+        this._setDesktopName(name);
+        this._resize(width, height);
+
+        if (!this._viewOnly) { this._keyboard.grab(); }
+
+        this._fbDepth = 24;
+
+        if (this._fbName === "Intel(r) AMT KVM") {
+            Log.Warn("Intel AMT KVM only supports 8/16 bit depths. Using low color mode.");
+            this._fbDepth = 8;
+        }
+
+        RFB.messages.pixelFormat(this._sock, this._fbDepth, true);
+        this._sendEncodings();
+        RFB.messages.fbUpdateRequest(this._sock, false, 0, 0, this._fbWidth, this._fbHeight);
+
+        this._updateConnectionState('connected');
+        return true;
+    }
+
+    _sendEncodings() {
+        const encs = [];
+
+        // In preference order
+        encs.push(encodings.encodingCopyRect);
+        // Only supported with full depth support
+        if (this._fbDepth == 24) {
+            encs.push(encodings.encodingTight);
+            encs.push(encodings.encodingTightPNG);
+            encs.push(encodings.encodingHextile);
+            encs.push(encodings.encodingRRE);
+        }
+        encs.push(encodings.encodingRaw);
+
+        // Psuedo-encoding settings
+        encs.push(encodings.pseudoEncodingQualityLevel0 + this._qualityLevel);
+        encs.push(encodings.pseudoEncodingCompressLevel0 + this._compressionLevel);
+
+        encs.push(encodings.pseudoEncodingDesktopSize);
+        encs.push(encodings.pseudoEncodingLastRect);
+        encs.push(encodings.pseudoEncodingQEMUExtendedKeyEvent);
+        encs.push(encodings.pseudoEncodingExtendedDesktopSize);
+        encs.push(encodings.pseudoEncodingXvp);
+        encs.push(encodings.pseudoEncodingFence);
+        encs.push(encodings.pseudoEncodingContinuousUpdates);
+        encs.push(encodings.pseudoEncodingDesktopName);
+        encs.push(encodings.pseudoEncodingExtendedClipboard);
+
+        if (this._fbDepth == 24) {
+            encs.push(encodings.pseudoEncodingVMwareCursor);
+            encs.push(encodings.pseudoEncodingCursor);
+        }
+
+        RFB.messages.clientEncodings(this._sock, encs);
+    }
+
+    /* RFB protocol initialization states:
+     *   ProtocolVersion
+     *   Security
+     *   Authentication
+     *   SecurityResult
+     *   ClientInitialization - not triggered by server message
+     *   ServerInitialization
+     */
+    _initMsg() {
+        switch (this._rfbInitState) {
+            case 'ProtocolVersion':
+                return this._negotiateProtocolVersion();
+
+            case 'Security':
+                return this._negotiateSecurity();
+
+            case 'Authentication':
+                return this._negotiateAuthentication();
+
+            case 'SecurityResult':
+                return this._handleSecurityResult();
+
+            case 'SecurityReason':
+                return this._handleSecurityReason();
+
+            case 'ClientInitialisation':
+                this._sock.send([this._shared ? 1 : 0]); // ClientInitialisation
+                this._rfbInitState = 'ServerInitialisation';
+                return true;
+
+            case 'ServerInitialisation':
+                return this._negotiateServerInit();
+
+            default:
+                return this._fail("Unknown init state (state: " +
+                                  this._rfbInitState + ")");
+        }
+    }
+
+    _handleSetColourMapMsg() {
+        Log.Debug("SetColorMapEntries");
+
+        return this._fail("Unexpected SetColorMapEntries message");
+    }
+
+    _handleServerCutText() {
+        Log.Debug("ServerCutText");
+
+        if (this._sock.rQwait("ServerCutText header", 7, 1)) { return false; }
+
+        this._sock.rQskipBytes(3);  // Padding
+
+        let length = this._sock.rQshift32();
+        length = toSigned32bit(length);
+
+        if (this._sock.rQwait("ServerCutText content", Math.abs(length), 8)) { return false; }
+
+        if (length >= 0) {
+            //Standard msg
+            const text = this._sock.rQshiftStr(length);
+            if (this._viewOnly) {
+                return true;
+            }
+
+            this.dispatchEvent(new CustomEvent(
+                "clipboard",
+                { detail: { text: text } }));
+
+        } else {
+            //Extended msg.
+            length = Math.abs(length);
+            const flags = this._sock.rQshift32();
+            let formats = flags & 0x0000FFFF;
+            let actions = flags & 0xFF000000;
+
+            let isCaps = (!!(actions & extendedClipboardActionCaps));
+            if (isCaps) {
+                this._clipboardServerCapabilitiesFormats = {};
+                this._clipboardServerCapabilitiesActions = {};
+
+                // Update our server capabilities for Formats
+                for (let i = 0; i <= 15; i++) {
+                    let index = 1 << i;
+
+                    // Check if format flag is set.
+                    if ((formats & index)) {
+                        this._clipboardServerCapabilitiesFormats[index] = true;
+                        // We don't send unsolicited clipboard, so we
+                        // ignore the size
+                        this._sock.rQshift32();
+                    }
+                }
+
+                // Update our server capabilities for Actions
+                for (let i = 24; i <= 31; i++) {
+                    let index = 1 << i;
+                    this._clipboardServerCapabilitiesActions[index] = !!(actions & index);
+                }
+
+                /*  Caps handling done, send caps with the clients
+                    capabilities set as a response */
+                let clientActions = [
+                    extendedClipboardActionCaps,
+                    extendedClipboardActionRequest,
+                    extendedClipboardActionPeek,
+                    extendedClipboardActionNotify,
+                    extendedClipboardActionProvide
+                ];
+                RFB.messages.extendedClipboardCaps(this._sock, clientActions, {extendedClipboardFormatText: 0});
+
+            } else if (actions === extendedClipboardActionRequest) {
+                if (this._viewOnly) {
+                    return true;
+                }
+
+                // Check if server has told us it can handle Provide and there is clipboard data to send.
+                if (this._clipboardText != null &&
+                    this._clipboardServerCapabilitiesActions[extendedClipboardActionProvide]) {
+
+                    if (formats & extendedClipboardFormatText) {
+                        RFB.messages.extendedClipboardProvide(this._sock, [extendedClipboardFormatText], [this._clipboardText]);
+                    }
+                }
+
+            } else if (actions === extendedClipboardActionPeek) {
+                if (this._viewOnly) {
+                    return true;
+                }
+
+                if (this._clipboardServerCapabilitiesActions[extendedClipboardActionNotify]) {
+
+                    if (this._clipboardText != null) {
+                        RFB.messages.extendedClipboardNotify(this._sock, [extendedClipboardFormatText]);
+                    } else {
+                        RFB.messages.extendedClipboardNotify(this._sock, []);
+                    }
+                }
+
+            } else if (actions === extendedClipboardActionNotify) {
+                if (this._viewOnly) {
+                    return true;
+                }
+
+                if (this._clipboardServerCapabilitiesActions[extendedClipboardActionRequest]) {
+
+                    if (formats & extendedClipboardFormatText) {
+                        RFB.messages.extendedClipboardRequest(this._sock, [extendedClipboardFormatText]);
+                    }
+                }
+
+            } else if (actions === extendedClipboardActionProvide) {
+                if (this._viewOnly) {
+                    return true;
+                }
+
+                if (!(formats & extendedClipboardFormatText)) {
+                    return true;
+                }
+                // Ignore what we had in our clipboard client side.
+                this._clipboardText = null;
+
+                // FIXME: Should probably verify that this data was actually requested
+                let zlibStream = this._sock.rQshiftBytes(length - 4);
+                let streamInflator = new Inflator();
+                let textData = null;
+
+                streamInflator.setInput(zlibStream);
+                for (let i = 0; i <= 15; i++) {
+                    let format = 1 << i;
+
+                    if (formats & format) {
+
+                        let size = 0x00;
+                        let sizeArray = streamInflator.inflate(4);
+
+                        size |= (sizeArray[0] << 24);
+                        size |= (sizeArray[1] << 16);
+                        size |= (sizeArray[2] << 8);
+                        size |= (sizeArray[3]);
+                        let chunk = streamInflator.inflate(size);
+
+                        if (format === extendedClipboardFormatText) {
+                            textData = chunk;
+                        }
+                    }
+                }
+                streamInflator.setInput(null);
+
+                if (textData !== null) {
+                    let tmpText = "";
+                    for (let i = 0; i < textData.length; i++) {
+                        tmpText += String.fromCharCode(textData[i]);
+                    }
+                    textData = tmpText;
+
+                    textData = decodeUTF8(textData);
+                    if ((textData.length > 0) && "\0" === textData.charAt(textData.length - 1)) {
+                        textData = textData.slice(0, -1);
+                    }
+
+                    textData = textData.replace("\r\n", "\n");
+
+                    this.dispatchEvent(new CustomEvent(
+                        "clipboard",
+                        { detail: { text: textData } }));
+                }
+            } else {
+                return this._fail("Unexpected action in extended clipboard message: " + actions);
+            }
+        }
+        return true;
+    }
+
+    _handleServerFenceMsg() {
+        if (this._sock.rQwait("ServerFence header", 8, 1)) { return false; }
+        this._sock.rQskipBytes(3); // Padding
+        let flags = this._sock.rQshift32();
+        let length = this._sock.rQshift8();
+
+        if (this._sock.rQwait("ServerFence payload", length, 9)) { return false; }
+
+        if (length > 64) {
+            Log.Warn("Bad payload length (" + length + ") in fence response");
+            length = 64;
+        }
+
+        const payload = this._sock.rQshiftStr(length);
+
+        this._supportsFence = true;
+
+        /*
+         * Fence flags
+         *
+         *  (1<<0)  - BlockBefore
+         *  (1<<1)  - BlockAfter
+         *  (1<<2)  - SyncNext
+         *  (1<<31) - Request
+         */
+
+        if (!(flags & (1<<31))) {
+            return this._fail("Unexpected fence response");
+        }
+
+        // Filter out unsupported flags
+        // FIXME: support syncNext
+        flags &= (1<<0) | (1<<1);
+
+        // BlockBefore and BlockAfter are automatically handled by
+        // the fact that we process each incoming message
+        // synchronuosly.
+        RFB.messages.clientFence(this._sock, flags, payload);
+
+        return true;
+    }
+
+    _handleXvpMsg() {
+        if (this._sock.rQwait("XVP version and message", 3, 1)) { return false; }
+        this._sock.rQskipBytes(1);  // Padding
+        const xvpVer = this._sock.rQshift8();
+        const xvpMsg = this._sock.rQshift8();
+
+        switch (xvpMsg) {
+            case 0:  // XVP_FAIL
+                Log.Error("XVP Operation Failed");
+                break;
+            case 1:  // XVP_INIT
+                this._rfbXvpVer = xvpVer;
+                Log.Info("XVP extensions enabled (version " + this._rfbXvpVer + ")");
+                this._setCapability("power", true);
+                break;
+            default:
+                this._fail("Illegal server XVP message (msg: " + xvpMsg + ")");
+                break;
+        }
+
+        return true;
+    }
+
+    _normalMsg() {
+        let msgType;
+        if (this._FBU.rects > 0) {
+            msgType = 0;
+        } else {
+            msgType = this._sock.rQshift8();
+        }
+
+        let first, ret;
+        switch (msgType) {
+            case 0:  // FramebufferUpdate
+                ret = this._framebufferUpdate();
+                if (ret && !this._enabledContinuousUpdates) {
+                    RFB.messages.fbUpdateRequest(this._sock, true, 0, 0,
+                                                 this._fbWidth, this._fbHeight);
+                }
+                return ret;
+
+            case 1:  // SetColorMapEntries
+                return this._handleSetColourMapMsg();
+
+            case 2:  // Bell
+                Log.Debug("Bell");
+                this.dispatchEvent(new CustomEvent(
+                    "bell",
+                    { detail: {} }));
+                return true;
+
+            case 3:  // ServerCutText
+                return this._handleServerCutText();
+
+            case 150: // EndOfContinuousUpdates
+                first = !this._supportsContinuousUpdates;
+                this._supportsContinuousUpdates = true;
+                this._enabledContinuousUpdates = false;
+                if (first) {
+                    this._enabledContinuousUpdates = true;
+                    this._updateContinuousUpdates();
+                    Log.Info("Enabling continuous updates.");
+                } else {
+                    // FIXME: We need to send a framebufferupdaterequest here
+                    // if we add support for turning off continuous updates
+                }
+                return true;
+
+            case 248: // ServerFence
+                return this._handleServerFenceMsg();
+
+            case 250:  // XVP
+                return this._handleXvpMsg();
+
+            default:
+                this._fail("Unexpected server message (type " + msgType + ")");
+                Log.Debug("sock.rQslice(0, 30): " + this._sock.rQslice(0, 30));
+                return true;
+        }
+    }
+
+    _onFlush() {
+        this._flushing = false;
+        // Resume processing
+        if (this._sock.rQlen > 0) {
+            this._handleMessage();
+        }
+    }
+
+    _framebufferUpdate() {
+        if (this._FBU.rects === 0) {
+            if (this._sock.rQwait("FBU header", 3, 1)) { return false; }
+            this._sock.rQskipBytes(1);  // Padding
+            this._FBU.rects = this._sock.rQshift16();
+
+            // Make sure the previous frame is fully rendered first
+            // to avoid building up an excessive queue
+            if (this._display.pending()) {
+                this._flushing = true;
+                this._display.flush();
+                return false;
+            }
+        }
+
+        while (this._FBU.rects > 0) {
+            if (this._FBU.encoding === null) {
+                if (this._sock.rQwait("rect header", 12)) { return false; }
+                /* New FramebufferUpdate */
+
+                const hdr = this._sock.rQshiftBytes(12);
+                this._FBU.x        = (hdr[0] << 8) + hdr[1];
+                this._FBU.y        = (hdr[2] << 8) + hdr[3];
+                this._FBU.width    = (hdr[4] << 8) + hdr[5];
+                this._FBU.height   = (hdr[6] << 8) + hdr[7];
+                this._FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) +
+                                              (hdr[10] << 8) + hdr[11], 10);
+            }
+
+            if (!this._handleRect()) {
+                return false;
+            }
+
+            this._FBU.rects--;
+            this._FBU.encoding = null;
+        }
+
+        this._display.flip();
+
+        return true;  // We finished this FBU
+    }
+
+    _handleRect() {
+        switch (this._FBU.encoding) {
+            case encodings.pseudoEncodingLastRect:
+                this._FBU.rects = 1; // Will be decreased when we return
+                return true;
+
+            case encodings.pseudoEncodingVMwareCursor:
+                return this._handleVMwareCursor();
+
+            case encodings.pseudoEncodingCursor:
+                return this._handleCursor();
+
+            case encodings.pseudoEncodingQEMUExtendedKeyEvent:
+                // Old Safari doesn't support creating keyboard events
+                try {
+                    const keyboardEvent = document.createEvent("keyboardEvent");
+                    if (keyboardEvent.code !== undefined) {
+                        this._qemuExtKeyEventSupported = true;
+                    }
+                } catch (err) {
+                    // Do nothing
+                }
+                return true;
+
+            case encodings.pseudoEncodingDesktopName:
+                return this._handleDesktopName();
+
+            case encodings.pseudoEncodingDesktopSize:
+                this._resize(this._FBU.width, this._FBU.height);
+                return true;
+
+            case encodings.pseudoEncodingExtendedDesktopSize:
+                return this._handleExtendedDesktopSize();
+
+            default:
+                return this._handleDataRect();
+        }
+    }
+
+    _handleVMwareCursor() {
+        const hotx = this._FBU.x;  // hotspot-x
+        const hoty = this._FBU.y;  // hotspot-y
+        const w = this._FBU.width;
+        const h = this._FBU.height;
+        if (this._sock.rQwait("VMware cursor encoding", 1)) {
+            return false;
+        }
+
+        const cursorType = this._sock.rQshift8();
+
+        this._sock.rQshift8(); //Padding
+
+        let rgba;
+        const bytesPerPixel = 4;
+
+        //Classic cursor
+        if (cursorType == 0) {
+            //Used to filter away unimportant bits.
+            //OR is used for correct conversion in js.
+            const PIXEL_MASK = 0xffffff00 | 0;
+            rgba = new Array(w * h * bytesPerPixel);
+
+            if (this._sock.rQwait("VMware cursor classic encoding",
+                                  (w * h * bytesPerPixel) * 2, 2)) {
+                return false;
+            }
+
+            let andMask = new Array(w * h);
+            for (let pixel = 0; pixel < (w * h); pixel++) {
+                andMask[pixel] = this._sock.rQshift32();
+            }
+
+            let xorMask = new Array(w * h);
+            for (let pixel = 0; pixel < (w * h); pixel++) {
+                xorMask[pixel] = this._sock.rQshift32();
+            }
+
+            for (let pixel = 0; pixel < (w * h); pixel++) {
+                if (andMask[pixel] == 0) {
+                    //Fully opaque pixel
+                    let bgr = xorMask[pixel];
+                    let r   = bgr >> 8  & 0xff;
+                    let g   = bgr >> 16 & 0xff;
+                    let b   = bgr >> 24 & 0xff;
+
+                    rgba[(pixel * bytesPerPixel)     ] = r;    //r
+                    rgba[(pixel * bytesPerPixel) + 1 ] = g;    //g
+                    rgba[(pixel * bytesPerPixel) + 2 ] = b;    //b
+                    rgba[(pixel * bytesPerPixel) + 3 ] = 0xff; //a
+
+                } else if ((andMask[pixel] & PIXEL_MASK) ==
+                           PIXEL_MASK) {
+                    //Only screen value matters, no mouse colouring
+                    if (xorMask[pixel] == 0) {
+                        //Transparent pixel
+                        rgba[(pixel * bytesPerPixel)     ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 1 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 2 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 3 ] = 0x00;
+
+                    } else if ((xorMask[pixel] & PIXEL_MASK) ==
+                               PIXEL_MASK) {
+                        //Inverted pixel, not supported in browsers.
+                        //Fully opaque instead.
+                        rgba[(pixel * bytesPerPixel)     ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 1 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 2 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 3 ] = 0xff;
+
+                    } else {
+                        //Unhandled xorMask
+                        rgba[(pixel * bytesPerPixel)     ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 1 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 2 ] = 0x00;
+                        rgba[(pixel * bytesPerPixel) + 3 ] = 0xff;
+                    }
+
+                } else {
+                    //Unhandled andMask
+                    rgba[(pixel * bytesPerPixel)     ] = 0x00;
+                    rgba[(pixel * bytesPerPixel) + 1 ] = 0x00;
+                    rgba[(pixel * bytesPerPixel) + 2 ] = 0x00;
+                    rgba[(pixel * bytesPerPixel) + 3 ] = 0xff;
+                }
+            }
+
+        //Alpha cursor.
+        } else if (cursorType == 1) {
+            if (this._sock.rQwait("VMware cursor alpha encoding",
+                                  (w * h * 4), 2)) {
+                return false;
+            }
+
+            rgba = new Array(w * h * bytesPerPixel);
+
+            for (let pixel = 0; pixel < (w * h); pixel++) {
+                let data = this._sock.rQshift32();
+
+                rgba[(pixel * 4)     ] = data >> 24 & 0xff; //r
+                rgba[(pixel * 4) + 1 ] = data >> 16 & 0xff; //g
+                rgba[(pixel * 4) + 2 ] = data >> 8 & 0xff;  //b
+                rgba[(pixel * 4) + 3 ] = data & 0xff;       //a
+            }
+
+        } else {
+            Log.Warn("The given cursor type is not supported: "
+                      + cursorType + " given.");
+            return false;
+        }
+
+        this._updateCursor(rgba, hotx, hoty, w, h);
+
+        return true;
+    }
+
+    _handleCursor() {
+        const hotx = this._FBU.x;  // hotspot-x
+        const hoty = this._FBU.y;  // hotspot-y
+        const w = this._FBU.width;
+        const h = this._FBU.height;
+
+        const pixelslength = w * h * 4;
+        const masklength = Math.ceil(w / 8) * h;
+
+        let bytes = pixelslength + masklength;
+        if (this._sock.rQwait("cursor encoding", bytes)) {
+            return false;
+        }
+
+        // Decode from BGRX pixels + bit mask to RGBA
+        const pixels = this._sock.rQshiftBytes(pixelslength);
+        const mask = this._sock.rQshiftBytes(masklength);
+        let rgba = new Uint8Array(w * h * 4);
+
+        let pixIdx = 0;
+        for (let y = 0; y < h; y++) {
+            for (let x = 0; x < w; x++) {
+                let maskIdx = y * Math.ceil(w / 8) + Math.floor(x / 8);
+                let alpha = (mask[maskIdx] << (x % 8)) & 0x80 ? 255 : 0;
+                rgba[pixIdx    ] = pixels[pixIdx + 2];
+                rgba[pixIdx + 1] = pixels[pixIdx + 1];
+                rgba[pixIdx + 2] = pixels[pixIdx];
+                rgba[pixIdx + 3] = alpha;
+                pixIdx += 4;
+            }
+        }
+
+        this._updateCursor(rgba, hotx, hoty, w, h);
+
+        return true;
+    }
+
+    _handleDesktopName() {
+        if (this._sock.rQwait("DesktopName", 4)) {
+            return false;
+        }
+
+        let length = this._sock.rQshift32();
+
+        if (this._sock.rQwait("DesktopName", length, 4)) {
+            return false;
+        }
+
+        let name = this._sock.rQshiftStr(length);
+        name = decodeUTF8(name, true);
+
+        this._setDesktopName(name);
+
+        return true;
+    }
+
+    _handleExtendedDesktopSize() {
+        if (this._sock.rQwait("ExtendedDesktopSize", 4)) {
+            return false;
+        }
+
+        const numberOfScreens = this._sock.rQpeek8();
+
+        let bytes = 4 + (numberOfScreens * 16);
+        if (this._sock.rQwait("ExtendedDesktopSize", bytes)) {
+            return false;
+        }
+
+        const firstUpdate = !this._supportsSetDesktopSize;
+        this._supportsSetDesktopSize = true;
+
+        // Normally we only apply the current resize mode after a
+        // window resize event. However there is no such trigger on the
+        // initial connect. And we don't know if the server supports
+        // resizing until we've gotten here.
+        if (firstUpdate) {
+            this._requestRemoteResize();
+        }
+
+        this._sock.rQskipBytes(1);  // number-of-screens
+        this._sock.rQskipBytes(3);  // padding
+
+        for (let i = 0; i < numberOfScreens; i += 1) {
+            // Save the id and flags of the first screen
+            if (i === 0) {
+                this._screenID = this._sock.rQshiftBytes(4);    // id
+                this._sock.rQskipBytes(2);                       // x-position
+                this._sock.rQskipBytes(2);                       // y-position
+                this._sock.rQskipBytes(2);                       // width
+                this._sock.rQskipBytes(2);                       // height
+                this._screenFlags = this._sock.rQshiftBytes(4); // flags
+            } else {
+                this._sock.rQskipBytes(16);
+            }
+        }
+
+        /*
+         * The x-position indicates the reason for the change:
+         *
+         *  0 - server resized on its own
+         *  1 - this client requested the resize
+         *  2 - another client requested the resize
+         */
+
+        // We need to handle errors when we requested the resize.
+        if (this._FBU.x === 1 && this._FBU.y !== 0) {
+            let msg = "";
+            // The y-position indicates the status code from the server
+            switch (this._FBU.y) {
+                case 1:
+                    msg = "Resize is administratively prohibited";
+                    break;
+                case 2:
+                    msg = "Out of resources";
+                    break;
+                case 3:
+                    msg = "Invalid screen layout";
+                    break;
+                default:
+                    msg = "Unknown reason";
+                    break;
+            }
+            Log.Warn("Server did not accept the resize request: "
+                     + msg);
+        } else {
+            this._resize(this._FBU.width, this._FBU.height);
+        }
+
+        return true;
+    }
+
+    _handleDataRect() {
+        let decoder = this._decoders[this._FBU.encoding];
+        if (!decoder) {
+            this._fail("Unsupported encoding (encoding: " +
+                       this._FBU.encoding + ")");
+            return false;
+        }
+
+        try {
+            return decoder.decodeRect(this._FBU.x, this._FBU.y,
+                                      this._FBU.width, this._FBU.height,
+                                      this._sock, this._display,
+                                      this._fbDepth);
+        } catch (err) {
+            this._fail("Error decoding rect: " + err);
+            return false;
+        }
+    }
+
+    _updateContinuousUpdates() {
+        if (!this._enabledContinuousUpdates) { return; }
+
+        RFB.messages.enableContinuousUpdates(this._sock, true, 0, 0,
+                                             this._fbWidth, this._fbHeight);
+    }
+
+    _resize(width, height) {
+        this._fbWidth = width;
+        this._fbHeight = height;
+
+        this._display.resize(this._fbWidth, this._fbHeight);
+
+        // Adjust the visible viewport based on the new dimensions
+        this._updateClip();
+        this._updateScale();
+
+        this._updateContinuousUpdates();
+    }
+
+    _xvpOp(ver, op) {
+        if (this._rfbXvpVer < ver) { return; }
+        Log.Info("Sending XVP operation " + op + " (version " + ver + ")");
+        RFB.messages.xvpOp(this._sock, ver, op);
+    }
+
+    _updateCursor(rgba, hotx, hoty, w, h) {
+        this._cursorImage = {
+            rgbaPixels: rgba,
+            hotx: hotx, hoty: hoty, w: w, h: h,
+        };
+        this._refreshCursor();
+    }
+
+    _shouldShowDotCursor() {
+        // Called when this._cursorImage is updated
+        if (!this._showDotCursor) {
+            // User does not want to see the dot, so...
+            return false;
+        }
+
+        // The dot should not be shown if the cursor is already visible,
+        // i.e. contains at least one not-fully-transparent pixel.
+        // So iterate through all alpha bytes in rgba and stop at the
+        // first non-zero.
+        for (let i = 3; i < this._cursorImage.rgbaPixels.length; i += 4) {
+            if (this._cursorImage.rgbaPixels[i]) {
+                return false;
+            }
+        }
+
+        // At this point, we know that the cursor is fully transparent, and
+        // the user wants to see the dot instead of this.
+        return true;
+    }
+
+    _refreshCursor() {
+        if (this._rfbConnectionState !== "connecting" &&
+            this._rfbConnectionState !== "connected") {
+            return;
+        }
+        const image = this._shouldShowDotCursor() ? RFB.cursors.dot : this._cursorImage;
+        this._cursor.change(image.rgbaPixels,
+                            image.hotx, image.hoty,
+                            image.w, image.h
+        );
+    }
+
+    static genDES(password, challenge) {
+        const passwordChars = password.split('').map(c => c.charCodeAt(0));
+        return (new DES(passwordChars)).encrypt(challenge);
+    }
+}
+
+// Class Methods
+RFB.messages = {
+    keyEvent(sock, keysym, down) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 4;  // msg-type
+        buff[offset + 1] = down;
+
+        buff[offset + 2] = 0;
+        buff[offset + 3] = 0;
+
+        buff[offset + 4] = (keysym >> 24);
+        buff[offset + 5] = (keysym >> 16);
+        buff[offset + 6] = (keysym >> 8);
+        buff[offset + 7] = keysym;
+
+        sock._sQlen += 8;
+        sock.flush();
+    },
+
+    QEMUExtendedKeyEvent(sock, keysym, down, keycode) {
+        function getRFBkeycode(xtScanCode) {
+            const upperByte = (keycode >> 8);
+            const lowerByte = (keycode & 0x00ff);
+            if (upperByte === 0xe0 && lowerByte < 0x7f) {
+                return lowerByte | 0x80;
+            }
+            return xtScanCode;
+        }
+
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 255; // msg-type
+        buff[offset + 1] = 0; // sub msg-type
+
+        buff[offset + 2] = (down >> 8);
+        buff[offset + 3] = down;
+
+        buff[offset + 4] = (keysym >> 24);
+        buff[offset + 5] = (keysym >> 16);
+        buff[offset + 6] = (keysym >> 8);
+        buff[offset + 7] = keysym;
+
+        const RFBkeycode = getRFBkeycode(keycode);
+
+        buff[offset + 8] = (RFBkeycode >> 24);
+        buff[offset + 9] = (RFBkeycode >> 16);
+        buff[offset + 10] = (RFBkeycode >> 8);
+        buff[offset + 11] = RFBkeycode;
+
+        sock._sQlen += 12;
+        sock.flush();
+    },
+
+    pointerEvent(sock, x, y, mask) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 5; // msg-type
+
+        buff[offset + 1] = mask;
+
+        buff[offset + 2] = x >> 8;
+        buff[offset + 3] = x;
+
+        buff[offset + 4] = y >> 8;
+        buff[offset + 5] = y;
+
+        sock._sQlen += 6;
+        sock.flush();
+    },
+
+    // Used to build Notify and Request data.
+    _buildExtendedClipboardFlags(actions, formats) {
+        let data = new Uint8Array(4);
+        let formatFlag = 0x00000000;
+        let actionFlag = 0x00000000;
+
+        for (let i = 0; i < actions.length; i++) {
+            actionFlag |= actions[i];
+        }
+
+        for (let i = 0; i < formats.length; i++) {
+            formatFlag |= formats[i];
+        }
+
+        data[0] = actionFlag >> 24; // Actions
+        data[1] = 0x00;             // Reserved
+        data[2] = 0x00;             // Reserved
+        data[3] = formatFlag;       // Formats
+
+        return data;
+    },
+
+    extendedClipboardProvide(sock, formats, inData) {
+        // Deflate incomming data and their sizes
+        let deflator = new Deflator();
+        let dataToDeflate = [];
+
+        for (let i = 0; i < formats.length; i++) {
+            // We only support the format Text at this time
+            if (formats[i] != extendedClipboardFormatText) {
+                throw new Error("Unsupported extended clipboard format for Provide message.");
+            }
+
+            // Change lone \r or \n into \r\n as defined in rfbproto
+            inData[i] = inData[i].replace(/\r\n|\r|\n/gm, "\r\n");
+
+            // Check if it already has \0
+            let text = encodeUTF8(inData[i] + "\0");
+
+            dataToDeflate.push( (text.length >> 24) & 0xFF,
+                                (text.length >> 16) & 0xFF,
+                                (text.length >>  8) & 0xFF,
+                                (text.length & 0xFF));
+
+            for (let j = 0; j < text.length; j++) {
+                dataToDeflate.push(text.charCodeAt(j));
+            }
+        }
+
+        let deflatedData = deflator.deflate(new Uint8Array(dataToDeflate));
+
+        // Build data  to send
+        let data = new Uint8Array(4 + deflatedData.length);
+        data.set(RFB.messages._buildExtendedClipboardFlags([extendedClipboardActionProvide],
+                                                           formats));
+        data.set(deflatedData, 4);
+
+        RFB.messages.clientCutText(sock, data, true);
+    },
+
+    extendedClipboardNotify(sock, formats) {
+        let flags = RFB.messages._buildExtendedClipboardFlags([extendedClipboardActionNotify],
+                                                              formats);
+        RFB.messages.clientCutText(sock, flags, true);
+    },
+
+    extendedClipboardRequest(sock, formats) {
+        let flags = RFB.messages._buildExtendedClipboardFlags([extendedClipboardActionRequest],
+                                                              formats);
+        RFB.messages.clientCutText(sock, flags, true);
+    },
+
+    extendedClipboardCaps(sock, actions, formats) {
+        let formatKeys = Object.keys(formats);
+        let data  = new Uint8Array(4 + (4 * formatKeys.length));
+
+        formatKeys.map(x => parseInt(x));
+        formatKeys.sort((a, b) =>  a - b);
+
+        data.set(RFB.messages._buildExtendedClipboardFlags(actions, []));
+
+        let loopOffset = 4;
+        for (let i = 0; i < formatKeys.length; i++) {
+            data[loopOffset]     = formats[formatKeys[i]] >> 24;
+            data[loopOffset + 1] = formats[formatKeys[i]] >> 16;
+            data[loopOffset + 2] = formats[formatKeys[i]] >> 8;
+            data[loopOffset + 3] = formats[formatKeys[i]] >> 0;
+
+            loopOffset += 4;
+            data[3] |= (1 << formatKeys[i]); // Update our format flags
+        }
+
+        RFB.messages.clientCutText(sock, data, true);
+    },
+
+    clientCutText(sock, data, extended = false) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 6; // msg-type
+
+        buff[offset + 1] = 0; // padding
+        buff[offset + 2] = 0; // padding
+        buff[offset + 3] = 0; // padding
+
+        let length;
+        if (extended) {
+            length = toUnsigned32bit(-data.length);
+        } else {
+            length = data.length;
+        }
+
+        buff[offset + 4] = length >> 24;
+        buff[offset + 5] = length >> 16;
+        buff[offset + 6] = length >> 8;
+        buff[offset + 7] = length;
+
+        sock._sQlen += 8;
+
+        // We have to keep track of from where in the data we begin creating the
+        // buffer for the flush in the next iteration.
+        let dataOffset = 0;
+
+        let remaining = data.length;
+        while (remaining > 0) {
+
+            let flushSize = Math.min(remaining, (sock._sQbufferSize - sock._sQlen));
+            for (let i = 0; i < flushSize; i++) {
+                buff[sock._sQlen + i] = data[dataOffset + i];
+            }
+
+            sock._sQlen += flushSize;
+            sock.flush();
+
+            remaining -= flushSize;
+            dataOffset += flushSize;
+        }
+
+    },
+
+    setDesktopSize(sock, width, height, id, flags) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 251;              // msg-type
+        buff[offset + 1] = 0;            // padding
+        buff[offset + 2] = width >> 8;   // width
+        buff[offset + 3] = width;
+        buff[offset + 4] = height >> 8;  // height
+        buff[offset + 5] = height;
+
+        buff[offset + 6] = 1;            // number-of-screens
+        buff[offset + 7] = 0;            // padding
+
+        // screen array
+        buff[offset + 8] = id >> 24;     // id
+        buff[offset + 9] = id >> 16;
+        buff[offset + 10] = id >> 8;
+        buff[offset + 11] = id;
+        buff[offset + 12] = 0;           // x-position
+        buff[offset + 13] = 0;
+        buff[offset + 14] = 0;           // y-position
+        buff[offset + 15] = 0;
+        buff[offset + 16] = width >> 8;  // width
+        buff[offset + 17] = width;
+        buff[offset + 18] = height >> 8; // height
+        buff[offset + 19] = height;
+        buff[offset + 20] = flags >> 24; // flags
+        buff[offset + 21] = flags >> 16;
+        buff[offset + 22] = flags >> 8;
+        buff[offset + 23] = flags;
+
+        sock._sQlen += 24;
+        sock.flush();
+    },
+
+    clientFence(sock, flags, payload) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 248; // msg-type
+
+        buff[offset + 1] = 0; // padding
+        buff[offset + 2] = 0; // padding
+        buff[offset + 3] = 0; // padding
+
+        buff[offset + 4] = flags >> 24; // flags
+        buff[offset + 5] = flags >> 16;
+        buff[offset + 6] = flags >> 8;
+        buff[offset + 7] = flags;
+
+        const n = payload.length;
+
+        buff[offset + 8] = n; // length
+
+        for (let i = 0; i < n; i++) {
+            buff[offset + 9 + i] = payload.charCodeAt(i);
+        }
+
+        sock._sQlen += 9 + n;
+        sock.flush();
+    },
+
+    enableContinuousUpdates(sock, enable, x, y, width, height) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 150;             // msg-type
+        buff[offset + 1] = enable;      // enable-flag
+
+        buff[offset + 2] = x >> 8;      // x
+        buff[offset + 3] = x;
+        buff[offset + 4] = y >> 8;      // y
+        buff[offset + 5] = y;
+        buff[offset + 6] = width >> 8;  // width
+        buff[offset + 7] = width;
+        buff[offset + 8] = height >> 8; // height
+        buff[offset + 9] = height;
+
+        sock._sQlen += 10;
+        sock.flush();
+    },
+
+    pixelFormat(sock, depth, trueColor) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        let bpp;
+
+        if (depth > 16) {
+            bpp = 32;
+        } else if (depth > 8) {
+            bpp = 16;
+        } else {
+            bpp = 8;
+        }
+
+        const bits = Math.floor(depth/3);
+
+        buff[offset] = 0;  // msg-type
+
+        buff[offset + 1] = 0; // padding
+        buff[offset + 2] = 0; // padding
+        buff[offset + 3] = 0; // padding
+
+        buff[offset + 4] = bpp;                 // bits-per-pixel
+        buff[offset + 5] = depth;               // depth
+        buff[offset + 6] = 0;                   // little-endian
+        buff[offset + 7] = trueColor ? 1 : 0;  // true-color
+
+        buff[offset + 8] = 0;    // red-max
+        buff[offset + 9] = (1 << bits) - 1;  // red-max
+
+        buff[offset + 10] = 0;   // green-max
+        buff[offset + 11] = (1 << bits) - 1; // green-max
+
+        buff[offset + 12] = 0;   // blue-max
+        buff[offset + 13] = (1 << bits) - 1; // blue-max
+
+        buff[offset + 14] = bits * 0; // red-shift
+        buff[offset + 15] = bits * 1; // green-shift
+        buff[offset + 16] = bits * 2; // blue-shift
+
+        buff[offset + 17] = 0;   // padding
+        buff[offset + 18] = 0;   // padding
+        buff[offset + 19] = 0;   // padding
+
+        sock._sQlen += 20;
+        sock.flush();
+    },
+
+    clientEncodings(sock, encodings) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 2; // msg-type
+        buff[offset + 1] = 0; // padding
+
+        buff[offset + 2] = encodings.length >> 8;
+        buff[offset + 3] = encodings.length;
+
+        let j = offset + 4;
+        for (let i = 0; i < encodings.length; i++) {
+            const enc = encodings[i];
+            buff[j] = enc >> 24;
+            buff[j + 1] = enc >> 16;
+            buff[j + 2] = enc >> 8;
+            buff[j + 3] = enc;
+
+            j += 4;
+        }
+
+        sock._sQlen += j - offset;
+        sock.flush();
+    },
+
+    fbUpdateRequest(sock, incremental, x, y, w, h) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        if (typeof(x) === "undefined") { x = 0; }
+        if (typeof(y) === "undefined") { y = 0; }
+
+        buff[offset] = 3;  // msg-type
+        buff[offset + 1] = incremental ? 1 : 0;
+
+        buff[offset + 2] = (x >> 8) & 0xFF;
+        buff[offset + 3] = x & 0xFF;
+
+        buff[offset + 4] = (y >> 8) & 0xFF;
+        buff[offset + 5] = y & 0xFF;
+
+        buff[offset + 6] = (w >> 8) & 0xFF;
+        buff[offset + 7] = w & 0xFF;
+
+        buff[offset + 8] = (h >> 8) & 0xFF;
+        buff[offset + 9] = h & 0xFF;
+
+        sock._sQlen += 10;
+        sock.flush();
+    },
+
+    xvpOp(sock, ver, op) {
+        const buff = sock._sQ;
+        const offset = sock._sQlen;
+
+        buff[offset] = 250; // msg-type
+        buff[offset + 1] = 0; // padding
+
+        buff[offset + 2] = ver;
+        buff[offset + 3] = op;
+
+        sock._sQlen += 4;
+        sock.flush();
+    }
+};
+
+RFB.cursors = {
+    none: {
+        rgbaPixels: new Uint8Array(),
+        w: 0, h: 0,
+        hotx: 0, hoty: 0,
+    },
+
+    dot: {
+        /* eslint-disable indent */
+        rgbaPixels: new Uint8Array([
+            255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 255, 255,
+              0,   0,   0, 255,   0,   0,   0,   0,   0,   0,  0,  255,
+            255, 255, 255, 255,   0,   0,   0, 255, 255, 255, 255, 255,
+        ]),
+        /* eslint-enable indent */
+        w: 3, h: 3,
+        hotx: 1, hoty: 1,
+    }
+};
diff --git a/systemvm/agent/noVNC/core/util/browser.js b/systemvm/agent/noVNC/core/util/browser.js
new file mode 100644
index 0000000..1554801
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/browser.js
@@ -0,0 +1,120 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ *
+ * Browser feature support detection
+ */
+
+import * as Log from './logging.js';
+
+// Touch detection
+export let isTouchDevice = ('ontouchstart' in document.documentElement) ||
+                                 // requried for Chrome debugger
+                                 (document.ontouchstart !== undefined) ||
+                                 // required for MS Surface
+                                 (navigator.maxTouchPoints > 0) ||
+                                 (navigator.msMaxTouchPoints > 0);
+window.addEventListener('touchstart', function onFirstTouch() {
+    isTouchDevice = true;
+    window.removeEventListener('touchstart', onFirstTouch, false);
+}, false);
+
+
+// The goal is to find a certain physical width, the devicePixelRatio
+// brings us a bit closer but is not optimal.
+export let dragThreshold = 10 * (window.devicePixelRatio || 1);
+
+let _supportsCursorURIs = false;
+
+try {
+    const target = document.createElement('canvas');
+    target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default';
+
+    if (target.style.cursor.indexOf("url") === 0) {
+        Log.Info("Data URI scheme cursor supported");
+        _supportsCursorURIs = true;
+    } else {
+        Log.Warn("Data URI scheme cursor not supported");
+    }
+} catch (exc) {
+    Log.Error("Data URI scheme cursor test exception: " + exc);
+}
+
+export const supportsCursorURIs = _supportsCursorURIs;
+
+let _supportsImageMetadata = false;
+try {
+    new ImageData(new Uint8ClampedArray(4), 1, 1);
+    _supportsImageMetadata = true;
+} catch (ex) {
+    // ignore failure
+}
+export const supportsImageMetadata = _supportsImageMetadata;
+
+let _hasScrollbarGutter = true;
+try {
+    // Create invisible container
+    const container = document.createElement('div');
+    container.style.visibility = 'hidden';
+    container.style.overflow = 'scroll'; // forcing scrollbars
+    document.body.appendChild(container);
+
+    // Create a div and place it in the container
+    const child = document.createElement('div');
+    container.appendChild(child);
+
+    // Calculate the difference between the container's full width
+    // and the child's width - the difference is the scrollbars
+    const scrollbarWidth = (container.offsetWidth - child.offsetWidth);
+
+    // Clean up
+    container.parentNode.removeChild(container);
+
+    _hasScrollbarGutter = scrollbarWidth != 0;
+} catch (exc) {
+    Log.Error("Scrollbar test exception: " + exc);
+}
+export const hasScrollbarGutter = _hasScrollbarGutter;
+
+/*
+ * The functions for detection of platforms and browsers below are exported
+ * but the use of these should be minimized as much as possible.
+ *
+ * It's better to use feature detection than platform detection.
+ */
+
+export function isMac() {
+    return navigator && !!(/mac/i).exec(navigator.platform);
+}
+
+export function isWindows() {
+    return navigator && !!(/win/i).exec(navigator.platform);
+}
+
+export function isIOS() {
+    return navigator &&
+           (!!(/ipad/i).exec(navigator.platform) ||
+            !!(/iphone/i).exec(navigator.platform) ||
+            !!(/ipod/i).exec(navigator.platform));
+}
+
+export function isSafari() {
+    return navigator && (navigator.userAgent.indexOf('Safari') !== -1 &&
+                         navigator.userAgent.indexOf('Chrome') === -1);
+}
+
+export function isIE() {
+    return navigator && !!(/trident/i).exec(navigator.userAgent);
+}
+
+export function isEdge() {
+    return navigator && !!(/edge/i).exec(navigator.userAgent);
+}
+
+export function isFirefox() {
+    return navigator && !!(/firefox/i).exec(navigator.userAgent);
+}
+
diff --git a/systemvm/agent/noVNC/core/util/cursor.js b/systemvm/agent/noVNC/core/util/cursor.js
new file mode 100644
index 0000000..4db1dab
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/cursor.js
@@ -0,0 +1,253 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+import { supportsCursorURIs, isTouchDevice } from './browser.js';
+
+const useFallback = !supportsCursorURIs || isTouchDevice;
+
+export default class Cursor {
+    constructor() {
+        this._target = null;
+
+        this._canvas = document.createElement('canvas');
+
+        if (useFallback) {
+            this._canvas.style.position = 'fixed';
+            this._canvas.style.zIndex = '65535';
+            this._canvas.style.pointerEvents = 'none';
+            // Can't use "display" because of Firefox bug #1445997
+            this._canvas.style.visibility = 'hidden';
+        }
+
+        this._position = { x: 0, y: 0 };
+        this._hotSpot = { x: 0, y: 0 };
+
+        this._eventHandlers = {
+            'mouseover': this._handleMouseOver.bind(this),
+            'mouseleave': this._handleMouseLeave.bind(this),
+            'mousemove': this._handleMouseMove.bind(this),
+            'mouseup': this._handleMouseUp.bind(this),
+        };
+    }
+
+    attach(target) {
+        if (this._target) {
+            this.detach();
+        }
+
+        this._target = target;
+
+        if (useFallback) {
+            document.body.appendChild(this._canvas);
+
+            // FIXME: These don't fire properly except for mouse
+            ///       movement in IE. We want to also capture element
+            //        movement, size changes, visibility, etc.
+            const options = { capture: true, passive: true };
+            this._target.addEventListener('mouseover', this._eventHandlers.mouseover, options);
+            this._target.addEventListener('mouseleave', this._eventHandlers.mouseleave, options);
+            this._target.addEventListener('mousemove', this._eventHandlers.mousemove, options);
+            this._target.addEventListener('mouseup', this._eventHandlers.mouseup, options);
+        }
+
+        this.clear();
+    }
+
+    detach() {
+        if (!this._target) {
+            return;
+        }
+
+        if (useFallback) {
+            const options = { capture: true, passive: true };
+            this._target.removeEventListener('mouseover', this._eventHandlers.mouseover, options);
+            this._target.removeEventListener('mouseleave', this._eventHandlers.mouseleave, options);
+            this._target.removeEventListener('mousemove', this._eventHandlers.mousemove, options);
+            this._target.removeEventListener('mouseup', this._eventHandlers.mouseup, options);
+
+            document.body.removeChild(this._canvas);
+        }
+
+        this._target = null;
+    }
+
+    change(rgba, hotx, hoty, w, h) {
+        if ((w === 0) || (h === 0)) {
+            this.clear();
+            return;
+        }
+
+        this._position.x = this._position.x + this._hotSpot.x - hotx;
+        this._position.y = this._position.y + this._hotSpot.y - hoty;
+        this._hotSpot.x = hotx;
+        this._hotSpot.y = hoty;
+
+        let ctx = this._canvas.getContext('2d');
+
+        this._canvas.width = w;
+        this._canvas.height = h;
+
+        let img;
+        try {
+            // IE doesn't support this
+            img = new ImageData(new Uint8ClampedArray(rgba), w, h);
+        } catch (ex) {
+            img = ctx.createImageData(w, h);
+            img.data.set(new Uint8ClampedArray(rgba));
+        }
+        ctx.clearRect(0, 0, w, h);
+        ctx.putImageData(img, 0, 0);
+
+        if (useFallback) {
+            this._updatePosition();
+        } else {
+            let url = this._canvas.toDataURL();
+            this._target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default';
+        }
+    }
+
+    clear() {
+        this._target.style.cursor = 'none';
+        this._canvas.width = 0;
+        this._canvas.height = 0;
+        this._position.x = this._position.x + this._hotSpot.x;
+        this._position.y = this._position.y + this._hotSpot.y;
+        this._hotSpot.x = 0;
+        this._hotSpot.y = 0;
+    }
+
+    // Mouse events might be emulated, this allows
+    // moving the cursor in such cases
+    move(clientX, clientY) {
+        if (!useFallback) {
+            return;
+        }
+        // clientX/clientY are relative the _visual viewport_,
+        // but our position is relative the _layout viewport_,
+        // so try to compensate when we can
+        if (window.visualViewport) {
+            this._position.x = clientX + window.visualViewport.offsetLeft;
+            this._position.y = clientY + window.visualViewport.offsetTop;
+        } else {
+            this._position.x = clientX;
+            this._position.y = clientY;
+        }
+        this._updatePosition();
+        let target = document.elementFromPoint(clientX, clientY);
+        this._updateVisibility(target);
+    }
+
+    _handleMouseOver(event) {
+        // This event could be because we're entering the target, or
+        // moving around amongst its sub elements. Let the move handler
+        // sort things out.
+        this._handleMouseMove(event);
+    }
+
+    _handleMouseLeave(event) {
+        // Check if we should show the cursor on the element we are leaving to
+        this._updateVisibility(event.relatedTarget);
+    }
+
+    _handleMouseMove(event) {
+        this._updateVisibility(event.target);
+
+        this._position.x = event.clientX - this._hotSpot.x;
+        this._position.y = event.clientY - this._hotSpot.y;
+
+        this._updatePosition();
+    }
+
+    _handleMouseUp(event) {
+        // We might get this event because of a drag operation that
+        // moved outside of the target. Check what's under the cursor
+        // now and adjust visibility based on that.
+        let target = document.elementFromPoint(event.clientX, event.clientY);
+        this._updateVisibility(target);
+
+        // Captures end with a mouseup but we can't know the event order of
+        // mouseup vs releaseCapture.
+        //
+        // In the cases when releaseCapture comes first, the code above is
+        // enough.
+        //
+        // In the cases when the mouseup comes first, we need wait for the
+        // browser to flush all events and then check again if the cursor
+        // should be visible.
+        if (this._captureIsActive()) {
+            window.setTimeout(() => {
+                // We might have detached at this point
+                if (!this._target) {
+                    return;
+                }
+                // Refresh the target from elementFromPoint since queued events
+                // might have altered the DOM
+                target = document.elementFromPoint(event.clientX,
+                                                   event.clientY);
+                this._updateVisibility(target);
+            }, 0);
+        }
+    }
+
+    _showCursor() {
+        if (this._canvas.style.visibility === 'hidden') {
+            this._canvas.style.visibility = '';
+        }
+    }
+
+    _hideCursor() {
+        if (this._canvas.style.visibility !== 'hidden') {
+            this._canvas.style.visibility = 'hidden';
+        }
+    }
+
+    // Should we currently display the cursor?
+    // (i.e. are we over the target, or a child of the target without a
+    // different cursor set)
+    _shouldShowCursor(target) {
+        if (!target) {
+            return false;
+        }
+        // Easy case
+        if (target === this._target) {
+            return true;
+        }
+        // Other part of the DOM?
+        if (!this._target.contains(target)) {
+            return false;
+        }
+        // Has the child its own cursor?
+        // FIXME: How can we tell that a sub element has an
+        //        explicit "cursor: none;"?
+        if (window.getComputedStyle(target).cursor !== 'none') {
+            return false;
+        }
+        return true;
+    }
+
+    _updateVisibility(target) {
+        // When the cursor target has capture we want to show the cursor.
+        // So, if a capture is active - look at the captured element instead.
+        if (this._captureIsActive()) {
+            target = document.captureElement;
+        }
+        if (this._shouldShowCursor(target)) {
+            this._showCursor();
+        } else {
+            this._hideCursor();
+        }
+    }
+
+    _updatePosition() {
+        this._canvas.style.left = this._position.x + "px";
+        this._canvas.style.top = this._position.y + "px";
+    }
+
+    _captureIsActive() {
+        return document.captureElement &&
+            document.documentElement.contains(document.captureElement);
+    }
+}
diff --git a/systemvm/agent/noVNC/core/util/element.js b/systemvm/agent/noVNC/core/util/element.js
new file mode 100644
index 0000000..466a745
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/element.js
@@ -0,0 +1,32 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+/*
+ * HTML element utility functions
+ */
+
+export function clientToElement(x, y, elem) {
+    const bounds = elem.getBoundingClientRect();
+    let pos = { x: 0, y: 0 };
+    // Clip to target bounds
+    if (x < bounds.left) {
+        pos.x = 0;
+    } else if (x >= bounds.right) {
+        pos.x = bounds.width - 1;
+    } else {
+        pos.x = x - bounds.left;
+    }
+    if (y < bounds.top) {
+        pos.y = 0;
+    } else if (y >= bounds.bottom) {
+        pos.y = bounds.height - 1;
+    } else {
+        pos.y = y - bounds.top;
+    }
+    return pos;
+}
diff --git a/systemvm/agent/noVNC/core/util/events.js b/systemvm/agent/noVNC/core/util/events.js
new file mode 100644
index 0000000..39eefd4
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/events.js
@@ -0,0 +1,142 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2018 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+/*
+ * Cross-browser event and position routines
+ */
+
+export function getPointerEvent(e) {
+    return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e;
+}
+
+export function stopEvent(e) {
+    e.stopPropagation();
+    e.preventDefault();
+}
+
+// Emulate Element.setCapture() when not supported
+let _captureRecursion = false;
+let _elementForUnflushedEvents = null;
+document.captureElement = null;
+function _captureProxy(e) {
+    // Recursion protection as we'll see our own event
+    if (_captureRecursion) return;
+
+    // Clone the event as we cannot dispatch an already dispatched event
+    const newEv = new e.constructor(e.type, e);
+
+    _captureRecursion = true;
+    if (document.captureElement) {
+        document.captureElement.dispatchEvent(newEv);
+    } else {
+        _elementForUnflushedEvents.dispatchEvent(newEv);
+    }
+    _captureRecursion = false;
+
+    // Avoid double events
+    e.stopPropagation();
+
+    // Respect the wishes of the redirected event handlers
+    if (newEv.defaultPrevented) {
+        e.preventDefault();
+    }
+
+    // Implicitly release the capture on button release
+    if (e.type === "mouseup") {
+        releaseCapture();
+    }
+}
+
+// Follow cursor style of target element
+function _capturedElemChanged() {
+    const proxyElem = document.getElementById("noVNC_mouse_capture_elem");
+    proxyElem.style.cursor = window.getComputedStyle(document.captureElement).cursor;
+}
+
+const _captureObserver = new MutationObserver(_capturedElemChanged);
+
+export function setCapture(target) {
+    if (target.setCapture) {
+
+        target.setCapture();
+        document.captureElement = target;
+
+        // IE releases capture on 'click' events which might not trigger
+        target.addEventListener('mouseup', releaseCapture);
+
+    } else {
+        // Release any existing capture in case this method is
+        // called multiple times without coordination
+        releaseCapture();
+
+        let proxyElem = document.getElementById("noVNC_mouse_capture_elem");
+
+        if (proxyElem === null) {
+            proxyElem = document.createElement("div");
+            proxyElem.id = "noVNC_mouse_capture_elem";
+            proxyElem.style.position = "fixed";
+            proxyElem.style.top = "0px";
+            proxyElem.style.left = "0px";
+            proxyElem.style.width = "100%";
+            proxyElem.style.height = "100%";
+            proxyElem.style.zIndex = 10000;
+            proxyElem.style.display = "none";
+            document.body.appendChild(proxyElem);
+
+            // This is to make sure callers don't get confused by having
+            // our blocking element as the target
+            proxyElem.addEventListener('contextmenu', _captureProxy);
+
+            proxyElem.addEventListener('mousemove', _captureProxy);
+            proxyElem.addEventListener('mouseup', _captureProxy);
+        }
+
+        document.captureElement = target;
+
+        // Track cursor and get initial cursor
+        _captureObserver.observe(target, {attributes: true});
+        _capturedElemChanged();
+
+        proxyElem.style.display = "";
+
+        // We listen to events on window in order to keep tracking if it
+        // happens to leave the viewport
+        window.addEventListener('mousemove', _captureProxy);
+        window.addEventListener('mouseup', _captureProxy);
+    }
+}
+
+export function releaseCapture() {
+    if (document.releaseCapture) {
+
+        document.releaseCapture();
+        document.captureElement = null;
+
+    } else {
+        if (!document.captureElement) {
+            return;
+        }
+
+        // There might be events already queued. The event proxy needs
+        // access to the captured element for these queued events.
+        // E.g. contextmenu (right-click) in Microsoft Edge
+        //
+        // Before removing the capturedElem pointer we save it to a
+        // temporary variable that the unflushed events can use.
+        _elementForUnflushedEvents = document.captureElement;
+        document.captureElement = null;
+
+        _captureObserver.disconnect();
+
+        const proxyElem = document.getElementById("noVNC_mouse_capture_elem");
+        proxyElem.style.display = "none";
+
+        window.removeEventListener('mousemove', _captureProxy);
+        window.removeEventListener('mouseup', _captureProxy);
+    }
+}
diff --git a/systemvm/agent/noVNC/core/util/eventtarget.js b/systemvm/agent/noVNC/core/util/eventtarget.js
new file mode 100644
index 0000000..a21aa54
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/eventtarget.js
@@ -0,0 +1,35 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+export default class EventTargetMixin {
+    constructor() {
+        this._listeners = new Map();
+    }
+
+    addEventListener(type, callback) {
+        if (!this._listeners.has(type)) {
+            this._listeners.set(type, new Set());
+        }
+        this._listeners.get(type).add(callback);
+    }
+
+    removeEventListener(type, callback) {
+        if (this._listeners.has(type)) {
+            this._listeners.get(type).delete(callback);
+        }
+    }
+
+    dispatchEvent(event) {
+        if (!this._listeners.has(event.type)) {
+            return true;
+        }
+        this._listeners.get(event.type)
+            .forEach(callback => callback.call(this, event));
+        return !event.defaultPrevented;
+    }
+}
diff --git a/systemvm/agent/noVNC/core/util/int.js b/systemvm/agent/noVNC/core/util/int.js
new file mode 100644
index 0000000..001f40f
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/int.js
@@ -0,0 +1,15 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+export function toUnsigned32bit(toConvert) {
+    return toConvert >>> 0;
+}
+
+export function toSigned32bit(toConvert) {
+    return toConvert | 0;
+}
diff --git a/systemvm/agent/noVNC/core/util/logging.js b/systemvm/agent/noVNC/core/util/logging.js
new file mode 100644
index 0000000..fe449e9
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/logging.js
@@ -0,0 +1,56 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+/*
+ * Logging/debug routines
+ */
+
+let _logLevel = 'warn';
+
+let Debug = () => {};
+let Info = () => {};
+let Warn = () => {};
+let Error = () => {};
+
+export function initLogging(level) {
+    if (typeof level === 'undefined') {
+        level = _logLevel;
+    } else {
+        _logLevel = level;
+    }
+
+    Debug = Info = Warn = Error = () => {};
+
+    if (typeof window.console !== "undefined") {
+        /* eslint-disable no-console, no-fallthrough */
+        switch (level) {
+            case 'debug':
+                Debug = console.debug.bind(window.console);
+            case 'info':
+                Info  = console.info.bind(window.console);
+            case 'warn':
+                Warn  = console.warn.bind(window.console);
+            case 'error':
+                Error = console.error.bind(window.console);
+            case 'none':
+                break;
+            default:
+                throw new window.Error("invalid logging type '" + level + "'");
+        }
+        /* eslint-enable no-console, no-fallthrough */
+    }
+}
+
+export function getLogging() {
+    return _logLevel;
+}
+
+export { Debug, Info, Warn, Error };
+
+// Initialize logging level
+initLogging();
diff --git a/systemvm/agent/noVNC/core/util/polyfill.js b/systemvm/agent/noVNC/core/util/polyfill.js
new file mode 100644
index 0000000..0e458c8
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/polyfill.js
@@ -0,0 +1,61 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2020 The noVNC Authors
+ * Licensed under MPL 2.0 or any later version (see LICENSE.txt)
+ */
+
+/* Polyfills to provide new APIs in old browsers */
+
+/* Object.assign() (taken from MDN) */
+if (typeof Object.assign != 'function') {
+    // Must be writable: true, enumerable: false, configurable: true
+    Object.defineProperty(Object, "assign", {
+        value: function assign(target, varArgs) { // .length of function is 2
+            'use strict';
+            if (target == null) { // TypeError if undefined or null
+                throw new TypeError('Cannot convert undefined or null to object');
+            }
+
+            const to = Object(target);
+
+            for (let index = 1; index < arguments.length; index++) {
+                const nextSource = arguments[index];
+
+                if (nextSource != null) { // Skip over if undefined or null
+                    for (let nextKey in nextSource) {
+                        // Avoid bugs when hasOwnProperty is shadowed
+                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+                            to[nextKey] = nextSource[nextKey];
+                        }
+                    }
+                }
+            }
+            return to;
+        },
+        writable: true,
+        configurable: true
+    });
+}
+
+/* CustomEvent constructor (taken from MDN) */
+(() => {
+    function CustomEvent(event, params) {
+        params = params || { bubbles: false, cancelable: false, detail: undefined };
+        const evt = document.createEvent( 'CustomEvent' );
+        evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
+        return evt;
+    }
+
+    CustomEvent.prototype = window.Event.prototype;
+
+    if (typeof window.CustomEvent !== "function") {
+        window.CustomEvent = CustomEvent;
+    }
+})();
+
+/* Number.isInteger() (taken from MDN) */
+Number.isInteger = Number.isInteger || function isInteger(value) {
+    return typeof value === 'number' &&
+      isFinite(value) &&
+      Math.floor(value) === value;
+};
diff --git a/systemvm/agent/noVNC/core/util/strings.js b/systemvm/agent/noVNC/core/util/strings.js
new file mode 100644
index 0000000..3dd4b29
--- /dev/null
+++ b/systemvm/agent/noVNC/core/util/strings.js
@@ -0,0 +1,28 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+// Decode from UTF-8
+export function decodeUTF8(utf8string, allowLatin1=false) {
+    try {
+        return decodeURIComponent(escape(utf8string));
+    } catch (e) {
+        if (e instanceof URIError) {
+            if (allowLatin1) {
+                // If we allow Latin1 we can ignore any decoding fails
+                // and in these cases return the original string
+                return utf8string;
+            }
+        }
+        throw e;
+    }
+}
+
+// Encode to UTF-8
+export function encodeUTF8(DOMString) {
+    return unescape(encodeURIComponent(DOMString));
+}
diff --git a/systemvm/agent/noVNC/core/websock.js b/systemvm/agent/noVNC/core/websock.js
new file mode 100644
index 0000000..3156aed
--- /dev/null
+++ b/systemvm/agent/noVNC/core/websock.js
@@ -0,0 +1,294 @@
+/*
+ * Websock: high-performance binary WebSockets
+ * Copyright (C) 2019 The noVNC Authors
+ * Licensed under MPL 2.0 (see LICENSE.txt)
+ *
+ * Websock is similar to the standard WebSocket object but with extra
+ * buffer handling.
+ *
+ * Websock has built-in receive queue buffering; the message event
+ * does not contain actual data but is simply a notification that
+ * there is new data available. Several rQ* methods are available to
+ * read binary data off of the receive queue.
+ */
+
+import * as Log from './util/logging.js';
+
+// this has performance issues in some versions Chromium, and
+// doesn't gain a tremendous amount of performance increase in Firefox
+// at the moment.  It may be valuable to turn it on in the future.
+// Also copyWithin() for TypedArrays is not supported in IE 11 or
+// Safari 13 (at the moment we want to support Safari 11).
+const ENABLE_COPYWITHIN = false;
+const MAX_RQ_GROW_SIZE = 40 * 1024 * 1024;  // 40 MiB
+
+export default class Websock {
+    constructor() {
+        this._websocket = null;  // WebSocket object
+
+        this._rQi = 0;           // Receive queue index
+        this._rQlen = 0;         // Next write position in the receive queue
+        this._rQbufferSize = 1024 * 1024 * 4; // Receive queue buffer size (4 MiB)
+        // called in init: this._rQ = new Uint8Array(this._rQbufferSize);
+        this._rQ = null; // Receive queue
+
+        this._sQbufferSize = 1024 * 10;  // 10 KiB
+        // called in init: this._sQ = new Uint8Array(this._sQbufferSize);
+        this._sQlen = 0;
+        this._sQ = null;  // Send queue
+
+        this._eventHandlers = {
+            message: () => {},
+            open: () => {},
+            close: () => {},
+            error: () => {}
+        };
+    }
+
+    // Getters and Setters
+    get sQ() {
+        return this._sQ;
+    }
+
+    get rQ() {
+        return this._rQ;
+    }
+
+    get rQi() {
+        return this._rQi;
+    }
+
+    set rQi(val) {
+        this._rQi = val;
+    }
+
+    // Receive Queue
+    get rQlen() {
+        return this._rQlen - this._rQi;
+    }
+
+    rQpeek8() {
+        return this._rQ[this._rQi];
+    }
+
+    rQskipBytes(bytes) {
+        this._rQi += bytes;
+    }
+
+    rQshift8() {
+        return this._rQshift(1);
+    }
+
+    rQshift16() {
+        return this._rQshift(2);
+    }
+
+    rQshift32() {
+        return this._rQshift(4);
+    }
+
+    // TODO(directxman12): test performance with these vs a DataView
+    _rQshift(bytes) {
+        let res = 0;
+        for (let byte = bytes - 1; byte >= 0; byte--) {
+            res += this._rQ[this._rQi++] << (byte * 8);
+        }
+        return res;
+    }
+
+    rQshiftStr(len) {
+        if (typeof(len) === 'undefined') { len = this.rQlen; }
+        let str = "";
+        // Handle large arrays in steps to avoid long strings on the stack
+        for (let i = 0; i < len; i += 4096) {
+            let part = this.rQshiftBytes(Math.min(4096, len - i));
+            str += String.fromCharCode.apply(null, part);
+        }
+        return str;
+    }
+
+    rQshiftBytes(len) {
+        if (typeof(len) === 'undefined') { len = this.rQlen; }
+        this._rQi += len;
+        return new Uint8Array(this._rQ.buffer, this._rQi - len, len);
+    }
+
+    rQshiftTo(target, len) {
+        if (len === undefined) { len = this.rQlen; }
+        // TODO: make this just use set with views when using a ArrayBuffer to store the rQ
+        target.set(new Uint8Array(this._rQ.buffer, this._rQi, len));
+        this._rQi += len;
+    }
+
+    rQslice(start, end = this.rQlen) {
+        return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start);
+    }
+
+    // Check to see if we must wait for 'num' bytes (default to FBU.bytes)
+    // to be available in the receive queue. Return true if we need to
+    // wait (and possibly print a debug message), otherwise false.
+    rQwait(msg, num, goback) {
+        if (this.rQlen < num) {
+            if (goback) {
+                if (this._rQi < goback) {
+                    throw new Error("rQwait cannot backup " + goback + " bytes");
+                }
+                this._rQi -= goback;
+            }
+            return true; // true means need more data
+        }
+        return false;
+    }
+
+    // Send Queue
+
+    flush() {
+        if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) {
+            this._websocket.send(this._encodeMessage());
+            this._sQlen = 0;
+        }
+    }
+
+    send(arr) {
+        this._sQ.set(arr, this._sQlen);
+        this._sQlen += arr.length;
+        this.flush();
+    }
+
+    sendString(str) {
+        this.send(str.split('').map(chr => chr.charCodeAt(0)));
+    }
+
+    // Event Handlers
+    off(evt) {
+        this._eventHandlers[evt] = () => {};
+    }
+
+    on(evt, handler) {
+        this._eventHandlers[evt] = handler;
+    }
+
+    _allocateBuffers() {
+        this._rQ = new Uint8Array(this._rQbufferSize);
+        this._sQ = new Uint8Array(this._sQbufferSize);
+    }
+
+    init() {
+        this._allocateBuffers();
+        this._rQi = 0;
+        this._websocket = null;
+    }
+
+    open(uri, protocols) {
+        this.init();
+
+        this._websocket = new WebSocket(uri, protocols);
+        this._websocket.binaryType = 'arraybuffer';
+
+        this._websocket.onmessage = this._recvMessage.bind(this);
+        this._websocket.onopen = () => {
+            Log.Debug('>> WebSock.onopen');
+            if (this._websocket.protocol) {
+                Log.Info("Server choose sub-protocol: " + this._websocket.protocol);
+            }
+
+            this._eventHandlers.open();
+            Log.Debug("<< WebSock.onopen");
+        };
+        this._websocket.onclose = (e) => {
+            Log.Debug(">> WebSock.onclose");
+            this._eventHandlers.close(e);
+            Log.Debug("<< WebSock.onclose");
+        };
+        this._websocket.onerror = (e) => {
+            Log.Debug(">> WebSock.onerror: " + e);
+            this._eventHandlers.error(e);
+            Log.Debug("<< WebSock.onerror: " + e);
+        };
+    }
+
+    close() {
+        if (this._websocket) {
+            if ((this._websocket.readyState === WebSocket.OPEN) ||
+                    (this._websocket.readyState === WebSocket.CONNECTING)) {
+                Log.Info("Closing WebSocket connection");
+                this._websocket.close();
+            }
+
+            this._websocket.onmessage = () => {};
+        }
+    }
+
+    // private methods
+    _encodeMessage() {
+        // Put in a binary arraybuffer
+        // according to the spec, you can send ArrayBufferViews with the send method
+        return new Uint8Array(this._sQ.buffer, 0, this._sQlen);
+    }
+
+    // We want to move all the unread data to the start of the queue,
+    // e.g. compacting.
+    // The function also expands the receive que if needed, and for
+    // performance reasons we combine these two actions to avoid
+    // unneccessary copying.
+    _expandCompactRQ(minFit) {
+        // if we're using less than 1/8th of the buffer even with the incoming bytes, compact in place
+        // instead of resizing
+        const requiredBufferSize =  (this._rQlen - this._rQi + minFit) * 8;
+        const resizeNeeded = this._rQbufferSize < requiredBufferSize;
+
+        if (resizeNeeded) {
+            // Make sure we always *at least* double the buffer size, and have at least space for 8x
+            // the current amount of data
+            this._rQbufferSize = Math.max(this._rQbufferSize * 2, requiredBufferSize);
+        }
+
+        // we don't want to grow unboundedly
+        if (this._rQbufferSize > MAX_RQ_GROW_SIZE) {
+            this._rQbufferSize = MAX_RQ_GROW_SIZE;
+            if (this._rQbufferSize - this.rQlen < minFit) {
+                throw new Error("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit");
+            }
+        }
+
+        if (resizeNeeded) {
+            const oldRQbuffer = this._rQ.buffer;
+            this._rQ = new Uint8Array(this._rQbufferSize);
+            this._rQ.set(new Uint8Array(oldRQbuffer, this._rQi, this._rQlen - this._rQi));
+        } else {
+            if (ENABLE_COPYWITHIN) {
+                this._rQ.copyWithin(0, this._rQi, this._rQlen);
+            } else {
+                this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi, this._rQlen - this._rQi));
+            }
+        }
+
+        this._rQlen = this._rQlen - this._rQi;
+        this._rQi = 0;
+    }
+
+    // push arraybuffer values onto the end of the receive que
+    _DecodeMessage(data) {
+        const u8 = new Uint8Array(data);
+        if (u8.length > this._rQbufferSize - this._rQlen) {
+            this._expandCompactRQ(u8.length);
+        }
+        this._rQ.set(u8, this._rQlen);
+        this._rQlen += u8.length;
+    }
+
+    _recvMessage(e) {
+        this._DecodeMessage(e.data);
+        if (this.rQlen > 0) {
+            this._eventHandlers.message();
+            if (this._rQlen == this._rQi) {
+                // All data has now been processed, this means we
+                // can reset the receive queue.
+                this._rQlen = 0;
+                this._rQi = 0;
+            }
+        } else {
+            Log.Debug("Ignoring empty message");
+        }
+    }
+}
diff --git a/systemvm/agent/noVNC/package.json b/systemvm/agent/noVNC/package.json
new file mode 100644
index 0000000..8fc04e5
--- /dev/null
+++ b/systemvm/agent/noVNC/package.json
@@ -0,0 +1,87 @@
+{
+  "name": "@novnc/novnc",
+  "version": "1.2.0",
+  "description": "An HTML5 VNC client",
+  "browser": "lib/rfb",
+  "directories": {
+    "lib": "lib",
+    "doc": "docs",
+    "test": "tests"
+  },
+  "files": [
+    "lib",
+    "AUTHORS",
+    "VERSION",
+    "docs/API.md",
+    "docs/LIBRARY.md",
+    "docs/LICENSE*",
+    "core",
+    "vendor/pako"
+  ],
+  "scripts": {
+    "lint": "eslint app core po/po2js po/xgettext-html tests utils",
+    "test": "karma start karma.conf.js",
+    "prepublish": "node ./utils/use_require.js --as commonjs --clean"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/novnc/noVNC.git"
+  },
+  "author": "Joel Martin <github@martintribe.org> (https://github.com/kanaka)",
+  "contributors": [
+    "Solly Ross <sross@redhat.com> (https://github.com/directxman12)",
+    "Peter Åstrand <astrand@cendio.se> (https://github.com/astrand)",
+    "Samuel Mannehed <samuel@cendio.se> (https://github.com/samhed)",
+    "Pierre Ossman <ossman@cendio.se> (https://github.com/CendioOssman)"
+  ],
+  "license": "MPL-2.0",
+  "bugs": {
+    "url": "https://github.com/novnc/noVNC/issues"
+  },
+  "homepage": "https://github.com/novnc/noVNC",
+  "devDependencies": {
+    "@babel/core": "*",
+    "@babel/plugin-syntax-dynamic-import": "*",
+    "@babel/plugin-transform-modules-amd": "*",
+    "@babel/plugin-transform-modules-commonjs": "*",
+    "@babel/plugin-transform-modules-systemjs": "*",
+    "@babel/plugin-transform-modules-umd": "*",
+    "@babel/preset-env": "*",
+    "@babel/cli": "*",
+    "babel-plugin-import-redirect": "*",
+    "browserify": "*",
+    "babelify": "*",
+    "core-js": "*",
+    "chai": "*",
+    "commander": "*",
+    "es-module-loader": "*",
+    "eslint": "*",
+    "fs-extra": "*",
+    "jsdom": "*",
+    "karma": "*",
+    "karma-mocha": "*",
+    "karma-chrome-launcher": "*",
+    "@chiragrupani/karma-chromium-edge-launcher": "*",
+    "karma-firefox-launcher": "*",
+    "karma-ie-launcher": "*",
+    "karma-mocha-reporter": "*",
+    "karma-safari-launcher": "*",
+    "karma-script-launcher": "*",
+    "karma-sinon-chai": "*",
+    "mocha": "*",
+    "node-getopt": "*",
+    "po2json": "*",
+    "requirejs": "*",
+    "rollup": "*",
+    "rollup-plugin-node-resolve": "*",
+    "sinon": "*",
+    "sinon-chai": "*"
+  },
+  "dependencies": {},
+  "keywords": [
+    "vnc",
+    "rfb",
+    "novnc",
+    "websockify"
+  ]
+}
diff --git a/systemvm/agent/noVNC/vendor/browser-es-module-loader/README.md b/systemvm/agent/noVNC/vendor/browser-es-module-loader/README.md
new file mode 100644
index 0000000..a50cc37
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/browser-es-module-loader/README.md
@@ -0,0 +1,15 @@
+Custom Browser ES Module Loader
+===============================
+
+This is a module loader using babel and the ES Module Loader polyfill.
+It's based heavily on
+https://github.com/ModuleLoader/browser-es-module-loader, but uses
+WebWorkers to compile the modules in the background.
+
+To generate, run `npx rollup -c` in this directory, and then run
+`./genworker.js`.
+
+LICENSE
+-------
+
+MIT
diff --git a/systemvm/agent/noVNC/vendor/browser-es-module-loader/genworker.js b/systemvm/agent/noVNC/vendor/browser-es-module-loader/genworker.js
new file mode 100755
index 0000000..dbf5d2f
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/browser-es-module-loader/genworker.js
@@ -0,0 +1,13 @@
+#!/usr/bin/env node
+
+var fs = require("fs");
+var browserify = require("browserify");
+
+browserify("src/babel-worker.js")
+  .transform("babelify", {
+    presets: [ [ "@babel/preset-env", { targets: "ie >= 11" } ] ],
+    global: true,
+    ignore: [ "../../node_modules/core-js" ]
+  })
+  .bundle()
+  .pipe(fs.createWriteStream("dist/babel-worker.js"));
diff --git a/systemvm/agent/noVNC/vendor/browser-es-module-loader/rollup.config.js b/systemvm/agent/noVNC/vendor/browser-es-module-loader/rollup.config.js
new file mode 100644
index 0000000..33a4a24
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/browser-es-module-loader/rollup.config.js
@@ -0,0 +1,15 @@
+import nodeResolve from 'rollup-plugin-node-resolve';
+
+export default {
+  input: 'src/browser-es-module-loader.js',
+  output: {
+    file: 'dist/browser-es-module-loader.js',
+    format: 'umd',
+    name: 'BrowserESModuleLoader',
+    sourcemap: true,
+  },
+
+  plugins: [
+    nodeResolve(),
+  ],
+};
diff --git a/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/babel-worker.js b/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/babel-worker.js
new file mode 100644
index 0000000..19e23bf
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/babel-worker.js
@@ -0,0 +1,23 @@
+// Polyfills needed for Babel to function
+require("core-js");
+
+var babelTransform = require('@babel/core').transform;
+var babelTransformDynamicImport = require('@babel/plugin-syntax-dynamic-import');
+var babelTransformModulesSystemJS = require('@babel/plugin-transform-modules-systemjs');
+var babelPresetEnv = require('@babel/preset-env');
+
+self.onmessage = function (evt) {
+    // transform source with Babel
+    var output = babelTransform(evt.data.source, {
+      compact: false,
+      filename: evt.data.key + '!transpiled',
+      sourceFileName: evt.data.key,
+      moduleIds: false,
+      sourceMaps: 'inline',
+      babelrc: false,
+      plugins: [babelTransformDynamicImport, babelTransformModulesSystemJS],
+      presets: [ [ babelPresetEnv, { targets: 'ie >= 11' } ] ],
+    });
+
+    self.postMessage({key: evt.data.key, code: output.code, source: evt.data.source});
+};
diff --git a/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/browser-es-module-loader.js b/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/browser-es-module-loader.js
new file mode 100644
index 0000000..9e50b8b
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/browser-es-module-loader/src/browser-es-module-loader.js
@@ -0,0 +1,279 @@
+import RegisterLoader from 'es-module-loader/core/register-loader.js';
+
+import { baseURI, global, isBrowser } from 'es-module-loader/core/common.js';
+import { resolveIfNotPlain } from 'es-module-loader/core/resolve.js';
+
+var loader;
+
+// <script type="module"> support
+var anonSources = {};
+if (typeof document != 'undefined' && document.getElementsByTagName) {
+  var handleError = function(err) {
+    // dispatch an error event so that we can display in errors in browsers
+    // that don't yet support unhandledrejection
+    if (window.onunhandledrejection === undefined) {
+      try {
+        var evt = new Event('error');
+      } catch (_eventError) {
+        var evt = document.createEvent('Event');
+        evt.initEvent('error', true, true);
+      }
+      evt.message = err.message;
+      if (err.fileName) {
+        evt.filename = err.fileName;
+        evt.lineno = err.lineNumber;
+        evt.colno = err.columnNumber;
+      } else if (err.sourceURL) {
+        evt.filename = err.sourceURL;
+        evt.lineno = err.line;
+        evt.colno = err.column;
+      }
+      evt.error = err;
+      window.dispatchEvent(evt);
+    }
+
+    // throw so it still shows up in the console
+    throw err;
+  }
+
+  var ready = function() {
+    document.removeEventListener('DOMContentLoaded', ready, false );
+
+    var anonCnt = 0;
+
+    var scripts = document.getElementsByTagName('script');
+    for (var i = 0; i < scripts.length; i++) {
+      var script = scripts[i];
+      if (script.type == 'module' && !script.loaded) {
+        script.loaded = true;
+        if (script.src) {
+          loader.import(script.src).catch(handleError);
+        }
+        // anonymous modules supported via a custom naming scheme and registry
+        else {
+          var uri = './<anon' + ++anonCnt + '>.js';
+          if (script.id !== ""){
+            uri = "./" + script.id;
+          }
+
+          var anonName = resolveIfNotPlain(uri, baseURI);
+          anonSources[anonName] = script.innerHTML;
+          loader.import(anonName).catch(handleError);
+        }
+      }
+    }
+  }
+
+  // simple DOM ready
+  if (document.readyState !== 'loading')
+    setTimeout(ready);
+  else
+    document.addEventListener('DOMContentLoaded', ready, false);
+}
+
+function BrowserESModuleLoader(baseKey) {
+  if (baseKey)
+    this.baseKey = resolveIfNotPlain(baseKey, baseURI) || resolveIfNotPlain('./' + baseKey, baseURI);
+
+  RegisterLoader.call(this);
+
+  var loader = this;
+
+  // ensure System.register is available
+  global.System = global.System || {};
+  if (typeof global.System.register == 'function')
+    var prevRegister = global.System.register;
+  global.System.register = function() {
+    loader.register.apply(loader, arguments);
+    if (prevRegister)
+      prevRegister.apply(this, arguments);
+  };
+}
+BrowserESModuleLoader.prototype = Object.create(RegisterLoader.prototype);
+
+// normalize is never given a relative name like "./x", that part is already handled
+BrowserESModuleLoader.prototype[RegisterLoader.resolve] = function(key, parent) {
+  var resolved = RegisterLoader.prototype[RegisterLoader.resolve].call(this, key, parent || this.baseKey) || key;
+  if (!resolved)
+    throw new RangeError('ES module loader does not resolve plain module names, resolving "' + key + '" to ' + parent);
+
+  return resolved;
+};
+
+function xhrFetch(url, resolve, reject) {
+  var xhr = new XMLHttpRequest();
+  var load = function(source) {
+    resolve(xhr.responseText);
+  }
+  var error = function() {
+    reject(new Error('XHR error' + (xhr.status ? ' (' + xhr.status + (xhr.statusText ? ' ' + xhr.statusText  : '') + ')' : '') + ' loading ' + url));
+  }
+
+  xhr.onreadystatechange = function () {
+    if (xhr.readyState === 4) {
+      // in Chrome on file:/// URLs, status is 0
+      if (xhr.status == 0) {
+        if (xhr.responseText) {
+          load();
+        }
+        else {
+          // when responseText is empty, wait for load or error event
+          // to inform if it is a 404 or empty file
+          xhr.addEventListener('error', error);
+          xhr.addEventListener('load', load);
+        }
+      }
+      else if (xhr.status === 200) {
+        load();
+      }
+      else {
+        error();
+      }
+    }
+  };
+  xhr.open("GET", url, true);
+  xhr.send(null);
+}
+
+var WorkerPool = function (script, size) {
+  var current = document.currentScript;
+  // IE doesn't support currentScript
+  if (!current) {
+    // Find an entry with out basename
+    var scripts = document.getElementsByTagName('script');
+    for (var i = 0; i < scripts.length; i++) {
+      if (scripts[i].src.indexOf("browser-es-module-loader.js") !== -1) {
+        current = scripts[i];
+        break;
+      }
+    }
+    if (!current)
+      throw Error("Could not find own <script> element");
+  }
+  script = current.src.substr(0, current.src.lastIndexOf("/")) + "/" + script;
+  this._workers = new Array(size);
+  this._ind = 0;
+  this._size = size;
+  this._jobs = 0;
+  this.onmessage = undefined;
+  this._stopTimeout = undefined;
+  for (var i = 0; i < size; i++) {
+    var wrkr = new Worker(script);
+    wrkr._count = 0;
+    wrkr._ind = i;
+    wrkr.onmessage = this._onmessage.bind(this, wrkr);
+    wrkr.onerror = this._onerror.bind(this);
+    this._workers[i] = wrkr;
+  }
+
+  this._checkJobs();
+};
+WorkerPool.prototype = {
+  postMessage: function (msg) {
+    if (this._stopTimeout !== undefined) {
+      clearTimeout(this._stopTimeout);
+      this._stopTimeout = undefined;
+    }
+    var wrkr = this._workers[this._ind % this._size];
+    wrkr._count++;
+    this._jobs++;
+    wrkr.postMessage(msg);
+    this._ind++;
+  },
+
+  _onmessage: function (wrkr, evt) {
+    wrkr._count--;
+    this._jobs--;
+    this.onmessage(evt, wrkr);
+    this._checkJobs();
+  },
+
+  _onerror: function(err) {
+    try {
+        var evt = new Event('error');
+    } catch (_eventError) {
+        var evt = document.createEvent('Event');
+        evt.initEvent('error', true, true);
+    }
+    evt.message = err.message;
+    evt.filename = err.filename;
+    evt.lineno = err.lineno;
+    evt.colno = err.colno;
+    evt.error = err.error;
+    window.dispatchEvent(evt);
+  },
+
+  _checkJobs: function () {
+    if (this._jobs === 0 && this._stopTimeout === undefined) {
+      // wait for 2s of inactivity before stopping (that should be enough for local loading)
+      this._stopTimeout = setTimeout(this._stop.bind(this), 2000);
+    }
+  },
+
+  _stop: function () {
+    this._workers.forEach(function(wrkr) {
+      wrkr.terminate();
+    });
+  }
+};
+
+var promiseMap = new Map();
+var babelWorker = new WorkerPool('babel-worker.js', 3);
+babelWorker.onmessage = function (evt) {
+    var promFuncs = promiseMap.get(evt.data.key);
+    promFuncs.resolve(evt.data);
+    promiseMap.delete(evt.data.key);
+};
+
+// instantiate just needs to run System.register
+// so we fetch the source, convert into the Babel System module format, then evaluate it
+BrowserESModuleLoader.prototype[RegisterLoader.instantiate] = function(key, processAnonRegister) {
+  var loader = this;
+
+  // load as ES with Babel converting into System.register
+  return new Promise(function(resolve, reject) {
+    // anonymous module
+    if (anonSources[key]) {
+      resolve(anonSources[key])
+      anonSources[key] = undefined;
+    }
+    // otherwise we fetch
+    else {
+      xhrFetch(key, resolve, reject);
+    }
+  })
+  .then(function(source) {
+    // check our cache first
+    var cacheEntry = localStorage.getItem(key);
+    if (cacheEntry) {
+      cacheEntry = JSON.parse(cacheEntry);
+      // TODO: store a hash instead
+      if (cacheEntry.source === source) {
+        return Promise.resolve({key: key, code: cacheEntry.code, source: cacheEntry.source});
+      }
+    }
+    return new Promise(function (resolve, reject) {
+      promiseMap.set(key, {resolve: resolve, reject: reject});
+      babelWorker.postMessage({key: key, source: source});
+    });
+  }).then(function (data) {
+    // evaluate without require, exports and module variables
+    // we leave module in for now to allow module.require access
+    try {
+      var cacheEntry = JSON.stringify({source: data.source, code: data.code});
+      localStorage.setItem(key, cacheEntry);
+    } catch (e) {
+      if (window.console) {
+        window.console.warn('Unable to cache transpiled version of ' + key + ': ' + e);
+      }
+    }
+    (0, eval)(data.code + '\n//# sourceURL=' + data.key + '!transpiled');
+    processAnonRegister();
+  });
+};
+
+// create a default loader instance in the browser
+if (isBrowser)
+  loader = new BrowserESModuleLoader();
+
+export default BrowserESModuleLoader;
diff --git a/systemvm/agent/noVNC/vendor/pako/LICENSE b/systemvm/agent/noVNC/vendor/pako/LICENSE
new file mode 100644
index 0000000..d082ae3
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/LICENSE
@@ -0,0 +1,21 @@
+(The MIT License)
+
+Copyright (C) 2014-2016 by Vitaly Puzrin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/systemvm/agent/noVNC/vendor/pako/README.md b/systemvm/agent/noVNC/vendor/pako/README.md
new file mode 100644
index 0000000..755df64
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/README.md
@@ -0,0 +1,6 @@
+This is an ES6-modules-compatible version of
+https://github.com/nodeca/pako, based on pako version 1.0.3.
+
+It's more-or-less a direct translation of the original, with unused parts
+removed, and the dynamic support for non-typed arrays removed (since ES6
+modules don't work well with dynamic exports).
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/utils/common.js b/systemvm/agent/noVNC/vendor/pako/lib/utils/common.js
new file mode 100644
index 0000000..576fd59
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/utils/common.js
@@ -0,0 +1,45 @@
+// reduce buffer size, avoiding mem copy
+export function shrinkBuf (buf, size) {
+  if (buf.length === size) { return buf; }
+  if (buf.subarray) { return buf.subarray(0, size); }
+  buf.length = size;
+  return buf;
+};
+
+
+export function arraySet (dest, src, src_offs, len, dest_offs) {
+  if (src.subarray && dest.subarray) {
+    dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
+    return;
+  }
+  // Fallback to ordinary array
+  for (var i = 0; i < len; i++) {
+    dest[dest_offs + i] = src[src_offs + i];
+  }
+}
+
+// Join array of chunks to single array.
+export function flattenChunks (chunks) {
+  var i, l, len, pos, chunk, result;
+
+  // calculate data length
+  len = 0;
+  for (i = 0, l = chunks.length; i < l; i++) {
+    len += chunks[i].length;
+  }
+
+  // join chunks
+  result = new Uint8Array(len);
+  pos = 0;
+  for (i = 0, l = chunks.length; i < l; i++) {
+    chunk = chunks[i];
+    result.set(chunk, pos);
+    pos += chunk.length;
+  }
+
+  return result;
+}
+
+export var Buf8  = Uint8Array;
+export var Buf16 = Uint16Array;
+export var Buf32 = Int32Array;
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/adler32.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/adler32.js
new file mode 100644
index 0000000..058a534
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/adler32.js
@@ -0,0 +1,27 @@
+// Note: adler32 takes 12% for level 0 and 2% for level 6.
+// It doesn't worth to make additional optimizationa as in original.
+// Small size is preferable.
+
+export default function adler32(adler, buf, len, pos) {
+  var s1 = (adler & 0xffff) |0,
+      s2 = ((adler >>> 16) & 0xffff) |0,
+      n = 0;
+
+  while (len !== 0) {
+    // Set limit ~ twice less than 5552, to keep
+    // s2 in 31-bits, because we force signed ints.
+    // in other case %= will fail.
+    n = len > 2000 ? 2000 : len;
+    len -= n;
+
+    do {
+      s1 = (s1 + buf[pos++]) |0;
+      s2 = (s2 + s1) |0;
+    } while (--n);
+
+    s1 %= 65521;
+    s2 %= 65521;
+  }
+
+  return (s1 | (s2 << 16)) |0;
+}
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/constants.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/constants.js
new file mode 100644
index 0000000..7d80502
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/constants.js
@@ -0,0 +1,47 @@
+export default {
+
+  /* Allowed flush values; see deflate() and inflate() below for details */
+  Z_NO_FLUSH:         0,
+  Z_PARTIAL_FLUSH:    1,
+  Z_SYNC_FLUSH:       2,
+  Z_FULL_FLUSH:       3,
+  Z_FINISH:           4,
+  Z_BLOCK:            5,
+  Z_TREES:            6,
+
+  /* Return codes for the compression/decompression functions. Negative values
+  * are errors, positive values are used for special but normal events.
+  */
+  Z_OK:               0,
+  Z_STREAM_END:       1,
+  Z_NEED_DICT:        2,
+  Z_ERRNO:           -1,
+  Z_STREAM_ERROR:    -2,
+  Z_DATA_ERROR:      -3,
+  //Z_MEM_ERROR:     -4,
+  Z_BUF_ERROR:       -5,
+  //Z_VERSION_ERROR: -6,
+
+  /* compression levels */
+  Z_NO_COMPRESSION:         0,
+  Z_BEST_SPEED:             1,
+  Z_BEST_COMPRESSION:       9,
+  Z_DEFAULT_COMPRESSION:   -1,
+
+
+  Z_FILTERED:               1,
+  Z_HUFFMAN_ONLY:           2,
+  Z_RLE:                    3,
+  Z_FIXED:                  4,
+  Z_DEFAULT_STRATEGY:       0,
+
+  /* Possible values of the data_type field (though see inflate()) */
+  Z_BINARY:                 0,
+  Z_TEXT:                   1,
+  //Z_ASCII:                1, // = Z_TEXT (deprecated)
+  Z_UNKNOWN:                2,
+
+  /* The deflate compression method */
+  Z_DEFLATED:               8
+  //Z_NULL:                 null // Use -1 or null inline, depending on var type
+};
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/crc32.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/crc32.js
new file mode 100644
index 0000000..611ffb2
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/crc32.js
@@ -0,0 +1,36 @@
+// Note: we can't get significant speed boost here.
+// So write code to minimize size - no pregenerated tables
+// and array tools dependencies.
+
+
+// Use ordinary array, since untyped makes no boost here
+export default function makeTable() {
+  var c, table = [];
+
+  for (var n = 0; n < 256; n++) {
+    c = n;
+    for (var k = 0; k < 8; k++) {
+      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
+    }
+    table[n] = c;
+  }
+
+  return table;
+}
+
+// Create table on load. Just 255 signed longs. Not a problem.
+var crcTable = makeTable();
+
+
+function crc32(crc, buf, len, pos) {
+  var t = crcTable,
+      end = pos + len;
+
+  crc ^= -1;
+
+  for (var i = pos; i < end; i++) {
+    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];
+  }
+
+  return (crc ^ (-1)); // >>> 0;
+}
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/deflate.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/deflate.js
new file mode 100644
index 0000000..c3a5ba4
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/deflate.js
@@ -0,0 +1,1846 @@
+import * as utils from "../utils/common.js";
+import * as trees from "./trees.js";
+import adler32 from "./adler32.js";
+import crc32 from "./crc32.js";
+import msg from "./messages.js";
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+export const Z_NO_FLUSH      = 0;
+export const Z_PARTIAL_FLUSH = 1;
+//export const Z_SYNC_FLUSH    = 2;
+export const Z_FULL_FLUSH    = 3;
+export const Z_FINISH        = 4;
+export const Z_BLOCK         = 5;
+//export const Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+export const Z_OK            = 0;
+export const Z_STREAM_END    = 1;
+//export const Z_NEED_DICT     = 2;
+//export const Z_ERRNO         = -1;
+export const Z_STREAM_ERROR  = -2;
+export const Z_DATA_ERROR    = -3;
+//export const Z_MEM_ERROR     = -4;
+export const Z_BUF_ERROR     = -5;
+//export const Z_VERSION_ERROR = -6;
+
+
+/* compression levels */
+//export const Z_NO_COMPRESSION      = 0;
+//export const Z_BEST_SPEED          = 1;
+//export const Z_BEST_COMPRESSION    = 9;
+export const Z_DEFAULT_COMPRESSION = -1;
+
+
+export const Z_FILTERED            = 1;
+export const Z_HUFFMAN_ONLY        = 2;
+export const Z_RLE                 = 3;
+export const Z_FIXED               = 4;
+export const Z_DEFAULT_STRATEGY    = 0;
+
+/* Possible values of the data_type field (though see inflate()) */
+//export const Z_BINARY              = 0;
+//export const Z_TEXT                = 1;
+//export const Z_ASCII               = 1; // = Z_TEXT
+export const Z_UNKNOWN             = 2;
+
+
+/* The deflate compression method */
+export const Z_DEFLATED  = 8;
+
+/*============================================================================*/
+
+
+var MAX_MEM_LEVEL = 9;
+/* Maximum value for memLevel in deflateInit2 */
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_MEM_LEVEL = 8;
+
+
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+var D_CODES       = 30;
+/* number of distance codes */
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+var MAX_BITS  = 15;
+/* All codes must not exceed MAX_BITS bits */
+
+var MIN_MATCH = 3;
+var MAX_MATCH = 258;
+var MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
+
+var PRESET_DICT = 0x20;
+
+var INIT_STATE = 42;
+var EXTRA_STATE = 69;
+var NAME_STATE = 73;
+var COMMENT_STATE = 91;
+var HCRC_STATE = 103;
+var BUSY_STATE = 113;
+var FINISH_STATE = 666;
+
+var BS_NEED_MORE      = 1; /* block not completed, need more input or more output */
+var BS_BLOCK_DONE     = 2; /* block flush performed */
+var BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */
+var BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */
+
+var OS_CODE = 0x03; // Unix :) . Don't detect, use this default.
+
+function err(strm, errorCode) {
+  strm.msg = msg[errorCode];
+  return errorCode;
+}
+
+function rank(f) {
+  return ((f) << 1) - ((f) > 4 ? 9 : 0);
+}
+
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
+
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->output buffer and copying into it.
+ * (See also read_buf()).
+ */
+function flush_pending(strm) {
+  var s = strm.state;
+
+  //_tr_flush_bits(s);
+  var len = s.pending;
+  if (len > strm.avail_out) {
+    len = strm.avail_out;
+  }
+  if (len === 0) { return; }
+
+  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
+  strm.next_out += len;
+  s.pending_out += len;
+  strm.total_out += len;
+  strm.avail_out -= len;
+  s.pending -= len;
+  if (s.pending === 0) {
+    s.pending_out = 0;
+  }
+}
+
+
+function flush_block_only(s, last) {
+  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);
+  s.block_start = s.strstart;
+  flush_pending(s.strm);
+}
+
+
+function put_byte(s, b) {
+  s.pending_buf[s.pending++] = b;
+}
+
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+function putShortMSB(s, b) {
+//  put_byte(s, (Byte)(b >> 8));
+//  put_byte(s, (Byte)(b & 0xff));
+  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;
+  s.pending_buf[s.pending++] = b & 0xff;
+}
+
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->input buffer and copying from it.
+ * (See also flush_pending()).
+ */
+function read_buf(strm, buf, start, size) {
+  var len = strm.avail_in;
+
+  if (len > size) { len = size; }
+  if (len === 0) { return 0; }
+
+  strm.avail_in -= len;
+
+  // zmemcpy(buf, strm->next_in, len);
+  utils.arraySet(buf, strm.input, strm.next_in, len, start);
+  if (strm.state.wrap === 1) {
+    strm.adler = adler32(strm.adler, buf, len, start);
+  }
+
+  else if (strm.state.wrap === 2) {
+    strm.adler = crc32(strm.adler, buf, len, start);
+  }
+
+  strm.next_in += len;
+  strm.total_in += len;
+
+  return len;
+}
+
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+function longest_match(s, cur_match) {
+  var chain_length = s.max_chain_length;      /* max hash chain length */
+  var scan = s.strstart; /* current string */
+  var match;                       /* matched string */
+  var len;                           /* length of current match */
+  var best_len = s.prev_length;              /* best match length so far */
+  var nice_match = s.nice_match;             /* stop if match long enough */
+  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?
+      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;
+
+  var _win = s.window; // shortcut
+
+  var wmask = s.w_mask;
+  var prev  = s.prev;
+
+  /* Stop when cur_match becomes <= limit. To simplify the code,
+   * we prevent matches with the string of window index 0.
+   */
+
+  var strend = s.strstart + MAX_MATCH;
+  var scan_end1  = _win[scan + best_len - 1];
+  var scan_end   = _win[scan + best_len];
+
+  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+   * It is easy to get rid of this optimization if necessary.
+   */
+  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+  /* Do not waste too much time if we already have a good match: */
+  if (s.prev_length >= s.good_match) {
+    chain_length >>= 2;
+  }
+  /* Do not look for matches beyond the end of the input. This is necessary
+   * to make deflate deterministic.
+   */
+  if (nice_match > s.lookahead) { nice_match = s.lookahead; }
+
+  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+  do {
+    // Assert(cur_match < s->strstart, "no future");
+    match = cur_match;
+
+    /* Skip to next match if the match length cannot increase
+     * or if the match length is less than 2.  Note that the checks below
+     * for insufficient lookahead only occur occasionally for performance
+     * reasons.  Therefore uninitialized memory will be accessed, and
+     * conditional jumps will be made that depend on those values.
+     * However the length of the match is limited to the lookahead, so
+     * the output of deflate is not affected by the uninitialized values.
+     */
+
+    if (_win[match + best_len]     !== scan_end  ||
+        _win[match + best_len - 1] !== scan_end1 ||
+        _win[match]                !== _win[scan] ||
+        _win[++match]              !== _win[scan + 1]) {
+      continue;
+    }
+
+    /* The check at best_len-1 can be removed because it will be made
+     * again later. (This heuristic is not always a win.)
+     * It is not necessary to compare scan[2] and match[2] since they
+     * are always equal when the other bytes match, given that
+     * the hash keys are equal and that HASH_BITS >= 8.
+     */
+    scan += 2;
+    match++;
+    // Assert(*scan == *match, "match[2]?");
+
+    /* We check for insufficient lookahead only every 8th comparison;
+     * the 256th check will be made at strstart+258.
+     */
+    do {
+      // Do nothing
+    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&
+             scan < strend);
+
+    // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+    len = MAX_MATCH - (strend - scan);
+    scan = strend - MAX_MATCH;
+
+    if (len > best_len) {
+      s.match_start = cur_match;
+      best_len = len;
+      if (len >= nice_match) {
+        break;
+      }
+      scan_end1  = _win[scan + best_len - 1];
+      scan_end   = _win[scan + best_len];
+    }
+  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
+
+  if (best_len <= s.lookahead) {
+    return best_len;
+  }
+  return s.lookahead;
+}
+
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+function fill_window(s) {
+  var _w_size = s.w_size;
+  var p, n, m, more, str;
+
+  //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+  do {
+    more = s.window_size - s.lookahead - s.strstart;
+
+    // JS ints have 32 bit, block below not needed
+    /* Deal with !@#$% 64K limit: */
+    //if (sizeof(int) <= 2) {
+    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+    //        more = wsize;
+    //
+    //  } else if (more == (unsigned)(-1)) {
+    //        /* Very unlikely, but possible on 16 bit machine if
+    //         * strstart == 0 && lookahead == 1 (input done a byte at time)
+    //         */
+    //        more--;
+    //    }
+    //}
+
+
+    /* If the window is almost full and there is insufficient lookahead,
+     * move the upper half to the lower one to make room in the upper half.
+     */
+    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
+
+      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
+      s.match_start -= _w_size;
+      s.strstart -= _w_size;
+      /* we now have strstart >= MAX_DIST */
+      s.block_start -= _w_size;
+
+      /* Slide the hash table (could be avoided with 32 bit values
+       at the expense of memory usage). We slide even when level == 0
+       to keep the hash table consistent if we switch back to level > 0
+       later. (Using level 0 permanently is not an optimal usage of
+       zlib, so we don't care about this pathological case.)
+       */
+
+      n = s.hash_size;
+      p = n;
+      do {
+        m = s.head[--p];
+        s.head[p] = (m >= _w_size ? m - _w_size : 0);
+      } while (--n);
+
+      n = _w_size;
+      p = n;
+      do {
+        m = s.prev[--p];
+        s.prev[p] = (m >= _w_size ? m - _w_size : 0);
+        /* If n is not on any hash chain, prev[n] is garbage but
+         * its value will never be used.
+         */
+      } while (--n);
+
+      more += _w_size;
+    }
+    if (s.strm.avail_in === 0) {
+      break;
+    }
+
+    /* If there was no sliding:
+     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+     *    more == window_size - lookahead - strstart
+     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+     * => more >= window_size - 2*WSIZE + 2
+     * In the BIG_MEM or MMAP case (not yet supported),
+     *   window_size == input_size + MIN_LOOKAHEAD  &&
+     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+     * Otherwise, window_size == 2*WSIZE so more >= 2.
+     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+     */
+    //Assert(more >= 2, "more < 2");
+    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
+    s.lookahead += n;
+
+    /* Initialize the hash value now that we have some input: */
+    if (s.lookahead + s.insert >= MIN_MATCH) {
+      str = s.strstart - s.insert;
+      s.ins_h = s.window[str];
+
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;
+//#if MIN_MATCH != 3
+//        Call update_hash() MIN_MATCH-3 more times
+//#endif
+      while (s.insert) {
+        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+        s.prev[str & s.w_mask] = s.head[s.ins_h];
+        s.head[s.ins_h] = str;
+        str++;
+        s.insert--;
+        if (s.lookahead + s.insert < MIN_MATCH) {
+          break;
+        }
+      }
+    }
+    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+     * but this is not important since only literal bytes will be emitted.
+     */
+
+  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
+
+  /* If the WIN_INIT bytes after the end of the current data have never been
+   * written, then zero those bytes in order to avoid memory check reports of
+   * the use of uninitialized (or uninitialised as Julian writes) bytes by
+   * the longest match routines.  Update the high water mark for the next
+   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match
+   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+   */
+//  if (s.high_water < s.window_size) {
+//    var curr = s.strstart + s.lookahead;
+//    var init = 0;
+//
+//    if (s.high_water < curr) {
+//      /* Previous high water mark below current data -- zero WIN_INIT
+//       * bytes or up to end of window, whichever is less.
+//       */
+//      init = s.window_size - curr;
+//      if (init > WIN_INIT)
+//        init = WIN_INIT;
+//      zmemzero(s->window + curr, (unsigned)init);
+//      s->high_water = curr + init;
+//    }
+//    else if (s->high_water < (ulg)curr + WIN_INIT) {
+//      /* High water mark at or above current data, but below current data
+//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+//       * to end of window, whichever is less.
+//       */
+//      init = (ulg)curr + WIN_INIT - s->high_water;
+//      if (init > s->window_size - s->high_water)
+//        init = s->window_size - s->high_water;
+//      zmemzero(s->window + s->high_water, (unsigned)init);
+//      s->high_water += init;
+//    }
+//  }
+//
+//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+//    "not enough room for search");
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+function deflate_stored(s, flush) {
+  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+   * to pending_buf_size, and each stored block has a 5 byte header:
+   */
+  var max_block_size = 0xffff;
+
+  if (max_block_size > s.pending_buf_size - 5) {
+    max_block_size = s.pending_buf_size - 5;
+  }
+
+  /* Copy as much as possible from input to output: */
+  for (;;) {
+    /* Fill the window as much as possible: */
+    if (s.lookahead <= 1) {
+
+      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+      //  s->block_start >= (long)s->w_size, "slide too late");
+//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||
+//        s.block_start >= s.w_size)) {
+//        throw  new Error("slide too late");
+//      }
+
+      fill_window(s);
+      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+
+      if (s.lookahead === 0) {
+        break;
+      }
+      /* flush the current block */
+    }
+    //Assert(s->block_start >= 0L, "block gone");
+//    if (s.block_start < 0) throw new Error("block gone");
+
+    s.strstart += s.lookahead;
+    s.lookahead = 0;
+
+    /* Emit a stored block if pending_buf will be full: */
+    var max_start = s.block_start + max_block_size;
+
+    if (s.strstart === 0 || s.strstart >= max_start) {
+      /* strstart == 0 is possible when wraparound on 16-bit machine */
+      s.lookahead = s.strstart - max_start;
+      s.strstart = max_start;
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+
+
+    }
+    /* Flush if we may have to slide, otherwise block_start may become
+     * negative and the data will be gone:
+     */
+    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
+
+  s.insert = 0;
+
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+
+  if (s.strstart > s.block_start) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+
+  return BS_NEED_MORE;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+function deflate_fast(s, flush) {
+  var hash_head;        /* head of the hash chain */
+  var bflush;           /* set if current block must be flushed */
+
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) {
+        break; /* flush the current block */
+      }
+    }
+
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
+    }
+
+    /* Find the longest match, discarding those <= prev_length.
+     * At this point we have always match_length < MIN_MATCH
+     */
+    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
+    }
+    if (s.match_length >= MIN_MATCH) {
+      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only
+
+      /*** _tr_tally_dist(s, s.strstart - s.match_start,
+                     s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
+
+      s.lookahead -= s.match_length;
+
+      /* Insert new strings in the hash table only if the match length
+       * is not too large. This saves time but degrades compression.
+       */
+      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {
+        s.match_length--; /* string at strstart already in table */
+        do {
+          s.strstart++;
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+          /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+           * always MIN_MATCH bytes ahead.
+           */
+        } while (--s.match_length !== 0);
+        s.strstart++;
+      } else
+      {
+        s.strstart += s.match_length;
+        s.match_length = 0;
+        s.ins_h = s.window[s.strstart];
+        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
+        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;
+
+//#if MIN_MATCH != 3
+//                Call UPDATE_HASH() MIN_MATCH-3 more times
+//#endif
+        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+         * matter since it will be recomputed at next deflate call.
+         */
+      }
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s.window[s.strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
+  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
+
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+function deflate_slow(s, flush) {
+  var hash_head;          /* head of hash chain */
+  var bflush;              /* set if current block must be flushed */
+
+  var max_insert;
+
+  /* Process the input block. */
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the next match, plus MIN_MATCH bytes to insert the
+     * string following the next match.
+     */
+    if (s.lookahead < MIN_LOOKAHEAD) {
+      fill_window(s);
+      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
+    }
+
+    /* Insert the string window[strstart .. strstart+2] in the
+     * dictionary, and set hash_head to the head of the hash chain:
+     */
+    hash_head = 0/*NIL*/;
+    if (s.lookahead >= MIN_MATCH) {
+      /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+      s.head[s.ins_h] = s.strstart;
+      /***/
+    }
+
+    /* Find the longest match, discarding those <= prev_length.
+     */
+    s.prev_length = s.match_length;
+    s.prev_match = s.match_start;
+    s.match_length = MIN_MATCH - 1;
+
+    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&
+        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {
+      /* To simplify the code, we prevent matches with the string
+       * of window index 0 (in particular we have to avoid a match
+       * of the string with itself at the start of the input file).
+       */
+      s.match_length = longest_match(s, hash_head);
+      /* longest_match() sets match_start */
+
+      if (s.match_length <= 5 &&
+         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {
+
+        /* If prev_match is also MIN_MATCH, match_start is garbage
+         * but we will ignore the current match anyway.
+         */
+        s.match_length = MIN_MATCH - 1;
+      }
+    }
+    /* If there was a match at the previous step and the current
+     * match is not better, output the previous match:
+     */
+    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
+      max_insert = s.strstart + s.lookahead - MIN_MATCH;
+      /* Do not insert strings in hash table beyond this. */
+
+      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);
+
+      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,
+                     s.prev_length - MIN_MATCH, bflush);***/
+      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
+      /* Insert in hash table all strings up to the end of the match.
+       * strstart-1 and strstart are already inserted. If there is not
+       * enough lookahead, the last two strings are not inserted in
+       * the hash table.
+       */
+      s.lookahead -= s.prev_length - 1;
+      s.prev_length -= 2;
+      do {
+        if (++s.strstart <= max_insert) {
+          /*** INSERT_STRING(s, s.strstart, hash_head); ***/
+          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
+          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
+          s.head[s.ins_h] = s.strstart;
+          /***/
+        }
+      } while (--s.prev_length !== 0);
+      s.match_available = 0;
+      s.match_length = MIN_MATCH - 1;
+      s.strstart++;
+
+      if (bflush) {
+        /*** FLUSH_BLOCK(s, 0); ***/
+        flush_block_only(s, false);
+        if (s.strm.avail_out === 0) {
+          return BS_NEED_MORE;
+        }
+        /***/
+      }
+
+    } else if (s.match_available) {
+      /* If there was no match at the previous position, output a
+       * single literal. If there was a match but the current match
+       * is longer, truncate the previous match to a single literal.
+       */
+      //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+      if (bflush) {
+        /*** FLUSH_BLOCK_ONLY(s, 0) ***/
+        flush_block_only(s, false);
+        /***/
+      }
+      s.strstart++;
+      s.lookahead--;
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+    } else {
+      /* There is no previous match to compare with, wait for
+       * the next step to decide.
+       */
+      s.match_available = 1;
+      s.strstart++;
+      s.lookahead--;
+    }
+  }
+  //Assert (flush != Z_NO_FLUSH, "no flush?");
+  if (s.match_available) {
+    //Tracevv((stderr,"%c", s->window[s->strstart-1]));
+    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
+
+    s.match_available = 0;
+  }
+  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+
+  return BS_BLOCK_DONE;
+}
+
+
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one.  Do not maintain a hash table.  (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+function deflate_rle(s, flush) {
+  var bflush;            /* set if current block must be flushed */
+  var prev;              /* byte at distance one to match */
+  var scan, strend;      /* scan goes up to strend for length of run */
+
+  var _win = s.window;
+
+  for (;;) {
+    /* Make sure that we always have enough lookahead, except
+     * at the end of the input file. We need MAX_MATCH bytes
+     * for the longest run, plus one for the unrolled loop.
+     */
+    if (s.lookahead <= MAX_MATCH) {
+      fill_window(s);
+      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
+        return BS_NEED_MORE;
+      }
+      if (s.lookahead === 0) { break; } /* flush the current block */
+    }
+
+    /* See how many times the previous byte repeats */
+    s.match_length = 0;
+    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
+      scan = s.strstart - 1;
+      prev = _win[scan];
+      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
+        strend = s.strstart + MAX_MATCH;
+        do {
+          // Do nothing
+        } while (prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 prev === _win[++scan] && prev === _win[++scan] &&
+                 scan < strend);
+        s.match_length = MAX_MATCH - (strend - scan);
+        if (s.match_length > s.lookahead) {
+          s.match_length = s.lookahead;
+        }
+      }
+      //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+    }
+
+    /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+    if (s.match_length >= MIN_MATCH) {
+      //check_match(s, s.strstart, s.strstart - 1, s.match_length);
+
+      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/
+      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
+
+      s.lookahead -= s.match_length;
+      s.strstart += s.match_length;
+      s.match_length = 0;
+    } else {
+      /* No match, output a literal byte */
+      //Tracevv((stderr,"%c", s->window[s->strstart]));
+      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+
+      s.lookahead--;
+      s.strstart++;
+    }
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
+
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
+ */
+function deflate_huff(s, flush) {
+  var bflush;             /* set if current block must be flushed */
+
+  for (;;) {
+    /* Make sure that we have a literal to write. */
+    if (s.lookahead === 0) {
+      fill_window(s);
+      if (s.lookahead === 0) {
+        if (flush === Z_NO_FLUSH) {
+          return BS_NEED_MORE;
+        }
+        break;      /* flush the current block */
+      }
+    }
+
+    /* Output a literal byte */
+    s.match_length = 0;
+    //Tracevv((stderr,"%c", s->window[s->strstart]));
+    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/
+    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
+    s.lookahead--;
+    s.strstart++;
+    if (bflush) {
+      /*** FLUSH_BLOCK(s, 0); ***/
+      flush_block_only(s, false);
+      if (s.strm.avail_out === 0) {
+        return BS_NEED_MORE;
+      }
+      /***/
+    }
+  }
+  s.insert = 0;
+  if (flush === Z_FINISH) {
+    /*** FLUSH_BLOCK(s, 1); ***/
+    flush_block_only(s, true);
+    if (s.strm.avail_out === 0) {
+      return BS_FINISH_STARTED;
+    }
+    /***/
+    return BS_FINISH_DONE;
+  }
+  if (s.last_lit) {
+    /*** FLUSH_BLOCK(s, 0); ***/
+    flush_block_only(s, false);
+    if (s.strm.avail_out === 0) {
+      return BS_NEED_MORE;
+    }
+    /***/
+  }
+  return BS_BLOCK_DONE;
+}
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+function Config(good_length, max_lazy, nice_length, max_chain, func) {
+  this.good_length = good_length;
+  this.max_lazy = max_lazy;
+  this.nice_length = nice_length;
+  this.max_chain = max_chain;
+  this.func = func;
+}
+
+var configuration_table;
+
+configuration_table = [
+  /*      good lazy nice chain */
+  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */
+  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */
+  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */
+  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */
+
+  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */
+  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */
+  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */
+  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */
+  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */
+  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */
+];
+
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+function lm_init(s) {
+  s.window_size = 2 * s.w_size;
+
+  /*** CLEAR_HASH(s); ***/
+  zero(s.head); // Fill with NIL (= 0);
+
+  /* Set the default configuration parameters:
+   */
+  s.max_lazy_match = configuration_table[s.level].max_lazy;
+  s.good_match = configuration_table[s.level].good_length;
+  s.nice_match = configuration_table[s.level].nice_length;
+  s.max_chain_length = configuration_table[s.level].max_chain;
+
+  s.strstart = 0;
+  s.block_start = 0;
+  s.lookahead = 0;
+  s.insert = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  s.ins_h = 0;
+}
+
+
+function DeflateState() {
+  this.strm = null;            /* pointer back to this zlib stream */
+  this.status = 0;            /* as the name implies */
+  this.pending_buf = null;      /* output still pending */
+  this.pending_buf_size = 0;  /* size of pending_buf */
+  this.pending_out = 0;       /* next pending byte to output to the stream */
+  this.pending = 0;           /* nb of bytes in the pending buffer */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.gzhead = null;         /* gzip header information to write */
+  this.gzindex = 0;           /* where in extra, name, or comment */
+  this.method = Z_DEFLATED; /* can only be DEFLATED */
+  this.last_flush = -1;   /* value of flush param for previous deflate call */
+
+  this.w_size = 0;  /* LZ77 window size (32K by default) */
+  this.w_bits = 0;  /* log2(w_size)  (8..16) */
+  this.w_mask = 0;  /* w_size - 1 */
+
+  this.window = null;
+  /* Sliding window. Input bytes are read into the second half of the window,
+   * and move to the first half later to keep a dictionary of at least wSize
+   * bytes. With this organization, matches are limited to a distance of
+   * wSize-MAX_MATCH bytes, but this ensures that IO is always
+   * performed with a length multiple of the block size.
+   */
+
+  this.window_size = 0;
+  /* Actual size of window: 2*wSize, except when the user input buffer
+   * is directly used as sliding window.
+   */
+
+  this.prev = null;
+  /* Link to older string with same hash index. To limit the size of this
+   * array to 64K, this link is maintained only for the last 32K strings.
+   * An index in this array is thus a window index modulo 32K.
+   */
+
+  this.head = null;   /* Heads of the hash chains or NIL. */
+
+  this.ins_h = 0;       /* hash index of string to be inserted */
+  this.hash_size = 0;   /* number of elements in hash table */
+  this.hash_bits = 0;   /* log2(hash_size) */
+  this.hash_mask = 0;   /* hash_size-1 */
+
+  this.hash_shift = 0;
+  /* Number of bits by which ins_h must be shifted at each input
+   * step. It must be such that after MIN_MATCH steps, the oldest
+   * byte no longer takes part in the hash key, that is:
+   *   hash_shift * MIN_MATCH >= hash_bits
+   */
+
+  this.block_start = 0;
+  /* Window position at the beginning of the current output block. Gets
+   * negative when the window is moved backwards.
+   */
+
+  this.match_length = 0;      /* length of best match */
+  this.prev_match = 0;        /* previous match */
+  this.match_available = 0;   /* set if previous match exists */
+  this.strstart = 0;          /* start of string to insert */
+  this.match_start = 0;       /* start of matching string */
+  this.lookahead = 0;         /* number of valid bytes ahead in window */
+
+  this.prev_length = 0;
+  /* Length of the best match at previous step. Matches not greater than this
+   * are discarded. This is used in the lazy match evaluation.
+   */
+
+  this.max_chain_length = 0;
+  /* To speed up deflation, hash chains are never searched beyond this
+   * length.  A higher limit improves compression ratio but degrades the
+   * speed.
+   */
+
+  this.max_lazy_match = 0;
+  /* Attempt to find a better match only when the current match is strictly
+   * smaller than this value. This mechanism is used only for compression
+   * levels >= 4.
+   */
+  // That's alias to max_lazy_match, don't use directly
+  //this.max_insert_length = 0;
+  /* Insert new strings in the hash table only if the match length is not
+   * greater than this length. This saves time but degrades compression.
+   * max_insert_length is used only for compression levels <= 3.
+   */
+
+  this.level = 0;     /* compression level (1..9) */
+  this.strategy = 0;  /* favor or force Huffman coding*/
+
+  this.good_match = 0;
+  /* Use a faster search when the previous match is longer than this */
+
+  this.nice_match = 0; /* Stop searching when current match exceeds this */
+
+              /* used by trees.c: */
+
+  /* Didn't use ct_data typedef below to suppress compiler warning */
+
+  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
+  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
+
+  // Use flat array of DOUBLE size, with interleaved fata,
+  // because JS does not support effective
+  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);
+  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);
+  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);
+  zero(this.dyn_ltree);
+  zero(this.dyn_dtree);
+  zero(this.bl_tree);
+
+  this.l_desc   = null;         /* desc. for literal tree */
+  this.d_desc   = null;         /* desc. for distance tree */
+  this.bl_desc  = null;         /* desc. for bit length tree */
+
+  //ush bl_count[MAX_BITS+1];
+  this.bl_count = new utils.Buf16(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
+  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */
+  zero(this.heap);
+
+  this.heap_len = 0;               /* number of elements in the heap */
+  this.heap_max = 0;               /* element of largest frequency */
+  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+   * The same heap array is used to build all trees.
+   */
+
+  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];
+  zero(this.depth);
+  /* Depth of each subtree used as tie breaker for trees of equal frequency
+   */
+
+  this.l_buf = 0;          /* buffer index for literals or lengths */
+
+  this.lit_bufsize = 0;
+  /* Size of match buffer for literals/lengths.  There are 4 reasons for
+   * limiting lit_bufsize to 64K:
+   *   - frequencies can be kept in 16 bit counters
+   *   - if compression is not successful for the first block, all input
+   *     data is still in the window so we can still emit a stored block even
+   *     when input comes from standard input.  (This can also be done for
+   *     all blocks if lit_bufsize is not greater than 32K.)
+   *   - if compression is not successful for a file smaller than 64K, we can
+   *     even emit a stored file instead of a stored block (saving 5 bytes).
+   *     This is applicable only for zip (not gzip or zlib).
+   *   - creating new Huffman trees less frequently may not provide fast
+   *     adaptation to changes in the input data statistics. (Take for
+   *     example a binary file with poorly compressible code followed by
+   *     a highly compressible string table.) Smaller buffer sizes give
+   *     fast adaptation but have of course the overhead of transmitting
+   *     trees more frequently.
+   *   - I can't count above 4
+   */
+
+  this.last_lit = 0;      /* running index in l_buf */
+
+  this.d_buf = 0;
+  /* Buffer index for distances. To simplify the code, d_buf and l_buf have
+   * the same number of elements. To use different lengths, an extra flag
+   * array would be necessary.
+   */
+
+  this.opt_len = 0;       /* bit length of current block with optimal trees */
+  this.static_len = 0;    /* bit length of current block with static trees */
+  this.matches = 0;       /* number of string matches in current block */
+  this.insert = 0;        /* bytes at end of window left to insert */
+
+
+  this.bi_buf = 0;
+  /* Output buffer. bits are inserted starting at the bottom (least
+   * significant bits).
+   */
+  this.bi_valid = 0;
+  /* Number of valid bits in bi_buf.  All bits above the last valid bit
+   * are always zero.
+   */
+
+  // Used for window memory init. We safely ignore it for JS. That makes
+  // sense only for pointers and memory check tools.
+  //this.high_water = 0;
+  /* High water mark offset in window for initialized bytes -- bytes above
+   * this are set to zero in order to avoid memory check warnings when
+   * longest match routines access bytes past the input.  This is then
+   * updated to the new high water mark.
+   */
+}
+
+
+function deflateResetKeep(strm) {
+  var s;
+
+  if (!strm || !strm.state) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.total_in = strm.total_out = 0;
+  strm.data_type = Z_UNKNOWN;
+
+  s = strm.state;
+  s.pending = 0;
+  s.pending_out = 0;
+
+  if (s.wrap < 0) {
+    s.wrap = -s.wrap;
+    /* was made negative by deflate(..., Z_FINISH); */
+  }
+  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);
+  strm.adler = (s.wrap === 2) ?
+    0  // crc32(0, Z_NULL, 0)
+  :
+    1; // adler32(0, Z_NULL, 0)
+  s.last_flush = Z_NO_FLUSH;
+  trees._tr_init(s);
+  return Z_OK;
+}
+
+
+function deflateReset(strm) {
+  var ret = deflateResetKeep(strm);
+  if (ret === Z_OK) {
+    lm_init(strm.state);
+  }
+  return ret;
+}
+
+
+function deflateSetHeader(strm, head) {
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }
+  strm.state.gzhead = head;
+  return Z_OK;
+}
+
+
+function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
+  if (!strm) { // === Z_NULL
+    return Z_STREAM_ERROR;
+  }
+  var wrap = 1;
+
+  if (level === Z_DEFAULT_COMPRESSION) {
+    level = 6;
+  }
+
+  if (windowBits < 0) { /* suppress zlib wrapper */
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+
+  else if (windowBits > 15) {
+    wrap = 2;           /* write gzip wrapper instead */
+    windowBits -= 16;
+  }
+
+
+  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||
+    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+    strategy < 0 || strategy > Z_FIXED) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+
+  if (windowBits === 8) {
+    windowBits = 9;
+  }
+  /* until 256-byte window bug fixed */
+
+  var s = new DeflateState();
+
+  strm.state = s;
+  s.strm = strm;
+
+  s.wrap = wrap;
+  s.gzhead = null;
+  s.w_bits = windowBits;
+  s.w_size = 1 << s.w_bits;
+  s.w_mask = s.w_size - 1;
+
+  s.hash_bits = memLevel + 7;
+  s.hash_size = 1 << s.hash_bits;
+  s.hash_mask = s.hash_size - 1;
+  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
+
+  s.window = new utils.Buf8(s.w_size * 2);
+  s.head = new utils.Buf16(s.hash_size);
+  s.prev = new utils.Buf16(s.w_size);
+
+  // Don't need mem init magic for JS.
+  //s.high_water = 0;  /* nothing written to s->window yet */
+
+  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+  s.pending_buf_size = s.lit_bufsize * 4;
+
+  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+  //s->pending_buf = (uchf *) overlay;
+  s.pending_buf = new utils.Buf8(s.pending_buf_size);
+
+  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)
+  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+  s.d_buf = 1 * s.lit_bufsize;
+
+  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+  s.l_buf = (1 + 2) * s.lit_bufsize;
+
+  s.level = level;
+  s.strategy = strategy;
+  s.method = method;
+
+  return deflateReset(strm);
+}
+
+function deflateInit(strm, level) {
+  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+}
+
+
+function deflate(strm, flush) {
+  var old_flush, s;
+  var beg, val; // for gzip header write only
+
+  if (!strm || !strm.state ||
+    flush > Z_BLOCK || flush < 0) {
+    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+
+  if (!strm.output ||
+      (!strm.input && strm.avail_in !== 0) ||
+      (s.status === FINISH_STATE && flush !== Z_FINISH)) {
+    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);
+  }
+
+  s.strm = strm; /* just in case */
+  old_flush = s.last_flush;
+  s.last_flush = flush;
+
+  /* Write the header */
+  if (s.status === INIT_STATE) {
+
+    if (s.wrap === 2) { // GZIP header
+      strm.adler = 0;  //crc32(0L, Z_NULL, 0);
+      put_byte(s, 31);
+      put_byte(s, 139);
+      put_byte(s, 8);
+      if (!s.gzhead) { // s->gzhead == Z_NULL
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, 0);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, OS_CODE);
+        s.status = BUSY_STATE;
+      }
+      else {
+        put_byte(s, (s.gzhead.text ? 1 : 0) +
+                    (s.gzhead.hcrc ? 2 : 0) +
+                    (!s.gzhead.extra ? 0 : 4) +
+                    (!s.gzhead.name ? 0 : 8) +
+                    (!s.gzhead.comment ? 0 : 16)
+                );
+        put_byte(s, s.gzhead.time & 0xff);
+        put_byte(s, (s.gzhead.time >> 8) & 0xff);
+        put_byte(s, (s.gzhead.time >> 16) & 0xff);
+        put_byte(s, (s.gzhead.time >> 24) & 0xff);
+        put_byte(s, s.level === 9 ? 2 :
+                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?
+                     4 : 0));
+        put_byte(s, s.gzhead.os & 0xff);
+        if (s.gzhead.extra && s.gzhead.extra.length) {
+          put_byte(s, s.gzhead.extra.length & 0xff);
+          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);
+        }
+        if (s.gzhead.hcrc) {
+          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
+        }
+        s.gzindex = 0;
+        s.status = EXTRA_STATE;
+      }
+    }
+    else // DEFLATE header
+    {
+      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;
+      var level_flags = -1;
+
+      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
+        level_flags = 0;
+      } else if (s.level < 6) {
+        level_flags = 1;
+      } else if (s.level === 6) {
+        level_flags = 2;
+      } else {
+        level_flags = 3;
+      }
+      header |= (level_flags << 6);
+      if (s.strstart !== 0) { header |= PRESET_DICT; }
+      header += 31 - (header % 31);
+
+      s.status = BUSY_STATE;
+      putShortMSB(s, header);
+
+      /* Save the adler32 of the preset dictionary: */
+      if (s.strstart !== 0) {
+        putShortMSB(s, strm.adler >>> 16);
+        putShortMSB(s, strm.adler & 0xffff);
+      }
+      strm.adler = 1; // adler32(0L, Z_NULL, 0);
+    }
+  }
+
+//#ifdef GZIP
+  if (s.status === EXTRA_STATE) {
+    if (s.gzhead.extra/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+
+      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            break;
+          }
+        }
+        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);
+        s.gzindex++;
+      }
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (s.gzindex === s.gzhead.extra.length) {
+        s.gzindex = 0;
+        s.status = NAME_STATE;
+      }
+    }
+    else {
+      s.status = NAME_STATE;
+    }
+  }
+  if (s.status === NAME_STATE) {
+    if (s.gzhead.name/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
+        }
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.name.length) {
+          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
+        }
+        put_byte(s, val);
+      } while (val !== 0);
+
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.gzindex = 0;
+        s.status = COMMENT_STATE;
+      }
+    }
+    else {
+      s.status = COMMENT_STATE;
+    }
+  }
+  if (s.status === COMMENT_STATE) {
+    if (s.gzhead.comment/* != Z_NULL*/) {
+      beg = s.pending;  /* start of bytes to update crc */
+      //int val;
+
+      do {
+        if (s.pending === s.pending_buf_size) {
+          if (s.gzhead.hcrc && s.pending > beg) {
+            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+          }
+          flush_pending(strm);
+          beg = s.pending;
+          if (s.pending === s.pending_buf_size) {
+            val = 1;
+            break;
+          }
+        }
+        // JS specific: little magic to add zero terminator to end of string
+        if (s.gzindex < s.gzhead.comment.length) {
+          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;
+        } else {
+          val = 0;
+        }
+        put_byte(s, val);
+      } while (val !== 0);
+
+      if (s.gzhead.hcrc && s.pending > beg) {
+        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
+      }
+      if (val === 0) {
+        s.status = HCRC_STATE;
+      }
+    }
+    else {
+      s.status = HCRC_STATE;
+    }
+  }
+  if (s.status === HCRC_STATE) {
+    if (s.gzhead.hcrc) {
+      if (s.pending + 2 > s.pending_buf_size) {
+        flush_pending(strm);
+      }
+      if (s.pending + 2 <= s.pending_buf_size) {
+        put_byte(s, strm.adler & 0xff);
+        put_byte(s, (strm.adler >> 8) & 0xff);
+        strm.adler = 0; //crc32(0L, Z_NULL, 0);
+        s.status = BUSY_STATE;
+      }
+    }
+    else {
+      s.status = BUSY_STATE;
+    }
+  }
+//#endif
+
+  /* Flush as much pending output as possible */
+  if (s.pending !== 0) {
+    flush_pending(strm);
+    if (strm.avail_out === 0) {
+      /* Since avail_out is 0, deflate will be called again with
+       * more output space, but possibly with both pending and
+       * avail_in equal to zero. There won't be anything to do,
+       * but this is not an error situation so make sure we
+       * return OK instead of BUF_ERROR at next call of deflate:
+       */
+      s.last_flush = -1;
+      return Z_OK;
+    }
+
+    /* Make sure there is something to do and avoid duplicate consecutive
+     * flushes. For repeated and useless calls with Z_FINISH, we keep
+     * returning Z_STREAM_END instead of Z_BUF_ERROR.
+     */
+  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
+    flush !== Z_FINISH) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* User must not provide more input after the first FINISH: */
+  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
+    return err(strm, Z_BUF_ERROR);
+  }
+
+  /* Start a new block or continue the current one.
+   */
+  if (strm.avail_in !== 0 || s.lookahead !== 0 ||
+    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {
+    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :
+      (s.strategy === Z_RLE ? deflate_rle(s, flush) :
+        configuration_table[s.level].func(s, flush));
+
+    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
+      s.status = FINISH_STATE;
+    }
+    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
+      if (strm.avail_out === 0) {
+        s.last_flush = -1;
+        /* avoid BUF_ERROR next call, see above */
+      }
+      return Z_OK;
+      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+       * of deflate should use the same flush parameter to make sure
+       * that the flush is complete. So we don't have to output an
+       * empty block here, this will be done at next call. This also
+       * ensures that for a very small output buffer, we emit at most
+       * one empty block.
+       */
+    }
+    if (bstate === BS_BLOCK_DONE) {
+      if (flush === Z_PARTIAL_FLUSH) {
+        trees._tr_align(s);
+      }
+      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+
+        trees._tr_stored_block(s, 0, 0, false);
+        /* For a full flush, this empty block will be recognized
+         * as a special marker by inflate_sync().
+         */
+        if (flush === Z_FULL_FLUSH) {
+          /*** CLEAR_HASH(s); ***/             /* forget history */
+          zero(s.head); // Fill with NIL (= 0);
+
+          if (s.lookahead === 0) {
+            s.strstart = 0;
+            s.block_start = 0;
+            s.insert = 0;
+          }
+        }
+      }
+      flush_pending(strm);
+      if (strm.avail_out === 0) {
+        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+        return Z_OK;
+      }
+    }
+  }
+  //Assert(strm->avail_out > 0, "bug2");
+  //if (strm.avail_out <= 0) { throw new Error("bug2");}
+
+  if (flush !== Z_FINISH) { return Z_OK; }
+  if (s.wrap <= 0) { return Z_STREAM_END; }
+
+  /* Write the trailer */
+  if (s.wrap === 2) {
+    put_byte(s, strm.adler & 0xff);
+    put_byte(s, (strm.adler >> 8) & 0xff);
+    put_byte(s, (strm.adler >> 16) & 0xff);
+    put_byte(s, (strm.adler >> 24) & 0xff);
+    put_byte(s, strm.total_in & 0xff);
+    put_byte(s, (strm.total_in >> 8) & 0xff);
+    put_byte(s, (strm.total_in >> 16) & 0xff);
+    put_byte(s, (strm.total_in >> 24) & 0xff);
+  }
+  else
+  {
+    putShortMSB(s, strm.adler >>> 16);
+    putShortMSB(s, strm.adler & 0xffff);
+  }
+
+  flush_pending(strm);
+  /* If avail_out is zero, the application will call deflate again
+   * to flush the rest.
+   */
+  if (s.wrap > 0) { s.wrap = -s.wrap; }
+  /* write the trailer only once! */
+  return s.pending !== 0 ? Z_OK : Z_STREAM_END;
+}
+
+function deflateEnd(strm) {
+  var status;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  status = strm.state.status;
+  if (status !== INIT_STATE &&
+    status !== EXTRA_STATE &&
+    status !== NAME_STATE &&
+    status !== COMMENT_STATE &&
+    status !== HCRC_STATE &&
+    status !== BUSY_STATE &&
+    status !== FINISH_STATE
+  ) {
+    return err(strm, Z_STREAM_ERROR);
+  }
+
+  strm.state = null;
+
+  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
+}
+
+
+/* =========================================================================
+ * Initializes the compression dictionary from the given byte
+ * sequence without producing any compressed output.
+ */
+function deflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var s;
+  var str, n;
+  var wrap;
+  var avail;
+  var next;
+  var input;
+  var tmpDict;
+
+  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  s = strm.state;
+  wrap = s.wrap;
+
+  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+  if (wrap === 1) {
+    /* adler32(strm->adler, dictionary, dictLength); */
+    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);
+  }
+
+  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */
+
+  /* if dictionary would fill window, just replace the history */
+  if (dictLength >= s.w_size) {
+    if (wrap === 0) {            /* already empty otherwise */
+      /*** CLEAR_HASH(s); ***/
+      zero(s.head); // Fill with NIL (= 0);
+      s.strstart = 0;
+      s.block_start = 0;
+      s.insert = 0;
+    }
+    /* use the tail */
+    // dictionary = dictionary.slice(dictLength - s.w_size);
+    tmpDict = new utils.Buf8(s.w_size);
+    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);
+    dictionary = tmpDict;
+    dictLength = s.w_size;
+  }
+  /* insert dictionary into window and hash */
+  avail = strm.avail_in;
+  next = strm.next_in;
+  input = strm.input;
+  strm.avail_in = dictLength;
+  strm.next_in = 0;
+  strm.input = dictionary;
+  fill_window(s);
+  while (s.lookahead >= MIN_MATCH) {
+    str = s.strstart;
+    n = s.lookahead - (MIN_MATCH - 1);
+    do {
+      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
+      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
+
+      s.prev[str & s.w_mask] = s.head[s.ins_h];
+
+      s.head[s.ins_h] = str;
+      str++;
+    } while (--n);
+    s.strstart = str;
+    s.lookahead = MIN_MATCH - 1;
+    fill_window(s);
+  }
+  s.strstart += s.lookahead;
+  s.block_start = s.strstart;
+  s.insert = s.lookahead;
+  s.lookahead = 0;
+  s.match_length = s.prev_length = MIN_MATCH - 1;
+  s.match_available = 0;
+  strm.next_in = next;
+  strm.input = input;
+  strm.avail_in = avail;
+  s.wrap = wrap;
+  return Z_OK;
+}
+
+
+export { deflateInit, deflateInit2, deflateReset, deflateResetKeep, deflateSetHeader, deflate, deflateEnd, deflateSetDictionary };
+export var deflateInfo = 'pako deflate (from Nodeca project)';
+
+/* Not implemented
+exports.deflateBound = deflateBound;
+exports.deflateCopy = deflateCopy;
+exports.deflateParams = deflateParams;
+exports.deflatePending = deflatePending;
+exports.deflatePrime = deflatePrime;
+exports.deflateTune = deflateTune;
+*/
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/gzheader.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/gzheader.js
new file mode 100644
index 0000000..2ec586d
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/gzheader.js
@@ -0,0 +1,35 @@
+export default function GZheader() {
+  /* true if compressed data believed to be text */
+  this.text       = 0;
+  /* modification time */
+  this.time       = 0;
+  /* extra flags (not used when writing a gzip file) */
+  this.xflags     = 0;
+  /* operating system */
+  this.os         = 0;
+  /* pointer to extra field or Z_NULL if none */
+  this.extra      = null;
+  /* extra field length (valid if extra != Z_NULL) */
+  this.extra_len  = 0; // Actually, we don't need it in JS,
+                       // but leave for few code modifications
+
+  //
+  // Setup limits is not necessary because in js we should not preallocate memory
+  // for inflate use constant limit in 65536 bytes
+  //
+
+  /* space at extra (only when reading header) */
+  // this.extra_max  = 0;
+  /* pointer to zero-terminated file name or Z_NULL */
+  this.name       = '';
+  /* space at name (only when reading header) */
+  // this.name_max   = 0;
+  /* pointer to zero-terminated comment or Z_NULL */
+  this.comment    = '';
+  /* space at comment (only when reading header) */
+  // this.comm_max   = 0;
+  /* true if there was or will be a header crc */
+  this.hcrc       = 0;
+  /* true when done reading gzip header (not used when writing a gzip file) */
+  this.done       = false;
+}
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/inffast.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inffast.js
new file mode 100644
index 0000000..889dcc7
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inffast.js
@@ -0,0 +1,324 @@
+// See state defs from inflate.js
+var BAD = 30;       /* got a data error -- remain here until reset */
+var TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+
+/*
+   Decode literal, length, and distance codes and write out the resulting
+   literal and match bytes until either not enough input or output is
+   available, an end-of-block is encountered, or a data error is encountered.
+   When large enough input and output buffers are supplied to inflate(), for
+   example, a 16K input buffer and a 64K output buffer, more than 95% of the
+   inflate execution time is spent in this routine.
+
+   Entry assumptions:
+
+        state.mode === LEN
+        strm.avail_in >= 6
+        strm.avail_out >= 258
+        start >= strm.avail_out
+        state.bits < 8
+
+   On return, state.mode is one of:
+
+        LEN -- ran out of enough output space or enough available input
+        TYPE -- reached end of block code, inflate() to interpret next block
+        BAD -- error in block data
+
+   Notes:
+
+    - The maximum input bits used by a length/distance pair is 15 bits for the
+      length code, 5 bits for the length extra, 15 bits for the distance code,
+      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.
+      Therefore if strm.avail_in >= 6, then there is enough input to avoid
+      checking for available input while decoding.
+
+    - The maximum bytes that a single length/distance pair can output is 258
+      bytes, which is the maximum length that can be coded.  inflate_fast()
+      requires strm.avail_out >= 258 for each loop to avoid checking for
+      output space.
+ */
+export default function inflate_fast(strm, start) {
+  var state;
+  var _in;                    /* local strm.input */
+  var last;                   /* have enough input while in < last */
+  var _out;                   /* local strm.output */
+  var beg;                    /* inflate()'s initial strm.output */
+  var end;                    /* while out < end, enough space available */
+//#ifdef INFLATE_STRICT
+  var dmax;                   /* maximum distance from zlib header */
+//#endif
+  var wsize;                  /* window size or zero if not using window */
+  var whave;                  /* valid bytes in the window */
+  var wnext;                  /* window write index */
+  // Use `s_window` instead `window`, avoid conflict with instrumentation tools
+  var s_window;               /* allocated sliding window, if wsize != 0 */
+  var hold;                   /* local strm.hold */
+  var bits;                   /* local strm.bits */
+  var lcode;                  /* local strm.lencode */
+  var dcode;                  /* local strm.distcode */
+  var lmask;                  /* mask for first level of length codes */
+  var dmask;                  /* mask for first level of distance codes */
+  var here;                   /* retrieved table entry */
+  var op;                     /* code bits, operation, extra bits, or */
+                              /*  window position, window bytes to copy */
+  var len;                    /* match length, unused bytes */
+  var dist;                   /* match distance */
+  var from;                   /* where to copy match from */
+  var from_source;
+
+
+  var input, output; // JS specific, because we have no pointers
+
+  /* copy state to local variables */
+  state = strm.state;
+  //here = state.here;
+  _in = strm.next_in;
+  input = strm.input;
+  last = _in + (strm.avail_in - 5);
+  _out = strm.next_out;
+  output = strm.output;
+  beg = _out - (start - strm.avail_out);
+  end = _out + (strm.avail_out - 257);
+//#ifdef INFLATE_STRICT
+  dmax = state.dmax;
+//#endif
+  wsize = state.wsize;
+  whave = state.whave;
+  wnext = state.wnext;
+  s_window = state.window;
+  hold = state.hold;
+  bits = state.bits;
+  lcode = state.lencode;
+  dcode = state.distcode;
+  lmask = (1 << state.lenbits) - 1;
+  dmask = (1 << state.distbits) - 1;
+
+
+  /* decode literals and length/distances until end-of-block or not enough
+     input data or output space */
+
+  top:
+  do {
+    if (bits < 15) {
+      hold += input[_in++] << bits;
+      bits += 8;
+      hold += input[_in++] << bits;
+      bits += 8;
+    }
+
+    here = lcode[hold & lmask];
+
+    dolen:
+    for (;;) { // Goto emulation
+      op = here >>> 24/*here.bits*/;
+      hold >>>= op;
+      bits -= op;
+      op = (here >>> 16) & 0xff/*here.op*/;
+      if (op === 0) {                          /* literal */
+        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+        //        "inflate:         literal '%c'\n" :
+        //        "inflate:         literal 0x%02x\n", here.val));
+        output[_out++] = here & 0xffff/*here.val*/;
+      }
+      else if (op & 16) {                     /* length base */
+        len = here & 0xffff/*here.val*/;
+        op &= 15;                           /* number of extra bits */
+        if (op) {
+          if (bits < op) {
+            hold += input[_in++] << bits;
+            bits += 8;
+          }
+          len += hold & ((1 << op) - 1);
+          hold >>>= op;
+          bits -= op;
+        }
+        //Tracevv((stderr, "inflate:         length %u\n", len));
+        if (bits < 15) {
+          hold += input[_in++] << bits;
+          bits += 8;
+          hold += input[_in++] << bits;
+          bits += 8;
+        }
+        here = dcode[hold & dmask];
+
+        dodist:
+        for (;;) { // goto emulation
+          op = here >>> 24/*here.bits*/;
+          hold >>>= op;
+          bits -= op;
+          op = (here >>> 16) & 0xff/*here.op*/;
+
+          if (op & 16) {                      /* distance base */
+            dist = here & 0xffff/*here.val*/;
+            op &= 15;                       /* number of extra bits */
+            if (bits < op) {
+              hold += input[_in++] << bits;
+              bits += 8;
+              if (bits < op) {
+                hold += input[_in++] << bits;
+                bits += 8;
+              }
+            }
+            dist += hold & ((1 << op) - 1);
+//#ifdef INFLATE_STRICT
+            if (dist > dmax) {
+              strm.msg = 'invalid distance too far back';
+              state.mode = BAD;
+              break top;
+            }
+//#endif
+            hold >>>= op;
+            bits -= op;
+            //Tracevv((stderr, "inflate:         distance %u\n", dist));
+            op = _out - beg;                /* max distance in output */
+            if (dist > op) {                /* see if copy from window */
+              op = dist - op;               /* distance back in window */
+              if (op > whave) {
+                if (state.sane) {
+                  strm.msg = 'invalid distance too far back';
+                  state.mode = BAD;
+                  break top;
+                }
+
+// (!) This block is disabled in zlib defailts,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//                if (len <= op - whave) {
+//                  do {
+//                    output[_out++] = 0;
+//                  } while (--len);
+//                  continue top;
+//                }
+//                len -= op - whave;
+//                do {
+//                  output[_out++] = 0;
+//                } while (--op > whave);
+//                if (op === 0) {
+//                  from = _out - dist;
+//                  do {
+//                    output[_out++] = output[from++];
+//                  } while (--len);
+//                  continue top;
+//                }
+//#endif
+              }
+              from = 0; // window index
+              from_source = s_window;
+              if (wnext === 0) {           /* very common case */
+                from += wsize - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              else if (wnext < op) {      /* wrap around window */
+                from += wsize + wnext - op;
+                op -= wnext;
+                if (op < len) {         /* some from end of window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = 0;
+                  if (wnext < len) {  /* some from start of window */
+                    op = wnext;
+                    len -= op;
+                    do {
+                      output[_out++] = s_window[from++];
+                    } while (--op);
+                    from = _out - dist;      /* rest from output */
+                    from_source = output;
+                  }
+                }
+              }
+              else {                      /* contiguous in window */
+                from += wnext - op;
+                if (op < len) {         /* some from window */
+                  len -= op;
+                  do {
+                    output[_out++] = s_window[from++];
+                  } while (--op);
+                  from = _out - dist;  /* rest from output */
+                  from_source = output;
+                }
+              }
+              while (len > 2) {
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                output[_out++] = from_source[from++];
+                len -= 3;
+              }
+              if (len) {
+                output[_out++] = from_source[from++];
+                if (len > 1) {
+                  output[_out++] = from_source[from++];
+                }
+              }
+            }
+            else {
+              from = _out - dist;          /* copy direct from output */
+              do {                        /* minimum length is three */
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                output[_out++] = output[from++];
+                len -= 3;
+              } while (len > 2);
+              if (len) {
+                output[_out++] = output[from++];
+                if (len > 1) {
+                  output[_out++] = output[from++];
+                }
+              }
+            }
+          }
+          else if ((op & 64) === 0) {          /* 2nd level distance code */
+            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+            continue dodist;
+          }
+          else {
+            strm.msg = 'invalid distance code';
+            state.mode = BAD;
+            break top;
+          }
+
+          break; // need to emulate goto via "continue"
+        }
+      }
+      else if ((op & 64) === 0) {              /* 2nd level length code */
+        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];
+        continue dolen;
+      }
+      else if (op & 32) {                     /* end-of-block */
+        //Tracevv((stderr, "inflate:         end of block\n"));
+        state.mode = TYPE;
+        break top;
+      }
+      else {
+        strm.msg = 'invalid literal/length code';
+        state.mode = BAD;
+        break top;
+      }
+
+      break; // need to emulate goto via "continue"
+    }
+  } while (_in < last && _out < end);
+
+  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+  len = bits >> 3;
+  _in -= len;
+  bits -= len << 3;
+  hold &= (1 << bits) - 1;
+
+  /* update state and return */
+  strm.next_in = _in;
+  strm.next_out = _out;
+  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));
+  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));
+  state.hold = hold;
+  state.bits = bits;
+  return;
+};
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/inflate.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inflate.js
new file mode 100644
index 0000000..1d2063b
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inflate.js
@@ -0,0 +1,1527 @@
+import * as utils from "../utils/common.js";
+import adler32 from "./adler32.js";
+import crc32 from "./crc32.js";
+import inflate_fast from "./inffast.js";
+import inflate_table from "./inftrees.js";
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+/* Allowed flush values; see deflate() and inflate() below for details */
+//export const Z_NO_FLUSH      = 0;
+//export const Z_PARTIAL_FLUSH = 1;
+//export const Z_SYNC_FLUSH    = 2;
+//export const Z_FULL_FLUSH    = 3;
+export const Z_FINISH        = 4;
+export const Z_BLOCK         = 5;
+export const Z_TREES         = 6;
+
+
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+export const Z_OK            = 0;
+export const Z_STREAM_END    = 1;
+export const Z_NEED_DICT     = 2;
+//export const Z_ERRNO         = -1;
+export const Z_STREAM_ERROR  = -2;
+export const Z_DATA_ERROR    = -3;
+export const Z_MEM_ERROR     = -4;
+export const Z_BUF_ERROR     = -5;
+//export const Z_VERSION_ERROR = -6;
+
+/* The deflate compression method */
+export const Z_DEFLATED  = 8;
+
+
+/* STATES ====================================================================*/
+/* ===========================================================================*/
+
+
+var    HEAD = 1;       /* i: waiting for magic header */
+var    FLAGS = 2;      /* i: waiting for method and flags (gzip) */
+var    TIME = 3;       /* i: waiting for modification time (gzip) */
+var    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */
+var    EXLEN = 5;      /* i: waiting for extra length (gzip) */
+var    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */
+var    NAME = 7;       /* i: waiting for end of file name (gzip) */
+var    COMMENT = 8;    /* i: waiting for end of comment (gzip) */
+var    HCRC = 9;       /* i: waiting for header crc (gzip) */
+var    DICTID = 10;    /* i: waiting for dictionary check value */
+var    DICT = 11;      /* waiting for inflateSetDictionary() call */
+var        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */
+var        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */
+var        STORED = 14;    /* i: waiting for stored size (length and complement) */
+var        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */
+var        COPY = 16;      /* i/o: waiting for input or output to copy stored block */
+var        TABLE = 17;     /* i: waiting for dynamic block table lengths */
+var        LENLENS = 18;   /* i: waiting for code length code lengths */
+var        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */
+var            LEN_ = 20;      /* i: same as LEN below, but only first time in */
+var            LEN = 21;       /* i: waiting for length/lit/eob code */
+var            LENEXT = 22;    /* i: waiting for length extra bits */
+var            DIST = 23;      /* i: waiting for distance code */
+var            DISTEXT = 24;   /* i: waiting for distance extra bits */
+var            MATCH = 25;     /* o: waiting for output space to copy string */
+var            LIT = 26;       /* o: waiting for output space to write literal */
+var    CHECK = 27;     /* i: waiting for 32-bit check value */
+var    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */
+var    DONE = 29;      /* finished check, done -- remain here until reset */
+var    BAD = 30;       /* got a data error -- remain here until reset */
+var    MEM = 31;       /* got an inflate() memory error -- remain here until reset */
+var    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */
+
+/* ===========================================================================*/
+
+
+
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);
+
+var MAX_WBITS = 15;
+/* 32K LZ77 window */
+var DEF_WBITS = MAX_WBITS;
+
+
+function zswap32(q) {
+  return  (((q >>> 24) & 0xff) +
+          ((q >>> 8) & 0xff00) +
+          ((q & 0xff00) << 8) +
+          ((q & 0xff) << 24));
+}
+
+
+function InflateState() {
+  this.mode = 0;             /* current inflate mode */
+  this.last = false;          /* true if processing last block */
+  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */
+  this.havedict = false;      /* true if dictionary provided */
+  this.flags = 0;             /* gzip header method and flags (0 if zlib) */
+  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */
+  this.check = 0;             /* protected copy of check value */
+  this.total = 0;             /* protected copy of output count */
+  // TODO: may be {}
+  this.head = null;           /* where to save gzip header information */
+
+  /* sliding window */
+  this.wbits = 0;             /* log base 2 of requested window size */
+  this.wsize = 0;             /* window size or zero if not using window */
+  this.whave = 0;             /* valid bytes in the window */
+  this.wnext = 0;             /* window write index */
+  this.window = null;         /* allocated sliding window, if needed */
+
+  /* bit accumulator */
+  this.hold = 0;              /* input bit accumulator */
+  this.bits = 0;              /* number of bits in "in" */
+
+  /* for string and stored block copying */
+  this.length = 0;            /* literal or length of data to copy */
+  this.offset = 0;            /* distance back to copy string from */
+
+  /* for table and code decoding */
+  this.extra = 0;             /* extra bits needed */
+
+  /* fixed and dynamic code tables */
+  this.lencode = null;          /* starting table for length/literal codes */
+  this.distcode = null;         /* starting table for distance codes */
+  this.lenbits = 0;           /* index bits for lencode */
+  this.distbits = 0;          /* index bits for distcode */
+
+  /* dynamic table building */
+  this.ncode = 0;             /* number of code length code lengths */
+  this.nlen = 0;              /* number of length code lengths */
+  this.ndist = 0;             /* number of distance code lengths */
+  this.have = 0;              /* number of code lengths in lens[] */
+  this.next = null;              /* next available space in codes[] */
+
+  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */
+  this.work = new utils.Buf16(288); /* work area for code table building */
+
+  /*
+   because we don't have pointers in js, we use lencode and distcode directly
+   as buffers so we don't need codes
+  */
+  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */
+  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */
+  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */
+  this.sane = 0;                   /* if false, allow invalid distance too far */
+  this.back = 0;                   /* bits back of last unprocessed length/lit */
+  this.was = 0;                    /* initial length of match */
+}
+
+function inflateResetKeep(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  strm.total_in = strm.total_out = state.total = 0;
+  strm.msg = ''; /*Z_NULL*/
+  if (state.wrap) {       /* to support ill-conceived Java test suite */
+    strm.adler = state.wrap & 1;
+  }
+  state.mode = HEAD;
+  state.last = 0;
+  state.havedict = 0;
+  state.dmax = 32768;
+  state.head = null/*Z_NULL*/;
+  state.hold = 0;
+  state.bits = 0;
+  //state.lencode = state.distcode = state.next = state.codes;
+  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
+  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
+
+  state.sane = 1;
+  state.back = -1;
+  //Tracev((stderr, "inflate: reset\n"));
+  return Z_OK;
+}
+
+function inflateReset(strm) {
+  var state;
+
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  state.wsize = 0;
+  state.whave = 0;
+  state.wnext = 0;
+  return inflateResetKeep(strm);
+
+}
+
+function inflateReset2(strm, windowBits) {
+  var wrap;
+  var state;
+
+  /* get the state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  /* extract wrap request from windowBits parameter */
+  if (windowBits < 0) {
+    wrap = 0;
+    windowBits = -windowBits;
+  }
+  else {
+    wrap = (windowBits >> 4) + 1;
+    if (windowBits < 48) {
+      windowBits &= 15;
+    }
+  }
+
+  /* set number of window bits, free window if different */
+  if (windowBits && (windowBits < 8 || windowBits > 15)) {
+    return Z_STREAM_ERROR;
+  }
+  if (state.window !== null && state.wbits !== windowBits) {
+    state.window = null;
+  }
+
+  /* update state and reset the rest of it */
+  state.wrap = wrap;
+  state.wbits = windowBits;
+  return inflateReset(strm);
+}
+
+function inflateInit2(strm, windowBits) {
+  var ret;
+  var state;
+
+  if (!strm) { return Z_STREAM_ERROR; }
+  //strm.msg = Z_NULL;                 /* in case we return an error */
+
+  state = new InflateState();
+
+  //if (state === Z_NULL) return Z_MEM_ERROR;
+  //Tracev((stderr, "inflate: allocated\n"));
+  strm.state = state;
+  state.window = null/*Z_NULL*/;
+  ret = inflateReset2(strm, windowBits);
+  if (ret !== Z_OK) {
+    strm.state = null/*Z_NULL*/;
+  }
+  return ret;
+}
+
+function inflateInit(strm) {
+  return inflateInit2(strm, DEF_WBITS);
+}
+
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding.  Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter.  This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time.  However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+var virgin = true;
+
+var lenfix, distfix; // We have no pointers in JS, so keep tables separate
+
+function fixedtables(state) {
+  /* build fixed huffman tables if first call (may not be thread safe) */
+  if (virgin) {
+    var sym;
+
+    lenfix = new utils.Buf32(512);
+    distfix = new utils.Buf32(32);
+
+    /* literal/length table */
+    sym = 0;
+    while (sym < 144) { state.lens[sym++] = 8; }
+    while (sym < 256) { state.lens[sym++] = 9; }
+    while (sym < 280) { state.lens[sym++] = 7; }
+    while (sym < 288) { state.lens[sym++] = 8; }
+
+    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });
+
+    /* distance table */
+    sym = 0;
+    while (sym < 32) { state.lens[sym++] = 5; }
+
+    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });
+
+    /* do this just once */
+    virgin = false;
+  }
+
+  state.lencode = lenfix;
+  state.lenbits = 9;
+  state.distcode = distfix;
+  state.distbits = 5;
+}
+
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning.  If window does not exist yet, create it.  This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
+ */
+function updatewindow(strm, src, end, copy) {
+  var dist;
+  var state = strm.state;
+
+  /* if it hasn't been done already, allocate space for the window */
+  if (state.window === null) {
+    state.wsize = 1 << state.wbits;
+    state.wnext = 0;
+    state.whave = 0;
+
+    state.window = new utils.Buf8(state.wsize);
+  }
+
+  /* copy state->wsize or less output bytes into the circular window */
+  if (copy >= state.wsize) {
+    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
+    state.wnext = 0;
+    state.whave = state.wsize;
+  }
+  else {
+    dist = state.wsize - state.wnext;
+    if (dist > copy) {
+      dist = copy;
+    }
+    //zmemcpy(state->window + state->wnext, end - copy, dist);
+    utils.arraySet(state.window, src, end - copy, dist, state.wnext);
+    copy -= dist;
+    if (copy) {
+      //zmemcpy(state->window, end - copy, copy);
+      utils.arraySet(state.window, src, end - copy, copy, 0);
+      state.wnext = copy;
+      state.whave = state.wsize;
+    }
+    else {
+      state.wnext += dist;
+      if (state.wnext === state.wsize) { state.wnext = 0; }
+      if (state.whave < state.wsize) { state.whave += dist; }
+    }
+  }
+  return 0;
+}
+
+function inflate(strm, flush) {
+  var state;
+  var input, output;          // input/output buffers
+  var next;                   /* next input INDEX */
+  var put;                    /* next output INDEX */
+  var have, left;             /* available input and output */
+  var hold;                   /* bit buffer */
+  var bits;                   /* bits in bit buffer */
+  var _in, _out;              /* save starting available input and output */
+  var copy;                   /* number of stored or match bytes to copy */
+  var from;                   /* where to copy match bytes from */
+  var from_source;
+  var here = 0;               /* current decoding table entry */
+  var here_bits, here_op, here_val; // paked "here" denormalized (JS specific)
+  //var last;                   /* parent table entry */
+  var last_bits, last_op, last_val; // paked "last" denormalized (JS specific)
+  var len;                    /* length to copy for repeats, bits to drop */
+  var ret;                    /* return code */
+  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */
+  var opts;
+
+  var n; // temporary var for NEED_BITS
+
+  var order = /* permutation of code lengths */
+    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];
+
+
+  if (!strm || !strm.state || !strm.output ||
+      (!strm.input && strm.avail_in !== 0)) {
+    return Z_STREAM_ERROR;
+  }
+
+  state = strm.state;
+  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */
+
+
+  //--- LOAD() ---
+  put = strm.next_out;
+  output = strm.output;
+  left = strm.avail_out;
+  next = strm.next_in;
+  input = strm.input;
+  have = strm.avail_in;
+  hold = state.hold;
+  bits = state.bits;
+  //---
+
+  _in = have;
+  _out = left;
+  ret = Z_OK;
+
+  inf_leave: // goto emulation
+  for (;;) {
+    switch (state.mode) {
+    case HEAD:
+      if (state.wrap === 0) {
+        state.mode = TYPEDO;
+        break;
+      }
+      //=== NEEDBITS(16);
+      while (bits < 16) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */
+        state.check = 0/*crc32(0L, Z_NULL, 0)*/;
+        //=== CRC2(state.check, hold);
+        hbuf[0] = hold & 0xff;
+        hbuf[1] = (hold >>> 8) & 0xff;
+        state.check = crc32(state.check, hbuf, 2, 0);
+        //===//
+
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        state.mode = FLAGS;
+        break;
+      }
+      state.flags = 0;           /* expect zlib header */
+      if (state.head) {
+        state.head.done = false;
+      }
+      if (!(state.wrap & 1) ||   /* check if zlib header allowed */
+        (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {
+        strm.msg = 'incorrect header check';
+        state.mode = BAD;
+        break;
+      }
+      if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {
+        strm.msg = 'unknown compression method';
+        state.mode = BAD;
+        break;
+      }
+      //--- DROPBITS(4) ---//
+      hold >>>= 4;
+      bits -= 4;
+      //---//
+      len = (hold & 0x0f)/*BITS(4)*/ + 8;
+      if (state.wbits === 0) {
+        state.wbits = len;
+      }
+      else if (len > state.wbits) {
+        strm.msg = 'invalid window size';
+        state.mode = BAD;
+        break;
+      }
+      state.dmax = 1 << len;
+      //Tracev((stderr, "inflate:   zlib header ok\n"));
+      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+      state.mode = hold & 0x200 ? DICTID : TYPE;
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      break;
+    case FLAGS:
+      //=== NEEDBITS(16); */
+      while (bits < 16) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      state.flags = hold;
+      if ((state.flags & 0xff) !== Z_DEFLATED) {
+        strm.msg = 'unknown compression method';
+        state.mode = BAD;
+        break;
+      }
+      if (state.flags & 0xe000) {
+        strm.msg = 'unknown header flags set';
+        state.mode = BAD;
+        break;
+      }
+      if (state.head) {
+        state.head.text = ((hold >> 8) & 1);
+      }
+      if (state.flags & 0x0200) {
+        //=== CRC2(state.check, hold);
+        hbuf[0] = hold & 0xff;
+        hbuf[1] = (hold >>> 8) & 0xff;
+        state.check = crc32(state.check, hbuf, 2, 0);
+        //===//
+      }
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      state.mode = TIME;
+      /* falls through */
+    case TIME:
+      //=== NEEDBITS(32); */
+      while (bits < 32) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      if (state.head) {
+        state.head.time = hold;
+      }
+      if (state.flags & 0x0200) {
+        //=== CRC4(state.check, hold)
+        hbuf[0] = hold & 0xff;
+        hbuf[1] = (hold >>> 8) & 0xff;
+        hbuf[2] = (hold >>> 16) & 0xff;
+        hbuf[3] = (hold >>> 24) & 0xff;
+        state.check = crc32(state.check, hbuf, 4, 0);
+        //===
+      }
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      state.mode = OS;
+      /* falls through */
+    case OS:
+      //=== NEEDBITS(16); */
+      while (bits < 16) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      if (state.head) {
+        state.head.xflags = (hold & 0xff);
+        state.head.os = (hold >> 8);
+      }
+      if (state.flags & 0x0200) {
+        //=== CRC2(state.check, hold);
+        hbuf[0] = hold & 0xff;
+        hbuf[1] = (hold >>> 8) & 0xff;
+        state.check = crc32(state.check, hbuf, 2, 0);
+        //===//
+      }
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      state.mode = EXLEN;
+      /* falls through */
+    case EXLEN:
+      if (state.flags & 0x0400) {
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.length = hold;
+        if (state.head) {
+          state.head.extra_len = hold;
+        }
+        if (state.flags & 0x0200) {
+          //=== CRC2(state.check, hold);
+          hbuf[0] = hold & 0xff;
+          hbuf[1] = (hold >>> 8) & 0xff;
+          state.check = crc32(state.check, hbuf, 2, 0);
+          //===//
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+      }
+      else if (state.head) {
+        state.head.extra = null/*Z_NULL*/;
+      }
+      state.mode = EXTRA;
+      /* falls through */
+    case EXTRA:
+      if (state.flags & 0x0400) {
+        copy = state.length;
+        if (copy > have) { copy = have; }
+        if (copy) {
+          if (state.head) {
+            len = state.head.extra_len - state.length;
+            if (!state.head.extra) {
+              // Use untyped array for more conveniend processing later
+              state.head.extra = new Array(state.head.extra_len);
+            }
+            utils.arraySet(
+              state.head.extra,
+              input,
+              next,
+              // extra field is limited to 65536 bytes
+              // - no need for additional size check
+              copy,
+              /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
+              len
+            );
+            //zmemcpy(state.head.extra + len, next,
+            //        len + copy > state.head.extra_max ?
+            //        state.head.extra_max - len : copy);
+          }
+          if (state.flags & 0x0200) {
+            state.check = crc32(state.check, input, copy, next);
+          }
+          have -= copy;
+          next += copy;
+          state.length -= copy;
+        }
+        if (state.length) { break inf_leave; }
+      }
+      state.length = 0;
+      state.mode = NAME;
+      /* falls through */
+    case NAME:
+      if (state.flags & 0x0800) {
+        if (have === 0) { break inf_leave; }
+        copy = 0;
+        do {
+          // TODO: 2 or 1 bytes?
+          len = input[next + copy++];
+          /* use constant limit because in js we should not preallocate memory */
+          if (state.head && len &&
+              (state.length < 65536 /*state.head.name_max*/)) {
+            state.head.name += String.fromCharCode(len);
+          }
+        } while (len && copy < have);
+
+        if (state.flags & 0x0200) {
+          state.check = crc32(state.check, input, copy, next);
+        }
+        have -= copy;
+        next += copy;
+        if (len) { break inf_leave; }
+      }
+      else if (state.head) {
+        state.head.name = null;
+      }
+      state.length = 0;
+      state.mode = COMMENT;
+      /* falls through */
+    case COMMENT:
+      if (state.flags & 0x1000) {
+        if (have === 0) { break inf_leave; }
+        copy = 0;
+        do {
+          len = input[next + copy++];
+          /* use constant limit because in js we should not preallocate memory */
+          if (state.head && len &&
+              (state.length < 65536 /*state.head.comm_max*/)) {
+            state.head.comment += String.fromCharCode(len);
+          }
+        } while (len && copy < have);
+        if (state.flags & 0x0200) {
+          state.check = crc32(state.check, input, copy, next);
+        }
+        have -= copy;
+        next += copy;
+        if (len) { break inf_leave; }
+      }
+      else if (state.head) {
+        state.head.comment = null;
+      }
+      state.mode = HCRC;
+      /* falls through */
+    case HCRC:
+      if (state.flags & 0x0200) {
+        //=== NEEDBITS(16); */
+        while (bits < 16) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (hold !== (state.check & 0xffff)) {
+          strm.msg = 'header crc mismatch';
+          state.mode = BAD;
+          break;
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+      }
+      if (state.head) {
+        state.head.hcrc = ((state.flags >> 9) & 1);
+        state.head.done = true;
+      }
+      strm.adler = state.check = 0;
+      state.mode = TYPE;
+      break;
+    case DICTID:
+      //=== NEEDBITS(32); */
+      while (bits < 32) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      strm.adler = state.check = zswap32(hold);
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      state.mode = DICT;
+      /* falls through */
+    case DICT:
+      if (state.havedict === 0) {
+        //--- RESTORE() ---
+        strm.next_out = put;
+        strm.avail_out = left;
+        strm.next_in = next;
+        strm.avail_in = have;
+        state.hold = hold;
+        state.bits = bits;
+        //---
+        return Z_NEED_DICT;
+      }
+      strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;
+      state.mode = TYPE;
+      /* falls through */
+    case TYPE:
+      if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }
+      /* falls through */
+    case TYPEDO:
+      if (state.last) {
+        //--- BYTEBITS() ---//
+        hold >>>= bits & 7;
+        bits -= bits & 7;
+        //---//
+        state.mode = CHECK;
+        break;
+      }
+      //=== NEEDBITS(3); */
+      while (bits < 3) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      state.last = (hold & 0x01)/*BITS(1)*/;
+      //--- DROPBITS(1) ---//
+      hold >>>= 1;
+      bits -= 1;
+      //---//
+
+      switch ((hold & 0x03)/*BITS(2)*/) {
+      case 0:                             /* stored block */
+        //Tracev((stderr, "inflate:     stored block%s\n",
+        //        state.last ? " (last)" : ""));
+        state.mode = STORED;
+        break;
+      case 1:                             /* fixed block */
+        fixedtables(state);
+        //Tracev((stderr, "inflate:     fixed codes block%s\n",
+        //        state.last ? " (last)" : ""));
+        state.mode = LEN_;             /* decode codes */
+        if (flush === Z_TREES) {
+          //--- DROPBITS(2) ---//
+          hold >>>= 2;
+          bits -= 2;
+          //---//
+          break inf_leave;
+        }
+        break;
+      case 2:                             /* dynamic block */
+        //Tracev((stderr, "inflate:     dynamic codes block%s\n",
+        //        state.last ? " (last)" : ""));
+        state.mode = TABLE;
+        break;
+      case 3:
+        strm.msg = 'invalid block type';
+        state.mode = BAD;
+      }
+      //--- DROPBITS(2) ---//
+      hold >>>= 2;
+      bits -= 2;
+      //---//
+      break;
+    case STORED:
+      //--- BYTEBITS() ---// /* go to byte boundary */
+      hold >>>= bits & 7;
+      bits -= bits & 7;
+      //---//
+      //=== NEEDBITS(32); */
+      while (bits < 32) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {
+        strm.msg = 'invalid stored block lengths';
+        state.mode = BAD;
+        break;
+      }
+      state.length = hold & 0xffff;
+      //Tracev((stderr, "inflate:       stored length %u\n",
+      //        state.length));
+      //=== INITBITS();
+      hold = 0;
+      bits = 0;
+      //===//
+      state.mode = COPY_;
+      if (flush === Z_TREES) { break inf_leave; }
+      /* falls through */
+    case COPY_:
+      state.mode = COPY;
+      /* falls through */
+    case COPY:
+      copy = state.length;
+      if (copy) {
+        if (copy > have) { copy = have; }
+        if (copy > left) { copy = left; }
+        if (copy === 0) { break inf_leave; }
+        //--- zmemcpy(put, next, copy); ---
+        utils.arraySet(output, input, next, copy, put);
+        //---//
+        have -= copy;
+        next += copy;
+        left -= copy;
+        put += copy;
+        state.length -= copy;
+        break;
+      }
+      //Tracev((stderr, "inflate:       stored end\n"));
+      state.mode = TYPE;
+      break;
+    case TABLE:
+      //=== NEEDBITS(14); */
+      while (bits < 14) {
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+      }
+      //===//
+      state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;
+      //--- DROPBITS(5) ---//
+      hold >>>= 5;
+      bits -= 5;
+      //---//
+      state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;
+      //--- DROPBITS(5) ---//
+      hold >>>= 5;
+      bits -= 5;
+      //---//
+      state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;
+      //--- DROPBITS(4) ---//
+      hold >>>= 4;
+      bits -= 4;
+      //---//
+//#ifndef PKZIP_BUG_WORKAROUND
+      if (state.nlen > 286 || state.ndist > 30) {
+        strm.msg = 'too many length or distance symbols';
+        state.mode = BAD;
+        break;
+      }
+//#endif
+      //Tracev((stderr, "inflate:       table sizes ok\n"));
+      state.have = 0;
+      state.mode = LENLENS;
+      /* falls through */
+    case LENLENS:
+      while (state.have < state.ncode) {
+        //=== NEEDBITS(3);
+        while (bits < 3) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);
+        //--- DROPBITS(3) ---//
+        hold >>>= 3;
+        bits -= 3;
+        //---//
+      }
+      while (state.have < 19) {
+        state.lens[order[state.have++]] = 0;
+      }
+      // We have separate tables & no pointers. 2 commented lines below not needed.
+      //state.next = state.codes;
+      //state.lencode = state.next;
+      // Switch to use dynamic table
+      state.lencode = state.lendyn;
+      state.lenbits = 7;
+
+      opts = { bits: state.lenbits };
+      ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
+      state.lenbits = opts.bits;
+
+      if (ret) {
+        strm.msg = 'invalid code lengths set';
+        state.mode = BAD;
+        break;
+      }
+      //Tracev((stderr, "inflate:       code lengths ok\n"));
+      state.have = 0;
+      state.mode = CODELENS;
+      /* falls through */
+    case CODELENS:
+      while (state.have < state.nlen + state.ndist) {
+        for (;;) {
+          here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if ((here_bits) <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        if (here_val < 16) {
+          //--- DROPBITS(here.bits) ---//
+          hold >>>= here_bits;
+          bits -= here_bits;
+          //---//
+          state.lens[state.have++] = here_val;
+        }
+        else {
+          if (here_val === 16) {
+            //=== NEEDBITS(here.bits + 2);
+            n = here_bits + 2;
+            while (bits < n) {
+              if (have === 0) { break inf_leave; }
+              have--;
+              hold += input[next++] << bits;
+              bits += 8;
+            }
+            //===//
+            //--- DROPBITS(here.bits) ---//
+            hold >>>= here_bits;
+            bits -= here_bits;
+            //---//
+            if (state.have === 0) {
+              strm.msg = 'invalid bit length repeat';
+              state.mode = BAD;
+              break;
+            }
+            len = state.lens[state.have - 1];
+            copy = 3 + (hold & 0x03);//BITS(2);
+            //--- DROPBITS(2) ---//
+            hold >>>= 2;
+            bits -= 2;
+            //---//
+          }
+          else if (here_val === 17) {
+            //=== NEEDBITS(here.bits + 3);
+            n = here_bits + 3;
+            while (bits < n) {
+              if (have === 0) { break inf_leave; }
+              have--;
+              hold += input[next++] << bits;
+              bits += 8;
+            }
+            //===//
+            //--- DROPBITS(here.bits) ---//
+            hold >>>= here_bits;
+            bits -= here_bits;
+            //---//
+            len = 0;
+            copy = 3 + (hold & 0x07);//BITS(3);
+            //--- DROPBITS(3) ---//
+            hold >>>= 3;
+            bits -= 3;
+            //---//
+          }
+          else {
+            //=== NEEDBITS(here.bits + 7);
+            n = here_bits + 7;
+            while (bits < n) {
+              if (have === 0) { break inf_leave; }
+              have--;
+              hold += input[next++] << bits;
+              bits += 8;
+            }
+            //===//
+            //--- DROPBITS(here.bits) ---//
+            hold >>>= here_bits;
+            bits -= here_bits;
+            //---//
+            len = 0;
+            copy = 11 + (hold & 0x7f);//BITS(7);
+            //--- DROPBITS(7) ---//
+            hold >>>= 7;
+            bits -= 7;
+            //---//
+          }
+          if (state.have + copy > state.nlen + state.ndist) {
+            strm.msg = 'invalid bit length repeat';
+            state.mode = BAD;
+            break;
+          }
+          while (copy--) {
+            state.lens[state.have++] = len;
+          }
+        }
+      }
+
+      /* handle error breaks in while */
+      if (state.mode === BAD) { break; }
+
+      /* check for end-of-block code (better have one) */
+      if (state.lens[256] === 0) {
+        strm.msg = 'invalid code -- missing end-of-block';
+        state.mode = BAD;
+        break;
+      }
+
+      /* build code tables -- note: do not change the lenbits or distbits
+         values here (9 and 6) without reading the comments in inftrees.h
+         concerning the ENOUGH constants, which depend on those values */
+      state.lenbits = 9;
+
+      opts = { bits: state.lenbits };
+      ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
+      // We have separate tables & no pointers. 2 commented lines below not needed.
+      // state.next_index = opts.table_index;
+      state.lenbits = opts.bits;
+      // state.lencode = state.next;
+
+      if (ret) {
+        strm.msg = 'invalid literal/lengths set';
+        state.mode = BAD;
+        break;
+      }
+
+      state.distbits = 6;
+      //state.distcode.copy(state.codes);
+      // Switch to use dynamic table
+      state.distcode = state.distdyn;
+      opts = { bits: state.distbits };
+      ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
+      // We have separate tables & no pointers. 2 commented lines below not needed.
+      // state.next_index = opts.table_index;
+      state.distbits = opts.bits;
+      // state.distcode = state.next;
+
+      if (ret) {
+        strm.msg = 'invalid distances set';
+        state.mode = BAD;
+        break;
+      }
+      //Tracev((stderr, 'inflate:       codes ok\n'));
+      state.mode = LEN_;
+      if (flush === Z_TREES) { break inf_leave; }
+      /* falls through */
+    case LEN_:
+      state.mode = LEN;
+      /* falls through */
+    case LEN:
+      if (have >= 6 && left >= 258) {
+        //--- RESTORE() ---
+        strm.next_out = put;
+        strm.avail_out = left;
+        strm.next_in = next;
+        strm.avail_in = have;
+        state.hold = hold;
+        state.bits = bits;
+        //---
+        inflate_fast(strm, _out);
+        //--- LOAD() ---
+        put = strm.next_out;
+        output = strm.output;
+        left = strm.avail_out;
+        next = strm.next_in;
+        input = strm.input;
+        have = strm.avail_in;
+        hold = state.hold;
+        bits = state.bits;
+        //---
+
+        if (state.mode === TYPE) {
+          state.back = -1;
+        }
+        break;
+      }
+      state.back = 0;
+      for (;;) {
+        here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/
+        here_bits = here >>> 24;
+        here_op = (here >>> 16) & 0xff;
+        here_val = here & 0xffff;
+
+        if (here_bits <= bits) { break; }
+        //--- PULLBYTE() ---//
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+        //---//
+      }
+      if (here_op && (here_op & 0xf0) === 0) {
+        last_bits = here_bits;
+        last_op = here_op;
+        last_val = here_val;
+        for (;;) {
+          here = state.lencode[last_val +
+                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if ((last_bits + here_bits) <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        //--- DROPBITS(last.bits) ---//
+        hold >>>= last_bits;
+        bits -= last_bits;
+        //---//
+        state.back += last_bits;
+      }
+      //--- DROPBITS(here.bits) ---//
+      hold >>>= here_bits;
+      bits -= here_bits;
+      //---//
+      state.back += here_bits;
+      state.length = here_val;
+      if (here_op === 0) {
+        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+        //        "inflate:         literal '%c'\n" :
+        //        "inflate:         literal 0x%02x\n", here.val));
+        state.mode = LIT;
+        break;
+      }
+      if (here_op & 32) {
+        //Tracevv((stderr, "inflate:         end of block\n"));
+        state.back = -1;
+        state.mode = TYPE;
+        break;
+      }
+      if (here_op & 64) {
+        strm.msg = 'invalid literal/length code';
+        state.mode = BAD;
+        break;
+      }
+      state.extra = here_op & 15;
+      state.mode = LENEXT;
+      /* falls through */
+    case LENEXT:
+      if (state.extra) {
+        //=== NEEDBITS(state.extra);
+        n = state.extra;
+        while (bits < n) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+        //--- DROPBITS(state.extra) ---//
+        hold >>>= state.extra;
+        bits -= state.extra;
+        //---//
+        state.back += state.extra;
+      }
+      //Tracevv((stderr, "inflate:         length %u\n", state.length));
+      state.was = state.length;
+      state.mode = DIST;
+      /* falls through */
+    case DIST:
+      for (;;) {
+        here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/
+        here_bits = here >>> 24;
+        here_op = (here >>> 16) & 0xff;
+        here_val = here & 0xffff;
+
+        if ((here_bits) <= bits) { break; }
+        //--- PULLBYTE() ---//
+        if (have === 0) { break inf_leave; }
+        have--;
+        hold += input[next++] << bits;
+        bits += 8;
+        //---//
+      }
+      if ((here_op & 0xf0) === 0) {
+        last_bits = here_bits;
+        last_op = here_op;
+        last_val = here_val;
+        for (;;) {
+          here = state.distcode[last_val +
+                  ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];
+          here_bits = here >>> 24;
+          here_op = (here >>> 16) & 0xff;
+          here_val = here & 0xffff;
+
+          if ((last_bits + here_bits) <= bits) { break; }
+          //--- PULLBYTE() ---//
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+          //---//
+        }
+        //--- DROPBITS(last.bits) ---//
+        hold >>>= last_bits;
+        bits -= last_bits;
+        //---//
+        state.back += last_bits;
+      }
+      //--- DROPBITS(here.bits) ---//
+      hold >>>= here_bits;
+      bits -= here_bits;
+      //---//
+      state.back += here_bits;
+      if (here_op & 64) {
+        strm.msg = 'invalid distance code';
+        state.mode = BAD;
+        break;
+      }
+      state.offset = here_val;
+      state.extra = (here_op) & 15;
+      state.mode = DISTEXT;
+      /* falls through */
+    case DISTEXT:
+      if (state.extra) {
+        //=== NEEDBITS(state.extra);
+        n = state.extra;
+        while (bits < n) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;
+        //--- DROPBITS(state.extra) ---//
+        hold >>>= state.extra;
+        bits -= state.extra;
+        //---//
+        state.back += state.extra;
+      }
+//#ifdef INFLATE_STRICT
+      if (state.offset > state.dmax) {
+        strm.msg = 'invalid distance too far back';
+        state.mode = BAD;
+        break;
+      }
+//#endif
+      //Tracevv((stderr, "inflate:         distance %u\n", state.offset));
+      state.mode = MATCH;
+      /* falls through */
+    case MATCH:
+      if (left === 0) { break inf_leave; }
+      copy = _out - left;
+      if (state.offset > copy) {         /* copy from window */
+        copy = state.offset - copy;
+        if (copy > state.whave) {
+          if (state.sane) {
+            strm.msg = 'invalid distance too far back';
+            state.mode = BAD;
+            break;
+          }
+// (!) This block is disabled in zlib defailts,
+// don't enable it for binary compatibility
+//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+//          Trace((stderr, "inflate.c too far\n"));
+//          copy -= state.whave;
+//          if (copy > state.length) { copy = state.length; }
+//          if (copy > left) { copy = left; }
+//          left -= copy;
+//          state.length -= copy;
+//          do {
+//            output[put++] = 0;
+//          } while (--copy);
+//          if (state.length === 0) { state.mode = LEN; }
+//          break;
+//#endif
+        }
+        if (copy > state.wnext) {
+          copy -= state.wnext;
+          from = state.wsize - copy;
+        }
+        else {
+          from = state.wnext - copy;
+        }
+        if (copy > state.length) { copy = state.length; }
+        from_source = state.window;
+      }
+      else {                              /* copy from output */
+        from_source = output;
+        from = put - state.offset;
+        copy = state.length;
+      }
+      if (copy > left) { copy = left; }
+      left -= copy;
+      state.length -= copy;
+      do {
+        output[put++] = from_source[from++];
+      } while (--copy);
+      if (state.length === 0) { state.mode = LEN; }
+      break;
+    case LIT:
+      if (left === 0) { break inf_leave; }
+      output[put++] = state.length;
+      left--;
+      state.mode = LEN;
+      break;
+    case CHECK:
+      if (state.wrap) {
+        //=== NEEDBITS(32);
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          // Use '|' insdead of '+' to make sure that result is signed
+          hold |= input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        _out -= left;
+        strm.total_out += _out;
+        state.total += _out;
+        if (_out) {
+          strm.adler = state.check =
+              /*UPDATE(state.check, put - _out, _out);*/
+              (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));
+
+        }
+        _out = left;
+        // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too
+        if ((state.flags ? hold : zswap32(hold)) !== state.check) {
+          strm.msg = 'incorrect data check';
+          state.mode = BAD;
+          break;
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        //Tracev((stderr, "inflate:   check matches trailer\n"));
+      }
+      state.mode = LENGTH;
+      /* falls through */
+    case LENGTH:
+      if (state.wrap && state.flags) {
+        //=== NEEDBITS(32);
+        while (bits < 32) {
+          if (have === 0) { break inf_leave; }
+          have--;
+          hold += input[next++] << bits;
+          bits += 8;
+        }
+        //===//
+        if (hold !== (state.total & 0xffffffff)) {
+          strm.msg = 'incorrect length check';
+          state.mode = BAD;
+          break;
+        }
+        //=== INITBITS();
+        hold = 0;
+        bits = 0;
+        //===//
+        //Tracev((stderr, "inflate:   length matches trailer\n"));
+      }
+      state.mode = DONE;
+      /* falls through */
+    case DONE:
+      ret = Z_STREAM_END;
+      break inf_leave;
+    case BAD:
+      ret = Z_DATA_ERROR;
+      break inf_leave;
+    case MEM:
+      return Z_MEM_ERROR;
+    case SYNC:
+      /* falls through */
+    default:
+      return Z_STREAM_ERROR;
+    }
+  }
+
+  // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave"
+
+  /*
+     Return from inflate(), updating the total counts and the check value.
+     If there was no progress during the inflate() call, return a buffer
+     error.  Call updatewindow() to create and/or update the window state.
+     Note: a memory error from inflate() is non-recoverable.
+   */
+
+  //--- RESTORE() ---
+  strm.next_out = put;
+  strm.avail_out = left;
+  strm.next_in = next;
+  strm.avail_in = have;
+  state.hold = hold;
+  state.bits = bits;
+  //---
+
+  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&
+                      (state.mode < CHECK || flush !== Z_FINISH))) {
+    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {
+      state.mode = MEM;
+      return Z_MEM_ERROR;
+    }
+  }
+  _in -= strm.avail_in;
+  _out -= strm.avail_out;
+  strm.total_in += _in;
+  strm.total_out += _out;
+  state.total += _out;
+  if (state.wrap && _out) {
+    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
+      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));
+  }
+  strm.data_type = state.bits + (state.last ? 64 : 0) +
+                    (state.mode === TYPE ? 128 : 0) +
+                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
+  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {
+    ret = Z_BUF_ERROR;
+  }
+  return ret;
+}
+
+function inflateEnd(strm) {
+
+  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {
+    return Z_STREAM_ERROR;
+  }
+
+  var state = strm.state;
+  if (state.window) {
+    state.window = null;
+  }
+  strm.state = null;
+  return Z_OK;
+}
+
+function inflateGetHeader(strm, head) {
+  var state;
+
+  /* check state */
+  if (!strm || !strm.state) { return Z_STREAM_ERROR; }
+  state = strm.state;
+  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }
+
+  /* save header structure */
+  state.head = head;
+  head.done = false;
+  return Z_OK;
+}
+
+function inflateSetDictionary(strm, dictionary) {
+  var dictLength = dictionary.length;
+
+  var state;
+  var dictid;
+  var ret;
+
+  /* check state */
+  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }
+  state = strm.state;
+
+  if (state.wrap !== 0 && state.mode !== DICT) {
+    return Z_STREAM_ERROR;
+  }
+
+  /* check for correct dictionary identifier */
+  if (state.mode === DICT) {
+    dictid = 1; /* adler32(0, null, 0)*/
+    /* dictid = adler32(dictid, dictionary, dictLength); */
+    dictid = adler32(dictid, dictionary, dictLength, 0);
+    if (dictid !== state.check) {
+      return Z_DATA_ERROR;
+    }
+  }
+  /* copy dictionary to window using updatewindow(), which will amend the
+   existing dictionary if appropriate */
+  ret = updatewindow(strm, dictionary, dictLength, dictLength);
+  if (ret) {
+    state.mode = MEM;
+    return Z_MEM_ERROR;
+  }
+  state.havedict = 1;
+  // Tracev((stderr, "inflate:   dictionary set\n"));
+  return Z_OK;
+}
+
+export { inflateReset, inflateReset2, inflateResetKeep, inflateInit, inflateInit2, inflate, inflateEnd, inflateGetHeader, inflateSetDictionary };
+export var inflateInfo = 'pako inflate (from Nodeca project)';
+
+/* Not implemented
+exports.inflateCopy = inflateCopy;
+exports.inflateGetDictionary = inflateGetDictionary;
+exports.inflateMark = inflateMark;
+exports.inflatePrime = inflatePrime;
+exports.inflateSync = inflateSync;
+exports.inflateSyncPoint = inflateSyncPoint;
+exports.inflateUndermine = inflateUndermine;
+*/
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/inftrees.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inftrees.js
new file mode 100644
index 0000000..78b7c9e
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/inftrees.js
@@ -0,0 +1,322 @@
+import * as utils from "../utils/common.js";
+
+var MAXBITS = 15;
+var ENOUGH_LENS = 852;
+var ENOUGH_DISTS = 592;
+//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);
+
+var CODES = 0;
+var LENS = 1;
+var DISTS = 2;
+
+var lbase = [ /* Length codes 257..285 base */
+  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0
+];
+
+var lext = [ /* Length codes 257..285 extra */
+  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
+];
+
+var dbase = [ /* Distance codes 0..29 base */
+  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+  8193, 12289, 16385, 24577, 0, 0
+];
+
+var dext = [ /* Distance codes 0..29 extra */
+  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+  28, 28, 29, 29, 64, 64
+];
+
+export default function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)
+{
+  var bits = opts.bits;
+      //here = opts.here; /* table entry for duplication */
+
+  var len = 0;               /* a code's length in bits */
+  var sym = 0;               /* index of code symbols */
+  var min = 0, max = 0;          /* minimum and maximum code lengths */
+  var root = 0;              /* number of index bits for root table */
+  var curr = 0;              /* number of index bits for current table */
+  var drop = 0;              /* code bits to drop for sub-table */
+  var left = 0;                   /* number of prefix codes available */
+  var used = 0;              /* code entries in table used */
+  var huff = 0;              /* Huffman code */
+  var incr;              /* for incrementing code, index */
+  var fill;              /* index for replicating entries */
+  var low;               /* low bits for current root entry */
+  var mask;              /* mask for low root bits */
+  var next;             /* next available space in table */
+  var base = null;     /* base value table to use */
+  var base_index = 0;
+//  var shoextra;    /* extra bits table to use */
+  var end;                    /* use base and extra for symbol > end */
+  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */
+  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */
+  var extra = null;
+  var extra_index = 0;
+
+  var here_bits, here_op, here_val;
+
+  /*
+   Process a set of code lengths to create a canonical Huffman code.  The
+   code lengths are lens[0..codes-1].  Each length corresponds to the
+   symbols 0..codes-1.  The Huffman code is generated by first sorting the
+   symbols by length from short to long, and retaining the symbol order
+   for codes with equal lengths.  Then the code starts with all zero bits
+   for the first code of the shortest length, and the codes are integer
+   increments for the same length, and zeros are appended as the length
+   increases.  For the deflate format, these bits are stored backwards
+   from their more natural integer increment ordering, and so when the
+   decoding tables are built in the large loop below, the integer codes
+   are incremented backwards.
+
+   This routine assumes, but does not check, that all of the entries in
+   lens[] are in the range 0..MAXBITS.  The caller must assure this.
+   1..MAXBITS is interpreted as that code length.  zero means that that
+   symbol does not occur in this code.
+
+   The codes are sorted by computing a count of codes for each length,
+   creating from that a table of starting indices for each length in the
+   sorted table, and then entering the symbols in order in the sorted
+   table.  The sorted table is work[], with that space being provided by
+   the caller.
+
+   The length counts are used for other purposes as well, i.e. finding
+   the minimum and maximum length codes, determining if there are any
+   codes at all, checking for a valid set of lengths, and looking ahead
+   at length counts to determine sub-table sizes when building the
+   decoding tables.
+   */
+
+  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+  for (len = 0; len <= MAXBITS; len++) {
+    count[len] = 0;
+  }
+  for (sym = 0; sym < codes; sym++) {
+    count[lens[lens_index + sym]]++;
+  }
+
+  /* bound code lengths, force root to be within code lengths */
+  root = bits;
+  for (max = MAXBITS; max >= 1; max--) {
+    if (count[max] !== 0) { break; }
+  }
+  if (root > max) {
+    root = max;
+  }
+  if (max === 0) {                     /* no symbols to code at all */
+    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */
+    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;
+    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+
+    //table.op[opts.table_index] = 64;
+    //table.bits[opts.table_index] = 1;
+    //table.val[opts.table_index++] = 0;
+    table[table_index++] = (1 << 24) | (64 << 16) | 0;
+
+    opts.bits = 1;
+    return 0;     /* no symbols, but wait for decoding to report error */
+  }
+  for (min = 1; min < max; min++) {
+    if (count[min] !== 0) { break; }
+  }
+  if (root < min) {
+    root = min;
+  }
+
+  /* check for an over-subscribed or incomplete set of lengths */
+  left = 1;
+  for (len = 1; len <= MAXBITS; len++) {
+    left <<= 1;
+    left -= count[len];
+    if (left < 0) {
+      return -1;
+    }        /* over-subscribed */
+  }
+  if (left > 0 && (type === CODES || max !== 1)) {
+    return -1;                      /* incomplete set */
+  }
+
+  /* generate offsets into symbol table for each length for sorting */
+  offs[1] = 0;
+  for (len = 1; len < MAXBITS; len++) {
+    offs[len + 1] = offs[len] + count[len];
+  }
+
+  /* sort symbols by length, by symbol order within each length */
+  for (sym = 0; sym < codes; sym++) {
+    if (lens[lens_index + sym] !== 0) {
+      work[offs[lens[lens_index + sym]]++] = sym;
+    }
+  }
+
+  /*
+   Create and fill in decoding tables.  In this loop, the table being
+   filled is at next and has curr index bits.  The code being used is huff
+   with length len.  That code is converted to an index by dropping drop
+   bits off of the bottom.  For codes where len is less than drop + curr,
+   those top drop + curr - len bits are incremented through all values to
+   fill the table with replicated entries.
+
+   root is the number of index bits for the root table.  When len exceeds
+   root, sub-tables are created pointed to by the root entry with an index
+   of the low root bits of huff.  This is saved in low to check for when a
+   new sub-table should be started.  drop is zero when the root table is
+   being filled, and drop is root when sub-tables are being filled.
+
+   When a new sub-table is needed, it is necessary to look ahead in the
+   code lengths to determine what size sub-table is needed.  The length
+   counts are used for this, and so count[] is decremented as codes are
+   entered in the tables.
+
+   used keeps track of how many table entries have been allocated from the
+   provided *table space.  It is checked for LENS and DIST tables against
+   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+   the initial root table size constants.  See the comments in inftrees.h
+   for more information.
+
+   sym increments through all symbols, and the loop terminates when
+   all codes of length max, i.e. all codes, have been processed.  This
+   routine permits incomplete codes, so another loop after this one fills
+   in the rest of the decoding tables with invalid code markers.
+   */
+
+  /* set up for code type */
+  // poor man optimization - use if-else instead of switch,
+  // to avoid deopts in old v8
+  if (type === CODES) {
+    base = extra = work;    /* dummy value--not used */
+    end = 19;
+
+  } else if (type === LENS) {
+    base = lbase;
+    base_index -= 257;
+    extra = lext;
+    extra_index -= 257;
+    end = 256;
+
+  } else {                    /* DISTS */
+    base = dbase;
+    extra = dext;
+    end = -1;
+  }
+
+  /* initialize opts for loop */
+  huff = 0;                   /* starting code */
+  sym = 0;                    /* starting code symbol */
+  len = min;                  /* starting code length */
+  next = table_index;              /* current table to fill in */
+  curr = root;                /* current table index bits */
+  drop = 0;                   /* current bits to drop from code for index */
+  low = -1;                   /* trigger new sub-table when len > root */
+  used = 1 << root;          /* use root table entries */
+  mask = used - 1;            /* mask for comparing low */
+
+  /* check available table space */
+  if ((type === LENS && used > ENOUGH_LENS) ||
+    (type === DISTS && used > ENOUGH_DISTS)) {
+    return 1;
+  }
+
+  /* process all codes and make table entries */
+  for (;;) {
+    /* create table entry */
+    here_bits = len - drop;
+    if (work[sym] < end) {
+      here_op = 0;
+      here_val = work[sym];
+    }
+    else if (work[sym] > end) {
+      here_op = extra[extra_index + work[sym]];
+      here_val = base[base_index + work[sym]];
+    }
+    else {
+      here_op = 32 + 64;         /* end of block */
+      here_val = 0;
+    }
+
+    /* replicate for those indices with low len bits equal to huff */
+    incr = 1 << (len - drop);
+    fill = 1 << curr;
+    min = fill;                 /* save offset to next table */
+    do {
+      fill -= incr;
+      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;
+    } while (fill !== 0);
+
+    /* backwards increment the len-bit code huff */
+    incr = 1 << (len - 1);
+    while (huff & incr) {
+      incr >>= 1;
+    }
+    if (incr !== 0) {
+      huff &= incr - 1;
+      huff += incr;
+    } else {
+      huff = 0;
+    }
+
+    /* go to next symbol, update count, len */
+    sym++;
+    if (--count[len] === 0) {
+      if (len === max) { break; }
+      len = lens[lens_index + work[sym]];
+    }
+
+    /* create new sub-table if needed */
+    if (len > root && (huff & mask) !== low) {
+      /* if first time, transition to sub-tables */
+      if (drop === 0) {
+        drop = root;
+      }
+
+      /* increment past last table */
+      next += min;            /* here min is 1 << curr */
+
+      /* determine length of next table */
+      curr = len - drop;
+      left = 1 << curr;
+      while (curr + drop < max) {
+        left -= count[curr + drop];
+        if (left <= 0) { break; }
+        curr++;
+        left <<= 1;
+      }
+
+      /* check for enough space */
+      used += 1 << curr;
+      if ((type === LENS && used > ENOUGH_LENS) ||
+        (type === DISTS && used > ENOUGH_DISTS)) {
+        return 1;
+      }
+
+      /* point entry in root table to sub-table */
+      low = huff & mask;
+      /*table.op[low] = curr;
+      table.bits[low] = root;
+      table.val[low] = next - opts.table_index;*/
+      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;
+    }
+  }
+
+  /* fill in remaining table entry if code is incomplete (guaranteed to have
+   at most one remaining entry, since if the code is incomplete, the
+   maximum code length that was allowed to get this far is one bit) */
+  if (huff !== 0) {
+    //table.op[next + huff] = 64;            /* invalid code marker */
+    //table.bits[next + huff] = len - drop;
+    //table.val[next + huff] = 0;
+    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;
+  }
+
+  /* set return parameters */
+  //opts.table_index += used;
+  opts.bits = root;
+  return 0;
+};
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/messages.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/messages.js
new file mode 100644
index 0000000..f95cb70
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/messages.js
@@ -0,0 +1,11 @@
+export default {
+  2:      'need dictionary',     /* Z_NEED_DICT       2  */
+  1:      'stream end',          /* Z_STREAM_END      1  */
+  0:      '',                    /* Z_OK              0  */
+  '-1':   'file error',          /* Z_ERRNO         (-1) */
+  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */
+  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */
+  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */
+  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */
+  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */
+};
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/trees.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/trees.js
new file mode 100644
index 0000000..a69b8a5
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/trees.js
@@ -0,0 +1,1195 @@
+import * as utils from "../utils/common.js";
+
+/* Public constants ==========================================================*/
+/* ===========================================================================*/
+
+
+//var Z_FILTERED          = 1;
+//var Z_HUFFMAN_ONLY      = 2;
+//var Z_RLE               = 3;
+var Z_FIXED               = 4;
+//var Z_DEFAULT_STRATEGY  = 0;
+
+/* Possible values of the data_type field (though see inflate()) */
+var Z_BINARY              = 0;
+var Z_TEXT                = 1;
+//var Z_ASCII             = 1; // = Z_TEXT
+var Z_UNKNOWN             = 2;
+
+/*============================================================================*/
+
+
+function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }
+
+// From zutil.h
+
+var STORED_BLOCK = 0;
+var STATIC_TREES = 1;
+var DYN_TREES    = 2;
+/* The three kinds of block type */
+
+var MIN_MATCH    = 3;
+var MAX_MATCH    = 258;
+/* The minimum and maximum match lengths */
+
+// From deflate.h
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+var LENGTH_CODES  = 29;
+/* number of length codes, not counting the special END_BLOCK code */
+
+var LITERALS      = 256;
+/* number of literal bytes 0..255 */
+
+var L_CODES       = LITERALS + 1 + LENGTH_CODES;
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+var D_CODES       = 30;
+/* number of distance codes */
+
+var BL_CODES      = 19;
+/* number of codes used to transfer the bit lengths */
+
+var HEAP_SIZE     = 2 * L_CODES + 1;
+/* maximum heap size */
+
+var MAX_BITS      = 15;
+/* All codes must not exceed MAX_BITS bits */
+
+var Buf_size      = 16;
+/* size of bit buffer in bi_buf */
+
+
+/* ===========================================================================
+ * Constants
+ */
+
+var MAX_BL_BITS = 7;
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+var END_BLOCK   = 256;
+/* end of block literal code */
+
+var REP_3_6     = 16;
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+var REPZ_3_10   = 17;
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */
+
+var REPZ_11_138 = 18;
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */
+
+/* eslint-disable comma-spacing,array-bracket-spacing */
+var extra_lbits =   /* extra bits for each length code */
+  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
+
+var extra_dbits =   /* extra bits for each distance code */
+  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
+
+var extra_blbits =  /* extra bits for each bit length code */
+  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
+
+var bl_order =
+  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
+/* eslint-enable comma-spacing,array-bracket-spacing */
+
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+// We pre-fill arrays with 0 to avoid uninitialized gaps
+
+var DIST_CODE_LEN = 512; /* see definition of array dist_code below */
+
+// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1
+var static_ltree  = new Array((L_CODES + 2) * 2);
+zero(static_ltree);
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+var static_dtree  = new Array(D_CODES * 2);
+zero(static_dtree);
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+var _dist_code    = new Array(DIST_CODE_LEN);
+zero(_dist_code);
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+var _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);
+zero(_length_code);
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+var base_length   = new Array(LENGTH_CODES);
+zero(base_length);
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+var base_dist     = new Array(D_CODES);
+zero(base_dist);
+/* First normalized distance for each code (0 = distance of 1) */
+
+
+function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {
+
+  this.static_tree  = static_tree;  /* static tree or NULL */
+  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */
+  this.extra_base   = extra_base;   /* base index for extra_bits */
+  this.elems        = elems;        /* max number of elements in the tree */
+  this.max_length   = max_length;   /* max bit length for the codes */
+
+  // show if `static_tree` has data or dummy - needed for monomorphic objects
+  this.has_stree    = static_tree && static_tree.length;
+}
+
+
+var static_l_desc;
+var static_d_desc;
+var static_bl_desc;
+
+
+function TreeDesc(dyn_tree, stat_desc) {
+  this.dyn_tree = dyn_tree;     /* the dynamic tree */
+  this.max_code = 0;            /* largest code with non zero frequency */
+  this.stat_desc = stat_desc;   /* the corresponding static tree */
+}
+
+
+
+function d_code(dist) {
+  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
+}
+
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+function put_short(s, w) {
+//    put_byte(s, (uch)((w) & 0xff));
+//    put_byte(s, (uch)((ush)(w) >> 8));
+  s.pending_buf[s.pending++] = (w) & 0xff;
+  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;
+}
+
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+function send_bits(s, value, length) {
+  if (s.bi_valid > (Buf_size - length)) {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    put_short(s, s.bi_buf);
+    s.bi_buf = value >> (Buf_size - s.bi_valid);
+    s.bi_valid += length - Buf_size;
+  } else {
+    s.bi_buf |= (value << s.bi_valid) & 0xffff;
+    s.bi_valid += length;
+  }
+}
+
+
+function send_code(s, c, tree) {
+  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);
+}
+
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+function bi_reverse(code, len) {
+  var res = 0;
+  do {
+    res |= code & 1;
+    code >>>= 1;
+    res <<= 1;
+  } while (--len > 0);
+  return res >>> 1;
+}
+
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+function bi_flush(s) {
+  if (s.bi_valid === 16) {
+    put_short(s, s.bi_buf);
+    s.bi_buf = 0;
+    s.bi_valid = 0;
+
+  } else if (s.bi_valid >= 8) {
+    s.pending_buf[s.pending++] = s.bi_buf & 0xff;
+    s.bi_buf >>= 8;
+    s.bi_valid -= 8;
+  }
+}
+
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ *    above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ *     array bl_count contains the frequencies for each bit length.
+ *     The length opt_len is updated; static_len is also updated if stree is
+ *     not null.
+ */
+function gen_bitlen(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc;    /* the tree descriptor */
+{
+  var tree            = desc.dyn_tree;
+  var max_code        = desc.max_code;
+  var stree           = desc.stat_desc.static_tree;
+  var has_stree       = desc.stat_desc.has_stree;
+  var extra           = desc.stat_desc.extra_bits;
+  var base            = desc.stat_desc.extra_base;
+  var max_length      = desc.stat_desc.max_length;
+  var h;              /* heap index */
+  var n, m;           /* iterate over the tree elements */
+  var bits;           /* bit length */
+  var xbits;          /* extra bits */
+  var f;              /* frequency */
+  var overflow = 0;   /* number of elements with bit length too large */
+
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    s.bl_count[bits] = 0;
+  }
+
+  /* In a first pass, compute the optimal bit lengths (which may
+   * overflow in the case of the bit length tree).
+   */
+  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */
+
+  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
+    n = s.heap[h];
+    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;
+    if (bits > max_length) {
+      bits = max_length;
+      overflow++;
+    }
+    tree[n * 2 + 1]/*.Len*/ = bits;
+    /* We overwrite tree[n].Dad which is no longer needed */
+
+    if (n > max_code) { continue; } /* not a leaf node */
+
+    s.bl_count[bits]++;
+    xbits = 0;
+    if (n >= base) {
+      xbits = extra[n - base];
+    }
+    f = tree[n * 2]/*.Freq*/;
+    s.opt_len += f * (bits + xbits);
+    if (has_stree) {
+      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);
+    }
+  }
+  if (overflow === 0) { return; }
+
+  // Trace((stderr,"\nbit length overflow\n"));
+  /* This happens for example on obj2 and pic of the Calgary corpus */
+
+  /* Find the first bit length which could increase: */
+  do {
+    bits = max_length - 1;
+    while (s.bl_count[bits] === 0) { bits--; }
+    s.bl_count[bits]--;      /* move one leaf down the tree */
+    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */
+    s.bl_count[max_length]--;
+    /* The brother of the overflow item also moves one step up,
+     * but this does not affect bl_count[max_length]
+     */
+    overflow -= 2;
+  } while (overflow > 0);
+
+  /* Now recompute all bit lengths, scanning in increasing frequency.
+   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+   * lengths instead of fixing only the wrong ones. This idea is taken
+   * from 'ar' written by Haruhiko Okumura.)
+   */
+  for (bits = max_length; bits !== 0; bits--) {
+    n = s.bl_count[bits];
+    while (n !== 0) {
+      m = s.heap[--h];
+      if (m > max_code) { continue; }
+      if (tree[m * 2 + 1]/*.Len*/ !== bits) {
+        // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;
+        tree[m * 2 + 1]/*.Len*/ = bits;
+      }
+      n--;
+    }
+  }
+}
+
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
+ */
+function gen_codes(tree, max_code, bl_count)
+//    ct_data *tree;             /* the tree to decorate */
+//    int max_code;              /* largest code with non zero frequency */
+//    ushf *bl_count;            /* number of codes at each bit length */
+{
+  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */
+  var code = 0;              /* running code value */
+  var bits;                  /* bit index */
+  var n;                     /* code index */
+
+  /* The distribution counts are first used to generate the code values
+   * without bit reversal.
+   */
+  for (bits = 1; bits <= MAX_BITS; bits++) {
+    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;
+  }
+  /* Check that the bit counts in bl_count are consistent. The last code
+   * must be all ones.
+   */
+  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+  //        "inconsistent bit counts");
+  //Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+  for (n = 0;  n <= max_code; n++) {
+    var len = tree[n * 2 + 1]/*.Len*/;
+    if (len === 0) { continue; }
+    /* Now reverse the bits */
+    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);
+
+    //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+  }
+}
+
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+function tr_static_init() {
+  var n;        /* iterates over tree elements */
+  var bits;     /* bit counter */
+  var length;   /* length value */
+  var code;     /* code value */
+  var dist;     /* distance index */
+  var bl_count = new Array(MAX_BITS + 1);
+  /* number of codes at each bit length for an optimal tree */
+
+  // do check in _tr_init()
+  //if (static_init_done) return;
+
+  /* For some embedded targets, global variables are not initialized: */
+/*#ifdef NO_INIT_GLOBAL_POINTERS
+  static_l_desc.static_tree = static_ltree;
+  static_l_desc.extra_bits = extra_lbits;
+  static_d_desc.static_tree = static_dtree;
+  static_d_desc.extra_bits = extra_dbits;
+  static_bl_desc.extra_bits = extra_blbits;
+#endif*/
+
+  /* Initialize the mapping length (0..255) -> length code (0..28) */
+  length = 0;
+  for (code = 0; code < LENGTH_CODES - 1; code++) {
+    base_length[code] = length;
+    for (n = 0; n < (1 << extra_lbits[code]); n++) {
+      _length_code[length++] = code;
+    }
+  }
+  //Assert (length == 256, "tr_static_init: length != 256");
+  /* Note that the length 255 (match length 258) can be represented
+   * in two different ways: code 284 + 5 bits or code 285, so we
+   * overwrite length_code[255] to use the best encoding:
+   */
+  _length_code[length - 1] = code;
+
+  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+  dist = 0;
+  for (code = 0; code < 16; code++) {
+    base_dist[code] = dist;
+    for (n = 0; n < (1 << extra_dbits[code]); n++) {
+      _dist_code[dist++] = code;
+    }
+  }
+  //Assert (dist == 256, "tr_static_init: dist != 256");
+  dist >>= 7; /* from now on, all distances are divided by 128 */
+  for (; code < D_CODES; code++) {
+    base_dist[code] = dist << 7;
+    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {
+      _dist_code[256 + dist++] = code;
+    }
+  }
+  //Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+  /* Construct the codes of the static literal tree */
+  for (bits = 0; bits <= MAX_BITS; bits++) {
+    bl_count[bits] = 0;
+  }
+
+  n = 0;
+  while (n <= 143) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  while (n <= 255) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 9;
+    n++;
+    bl_count[9]++;
+  }
+  while (n <= 279) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 7;
+    n++;
+    bl_count[7]++;
+  }
+  while (n <= 287) {
+    static_ltree[n * 2 + 1]/*.Len*/ = 8;
+    n++;
+    bl_count[8]++;
+  }
+  /* Codes 286 and 287 do not exist, but we must include them in the
+   * tree construction to get a canonical Huffman tree (longest code
+   * all ones)
+   */
+  gen_codes(static_ltree, L_CODES + 1, bl_count);
+
+  /* The static distance tree is trivial: */
+  for (n = 0; n < D_CODES; n++) {
+    static_dtree[n * 2 + 1]/*.Len*/ = 5;
+    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);
+  }
+
+  // Now data ready and we can init static trees
+  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
+  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);
+  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);
+
+  //static_init_done = true;
+}
+
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+function init_block(s) {
+  var n; /* iterates over tree elements */
+
+  /* Initialize the trees. */
+  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }
+  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }
+
+  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;
+  s.opt_len = s.static_len = 0;
+  s.last_lit = s.matches = 0;
+}
+
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+function bi_windup(s)
+{
+  if (s.bi_valid > 8) {
+    put_short(s, s.bi_buf);
+  } else if (s.bi_valid > 0) {
+    //put_byte(s, (Byte)s->bi_buf);
+    s.pending_buf[s.pending++] = s.bi_buf;
+  }
+  s.bi_buf = 0;
+  s.bi_valid = 0;
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+function copy_block(s, buf, len, header)
+//DeflateState *s;
+//charf    *buf;    /* the input data */
+//unsigned len;     /* its length */
+//int      header;  /* true if block header must be written */
+{
+  bi_windup(s);        /* align on byte boundary */
+
+  if (header) {
+    put_short(s, len);
+    put_short(s, ~len);
+  }
+//  while (len--) {
+//    put_byte(s, *buf++);
+//  }
+  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
+  s.pending += len;
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+function smaller(tree, n, m, depth) {
+  var _n2 = n * 2;
+  var _m2 = m * 2;
+  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||
+         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));
+}
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+function pqdownheap(s, tree, k)
+//    deflate_state *s;
+//    ct_data *tree;  /* the tree to restore */
+//    int k;               /* node to move down */
+{
+  var v = s.heap[k];
+  var j = k << 1;  /* left son of k */
+  while (j <= s.heap_len) {
+    /* Set j to the smallest of the two sons: */
+    if (j < s.heap_len &&
+      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {
+      j++;
+    }
+    /* Exit if v is smaller than both sons */
+    if (smaller(tree, v, s.heap[j], s.depth)) { break; }
+
+    /* Exchange v with the smallest son */
+    s.heap[k] = s.heap[j];
+    k = j;
+
+    /* And continue down the tree, setting j to the left son of k */
+    j <<= 1;
+  }
+  s.heap[k] = v;
+}
+
+
+// inlined manually
+// var SMALLEST = 1;
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+function compress_block(s, ltree, dtree)
+//    deflate_state *s;
+//    const ct_data *ltree; /* literal tree */
+//    const ct_data *dtree; /* distance tree */
+{
+  var dist;           /* distance of matched string */
+  var lc;             /* match length or unmatched char (if dist == 0) */
+  var lx = 0;         /* running index in l_buf */
+  var code;           /* the code to send */
+  var extra;          /* number of extra bits to send */
+
+  if (s.last_lit !== 0) {
+    do {
+      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);
+      lc = s.pending_buf[s.l_buf + lx];
+      lx++;
+
+      if (dist === 0) {
+        send_code(s, lc, ltree); /* send a literal byte */
+        //Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+      } else {
+        /* Here, lc is the match length - MIN_MATCH */
+        code = _length_code[lc];
+        send_code(s, code + LITERALS + 1, ltree); /* send the length code */
+        extra = extra_lbits[code];
+        if (extra !== 0) {
+          lc -= base_length[code];
+          send_bits(s, lc, extra);       /* send the extra length bits */
+        }
+        dist--; /* dist is now the match distance - 1 */
+        code = d_code(dist);
+        //Assert (code < D_CODES, "bad d_code");
+
+        send_code(s, code, dtree);       /* send the distance code */
+        extra = extra_dbits[code];
+        if (extra !== 0) {
+          dist -= base_dist[code];
+          send_bits(s, dist, extra);   /* send the extra distance bits */
+        }
+      } /* literal or match pair ? */
+
+      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+      //       "pendingBuf overflow");
+
+    } while (lx < s.last_lit);
+  }
+
+  send_code(s, END_BLOCK, ltree);
+}
+
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ *     and corresponding code. The length opt_len is updated; static_len is
+ *     also updated if stree is not null. The field max_code is set.
+ */
+function build_tree(s, desc)
+//    deflate_state *s;
+//    tree_desc *desc; /* the tree descriptor */
+{
+  var tree     = desc.dyn_tree;
+  var stree    = desc.stat_desc.static_tree;
+  var has_stree = desc.stat_desc.has_stree;
+  var elems    = desc.stat_desc.elems;
+  var n, m;          /* iterate over heap elements */
+  var max_code = -1; /* largest code with non zero frequency */
+  var node;          /* new node being created */
+
+  /* Construct the initial heap, with least frequent element in
+   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+   * heap[0] is not used.
+   */
+  s.heap_len = 0;
+  s.heap_max = HEAP_SIZE;
+
+  for (n = 0; n < elems; n++) {
+    if (tree[n * 2]/*.Freq*/ !== 0) {
+      s.heap[++s.heap_len] = max_code = n;
+      s.depth[n] = 0;
+
+    } else {
+      tree[n * 2 + 1]/*.Len*/ = 0;
+    }
+  }
+
+  /* The pkzip format requires that at least one distance code exists,
+   * and that at least one bit should be sent even if there is only one
+   * possible code. So to avoid special checks later on we force at least
+   * two codes of non zero frequency.
+   */
+  while (s.heap_len < 2) {
+    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);
+    tree[node * 2]/*.Freq*/ = 1;
+    s.depth[node] = 0;
+    s.opt_len--;
+
+    if (has_stree) {
+      s.static_len -= stree[node * 2 + 1]/*.Len*/;
+    }
+    /* node is 0 or 1 so it does not have extra bits */
+  }
+  desc.max_code = max_code;
+
+  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+   * establish sub-heaps of increasing lengths:
+   */
+  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }
+
+  /* Construct the Huffman tree by repeatedly combining the least two
+   * frequent nodes.
+   */
+  node = elems;              /* next internal node of the tree */
+  do {
+    //pqremove(s, tree, n);  /* n = node of least frequency */
+    /*** pqremove ***/
+    n = s.heap[1/*SMALLEST*/];
+    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+    /***/
+
+    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */
+
+    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */
+    s.heap[--s.heap_max] = m;
+
+    /* Create a new node father of n and m */
+    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;
+    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
+    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;
+
+    /* and insert the new node in the heap */
+    s.heap[1/*SMALLEST*/] = node++;
+    pqdownheap(s, tree, 1/*SMALLEST*/);
+
+  } while (s.heap_len >= 2);
+
+  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];
+
+  /* At this point, the fields freq and dad are set. We can now
+   * generate the bit lengths.
+   */
+  gen_bitlen(s, desc);
+
+  /* The field len is now set, we can generate the bit codes */
+  gen_codes(tree, max_code, s.bl_count);
+}
+
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+function scan_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree;   /* the tree to be scanned */
+//    int max_code;    /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      s.bl_tree[curlen * 2]/*.Freq*/ += count;
+
+    } else if (curlen !== 0) {
+
+      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }
+      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;
+
+    } else if (count <= 10) {
+      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;
+
+    } else {
+      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;
+    }
+
+    count = 0;
+    prevlen = curlen;
+
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
+    }
+  }
+}
+
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+function send_tree(s, tree, max_code)
+//    deflate_state *s;
+//    ct_data *tree; /* the tree to be scanned */
+//    int max_code;       /* and its largest code of non zero frequency */
+{
+  var n;                     /* iterates over all tree elements */
+  var prevlen = -1;          /* last emitted length */
+  var curlen;                /* length of current code */
+
+  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */
+
+  var count = 0;             /* repeat count of the current code */
+  var max_count = 7;         /* max repeat count */
+  var min_count = 4;         /* min repeat count */
+
+  /* tree[max_code+1].Len = -1; */  /* guard already set */
+  if (nextlen === 0) {
+    max_count = 138;
+    min_count = 3;
+  }
+
+  for (n = 0; n <= max_code; n++) {
+    curlen = nextlen;
+    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;
+
+    if (++count < max_count && curlen === nextlen) {
+      continue;
+
+    } else if (count < min_count) {
+      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);
+
+    } else if (curlen !== 0) {
+      if (curlen !== prevlen) {
+        send_code(s, curlen, s.bl_tree);
+        count--;
+      }
+      //Assert(count >= 3 && count <= 6, " 3_6?");
+      send_code(s, REP_3_6, s.bl_tree);
+      send_bits(s, count - 3, 2);
+
+    } else if (count <= 10) {
+      send_code(s, REPZ_3_10, s.bl_tree);
+      send_bits(s, count - 3, 3);
+
+    } else {
+      send_code(s, REPZ_11_138, s.bl_tree);
+      send_bits(s, count - 11, 7);
+    }
+
+    count = 0;
+    prevlen = curlen;
+    if (nextlen === 0) {
+      max_count = 138;
+      min_count = 3;
+
+    } else if (curlen === nextlen) {
+      max_count = 6;
+      min_count = 3;
+
+    } else {
+      max_count = 7;
+      min_count = 4;
+    }
+  }
+}
+
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+function build_bl_tree(s) {
+  var max_blindex;  /* index of last bit length code of non zero freq */
+
+  /* Determine the bit length frequencies for literal and distance trees */
+  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
+  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
+
+  /* Build the bit length tree: */
+  build_tree(s, s.bl_desc);
+  /* opt_len now includes the length of the tree representations, except
+   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+   */
+
+  /* Determine the number of bit length codes to send. The pkzip format
+   * requires that at least 4 bit length codes be sent. (appnote.txt says
+   * 3 but the actual value used is 4.)
+   */
+  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
+    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {
+      break;
+    }
+  }
+  /* Update opt_len to include the bit length tree and counts */
+  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
+  //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+  //        s->opt_len, s->static_len));
+
+  return max_blindex;
+}
+
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+function send_all_trees(s, lcodes, dcodes, blcodes)
+//    deflate_state *s;
+//    int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+  var rank;                    /* index in bl_order */
+
+  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+  //        "too many codes");
+  //Tracev((stderr, "\nbl counts: "));
+  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */
+  send_bits(s, dcodes - 1,   5);
+  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */
+  for (rank = 0; rank < blcodes; rank++) {
+    //Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);
+  }
+  //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */
+  //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */
+  //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ *    a) There are no non-portable control characters belonging to the
+ *       "black list" (0..6, 14..25, 28..31).
+ *    b) There is at least one printable character belonging to the
+ *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ *   "gray list" that is ignored in this detection algorithm:
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+function detect_data_type(s) {
+  /* black_mask is the bit mask of black-listed bytes
+   * set bits 0..6, 14..25, and 28..31
+   * 0xf3ffc07f = binary 11110011111111111100000001111111
+   */
+  var black_mask = 0xf3ffc07f;
+  var n;
+
+  /* Check for non-textual ("black-listed") bytes. */
+  for (n = 0; n <= 31; n++, black_mask >>>= 1) {
+    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {
+      return Z_BINARY;
+    }
+  }
+
+  /* Check for textual ("white-listed") bytes. */
+  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||
+      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {
+    return Z_TEXT;
+  }
+  for (n = 32; n < LITERALS; n++) {
+    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {
+      return Z_TEXT;
+    }
+  }
+
+  /* There are no "black-listed" or "white-listed" bytes:
+   * this stream either is empty or has tolerated ("gray-listed") bytes only.
+   */
+  return Z_BINARY;
+}
+
+
+var static_init_done = false;
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+function _tr_init(s)
+{
+
+  if (!static_init_done) {
+    tr_static_init();
+    static_init_done = true;
+  }
+
+  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);
+  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);
+  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
+
+  s.bi_buf = 0;
+  s.bi_valid = 0;
+
+  /* Initialize the first block of the first file: */
+  init_block(s);
+}
+
+
+/* ===========================================================================
+ * Send a stored block
+ */
+function _tr_stored_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */
+  copy_block(s, buf, stored_len, true); /* with header */
+}
+
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ */
+function _tr_align(s) {
+  send_bits(s, STATIC_TREES << 1, 3);
+  send_code(s, END_BLOCK, static_ltree);
+  bi_flush(s);
+}
+
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+function _tr_flush_block(s, buf, stored_len, last)
+//DeflateState *s;
+//charf *buf;       /* input block, or NULL if too old */
+//ulg stored_len;   /* length of input block */
+//int last;         /* one if this is the last block for a file */
+{
+  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */
+  var max_blindex = 0;        /* index of last bit length code of non zero freq */
+
+  /* Build the Huffman trees unless a stored block is forced */
+  if (s.level > 0) {
+
+    /* Check if the file is binary or text */
+    if (s.strm.data_type === Z_UNKNOWN) {
+      s.strm.data_type = detect_data_type(s);
+    }
+
+    /* Construct the literal and distance trees */
+    build_tree(s, s.l_desc);
+    // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+
+    build_tree(s, s.d_desc);
+    // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+    //        s->static_len));
+    /* At this point, opt_len and static_len are the total bit lengths of
+     * the compressed block data, excluding the tree representations.
+     */
+
+    /* Build the bit length tree for the above two trees, and get the index
+     * in bl_order of the last bit length code to send.
+     */
+    max_blindex = build_bl_tree(s);
+
+    /* Determine the best encoding. Compute the block lengths in bytes. */
+    opt_lenb = (s.opt_len + 3 + 7) >>> 3;
+    static_lenb = (s.static_len + 3 + 7) >>> 3;
+
+    // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+    //        s->last_lit));
+
+    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }
+
+  } else {
+    // Assert(buf != (char*)0, "lost buf");
+    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+  }
+
+  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {
+    /* 4: two words for the lengths */
+
+    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+     * Otherwise we can't have processed more than WSIZE input bytes since
+     * the last block flush, because compression would have been
+     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+     * transform a block into a stored block.
+     */
+    _tr_stored_block(s, buf, stored_len, last);
+
+  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
+
+    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
+    compress_block(s, static_ltree, static_dtree);
+
+  } else {
+    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
+    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
+    compress_block(s, s.dyn_ltree, s.dyn_dtree);
+  }
+  // Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+  /* The above check is made mod 2^32, for files larger than 512 MB
+   * and uLong implemented on 32 bits.
+   */
+  init_block(s);
+
+  if (last) {
+    bi_windup(s);
+  }
+  // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+  //       s->compressed_len-7*last));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+function _tr_tally(s, dist, lc)
+//    deflate_state *s;
+//    unsigned dist;  /* distance of matched string */
+//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+  //var out_length, in_length, dcode;
+
+  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;
+  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;
+
+  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;
+  s.last_lit++;
+
+  if (dist === 0) {
+    /* lc is the unmatched char */
+    s.dyn_ltree[lc * 2]/*.Freq*/++;
+  } else {
+    s.matches++;
+    /* Here, lc is the match length - MIN_MATCH */
+    dist--;             /* dist = match distance - 1 */
+    //Assert((ush)dist < (ush)MAX_DIST(s) &&
+    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+    //       (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
+
+    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;
+    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;
+  }
+
+// (!) This block is disabled in zlib defailts,
+// don't enable it for binary compatibility
+
+//#ifdef TRUNCATE_BLOCK
+//  /* Try to guess if it is profitable to stop the current block here */
+//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {
+//    /* Compute an upper bound for the compressed length */
+//    out_length = s.last_lit*8;
+//    in_length = s.strstart - s.block_start;
+//
+//    for (dcode = 0; dcode < D_CODES; dcode++) {
+//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);
+//    }
+//    out_length >>>= 3;
+//    //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+//    //       s->last_lit, in_length, out_length,
+//    //       100L - out_length*100L/in_length));
+//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {
+//      return true;
+//    }
+//  }
+//#endif
+
+  return (s.last_lit === s.lit_bufsize - 1);
+  /* We avoid equality with lit_bufsize because of wraparound at 64K
+   * on 16 bit machines and because stored blocks are restricted to
+   * 64K-1 bytes.
+   */
+}
+
+export { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align };
diff --git a/systemvm/agent/noVNC/vendor/pako/lib/zlib/zstream.js b/systemvm/agent/noVNC/vendor/pako/lib/zlib/zstream.js
new file mode 100644
index 0000000..e7e674e
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/pako/lib/zlib/zstream.js
@@ -0,0 +1,24 @@
+export default function ZStream() {
+  /* next input byte */
+  this.input = null; // JS specific, because we have no pointers
+  this.next_in = 0;
+  /* number of bytes available at input */
+  this.avail_in = 0;
+  /* total number of input bytes read so far */
+  this.total_in = 0;
+  /* next output byte should be put there */
+  this.output = null; // JS specific, because we have no pointers
+  this.next_out = 0;
+  /* remaining free space at output */
+  this.avail_out = 0;
+  /* total number of bytes output so far */
+  this.total_out = 0;
+  /* last error message, NULL if no error */
+  this.msg = ''/*Z_NULL*/;
+  /* not visible by applications */
+  this.state = null;
+  /* best guess about the data type: binary or text */
+  this.data_type = 2/*Z_UNKNOWN*/;
+  /* adler32 value of the uncompressed data */
+  this.adler = 0;
+}
diff --git a/systemvm/agent/noVNC/vendor/promise.js b/systemvm/agent/noVNC/vendor/promise.js
new file mode 100644
index 0000000..6284343
--- /dev/null
+++ b/systemvm/agent/noVNC/vendor/promise.js
@@ -0,0 +1,255 @@
+/* Copyright (c) 2014 Taylor Hakes
+ * Copyright (c) 2014 Forbes Lindesay
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+(function (root) {
+
+  // Store setTimeout reference so promise-polyfill will be unaffected by
+  // other code modifying setTimeout (like sinon.useFakeTimers())
+  var setTimeoutFunc = setTimeout;
+
+  function noop() {}
+  
+  // Polyfill for Function.prototype.bind
+  function bind(fn, thisArg) {
+    return function () {
+      fn.apply(thisArg, arguments);
+    };
+  }
+
+  function Promise(fn) {
+    if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');
+    if (typeof fn !== 'function') throw new TypeError('not a function');
+    this._state = 0;
+    this._handled = false;
+    this._value = undefined;
+    this._deferreds = [];
+
+    doResolve(fn, this);
+  }
+
+  function handle(self, deferred) {
+    while (self._state === 3) {
+      self = self._value;
+    }
+    if (self._state === 0) {
+      self._deferreds.push(deferred);
+      return;
+    }
+    self._handled = true;
+    Promise._immediateFn(function () {
+      var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
+      if (cb === null) {
+        (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
+        return;
+      }
+      var ret;
+      try {
+        ret = cb(self._value);
+      } catch (e) {
+        reject(deferred.promise, e);
+        return;
+      }
+      resolve(deferred.promise, ret);
+    });
+  }
+
+  function resolve(self, newValue) {
+    try {
+      // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+      if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.');
+      if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
+        var then = newValue.then;
+        if (newValue instanceof Promise) {
+          self._state = 3;
+          self._value = newValue;
+          finale(self);
+          return;
+        } else if (typeof then === 'function') {
+          doResolve(bind(then, newValue), self);
+          return;
+        }
+      }
+      self._state = 1;
+      self._value = newValue;
+      finale(self);
+    } catch (e) {
+      reject(self, e);
+    }
+  }
+
+  function reject(self, newValue) {
+    self._state = 2;
+    self._value = newValue;
+    finale(self);
+  }
+
+  function finale(self) {
+    if (self._state === 2 && self._deferreds.length === 0) {
+      Promise._immediateFn(function() {
+        if (!self._handled) {
+          Promise._unhandledRejectionFn(self._value);
+        }
+      });
+    }
+
+    for (var i = 0, len = self._deferreds.length; i < len; i++) {
+      handle(self, self._deferreds[i]);
+    }
+    self._deferreds = null;
+  }
+
+  function Handler(onFulfilled, onRejected, promise) {
+    this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+    this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+    this.promise = promise;
+  }
+
+  /**
+   * Take a potentially misbehaving resolver function and make sure
+   * onFulfilled and onRejected are only called once.
+   *
+   * Makes no guarantees about asynchrony.
+   */
+  function doResolve(fn, self) {
+    var done = false;
+    try {
+      fn(function (value) {
+        if (done) return;
+        done = true;
+        resolve(self, value);
+      }, function (reason) {
+        if (done) return;
+        done = true;
+        reject(self, reason);
+      });
+    } catch (ex) {
+      if (done) return;
+      done = true;
+      reject(self, ex);
+    }
+  }
+
+  Promise.prototype['catch'] = function (onRejected) {
+    return this.then(null, onRejected);
+  };
+
+  Promise.prototype.then = function (onFulfilled, onRejected) {
+    var prom = new (this.constructor)(noop);
+
+    handle(this, new Handler(onFulfilled, onRejected, prom));
+    return prom;
+  };
+
+  Promise.all = function (arr) {
+    var args = Array.prototype.slice.call(arr);
+
+    return new Promise(function (resolve, reject) {
+      if (args.length === 0) return resolve([]);
+      var remaining = args.length;
+
+      function res(i, val) {
+        try {
+          if (val && (typeof val === 'object' || typeof val === 'function')) {
+            var then = val.then;
+            if (typeof then === 'function') {
+              then.call(val, function (val) {
+                res(i, val);
+              }, reject);
+              return;
+            }
+          }
+          args[i] = val;
+          if (--remaining === 0) {
+            resolve(args);
+          }
+        } catch (ex) {
+          reject(ex);
+        }
+      }
+
+      for (var i = 0; i < args.length; i++) {
+        res(i, args[i]);
+      }
+    });
+  };
+
+  Promise.resolve = function (value) {
+    if (value && typeof value === 'object' && value.constructor === Promise) {
+      return value;
+    }
+
+    return new Promise(function (resolve) {
+      resolve(value);
+    });
+  };
+
+  Promise.reject = function (value) {
+    return new Promise(function (resolve, reject) {
+      reject(value);
+    });
+  };
+
+  Promise.race = function (values) {
+    return new Promise(function (resolve, reject) {
+      for (var i = 0, len = values.length; i < len; i++) {
+        values[i].then(resolve, reject);
+      }
+    });
+  };
+
+  // Use polyfill for setImmediate for performance gains
+  Promise._immediateFn = (typeof setImmediate === 'function' && function (fn) { setImmediate(fn); }) ||
+    function (fn) {
+      setTimeoutFunc(fn, 0);
+    };
+
+  Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
+    if (typeof console !== 'undefined' && console) {
+      console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
+    }
+  };
+
+  /**
+   * Set the immediate function to execute callbacks
+   * @param fn {function} Function to execute
+   * @deprecated
+   */
+  Promise._setImmediateFn = function _setImmediateFn(fn) {
+    Promise._immediateFn = fn;
+  };
+
+  /**
+   * Change the function to execute on unhandled rejection
+   * @param {function} fn Function to execute on unhandled rejection
+   * @deprecated
+   */
+  Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
+    Promise._unhandledRejectionFn = fn;
+  };
+  
+  if (typeof module !== 'undefined' && module.exports) {
+    module.exports = Promise;
+  } else if (!root.Promise) {
+    root.Promise = Promise;
+  }
+
+})(this);
diff --git a/systemvm/agent/noVNC/vnc.html b/systemvm/agent/noVNC/vnc.html
new file mode 100644
index 0000000..a244a7d
--- /dev/null
+++ b/systemvm/agent/noVNC/vnc.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html>
+<html lang="en" class="noVNC_loading">
+<head>
+
+    <!--
+    noVNC example: simple example using default UI
+    Copyright (C) 2019 The noVNC Authors
+    noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
+    This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
+
+    Connect parameters are provided in query string:
+        http://example.com/?host=HOST&port=PORT&encrypt=1
+    or the fragment:
+        http://example.com/#host=HOST&port=PORT&encrypt=1
+    -->
+    <title>noVNC</title>
+
+    <meta charset="utf-8">
+
+    <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
+                Remove this if you use the .htaccess -->
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+
+    <!-- Icons (see app/images/icons/Makefile for what the sizes are for) -->
+    <link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
+    <link rel="icon" sizes="24x24" type="image/png" href="app/images/icons/novnc-24x24.png">
+    <link rel="icon" sizes="32x32" type="image/png" href="app/images/icons/novnc-32x32.png">
+    <link rel="icon" sizes="48x48" type="image/png" href="app/images/icons/novnc-48x48.png">
+    <link rel="icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png">
+    <link rel="icon" sizes="64x64" type="image/png" href="app/images/icons/novnc-64x64.png">
+    <link rel="icon" sizes="72x72" type="image/png" href="app/images/icons/novnc-72x72.png">
+    <link rel="icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png">
+    <link rel="icon" sizes="96x96" type="image/png" href="app/images/icons/novnc-96x96.png">
+    <link rel="icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png">
+    <link rel="icon" sizes="144x144" type="image/png" href="app/images/icons/novnc-144x144.png">
+    <link rel="icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png">
+    <link rel="icon" sizes="192x192" type="image/png" href="app/images/icons/novnc-192x192.png">
+    <!-- Firefox currently mishandles SVG, see #1419039
+    <link rel="icon" sizes="any" type="image/svg+xml" href="app/images/icons/novnc-icon.svg">
+    -->
+    <!-- Repeated last so that legacy handling will pick this -->
+    <link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
+
+    <!-- Apple iOS Safari settings -->
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <!-- Home Screen Icons (favourites and bookmarks use the normal icons) -->
+    <link rel="apple-touch-icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png">
+    <link rel="apple-touch-icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png">
+    <link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png">
+    <link rel="apple-touch-icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png">
+
+    <!-- Stylesheets -->
+    <link rel="stylesheet" href="app/styles/base.css">
+
+    <!-- this is included as a normal file in order to catch script-loading errors as well -->
+    <script src="app/error-handler.js"></script>
+
+    <!-- begin scripts -->
+    <!-- promise polyfills promises for IE11 -->
+    <script src="vendor/promise.js"></script>
+    <!-- ES2015/ES6 modules polyfill -->
+    <script nomodule src="vendor/browser-es-module-loader/dist/browser-es-module-loader.js"></script>
+    <!-- actual script modules -->
+    <script type="module" crossorigin="anonymous" src="app/ui.js"></script>
+    <!-- end scripts -->
+</head>
+
+<body id="body">
+
+    <div id="noVNC_fallback_error" class="noVNC_center">
+        <div>
+            <div>noVNC encountered an error:</div>
+            <br>
+            <div id="noVNC_fallback_errormsg"></div>
+        </div>
+    </div>
+
+    <!-- noVNC Control Bar -->
+    <div id="noVNC_control_bar_anchor" class="noVNC_vcenter">
+
+        <div id="noVNC_control_bar">
+            <div id="noVNC_control_bar_handle" title="Hide/Show the control bar"><div></div></div>
+
+            <div class="noVNC_scroll">
+
+            <h1 class="noVNC_logo" translate="no" style="display: none;"><span>no</span><br>VNC</h1>
+
+            <!-- Drag/Pan the viewport -->
+            <input type="image" alt="Drag" src="app/images/drag.png"
+                id="noVNC_view_drag_button" class="noVNC_button noVNC_hidden"
+                title="Move/Drag Viewport">
+
+            <!--noVNC Touch Device only buttons-->
+            <div id="noVNC_mobile_buttons" style="display: none;">
+                <input type="image" alt="Keyboard" src="app/images/keyboard.png"
+                    id="noVNC_keyboard_button" class="noVNC_button" title="Show Keyboard">
+            </div>
+
+            <!-- Extra manual keys -->
+            <input type="image" alt="Extra keys" src="app/images/toggleextrakeys.png"
+                id="noVNC_toggle_extra_keys_button" class="noVNC_button"
+                title="Show Extra Keys">
+            <div class="noVNC_vcenter">
+            <div id="noVNC_modifiers" class="noVNC_panel">
+                <input type="image" alt="Ctrl" src="app/images/ctrl.png"
+                    id="noVNC_toggle_ctrl_button" class="noVNC_button"
+                    title="Toggle Ctrl">
+                <input type="image" alt="Alt" src="app/images/alt.png"
+                    id="noVNC_toggle_alt_button" class="noVNC_button"
+                    title="Toggle Alt">
+                <input type="image" alt="Windows" src="app/images/windows.png"
+                    id="noVNC_toggle_windows_button" class="noVNC_button"
+                    title="Toggle Windows">
+                <input type="image" alt="Tab" src="app/images/tab.png"
+                    id="noVNC_send_tab_button" class="noVNC_button"
+                    title="Send Tab">
+                <input type="image" alt="Esc" src="app/images/esc.png"
+                    id="noVNC_send_esc_button" class="noVNC_button"
+                    title="Send Escape">
+                <input type="image" alt="Ctrl+Alt+Del" src="app/images/ctrlaltdel.png"
+                    id="noVNC_send_ctrl_alt_del_button" class="noVNC_button"
+                    title="Send Ctrl-Alt-Del">
+            </div>
+            </div>
+
+            <!-- Shutdown/Reboot -->
+            <input type="image" alt="Shutdown/Reboot" src="app/images/power.png"
+                id="noVNC_power_button" class="noVNC_button"
+                title="Shutdown/Reboot...">
+            <div class="noVNC_vcenter">
+            <div id="noVNC_power" class="noVNC_panel">
+                <div class="noVNC_heading">
+                    <img alt="" src="app/images/power.png"> Power
+                </div>
+                <input type="button" id="noVNC_shutdown_button" value="Shutdown">
+                <input type="button" id="noVNC_reboot_button" value="Reboot">
+                <input type="button" id="noVNC_reset_button" value="Reset">
+            </div>
+            </div>
+
+            <!-- Clipboard -->
+            <input type="image" alt="Clipboard" src="app/images/clipboard.png"
+                id="noVNC_clipboard_button" class="noVNC_button"
+                title="Clipboard">
+            <div class="noVNC_vcenter">
+            <div id="noVNC_clipboard" class="noVNC_panel">
+                <div class="noVNC_heading">
+                    <img alt="" src="app/images/clipboard.png"> Clipboard
+                </div>
+                <textarea id="noVNC_clipboard_text" rows=5></textarea>
+                <br>
+                <input id="noVNC_clipboard_send_button" type="button"
+                    value="Send" style="color: white; background: rgb(75, 93, 118);" class="noVNC_submit">
+                <input id="noVNC_clipboard_clear_button" type="button"
+                    value="Clear" class="noVNC_submit">
+            </div>
+            </div>
+
+            <!-- Toggle fullscreen -->
+            <input type="image" alt="Fullscreen" src="app/images/fullscreen.png"
+                id="noVNC_fullscreen_button" class="noVNC_button noVNC_hidden"
+                title="Fullscreen">
+
+            <!-- Settings -->
+            <span style="display: none;">
+                <input type="image" alt="Settings" src="app/images/settings.png"
+                    id="noVNC_settings_button" class="noVNC_button"
+                    title="Settings">
+                <div class="noVNC_vcenter">
+                <div id="noVNC_settings" class="noVNC_panel">
+                    <ul>
+                        <li class="noVNC_heading">
+                            <img alt="" src="app/images/settings.png"> Settings
+                        </li>
+                        <li>
+                            <label><input id="noVNC_setting_shared" type="checkbox"> Shared Mode</label>
+                        </li>
+                        <li>
+                            <label><input id="noVNC_setting_view_only" type="checkbox"> View Only</label>
+                        </li>
+                        <li><hr></li>
+                        <li>
+                            <label><input id="noVNC_setting_view_clip" type="checkbox"> Clip to Window</label>
+                        </li>
+                        <li>
+                            <label for="noVNC_setting_resize">Scaling Mode:</label>
+                            <select id="noVNC_setting_resize" name="vncResize">
+                                <option value="off">None</option>
+                                <option value="scale">Local Scaling</option>
+                                <option value="remote">Remote Resizing</option>
+                            </select>
+                        </li>
+                        <li><hr></li>
+                        <li>
+                            <div class="noVNC_expander">Advanced</div>
+                            <div><ul>
+                                <li>
+                                    <label for="noVNC_setting_quality">Quality:</label>
+                                    <input id="noVNC_setting_quality" type="range" min="0" max="9" value="6">
+                                </li>
+                                <li>
+                                    <label for="noVNC_setting_compression">Compression level:</label>
+                                    <input id="noVNC_setting_compression" type="range" min="0" max="9" value="2">
+                                </li>
+                                <li><hr></li>
+                                <li>
+                                    <label for="noVNC_setting_repeaterID">Repeater ID:</label>
+                                    <input id="noVNC_setting_repeaterID" type="text" value="">
+                                </li>
+                                <li>
+                                    <div class="noVNC_expander">WebSocket</div>
+                                    <div><ul>
+                                        <li>
+                                            <label><input id="noVNC_setting_encrypt" type="checkbox"> Encrypt</label>
+                                        </li>
+                                        <li>
+                                            <label for="noVNC_setting_host">Host:</label>
+                                            <input id="noVNC_setting_host">
+                                        </li>
+                                        <li>
+                                            <label for="noVNC_setting_port">Port:</label>
+                                            <input id="noVNC_setting_port" type="number">
+                                        </li>
+                                        <li>
+                                            <label for="noVNC_setting_path">Path:</label>
+                                            <input id="noVNC_setting_path" type="text" value="websockify">
+                                        </li>
+                                        <li>
+                                            <label for="noVNC_setting_token">Token:</label>
+                                            <input id="noVNC_setting_token" type="text">
+                                        </li>
+                                    </ul></div>
+                                </li>
+                                <li><hr></li>
+                                <li>
+                                    <label><input id="noVNC_setting_reconnect" type="checkbox"> Automatic Reconnect</label>
+                                </li>
+                                <li>
+                                    <label for="noVNC_setting_reconnect_delay">Reconnect Delay (ms):</label>
+                                    <input id="noVNC_setting_reconnect_delay" type="number">
+                                </li>
+                                <li><hr></li>
+                                <li>
+                                    <label><input id="noVNC_setting_show_dot" type="checkbox"> Show Dot when No Cursor</label>
+                                </li>
+                                <li><hr></li>
+                                <!-- Logging selection dropdown -->
+                                <li>
+                                    <label>Logging:
+                                        <select id="noVNC_setting_logging" name="vncLogging">
+                                        </select>
+                                    </label>
+                                </li>
+                            </ul></div>
+                        </li>
+                        <li class="noVNC_version_separator"><hr></li>
+                        <li class="noVNC_version_wrapper">
+                            <span>Version:</span>
+                            <span class="noVNC_version"></span>
+                        </li>
+                    </ul>
+                </div>
+                </div>
+            </span>
+
+            <!-- Connection Controls -->
+            <input style="display: none;" type="image" alt="Disconnect" src="app/images/disconnect.png"
+                id="noVNC_disconnect_button" class="noVNC_button"
+                title="Disconnect">
+
+            </div>
+        </div>
+
+        <div id="noVNC_control_bar_hint"></div>
+
+    </div> <!-- End of noVNC_control_bar -->
+
+    <!-- Status Dialog -->
+    <div id="noVNC_status"></div>
+
+    <!-- Connect button -->
+    <div class="noVNC_center" style="display: none;">
+        <div id="noVNC_connect_dlg">
+            <div class="noVNC_logo" translate="no"><span>no</span>VNC</div>
+            <div id="noVNC_connect_button"><div>
+                <img alt="" src="app/images/connect.png"> Connect
+            </div></div>
+        </div>
+    </div>
+
+    <!-- Password Dialog -->
+    <div class="noVNC_center noVNC_connect_layer">
+    <div id="noVNC_credentials_dlg" class="noVNC_panel"><form>
+        <ul>
+            <li id="noVNC_username_block">
+                <label>Username:</label>
+                <input id="noVNC_username_input">
+            </li>
+            <li id="noVNC_password_block">
+                <label>Password:</label>
+                <input id="noVNC_password_input" type="password">
+            </li>
+            <li>
+                <input id="noVNC_credentials_button" type="submit" value="Send Credentials" class="noVNC_submit">
+            </li>
+        </ul>
+    </form></div>
+    </div>
+
+    <!-- Transition Screens -->
+    <div id="noVNC_transition">
+        <div id="noVNC_transition_text"></div>
+        <div>
+        <input type="button" id="noVNC_cancel_reconnect_button" value="Cancel" class="noVNC_submit">
+        </div>
+        <div class="noVNC_spinner"></div>
+    </div>
+
+    <!-- This is where the RFB elements will attach -->
+    <div id="noVNC_container">
+        <!-- Note that Google Chrome on Android doesn't respect any of these,
+             html attributes which attempt to disable text suggestions on the
+             on-screen keyboard. Let's hope Chrome implements the ime-mode
+             style for example -->
+        <textarea id="noVNC_keyboardinput" autocapitalize="off"
+            autocomplete="off" spellcheck="false" tabindex="-1"></textarea>
+    </div>
+
+    <audio id="noVNC_bell">
+        <source src="app/sounds/bell.oga" type="audio/ogg">
+        <source src="app/sounds/bell.mp3" type="audio/mpeg">
+    </audio>
+ </body>
+ <script type="application/javascript">
+    window.onload = function() {
+        document.getElementById("noVNC_connect_button").click();
+    }
+ </script>
+</html>
diff --git a/systemvm/agent/noVNC/vnc_lite.html b/systemvm/agent/noVNC/vnc_lite.html
new file mode 100644
index 0000000..0be2b53
--- /dev/null
+++ b/systemvm/agent/noVNC/vnc_lite.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+
+    <!--
+    noVNC example: lightweight example using minimal UI and features
+
+    This is a self-contained file which doesn't import WebUtil or external CSS.
+
+    Copyright (C) 2019 The noVNC Authors
+    noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
+    This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
+
+    Connect parameters are provided in query string:
+        http://example.com/?host=HOST&port=PORT&scale=true
+    -->
+    <title>noVNC</title>
+
+    <meta charset="utf-8">
+
+    <!-- Always force latest IE rendering engine (even in intranet) &
+                Chrome Frame. Remove this if you use the .htaccess -->
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+
+    <style>
+
+        body {
+            margin: 0;
+            background-color: dimgrey;
+            height: 100%;
+            display: flex;
+            flex-direction: column;
+        }
+        html {
+            height: 100%;
+        }
+
+        #top_bar {
+            background-color: #6e84a3;
+            color: white;
+            font: bold 12px Helvetica;
+            padding: 6px 5px 4px 5px;
+            border-bottom: 1px outset;
+        }
+        #status {
+            text-align: center;
+        }
+        #sendCtrlAltDelButton {
+            position: fixed;
+            top: 0px;
+            right: 0px;
+            border: 1px outset;
+            padding: 5px 5px 4px 5px;
+            cursor: pointer;
+        }
+        #sendCtrlEscButton {
+            position: fixed;
+            top: 0px;
+            left: 0px;
+            border: 1px outset;
+            padding: 5px 5px 4px 5px;
+            cursor: pointer;
+        }
+        #screen {
+            flex: 1; /* fill remaining space */
+            overflow: hidden;
+        }
+
+    </style>
+
+    <!-- Promise polyfill for IE11 -->
+    <script src="vendor/promise.js"></script>
+
+    <!-- ES2015/ES6 modules polyfill -->
+    <script nomodule src="vendor/browser-es-module-loader/dist/browser-es-module-loader.js"></script>
+
+    <!-- actual script modules -->
+    <script type="module" crossorigin="anonymous">
+        // RFB holds the API to connect and communicate with a VNC server
+        import RFB from './core/rfb.js';
+
+        let rfb;
+        let desktopName;
+
+        // When this function is called we have
+        // successfully connected to a server
+        function connectedToServer(e) {
+            status("Connected");
+        }
+
+        // This function is called when we are disconnected
+        function disconnectedFromServer(e) {
+            if (e.detail.clean) {
+                status("Disconnected");
+            } else {
+                status("Something went wrong, connection is closed");
+            }
+        }
+
+        // When this function is called, the server requires
+        // credentials to authenticate
+        function credentialsAreRequired(e) {
+            const password = prompt("Password Required:");
+            rfb.sendCredentials({ password: password });
+        }
+
+        // When this function is called we have received
+        // a desktop name from the server
+        function updateDesktopName(e) {
+            desktopName = e.detail.name;
+        }
+
+        // Since most operating systems will catch Ctrl+Alt+Del
+        // before they get a chance to be intercepted by the browser,
+        // we provide a way to emulate this key sequence.
+        function sendCtrlAltDel() {
+            rfb.sendCtrlAltDel();
+            return false;
+        }
+
+        function sendCtrlEsc() {
+            rfb.sendCtrlEsc();
+            return false;
+        }
+
+        // Show a status text in the top bar
+        function status(text) {
+            document.getElementById('status').textContent = text;
+        }
+
+        // This function extracts the value of one variable from the
+        // query string. If the variable isn't defined in the URL
+        // it returns the default value instead.
+        function readQueryVariable(name, defaultValue) {
+            // A URL with a query parameter can look like this:
+            // https://www.example.com?myqueryparam=myvalue
+            //
+            // Note that we use location.href instead of location.search
+            // because Firefox < 53 has a bug w.r.t location.search
+            const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
+                  match = document.location.href.match(re);
+            if (typeof defaultValue === 'undefined') { defaultValue = null; }
+
+            if (match) {
+                // We have to decode the URL since want the cleartext value
+                return decodeURIComponent(match[1]);
+            }
+
+            return defaultValue;
+        }
+
+        document.getElementById('sendCtrlAltDelButton')
+            .onclick = sendCtrlAltDel;
+
+        document.getElementById('sendCtrlEscButton')
+            .onclick = sendCtrlEsc;
+
+        // Read parameters specified in the URL query string
+        // By default, use the host and port of server that served this file
+        const host = readQueryVariable('host', window.location.hostname);
+        let port = readQueryVariable('port', window.location.port);
+        const password = readQueryVariable('password', '');
+        const path = readQueryVariable('path', 'websockify');
+
+        // | | |         | | |
+        // | | | Connect | | |
+        // v v v         v v v
+
+        status("Connecting");
+
+        // Build the websocket URL used to connect
+        let url;
+        if (window.location.protocol === "https:") {
+            url = 'wss';
+        } else {
+            url = 'ws';
+        }
+        url += '://' + host;
+        if(port) {
+            url += ':' + port;
+        }
+        url += '/' + path;
+        const token = readQueryVariable('token', '');
+        url += '?token=' + token;
+
+        // Creating a new RFB object will start a new connection
+        rfb = new RFB(document.getElementById('screen'), url,
+                      { credentials: { password: password } });
+
+        // Add listeners to important events from the RFB module
+        rfb.addEventListener("connect",  connectedToServer);
+        rfb.addEventListener("disconnect", disconnectedFromServer);
+        rfb.addEventListener("credentialsrequired", credentialsAreRequired);
+        rfb.addEventListener("desktopname", updateDesktopName);
+
+        // Set parameters that can be changed on an active connection
+        rfb.viewOnly = readQueryVariable('view_only', false);
+        rfb.scaleViewport = readQueryVariable('scale', false);
+    </script>
+</head>
+
+<body>
+    <div id="top_bar">
+        <div id="status">Loading</div>
+        <div id="sendCtrlAltDelButton">Send CtrlAltDel</div>
+        <div id="sendCtrlEscButton">Send CtrlEsc</div>
+    </div>
+    <div id="screen">
+        <!-- This is where the remote screen will appear -->
+    </div>
+</body>
+</html>
diff --git a/systemvm/agent/scripts/ssvm-check.sh b/systemvm/agent/scripts/ssvm-check.sh
index 2abab81..850e71d 100644
--- a/systemvm/agent/scripts/ssvm-check.sh
+++ b/systemvm/agent/scripts/ssvm-check.sh
@@ -118,15 +118,19 @@
 # check for connectivity to the management server
 echo ================================================
 echo Management server is $MGMTSERVER.  Checking connectivity.
-socatout=$(echo | socat - TCP:$MGMTSERVER:8250,connect-timeout=3 2>&1)
-if [ $? -eq 0 ]
-then
-    echo "Good: Can connect to management server port 8250"
-else
-    echo "ERROR: Cannot connect to $MGMTSERVER port 8250"
-    echo $socatout
-    exit 4
-fi
+IFS=',' read -r -a hosts <<< "$MGMTSERVER"
+for host in "${hosts[@]}"
+do
+    socatout=$(echo | socat - TCP:$host:8250,connect-timeout=3 | tr -d '\0' 2>&1)
+    if [ $? -eq 0 ]
+    then
+        echo "Good: Can connect to management server $host port 8250"
+    else
+        echo "ERROR: Cannot connect to $host port 8250"
+        echo $socatout
+        exit 4
+    fi
+done
 
 
 # check for the java process running
@@ -141,6 +145,6 @@
 fi
 
 echo ================================================
-echo Tests Complete.  Look for ERROR or WARNING above.
+echo Tests Complete. Look for ERROR or WARNING above.
 
 exit 0
diff --git a/systemvm/debian/etc/apache2/vhost.template b/systemvm/debian/etc/apache2/vhost.template
index 0226bb4..e930104 100644
--- a/systemvm/debian/etc/apache2/vhost.template
+++ b/systemvm/debian/etc/apache2/vhost.template
@@ -90,7 +90,7 @@
 	#   Enable/Disable SSL for this virtual host.
 	SSLEngine on
 	SSLProtocol TLSv1.2
-	SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
+	SSLCipherSuite @SECLEVEL=1:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
 	SSLHonorCipherOrder on
 
 	#   A self-signed (snakeoil) certificate can be created by installing
diff --git a/systemvm/debian/etc/iptables/iptables-consoleproxy b/systemvm/debian/etc/iptables/iptables-consoleproxy
index 9a1c985..631a4b0 100644
--- a/systemvm/debian/etc/iptables/iptables-consoleproxy
+++ b/systemvm/debian/etc/iptables/iptables-consoleproxy
@@ -35,4 +35,5 @@
 -A INPUT -i eth1 -p tcp -m state --state NEW -m tcp --dport 8001 -j ACCEPT
 -A INPUT -i eth2 -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
 -A INPUT -i eth2 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
+-A INPUT -i eth2 -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
 COMMIT
diff --git a/systemvm/debian/etc/logrotate.d/dnsmasq b/systemvm/debian/etc/logrotate.d/dnsmasq
index 27b6ebc..2c554ac 100644
--- a/systemvm/debian/etc/logrotate.d/dnsmasq
+++ b/systemvm/debian/etc/logrotate.d/dnsmasq
@@ -3,6 +3,7 @@
     missingok
     rotate 5
     notifempty
+    compress
     delaycompress
     sharedscripts
     postrotate
diff --git a/systemvm/debian/opt/cloud/bin/vr_cfg.sh b/systemvm/debian/opt/cloud/bin/vr_cfg.sh
index 619ec5c..8447947 100755
--- a/systemvm/debian/opt/cloud/bin/vr_cfg.sh
+++ b/systemvm/debian/opt/cloud/bin/vr_cfg.sh
@@ -33,7 +33,7 @@
 esac; done
 
 export DEFER_CONFIG=true
-while read line; do
+cat $cfg | while read line; do
     #comment
     if [[ $line == \#* ]]; then
         continue
@@ -74,7 +74,7 @@
 
     fi
 
-done < $cfg
+done 
 
 # archive the configuration file
 mv $cfg /var/cache/cloud/processed/
diff --git a/systemvm/pom.xml b/systemvm/pom.xml
index b8b56fb..43ad109 100644
--- a/systemvm/pom.xml
+++ b/systemvm/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/systemvm/systemvm-agent-descriptor.xml b/systemvm/systemvm-agent-descriptor.xml
index a3f0453..74b1543 100644
--- a/systemvm/systemvm-agent-descriptor.xml
+++ b/systemvm/systemvm-agent-descriptor.xml
@@ -112,5 +112,14 @@
         <include>*.key</include>
       </includes>
     </fileSet>
+    <fileSet>
+      <directory>agent/noVNC</directory>
+      <outputDirectory>noVNC</outputDirectory>
+      <directoryMode>555</directoryMode>
+      <fileMode>555</fileMode>
+      <includes>
+        <include>**/*</include>
+      </includes>
+    </fileSet>
   </fileSets>
 </assembly>
diff --git a/test/integration/component/test_configdrive.py b/test/integration/component/test_configdrive.py
index c8ed337..38a9a7d 100644
--- a/test/integration/component/test_configdrive.py
+++ b/test/integration/component/test_configdrive.py
@@ -32,6 +32,7 @@
 from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.lib.base import (Account,
                              createVlanIpRange,
+                             Configurations,
                              FireWallRule,
                              Host,
                              listVlanIpRanges,
@@ -52,7 +53,8 @@
                              Hypervisor, Template)
 from marvin.lib.common import (get_domain,
                                get_template,
-                               get_zone, get_test_template)
+                               get_zone, get_test_template,
+                               is_config_suitable)
 from marvin.lib.utils import random_gen
 # Import System Modules
 from nose.plugins.attrib import attr
@@ -530,6 +532,24 @@
                     "local-hostname.txt",
                     "local-ipv4.txt",
                     "public-ipv4.txt"]
+        # Verify hostname if the appropriate settings are true
+        configs = Configurations.list(
+            self.api_client,
+            name="global.allow.expose.host.hostname",
+            listall=True
+        )
+        exposeHypevisorHostnameGS = configs[0].value
+
+        configs = Configurations.list(
+            self.api_client,
+            name="account.allow.expose.host.hostname",
+            listall=True
+        )
+
+        exposeHypevisorHostnameAcc = configs[0].value
+
+        if exposeHypevisorHostnameGS == 'true' and exposeHypevisorHostnameAcc == 'true':
+            vm_files.append("hypervisor-host-name.txt")
 
         def get_name(vm_file):
             return "{} metadata".format(
@@ -537,9 +557,9 @@
             )
 
         metadata = {vm_file:
-                    self._get_config_drive_data(ssh,
-                                                metadata_dir + vm_file,
-                                                get_name(vm_file))
+                        self._get_config_drive_data(ssh,
+                                                    metadata_dir + vm_file,
+                                                    get_name(vm_file))
                     for vm_file in vm_files}
 
         self.assertEqual(
@@ -571,6 +591,18 @@
             "Service offering inside metadata does not match "
             "with the instance offering"
         )
+
+        if exposeHypevisorHostnameGS == 'true' and exposeHypevisorHostnameAcc == 'true':
+            hostname = vm.hostname
+
+            self.debug("Verifying hypervisor hostname of the VM: %s" % vm.name)
+            self.assertEqual(
+                str(metadata["hypervisor-host-name.txt"]),
+                hostname,
+                "Hostname in the metadata file does not match the host "
+                "on which the VM is spawned"
+            )
+
         return
 
     def _verify_openstack_metadata(self, ssh, mount_path):
@@ -753,7 +785,8 @@
         self.create_StaticNatRule_For_VM(vm, public_ip, network)
 
         # Verification
-        self.validate_StaticNat_rule_For_VM(public_ip, network, vm)
+
+        # self.validate_StaticNat_rule_For_VM(public_ip, network, vm)
 
         if not self.vpc:
             fw_rule = self.create_FirewallRule(public_ip,
@@ -1090,12 +1123,12 @@
                     self.fail("Failed to decrypt new password")
             except ImportError:
                 # No pycrypto, fallback to openssl
-                cmd = ["echo " +  password_ +
+                cmd = ["echo " + password_ +
                        " | base64 -d"
                        " | openssl rsautl -decrypt -inkey "
                        + self.keypair.private_key_file
                        + " 2> /dev/null"
-                ]
+                       ]
 
                 new_password = subprocess.check_output(cmd, shell=True)
                 self.debug("Decrypted password %s" % new_password)
@@ -1314,6 +1347,7 @@
                                           isstaticnat=static_nat,
                                           listall=True
                                           )
+        self.debug("PUBLIC IP = " + public_ips[0])
         self.assertEqual(isinstance(public_ips, list), True,
                          "List public IP for network should return a "
                          "valid list"
@@ -1675,6 +1709,7 @@
         else:
             self.debug("No host available for migration. "
                        "Test requires at-least 2 hosts")
+        return host
 
     # create_NetworkAclList - Creates network ACL list in the given VPC
     def create_NetworkAclList(self, name, description, vpc):
@@ -2258,3 +2293,242 @@
             keypair=self.keypair.name)
         self.delete(vm1, expunge=True)
         self.delete(shared_network.network)
+
+    @attr(tags=["advanced", "isonw"], required_hardware="true")
+    def test_configdrive_isolated_network_hypervisor_hostname_exposed(self):
+        """Test Configdrive as provider for isolated Networks
+           to provide userdata and password reset functionality
+        """
+
+        # 1. Given a ConfigDrive provider and a network offering
+        #    which has userdata provided ConfigDrive, create
+        #    an Isolated network using that network offering.
+        #    Verify network is successfully created and in the Allocated state
+        #    Set the "global.allow.expose.host.hostname" and "account.allow.expose.host.hostname" flags to true
+        #    to enable viewing hypevisor host name in the metadata file
+        #    Deploy VM in the network created, verify metadata in the configdrive
+        #    my mounting the configdrive ISO and verify the respective files
+        #
+        # 2. Create another Isolated network and plug NIC of the VM to this network
+        #    make it the default NIC, verify the metadata file contents.
+        #
+        # 3. Remove the default NIC, reboot the VM and verify the metadata file contents
+        #
+        # 4. Restart network without cleanup and verify the metadata file contents
+        #
+        # 5. Restart the network with cleanup and verify the metadata file contents
+        # 6. Migrate the VM to another host and verify the metadata file contents
+        # 10. Delete all the created objects (cleanup).
+
+        self.debug("+++ Preparation Scenario: "
+                   "creating an Isolated networks with "
+                   "config drive when config drive provider is "
+                   "enabled.")
+
+        self.given_config_drive_provider_is("Enabled")
+        self.given_a_network_offering_with_configdrive()
+
+        create_network1 = self.when_I_create_a_network_with_that_offering()
+        self.then_the_network_is_successfully_created(create_network1)
+        self.then_the_network_has(create_network1, state="Allocated")
+
+        network1 = create_network1.network
+
+        # Update global setting for "allow.expose.host.hostname"
+        Configurations.update(self.api_client,
+                              name="global.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.api_client,
+                              name="account.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Verify that the above mentioned settings are set to true before proceeding
+        if not is_config_suitable(
+                apiclient=self.api_client,
+                name='global.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('global.allow.expose.host.hostname should be true. skipping')
+
+        if not is_config_suitable(
+                apiclient=self.api_client,
+                name='account.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('Account level setting account.allow.expose.host.hostname should be true. skipping')
+
+        self.debug("+++Deploy VM in the created Isolated network "
+                   "with user data provider as configdrive")
+
+        vm1 = self.when_I_deploy_a_vm(network1)
+
+        public_ip_1 = self.when_I_create_a_static_nat_ip_to(vm1, network1)
+
+        self.then_vr_is_as_expected(network1)
+        self.then_config_drive_is_as_expected(
+            vm1, public_ip_1,
+            metadata=True)
+
+
+        # =====================================================================
+        # Network restart tests
+        # =====================================================================
+
+        self.debug("+++ Scenario: "
+                   "verify config drive after restart Isolated network without"
+                   " cleanup...")
+        self.when_I_restart_the_network_with(network1, cleanup=False)
+        self.then_config_drive_is_as_expected(vm1, public_ip_1, metadata=True)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "verify config drive after restart Isolated network with"
+                   " cleanup...")
+        self.when_I_restart_the_network_with(network1, cleanup=True)
+        self.then_config_drive_is_as_expected(vm1, public_ip_1, metadata=True)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "verify vm metadata after migrate")
+        host = self.migrate_VM(vm1)
+        vm1.hostname = host.name
+        self.then_config_drive_is_as_expected(vm1, public_ip_1, metadata=True)
+
+        # Reset configuration values to default values i.e., false
+        Configurations.update(self.api_client,
+                              name="global.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.api_client,
+                              name="account.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        self.delete(vm1, expunge=True)
+        self.delete(network1)
+
+    @attr(tags=["advanced", "vpc"], required_hardware="true")
+    def test_configdrive_vpc_network_verify_metadata(self):
+        """Test Configdrive for VPC Networks
+           choose user data with configDrive as service provider
+           and test vmdata functionality using ConfigDrive
+        """
+
+        # 1. Given ConfigDrive provider is enabled in zone
+        #    And a network offering for VPC which has
+        #      user data provided by ConfigDrive
+        #    And a VPC
+        #    When I create an VPC Tier in the VPC  using that network offering
+        #    Then the network is successfully created,
+        #    And is in the "Allocated" state.
+
+        # 2. When I deploy a VM in the created VPC tier with user data,
+        #    Then the network state is changed to "Implemented"
+        #    And the VM is successfully deployed and is in the "Running" state
+
+        # 3. And the user data in the ConfigDrive device is as expected
+        # 4. Verify various scenarios and check the data in configdriveIso
+        # 5. Delete all the created objects (cleanup).
+
+        self.debug("+++ Preparation Scenario: "
+                   "Create a tier with config drive "
+                   "when config drive provider is enabled.")
+
+        self.given_a_vpc()
+        self.given_config_drive_provider_is("Enabled")
+        self.given_a_network_offering_for_vpc_with_configdrive()
+        create_network1 = self.when_I_create_a_vpc_tier_with_that_offering(
+            gateway='10.1.1.1')
+        self.then_the_network_is_successfully_created(create_network1)
+        self.then_the_network_has(create_network1, state="Implemented")
+
+        network1 = create_network1.network
+
+        # Update global setting for "allow.expose.host.hostname"
+        Configurations.update(self.api_client,
+                              name="global.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.api_client,
+                              name="account.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Verify that the above mentioned settings are set to true before proceeding
+        if not is_config_suitable(
+                apiclient=self.api_client,
+                name='global.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('global.allow.expose.host.hostname should be true. skipping')
+
+        if not is_config_suitable(
+                apiclient=self.api_client,
+                name='account.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('Account level setting account.allow.expose.host.hostname should be true. skipping')
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "Deploy VM in the Tier 1 with user data")
+        vm = self.when_I_deploy_a_vm(network1)
+        public_ip_1 = self.when_I_create_a_static_nat_ip_to(vm, network1)
+
+        self.then_config_drive_is_as_expected(vm, public_ip_1, metadata=True)
+
+        # =====================================================================
+        # Network restart tests
+        # =====================================================================
+
+        self.debug("+++ Scenario: "
+                   "verify config drive after Restart VPC with cleanup...")
+        self.when_I_restart_the_vpc_with(cleanup=True)
+        self.then_config_drive_is_as_expected(vm, public_ip_1,
+                                              metadata=True, reconnect=False)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "verify config drive after Restart VPC without cleanup...")
+        self.when_I_restart_the_network_with(network1, cleanup=False)
+        self.then_config_drive_is_as_expected(vm, public_ip_1,
+                                              metadata=True, reconnect=False)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "verify config drive after restart tier with cleanup...")
+        self.when_I_restart_the_network_with(network1, cleanup=True)
+        self.then_config_drive_is_as_expected(vm, public_ip_1,
+                                              metadata=True, reconnect=False)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "validate vm metadata after reboot")
+        vm.reboot(self.api_client)
+        self.then_config_drive_is_as_expected(vm, public_ip_1, metadata=True)
+
+        # =====================================================================
+        self.debug("+++ Scenario: "
+                   "validate updated userdata after migrate")
+        host = self.migrate_VM(vm)
+        vm.hostname = host.name
+        self.then_config_drive_is_as_expected(vm, public_ip_1, metadata=True)
+
+        # Reset configuration values to default values i.e., false
+        Configurations.update(self.api_client,
+                              name="global.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.api_client,
+                              name="account.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        self.delete(vm, expunge=True)
+        self.delete(network1)
diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py
index 9fce1ef..50341ac 100644
--- a/test/integration/component/test_volumes.py
+++ b/test/integration/component/test_volumes.py
@@ -1454,11 +1454,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cleanup_resources(cls.api_client, cls._cleanup)
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestMigrateVolume,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1470,8 +1466,7 @@
         return
 
     def tearDown(self):
-        cleanup_resources(self.apiclient, self.cleanup)
-        return
+        super(TestMigrateVolume,self).tearDown()
 
     @attr(tags=["advanced", "sg", "advancedsg"], required_hardware='true')
     def test_01_migrateVolume(self):
diff --git a/test/integration/component/test_vr_metadata.py b/test/integration/component/test_vr_metadata.py
new file mode 100644
index 0000000..c566510
--- /dev/null
+++ b/test/integration/component/test_vr_metadata.py
@@ -0,0 +1,337 @@
+# 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.
+
+
+# this script will cover VMdeployment  with Userdata tests
+
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.lib.base import *
+from marvin.lib.utils import (validateList, cleanup_resources)
+from marvin.lib.common import *
+from nose.plugins.attrib import attr
+from marvin.codes import PASS,FAIL
+
+_multiprocess_shared_ = True
+
+class Services:
+    def __init__(self):
+        self.services = {
+            "virtual_machine": {
+                "displayname": "TesVM1",
+                "username": "root",
+                "password": "password",
+                "ssh_port": 22,
+                "hypervisor": 'XenServer',
+                "privateport": 22,
+                "publicport": 22,
+                "protocol": 'TCP',
+                },
+            "ostype": 'CentOS 5.5 (64-bit)',
+            "service_offering": {
+                "name": "Tiny Instance",
+                "displaytext": "Tiny Instance",
+                "cpunumber": 1,
+                "cpuspeed": 100,
+                "memory": 256,
+                },
+            }
+
+class TestDeployVmWithMetaData(cloudstackTestCase):
+    @classmethod
+    def setUpClass(cls):
+        cls.testclient = super(TestDeployVmWithMetaData, cls).getClsTestClient()
+        cls.apiclient = cls.testclient.getApiClient()
+        cls._cleanup = []
+        #cls.services = Services().services
+        cls.services = cls.testclient.getParsedTestDataConfig()
+        cls.zone = get_zone(cls.apiclient, cls.testclient.getZoneForTests())
+        cls.service_offering = ServiceOffering.create(
+            cls.apiclient,
+            cls.services["service_offering"]
+        )
+
+        cls.template = get_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.services["ostype"]
+        )
+
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cls._cleanup = cls._cleanup[::-1]
+            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.cleanup = []
+
+    def tearDown(self):
+        try:
+            self.cleanup = self.cleanup[::-1]
+            cleanup_resources(self.apiclient, self.cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
+
+    def migrate_VM(self, vm):
+        """Migrates VM to another host, if available"""
+        self.debug("+++ Migrating one of the VMs in the created "
+                   "VPC Tier network to another host, if available...")
+        self.debug("Checking if a host is available for migration...")
+        hosts = Host.listForMigration(self.apiclient, virtualmachineid=vm.id)
+        if hosts:
+            self.assertEqual(isinstance(hosts, list), True,
+                             "List hosts should return a valid list"
+                             )
+            host = hosts[0]
+            self.debug("Migrating VM with ID: "
+                       "%s to Host: %s" % (vm.id, host.id))
+            try:
+                vm.migrate(self.apiclient, hostid=host.id)
+            except Exception as e:
+                self.fail("Failed to migrate instance, %s" % e)
+            self.debug("Migrated VM with ID: "
+                       "%s to Host: %s" % (vm.id, host.id))
+        else:
+            self.debug("No host available for migration. "
+                       "Test requires at-least 2 hosts")
+        return host
+
+    def list_nics(self, vm_id):
+        list_vm_res = VirtualMachine.list(self.apiclient, id=vm_id)
+        self.assertEqual(validateList(list_vm_res)[0], PASS, "List vms returned invalid response")
+        nics = list_vm_res[0].nic
+        for nic in nics:
+            if nic.type == "Shared":
+                nic_res = NIC.list(
+                    self.apiclient,
+                    virtualmachineid=vm_id,
+                    nicid=nic.id
+                )
+                nic_ip = nic_res[0].ipaddress
+                self.assertIsNotNone(nic_ip, "listNics API response does not have the ip address")
+            else:
+                continue
+        return
+
+    @attr(tags=["advanced"], required_hardware='True')
+    def test_deployVM_verify_metadata_in_VR(self):
+        """
+        1. Create a network (VR as a provider)
+        2. Deploy a VM in the network
+        3. Verify VM deployment
+        4. From the VM, curl the gateway of the VR to verify the corresponding metadata - hypervisor host name
+            if the respective Global level and account level flags are set to true
+        """
+        # Update global setting for "global.allow.expose.host.hostname"
+        Configurations.update(self.apiclient,
+                              name="global.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.apiclient,
+                              name="account.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Verify that the above mentioned settings are set to true before proceeding
+        if not is_config_suitable(
+                apiclient=self.apiclient,
+                name='global.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('global.allow.expose.host.hostname should be true. skipping')
+
+        if not is_config_suitable(
+                apiclient=self.apiclient,
+                name='account.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('account.allow.expose.host.hostname should be true. skipping')
+
+        self.no_isolate = NetworkOffering.create(
+            self.apiclient,
+            self.services["isolated_network_offering"]
+        )
+        self.no_isolate.update(self.apiclient, state='Enabled')
+        self.isolated_network = Network.create(
+            self.apiclient,
+            self.services["network"],
+            networkofferingid=self.no_isolate.id,
+            zoneid=self.zone.id,
+            accountid="admin",
+            domainid=1
+        )
+        self.cleanup.append(self.isolated_network)
+
+        self.vm = VirtualMachine.create(
+            self.apiclient,
+            self.services["virtual_machine"],
+            templateid=self.template.id,
+            accountid="admin",
+            domainid=1,
+            serviceofferingid=self.service_offering.id,
+            zoneid=self.zone.id,
+            networkids=[self.isolated_network.id],
+        )
+        self.assertIsNotNone(
+            self.vm,
+            "VM creation failed in the isolated network"
+        )
+        self.cleanup.append(self.vm)
+
+        ip_addr = self.vm.ipaddress
+        self.debug("VM ip address = %s" % ip_addr)
+
+        # Verify the retrieved ip address in listNICs API response
+        self.list_nics(self.vm.id)
+        vr_res = Router.list(
+            self.apiclient,
+            networkid=self.isolated_network.id,
+            listAll=True
+        )
+        self.assertEqual(validateList(vr_res)[0], PASS, "List Routers returned invalid response")
+        vr_ip = vr_res[0].guestipaddress
+        ssh = self.vm.get_ssh_client(ipaddress=ip_addr)
+        cmd = "curl http://%s/latest/hypervisor-host-name" % vr_ip
+        res = ssh.execute(cmd)
+        self.debug("Verifying hypervisor hostname details in the VR")
+        self.assertEqual(
+            str(res),
+            self.vm.hostname,
+            "Failed to get the hypervisor host name from VR in isolated network"
+        )
+        # Reset configuration values to default values i.e., false
+        Configurations.update(self.apiclient,
+                              name="global.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.apiclient,
+                              name="account.allow.expose.host.hostname",
+                              value="false"
+                              )
+        return
+
+    @attr(tags=["advanced"], required_hardware='True')
+    def test_deployVM_verify_metadata_in_VR_after_migration(self):
+        """
+        1. Create a network (VR as a provider)
+        2. Deploy a VM in the network
+        3. Verify VM deployment
+        4. Migrate VM to another host
+        4. After migration, from the VM, curl the gateway to verify the corresponding metadata - hypervisor host name
+            if the respective Global level and account level flags are set to true
+        """
+        # Update global setting for "global.allow.expose.host.hostname"
+        Configurations.update(self.apiclient,
+                              name="global.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.apiclient,
+                              name="account.allow.expose.host.hostname",
+                              value="true"
+                              )
+
+        # Verify that the above mentioned settings are set to true before proceeding
+        if not is_config_suitable(
+                apiclient=self.apiclient,
+                name='global.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('global.allow.expose.host.hostname should be true. skipping')
+
+        if not is_config_suitable(
+                apiclient=self.apiclient,
+                name='account.allow.expose.host.hostname',
+                value='true'):
+            self.skipTest('Account level account.allow.expose.host.hostname should be true. skipping')
+
+        self.no_isolate = NetworkOffering.create(
+            self.apiclient,
+            self.services["isolated_network_offering"]
+        )
+        self.no_isolate.update(self.apiclient, state='Enabled')
+        self.isolated_network = Network.create(
+            self.apiclient,
+            self.services["network"],
+            networkofferingid=self.no_isolate.id,
+            zoneid=self.zone.id,
+            accountid="admin",
+            domainid=1
+        )
+        self.cleanup.append(self.isolated_network)
+
+        self.vm = VirtualMachine.create(
+            self.apiclient,
+            self.services["virtual_machine"],
+            templateid=self.template.id,
+            accountid="admin",
+            domainid=1,
+            serviceofferingid=self.service_offering.id,
+            zoneid=self.zone.id,
+            networkids=[self.isolated_network.id],
+        )
+        self.assertIsNotNone(
+            self.vm,
+            "VM creation failed in the isolated network"
+        )
+
+        host = self.migrate_VM(self.vm)
+
+        self.cleanup.append(self.vm)
+
+        ip_addr = self.vm.ipaddress
+        self.debug("VM ip address = %s" % ip_addr)
+
+        # Verify the retrieved ip address in listNICs API response
+        self.list_nics(self.vm.id)
+        vr_res = Router.list(
+            self.apiclient,
+            networkid=self.isolated_network.id,
+            listAll=True
+        )
+        self.assertEqual(validateList(vr_res)[0], PASS, "List Routers returned invalid response")
+        vr_ip = vr_res[0].guestipaddress
+        ssh = self.vm.get_ssh_client(ipaddress=ip_addr)
+        cmd = "curl http://%s/latest/hypervisor-host-name" % vr_ip
+        res = ssh.execute(cmd)
+        self.debug("Verifying hypervisor hostname details in the VR")
+        self.assertEqual(
+            str(res),
+            host.name,
+            "Failed to get the hypervisor host name from VR in isolated network"
+        )
+        # Reset configuration values to default values i.e., false
+        Configurations.update(self.apiclient,
+                              name="global.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        # Update Account level setting
+        Configurations.update(self.apiclient,
+                              name="account.allow.expose.host.hostname",
+                              value="false"
+                              )
+
+        return
+
diff --git a/test/integration/smoke/test_accounts.py b/test/integration/smoke/test_accounts.py
index 43aa6bd..bec615d 100644
--- a/test/integration/smoke/test_accounts.py
+++ b/test/integration/smoke/test_accounts.py
@@ -153,12 +153,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestAccounts,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -167,12 +162,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created accounts, domains etc
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestAccounts,self).tearDown()
 
     @attr(
         tags=[
@@ -352,12 +342,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestRemoveUserFromAccount,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -366,12 +351,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created instance, users etc
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestRemoveUserFromAccount,self).tearDown()
 
     @attr(
         tags=[
@@ -513,12 +493,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestNonRootAdminsPrivileges,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -527,12 +502,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created accounts
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestNonRootAdminsPrivileges,self).tearDown()
 
     @attr(
         tags=[
@@ -642,12 +612,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestServiceOfferingSiblings,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -656,12 +621,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created domains, accounts
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestServiceOfferingSiblings,self).tearDown()
 
     @attr(
         tags=[
@@ -766,12 +726,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestServiceOfferingHierarchy,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -780,12 +735,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created instance, volumes and snapshots
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestServiceOfferingHierarchy,self).tearDown()
 
     @attr(
         tags=[
@@ -908,12 +858,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestTemplateHierarchy,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -922,12 +867,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created instance, volumes and snapshots
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestTemplateHierarchy,self).tearDown()
 
     @attr(tags=["advanced", "basic", "eip", "advancedns", "sg"], required_hardware="true")
     def test_01_template_hierarchy(self):
@@ -1064,12 +1004,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestAddVmToSubDomain,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1078,12 +1013,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestAddVmToSubDomain,self).tearDown()
 
     @attr(
         tags=[
@@ -1160,12 +1090,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserDetails,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1174,12 +1099,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created network offerings
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserDetails,self).tearDown()
 
     @attr(tags=[
         "role",
@@ -1459,12 +1379,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserLogin,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1473,12 +1388,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created network offerings
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserLogin,self).tearDown()
 
     @attr(tags=["login", "accounts", "simulator", "advanced",
                 "advancedns", "basic", "eip", "sg"])
@@ -1716,12 +1626,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Cleanup resources used
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserAPIKeys,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1730,12 +1635,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created network offerings
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestUserAPIKeys,self).tearDown()
 
     @attr(tags=[
         "role",
@@ -1868,13 +1768,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestDomainForceRemove,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -1883,12 +1777,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestDomainForceRemove,self).tearDown()
 
     @attr(
         tags=[
@@ -2247,13 +2136,7 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(cls.api_client, reversed(cls._cleanup))
-        except Exception as e:
-
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestMoveUser,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
@@ -2284,12 +2167,7 @@
         return
 
     def tearDown(self):
-        try:
-            # Clean up, terminate the created resources
-            cleanup_resources(self.apiclient, reversed(self.cleanup))
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestMoveUser,self).tearDownClass()
 
     @attr(tags=["domains", "advanced", "advancedns", "simulator","dvs"], required_hardware="false")
     def test_move_user_to_accountID(self):
diff --git a/test/integration/smoke/test_certauthority_root.py b/test/integration/smoke/test_certauthority_root.py
index 45ffd52..a7cf188 100644
--- a/test/integration/smoke/test_certauthority_root.py
+++ b/test/integration/smoke/test_certauthority_root.py
@@ -16,11 +16,10 @@
 # under the License.
 
 from nose.plugins.attrib import attr
-from marvin.cloudstackTestCase import *
-from marvin.cloudstackAPI import *
-from marvin.lib.utils import *
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.lib.utils import cleanup_resources
 from marvin.lib.base import *
-from marvin.lib.common import *
+from marvin.lib.common import list_hosts
 
 from cryptography import x509
 from cryptography.hazmat.backends import default_backend
diff --git a/test/integration/smoke/test_deploy_virtio_scsi_vm.py b/test/integration/smoke/test_deploy_virtio_scsi_vm.py
index 8969097..0bcf999 100644
--- a/test/integration/smoke/test_deploy_virtio_scsi_vm.py
+++ b/test/integration/smoke/test_deploy_virtio_scsi_vm.py
@@ -33,9 +33,6 @@
                              Host,
                              GuestOs)
 
-# utils - utility classes for common cleanup, external library wrappers etc
-from marvin.lib.utils import cleanup_resources, get_hypervisor_type, validateList
-
 # common - commonly used methods for all tests are listed here
 from marvin.lib.common import get_zone, get_domain, get_pod
 
@@ -96,7 +93,7 @@
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.pod = get_pod(cls.apiclient, cls.zone.id)
         cls.services['mode'] = cls.zone.networktype
-        cls.cleanup = []
+        cls._cleanup = []
         if cls.hypervisor.lower() not in ['kvm']:
             cls.hypervisorNotSupported = True
             return
@@ -108,6 +105,7 @@
             hypervisor=cls.hypervisor.lower(),
             domainid=cls.domain.id)
         cls.template.download(cls.apiclient)
+        cls._cleanup.append(cls.template)
 
         if cls.template == FAILED:
             assert False, "get_template() failed to return template"
@@ -120,16 +118,19 @@
             cls.services["account"],
             domainid=cls.domain.id
         )
+        cls._cleanup.append(cls.account)
 
         cls.service_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["service_offerings"]["small"]
         )
+        cls._cleanup.append(cls.service_offering)
 
         cls.sparse_disk_offering = DiskOffering.create(
             cls.apiclient,
             cls.services["sparse_disk_offering"]
         )
+        cls._cleanup.append(cls.sparse_disk_offering)
 
         cls.virtual_machine = VirtualMachine.create(
             cls.apiclient,
@@ -158,29 +159,20 @@
 
         # Start VM after password reset
         cls.virtual_machine.start(cls.apiclient)
+        cls._cleanup.append(cls.virtual_machine)
 
-        cls.cleanup = [
-            cls.template,
-            cls.service_offering,
-            cls.sparse_disk_offering,
-            cls.account
-        ]
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cls.apiclient = super(
-                TestDeployVirtioSCSIVM,
-                cls
-            ).getClsTestClient().getApiClient()
-            # Cleanup resources used
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
+        super(TestDeployVirtioSCSIVM, cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
         self.dbclient = self.testClient.getDbConnection()
+        self.cleanup = []
+
+    def tearDown(self):
+        super(TestDeployVirtioSCSIVM, self).tearDown()
 
     def verifyVirshState(self, diskcount):
         host = self.vmhost.ipaddress
diff --git a/test/integration/smoke/test_deploy_vm_extra_config_data.py b/test/integration/smoke/test_deploy_vm_extra_config_data.py
index 63e0040..3078cce 100644
--- a/test/integration/smoke/test_deploy_vm_extra_config_data.py
+++ b/test/integration/smoke/test_deploy_vm_extra_config_data.py
@@ -32,7 +32,7 @@
 from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.lib.base import (Account,
                              ServiceOffering,
-                             )
+                             Host)
 from marvin.lib.common import (get_domain,
                                get_zone,
                                get_template,
@@ -79,16 +79,42 @@
             cls.service_offering
         ]
 
+        cls.hosts_hugepages = cls.set_hosts_hugepages()
+
     @classmethod
     def tearDownClass(cls):
         try:
             cls.apiclient = super(TestAddConfigtoDeployVM, cls).getClsTestClient().getApiClient()
+            cls.reset_hosts_hugepages()
             # Clean up, terminate the created templates
             cleanup_resources(cls.apiclient, cls.cleanup)
 
         except Exception as e:
             raise Exception("Warning: Exception during cleanup : %s" % e)
 
+    @classmethod
+    def set_hosts_hugepages(cls):
+        hosts_hugepages = []
+        listHost = Host.list(
+               cls.apiclient,
+               type='Routing',
+               zoneid=cls.zone.id
+           )
+        for host in listHost:
+            if host.hypervisor.lower() == 'kvm':
+                sshClient = SshClient(host.ipaddress, port=22, user=cls.hostConfig["username"], passwd=cls.hostConfig["password"])
+                result = sshClient.execute("sysctl -n vm.nr_hugepages")
+                sshClient.execute("sysctl -w vm.nr_hugepages=1024")
+                if result and len(result) > 0:
+                    hosts_hugepages.append({ "ipaddress": host.ipaddress, "vm.nr_hugepages": result[0].strip()})
+        return hosts_hugepages
+
+    @classmethod
+    def reset_hosts_hugepages(cls):
+        for host in cls.hosts_hugepages:
+            sshClient = SshClient(host["ipaddress"], port=22, user=cls.hostConfig["username"], passwd=cls.hostConfig["password"])
+            sshClient.execute("sysctl -w vm.nr_hugepages=%s" % host["vm.nr_hugepages"])
+
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
         self.hypervisor = self.testClient.getHypervisorInfo()
diff --git a/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py b/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py
index 62ba1a4..181958d 100644
--- a/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py
+++ b/test/integration/smoke/test_deploy_vms_with_varied_deploymentplanners.py
@@ -19,7 +19,6 @@
 from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.lib.base import Account, VirtualMachine, ServiceOffering, Host, Cluster
 from marvin.lib.common import get_zone, get_domain, get_test_template
-from marvin.lib.utils import cleanup_resources
 from nose.plugins.attrib import attr
 
 class TestDeployVmWithVariedPlanners(cloudstackTestCase):
@@ -57,9 +56,8 @@
         )
         cls.hosts = Host.list(cls.apiclient, type='Routing')
         cls.clusters = Cluster.list(cls.apiclient)
-        cls.cleanup = [
-            cls.account
-        ]
+        cls._cleanup = []
+        cls._cleanup.append(cls.account)
 
     @attr(tags=["advanced", "basic", "sg"], required_hardware="false")
     def test_deployvm_firstfit(self):
@@ -230,7 +228,4 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
+        super(TestDeployVmWithVariedPlanners,cls).tearDownClass()
diff --git a/test/integration/smoke/test_diagnostics.py b/test/integration/smoke/test_diagnostics.py
index 810dbb8..176f74b 100644
--- a/test/integration/smoke/test_diagnostics.py
+++ b/test/integration/smoke/test_diagnostics.py
@@ -30,7 +30,6 @@
                                get_test_template,
                                list_ssvms,
                                list_routers)
-from marvin.lib.utils import (cleanup_resources)
 from nose.plugins.attrib import attr
 
 
@@ -61,16 +60,20 @@
 
         cls.services["virtual_machine"]["zoneid"] = cls.zone.id
 
+        cls._cleanup = []
+
         # Create an account, network, VM and IP addresses
         cls.account = Account.create(
             cls.apiclient,
             cls.services["account"],
             domainid=cls.domain.id
         )
+        cls._cleanup.append(cls.account)
         cls.service_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["service_offerings"]["tiny"]
         )
+        cls._cleanup.append(cls.service_offering)
         cls.vm_1 = VirtualMachine.create(
             cls.apiclient,
             cls.services["virtual_machine"],
@@ -79,27 +82,19 @@
             domainid=cls.account.domainid,
             serviceofferingid=cls.service_offering.id
         )
-        cls.cleanup = [
-            cls.account,
-            cls.service_offering
-        ]
+        cls._cleanup.append(cls.vm_1)
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cls.apiclient = super(
-                TestRemoteDiagnostics,
-                cls
-            ).getClsTestClient().getApiClient()
-            # Clean up, terminate the created templates
-            cleanup_resources(cls.apiclient, cls.cleanup)
-
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
+        super(TestRemoteDiagnostics,cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
         self.hypervisor = self.testClient.getHypervisorInfo()
+        self.cleanup = []
+
+    def tearDown(self):
+        super(TestRemoteDiagnostics,self).tearDown()
 
     @attr(tags=["advanced", "advancedns", "ssh", "smoke"], required_hardware="true")
     def test_01_ping_in_vr_success(self):
diff --git a/test/integration/smoke/test_dynamicroles.py b/test/integration/smoke/test_dynamicroles.py
index 61e1d19..2ce7001 100644
--- a/test/integration/smoke/test_dynamicroles.py
+++ b/test/integration/smoke/test_dynamicroles.py
@@ -45,6 +45,14 @@
                 "type": "User",
                 "description": "Fake Role created by Marvin test"
             },
+            "importrole": {
+                "name": "MarvinFake Import Role ",
+                "type": "User",
+                "description": "Fake Import User Role created by Marvin test",
+                "rules" : [{"rule":"list*", "permission":"allow","description":"Listing apis"},
+                           {"rule":"get*", "permission":"allow","description":"Get apis"},
+                           {"rule":"update*", "permission":"deny","description":"Update apis"}]
+            },
             "roleadmin": {
                 "name": "MarvinFake Admin Role ",
                 "type": "Admin",
@@ -201,6 +209,91 @@
             msg="Role type does not match the test data"
         )
 
+    @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
+    def test_role_lifecycle_clone(self):
+        """
+            Tests create role from existing role
+        """
+        # Use self.role created in setUp()
+        role_to_be_cloned = {
+            "name": "MarvinFake Clone Role ",
+            "roleid": self.role.id,
+            "description": "Fake Role cloned by Marvin test"
+        }
+
+        try:
+            role_cloned = Role.create(
+                self.apiclient,
+                role_to_be_cloned
+            )
+            self.cleanup.append(role_cloned)
+        except CloudstackAPIException as e:
+            self.fail("Failed to create the role: %s" % e)
+
+        list_role_cloned= Role.list(self.apiclient, id=role_cloned.id)
+        self.assertEqual(
+            isinstance(list_role_cloned, list),
+            True,
+            "List Roles response was not a valid list"
+        )
+        self.assertEqual(
+            len(list_role_cloned),
+            1,
+            "List Roles response size was not 1"
+        )
+        self.assertEqual(
+            list_role_cloned[0].name,
+            role_to_be_cloned["name"],
+            msg="Role name does not match the test data"
+        )
+        self.assertEqual(
+            list_role_cloned[0].type,
+            self.testdata["role"]["type"],
+            msg="Role type does not match the test data"
+        )
+
+        list_rolepermissions = RolePermission.list(self.apiclient, roleid=self.role.id)
+        self.validate_permissions_list(list_rolepermissions, role_cloned.id)
+
+    @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
+    def test_role_lifecycle_import(self):
+        """
+            Tests import role with the rules
+        """
+        # use importrole from testdata
+        self.testdata["importrole"]["name"] += self.getRandomString()
+        try:
+            role_imported = Role.importRole(
+                self.apiclient,
+                self.testdata["importrole"]
+            )
+            self.cleanup.append(role_imported)
+        except CloudstackAPIException as e:
+            self.fail("Failed to import the role: %s" % e)
+
+        list_role_imported = Role.list(self.apiclient, id=role_imported.id)
+        self.assertEqual(
+            isinstance(list_role_imported, list),
+            True,
+            "List Roles response was not a valid list"
+        )
+        self.assertEqual(
+            len(list_role_imported),
+            1,
+            "List Roles response size was not 1"
+        )
+        self.assertEqual(
+            list_role_imported[0].name,
+            self.testdata["importrole"]["name"],
+            msg="Role name does not match the test data"
+        )
+        self.assertEqual(
+            list_role_imported[0].type,
+            self.testdata["importrole"]["type"],
+            msg="Role type does not match the test data"
+        )
+
+        self.validate_permissions_dict(self.testdata["importrole"]["rules"], role_imported.id)
 
     @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
     def test_role_lifecycle_update(self):
@@ -360,44 +453,23 @@
             self.cleanup.append(permission)
             permissions.append(permission)
 
-
-        def validate_permissions_list(permissions):
-            list_rolepermissions = RolePermission.list(self.apiclient, roleid=self.role.id)
-            self.assertEqual(
-                len(list_rolepermissions),
-                len(permissions),
-                msg="List of role permissions do not match created list of permissions"
-            )
-
-            for idx, rolepermission in enumerate(list_rolepermissions):
-                self.assertEqual(
-                    rolepermission.rule,
-                    permissions[idx].rule,
-                    msg="Rule permission don't match with expected item at the index"
-                )
-                self.assertEqual(
-                    rolepermission.permission,
-                    permissions[idx].permission,
-                    msg="Rule permission don't match with expected item at the index"
-                )
-
         # Move last item to the top
         rule = permissions.pop(len(permissions)-1)
         permissions = [rule] + permissions
         rule.update(self.apiclient, ruleorder=",".join(map(lambda x: x.id, permissions)))
-        validate_permissions_list(permissions)
+        self.validate_permissions_list(permissions, self.role.id)
 
         # Move to the bottom
         rule = permissions.pop(0)
         permissions = permissions + [rule]
         rule.update(self.apiclient, ruleorder=",".join(map(lambda x: x.id, permissions)))
-        validate_permissions_list(permissions)
+        self.validate_permissions_list(permissions, self.role.id)
 
         # Random shuffles
         for _ in range(3):
             shuffle(permissions)
             rule.update(self.apiclient, ruleorder=",".join(map(lambda x: x.id, permissions)))
-            validate_permissions_list(permissions)
+            self.validate_permissions_list(permissions, self.role.id)
 
     @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
     def test_rolepermission_lifecycle_update_permission(self):
@@ -580,3 +652,43 @@
 
         # Perform actual API call for allow API
         self.checkApiCall(apiConfig, userApiClient)
+
+    def validate_permissions_list(self, permissions, roleid):
+        list_rolepermissions = RolePermission.list(self.apiclient, roleid=roleid)
+        self.assertEqual(
+            len(list_rolepermissions),
+            len(permissions),
+            msg="List of role permissions do not match created list of permissions"
+        )
+
+        for idx, rolepermission in enumerate(list_rolepermissions):
+            self.assertEqual(
+                rolepermission.rule,
+                permissions[idx].rule,
+                msg="Rule permission don't match with expected item at the index"
+            )
+            self.assertEqual(
+                rolepermission.permission,
+                permissions[idx].permission,
+                msg="Rule permission don't match with expected item at the index"
+            )
+
+    def validate_permissions_dict(self, permissions, roleid):
+        list_rolepermissions = RolePermission.list(self.apiclient, roleid=roleid)
+        self.assertEqual(
+            len(list_rolepermissions),
+            len(permissions),
+            msg="List of role permissions do not match created list of permissions"
+        )
+
+        for idx, rolepermission in enumerate(list_rolepermissions):
+            self.assertEqual(
+                rolepermission.rule,
+                permissions[idx]["rule"],
+                msg="Rule permission don't match with expected item at the index"
+            )
+            self.assertEqual(
+                rolepermission.permission,
+                permissions[idx]["permission"],
+                msg="Rule permission don't match with expected item at the index"
+            )
diff --git a/test/integration/smoke/test_enable_role_based_users_in_projects.py b/test/integration/smoke/test_enable_role_based_users_in_projects.py
new file mode 100644
index 0000000..16cce8c
--- /dev/null
+++ b/test/integration/smoke/test_enable_role_based_users_in_projects.py
@@ -0,0 +1,271 @@
+# 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.
+
+from marvin.cloudstackAPI import *
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.cloudstackException import CloudstackAPIException
+from marvin.lib.base import Account, User, Project, ProjectRole, ProjectRolePermission, PublicIPAddress
+from marvin.lib.utils import cleanup_resources
+from nose.plugins.attrib import attr
+from random import shuffle
+
+import copy
+import random
+import re
+
+
+class TestData(object):
+    """Test data object that is required to create resources
+    """
+
+    def __init__(self):
+        self.testdata = {
+            "account": {
+                "email": "user@test.com",
+                "firstname": "User",
+                "lastname": "User",
+                "username": "user",
+                "password": "password",
+            },
+            "useracc": {
+                "email": "user1@test.com",
+                "firstname": "User",
+                "lastname": "User",
+                "username": "user1",
+                "password": "fr3sca",
+            },
+            "project": {
+                "name": "Test Project",
+                "displaytext": "Test project",
+            },
+            "projectrole": {
+                "name": "MarvinFake project Role ",
+                "description": "Fake project Role created by Marvin test"
+            },
+            "projectrolepermission": {
+                "rule": "listPublicIpAddresses",
+                "permission": "deny",
+                "description": "Fake role permission created by Marvin test"
+            }
+        }
+
+
+class TestRoleBasedUsersInProjects(cloudstackTestCase):
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.dbclient = self.testClient.getDbConnection()
+        self.testdata = TestData().testdata
+
+        feature_enabled = self.apiclient.listCapabilities(listCapabilities.listCapabilitiesCmd()).dynamicrolesenabled
+        if not feature_enabled:
+            self.skipTest("Dynamic Role-Based API checker not enabled, skipping test")
+
+        self.testdata["projectrole"]["name"] += self.getRandomString()
+        self.project = Project.create(self.apiclient, self.testdata["project"])
+        self.projectrole = ProjectRole.create(
+            self.apiclient,
+            self.testdata["projectrole"],
+            self.project.id
+        )
+
+        self.testdata["projectrolepermission"]["projectroleid"] = self.projectrole.id
+        self.projectrolepermission = ProjectRolePermission.create(
+            self.apiclient,
+            self.testdata["projectrolepermission"],
+            self.project.id
+        )
+
+        self.cleanup = [self.project]
+
+    def tearDown(self):
+        try:
+            cleanup_resources(self.apiclient, self.cleanup)
+        except Exception as e:
+            self.debug("Warning! Exception in tearDown: %s" % e)
+
+    def getUserApiClient(self, username, domain='ROOT', role_type='User'):
+        self.user_apiclient = self.testClient.getUserApiClient(UserName=username, DomainName=domain,
+                                                               type=self.translateRoleToAccountType(role_type))
+        return self.user_apiclient
+
+    def getRandomString(self):
+        return "".join(random.choice("abcdefghijklmnopqrstuvwxyz0123456789") for _ in range(10))
+
+    def translateRoleToAccountType(self, role_type):
+        if role_type == "User":
+            return 0
+        elif role_type == "Admin":
+            return 1
+        elif role_type == "DomainAdmin":
+            return 2
+        elif role_type == "ResourceAdmin":
+            return 3
+        return -1
+
+    @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
+    def test_add_account_to_project_with_project_role(self):
+        """
+            1. Create a User Account
+            2. Add user account with 'Regular' project account role associate it with a Project role;
+                The role defines what APIs are allowed/disallowed for the user: here, 'listPublicIpAddresses'
+                is denied for the user account
+            3. Execute the 'listPublicIpAddresses' API and verify/confirm that the API isn't allowed to be executed
+                by the account
+        """
+        self.useraccount = Account.create(
+            self.apiclient,
+            self.testdata["account"],
+            roleid=4
+        )
+        self.cleanup.append(self.useraccount)
+        # Add account to the project
+        self.project.addAccount(
+            self.apiclient,
+            account=self.useraccount.name,
+            projectroleid=self.projectrole.id
+        )
+
+        self.userapiclient = self.testClient.getUserApiClient(
+            UserName=self.useraccount.name,
+            DomainName=self.useraccount.domain,
+            type=0)
+        try:
+            PublicIPAddress.list(
+                self.userapiclient,
+                projectid=self.project.id
+            )
+            self.fail("API call succeeded which is denied for the project role")
+        except CloudstackAPIException:
+            pass
+
+    @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
+    def test_add_user_to_project_with_project_role(self):
+        """
+            1. Create a User Account
+            2. Add user of an account with 'Regular' project account role associate it with a Project role;
+                The role defines what APIs are allowed/disallowed for the user: here, 'listPublicIpAddresses'
+                is denied for the user account
+            3. Execute the 'listPublicIpAddresses' API and verify/confirm that the API isn't allowed to be executed
+                by the user
+        """
+        self.useraccount = Account.create(
+            self.apiclient,
+            self.testdata["account"],
+            roleid=4
+        )
+        self.cleanup.append(self.useraccount)
+        # Add account to the project
+        self.project.addUser(
+            self.apiclient,
+            username=self.useraccount.user[0].username,
+            projectroleid=self.projectrole.id
+        )
+        Project.listAccounts(self.apiclient, projectid=self.project.id)
+        self.userapiclient = self.testClient.getUserApiClient(
+            UserName=self.useraccount.name,
+            DomainName=self.useraccount.domain,
+            type=0)
+        try:
+            PublicIPAddress.list(
+                self.userapiclient,
+                projectid=self.project.id
+            )
+            self.fail("API call succeeded which is denied for the project role")
+        except CloudstackAPIException:
+            pass
+
+
+    @attr(tags=['advanced', 'simulator', 'basic', 'sg'], required_hardware=False)
+    def test_add_multiple_admins_in_project(self):
+        """
+            1. Create a User Account
+            2. Add user account with 'Admin' project account role  and associate it with a Project role;
+                The role defines what APIs are allowed/disallowed for the user: here, 'listPublicIpAddresses'
+                is denied for the user account
+            3. Execute the 'listPublicIpAddresses' API and verify/confirm that the user/account can execute the
+            API as it is a project admin
+        """
+        self.useraccount = Account.create(
+            self.apiclient,
+            self.testdata["account"],
+            roleid=4
+        )
+        self.cleanup.append(self.useraccount)
+
+        self.useraccount1 = Account.create(
+            self.apiclient,
+            self.testdata["useracc"],
+            roleid=4
+        )
+
+        self.cleanup.append(self.useraccount1)
+
+        self.project.addAccount(
+            self.apiclient,
+            account=self.useraccount.name,
+            projectroleid=self.projectrole.id,
+            roletype='Admin'
+        )
+
+        self.project.addAccount(
+            self.apiclient,
+            account=self.useraccount1.name,
+            projectroleid=self.projectrole.id
+        )
+
+        project_accounts = Project.listAccounts(self.apiclient, projectid=self.project.id, role='Admin')
+        self.assertEqual(len(project_accounts), 2, "account not added with admin Role")
+
+        self.userapiclientAdminRole = self.testClient.getUserApiClient(
+            UserName=self.useraccount.name,
+            DomainName=self.useraccount.domain,
+            type=0)
+
+        self.userapiclientRegularRole = self.testClient.getUserApiClient(
+            UserName=self.useraccount1.name,
+            DomainName=self.useraccount1.domain,
+            type=0)
+
+        try:
+            PublicIPAddress.list(
+                self.userapiclientAdminRole,
+                projectid=self.project.id
+            )
+            self.debug("User added to the project could execute the listPublicIpAddresses API despite the project "
+                       "role as it is the Admin")
+            pass
+        except CloudstackAPIException:
+            self.fail("User is an Admin, should be able to execute the command despite Project role")
+
+        try:
+            self.project.suspend(
+                self.userapiclientAdminRole,
+            )
+            self.debug("The user can perform Project administrative operations as it is added as "
+                       "an Admin to the project")
+            pass
+        except CloudstackAPIException:
+            self.fail("User should be allowed to execute project administrative operations"
+                      "as it is the Project Admin")
+
+        try:
+            self.project.suspend(
+                self.userapiclientRegularRole,
+            )
+        except Exception as e:
+            pass
+
diff --git a/test/integration/smoke/test_host_maintenance.py b/test/integration/smoke/test_host_maintenance.py
index 3353621..9a84f32 100644
--- a/test/integration/smoke/test_host_maintenance.py
+++ b/test/integration/smoke/test_host_maintenance.py
@@ -21,7 +21,7 @@
 from marvin.cloudstackTestCase import *
 from marvin.lib.utils import *
 from marvin.lib.base import *
-from marvin.lib.common import (get_zone, get_pod, get_template, list_ssvms)
+from marvin.lib.common import (get_zone, get_pod, get_suitable_test_template, list_ssvms)
 from nose.plugins.attrib import attr
 from marvin.lib.decoratorGenerators import skipTestIf
 from distutils.util import strtobool
@@ -115,20 +115,19 @@
             raise Exception("Warning: Exception during cleanup : %s" % e)
 
         return
-    
+
     def createVMs(self, hostId, number, offering_key="tiny"):
-        
-        self.template = get_template(
+        self.template = get_suitable_test_template(
             self.apiclient,
             self.zone.id,
+            None,
             self.hypervisor
         )
-            
         if self.template == FAILED:
-            assert False, "get_template() failed to return template"
-            
+            assert False, "get_suitable_test_template() failed to return template"
+
         self.logger.debug("Using template %s " % self.template.id)
-                
+
         self.service_offering = ServiceOffering.create(
             self.apiclient,
             self.services["service_offerings"][offering_key]
@@ -196,7 +195,7 @@
     def checkVmMigratingOnHost(self, hostId):
         vm_migrating=False
         listVms1 = VirtualMachine.list(
-                                   self.apiclient, 
+                                   self.apiclient,
                                    hostid=hostId
                                    )
 
@@ -209,11 +208,11 @@
                     break
 
         return (vm_migrating, None)
-    
+
     def migrationsFinished(self, hostId):
         migrations_finished=True
         listVms1 = VirtualMachine.list(
-                                   self.apiclient, 
+                                   self.apiclient,
                                    hostid=hostId
                                    )
 
@@ -225,7 +224,7 @@
 
     def noOfVMsOnHost(self, hostId):
         listVms = VirtualMachine.list(
-                                       self.apiclient, 
+                                       self.apiclient,
                                        hostid=hostId
                                        )
         no_of_vms=0
@@ -459,11 +458,16 @@
 
         if not cls.hypervisorNotSupported:
             cls.initialsshvalue = cls.is_ssh_enabled()
-            cls.template = get_template(
+
+            cls.template = get_suitable_test_template(
                 cls.apiclient,
                 cls.zone.id,
+                None,
                 cls.hypervisor
             )
+            if cls.template == FAILED:
+                assert False, "get_suitable_test_template() failed to return template"
+
             cls.services["virtual_machine"]["zoneid"] = cls.zone.id
             cls.services["virtual_machine"]["template"] = cls.template.id
             cls.services["virtual_machine"]["hypervisor"] = cls.hypervisor
diff --git a/test/integration/smoke/test_human_readable_logs.py b/test/integration/smoke/test_human_readable_logs.py
new file mode 100644
index 0000000..fb97251
--- /dev/null
+++ b/test/integration/smoke/test_human_readable_logs.py
@@ -0,0 +1,98 @@
+# 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 time
+
+from marvin.cloudstackAPI import updateConfiguration
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.sshClient import SshClient
+from nose.plugins.attrib import attr
+
+class TestHumanReadableLogs(cloudstackTestCase):
+    """
+    Test correct output when logging byte size values.
+    """
+
+    def setUp(self):
+
+        self.apiClient = self.testClient.getApiClient()
+        self.mgtSvrDetails = self.config.__dict__["mgtSvr"][0].__dict__
+
+
+    @attr(tags=["devcloud", "basic", "advanced"], required_hardware="false")
+    def test_01_disableHumanReadableLogs(self):
+        """
+        Test log file output after disabling human readable sizes feature
+        """
+        #create ssh client
+        sshClient = getSSHClient(self)
+
+        # Disable feature
+        updateConfig(self, "false")
+
+        # Restart service
+        command = "systemctl restart cloudstack-management"
+        sshClient.execute(command)
+
+        # CapacityChecker runs as soon as management server is up
+        # Check if "usedMem: (" is printed out within 60 seconds while server is starting
+        command = "timeout 60 tail -f /var/log/cloudstack/management/management-server.log | grep 'usedMem: ('"
+        sshClient.timeout = 60
+        result = sshClient.runCommand(command)
+        self.assertTrue(result['status'] == "FAILED")
+
+    @attr(tags=["devcloud", "basic", "advanced"], required_hardware="false")
+    def test_02_enableHumanReadableLogs(self):
+        """
+        Test log file output after enabling human readable sizes feature
+        """
+        # create ssh client
+        sshClient = getSSHClient(self)
+
+        # Enable feature
+        updateConfig(self, "true")
+
+        # Restart service
+        command = "systemctl restart cloudstack-management"
+        sshClient.execute(command)
+
+        # CapacityChecker runs as soon as management server is up
+        # Check if "usedMem: (" is printed out within 60 seconds while server is restarting
+        command = "timeout 120 tail -f /var/log/cloudstack/management/management-server.log | grep 'usedMem: ('"
+        sshClient.timeout = 120
+        result = sshClient.runCommand(command)
+        if result['status'] == "SUCCESS":
+            pass
+        else:
+            self.warn("We're not sure if test didn't pass due to timeout, so skipping failing the test")
+
+def updateConfig(self, enableFeature):
+    updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
+    updateConfigurationCmd.name = "display.human.readable.sizes"
+    updateConfigurationCmd.value = enableFeature
+
+    updateConfigurationResponse = self.apiClient.updateConfiguration(updateConfigurationCmd)
+    self.debug("updated the parameter %s with value %s" % (
+        updateConfigurationResponse.name, updateConfigurationResponse.value))
+
+def getSSHClient(self):
+    sshClient = SshClient(
+        self.mgtSvrDetails["mgtSvrIp"],
+        22,
+        self.mgtSvrDetails["user"],
+        self.mgtSvrDetails["passwd"]
+    )
+    return sshClient
diff --git a/test/integration/smoke/test_kubernetes_clusters.py b/test/integration/smoke/test_kubernetes_clusters.py
index 2b7638d..f2f0471 100644
--- a/test/integration/smoke/test_kubernetes_clusters.py
+++ b/test/integration/smoke/test_kubernetes_clusters.py
@@ -240,8 +240,8 @@
 
         if validateList(templates)[0] != PASS:
             details = None
-            if hypervisor in ["vmware"] and "details" in cks_template:
-                details = cks_template["details"]
+            if hypervisor in ["vmware"]:
+                details = [{"keyboard": "us"}]
             template = Template.register(cls.apiclient, cks_template, zoneid=cls.zone.id, hypervisor=hypervisor.lower(), randomize_name=False, details=details)
             template.download(cls.apiclient)
             return template
@@ -749,9 +749,9 @@
                         self.deleteKubernetesCluster(cluster_id)
                     else:
                         forceDeleted = True
-                        for cluster_vm_id in cluster.virtualmachineids:
+                        for cluster_vm in cluster.virtualmachines:
                             cmd = destroyVirtualMachine.destroyVirtualMachineCmd()
-                            cmd.id = cluster_vm_id
+                            cmd.id = cluster_vm.id
                             cmd.expunge = True
                             self.apiclient.destroyVirtualMachine(cmd)
                         cmd = deleteNetwork.deleteNetworkCmd()
diff --git a/test/integration/smoke/test_nested_virtualization.py b/test/integration/smoke/test_nested_virtualization.py
index c10dd2f..10dcf89 100644
--- a/test/integration/smoke/test_nested_virtualization.py
+++ b/test/integration/smoke/test_nested_virtualization.py
@@ -97,51 +97,61 @@
                 config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization.perVM", "true")
                 self.logger.debug("Updated global setting vmware.nested.virtualization.perVM to true")
                 rollback_nv_per_vm = True
-                
-        # 2) Deploy a vm
-        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']
-        )
-        self.assert_(virtual_machine is not None, "VM failed to deploy")
-        self.assert_(virtual_machine.state == 'Running', "VM is not running")
-        self.logger.debug("Deployed vm: %s" % virtual_machine.id)
-        
-        isolated_network = Network.create(
-            self.apiclient,
-            self.services["isolated_network"],
-            self.account.name,
-            self.account.domainid,
-            networkofferingid=self.isolated_network_offering.id)
 
-        virtual_machine.add_nic(self.apiclient, isolated_network.id)
-        
-        # 3) SSH into vm
-        ssh_client = virtual_machine.get_ssh_client()
+        try:
+            # 2) Deploy a vm
+            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']
+            )
+            self.assert_(virtual_machine is not None, "VM failed to deploy")
+            self.assert_(virtual_machine.state == 'Running', "VM is not running")
+            self.logger.debug("Deployed vm: %s" % virtual_machine.id)
 
-        if ssh_client:
-            # run ping test
-            result = ssh_client.execute("cat /proc/cpuinfo | grep flags")
-            self.logger.debug(result)
-        else:
-            self.fail("Failed to setup ssh connection to %s" % virtual_machine.public_ip)
-            
-        # 4) Revert configurations, if needed
+            isolated_network = Network.create(
+                self.apiclient,
+                self.services["isolated_network"],
+                self.account.name,
+                self.account.domainid,
+                networkofferingid=self.isolated_network_offering.id)
+
+            virtual_machine.stop(self.apiclient)
+            virtual_machine.add_nic(self.apiclient, isolated_network.id)
+            virtual_machine.start(self.apiclient)
+
+            # 3) SSH into vm
+            ssh_client = virtual_machine.get_ssh_client()
+
+            if ssh_client:
+                # run ping test
+                result = ssh_client.execute("cat /proc/cpuinfo | grep flags")
+                self.logger.debug(result)
+            else:
+                self.fail("Failed to setup ssh connection to %s" % virtual_machine.public_ip)
+
+            # 4) Revert configurations, if needed
+            self.rollback_nested_configurations(rollback_nv, rollback_nv_per_vm)
+
+            #5) Check for CPU flags: vmx for Intel and svm for AMD indicates nested virtualization is enabled
+            self.assert_(result is not None, "Empty result for CPU flags")
+            res = str(result)
+            self.assertTrue('vmx' in res or 'svm' in res)
+        except Exception as e:
+            self.debug('Error=%s' % e)
+            self.rollback_nested_configurations(rollback_nv, rollback_nv_per_vm)
+            raise e
+
+    def rollback_nested_configurations(self, rollback_nv, rollback_nv_per_vm):
         if rollback_nv:
             config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization", "false")
             self.logger.debug("Reverted global setting vmware.nested.virtualization back to false")
         if rollback_nv_per_vm:
-            config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization", "false")
+            config_update = Configurations.update(self.apiclient, "vmware.nested.virtualization.perVM", "false")
             self.logger.debug("Reverted global setting vmware.nested.virtualization.perVM back to false")
-            
-        #5) Check for CPU flags: vmx for Intel and svm for AMD indicates nested virtualization is enabled
-        self.assert_(result is not None, "Empty result for CPU flags")
-        res = str(result)
-        self.assertTrue('vmx' in res or 'svm' in res)
 
     @classmethod
     def tearDownClass(cls):
diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py
index b6d1bae..99d96d7 100644
--- a/test/integration/smoke/test_network.py
+++ b/test/integration/smoke/test_network.py
@@ -1571,8 +1571,22 @@
                     isDvSwitch = True
                     break
 
-        supported = isVmware and isDvSwitch
-        cls.vmwareHypervisorDvSwitchesForGuestTrafficNotPresent = not supported
+        # Supported hypervisor = KVM using OVS
+        isKVM = cls.hypervisor.lower() in ["kvm"]
+        isOVSEnabled = False
+        hostConfig = cls.config.__dict__["zones"][0].__dict__["pods"][0].__dict__["clusters"][0].__dict__["hosts"][0].__dict__
+        if isKVM :
+            # Test only if all the hosts use OVS
+            grepCmd = 'grep "network.bridge.type=openvswitch" /etc/cloudstack/agent/agent.properties'
+            hosts = list_hosts(cls.apiclient, type='Routing', hypervisor='kvm')
+            if len(hosts) > 0 :
+                isOVSEnabled = True
+            for host in hosts :
+                isOVSEnabled = isOVSEnabled and len(SshClient(host.ipaddress, port=22, user=hostConfig["username"],
+                    passwd=hostConfig["password"]).execute(grepCmd)) != 0
+
+        supported = isVmware and isDvSwitch or isKVM and isOVSEnabled
+        cls.unsupportedHardware = not supported
 
         cls._cleanup = []
 
@@ -1730,7 +1744,7 @@
         return vm_ip, eth_device
 
     @attr(tags=["advanced", "advancedns", "smoke", "pvlan"], required_hardware="true")
-    @skipTestIf("vmwareHypervisorDvSwitchesForGuestTrafficNotPresent")
+    @skipTestIf("unsupportedHardware")
     def test_l2_network_pvlan_connectivity(self):
         try:
             vm_community1_one = self.deploy_vm_multiple_nics("vmcommunity1one", self.l2_pvlan_community1)
@@ -1788,6 +1802,7 @@
             # Isolated PVLAN checks
             same_isolated = self.is_vm_l2_isolated_from_dest(vm_isolated1, vm_isolated1_eth, vm_isolated2_ip)
             isolated_to_community_isolated = self.is_vm_l2_isolated_from_dest(vm_isolated1, vm_isolated1_eth, vm_community1_one_ip)
+            isolated_to_promiscuous_isolated = self.is_vm_l2_isolated_from_dest(vm_isolated1, vm_isolated1_eth, vm_promiscuous1_ip)
 
             self.assertTrue(
                 same_isolated,
@@ -1797,6 +1812,10 @@
                 isolated_to_community_isolated,
                 "VMs on isolated PVLANs must be isolated on layer 2 to Vms on community PVLAN"
             )
+            self.assertFalse(
+                isolated_to_promiscuous_isolated,
+                "VMs on isolated PVLANs must not be isolated on layer 2 to Vms on promiscuous PVLAN",
+            )
 
             # Promiscuous PVLAN checks
             same_promiscuous = self.is_vm_l2_isolated_from_dest(vm_promiscuous1, vm_promiscuous1_eth, vm_promiscuous2_ip)
diff --git a/test/integration/smoke/test_nic.py b/test/integration/smoke/test_nic.py
index c7f8468..b24c3fa 100644
--- a/test/integration/smoke/test_nic.py
+++ b/test/integration/smoke/test_nic.py
@@ -15,6 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 """ NIC tests for VM """
+from marvin.codes import FAILED
 from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.lib.base import (Account,
                              ServiceOffering,
@@ -22,7 +23,7 @@
                              VirtualMachine,
                              NetworkOffering)
 from marvin.lib.common import (get_zone,
-                               get_template,
+                               get_suitable_test_template,
                                get_domain)
 from marvin.lib.utils import validateList
 from marvin.codes import PASS
@@ -75,12 +76,14 @@
             if self.zone.localstorageenabled:
                 self.services["service_offerings"][
                     "tiny"]["storagetype"] = 'local'
-
-            template = get_template(
+            template = get_suitable_test_template(
                 self.apiclient,
                 self.zone.id,
-                self.services["ostype"]
+                self.services["ostype"],
+                self.hypervisor
             )
+            if template == FAILED:
+                assert False, "get_suitable_test_template() failed to return template with description %s" % self.services["ostype"]
             # Set Zones and disk offerings
             self.services["small"]["zoneid"] = self.zone.id
             self.services["small"]["template"] = template.id
diff --git a/test/integration/smoke/test_primary_storage.py b/test/integration/smoke/test_primary_storage.py
index d397c77..79778e5 100644
--- a/test/integration/smoke/test_primary_storage.py
+++ b/test/integration/smoke/test_primary_storage.py
@@ -5,9 +5,9 @@
 # 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
@@ -19,6 +19,7 @@
 
 # Import System modules
 # Import Local Modules
+from marvin.codes import FAILED
 from marvin.cloudstackTestCase import *
 from marvin.lib.base import *
 from marvin.lib.common import *
@@ -41,7 +42,14 @@
         self.pod = get_pod(self.apiclient, self.zone.id)
         self.hypervisor = self.testClient.getHypervisorInfo()
         self.domain = get_domain(self.apiclient)
-        self.template = get_template(self.apiclient, self.zone.id, self.services["ostype"])
+        self.template = get_suitable_test_template(
+            self.apiclient,
+            self.zone.id,
+            self.services["ostype"],
+            self.hypervisor
+        )
+        if self.template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % self.services["ostype"]
 
         return
 
@@ -371,7 +379,14 @@
         cls.pod = get_pod(cls.apiclient, cls.zone.id)
         cls.hypervisor = testClient.getHypervisorInfo()
         cls.domain = get_domain(cls.apiclient)
-        cls.template = get_template(cls.apiclient, cls.zone.id, cls.services["ostype"])
+        cls.template = get_suitable_test_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.services["ostype"],
+            cls.hypervisor
+        )
+        if cls.template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["virtual_machine"]["zoneid"] = cls.zone.id
         cls.services["virtual_machine"]["template"] = cls.template.id
         cls.services["storage_tags"] = StorageTagsServices().storage_tags
diff --git a/test/integration/smoke/test_pvlan.py b/test/integration/smoke/test_pvlan.py
index 149a310..0ed4b44 100644
--- a/test/integration/smoke/test_pvlan.py
+++ b/test/integration/smoke/test_pvlan.py
@@ -5,9 +5,9 @@
 # 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
@@ -35,8 +35,8 @@
 
     zoneId = 1
     networkOfferingId = 7
-    vlan = 1234
-    isolatedpvlan = 567
+    vlan = 2468
+    isolatedpvlan = 864
 
     def setUp(self):
         self.apiClient = self.testClient.getApiClient()
@@ -51,8 +51,8 @@
         createNetworkCmd.gateway = "10.10.10.1"
         createNetworkCmd.startip = "10.10.10.10"
         createNetworkCmd.gateway = "10.10.10.20"
-        createNetworkCmd.vlan = "1234"
-        createNetworkCmd.isolatedpvlan = "567"
+        createNetworkCmd.vlan = self.vlan
+        createNetworkCmd.isolatedpvlan = self.isolatedpvlan
         createNetworkCmd.zoneid = self.zoneId
         createNetworkCmd.networkofferingid = self.networkOfferingId
         createNetworkResponse = self.apiClient.createNetwork(createNetworkCmd)
@@ -60,9 +60,10 @@
         self.broadcasttype = createNetworkResponse.broadcastdomaintype
         self.broadcasturi = createNetworkResponse.broadcasturi
 
+        braodcasturi = "pvlan://{0}-i{1}".format(self.vlan, self.isolatedpvlan)
         self.assertIsNotNone(createNetworkResponse.id, "Network failed to create")
         self.assertTrue(createNetworkResponse.broadcastdomaintype, "Pvlan")
-        self.assertTrue(createNetworkResponse.broadcasturi, "pvlan://1234-i567")
+        self.assertTrue(createNetworkResponse.broadcasturi, braodcasturi)
 
         self.debug("Clean up test pvlan network")
         deleteNetworkCmd = deleteNetwork.deleteNetworkCmd()
diff --git a/test/integration/smoke/test_routers.py b/test/integration/smoke/test_routers.py
index f84afdb..3a20d64 100644
--- a/test/integration/smoke/test_routers.py
+++ b/test/integration/smoke/test_routers.py
@@ -69,16 +69,20 @@
 
         cls.services["virtual_machine"]["zoneid"] = cls.zone.id
 
+        cls._cleanup = []
+
         # Create an account, network, VM and IP addresses
         cls.account = Account.create(
             cls.apiclient,
             cls.services["account"],
             domainid=cls.domain.id
         )
+        cls._cleanup.append(cls.account)
         cls.service_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["service_offerings"]["tiny"]
         )
+        cls._cleanup.append(cls.service_offering)
         cls.vm_1 = VirtualMachine.create(
             cls.apiclient,
             cls.services["virtual_machine"],
@@ -87,30 +91,20 @@
             domainid=cls.account.domainid,
             serviceofferingid=cls.service_offering.id
         )
-        cls.cleanup = [
-            cls.account,
-            cls.service_offering
-        ]
+        cls._cleanup.append(cls.vm_1)
         return
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cls.apiclient = super(
-                TestRouterServices,
-                cls
-            ).getClsTestClient().getApiClient()
-            # Clean up, terminate the created templates
-            cleanup_resources(cls.apiclient, cls.cleanup)
-
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        super(TestRouterServices, cls).tearDownClass()
 
     def setUp(self):
         self.apiclient = self.testClient.getApiClient()
         self.hypervisor = self.testClient.getHypervisorInfo()
-        return
+        self.cleanup = []
+
+    def tearDown(self):
+        super(TestRouterServices, self).tearDown()
 
     @attr(tags=["advanced", "basic", "sg", "smoke"], required_hardware="true")
     def test_01_router_internal_basic(self):
diff --git a/test/integration/smoke/test_secondary_storage.py b/test/integration/smoke/test_secondary_storage.py
index b80b3e6..baa0f98 100644
--- a/test/integration/smoke/test_secondary_storage.py
+++ b/test/integration/smoke/test_secondary_storage.py
@@ -24,6 +24,8 @@
 from marvin.lib.base import *
 from marvin.lib.common import *
 from nose.plugins.attrib import attr
+from marvin.cloudstackAPI import (listImageStores)
+from marvin.cloudstackAPI import (updateImageStore)
 
 #Import System modules
 import time
@@ -224,3 +226,174 @@
                         True,
                         "Builtin template is not ready %s in zone %s"%(template.status, zid)
                     )
+
+    @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"], required_hardware="false")
+    def test_03_check_read_only_flag(self):
+        """Test the secondary storage read-only flag
+        """
+
+        # Validate the following
+        # It is possible to enable/disable the read-only flag on a secondary storage and filter by it
+        # 1. Make the first secondary storage as read-only and verify its state has been changed
+        # 2. Search for the read-only storages and make sure ours is in the list
+        # 3. Make it again read/write and verify it has been set properly
+
+        first_storage = self.list_secondary_storages(self.apiclient)[0]
+        first_storage_id = first_storage['id']
+        # Step 1
+        self.update_secondary_storage(self.apiclient, first_storage_id, True)
+        updated_storage = self.list_secondary_storages(self.apiclient, first_storage_id)[0]
+        self.assertEqual(
+            updated_storage['readonly'],
+            True,
+            "Check if the secondary storage status has been set to read-only"
+        )
+
+        # Step 2
+        readonly_storages = self.list_secondary_storages(self.apiclient, readonly=True)
+        self.assertEqual(
+            isinstance(readonly_storages, list),
+            True,
+            "Check list response returns a valid list"
+        )
+        result = any(d['id'] == first_storage_id for d in readonly_storages)
+        self.assertEqual(
+            result,
+            True,
+            "Check if we are able to list storages by their read-only status"
+        )
+
+        # Step 3
+        self.update_secondary_storage(self.apiclient, first_storage_id, False)
+        updated_storage = self.list_secondary_storages(self.apiclient, first_storage_id)[0]
+        self.assertEqual(
+            updated_storage['readonly'],
+            False,
+            "Check if the secondary storage status has been set back to read-write"
+        )
+
+    @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"], required_hardware="false")
+    def test_04_migrate_to_read_only_storage(self):
+        """Test migrations to a read-only secondary storage
+        """
+
+        # Validate the following
+        # It is not possible to migrate a storage to a read-only one
+        # NOTE: This test requires more than one secondary storage in the system
+        # 1. Make the first storage read-only
+        # 2. Try complete migration from the second to the first storage - it should fail
+        # 3. Try balanced migration from the second to the first storage - it should fail
+        # 4. Make the first storage read-write again
+
+        storages = self.list_secondary_storages(self.apiclient)
+        if (len(storages)) < 2:
+            self.skipTest(
+                "This test requires more than one secondary storage")
+
+        first_storage = self.list_secondary_storages(self.apiclient)[0]
+        first_storage_id = first_storage['id']
+        second_storage = self.list_secondary_storages(self.apiclient)[1]
+        second_storage_id = second_storage['id']
+
+        # Set the first storage to read-only
+        self.update_secondary_storage(self.apiclient, first_storage_id, True)
+
+        # Try complete migration from second to the first storage
+
+
+        success = False
+        try:
+            self.migrate_secondary_storage(self.apiclient, second_storage_id, first_storage_id, "complete")
+        except Exception as ex:
+            if re.search("No destination valid store\(s\) available to migrate.", str(ex)):
+                success = True
+            else:
+                self.debug("Secondary storage complete migration to a read-only one\
+                            did not fail appropriately. Error was actually : " + str(ex));
+
+        self.assertEqual(success, True, "Check if a complete migration to a read-only storage one fails appropriately")
+
+        # Try balanced migration from second to the first storage
+        success = False
+        try:
+            self.migrate_secondary_storage(self.apiclient, second_storage_id, first_storage_id, "balance")
+        except Exception as ex:
+            if re.search("No destination valid store\(s\) available to migrate.", str(ex)):
+                success = True
+            else:
+                self.debug("Secondary storage balanced migration to a read-only one\
+                            did not fail appropriately. Error was actually : " + str(ex))
+
+        self.assertEqual(success, True, "Check if a balanced migration to a read-only storage one fails appropriately")
+
+        # Set the first storage back to read-write
+        self.update_secondary_storage(self.apiclient, first_storage_id, False)
+
+    @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"], required_hardware="false")
+    def test_05_migrate_to_less_free_space(self):
+        """Test migrations when the destination storage has less space
+        """
+
+        # Validate the following
+        # Migration to a secondary storage with less space should be refused
+        # NOTE: This test requires more than one secondary storage in the system
+        # 1. Try complete migration from a storage with more (or equal) free space - migration should be refused
+
+        storages = self.list_secondary_storages(self.apiclient)
+        if (len(storages)) < 2:
+            self.skipTest(
+                "This test requires more than one secondary storage")
+
+        first_storage = self.list_secondary_storages(self.apiclient)[0]
+        first_storage_disksizeused = first_storage['disksizeused']
+        first_storage_disksizetotal = first_storage['disksizetotal']
+        second_storage = self.list_secondary_storages(self.apiclient)[1]
+        second_storage_disksizeused = second_storage['disksizeused']
+        second_storage_disksizetotal = second_storage['disksizetotal']
+
+        first_storage_freespace = first_storage_disksizetotal - first_storage_disksizeused
+        second_storage_freespace = second_storage_disksizetotal - second_storage_disksizeused
+
+        if first_storage_freespace == second_storage_freespace:
+            self.skipTest(
+                "This test requires two secondary storages with different free space")
+
+        # Setting the storage with more free space as source storage
+        if first_storage_freespace > second_storage_freespace:
+            src_storage = first_storage['id']
+            dst_storage = second_storage['id']
+        else:
+            src_storage = second_storage['id']
+            dst_storage = first_storage['id']
+
+        response = self.migrate_secondary_storage(self.apiclient, src_storage, dst_storage, "complete")
+
+        success = False
+        if re.search("has equal or more free space than destination", str(response)):
+            success = True
+        else:
+            self.debug("Secondary storage complete migration to a storage \
+            with less space was not refused. Here is the command output : " + str(response))
+
+        self.assertEqual(success, True, "Secondary storage complete migration to a storage\
+                        with less space was properly refused.")
+
+    def list_secondary_storages(self, apiclient, id=None, readonly=None):
+        cmd = listImageStores.listImageStoresCmd()
+        cmd.id = id
+        cmd.readonly = readonly
+        return apiclient.listImageStores(cmd)
+
+    def update_secondary_storage(self, apiclient, id, readonly):
+        cmd = updateImageStore.updateImageStoreCmd()
+        cmd.id = id
+        cmd.readonly = readonly
+        apiclient.updateImageStore(cmd)
+
+    def migrate_secondary_storage(self, apiclient, first_id, second_id, type):
+        cmd = migrateSecondaryStorageData.migrateSecondaryStorageDataCmd()
+        cmd.srcpool = first_id
+        cmd.destpools = second_id
+        cmd.migrationtype = type
+        response = apiclient.migrateSecondaryStorageData(cmd)
+        return response
diff --git a/test/integration/smoke/test_ssvm.py b/test/integration/smoke/test_ssvm.py
index ad5c4ab..bb83931 100644
--- a/test/integration/smoke/test_ssvm.py
+++ b/test/integration/smoke/test_ssvm.py
@@ -874,6 +874,8 @@
         # Wait for the agent to be up
         self.waitForSystemVMAgent(ssvm_response.name)
 
+        # Wait until NFS stores mounted before running the script
+        time.sleep(90)
         # Call to verify cloud process is running
         self.test_03_ssvm_internals()
 
diff --git a/test/integration/smoke/test_storage_policy.py b/test/integration/smoke/test_storage_policy.py
new file mode 100644
index 0000000..a7a5f8d
--- /dev/null
+++ b/test/integration/smoke/test_storage_policy.py
@@ -0,0 +1,251 @@
+# 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.
+
+""" Test for VMWare storage policies
+"""
+# Import Local Modules
+from nose.plugins.attrib import attr
+from marvin.cloudstackTestCase import cloudstackTestCase
+from marvin.lib.utils import cleanup_resources
+from marvin.lib.base import (Account,
+                             VirtualMachine,
+                             ServiceOffering,
+                             NetworkOffering,
+                             Network,
+                             Volume,
+                             DiskOffering)
+from marvin.lib.common import (get_zone,
+                               get_domain,
+                               get_test_template)
+from marvin.cloudstackAPI import (importVsphereStoragePolicies,
+                                  listVsphereStoragePolicies,
+                                  listVsphereStoragePolicyCompatiblePools)
+
+
+class TestVMWareStoragePolicies(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+
+        cls.testClient = super(TestVMWareStoragePolicies, cls).getClsTestClient()
+        cls.apiclient = cls.testClient.getApiClient()
+
+        cls.testdata = cls.testClient.getParsedTestDataConfig()
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
+        cls._cleanup = []
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+        cls.network_offering = NetworkOffering.create(
+            cls.apiclient,
+            cls.testdata["l2-network_offering"],
+        )
+        cls.network_offering.update(cls.apiclient, state='Enabled')
+        cls.template = get_test_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.hypervisor,
+        )
+        cls._cleanup.append(cls.network_offering)
+        return
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.apiclient, reversed(cls._cleanup))
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+    def setUp(self):
+
+        self.dbclient = self.testClient.getDbConnection()
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        self.testdata["virtual_machine"]["zoneid"] = self.zone.id
+        self.testdata["virtual_machine"]["template"] = self.template.id
+        self.account = Account.create(
+            self.apiclient,
+            self.testdata["account"],
+            domainid=self.domain.id
+        )
+        self.cleanup = []
+        self.cleanup.append(self.account)
+        return
+
+    def tearDown(self):
+        try:
+            self.debug("Cleaning up the resources")
+            cleanup_resources(self.apiclient, reversed(self.cleanup))
+            self.debug("Cleanup complete!")
+        except Exception as e:
+            self.debug("Warning! Exception in tearDown: %s" % e)
+
+    def import_vmware_storage_policies(self, apiclient):
+        cmd = importVsphereStoragePolicies.importVsphereStoragePoliciesCmd()
+        cmd.zoneid = self.zone.id
+        return apiclient.importVsphereStoragePolicies(cmd)
+
+    def list_storage_policies(self, apiclient):
+        cmd = listVsphereStoragePolicies.listVsphereStoragePoliciesCmd()
+        cmd.zoneid = self.zone.id
+        return apiclient.listVsphereStoragePolicies(cmd)
+
+    def list_storage_policy_compatible_pools(self, apiclient, policyid):
+        cmd = listVsphereStoragePolicyCompatiblePools.listVsphereStoragePolicyCompatiblePoolsCmd()
+        cmd.zoneid = self.zone.id
+        cmd.policyid = policyid
+        return apiclient.listVsphereStoragePolicyCompatiblePools(cmd)
+
+    def create_volume(self, apiclient):
+        cmd = create
+
+    @attr(
+        tags=[
+            "advanced",
+            "eip",
+            "advancedns",
+            "basic",
+            "sg"],
+        required_hardware="true")
+    def test_01_import_storage_policies(self):
+        """Test VMWare storage policies
+        """
+
+        # Validate the following:
+        # 1. Import VMWare storage policies - the command should return non-zero result
+        # 2. List current VMWare storage policies - the command should return non-zero result
+        # 3. Create service offering with first of the imported policies
+        # 4. Create disk offering with first of the imported policies
+        # 5. Create VM using the already created service offering
+        # 6. Create volume using the already created disk offering
+        # 7. Attach this volume to our VM
+        # 8. Detach the volume from our VM
+
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        if self.hypervisor.lower() != "vmware":
+            self.skipTest(
+                "VMWare storage policies feature is not supported on %s" %
+                self.hypervisor.lower())
+
+        self.debug("Importing VMWare storage policies")
+        imported_policies = self.import_vmware_storage_policies(self.apiclient)
+
+        if len(imported_policies) == 0:
+            self.skipTest("There are no VMWare storage policies")
+
+        self.debug("Listing VMWare storage policies")
+        listed_policies = self.list_storage_policies(self.apiclient)
+
+        self.assertNotEqual(
+            len(listed_policies),
+            0,
+            "Check if list of storage policies is not zero"
+        )
+
+        self.assertEqual(
+            len(imported_policies),
+            len(listed_policies),
+            "Check if the number of imported policies is identical to the number of listed policies"
+        )
+
+        selected_policy = None
+        for imported_policy in imported_policies:
+            compatible_pools = self.list_storage_policy_compatible_pools(self.apiclient, imported_policy.id)
+            if compatible_pools and len(compatible_pools) > 0:
+                selected_policy = imported_policy
+                break
+
+        if not selected_policy:
+            self.skipTest("There are no compatible storage pools with the imported policies")
+
+        # Create service offering with the first storage policy from the list
+        service_offering = ServiceOffering.create(
+            self.apiclient,
+            self.testdata["service_offering"],
+            storagepolicy=selected_policy.id
+        )
+        self.cleanup.append(service_offering)
+
+        # Create disk offering with the first storage policy from the list
+        disk_offering = DiskOffering.create(
+            self.apiclient,
+            self.testdata["disk_offering"],
+            storagepolicy=selected_policy.id
+        )
+        self.cleanup.append(disk_offering)
+
+        l2_network = Network.create(
+            self.apiclient,
+            self.testdata["l2-network"],
+            zoneid=self.zone.id,
+            networkofferingid=self.network_offering.id
+        )
+        self.cleanup.append(l2_network)
+
+        virtual_machine = VirtualMachine.create(
+            self.apiclient,
+            self.testdata["small"],
+            templateid=self.template.id,
+            accountid=self.account.name,
+            domainid=self.account.domainid,
+            zoneid=self.zone.id,
+            networkids=l2_network.id,
+            serviceofferingid=service_offering.id,
+        )
+        self.cleanup.append(virtual_machine)
+
+        vms = VirtualMachine.list(
+            self.apiclient,
+            id=virtual_machine.id,
+            listall=True
+        )
+        self.assertEqual(
+            isinstance(vms, list),
+            True,
+            "listVirtualMachines returned invalid object in response."
+        )
+        self.assertNotEqual(
+            len(vms),
+            0,
+            "listVirtualMachines returned empty list."
+        )
+        self.debug("Deployed VM on host: %s" % vms[0].hostid)
+
+        volume = Volume.create(
+            self.apiclient,
+            self.testdata["volume"],
+            account=self.account.name,
+            domainid=self.account.domainid,
+            zoneid=self.zone.id,
+            diskofferingid=disk_offering.id
+           )
+        self.cleanup.append(volume)
+
+        list_volume_response = Volume.list(
+            self.apiclient,
+            id=volume.id
+        )
+        self.assertEqual(
+            isinstance(list_volume_response, list),
+            True,
+            "Check list response returns a valid list"
+        )
+        self.assertNotEqual(
+            list_volume_response,
+            None,
+            "Check if volume exists in ListVolumes"
+        )
+        return
diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py
index 73ac637..dd724b8 100644
--- a/test/integration/smoke/test_templates.py
+++ b/test/integration/smoke/test_templates.py
@@ -84,7 +84,6 @@
             self.test_template.displaytext = 'test sha-1'
             self.test_template.url = "http://dl.openvm.eu/cloudstack/macchinina/x86_64/macchinina-vmware.ova"
             self.test_template.format = "OVA"
-            self.test_template.ostypeid = self.getOsType("Other Linux (64-bit)")
             self.md5 = "27f3c56a8c7ec7b2f3ff2199f7078006"
             self.sha256 = "a7b04c1eb507f3f5de844bda352df1ea5e20335b465409493ca6ae07dfd0a158"
 
@@ -961,6 +960,40 @@
                         )
         return
 
+    @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
+    def test_09_list_templates_download_details(self):
+        """Test if list templates returns download details"""
+
+        # Validate the following
+        # 1. ListTemplates API has been extended to support viewing the download details - progress, download states and datastore
+
+        list_template_response = Template.list(
+                                    self.apiclient,
+                                    templatefilter='all',
+                                    account=self.user.name,
+                                    domainid=self.user.domainid
+                                    )
+        self.assertEqual(
+                            isinstance(list_template_response, list),
+                            True,
+                            "Check list response returns a valid list"
+                        )
+
+        self.assertNotEqual(
+                            len(list_template_response),
+                            0,
+                            "Check template available in List Templates"
+                        )
+
+        for template in list_template_response:
+            self.assertNotEqual(
+                        len(template.downloaddetails),
+                        0,
+                        "Not all templates have download details"
+                        )
+
+        return
+
 class TestCopyAndDeleteTemplatesAcrossZones(cloudstackTestCase):
 
     @classmethod
diff --git a/test/integration/smoke/test_usage.py b/test/integration/smoke/test_usage.py
index 4419835..54139e4 100644
--- a/test/integration/smoke/test_usage.py
+++ b/test/integration/smoke/test_usage.py
@@ -17,6 +17,7 @@
 """ P1 tests for Snapshots
 """
 # Import Local Modules
+from marvin.codes import FAILED
 from nose.plugins.attrib import attr
 from marvin.cloudstackTestCase import cloudstackTestCase, unittest
 from marvin.cloudstackAPI import deleteVolume
@@ -37,7 +38,7 @@
                              Volume)
 from marvin.lib.common import (get_zone,
                                get_domain,
-                               get_template,
+                               get_suitable_test_template,
                                find_storage_pool_type)
 
 
@@ -136,12 +137,15 @@
         cls.domain = get_domain(cls.api_client)
         cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
-
-        template = get_template(
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
@@ -335,12 +339,15 @@
         cls.domain = get_domain(cls.api_client)
         cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
-
-        template = get_template(
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
@@ -508,11 +515,15 @@
             cls.services["disk_offering"]
         )
         cls._cleanup.append(cls.disk_offering)
-        template = get_template(
+
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
         cls.services["server"]["diskoffering"] = cls.disk_offering.id
         cls.services["template"] = template.id
@@ -803,11 +814,15 @@
         cls.services['mode'] = cls.zone.networktype
         cls.hypervisor = cls.testClient.getHypervisorInfo()
         cls.services["server"]["zoneid"] = cls.zone.id
-        template = get_template(
+
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
         cls._cleanup = []
         try:
@@ -1131,11 +1146,16 @@
         cls.domain = get_domain(cls.api_client)
         cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
-        template = get_template(
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
@@ -1307,11 +1327,14 @@
             cls.unsupportedHypervisor = True
             return
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
@@ -1488,11 +1511,16 @@
         cls.domain = get_domain(cls.api_client)
         cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
-        template = get_template(
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
@@ -1657,11 +1685,16 @@
         cls.domain = get_domain(cls.api_client)
         cls.zone = get_zone(cls.api_client, cls.testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
-        template = get_template(
+        cls.hypervisor = cls.testClient.getHypervisorInfo()
+
+        template = get_suitable_test_template(
             cls.api_client,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
+        if template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
         cls.services["server"]["zoneid"] = cls.zone.id
 
         cls.services["template"] = template.id
diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py
index 3def053..08668e4 100644
--- a/test/integration/smoke/test_vm_life_cycle.py
+++ b/test/integration/smoke/test_vm_life_cycle.py
@@ -25,7 +25,11 @@
                                   provisionCertificate,
                                   updateConfiguration,
                                   migrateVirtualMachine,
-                                  migrateVirtualMachineWithVolume)
+                                  migrateVirtualMachineWithVolume,
+                                  unmanageVirtualMachine,
+                                  listUnmanagedInstances,
+                                  listNics,
+                                  listVolumes)
 from marvin.lib.utils import *
 
 from marvin.lib.base import (Account,
@@ -37,15 +41,23 @@
                              Configurations,
                              StoragePool,
                              Volume,
-                             DiskOffering)
+                             DiskOffering,
+                             NetworkOffering,
+                             Network)
 from marvin.lib.common import (get_domain,
                                get_zone,
-                               get_template,
-                               list_hosts)
+                               get_suitable_test_template,
+                               get_test_ovf_templates,
+                               list_hosts,
+                               list_virtual_machines,
+                               get_vm_vapp_configs)
 from marvin.codes import FAILED, PASS
 from nose.plugins.attrib import attr
+from marvin.lib.decoratorGenerators import skipTestIf
 # Import System modules
 import time
+import json
+from operator import itemgetter
 
 _multiprocess_shared_ = True
 
@@ -62,6 +74,7 @@
         cls.domain = get_domain(cls.apiclient)
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.services['mode'] = cls.zone.networktype
+        cls.hypervisor = testClient.getHypervisorInfo()
 
         # If local storage is enabled, alter the offerings to use localstorage
         # this step is needed for devcloud
@@ -70,13 +83,14 @@
             cls.services["service_offerings"]["small"]["storagetype"] = 'local'
             cls.services["service_offerings"]["medium"]["storagetype"] = 'local'
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         # Set Zones and disk offerings
         cls.services["small"]["zoneid"] = cls.zone.id
@@ -280,13 +294,14 @@
             cls.services["service_offerings"]["small"]["storagetype"] = 'local'
             cls.services["service_offerings"]["medium"]["storagetype"] = 'local'
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         # Set Zones and disk offerings
         cls.services["small"]["zoneid"] = cls.zone.id
@@ -728,62 +743,69 @@
         except Exception as e:
             self.fail("SSH failed for virtual machine: %s - %s" %
                       (self.virtual_machine.ipaddress, e))
-
         mount_dir = "/mnt/tmp"
         cmds = "mkdir -p %s" % mount_dir
         self.assert_(ssh_client.execute(cmds) == [], "mkdir failed within guest")
 
+        iso_unsupported = False
         for diskdevice in self.services["diskdevice"]:
             res = ssh_client.execute("mount -rt iso9660 {} {}".format(diskdevice, mount_dir))
             if res == []:
                 self.services["mount"] = diskdevice
                 break
+            if str(res).find("mount: unknown filesystem type 'iso9660'") != -1:
+                iso_unsupported = True
+                self.debug("Test template does not supports iso9660 filesystem. Proceeding with test without mounting.")
+                print "Test template does not supports iso9660 filesystem. Proceeding with test without mounting."
+                break
         else:
             self.fail("No mount points matched. Mount was unsuccessful")
 
-        c = "mount |grep %s|head -1" % self.services["mount"]
-        res = ssh_client.execute(c)
-        size = ssh_client.execute("du %s | tail -1" % self.services["mount"])
-        self.debug("Found a mount point at %s with size %s" % (res, size))
+        if iso_unsupported == False:
+            c = "mount |grep %s|head -1" % self.services["mount"]
+            res = ssh_client.execute(c)
+            size = ssh_client.execute("du %s | tail -1" % self.services["mount"])
+            self.debug("Found a mount point at %s with size %s" % (res, size))
 
-        # Get ISO size
-        iso_response = Iso.list(
-            self.apiclient,
-            id=iso.id
-        )
-        self.assertEqual(
-            isinstance(iso_response, list),
-            True,
-            "Check list response returns a valid list"
-        )
+            # Get ISO size
+            iso_response = Iso.list(
+                self.apiclient,
+                id=iso.id
+            )
+            self.assertEqual(
+                isinstance(iso_response, list),
+                True,
+                "Check list response returns a valid list"
+            )
 
-        try:
-            # Unmount ISO
-            command = "umount %s" % mount_dir
-            ssh_client.execute(command)
-        except Exception as e:
-            self.fail("SSH failed for virtual machine: %s - %s" %
-                      (self.virtual_machine.ipaddress, e))
+            try:
+                # Unmount ISO
+                command = "umount %s" % mount_dir
+                ssh_client.execute(command)
+            except Exception as e:
+                self.fail("SSH failed for virtual machine: %s - %s" %
+                          (self.virtual_machine.ipaddress, e))
 
         # Detach from VM
         cmd = detachIso.detachIsoCmd()
         cmd.virtualmachineid = self.virtual_machine.id
         self.apiclient.detachIso(cmd)
 
-        try:
-            res = ssh_client.execute(c)
-        except Exception as e:
-            self.fail("SSH failed for virtual machine: %s - %s" %
-                      (self.virtual_machine.ipaddress, e))
+        if iso_unsupported == False:
+            try:
+                res = ssh_client.execute(c)
+            except Exception as e:
+                self.fail("SSH failed for virtual machine: %s - %s" %
+                          (self.virtual_machine.ipaddress, e))
 
-        # Check if ISO is properly detached from VM (using fdisk)
-        result = self.services["mount"] in str(res)
+            # Check if ISO is properly detached from VM (using fdisk)
+            result = self.services["mount"] in str(res)
 
-        self.assertEqual(
-            result,
-            False,
-            "Check if ISO is detached from virtual machine"
-        )
+            self.assertEqual(
+                result,
+                False,
+                "Check if ISO is detached from virtual machine"
+            )
         return
 
     @attr(tags = ["devcloud", "advanced", "advancedns", "smoke", "basic", "sg"], required_hardware="false")
@@ -844,13 +866,14 @@
             0].__dict__
         cls.management_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"]
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         # Set Zones and disk offerings
         cls.services["small"]["zoneid"] = cls.zone.id
@@ -966,7 +989,7 @@
                       sleep 30 && \
                       service cloudstack-agent restart")
         print("Unsecuring Host: %s" % (host.name))
-        self.waitUntilHostInState(hostId=host.id, state="Up") 
+        self.waitUntilHostInState(hostId=host.id, state="Up")
         self.check_connection(host=host, secured='false')
         return host
 
@@ -1116,13 +1139,14 @@
             0].__dict__
         cls.management_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"]
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         # Set Zones and disk offerings
         cls.services["small"]["zoneid"] = cls.zone.id
@@ -1328,13 +1352,14 @@
             0].__dict__
         cls.management_ip = cls.config.__dict__["mgtSvr"][0].__dict__["mgtSvrIp"]
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         # Set Zones and disk offerings
         cls.services["small"]["zoneid"] = cls.zone.id
@@ -1512,3 +1537,421 @@
                          target_host.id,
                          "HostID not as expected")
 
+
+class TestUnmanageVM(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        testClient = super(TestUnmanageVM, cls).getClsTestClient()
+        cls.apiclient = testClient.getApiClient()
+        cls.services = testClient.getParsedTestDataConfig()
+        cls.hypervisor = testClient.getHypervisorInfo()
+        cls._cleanup = []
+
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
+        cls.services['mode'] = cls.zone.networktype
+        cls.template = get_suitable_test_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.services["ostype"],
+            cls.hypervisor
+        )
+        if cls.template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
+
+        cls.hypervisorNotSupported = cls.hypervisor.lower() != "vmware"
+
+        cls.services["small"]["zoneid"] = cls.zone.id
+        cls.services["small"]["template"] = cls.template.id
+
+        cls.account = Account.create(
+            cls.apiclient,
+            cls.services["account"],
+            domainid=cls.domain.id
+        )
+
+        cls.small_offering = ServiceOffering.create(
+            cls.apiclient,
+            cls.services["service_offerings"]["small"]
+        )
+
+        cls.network_offering = NetworkOffering.create(
+            cls.apiclient,
+            cls.services["l2-network_offering"],
+        )
+        cls.network_offering.update(cls.apiclient, state='Enabled')
+
+        cls._cleanup = [
+            cls.small_offering,
+            cls.network_offering,
+            cls.account
+        ]
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.services["network"]["networkoffering"] = self.network_offering.id
+
+        self.network = Network.create(
+            self.apiclient,
+            self.services["l2-network"],
+            zoneid=self.zone.id,
+            networkofferingid=self.network_offering.id
+        )
+
+        self.cleanup = [
+            self.network
+        ]
+
+    @attr(tags=["advanced", "advancedns", "smoke", "sg"], required_hardware="false")
+    @skipTestIf("hypervisorNotSupported")
+    def test_01_unmanage_vm_cycle(self):
+        """
+        Test the following:
+        1. Deploy VM
+        2. Unmanage VM
+        3. Verify VM is not listed in CloudStack
+        4. Verify VM is listed as part of the unmanaged instances
+        5. Import VM
+        6. Destroy VM
+        """
+
+        # 1 - Deploy VM
+        self.virtual_machine = VirtualMachine.create(
+            self.apiclient,
+            self.services["virtual_machine"],
+            templateid=self.template.id,
+            serviceofferingid=self.small_offering.id,
+            networkids=self.network.id,
+            zoneid=self.zone.id
+        )
+        vm_id = self.virtual_machine.id
+        vm_instance_name = self.virtual_machine.instancename
+        hostid = self.virtual_machine.hostid
+        hosts = Host.list(
+            self.apiclient,
+            id=hostid
+        )
+        host = hosts[0]
+        clusterid = host.clusterid
+
+        list_vm = list_virtual_machines(
+            self.apiclient,
+            id=vm_id
+        )
+        self.assertEqual(
+            isinstance(list_vm, list),
+            True,
+            "Check if virtual machine is present"
+        )
+        vm_response = list_vm[0]
+
+        self.assertEqual(
+            vm_response.state,
+            "Running",
+            "VM state should be running after deployment"
+        )
+
+        # 2 - Unmanage VM from CloudStack
+        self.virtual_machine.unmanage(self.apiclient)
+
+        list_vm = list_virtual_machines(
+            self.apiclient,
+            id=vm_id
+        )
+
+        self.assertEqual(
+            list_vm,
+            None,
+            "VM should not be listed"
+        )
+
+        unmanaged_vms = VirtualMachine.listUnmanagedInstances(
+            self.apiclient,
+            clusterid=clusterid,
+            name=vm_instance_name
+        )
+
+        self.assertEqual(
+            len(unmanaged_vms),
+            1,
+            "Unmanaged VMs matching instance name list size is 1"
+        )
+
+        unmanaged_vm = unmanaged_vms[0]
+        self.assertEqual(
+            unmanaged_vm.powerstate,
+            "PowerOn",
+            "Unmanaged VM is still running"
+        )
+
+
+class TestVAppsVM(cloudstackTestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        testClient = super(TestVAppsVM, cls).getClsTestClient()
+        cls.apiclient = testClient.getApiClient()
+        cls.services = testClient.getParsedTestDataConfig()
+        cls.hypervisor = testClient.getHypervisorInfo()
+        cls._cleanup = []
+
+        # Get Zone, Domain and templates
+        cls.domain = get_domain(cls.apiclient)
+        cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
+        cls.services['mode'] = cls.zone.networktype
+
+        cls.hypervisorNotSupported = cls.hypervisor.lower() != "vmware"
+
+        if cls.hypervisorNotSupported == False:
+
+            cls.account = Account.create(
+                cls.apiclient,
+                cls.services["account"],
+                domainid=cls.domain.id
+            )
+
+            cls.templates = get_test_ovf_templates(
+                cls.apiclient,
+                cls.zone.id,
+                cls.services['test_ovf_templates'],
+                cls.hypervisor
+            )
+            if len(cls.templates) == 0:
+                assert False, "get_test_ovf_templates() failed to return templates"
+
+            cls.custom_offering = ServiceOffering.create(
+                cls.apiclient,
+                cls.services["custom_service_offering"]
+            )
+
+            cls.isolated_network_offering = NetworkOffering.create(
+                cls.apiclient,
+                cls.services["isolated_network_offering"],
+            )
+            cls.isolated_network_offering.update(cls.apiclient, state='Enabled')
+
+            cls.l2_network_offering = NetworkOffering.create(
+                cls.apiclient,
+                cls.services["l2-network_offering"],
+            )
+            cls.l2_network_offering.update(cls.apiclient, state='Enabled')
+
+            cls._cleanup = [
+                cls.account,
+                cls.custom_offering,
+                cls.isolated_network_offering,
+                cls.l2_network_offering
+            ]
+
+            # Uncomment when tests are finished, to cleanup the test templates
+            for template in cls.templates:
+                cls._cleanup.append(template)
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            cleanup_resources(cls.apiclient, cls._cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during class cleanup : %s" % e)
+
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.cleanup = []
+
+    def tearDown(self):
+        try:
+            cleanup_resources(self.apiclient, self.cleanup)
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+    def get_ova_parsed_information_from_template(self, template):
+        if not template:
+            return None
+        details = template.details.__dict__
+        configurations = []
+        disks = []
+        isos = []
+        networks = []
+        for propKey in details:
+            if propKey.startswith('ACS-configuration'):
+                configurations.append(json.loads(details[propKey]))
+            elif propKey.startswith('ACS-disk'):
+                detail = json.loads(details[propKey])
+                if detail['isIso'] == True:
+                    isos.append(detail)
+                else:
+                    disks.append(detail)
+            elif propKey.startswith('ACS-network'):
+                networks.append(json.loads(details[propKey]))
+
+        return configurations, disks, isos, networks
+
+    def verify_nics(self, nic_networks, vm_id):
+        cmd = listNics.listNicsCmd()
+        cmd.virtualmachineid = vm_id
+        vm_nics =  self.apiclient.listNics(cmd)
+        self.assertEqual(
+            isinstance(vm_nics, list),
+            True,
+            "Check listNics response returns a valid list"
+        )
+        self.assertEqual(
+            len(nic_networks),
+            len(vm_nics),
+            msg="VM NIC count is different, expected = {}, result = {}".format(len(nic_networks), len(vm_nics))
+        )
+        nic_networks.sort(key=itemgetter('nic')) # CS will create NIC in order of InstanceID. Check network order
+        vm_nics.sort(key=itemgetter('deviceid'))
+        for i in range(len(vm_nics)):
+            nic = vm_nics[i]
+            nic_network = nic_networks[i]
+            self.assertEqual(
+                nic.networkid,
+                nic_network["network"],
+                msg="VM NIC(InstanceID: {}) network mismatch, expected = {}, result = {}".format(nic_network["nic"], nic_network["network"], nic.networkid)
+            )
+
+    def verify_disks(self, template_disks, vm_id):
+        cmd = listVolumes.listVolumesCmd()
+        cmd.virtualmachineid = vm_id
+        cmd.listall = True
+        vm_volumes =  self.apiclient.listVolumes(cmd)
+        self.assertEqual(
+            isinstance(vm_volumes, list),
+            True,
+            "Check listVolumes response returns a valid list"
+        )
+        self.assertEqual(
+            len(template_disks),
+            len(vm_volumes),
+            msg="VM volumes count is different, expected = {}, result = {}".format(len(template_disks), len(vm_volumes))
+        )
+        template_disks.sort(key=itemgetter('diskNumber'))
+        vm_volumes.sort(key=itemgetter('deviceid'))
+        for j in range(len(vm_volumes)):
+            volume = vm_volumes[j]
+            disk = template_disks[j]
+            self.assertEqual(
+                volume.size,
+                disk["virtualSize"],
+                msg="VM Volume(diskNumber: {}) network mismatch, expected = {}, result = {}".format(disk["diskNumber"], disk["virtualSize"], volume.size)
+            )
+
+    @attr(tags=["advanced", "advancedns", "smoke", "sg", "dev"], required_hardware="false")
+    @skipTestIf("hypervisorNotSupported")
+    def test_01_vapps_vm_cycle(self):
+        """
+        Test the following for all found ovf templates:
+        1. Deploy VM
+        2. Verify VM has correct properties
+        3. Verify VM has correct disks
+        4. Verify VM has correct nics
+        5. Destroy VM
+        """
+
+        for template in self.templates:
+            configurations, disks, isos, network = self.get_ova_parsed_information_from_template(template)
+
+            if configurations:
+                conf = configurations[0]
+                items = conf['hardwareItems']
+                cpu_speed = 1000
+                cpu_number = 0
+                memory = 0
+                for item in items:
+                    if item['resourceType'] == 'Memory':
+                        memory = item['virtualQuantity']
+                    elif item['resourceType'] == 'Processor':
+                        cpu_number = item['virtualQuantity']
+
+            nicnetworklist = []
+            networks = []
+            vm_service = self.services["virtual_machine_vapps"][template.name]
+            network_mappings = vm_service["nicnetworklist"]
+            for network_mapping in network_mappings:
+                network_service = self.services["isolated_network"]
+                network_offering_id = self.isolated_network_offering.id
+                if network_mapping["network"] == 'l2':
+                    network_service = self.services["l2-network"]
+                    network_offering_id = self.l2_network_offering.id
+                network = Network.create(
+                    self.apiclient,
+                    network_service,
+                    networkofferingid=network_offering_id,
+                    accountid=self.account.name,
+                    domainid=self.account.domainid,
+                    zoneid=self.zone.id)
+                networks.append(network)
+                for interface in network_mapping["nic"]:
+                    nicnetworklist.append({"nic": interface, "network": network.id})
+
+            vm = VirtualMachine.create(
+                self.apiclient,
+                vm_service,
+                accountid=self.account.name,
+                domainid=self.account.domainid,
+                templateid=template.id,
+                serviceofferingid=self.custom_offering.id,
+                zoneid=self.zone.id,
+                customcpunumber=cpu_number,
+                customcpuspeed=cpu_speed,
+                custommemory=memory,
+                properties=vm_service['properties'],
+                nicnetworklist=nicnetworklist
+            )
+
+            list_vm_response = VirtualMachine.list(
+                self.apiclient,
+                id=vm.id
+            )
+            self.debug(
+                "Verify listVirtualMachines response for virtual machine: %s" \
+                % vm.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"
+            )
+            vm_response = list_vm_response[0]
+            self.assertEqual(
+                vm_response.id,
+                vm.id,
+                "Check virtual machine id in listVirtualMachines"
+            )
+            self.assertEqual(
+                vm_response.name,
+                vm.name,
+                "Check virtual machine name in listVirtualMachines"
+            )
+            self.assertEqual(
+                vm_response.state,
+                'Running',
+                msg="VM is not in Running state"
+            )
+
+            # Verify nics
+            self.verify_nics(nicnetworklist, vm.id)
+            # Verify disks
+            self.verify_disks(disks, vm.id)
+            # Verify properties
+            original_properties = vm_service['properties']
+            vm_properties = get_vm_vapp_configs(self.apiclient, self.config, self.zone, vm.instancename)
+            for property in original_properties:
+                if property["key"] in vm_properties:
+                    self.assertEqual(
+                        vm_properties[property["key"]],
+                        property["value"],
+                        "Check VM property %s with original value" % property["key"]
+                    )
+
+            cmd = destroyVirtualMachine.destroyVirtualMachineCmd()
+            cmd.id = vm.id
+            self.apiclient.destroyVirtualMachine(cmd)
diff --git a/test/integration/smoke/test_vm_snapshots.py b/test/integration/smoke/test_vm_snapshots.py
index ce63ed4..047ed20 100644
--- a/test/integration/smoke/test_vm_snapshots.py
+++ b/test/integration/smoke/test_vm_snapshots.py
@@ -26,7 +26,7 @@
                              VmSnapshot)
 from marvin.lib.common import (get_zone,
                                get_domain,
-                               get_template,
+                               get_suitable_test_template,
                                list_snapshots,
                                list_virtual_machines)
 import time
@@ -50,13 +50,14 @@
         cls.domain = get_domain(cls.apiclient)
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
 
-        template = get_template(
+        template = get_suitable_test_template(
             cls.apiclient,
             cls.zone.id,
-            cls.services["ostype"]
+            cls.services["ostype"],
+            cls.hypervisor
         )
         if template == FAILED:
-            assert False, "get_template() failed to return template\
+            assert False, "get_suitable_test_template() failed to return template\
                     with description %s" % cls.services["ostype"]
 
         cls.services["domainid"] = cls.domain.id
@@ -87,7 +88,7 @@
             mode=cls.zone.networktype
         )
         cls.random_data_0 = random_gen(size=100)
-        cls.test_dir = "/tmp"
+        cls.test_dir = "$HOME"
         cls.random_data = "random.data"
         return
 
@@ -288,15 +289,15 @@
         )
 
 class Utils:
-    
+
     def __init__(self):
         self.added_service_offerings = {
-            'testOffering1' : {'displaytext': 'Test Offering 1', 'cpuspeed': 600, 'cpunumber': 1, 'name': 'Test Offering 1', 'memory': 256}, 
-            'testOffering2' : {'displaytext': 'Test Offering 2', 'cpuspeed': 600, 'cpunumber': 2, 'name': 'Test Offering 2', 'memory': 512}                            
+            'testOffering1' : {'displaytext': 'Test Offering 1', 'cpuspeed': 600, 'cpunumber': 1, 'name': 'Test Offering 1', 'memory': 256},
+            'testOffering2' : {'displaytext': 'Test Offering 2', 'cpuspeed': 600, 'cpunumber': 2, 'name': 'Test Offering 2', 'memory': 512}
         }
-    
+
 class TestChangeServiceOfferingForVmWithSnapshots(cloudstackTestCase):
-        
+
     @classmethod
     def setUpClass(cls):
         try:
@@ -309,46 +310,48 @@
             if cls.hypervisor.lower() in (KVM.lower(), "hyperv", "lxc"):
                 cls.unsupportedHypervisor = True
                 return
-            
+
             cls.domain = get_domain(cls.api_client)
             cls.zone = get_zone(
                 cls.api_client,
                 cls.testClient.getZoneForTests()
             )
             cls.services["small"]["zoneid"] = cls.zone.id
-            cls.template = get_template(
+
+            cls.template = get_suitable_test_template(
                 cls.api_client,
                 cls.zone.id,
-                cls.services["ostype"]
+                cls.services["ostype"],
+                cls.hypervisor
             )
             if cls.template == FAILED:
-                assert False, "get_template() failed to return template\
+                assert False, "get_suitable_test_template() failed to return template\
                     with description %s" % cls.services["ostype"]
-            
+
             test_offerings = Utils().added_service_offerings
             for offering in test_offerings:
                 cls.services["service_offerings"][offering] = test_offerings[offering]
-                
+
             # Create 2 different service offerings
             cls.service_offering_1 = ServiceOffering.create(
                 cls.api_client,
                 cls.services["service_offerings"]["testOffering1"]
             )
             cls._cleanup.append(cls.service_offering_1)
-            
+
             cls.service_offering_2 = ServiceOffering.create(
                 cls.api_client,
                 cls.services["service_offerings"]["testOffering2"]
             )
             cls._cleanup.append(cls.service_offering_2)
-            
+
             cls.account = Account.create(
                 cls.api_client,
                 cls.services["account"],
                 domainid=cls.domain.id
             )
             cls._cleanup.append(cls.account)
-            
+
         except Exception as e:
             cls.tearDownClass()
             raise Exception("Warning: Exception in setup : %s" % e)
@@ -358,11 +361,11 @@
         self.apiclient = self.testClient.getApiClient()
         self.dbclient = self.testClient.getDbConnection()
         self.cleanup = []
-        
+
         if self.unsupportedHypervisor:
             self.skipTest("Skipping test because unsupported hypervisor\
                     %s" % self.hypervisor)
-        
+
     def tearDown(self):
         # Clean up, terminate the created resources
         cleanup_resources(self.apiclient, self.cleanup)
@@ -376,7 +379,7 @@
             raise Exception("Warning: Exception during cleanup : %s" % e)
 
         return
-    
+
     def wait_vm_start(self, apiclient, vmid, timeout, sleep):
         while timeout:
             vms = VirtualMachine.list(apiclient, id=vmid)
@@ -387,7 +390,7 @@
             timeout = timeout - 1
 
         return timeout
-    
+
     def checkCPUAndMemory(self, ssh, service_offering):
         cpuinfo = ssh.execute("cat /proc/cpuinfo")
         cpu_cnt = len([i for i in cpuinfo if "processor" in i])
@@ -421,7 +424,7 @@
     def test_change_service_offering_for_vm_with_snapshots(self):
         """Test to change service offering for instances with vm snapshots
         """
-        
+
         # 1) Create Virtual Machine using service offering 1
         self.debug("Creating VM using Service Offering 1")
         virtual_machine = VirtualMachine.create(
@@ -435,21 +438,21 @@
             mode=self.zone.networktype,
             serviceofferingid=self.service_offering_1.id
         )
-        
+
         # Verify Service OFfering 1 CPU cores and memory
         try:
             ssh_client = virtual_machine.get_ssh_client(reconnect=True)
             self.checkCPUAndMemory(ssh_client, self.service_offering_1)
         except Exception as e:
             self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
-        
+
         # 2) Take VM Snapshot
         self.debug("Taking VM Snapshot for VM - ID: %s" % virtual_machine.id)
         vm_snapshot = VmSnapshot.create(
             self.apiclient,
             virtual_machine.id,
         )
-        
+
         # 3) Stop Virtual Machine
         self.debug("Stopping VM - ID: %s" % virtual_machine.id)
         try:
@@ -480,25 +483,25 @@
 
         except Exception as e:
             self.fail("Failed to stop VM: %s" % e)
-        
+
         # 4) Change service offering for VM with snapshots from Service Offering 1 to Service Offering 2
         self.debug("Changing service offering from Service Offering 1 to Service Offering 2 for VM - ID: %s" % virtual_machine.id)
         virtual_machine.change_service_offering(self.apiclient, self.service_offering_2.id)
-        
+
         # 5) Start VM
         self.debug("Starting VM - ID: %s" % virtual_machine.id)
         try:
             virtual_machine.start(self.apiclient)
         except Exception as e:
             self.fail("Failed to start virtual machine: %s, %s" % (virtual_machine.name, e))
-        
+
         # Wait for vm to start
         timeout = self.wait_vm_start(self.apiclient, virtual_machine.id, self.services["timeout"],
                             self.services["sleep"])
         if timeout == 0:
             self.fail("The virtual machine %s failed to start even after %s minutes"
                    % (virtual_machine.name, self.services["timeout"]))
-        
+
         list_vm_response = list_virtual_machines(
             self.apiclient,
             id=virtual_machine.id
@@ -523,14 +526,14 @@
             virtual_machine.id,
             "Check virtual machine id"
         )
-        
+
         # 6) Verify service offering has changed
         try:
             ssh_client_2 = virtual_machine.get_ssh_client(reconnect=True)
             self.checkCPUAndMemory(ssh_client_2, self.service_offering_2)
         except Exception as e:
             self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
-        
+
         # 7) Stop Virtual Machine
         self.debug("Stopping VM - ID: %s" % virtual_machine.id)
         try:
@@ -548,19 +551,19 @@
             )
         except Exception as e:
             self.fail("Failed to revert to VM Snapshot: %s - %s" % (vm_snapshot.id, e))
-        
+
         # 9) Start VM
         self.debug("Starting VM - ID: %s" % virtual_machine.id)
         try:
             virtual_machine.start(self.apiclient)
         except Exception as e:
             self.fail("Failed to start virtual machine: %s, %s" % (virtual_machine.name, e))
-            
+
         # 10) Verify service offering has changed to Service Offering 1 (from VM Snapshot)
         try:
             ssh_client_3 = virtual_machine.get_ssh_client(reconnect=True)
             self.checkCPUAndMemory(ssh_client_3, self.service_offering_1)
         except Exception as e:
             self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
-        
-        return
\ No newline at end of file
+
+        return
diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py
index 17f8547..aa4eaf1 100644
--- a/test/integration/smoke/test_volumes.py
+++ b/test/integration/smoke/test_volumes.py
@@ -5,9 +5,9 @@
 # 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
@@ -34,8 +34,8 @@
                              DiskOffering,
                              StoragePool,)
 from marvin.lib.common import (get_domain,
+                                get_suitable_test_template,
                                 get_zone,
-                                get_template,
                                 find_storage_pool_type,
                                 get_pod,
                                 list_disk_offering)
@@ -83,13 +83,15 @@
                                     cls.services["disk_offering"],
                                     custom=True
                                     )
-        template = get_template(
-                            cls.apiclient,
-                            cls.zone.id,
-                            cls.services["ostype"]
-                            )
+
+        template = get_suitable_test_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.services["ostype"],
+            cls.hypervisor
+        )
         if template == FAILED:
-            assert False, "get_template() failed to return template with description %s" % cls.services["ostype"]
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         cls.services["domainid"] = cls.domain.id
         cls.services["zoneid"] = cls.zone.id
@@ -302,17 +304,18 @@
                                     custom=True
                                     )
 
-        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"]
+        cls.template = get_suitable_test_template(
+            cls.apiclient,
+            cls.zone.id,
+            cls.services["ostype"],
+            cls.hypervisor
+        )
+        if cls.template == FAILED:
+            assert False, "get_suitable_test_template() failed to return template with description %s" % cls.services["ostype"]
 
         cls.services["domainid"] = cls.domain.id
         cls.services["zoneid"] = cls.zone.id
-        cls.services["template"] = template.id
+        cls.services["template"] = cls.template.id
         cls.services["diskofferingid"] = cls.disk_offering.id
         cls.services['resizeddiskofferingid'] = cls.resized_disk_offering.id
         cls.services['customresizeddiskofferingid'] = cls.custom_resized_disk_offering.id
@@ -530,8 +533,12 @@
         self.debug("Extract detached Volume ID: %s" % self.volume.id)
 
         self.virtual_machine.attach_volume(self.apiClient, self.volume)
+        #Sleep to ensure the current state will reflected in other calls
+        time.sleep(self.services["sleep"])
         self.virtual_machine.detach_volume(self.apiClient, self.volume)
         self.attached = False
+        #Sleep to ensure the current state will reflected in other calls
+        time.sleep(self.services["sleep"])
 
         cmd = extractVolume.extractVolumeCmd()
         cmd.id = self.volume.id
@@ -871,6 +878,7 @@
         test_vm = VirtualMachine.create(
             self.apiclient,
             self.services,
+            templateid=self.template.id,
             accountid=self.account.name,
             domainid=self.account.domainid,
             serviceofferingid=self.service_offering.id,
@@ -906,6 +914,8 @@
             None,
             "Check if volume state (attached) is reflected"
         )
+        #Sleep to ensure the current state will reflected in other calls
+        time.sleep(self.services["sleep"])
 
         test_vm.detach_volume(self.apiClient, self.volume)
         self.cleanup.append(test_vm)
@@ -978,7 +988,7 @@
             pool = pools[0]
         else:
             raise self.skipTest("Not enough storage pools found, skipping test")
-        
+
         if hasattr(pool, 'tags'):
             StoragePool.update(self.apiclient, id=pool.id, tags="")
 
diff --git a/test/integration/smoke/test_vpc_vpn.py b/test/integration/smoke/test_vpc_vpn.py
index c119c61..26b1daf 100644
--- a/test/integration/smoke/test_vpc_vpn.py
+++ b/test/integration/smoke/test_vpc_vpn.py
@@ -20,13 +20,9 @@
 from marvin.codes import PASS, FAILED
 from marvin.cloudstackTestCase import cloudstackTestCase
 from marvin.lib.utils import (validateList,
-                              cleanup_resources,
-                              get_process_status,
                               wait_until)
 
-from marvin.lib.base import (Domain,
-                             Account,
-                             Configurations,
+from marvin.lib.base import (Account,
                              VPC,
                              VpcOffering,
                              ServiceOffering,
@@ -34,14 +30,8 @@
                              Network,
                              PublicIPAddress,
                              NATRule,
-                             NetworkACL,
                              NetworkACLList,
-                             LoadBalancerRule,
-                             ApplicationLoadBalancer,
                              VirtualMachine,
-                             Template,
-                             FireWallRule,
-                             StaticNATRule,
                              Vpn,
                              VpnCustomerGateway,
                              VpnUser
@@ -52,8 +42,7 @@
 
 from marvin.lib.common import (get_zone,
                                get_domain,
-                               get_test_template,
-                               list_network_offerings)
+                               get_test_template)
 
 from nose.plugins.attrib import attr
 
@@ -236,12 +225,16 @@
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.domain = get_domain(cls.apiclient)
 
+        cls._cleanup = []
+
         cls.compute_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["compute_offering"]
         )
+        cls._cleanup.append(cls.compute_offering)
         cls.account = Account.create(
             cls.apiclient, services=cls.services["account"])
+        cls._cleanup.append(cls.account)
 
         cls.hypervisor = testClient.getHypervisorInfo()
 
@@ -253,7 +246,6 @@
                    %s" % (cls.account.name,
                           cls.account.id))
 
-        cls.cleanup = [cls.account, cls.compute_offering]
         return
 
     @attr(tags=["advanced"], required_hardware="true")
@@ -285,6 +277,7 @@
                 account=self.account.name,
                 domainid=self.domain.id
             )
+            self.cleanup.append(vpc)
         except Exception as e:
             self.fail(e)
         finally:
@@ -306,6 +299,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk, "Network failed to create")
+            self.cleanup.append(ntwk)
             self.logger.debug(
                 "Network %s created in VPC %s" % (ntwk.id, vpc.id))
 
@@ -321,6 +315,7 @@
                                        hypervisor=self.hypervisor
                                        )
             self.assert_(vm is not None, "VM failed to deploy")
+            self.cleanup.append(vm)
             self.assert_(vm.state == 'Running', "VM is not running")
             self.debug("VM %s deployed in VPC %s" % (vm.id, vpc.id))
         except Exception as e:
@@ -387,12 +382,15 @@
 
     @classmethod
     def tearDownClass(cls):
+        super(TestVpcRemoteAccessVpn, cls).tearDownClass()
 
-        try:
-            cls.logger.debug("Cleaning up resources")
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception, e:
-            raise Exception("Cleanup failed with %s" % e)
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        self.cleanup = []
+
+    def tearDown(self):
+        super(TestVpcRemoteAccessVpn, self).tearDown()
 
 
 class TestVpcSite2SiteVpn(cloudstackTestCase):
@@ -411,13 +409,17 @@
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.domain = get_domain(cls.apiclient)
 
+        cls._cleanup = []
+
         cls.compute_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["compute_offering"]
         )
+        cls._cleanup.append(cls.compute_offering)
 
         cls.account = Account.create(
             cls.apiclient, services=cls.services["account"])
+        cls._cleanup.append(cls.account)
 
         cls.hypervisor = testClient.getHypervisorInfo()
 
@@ -428,10 +430,13 @@
         cls.logger.debug("Successfully created account: %s, id: \
                    %s" % (cls.account.name,
                           cls.account.id))
-
-        cls.cleanup = [cls.account, cls.compute_offering]
         return
 
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        self.cleanup = []
+
     def _get_ssh_client(self, virtual_machine, services, retries):
         """ Setup ssh client connection and return connection
         vm requires attributes public_ip, public_port, username, password """
@@ -547,7 +552,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc1 is not None, "VPC1 creation failed")
-
+        self.cleanup.append(vpc1)
         self.logger.debug("VPC1 %s created" % vpc1.id)
 
         vpc2 = None
@@ -566,7 +571,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc2 is not None, "VPC2 creation failed")
-
+        self.cleanup.append(vpc2)
         self.logger.debug("VPC2 %s created" % vpc2.id)
 
         default_acl = NetworkACLList.list(
@@ -589,7 +594,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk1, "Network failed to create")
-
+        self.cleanup.append(ntwk1)
         self.logger.debug("Network %s created in VPC %s" % (ntwk1.id, vpc1.id))
 
         ntwk2 = None
@@ -609,7 +614,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk2, "Network failed to create")
-
+        self.cleanup.append(ntwk2)
         self.logger.debug("Network %s created in VPC %s" % (ntwk2.id, vpc2.id))
 
         vm1 = None
@@ -629,7 +634,7 @@
         finally:
             self.assert_(vm1 is not None, "VM failed to deploy")
             self.assert_(vm1.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm1)
         self.logger.debug("VM %s deployed in VPC %s" % (vm1.id, vpc1.id))
 
         vm2 = None
@@ -649,7 +654,7 @@
         finally:
             self.assert_(vm2 is not None, "VM failed to deploy")
             self.assert_(vm2.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm2)
         self.debug("VM %s deployed in VPC %s" % (vm2.id, vpc2.id))
 
         # 4) Enable Site-to-Site VPN for VPC
@@ -758,10 +763,10 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception, e:
-            raise Exception("Cleanup failed with %s" % e)
+        super(TestVpcSite2SiteVpn, cls).tearDownClass()
+
+    def tearDown(self):
+        super(TestVpcSite2SiteVpn, self).tearDown()
 
 
 class TestRVPCSite2SiteVpn(cloudstackTestCase):
@@ -779,14 +784,17 @@
 
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.domain = get_domain(cls.apiclient)
+        cls._cleanup = []
 
         cls.compute_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["compute_offering"]
         )
+        cls._cleanup.append(cls.compute_offering)
 
         cls.account = Account.create(
             cls.apiclient, services=cls.services["account"])
+        cls._cleanup.append(cls.account)
 
         cls.hypervisor = testClient.getHypervisorInfo()
 
@@ -797,8 +805,6 @@
         cls.logger.debug("Successfully created account: %s, id: \
                    %s" % (cls.account.name,
                           cls.account.id))
-
-        cls.cleanup = [cls.account, cls.compute_offering]
         return
 
     def _validate_vpc_offering(self, vpc_offering):
@@ -901,7 +907,6 @@
             'redundant_vpc_offering')
         self.assert_(redundant_vpc_offering is not None,
                      "Failed to create redundant VPC Offering")
-
         redundant_vpc_offering.update(self.apiclient, state='Enabled')
 
         # Create VPC 1
@@ -920,7 +925,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc1 is not None, "VPC1 creation failed")
-
+        self.cleanup.append(vpc1)
         self.logger.debug("VPC1 %s created" % vpc1.id)
 
         # Create VPC 2
@@ -939,7 +944,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc2 is not None, "VPC2 creation failed")
-
+        self.cleanup.append(vpc2)
         self.logger.debug("VPC2 %s created" % vpc2.id)
 
         default_acl = NetworkACLList.list(
@@ -962,7 +967,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk1, "Network failed to create")
-
+        self.cleanup.append(ntwk1)
         self.logger.debug("Network %s created in VPC %s" % (ntwk1.id, vpc1.id))
 
         # Create network in VPC 2
@@ -982,7 +987,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk2, "Network failed to create")
-
+        self.cleanup.append(ntwk2)
         self.logger.debug("Network %s created in VPC %s" % (ntwk2.id, vpc2.id))
 
         # Deploy a vm in network 2
@@ -1002,7 +1007,7 @@
         finally:
             self.assert_(vm1 is not None, "VM failed to deploy")
             self.assert_(vm1.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm1)
         self.logger.debug("VM %s deployed in VPC %s" % (vm1.id, vpc1.id))
 
         # Deploy a vm in network 2
@@ -1022,7 +1027,7 @@
         finally:
             self.assert_(vm2 is not None, "VM failed to deploy")
             self.assert_(vm2.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm2)
         self.debug("VM %s deployed in VPC %s" % (vm2.id, vpc2.id))
 
         # 4) Enable Site-to-Site VPN for VPC
@@ -1130,11 +1135,15 @@
 
     @classmethod
     def tearDownClass(cls):
-        try:
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception, e:
-            raise Exception("Cleanup failed with %s" % e)
+        super(TestRVPCSite2SiteVpn, cls).tearDownClass()
 
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        self.cleanup = []
+
+    def tearDown(self):
+        super(TestRVPCSite2SiteVpn, self).tearDown()
 
 class TestVPCSite2SiteVPNMultipleOptions(cloudstackTestCase):
 
@@ -1152,13 +1161,17 @@
         cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
         cls.domain = get_domain(cls.apiclient)
 
+        cls._cleanup = []
+
         cls.compute_offering = ServiceOffering.create(
             cls.apiclient,
             cls.services["compute_offering"]
         )
+        cls._cleanup.append(cls.compute_offering)
 
         cls.account = Account.create(
             cls.apiclient, services=cls.services["account"])
+        cls._cleanup.append(cls.account)
 
         cls.hypervisor = testClient.getHypervisorInfo()
 
@@ -1169,10 +1182,13 @@
         cls.logger.debug("Successfully created account: %s, id: \
                    %s" % (cls.account.name,
                           cls.account.id))
-
-        cls.cleanup = [cls.account, cls.compute_offering]
         return
 
+    def setUp(self):
+        self.apiclient = self.testClient.getApiClient()
+        self.hypervisor = self.testClient.getHypervisorInfo()
+        self.cleanup = []
+
     def _get_ssh_client(self, virtual_machine, services, retries):
         """ Setup ssh client connection and return connection
         vm requires attributes public_ip, public_port, username, password """
@@ -1288,7 +1304,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc1 is not None, "VPC1 creation failed")
-
+        self.cleanup.append(vpc1)
         self.logger.debug("VPC1 %s created" % vpc1.id)
 
         vpc2 = None
@@ -1307,7 +1323,7 @@
             self.fail(e)
         finally:
             self.assert_(vpc2 is not None, "VPC2 creation failed")
-
+        self.cleanup.append(vpc2)
         self.logger.debug("VPC2 %s created" % vpc2.id)
 
         default_acl = NetworkACLList.list(
@@ -1330,7 +1346,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk1, "Network failed to create")
-
+        self.cleanup.append(ntwk1)
         self.logger.debug("Network %s created in VPC %s" % (ntwk1.id, vpc1.id))
 
         ntwk2 = None
@@ -1350,7 +1366,7 @@
             self.fail(e)
         finally:
             self.assertIsNotNone(ntwk2, "Network failed to create")
-
+        self.cleanup.append(ntwk2)
         self.logger.debug("Network %s created in VPC %s" % (ntwk2.id, vpc2.id))
 
         vm1 = None
@@ -1370,7 +1386,7 @@
         finally:
             self.assert_(vm1 is not None, "VM failed to deploy")
             self.assert_(vm1.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm1)
         self.logger.debug("VM %s deployed in VPC %s" % (vm1.id, vpc1.id))
 
         vm2 = None
@@ -1390,7 +1406,7 @@
         finally:
             self.assert_(vm2 is not None, "VM failed to deploy")
             self.assert_(vm2.state == 'Running', "VM is not running")
-
+        self.cleanup.append(vm2)
         self.debug("VM %s deployed in VPC %s" % (vm2.id, vpc2.id))
 
         # default config
@@ -1567,10 +1583,6 @@
             out['esplifetime'] = c['esp_life']
         return out
 
-
     @classmethod
     def tearDownClass(cls):
-        try:
-            cleanup_resources(cls.apiclient, cls.cleanup)
-        except Exception, e:
-            raise Exception("Cleanup failed with %s" % e)
+        super(TestVPCSite2SiteVPNMultipleOptions, cls).tearDownClass()
diff --git a/test/integration/testpaths/testpath_storage_migration.py b/test/integration/testpaths/testpath_storage_migration.py
index 848594d..d696f24 100644
--- a/test/integration/testpaths/testpath_storage_migration.py
+++ b/test/integration/testpaths/testpath_storage_migration.py
@@ -324,7 +324,7 @@
     @classmethod
     def tearDownClass(cls):
         try:
-            cleanup_resources(cls.apiclient, cls._cleanup)
+            cleanup_resources(cls.apiclient, reversed(cls._cleanup))
         except Exception as e:
             raise Exception("Warning: Exception during cleanup : %s" % e)
 
@@ -335,13 +335,9 @@
         self.cleanup = []
 
     def tearDown(self):
-        try:
-            for storagePool in self.pools:
-                StoragePool.update(self.apiclient, id=storagePool.id, tags="")
-            cleanup_resources(self.apiclient, self.cleanup)
-        except Exception as e:
-            raise Exception("Warning: Exception during cleanup : %s" % e)
-        return
+        for storagePool in self.pools:
+            StoragePool.update(self.apiclient, id=storagePool.id, tags="")
+        super(TestStorageMigration,self).tearDown()
 
     @attr(tags=["advanced", "basic"], required_hardware="true")
     def test_01_migrate_root_and_data_disk_nonlive(self):
diff --git a/test/pom.xml b/test/pom.xml
index 0d42afc..41112bf 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
diff --git a/test/src-not-used/main/java/com/cloud/test/stress/TestClientWithAPI.java b/test/src-not-used/main/java/com/cloud/test/stress/TestClientWithAPI.java
index c41fae8..7232e3d 100644
--- a/test/src-not-used/main/java/com/cloud/test/stress/TestClientWithAPI.java
+++ b/test/src-not-used/main/java/com/cloud/test/stress/TestClientWithAPI.java
@@ -1504,11 +1504,11 @@
                 int bytesReceived = Integer.parseInt(requestKeyValues.get("receivedbytes"));
                 int bytesSent = Integer.parseInt(requestKeyValues.get("sentbytes"));
                 if ((bytesReceived > 100000000) && (bytesSent > 0)) {
-                    s_logger.info("Network stat is correct for account" + s_account.get() + "; bytest received is " + bytesReceived + " and bytes sent is " + bytesSent);
+                    s_logger.info("Network stat is correct for account" + s_account.get() + "; bytest received is " + toHumanReadableSize(bytesReceived) + " and bytes sent is " + toHumanReadableSize(bytesSent));
                     return true;
                 } else {
-                    s_logger.error("Incorrect value for bytes received/sent for the account " + s_account.get() + ". We got " + bytesReceived + " bytes received; " +
-                        " and " + bytesSent + " bytes sent");
+                    s_logger.error("Incorrect value for bytes received/sent for the account " + s_account.get() + ". We got " + toHumanReadableSize(bytesReceived) + " bytes received; " +
+                        " and " + toHumanReadableSize(bytesSent) + " bytes sent");
                     return false;
                 }
 
diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py
index ef98b13..0b0702a 100644
--- a/tools/apidoc/gen_toc.py
+++ b/tools/apidoc/gen_toc.py
@@ -155,6 +155,7 @@
     'createSecondaryStagingStore': 'Image Store',
     'deleteSecondaryStagingStore': 'Image Store',
     'listSecondaryStagingStores': 'Image Store',
+    'updateImageStore': 'Image Store',
     'InternalLoadBalancer': 'Internal LB',
 	'DeploymentPlanners': 'Configuration',
 	'ObjectStore': 'Image Store',
@@ -195,8 +196,10 @@
     'KubernetesSupportedVersion': 'Kubernetes Service',
     'KubernetesCluster': 'Kubernetes Service',
     'UnmanagedInstance': 'Virtual Machine',
-    'Rolling': 'Rolling Maintenance'
-    }
+    'Rolling': 'Rolling Maintenance',
+    'importVsphereStoragePolicies' : 'vSphere storage policies',
+    'listVsphereStoragePolicies' : 'vSphere storage policies'
+}
 
 
 categories = {}
diff --git a/tools/apidoc/pom.xml b/tools/apidoc/pom.xml
index 593c413..2f528c9 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <properties>
diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh
index 25d73f1..1c83f9a 100755
--- a/tools/appliance/build.sh
+++ b/tools/appliance/build.sh
@@ -227,7 +227,7 @@
 displayname = "${1}"
 annotation = "${1}"
 guestos = "otherlinux-64"
-virtualHW.version = "8"
+virtualHW.version = "11"
 config.version = "8"
 numvcpus = "1"
 cpuid.coresPerSocket = "1"
diff --git a/tools/appliance/systemvmtemplate/http/preseed.cfg b/tools/appliance/systemvmtemplate/http/preseed.cfg
index aa63f0e..ce51f74 100644
--- a/tools/appliance/systemvmtemplate/http/preseed.cfg
+++ b/tools/appliance/systemvmtemplate/http/preseed.cfg
@@ -18,8 +18,10 @@
 ### Localization
 # Locale sets language and country.
 d-i debian-installer/locale string en_US.UTF-8
+d-i debian-installer/country string IN
 
 # Keyboard selection.
+d-i keymap select us
 d-i keyboard-configuration/xkb-keymap select us
 
 ### Network configuration
@@ -32,7 +34,7 @@
 
 ### Mirror settings
 d-i mirror/country string manual
-d-i mirror/http/hostname string http.debian.net
+d-i mirror/http/hostname string deb.debian.org
 d-i mirror/http/directory string /debian
 d-i mirror/http/proxy string
 
@@ -60,21 +62,11 @@
                       use_filesystem{ } filesystem{ ext2 }    \
                       mountpoint{ /boot }                     \
               .                                               \
-              1175 40 1200 ext4                               \
+              2240 40 2500 ext4                               \
                       method{ format } format{ }              \
                       use_filesystem{ } filesystem{ ext4 }    \
                       mountpoint{ / }                         \
               .                                               \
-              480 50 700 ext4                                 \
-                      method{ format } format{ }              \
-                      use_filesystem{ } filesystem{ ext4 }    \
-                      mountpoint{ /var }                      \
-              .                                               \
-              80 90 100 ext4                                  \
-                      method{ format } format{ }              \
-                      use_filesystem{ } filesystem{ ext4 }    \
-                      mountpoint{ /tmp }                      \
-              .                                               \
               256 1000 256 linux-swap                         \
                       method{ swap } format{ }                \
               .
@@ -100,24 +92,18 @@
 d-i user-setup/allow-password-weak boolean true
 d-i passwd/user-default-groups string audio cdrom video admin
 
-openssh-server  openssh-server/permit-root-login boolean true
-
 ### Package selection
 tasksel tasksel/first multiselect ssh-server
 d-i pkgsel/include string openssh-server ntp acpid sudo bzip2 openssl
 # Allowed values: none, safe-upgrade, full-upgrade
 d-i pkgsel/upgrade select full-upgrade
+d-i pkgsel/update-policy select none
 
 popularity-contest popularity-contest/participate boolean false
 
 ### Boot loader installation
 d-i grub-installer/only_debian boolean true
-d-i grub-installer/with_other_os boolean true
 d-i grub-installer/bootdev  string default
 d-i finish-install/reboot_in_progress note
 
 #### Advanced options
-# Prevent packaged version of VirtualBox Guest Additions being installed:
-d-i preseed/early_command string sed -i \
-  '/in-target/idiscover(){/sbin/discover|grep -v VirtualBox;}' \
-  /usr/lib/pre-pkgsel.d/20install-hwpackages
diff --git a/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh b/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
index cedbb1c..ea75c2d 100644
--- a/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
+++ b/tools/appliance/systemvmtemplate/scripts/apt_upgrade.sh
@@ -36,8 +36,8 @@
   sed -i '/deb-src/d' /etc/apt/sources.list
   sed -i '/backports/d' /etc/apt/sources.list
   sed -i '/security/d' /etc/apt/sources.list
-  echo 'deb http://http.debian.net/debian stretch-backports main' >> /etc/apt/sources.list
-  echo 'deb http://security.debian.org/debian-security stretch/updates main' >> /etc/apt/sources.list
+  echo 'deb http://http.debian.net/debian buster-backports main' >> /etc/apt/sources.list
+  echo 'deb http://security.debian.org/debian-security buster/updates main' >> /etc/apt/sources.list
 }
 
 function apt_upgrade() {
diff --git a/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh b/tools/appliance/systemvmtemplate/scripts/configure_systemvm_services.sh
index 7349298..4e8605d 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.14.0
+CLOUDSTACK_RELEASE=4.15.0
 
 function configure_apache2() {
    # Enable ssl, rewrite and auth
@@ -41,7 +41,7 @@
 
    __?.o/  Apache CloudStack SystemVM $CLOUDSTACK_RELEASE
   (  )#    https://cloudstack.apache.org
- (___(_)   Debian GNU/Linux 9.12 \n \l
+ (___(_)   Debian GNU/Linux 10 \n \l
 
 EOF
 }
diff --git a/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh b/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
index 1f18b25..2e788f3 100644
--- a/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
+++ b/tools/appliance/systemvmtemplate/scripts/install_systemvm_packages.sh
@@ -41,26 +41,26 @@
   local arch=`dpkg --print-architecture`
 
   debconf_packages
-  install_vhd_util
 
   local apt_get="apt-get --no-install-recommends -q -y"
 
   ${apt_get} install grub-legacy \
-    rsyslog logrotate cron net-tools ifupdown tmux vim-tiny htop netbase iptables \
-    openssh-server e2fsprogs tcpdump iftop socat wget \
-    python bzip2 sed gawk diffutils grep gzip less tar telnet ftp rsync traceroute psmisc lsof procps \
+    rsyslog logrotate cron net-tools ifupdown tmux vim-tiny htop netbase iptables nftables \
+    openssh-server e2fsprogs tcpdump iftop socat wget coreutils systemd \
+    python python3 bzip2 sed gawk diffutils grep gzip less tar telnet ftp rsync traceroute psmisc lsof procps \
     inetutils-ping iputils-arping httping curl \
-    dnsutils zip unzip ethtool uuid file iproute acpid sudo \
+    dnsutils zip unzip ethtool uuid file iproute2 acpid sudo \
     sysstat python-netaddr \
     apache2 ssl-cert \
     dnsmasq dnsmasq-utils \
     nfs-common \
     samba-common cifs-utils \
-    xl2tpd bcrelay ppp ipsec-tools tdb-tools \
+    xl2tpd bcrelay ppp tdb-tools \
     xenstore-utils libxenstore3.0 \
     ipvsadm conntrackd libnetfilter-conntrack3 \
     keepalived irqbalance \
     ipcalc \
+    openjdk-11-jre-headless \
     ipset \
     iptables-persistent \
     libtcnative-1 libssl-dev libapr1-dev \
@@ -69,11 +69,9 @@
     haveged \
     radvd \
     sharutils genisoimage aria2 \
-    strongswan libcharon-extra-plugins libstrongswan-extra-plugins \
+    strongswan libcharon-extra-plugins libstrongswan-extra-plugins strongswan-charon strongswan-starter \
     virt-what open-vm-tools qemu-guest-agent hyperv-daemons
 
-  apt-get -q -y -t stretch-backports install nftables openjdk-11-jre-headless
-
   apt-get -y autoremove --purge
   apt-get clean
   apt-get autoclean
@@ -87,6 +85,7 @@
     ${apt_get} install libuuid1:i386 libc6:i386
   fi
 
+  install_vhd_util
   # Install xenserver guest utilities as debian repos don't have it
   wget https://mirrors.kernel.org/ubuntu/pool/main/x/xe-guest-utilities/xe-guest-utilities_7.10.0-0ubuntu1_amd64.deb
   dpkg -i xe-guest-utilities_7.10.0-0ubuntu1_amd64.deb
diff --git a/tools/appliance/systemvmtemplate/template.json b/tools/appliance/systemvmtemplate/template.json
index 1397b6c..e87effc 100644
--- a/tools/appliance/systemvmtemplate/template.json
+++ b/tools/appliance/systemvmtemplate/template.json
@@ -4,7 +4,7 @@
   "provisioners": [
     {
       "type": "shell",
-      "execute_command": "echo 'cloud'|sudo -S bash '{{.Path}}'",
+      "execute_command": "echo 'cloud' | sudo -u root -S bash {{.Path}}",
       "scripts": [
         "scripts/apt_upgrade.sh",
         "scripts/configure_grub.sh",
@@ -13,11 +13,11 @@
         "scripts/configure_acpid.sh",
         "scripts/install_systemvm_packages.sh",
         "scripts/configure_conntrack.sh",
-        "../cloud_scripts_shar_archive.sh",
-        "scripts/configure_systemvm_services.sh",
         "scripts/authorized_keys.sh",
         "scripts/configure_persistent_config.sh",
         "scripts/configure_login.sh",
+        "../cloud_scripts_shar_archive.sh",
+        "scripts/configure_systemvm_services.sh",
         "scripts/cleanup.sh",
         "scripts/finalize.sh"
       ]
@@ -29,50 +29,39 @@
       "accelerator": "kvm",
       "headless": true,
       "qemuargs": [
-        [ "-m", "512M" ],
-        [ "-smp", "cpus=1,maxcpus=1,cores=1" ]
+        [ "-m", "500M" ],
+        [ "-smp", "1" ]
       ],
-      "disk_size": 2000,
       "format": "qcow2",
-
+      "disk_size": 2500,
       "disk_interface": "virtio",
       "net_device": "virtio-net",
-
-      "iso_url": "https://cdimage.debian.org/cdimage/archive/9.12.0/amd64/iso-cd/debian-9.12.0-amd64-netinst.iso",
-      "iso_checksum": "af81de39678db1f814be4ce1b7b64b891f6f59926d6f835842c4b52b462ac7e78c45b5efd8273c196d64ba0b2dd1a0aabfb97c6e4f10702ee11a72e07aec9d67",
+      "iso_url": "https://download.cloudstack.org/systemvm/debian/debian-10.5.0-amd64-netinst.iso",
+      "iso_checksum": "0a6aee1d9aafc1ed095105c052f9fdd65ed00ea9274188c9cd0072c8e6838ab40e246d45a1e6956d74ef1b04a1fc042151762f25412e9ff0cbf49418eef7992e",
       "iso_checksum_type": "sha512",
-
-      "vm_name": "systemvmtemplate",
       "output_directory": "../dist",
-
       "http_directory": "http",
-      "http_port_min": 10082,
-      "http_port_max": 10089,
-
-      "ssh_host_port_min": 2222,
-      "ssh_host_port_max": 2229,
-
+      "vm_name": "systemvmtemplate",
       "ssh_username": "cloud",
       "ssh_password": "cloud",
-      "ssh_port": 22,
       "ssh_wait_timeout": "30m",
-
-      "boot_wait": "10s",
+      "boot_wait": "5s",
       "boot_command": [
         "<esc><wait>",
         "install <wait>",
-        " preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
-        " debian-installer=en_US <wait>",
-        " auto <wait>",
-        " locale=en_US <wait>",
-        " kbd-chooser/method=us <wait>",
-        " netcfg/get_hostname=systemvm <wait>",
-        " netcfg/get_domain=apache.org <wait>",
-        " fb=false <wait>",
-        " debconf/frontend=noninteractive <wait>",
-        " console-setup/ask_detect=false <wait>",
-        " console-keymaps-at/keymap=us <wait>",
-        " keyboard-configuration/xkb-keymap=us <wait>",
+        "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
+        "debian-installer=en_US.UTF-8 <wait>",
+        "auto <wait>",
+        "language=en locale=en_US.UTF-8 <wait>",
+        "kbd-chooser/method=us <wait>",
+        "keyboard-configuration/xkb-keymap=us <wait>",
+        "netcfg/get_hostname=systemvm <wait>",
+        "netcfg/get_domain=apache.org <wait>",
+        "country=IN keymap=us <wait>",
+        "fb=false <wait>",
+        "debconf/frontend=noninteractive <wait>",
+        "console-setup/ask_detect=false <wait>",
+        "console-keymaps-at/keymap=us <wait>",
         "<enter><wait>"
       ],
 
diff --git a/tools/build/build_asf.sh b/tools/build/build_asf.sh
index 7530be5..0e639ae 100755
--- a/tools/build/build_asf.sh
+++ b/tools/build/build_asf.sh
@@ -150,10 +150,10 @@
 fi
 
 echo 'md5'
-gpg -v --print-md MD5 apache-cloudstack-$version-src.tar.bz2 > apache-cloudstack-$version-src.tar.bz2.md5
+md5sum apache-cloudstack-$version-src.tar.bz2 > apache-cloudstack-$version-src.tar.bz2.md5
 
 echo 'sha512'
-gpg -v --print-md SHA512 apache-cloudstack-$version-src.tar.bz2 > apache-cloudstack-$version-src.tar.bz2.sha512
+sha512sum apache-cloudstack-$version-src.tar.bz2 > apache-cloudstack-$version-src.tar.bz2.sha512
 
 echo 'verify'
 gpg -v --verify apache-cloudstack-$version-src.tar.bz2.asc apache-cloudstack-$version-src.tar.bz2
diff --git a/tools/checkstyle/pom.xml b/tools/checkstyle/pom.xml
index 34b1d32..53ca24e 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.14.2.0-SNAPSHOT</version>
+    <version>4.15.1.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 ab039fc..1d5d2d8 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/devcloud4/pom.xml b/tools/devcloud4/pom.xml
index 898ec43..a2aad9b 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile
index 604040c..a3e5276 100644
--- a/tools/docker/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -17,10 +17,10 @@
 #
 # CloudStack-simulator build
 
-FROM ubuntu:16.04
+FROM ubuntu:18.04
 
 MAINTAINER "Apache CloudStack" <dev@cloudstack.apache.org>
-LABEL Vendor="Apache.org" License="ApacheV2" Version="4.14.1.0"
+LABEL Vendor="Apache.org" License="ApacheV2" Version="4.15.1.0-SNAPSHOT"
 
 ARG DEBIAN_FRONTEND=noninteractive
 
@@ -31,6 +31,7 @@
     git \
     sudo \
     ipmitool \
+    iproute2 \
     maven \
     openjdk-11-jdk \
     python-dev \
@@ -55,6 +56,7 @@
 RUN find /var/lib/mysql -type f -exec touch {} \; && \
     (/usr/bin/mysqld_safe &) && \
     sleep 5; \
+    mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by ''" --connect-expired-password; \
     mvn -Pdeveloper -pl developer -Ddeploydb; \
     mvn -Pdeveloper -pl developer -Ddeploydb-simulator; \
     MARVIN_FILE=`find /root/tools/marvin/dist/ -name "Marvin*.tar.gz"`; \
diff --git a/tools/docker/Dockerfile.marvin b/tools/docker/Dockerfile.marvin
index 1bd338f..76175aa 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.14.1.0"
+LABEL Vendor="Apache.org" License="ApacheV2" Version="4.15.1.0-SNAPSHOT"
 
 ENV WORK_DIR=/marvin
 
-ENV PKG_URL=https://builds.cloudstack.org/job/build-master-marvin/lastSuccessfulBuild/artifact/tools/marvin/dist/Marvin-4.14.2.0-SNAPSHOT.tar.gz
+ENV PKG_URL=https://builds.cloudstack.org/job/build-master-marvin/lastSuccessfulBuild/artifact/tools/marvin/dist/Marvin-4.15.1.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/cloudstackTestCase.py b/tools/marvin/marvin/cloudstackTestCase.py
index 2939d12..4a57ae2 100644
--- a/tools/marvin/marvin/cloudstackTestCase.py
+++ b/tools/marvin/marvin/cloudstackTestCase.py
@@ -16,7 +16,7 @@
 # under the License.
 
 import unittest
-from marvin.lib.utils import verifyElementInList
+from marvin.lib.utils import verifyElementInList, cleanup_resources
 from marvin.codes import PASS
 
 
@@ -56,3 +56,22 @@
     @classmethod
     def getClsConfig(cls):
         return cls.config
+
+    @classmethod
+    def tearDownClass(cls):
+        try:
+            if hasattr(cls,'_cleanup'):
+                if hasattr(cls,'apiclient'):
+                    cleanup_resources(cls.apiclient, reversed(cls._cleanup))
+                elif hasattr(cls,'api_client'):
+                    cleanup_resources(cls.api_client, reversed(cls._cleanup))
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+
+    def tearDown(self):
+        try:
+            if hasattr(self,'apiclient') and hasattr(self,'cleanup'):
+                cleanup_resources(self.apiclient, reversed(self.cleanup))
+        except Exception as e:
+            raise Exception("Warning: Exception during cleanup : %s" % e)
+        return
diff --git a/tools/marvin/marvin/config/test_data.py b/tools/marvin/marvin/config/test_data.py
index 4708717..436c656 100644
--- a/tools/marvin/marvin/config/test_data.py
+++ b/tools/marvin/marvin/config/test_data.py
@@ -986,7 +986,60 @@
             "ispublic": "True"
         }
     },
-
+    "test_ovf_templates": [
+        {
+            "name": "test-ovf",
+            "displaytext": "test-ovf",
+            "format": "ova",
+            "hypervisor": "vmware",
+            "ostype": "Other Linux (64-bit)",
+            "url": "http://172.17.0.1/machina-2dd-iso.ova",
+            "deployasis": "True",
+            "requireshvm": "True",
+            "ispublic": "True"
+        }
+    ],
+    "virtual_machine_vapps": {
+        "test-ovf": {
+            "name": "testvm-vapps",
+            "displayname": "Test VM vApps",
+            "properties": [
+                {
+                    "key": "used.by.admin",
+                    "value": "marvin"
+                },
+                {
+                    "key": "use.type",
+                    "value": "test"
+                },
+                {
+                    "key": "usefull.property",
+                    "value": "True"
+                }
+            ],
+            "nicnetworklist": [
+                {
+                    "network": "l2",
+                    "nic": [15, 18]
+                },
+                {
+                    "network": "l2",
+                    "nic": [16]
+                },
+                {
+                    "network": "l2",
+                    "nic": [17]
+                }
+            ]
+        }
+    },
+    "custom_service_offering": {
+        "name": "Custom Service Offering for vApps",
+        "displaytext": "Custom Service Offering for vApps",
+        "cpunumber": "",
+        "cpuspeed": "",
+        "memory": ""
+    },
     "coreos_volume": {
         "diskname": "Volume_core",
         "urlvmware":"http://dl.openvm.eu/cloudstack/coreos/x86_64/coreos_production_cloudstack_image-vmware.ova",
diff --git a/tools/marvin/marvin/lib/base.py b/tools/marvin/marvin/lib/base.py
index df38bb5..6bb7b66 100755
--- a/tools/marvin/marvin/lib/base.py
+++ b/tools/marvin/marvin/lib/base.py
@@ -102,12 +102,29 @@
         """Create role"""
         cmd = createRole.createRoleCmd()
         cmd.name = services["name"]
-        cmd.type = services["type"]
+        if "type" in services:
+            cmd.type = services["type"]
+        if "roleid" in services:
+            cmd.roleid = services["roleid"]
         if "description" in services:
             cmd.description = services["description"]
 
         return Role(apiclient.createRole(cmd).__dict__)
 
+    @classmethod
+    def importRole(cls, apiclient, services, domainid=None):
+        """Import role"""
+        cmd = importRole.importRoleCmd()
+        cmd.name = services["name"]
+        cmd.type = services["type"]
+        cmd.rules = services["rules"]
+        if "description" in services:
+            cmd.description = services["description"]
+        if "forced" in services:
+            cmd.type = services["forced"]
+
+        return Role(apiclient.importRole(cmd).__dict__)
+
     def delete(self, apiclient):
         """Delete Role"""
 
@@ -434,34 +451,53 @@
     @classmethod
     def access_ssh_over_nat(
             cls, apiclient, services, virtual_machine, allow_egress=False,
-            networkid=None):
+            networkid=None, vpcid=None):
         """
         Program NAT and PF rules to open up ssh access to deployed guest
         @return:
         """
-        public_ip = PublicIPAddress.create(
-            apiclient=apiclient,
-            accountid=virtual_machine.account,
-            zoneid=virtual_machine.zoneid,
-            domainid=virtual_machine.domainid,
-            services=services,
-            networkid=networkid
-        )
-        FireWallRule.create(
-            apiclient=apiclient,
-            ipaddressid=public_ip.ipaddress.id,
-            protocol='TCP',
-            cidrlist=['0.0.0.0/0'],
-            startport=22,
-            endport=22
-        )
-        nat_rule = NATRule.create(
-            apiclient=apiclient,
-            virtual_machine=virtual_machine,
-            services=services,
-            ipaddressid=public_ip.ipaddress.id
-        )
-        if allow_egress:
+        # VPCs have ACLs managed differently
+        if vpcid:
+            public_ip = PublicIPAddress.create(
+                apiclient=apiclient,
+                accountid=virtual_machine.account,
+                zoneid=virtual_machine.zoneid,
+                domainid=virtual_machine.domainid,
+                services=services,
+                vpcid=vpcid
+            )
+
+            nat_rule = NATRule.create(
+                apiclient=apiclient,
+                virtual_machine=virtual_machine,
+                services=services,
+                ipaddressid=public_ip.ipaddress.id,
+                networkid=networkid)
+        else:
+            public_ip = PublicIPAddress.create(
+                apiclient=apiclient,
+                accountid=virtual_machine.account,
+                zoneid=virtual_machine.zoneid,
+                domainid=virtual_machine.domainid,
+                services=services,
+                networkid=networkid,
+            )
+
+            FireWallRule.create(
+                apiclient=apiclient,
+                ipaddressid=public_ip.ipaddress.id,
+                protocol='TCP',
+                cidrlist=['0.0.0.0/0'],
+                startport=22,
+                endport=22
+            )
+            nat_rule = NATRule.create(
+                apiclient=apiclient,
+                virtual_machine=virtual_machine,
+                services=services,
+                ipaddressid=public_ip.ipaddress.id)
+
+        if allow_egress and not vpcid:
             try:
                 EgressFireWallRule.create(
                     apiclient=apiclient,
@@ -485,7 +521,8 @@
                hostid=None, keypair=None, ipaddress=None, mode='default',
                method='GET', hypervisor=None, customcpunumber=None,
                customcpuspeed=None, custommemory=None, rootdisksize=None,
-               rootdiskcontroller=None, macaddress=None, datadisktemplate_diskoffering_list={}):
+               rootdiskcontroller=None, vpcid=None, macaddress=None, datadisktemplate_diskoffering_list={},
+               properties=None, nicnetworklist=None):
         """Create the instance"""
 
         cmd = deployVirtualMachine.deployVirtualMachineCmd()
@@ -614,6 +651,12 @@
         elif macaddress in services:
             cmd.macaddress = services["macaddress"]
 
+        if properties:
+            cmd.properties = properties
+
+        if nicnetworklist:
+            cmd.nicnetworklist = nicnetworklist
+
         virtual_machine = apiclient.deployVirtualMachine(cmd, method=method)
 
         if 'password' in virtual_machine.__dict__.keys():
@@ -637,7 +680,8 @@
                         services,
                         virtual_machine,
                         allow_egress=allow_egress,
-                        networkid=cmd.networkids[0] if cmd.networkids else None)
+                        networkid=cmd.networkids[0] if cmd.networkids else None,
+                        vpcid=vpcid)
                 elif mode.lower() == 'basic':
                     if virtual_machine.publicip is not None:
                         # EIP/ELB (netscaler) enabled zone
@@ -966,6 +1010,20 @@
             cmd.details[0]["memory"] = custommemory
         return apiclient.scaleVirtualMachine(cmd)
 
+    def unmanage(self, apiclient):
+        """Unmanage a VM from CloudStack (currently VMware only)"""
+        cmd = unmanageVirtualMachine.unmanageVirtualMachineCmd()
+        cmd.id = self.id
+        return apiclient.unmanageVirtualMachine(cmd)
+
+    @classmethod
+    def listUnmanagedInstances(cls, apiclient, clusterid, name = None):
+        """List unmanaged VMs (currently VMware only)"""
+        cmd = listUnmanagedInstances.listUnmanagedInstancesCmd()
+        cmd.clusterid = clusterid
+        cmd.name = name
+        return apiclient.listUnmanagedInstances(cmd)
+
 
 class Volume:
     """Manage Volume Life cycle
@@ -1011,7 +1069,7 @@
 
     @classmethod
     def create_custom_disk(cls, apiclient, services, account=None,
-                           domainid=None, diskofferingid=None):
+                           domainid=None, diskofferingid=None, projectid=None):
         """Create Volume from Custom disk offering"""
         cmd = createVolume.createVolumeCmd()
         cmd.name = services["diskname"]
@@ -1034,19 +1092,22 @@
 
         if account:
             cmd.account = account
-        else:
+        elif "account" in services:
             cmd.account = services["account"]
 
         if domainid:
             cmd.domainid = domainid
-        else:
+        elif "domainid" in services:
             cmd.domainid = services["domainid"]
 
+        if projectid:
+            cmd.projectid = projectid
+
         return Volume(apiclient.createVolume(cmd).__dict__)
 
     @classmethod
     def create_from_snapshot(cls, apiclient, snapshot_id, services,
-                             account=None, domainid=None):
+                             account=None, domainid=None, projectid=None):
         """Create Volume from snapshot"""
         cmd = createVolume.createVolumeCmd()
         cmd.name = "-".join([services["diskname"], random_gen()])
@@ -1060,12 +1121,16 @@
             cmd.ispublic = False
         if account:
             cmd.account = account
-        else:
+        elif "account" in services:
             cmd.account = services["account"]
         if domainid:
             cmd.domainid = domainid
-        else:
+        elif "domainid" in services:
             cmd.domainid = services["domainid"]
+
+        if projectid:
+            cmd.projectid = projectid
+
         return Volume(apiclient.createVolume(cmd).__dict__)
 
     @classmethod
@@ -1332,22 +1397,24 @@
         elif "hypervisor" in services:
             cmd.hypervisor = services["hypervisor"]
 
-        if "ostypeid" in services:
-            cmd.ostypeid = services["ostypeid"]
-        elif "ostype" in services:
-            # Find OSTypeId from Os type
-            sub_cmd = listOsTypes.listOsTypesCmd()
-            sub_cmd.description = services["ostype"]
-            ostypes = apiclient.listOsTypes(sub_cmd)
+        if cmd.hypervisor.lower() not in ["vmware"]:
+            # Since version 4.15 VMware templates honour the guest OS defined in the template
+            if "ostypeid" in services:
+                cmd.ostypeid = services["ostypeid"]
+            elif "ostype" in services:
+                # Find OSTypeId from Os type
+                sub_cmd = listOsTypes.listOsTypesCmd()
+                sub_cmd.description = services["ostype"]
+                ostypes = apiclient.listOsTypes(sub_cmd)
 
-            if not isinstance(ostypes, list):
+                if not isinstance(ostypes, list):
+                    raise Exception(
+                        "Unable to find Ostype id with desc: %s" %
+                        services["ostype"])
+                cmd.ostypeid = ostypes[0].id
+            else:
                 raise Exception(
-                    "Unable to find Ostype id with desc: %s" %
-                    services["ostype"])
-            cmd.ostypeid = ostypes[0].id
-        else:
-            raise Exception(
-                "Unable to find Ostype is required for registering template")
+                    "Unable to find Ostype is required for registering template")
 
         cmd.url = services["url"]
 
@@ -1414,8 +1481,8 @@
         return Template(apiclient.createTemplate(cmd).__dict__)
 
     @classmethod
-    def create_from_snapshot(cls, apiclient, snapshot, services,
-                             random_name=True):
+    def create_from_snapshot(cls, apiclient, snapshot, services, account=None,
+                             domainid=None, projectid=None, random_name=True):
         """Create Template from snapshot"""
         # Create template from Snapshot ID
         cmd = createTemplate.createTemplateCmd()
@@ -1454,6 +1521,17 @@
             raise Exception(
                 "Unable to find Ostype is required for creating template")
 
+        cmd.snapshotid = snapshot.id
+
+        if account:
+            cmd.account = account
+        if domainid:
+            cmd.domainid = domainid
+        if projectid:
+            cmd.projectid = projectid
+
+        return Template(apiclient.createTemplate(cmd).__dict__)
+
     def delete(self, apiclient, zoneid=None):
         """Delete Template"""
 
@@ -3890,7 +3968,7 @@
 
     @classmethod
     def create(cls, apiclient, services, name, gateway, cidrlist,
-               account=None, domainid=None):
+               account=None, domainid=None, projectid=None):
         """Create VPN Customer Gateway"""
         cmd = createVpnCustomerGateway.createVpnCustomerGatewayCmd()
         cmd.name = name
@@ -3914,6 +3992,9 @@
             cmd.account = account
         if domainid:
             cmd.domainid = domainid
+        if projectid:
+            cmd.projectid = projectid
+
         return VpnCustomerGateway(
             apiclient.createVpnCustomerGateway(cmd).__dict__)
 
@@ -3966,7 +4047,7 @@
         self.__dict__.update(items)
 
     @classmethod
-    def create(cls, apiclient, services, account=None, domainid=None):
+    def create(cls, apiclient, services, account=None, domainid=None, userid=None, accountid=None):
         """Create project"""
 
         cmd = createProject.createProjectCmd()
@@ -3976,7 +4057,10 @@
             cmd.account = account
         if domainid:
             cmd.domainid = domainid
-
+        if userid:
+            cmd.userid = userid
+        if accountid:
+            cmd.accountid = accountid
         return Project(apiclient.createProject(cmd).__dict__)
 
     def delete(self, apiclient):
@@ -4008,7 +4092,7 @@
         cmd.id = self.id
         return apiclient.suspendProject(cmd)
 
-    def addAccount(self, apiclient, account=None, email=None):
+    def addAccount(self, apiclient, account=None, email=None, projectroleid=None, roletype=None):
         """Add account to project"""
 
         cmd = addAccountToProject.addAccountToProjectCmd()
@@ -4017,6 +4101,10 @@
             cmd.account = account
         if email:
             cmd.email = email
+        if projectroleid:
+            cmd.projectroleid = projectroleid
+        if roletype:
+            cmd.roletype = roletype
         return apiclient.addAccountToProject(cmd)
 
     def deleteAccount(self, apiclient, account):
@@ -4027,6 +4115,29 @@
         cmd.account = account
         return apiclient.deleteAccountFromProject(cmd)
 
+    def addUser(self, apiclient, username=None, email=None, projectroleid=None, roletype=None):
+        """Add user to project"""
+
+        cmd = addUserToProject.addUserToProjectCmd()
+        cmd.projectid = self.id
+        if username:
+            cmd.username = username
+        if email:
+            cmd.email = email
+        if projectroleid:
+            cmd.projectroleid = projectroleid
+        if roletype:
+            cmd.roletype = roletype
+        return apiclient.addUserToProject(cmd)
+
+    def deleteUser(self, apiclient, userid):
+        """Delete user from project"""
+
+        cmd = deleteAccountFromProject.deleteAccountFromProjectCmd()
+        cmd.projectid = self.id
+        cmd.userid = userid
+        return apiclient.deleteUserFromProject(cmd)
+
     @classmethod
     def listAccounts(cls, apiclient, **kwargs):
         """Lists all accounts associated with projects."""
@@ -4055,7 +4166,7 @@
         self.__dict__.update(items)
 
     @classmethod
-    def update(cls, apiclient, projectid, accept, account=None, token=None):
+    def update(cls, apiclient, projectid, accept, account=None, token=None, userid=None):
         """Updates the project invitation for that account"""
 
         cmd = updateProjectInvitation.updateProjectInvitationCmd()
@@ -4063,6 +4174,8 @@
         cmd.accept = accept
         if account:
             cmd.account = account
+        if userid:
+            cmd.userid = userid
         if token:
             cmd.token = token
 
@@ -5390,3 +5503,90 @@
         cmd = restoreBackup.restoreBackupCmd()
         cmd.id = self.id
         return (apiclient.restoreBackup(cmd))
+
+class ProjectRole:
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+    @classmethod
+    def create(cls, apiclient, services, projectid):
+        """Create project role"""
+        cmd = createProjectRole.createProjectRoleCmd()
+        cmd.projectid = projectid
+        cmd.name = services["name"]
+        if "description" in services:
+            cmd.description = services["description"]
+
+        return ProjectRole(apiclient.createProjectRole(cmd).__dict__)
+
+    def delete(self, apiclient, projectid):
+        """Delete project Role"""
+
+        cmd = deleteProjectRole.deleteProjectRoleCmd()
+        cmd.projectid = projectid
+        cmd.id = self.id
+        apiclient.deleteProjectRole(cmd)
+
+    def update(self, apiclient, projectid, **kwargs):
+        """Update the project role"""
+
+        cmd = updateProjectRole.updateProjectRoleCmd()
+        cmd.projectid = projectid
+        cmd.id = self.id
+        [setattr(cmd, k, v) for k, v in kwargs.items()]
+        return apiclient.updateProjectRole(cmd)
+
+    @classmethod
+    def list(cls, apiclient, projectid, **kwargs):
+        """List all project Roles matching criteria"""
+
+        cmd = listProjectRoles.listProjectRolesCmd()
+        cmd.projectid = projectid
+        [setattr(cmd, k, v) for k, v in kwargs.items()]
+        return (apiclient.listProjectRoles(cmd))
+
+class ProjectRolePermission:
+    """Manage Project Role Permission"""
+
+    def __init__(self, items):
+        self.__dict__.update(items)
+
+    @classmethod
+    def create(cls, apiclient, services, projectid):
+        """Create role permission"""
+        cmd = createProjectRolePermission.createProjectRolePermissionCmd()
+        cmd.projectid = projectid
+        cmd.projectroleid = services["projectroleid"]
+        cmd.rule = services["rule"]
+        cmd.permission = services["permission"]
+        if "description" in services:
+            cmd.description = services["description"]
+
+        return ProjectRolePermission(apiclient.createProjectRolePermission(cmd).__dict__)
+
+    def delete(self, apiclient, projectid):
+        """Delete role permission"""
+
+        cmd = deleteProjectRolePermission.deleteProjectRolePermissionCmd()
+        cmd.projectid = projectid
+        cmd.id = self.id
+        apiclient.deleteProjectRolePermission(cmd)
+
+    def update(self, apiclient, projectid, **kwargs):
+        """Update the role permission"""
+
+        cmd = updateProjectRolePermission.updateProjectRolePermissionCmd()
+        cmd.projectid = projectid
+        cmd.projectroleid = self.projectroleid
+        [setattr(cmd, k, v) for k, v in kwargs.items()]
+        return apiclient.updateProjectRolePermission(cmd)
+
+    @classmethod
+    def list(cls, apiclient, projectid, **kwargs):
+        """List all role permissions matching criteria"""
+
+        cmd = listProjectRolePermissions.listProjectRolePermissionsCmd()
+        cmd.projectid = projectid
+        [setattr(cmd, k, v) for k, v in kwargs.items()]
+        return (apiclient.listProjectRolePermissions(cmd))
diff --git a/tools/marvin/marvin/lib/common.py b/tools/marvin/marvin/lib/common.py
index ae05414..fb69f80 100644
--- a/tools/marvin/marvin/lib/common.py
+++ b/tools/marvin/marvin/lib/common.py
@@ -395,6 +395,74 @@
     return FAILED
 
 
+def get_test_ovf_templates(apiclient, zone_id=None, test_ovf_templates=None, hypervisor=None):
+    """
+    @Name : get_test_ovf_templates
+    @Desc : Retrieves the list of test ovf templates used to running tests. When the template
+            is missing it will be download at most one in a zone for a hypervisor.
+    @Input : returns a list of templates
+    """
+    result = []
+
+    if test_ovf_templates is None:
+        test_ovf_templates = test_data["test_ovf_templates"]
+    if test_ovf_templates is None:
+        return result
+    if hypervisor is None:
+        return result
+    hypervisor = hypervisor.lower()
+    if hypervisor != 'vmware':
+        return result
+
+    for test_template in test_ovf_templates:
+
+        cmd = listTemplates.listTemplatesCmd()
+        cmd.name = test_template['name']
+        cmd.templatefilter = 'all'
+        if zone_id is not None:
+            cmd.zoneid = zone_id
+        if hypervisor is not None:
+            cmd.hypervisor = hypervisor
+        templates = apiclient.listTemplates(cmd)
+
+        if validateList(templates)[0] != PASS:
+            template = Template.register(apiclient, test_template, zoneid=zone_id, hypervisor=hypervisor.lower(), randomize_name=False)
+            template.download(apiclient)
+            retries = 3
+            while (template.details == None or len(template.details.__dict__) == 0) and retries > 0:
+                time.sleep(10)
+                template_list = Template.list(apiclient, id=template.id, zoneid=zone_id, templatefilter='all')
+                if isinstance(template_list, list):
+                    template = Template(template_list[0].__dict__)
+                retries = retries - 1
+            if template.details == None or len(template.details.__dict__) == 0:
+                template.delete(apiclient)
+            else:
+                result.append(template)
+
+        if templates:
+            for template in templates:
+                if template.isready and template.ispublic and template.details != None and len(template.details.__dict__) > 0:
+                    result.append(template.__dict__)
+
+    return result
+
+def get_vm_vapp_configs(apiclient, config, setup_zone, vm_name):
+    zoneDetailsInConfig = [zone for zone in config.zones
+                           if zone.name == setup_zone.name][0]
+    vcenterusername = zoneDetailsInConfig.vmwaredc.username
+    vcenterpassword = zoneDetailsInConfig.vmwaredc.password
+    vcenterip = zoneDetailsInConfig.vmwaredc.vcenter
+    vcenterObj = Vcenter(
+        vcenterip,
+        vcenterusername,
+        vcenterpassword)
+
+    vms = vcenterObj.get_vms(vm_name)
+    if vms:
+        return vms[0]['vm']['properties']
+
+
 def get_windows_template(
         apiclient, zone_id=None, ostype_desc=None, template_filter="featured", template_type='USER',
         template_id=None, template_name=None, account=None, domain_id=None, project_id=None,
@@ -445,7 +513,29 @@
 
     return FAILED
 
-
+def get_suitable_test_template(apiclient, zoneid, ostypeid, hypervisor):
+    '''
+    @Name : get_suitable_test_template
+    @Desc : Retrieves the test template information based upon inputs provided
+            For Xenserver, get_test_template is used for retrieving the template
+            while get_template is used for other hypervisors or when
+            get_test_template fails
+    @Input : returns a template"
+    @Output : FAILED in case of any failure
+              template Information matching the inputs
+    '''
+    template = FAILED
+    if hypervisor.lower() in ["xenserver"]:
+        template = get_test_template(
+            apiclient,
+            zoneid,
+            hypervisor)
+    if template == FAILED:
+        template = get_template(
+            apiclient,
+            zoneid,
+            ostypeid)
+    return template
 
 def download_systemplates_sec_storage(server, services):
     """Download System templates on sec storage"""
diff --git a/tools/marvin/marvin/lib/vcenter.py b/tools/marvin/marvin/lib/vcenter.py
index d14f364..78ca50e 100644
--- a/tools/marvin/marvin/lib/vcenter.py
+++ b/tools/marvin/marvin/lib/vcenter.py
@@ -114,6 +114,12 @@
             for network in obj.network:
                 vm_details['networks'].append({'name': network.name})
         vm_details['raw'] = obj
+        vm_details['properties'] = {}
+        config = obj.config
+        if config and config.vAppConfig:
+            for prop in config.vAppConfig.property:
+                vm_details['properties'][prop.id] = prop.value
+
         return vm_details
 
     def parse_details(self, obj, vimtype):
diff --git a/tools/marvin/pom.xml b/tools/marvin/pom.xml
index 1a26fa0..5fe69f2 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
diff --git a/tools/marvin/setup.py b/tools/marvin/setup.py
index 70450d9..67f632c 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.14.2.0-SNAPSHOT"
+VERSION = "4.15.1.0-SNAPSHOT"
 
 setup(name="Marvin",
       version=VERSION,
diff --git a/tools/pom.xml b/tools/pom.xml
index 6f4d1d8..3fec137 100644
--- a/tools/pom.xml
+++ b/tools/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <build>
diff --git a/tools/travis/before_install.sh b/tools/travis/before_install.sh
index 86a10a7..f2ecd97 100755
--- a/tools/travis/before_install.sh
+++ b/tools/travis/before_install.sh
@@ -86,6 +86,12 @@
 echo -e "\nIPMI version"
 ipmitool -V
 
+curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
+sudo apt-get install -y nodejs
+
+echo -e "\nNode version"
+npm version
+
 echo "<settings>
   <mirrors>
     <mirror>
diff --git a/tools/travis/install.sh b/tools/travis/install.sh
index 9ddd36c..c8c1b83 100755
--- a/tools/travis/install.sh
+++ b/tools/travis/install.sh
@@ -37,6 +37,9 @@
 mvn -v
 
 if [ $TEST_SEQUENCE_NUMBER -eq 1 ]; then
+   # npm lint, test and build
+   cd ui && npm install && npm run lint && npm run test:unit && npm run build
+   cd $DIR
    # Pylint/pep8 systemvm python codebase
    cd systemvm/test && bash -x runtests.sh
    # Build noredist
diff --git a/ui/.babelrc b/ui/.babelrc
new file mode 100644
index 0000000..39fd999
--- /dev/null
+++ b/ui/.babelrc
@@ -0,0 +1,7 @@
+{
+  "env": {
+    "test": {
+      "plugins": ["require-context-hook"]
+    }
+  }
+}
\ No newline at end of file
diff --git a/ui/.editorconfig b/ui/.editorconfig
new file mode 100644
index 0000000..f882d38
--- /dev/null
+++ b/ui/.editorconfig
@@ -0,0 +1,38 @@
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=false
+indent_style=space
+indent_size=2
+
+[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
+indent_style=space
+indent_size=2
+
+[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
+indent_style=space
+indent_size=2
+
+[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
+indent_style=space
+indent_size=2
+
+[*.svg]
+indent_style=space
+indent_size=2
+
+[*.js.map]
+indent_style=space
+indent_size=2
+
+[*.less]
+indent_style=space
+indent_size=2
+
+[*.vue]
+indent_style=space
+indent_size=2
+
+[{.analysis_options,*.yml,*.yaml}]
+indent_style=space
+indent_size=2
diff --git a/ui/.env.local.example b/ui/.env.local.example
new file mode 100644
index 0000000..0cd7d31
--- /dev/null
+++ b/ui/.env.local.example
@@ -0,0 +1 @@
+CS_URL=http://localhost:8080
diff --git a/ui/.env.local.https.example b/ui/.env.local.https.example
new file mode 100644
index 0000000..f0ab16d
--- /dev/null
+++ b/ui/.env.local.https.example
@@ -0,0 +1,7 @@
+CS_URL=http://localhost:8080
+PUBLIC_HOST=primate.example.com
+HTTPS_CERT=/etc/ssl/certs/primate.example.com.pem
+HTTPS_KEY=/etc/ssl/private/primate.example.com.key
+HTTPS_CA=/etc/ssl/certs/ca.pem
+HTTPS_DHPARAM=/etc/ssl/keys/dh2048.pem
+ALLOWED_HOSTS=["primate.example.com","cloud.example.com"]
diff --git a/ui/.env.primate-qa b/ui/.env.primate-qa
new file mode 100644
index 0000000..3db8e24
--- /dev/null
+++ b/ui/.env.primate-qa
@@ -0,0 +1 @@
+CS_URL=http://primate-qa.cloudstack.cloud:8080
diff --git a/ui/.gitattributes b/ui/.gitattributes
new file mode 100644
index 0000000..e507319
--- /dev/null
+++ b/ui/.gitattributes
@@ -0,0 +1 @@
+public/* linguist-vendored
\ No newline at end of file
diff --git a/ui/.gitignore b/ui/.gitignore
new file mode 100644
index 0000000..ec269fc
--- /dev/null
+++ b/ui/.gitignore
@@ -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.
+
+.DS_Store
+node_modules
+coverage
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*
diff --git a/ui/.prettierrc b/ui/.prettierrc
new file mode 100644
index 0000000..cbe842a
--- /dev/null
+++ b/ui/.prettierrc
@@ -0,0 +1,5 @@
+{
+  "printWidth": 120,
+  "semi": false,
+  "singleQuote": true
+}
diff --git a/ui/CONTRIBUTING.md b/ui/CONTRIBUTING.md
new file mode 100644
index 0000000..1eee366
--- /dev/null
+++ b/ui/CONTRIBUTING.md
@@ -0,0 +1,125 @@
+# Contributing to CloudStack UI
+
+## Summary
+
+This document covers how to contribute to the UI project. It uses Github PRs to manage code contributions.
+These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one.
+Your proposed code changes will be published to your own fork of the project and you will submit a Pull Request for your changes to be added.
+
+Please refer to project [docs](docs) for reference on standard way of component
+configuration, development, usage, extension and testing.
+
+*Lets get started!!!*
+
+### Bug fixes
+
+It's very important that we can easily track bug fix commits, so their hashes should remain the same in all branches.
+Therefore, a pull request (PR) that fixes a bug, should be sent against a release branch.
+This can be either the "current release" or the "previous release", depending on which ones are maintained.
+Since the goal is a stable master, bug fixes should be "merged forward" to the next branch in order: "previous release" -> "current release" -> master (in other words: old to new)
+
+### New features
+
+Development should be done in a feature branch, branched off of master.
+Send a PR (steps below) to get it into master (at least 2x LGTM applies).
+PR will only be merged when master is open, will be held otherwise until master is open again.
+No back porting / cherry-picking features to existing branches!
+
+## Forking
+
+In your browser, navigate to: [https://github.com/apache/cloudstack](https://github.com/apache/cloudstack)
+
+Fork the repository by clicking on the 'Fork' button on the top right hand side.
+The fork will happen and you will be taken to your own fork of the repository.
+Copy the Git repository URL by clicking on the clipboard next to the URL on the right hand side of the page under '**HTTPS** clone URL'.  You will paste this URL when doing the following `git clone` command.
+
+On your workstation, follow these steps to setup a local repository for working on UI:
+
+``` bash
+$ git clone https://github.com/YOUR_ACCOUNT/cloudstack.git
+$ cd cloudstack/ui
+$ git remote add upstream https://github.com/apache/cloudstack.git
+$ git checkout master
+$ git fetch upstream
+$ git rebase upstream/master
+```
+
+## Making changes
+
+
+It is important that you create a new branch to make changes on and that you do not change the `master` branch (other than to rebase in changes from `upstream/master`). In this example I will assume you will be making your changes to a branch called `feature_x`.
+This `feature_x` branch will be created on your local repository and will be pushed to your forked repository on GitHub. Once this branch is on your fork you will create a Pull Request for the changes to be added to the UI project.
+
+It is best practice to create a new branch each time you want to contribute to the project and only track the changes for that pull request in this branch.
+
+``` bash
+$ git checkout -b feature_x
+   (make your changes)
+$ git status
+$ git add .
+$ git commit -a -m "descriptive commit message for your changes"
+```
+
+> The `-b` specifies that you want to create a new branch called `feature_x`.  You only specify `-b` the first time you checkout because you are creating a new branch.  Once the `feature_x` branch exists, you can later switch to it with only `git checkout feature_x`.
+
+
+### Updating your branch
+
+It is important that you maintain an up-to-date `master` branch in your local repository. You may do this by either rebasing against the upstream repository or merging the upstream branch.
+For example:
+
+1. Checkout your local `master` branch
+2. Synchronize your local `master` branch with the `upstream/master` so you have all the latest changes from the project
+3. Merge or Rebase the latest project code into your `feature_x` branch so it is up-to-date with the upstream code
+
+``` bash
+$ git checkout master
+$ git fetch upstream
+$ git rebase upstream/master
+$ git checkout feature_x
+$ git merge master
+```
+
+> Now your `feature_x` branch is up-to-date with all the code in `upstream/master`.
+
+
+## Sending a Pull Request
+
+When you are happy with your changes and you are ready to contribute them, you will create a Pull Request on GitHub to do so.
+This is done by pushing your local changes to your forked repository (default remote name is `origin`) and then initiating a pull request on GitHub.
+
+Please include relevant issue ids, links, detailed information about the bug/feature, what all tests are executed, how the reviewer can test this feature etc. A screenshot is preferred.
+
+> **IMPORTANT:** Make sure you have rebased your `feature_x` branch to include the latest code from `upstream/master` _before_ you do this.
+
+``` bash
+$ git push origin master
+$ git push origin feature_x
+```
+
+Now that the `feature_x` branch has been pushed to your GitHub repository, you can initiate the pull request.
+
+To initiate the pull request, do the following:
+
+1. In your browser, navigate to your forked repository: [https://github.com/YOUR_ACCOUNT/cloudstack](https://github.com/YOUR_ACCOUNT/cloudstack)
+2. Click the new button called '**Compare & pull request**' that showed up just above the main area in your forked repository
+3. Validate the pull request will be into the upstream `master` and will be from your `feature_x` branch
+4. Enter a detailed description of the work you have done and then click '**Send pull request**'
+
+If you are requested to make modifications to your proposed changes, make the changes locally on your `feature_x` branch, re-push the `feature_x` branch to your fork.  The existing pull request should automatically pick up the change and update accordingly.
+
+
+Cleaning up after a successful pull request
+-------------------------------------------
+
+Once the `feature_x` branch has been committed into the `upstream/master` branch, your local `feature_x` branch and the `origin/feature_x` branch are no longer needed.  If you want to make additional changes, restart the process with a new branch.
+
+> **IMPORTANT:** Make sure that your changes are in `upstream/master` before you delete your `feature_x` and `origin/feature_x` branches!
+
+You can delete these deprecated branches with the following:
+
+``` bash
+$ git checkout master
+$ git branch -D feature_x
+$ git push origin :feature_x
+``
diff --git a/ui/Dockerfile b/ui/Dockerfile
new file mode 100644
index 0000000..ac91fdb
--- /dev/null
+++ b/ui/Dockerfile
@@ -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.
+
+# Build example: docker build -t <name> .
+
+FROM node:lts-stretch AS build
+
+MAINTAINER "Apache CloudStack" <dev@cloudstack.apache.org>
+LABEL Description="Apache CloudStack UI; Modern role-base progressive UI for Apache CloudStack"
+LABEL Vendor="Apache.org"
+LABEL License=ApacheV2
+LABEL Version=0.5.0
+
+WORKDIR /build
+
+RUN apt-get -y update && apt-get -y upgrade
+
+COPY . /build/
+RUN npm install
+RUN npm run build
+
+FROM nginx:alpine AS runtime
+
+LABEL org.opencontainers.image.title="Apache CloudStack UI" \
+	org.opencontainers.image.description="A modern role-based progressive CloudStack UI" \
+	org.opencontainers.image.authors="Apache CloudStack Contributors" \
+	org.opencontainers.image.url="https://github.com/apache/cloudstack" \
+	org.opencontainers.image.documentation="https://github.com/apache/cloudstack/blob/master/ui/README.md" \
+	org.opencontainers.image.source="https://github.com/apache/cloudstack" \
+	org.opencontainers.image.vendor="The Apache Software Foundation" \
+	org.opencontainers.image.licenses="Apache-2.0" \
+	org.opencontainers.image.ref.name="latest"
+
+COPY --from=build /build/dist/. /usr/share/nginx/html/
diff --git a/ui/LICENSE b/ui/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/ui/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/ui/README.md b/ui/README.md
new file mode 100644
index 0000000..b72eedb
--- /dev/null
+++ b/ui/README.md
@@ -0,0 +1,186 @@
+# CloudStack UI
+
+A modern role-based progressive CloudStack UI based on VueJS and Ant Design.
+
+![Screenshot](docs/screenshot-dashboard.png)
+
+## Getting Started
+
+Install node: (Debian/Ubuntu)
+
+    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
+    sudo apt-get install -y nodejs
+    # Or use distro provided: sudo apt-get install npm nodejs
+
+Install node: (CentOS/Fedora/RHEL)
+
+    curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
+    sudo yum install nodejs
+
+Optionally, you may also install system-wide dev tools:
+
+    sudo npm install -g @vue/cli npm-check-updates
+
+## Development
+
+Clone the repository:
+
+    git clone https://github.com/apache/cloudstack.git
+    cd cloudstack/ui
+    npm install
+
+Override the default `CS_URL` to a running CloudStack management server:
+
+    cp .env.local.example .env.local
+    Change the `CS_URL` in the `.env.local` file
+
+To configure https, you may use `.env.local.https.example`.
+
+Build and run:
+
+    npm run serve
+    # Or run: npm start
+
+Upgrade dependencies to the latest versions:
+
+    ncu -u
+
+Run Tests:
+
+    npm run test
+    npm run lint
+    npm run test:unit
+
+Fix issues and vulnerabilities:
+
+    npm audit
+
+A basic development guide and explaination of the basic components can be found
+  [here](docs/development.md)
+
+## Production
+
+Fetch dependencies and build:
+
+    npm install
+    npm run build
+
+This creates a static webpack application in `dist/`, which can then be served
+from any web server or CloudStack management server (jetty).
+
+To use CloudStack management server (jetty), you may copy the built UI to the
+webapp directory on the management server host. For example:
+
+    npm install
+    npm run build
+    cd dist
+    mkdir -p /usr/share/cloudstack-management/webapp/
+    cp -vr . /usr/share/cloudstack-management/webapp/
+    # Access UI at {management-server}:8080/client in browser
+
+If the webapp directory is changed, please change the `webapp.dir` in the
+`/etc/cloudstack/management/server.properties` and restart the management server host.
+
+To use a separate webserver, note that the API server is accessed through the path
+`/client`, which needs be forwarded to an actual CloudStack instance.
+
+For example, a simple way to serve UI with nginx can be implemented with the
+following nginx configuration (to be put into /etc/nginx/conf.d/default.conf or similar):
+
+```nginx
+server {
+    listen       80;
+    server_name  localhost;
+    location / {
+        # /src/ui/dist contains the built UI webpack
+        root   /src/ui/dist;
+        index  index.html;
+    }
+    location /client/ {
+        # http://127.0.0.1:800 should be replaced your CloudStack management
+        # server's actual URI
+        proxy_pass   http://127.0.0.1:8000;
+    }
+}
+```
+
+### Docker
+
+A production-ready Docker container can also be built with the provided
+Dockerfile and build script.
+
+Make sure Docker is installed, then run:
+
+    bash docker.sh
+
+Change the example configuration in `nginx/default.conf` according to your needs.
+
+Run UI:
+
+    docker run -ti --rm -p 8080:80 -v $(pwd)/nginx:/etc/nginx/conf.d:ro cloudstack-ui:latest
+
+### Packaging
+
+The following is tested to work on any Ubuntu 18.04/20.04 base installation or
+docker container:
+
+    # Install nodejs (lts)
+    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
+    sudo apt-get install -y nodejs debhelper rpm
+    # Install build tools
+    npm install -g @vue/cli webpack eslint
+    # Clone this repository and run package.sh
+    cd <cloned-repository>/packaging
+    bash -x package.sh
+
+## Documentation
+
+- VueJS Guide: https://vuejs.org/v2/guide/
+- Vue Ant Design: https://www.antdv.com/docs/vue/introduce/
+- UI Developer [Docs](docs)
+- JavaScript ES6 Reference: https://www.tutorialspoint.com/es6/
+- Introduction to ES6: https://scrimba.com/g/gintrotoes6
+
+## Attributions
+
+The UI uses the following:
+
+- [VueJS](https://vuejs.org/)
+- [Ant Design Spec](https://ant.design/docs/spec/introduce)
+- [Ant Design Vue](https://vue.ant.design/)
+- [Ant Design Pro Vue](https://github.com/sendya/ant-design-pro-vue)
+- [Fontawesome](https://github.com/FortAwesome/vue-fontawesome)
+- [ViserJS](https://viserjs.github.io/docs.html#/viser/guide/installation)
+- [Icons](https://www.iconfinder.com/iconsets/cat-force) by [Iconka](https://iconka.com/en/downloads/cat-power/)
+
+## History
+
+The modern UI, originally called Primate, was created by [Rohit
+Yadav](https://rohityadav.cloud) over several weekends during late 2018 and
+early 2019. During ApacheCon CCCUS19, on 9th September 2019, Primate was
+introduced and demoed as part of the talk [Modern UI
+for CloudStack](https://rohityadav.cloud/files/talks/cccna19-primate.pdf)
+([video](https://www.youtube.com/watch?v=F2KwZhechzs)).
+[Primate](https://markmail.org/message/vxnskmwhfaagnm4r) was accepted by the
+Apache CloudStack project on 21 Oct 2019. The original repo was [merged with the
+main apache/cloudstack](https://markmail.org/message/bgnn4xkjnlzseeuv) repo on
+20 Jan 2021.
+
+## License
+
+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/babel.config.js b/ui/babel.config.js
new file mode 100644
index 0000000..68a21db
--- /dev/null
+++ b/ui/babel.config.js
@@ -0,0 +1,38 @@
+// 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.
+
+const babelConfig = {
+  presets: [
+    '@vue/app'
+  ],
+  plugins: []
+  // if your use import on Demand, Use this code
+  // ,
+  // plugins: [
+  //   [ 'import', {
+  //     'libraryName': 'ant-design-vue',
+  //     'libraryDirectory': 'es',
+  //     'style': true
+  //   } ]
+  // ]
+}
+
+if (process.env.NODE_ENV === 'test') {
+  babelConfig.plugins.push('require-context-hook')
+}
+
+module.exports = babelConfig
diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
deleted file mode 100644
index a2da335..0000000
--- a/ui/css/cloudstack3.css
+++ /dev/null
@@ -1,13400 +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;
-}
-
-.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/docker.sh b/ui/docker.sh
new file mode 100755
index 0000000..2af7570
--- /dev/null
+++ b/ui/docker.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# 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.
+
+set -e
+set -x
+
+cd $(dirname $0)
+
+GIT_TAG="$(git tag --points-at | head -n 1)"
+if [ -n "${GIT_REV}" ]; then
+	LABEL_GIT_TAG="--label \"org.opencontainers.image.version=${GIT_TAG}\""
+fi
+DATE="$(date --iso-8601=seconds)"
+LABEL_DATE="--label \"org.opencontainers.image.created=${DATE}\""
+GIT_REV="$(git rev-parse HEAD)"
+LABEL_GIT_REV="--label \"org.opencontainers.image.revision=${GIT_REV}\""
+
+docker build -t cloudstack-ui ${LABEL_DATE} ${LABEL_GIT_REV} ${LABEL_GIT_TAG} .
diff --git a/ui/docs/customize.md b/ui/docs/customize.md
new file mode 100644
index 0000000..835ab4e
--- /dev/null
+++ b/ui/docs/customize.md
@@ -0,0 +1,85 @@
+# UI customization
+Use a `public/config.json` (or `dist/config.json` after build) file for customizing theme, logos,...
+
+## Images
+Change the image of the logo, login banner, error page, etc.
+```json
+{
+  "logo": "assets/logo.svg",
+  "banner": "assets/banner.svg",
+  "error": {
+    "404": "assets/404.png",
+    "403": "assets/403.png",
+    "500": "assets/500.png"
+  }
+}
+```
+
+- `logo` changes the logo top-left side image.
+- `banner` changes the login banner image.
+- `error.404` change the image of error Page not found.
+- `error.403` change the image of error Forbidden.
+- `error.500` change the image of error Internal Server Error.
+
+## Theme
+Customize themes like colors, border color, etc.
+```json
+{
+  "theme": {
+    "@primary-color": "#1890ff",
+    "@success-color": "#52c41a",
+    "@processing-color": "#1890ff",
+    "@warning-color": "#faad14",
+    "@error-color": "#f5222d",
+    "@font-size-base": "14px",
+    "@heading-color": "rgba(0, 0, 0, 0.85)",
+    "@text-color": "rgba(0, 0, 0, 0.65)",
+    "@text-color-secondary": "rgba(0, 0, 0, 0.45)",
+    "@disabled-color": "rgba(0, 0, 0, 0.25)",
+    "@border-color-base": "#d9d9d9",
+    "@logo-width": "256px",
+    "@logo-height": "64px",
+    "@banner-width": "700px",
+    "@banner-height": "110px",
+    "@error-width": "256px",
+    "@error-height": "256px"
+  }
+}
+```
+
+- `@logo-background-color` changes the logo background color.
+- `@project-nav-background-color` changes the navigation menu background color of the project .
+- `@project-nav-text-color` changes the navigation menu background color of the project view.
+- `@navigation-background-color` changes the navigation menu background color.
+- `@navigation-text-color` changes the navigation text color.
+- `@primary-color` change the major background color of the page (background button, icon hover, etc).
+- `@link-color` changes the link color.
+- `@link-hover-color` changes the link hover color.
+- `@loading-color` changes the message loading color and page loading bar at the top page.
+- `@success-color` change success state color.
+- `@processing-color` change processing state color. Exp: progress status.
+- `@warning-color` change warning state color.
+- `@error-color` change error state color.
+- `@heading-color` change table header color.
+- `@text-color` change in major text color.
+- `@text-color-secondary` change of secondary text color (breadcrumb icon).
+- `@disabled-color` change disable state color (disabled button, switch, etc).
+- `@border-color-base` change in major border color.
+- `@logo-width` change the width of the logo top-left side.
+- `@logo-height` change the height of the logo top-left side.
+- `@banner-width` changes the width of the login banner.
+- `@banner-height` changes the height of the login banner.
+- `@error-width` changes the width of the error image.
+- `@error-height` changes the height of the error image.
+
+Assorted primary theme colours:
+
+- Blue: #1890FF
+- Red: #F5222D
+- Yellow: #FAAD14
+- Cyan: #13C2C2
+- Green: #52C41A
+- Purple: #722ED1
+
+Also, to add other properties, we can add new properties into `theme.config.js` based on the Ant Design Vue Less variable.
+Refer: https://www.antdv.com/docs/vue/customize-theme/#Ant-Design-Vue-Less-variables
diff --git a/ui/docs/development.md b/ui/docs/development.md
new file mode 100644
index 0000000..1693307
--- /dev/null
+++ b/ui/docs/development.md
@@ -0,0 +1,232 @@
+# UI Development
+
+The modern CloudStack UI is role-based progressive app that uses VueJS and Ant Design.
+
+Javascript, VueJS references:
+- https://www.w3schools.com/js/
+- https://www.geeksforgeeks.org/javascript-tutorial/
+- https://vuejs.org/v2/guide/
+- https://www.youtube.com/watch?v=Wy9q22isx3U
+
+All the source is in the `src` directory with its entry point at `main.js`.
+The following tree shows the basic UI codebase filesystem:
+
+```bash
+    src
+    ├── assests       # sprites, icons, images
+    ├── components    # Shared vue files used to render various generic / widely used components
+    ├── config        # Contains the layout details of the various routes / sections available in the UI
+    ├── locales       # Custom translation keys for the various supported languages
+    ├── store         # A key-value storage for all the application level state information such as user info, etc
+    ├── utils         # Collection of custom libraries
+    ├── views         # Custom vue files used to render specific components
+    ├── ...
+    └── main.js       # Main entry-point
+```
+
+## Development
+
+Clone the repository:
+
+```
+git clone https://github.com/apache/cloudstack.git
+cd cloudstack/ui
+npm install
+```
+Override the default `CS_URL` to a running CloudStack management server:
+```
+cp .env.local.example .env.local
+```
+Change the `CS_URL` in the `.env.local` file
+To configure https, you may use `.env.local.https.example`.
+Build and run:
+```
+npm run serve
+```
+
+## Implementation
+
+## Defining a new Section
+
+### Section Config Definition
+
+A new section may be added in `src/config/section` and in `src/config/router.js`,
+import the new section's (newconfig.js as example) configuration file and rules to
+`asyncRouterMap` as:
+
+    import newconfig from '@/config/section/newconfig'
+
+    [ ... snipped ... ]
+
+      generateRouterMap(newSection),
+
+
+### Section
+
+An existing or new section's config/js file must export the following parameters:
+
+- `name`: Unique path in URL
+- `title`: The name to be displayed in navigation and breadcrumb
+- `icon`: The icon to be displayed, from AntD's icon set
+  https://vue.ant.design/components/icon/
+- `docHelp`: Allows to provide a link to a document to provide details on the
+  section
+- `searchFilters`: List of parameters by which the resources can be filtered
+  via the list API
+- `children`: (optional) Array of resources sub-navigation under the parent
+  group
+- `permission`: When children are not defined, the array of APIs to check against
+  allowed auto-discovered APIs
+- `columns`: When children is not defined, list of column keys
+- `component`: When children is not defined, the custom component for rendering
+  the route view
+
+
+See `src/config/section/compute.js` and `src/config/section/project.js` for example.
+
+The children should have:
+
+- `name`: Unique path in the URL
+- `title`: The name to be displayed in navigation and breadcrumb
+- `icon`: The icon to be displayed, from AntD's icon set
+  https://vue.ant.design/components/icon/
+- `permission`: The array of APIs to check against auto-discovered APIs
+- `columns`: List of column keys for list view rendering
+- `details`: List of keys for detail list rendering for a resource
+- `tabs`: Array of custom components that will get rendered as tabs in the
+  resource view
+- `component`: The custom component for rendering the route view
+- `related`: A list of associated entitiy types that can be listed via passing
+  the current resource's id as a parameter in their respective list APIs
+- `actions`: Array of actions that can be performed on the resource
+
+## Custom Actions
+
+The actions defined for children show up as group of buttons on the default
+autogen view (that shows tables, actions etc.). Each action item should define:
+
+- `api`: The CloudStack API for the action. The action button will be hidden if
+  the user does not have permission to execute the API
+- `icon`: The icon to be displayed, from AntD's icon set
+  https://vue.ant.design/components/icon/
+- `label`: The action button name label and modal header
+- `message`: The action button confirmation message
+- `docHelp`: Allows to provide a link to a document to provide details on the
+  action
+- `listView`: (boolean) Whether to show the action button in list view (table).
+  Defaults to false
+- `dataView`: (boolean) Whether to show the action button in resource/data view.
+  Defaults to false
+- `args`: List of API arguments to render/show on auto-generated action form.
+  Can be a function which returns a list of arguments
+- `show`: Function that takes in a records and returns a boolean to control if
+  the action button needs to be shown or hidden. Defaults to true
+- `groupShow`: Same as show but for group actions. Defaults to true
+- `popup`: (boolean) When true, displays any custom component in a popup modal
+  than in its separate route view. Defaults to false
+- `groupAction`: Whether the button supports groupable actions when multiple
+  items are selected in the table. Defaults to false
+- `mapping`: The relation of an arg to an api and the associated parameters to
+  be passed and filtered on the result (from which its id is used as a
+  select-option) or a given hardcoded list of select-options
+- `groupMap`: Function that maps the args and returns the list of parameters to
+  be passed to the api
+- `component`: The custom component to render the action (in a separate route
+  view under src/views/<component>). Uses an autogenerated form by default.
+  Examples of such views can be seen in the src/views/ directory
+
+For Example:
+```
+{
+  api: 'startVirtualMachine',
+  icon: 'caret-right',
+  label: 'label.action.start.instance',
+  message: 'message.action.start.instance',
+  docHelp: 'adminguide/virtual_machines.html#stopping-and-starting-vms',
+  dataView: true,
+  groupAction: true,
+  groupMap: (selection) => { return selection.map(x => { return { id: x } }) },
+  show: (record) => { return ['Stopped'].includes(record.state) },
+  args: (record, store) => {
+    var fields = []
+    if (store.userInfo.roletype === 'Admin') {
+      fields = ['podid', 'clusterid', 'hostid']
+    }
+    if (record.hypervisor === 'VMware') {
+      if (store.apis.startVirtualMachine.params.filter(x => x.name === 'bootintosetup').length > 0) {
+        fields.push('bootintosetup')
+      }
+    }
+    return fields
+  },
+  response: (result) => { return result.virtualmachine && result.virtualmachine.password ? `Password of the VM is ${result.virtualmachine.password}` : null }
+}
+```
+
+## Resource List View
+
+After having, defined a section and the actions that can be performed in the
+ particular section; on navigating to the section, we can have a list of
+ resources available, for example, on navigating to **Compute > Instances**
+ section, we see a list of all the VM instances (each instance referred to as a
+ resource).
+
+The columns that should be made available while displaying the list of
+  resources can be defined in the section's configuration file under the
+  columns attribute (as mentioned above). **columns** maybe defined as an array
+  or a function in case we need to selectively (i.e., based on certain
+  conditions) restrict the view of certain columns.
+
+It also contains router-links to the resouce and other related data such as the
+  account, domain, etc of the resource if present
+
+For example:
+
+```
+    ...
+    // columns defined as an array
+    columns: ['name', 'state', 'displaytext', 'account', 'domain'],
+
+    // columns can also be defined as a function, so as to conditionally restrict view of certain columns
+    columns: () => {
+        var fields = ['name', 'hypervisor', 'ostypename']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        ...
+    }
+```
+
+## Resource Detail View Customization
+
+From the List View of the resources, on can navigate to the individual
+  resource's detail view, which in CloudStack UI we refer to as the
+  *Resource View* by click on the specific resource.
+The Resource View has 2 sections:
+- InfoCard to the left that has basic / minimal details of that resource along
+  with the related entities
+- DetailsTab to the right which provide the basic details about the resource.
+
+Custom tabs to render custom details, addtional information of the resource
+  The list of fields to be displayed maybe defined as an array
+  or a function in case we need to selectively (i.e., based on certain
+  conditions) restrict the view of certain columns. The names specified in the
+  details array should correspond to the api parameters
+
+For example,
+
+```
+    ...
+    details: ['name', 'id', 'displaytext', 'projectaccountname', 'account', 'domain'],
+    ...
+    // To render the above mentioned details in the right section of the Resource View, we must import the DetailsTab
+    tabs: [
+    {
+      name: 'details',
+      component: () => import('@/components/view/DetailsTab.vue')
+    },
+    ...
+    ]
+```
+
+Additional tabs can be defined by adding on to the tabs section.
diff --git a/ui/docs/full-test-plan.template.md b/ui/docs/full-test-plan.template.md
new file mode 100644
index 0000000..bced270
--- /dev/null
+++ b/ui/docs/full-test-plan.template.md
@@ -0,0 +1,661 @@
+---
+name: Full Test Plan
+about: Create a high level full-test plan
+title: "[TESTPLAN] Full Test Plan for $Version for $Role, $Hypervisor, ACS $Version"
+labels: testing
+
+---
+
+Note: for User role test exclude after Account/User feature, for DomainAdmin role exclude after Infrastructure (except for Offerings)
+
+**Common**
+- [ ] Project selector
+- [ ] Language selector
+- [ ] Notifications / clear notifications
+- [ ] Paginations
+- [ ] Profile
+- [ ] Help
+- [ ] Logout
+- [ ] Context-sensitive help
+
+**Dashboard**
+- [ ] Fetch latest (only on Admin dashboard)
+- [ ] View hosts in alert state
+- [ ] View alerts
+- [ ] View events
+
+**Compute > Instances**
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+- [ ] Filter by
+- [ ] Create new instance
+
+**Compute > Kubernetes**
+This requires configuring and setting up CKS: http://docs.cloudstack.apache.org/en/latest/plugins/cloudstack-kubernetes-service.html
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+- [ ] Filter by
+- [ ] Add Kubernetes cluster
+- [ ] Start/stop a Kubernetes cluster
+- [ ] Scale Kubernetes cluster
+- [ ] Upgrade Kubernetes cluster
+- [ ] Delete Kubernetes cluster
+
+**Compute > Instances > selected instance**
+- [ ] View console
+- [ ] Reboot instance
+- [ ] Update instance
+- [ ] Start/Stop instance
+- [ ] Reinstall instance
+- [ ] Take snapshot
+- [ ] Assign VM to backup offering
+- [ ] Attach ISO
+- [ ] Scale VM
+- [ ] Migrate instance to another host
+- [ ] Change affinity
+- [ ] Change service offering
+- [ ] Reset Instance Password
+- [ ] Assign Instance to Another Account (VM must be stopped)
+- [ ] Network adapters
+- [ ] 	- Add network to VM
+- [ ] 	- Set default NIC
+- [ ] 	- Add/delete secondary IP address
+- [ ] 	- Delete VM network
+- [ ] Settings
+- [ ] 	- Add setting
+- [ ] 	- Update setting
+- [ ] 	- Delete setting
+- [ ] Add / delete comment
+- [ ] Add / delete tags
+- [ ] Links
+
+**Compute > Instance groups**
+- [ ] Search
+- [ ] Sort
+- [ ] Links
+- [ ] New instance group
+
+**Compute > Instance groups > selected instance group**
+- [ ] Links
+- [ ] Update instance group
+- [ ] Delete instance group
+
+**Compute > SSH Key Pairs**
+- [ ] Search
+- [ ] Sorting
+- [ ] Links
+- [ ] New SSH key pair
+
+**Compute > SSH Key Pairs > selected SSH key pair**
+- [ ] Links
+- [ ] Delete SSH key pair
+
+**Compute > Affinity Groups**
+- [ ] Search
+- [ ] Sort
+- [ ] Links
+- [ ] New affinity group
+
+**Compute > Affinity Groups > selected affinity group**
+- [ ] Links
+- [ ] Delete affinity group
+
+**Storage > Volumes**
+- [ ] Basic earch
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+- [ ] Create volume
+- [ ] Upload local volume
+- [ ] Upload volume from URL
+
+**Storage > Volumes > selected volume**
+- [ ] Detach volume
+- [ ] Take snapshot
+- [ ] Recurring snapshot
+- [ ] Resize volume
+- [ ] Migrate volume
+- [ ] Download volume
+- [ ] Delete volume
+- [ ] Links
+- [ ] Add/delete tags
+
+**Storage > Snapshots**
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+
+**Storage > Snapshots > selected snapshot**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Create template
+- [ ] Create volume
+- [ ] Revert snapshot
+- [ ] Delete snapshot
+
+**Storage > VM Snapshots**
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+
+**Storage > VM Snapshots > selected snapshot**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Revert VM snapshot
+- [ ] Delete VM snapshot
+
+**Storage > Backups**
+- [ ] Import offering
+- [ ] Configure backup provider (Veeam)
+- [ ] Create backup offering
+- [ ] Assign VM to backup offering
+- [ ] Revert to backup
+- [ ] Delete backup
+
+**Network > Guest networks**
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+- [ ] Add network
+
+**Network > Guest networks > selected network**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Update network
+- [ ] Restart network
+- [ ] Delete network
+- [ ] Acquire new IP (only for isolated networks)
+- [ ] Replace ACL list(only for VPC isolated networks)
+- [ ] Delete public IP address (only for isolated networks)
+- [ ] Add/delete egress rule (only for isolated networks)
+
+**Network > VPC **
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Links
+- [ ] Add VPC
+
+**Network > VPC > selected VPC**
+- [ ] Links
+- [ ] Update VPC
+- [ ] Restart VPC
+- [ ] Delete VPC
+- [ ] Networks
+- [ ] - Links
+- [ ] - Paginations
+- [ ] - Add network
+- [ ] - Add internal LB
+- [ ] Public IP addresses
+- [ ] - Links
+- [ ] - Pagination
+- [ ] - Select tier
+- [ ] - Acquire new IP
+- [ ] - Delete IP address
+- [ ] Network ACL Lists
+- [ ] - Links
+- [ ] - Pagination
+- [ ] - Add network ACL list
+- [ ] Private Gateways
+- [ ] - Links
+- [ ] - Pagination
+- [ ] - Add private gateway
+- [ ] VPN Gateway
+- [ ] - Links
+- [ ] VPN Connections
+- [ ] - Links
+- [ ] - Pagination
+- [ ] - Create Site-to-site VPN connection
+- [ ] Virtual routers
+- [ ] - Links
+- [ ] Add/delete tags
+
+**Network > Security groups**
+- [ ] Search
+- [ ] Sort
+- [ ] Links
+- [ ] Add security group
+
+**Network > Security groups > selected security group**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Add ingress rule by CIDR
+- [ ] Add ingress rule by Account
+- [ ] Ingress rule - add/delete tags
+- [ ] Ingress rule - delete
+- [ ] Add egress rule by CIDR
+- [ ] Add egress rule by Account
+- [ ] Egress rule - add/delete tags
+- [ ] Egress rule - delete
+- [ ] Ingress/egress rules pagination
+
+**Network > Public IP Addresses**
+- [ ] Search
+- [ ] Sort
+- [ ] Links
+- [ ] Acquire new IP
+
+**Network > Public IP Addresses > selected IP address**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Enable/Disable static NAT
+- [ ] Release IP
+- [ ] Firewall - add rule
+- [ ] Firewall rule - add/delete tags
+- [ ] Firewall rule - delete
+- [ ] VPN - Enable/Disable VPN
+- [ ] VPN - Manage VPN Users
+
+**Network > VPN Users**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add VPN user
+
+**Network > VPN Users > selected VPN user**
+- [ ] Links
+- [ ] Delete VPN User
+
+**Network > VPN Customer Gateway**
+- [ ] Links
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Add VPN Customer Gateway
+
+**Network > VPN Customer Gateway > selected gateway**
+- [ ] Links
+- [ ] Edit VPN Customer Gateway
+- [ ] Delete VPN Customer Gateway
+- [ ] Add/delete tags
+
+**Images > Templates**
+- [ ] Links
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Change order (move to the top/bottom, move one row up/down)
+- [ ] Register template
+- [ ] Upload local template
+
+**Images > Templates > selected template**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Edit template
+- [ ] Copy template
+- [ ] Update template permissions
+- [ ] Delete template
+- [ ] Download template
+- [ ] Zones pagination
+- [ ] Settings - add/edit/remove setting
+
+**Images > ISOs**
+- [ ] Links
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Change order (move to the top/bottom, move one row up/down)
+- [ ] Register ISO
+- [ ] Upload local ISO
+
+**Images > ISOs > selected ISO**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Edit ISO
+- [ ] Download ISO
+- [ ] Update ISO permissions
+- [ ] Copy ISO
+- [ ] Delete ISO
+- [ ] Zones - pagination
+
+**Images > Kubernetes ISOs**
+- [ ] Links
+- [ ] Basic search
+- [ ] Sort
+- [ ] Refresh
+- [ ] Pagination
+- [ ] Enable/Disable
+- [ ] Add Kubernetes Version
+
+**Projects**
+- [ ] Links
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Switch to project
+- [ ] New project
+- [ ] Enter token
+- [ ] Project invitations
+
+**Projects > selected project**
+- [ ] Links
+- [ ] Add/delete tags
+- [ ] Edit project
+- [ ] Suspend/Activate project
+- [ ] Add account to project
+- [ ] Accounts - Make account project owner
+- [ ] Accounts - Remove account from project
+- [ ] Delete project
+- [ ] Accounts - pagination
+- [ ] Resources - edit
+
+**Events**
+- [ ] Links
+- [ ] Basic search
+- [ ] Extended search
+- [ ] Sort
+- [ ] Archive event
+- [ ] Delete event
+
+**Events > selected event**
+- [ ] Links
+- [ ] Archive event
+- [ ] View event timeline
+- [ ] Delete event
+
+**Users**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add user
+
+**Accounts**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add account
+- [ ] Add LDAP account
+
+**Accounts > selected account**
+- [ ] Links
+- [ ] Update account
+- [ ] Update resource count
+- [ ] Disable/enable account
+- [ ] Lock/unlock account
+- [ ] Add certificate
+- [ ] Delete account
+- [ ] Settings
+
+**Users > selected user**
+- [ ] Links
+- [ ] Edit user
+- [ ] Change password
+- [ ] Generate keys
+- [ ] Disable/enable user
+- [ ] Delete user
+- [ ] Copy API Key
+- [ ] Copy Secret Key
+
+**Domains**
+- [ ] Search
+- [ ] Expand/collapse
+- [ ] Add/delete note
+- [ ] Add domain
+- [ ] Edit domain
+- [ ] Delete domain
+- [ ] Update resource count
+- [ ] Link domain to LDAP Group/OU
+- [ ] Settings
+
+**Roles**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Create role
+
+**Roles > selected role**
+- [ ] Edit role
+- [ ] Delete role
+- [ ] Rules - add new rule
+- [ ] Rules - modify rule
+- [ ] Rules - delete rule
+- [ ] Rules - change rules order
+
+**Infrastructure > Summary**
+- [ ] Links
+- [ ] Setup SSL certificate
+
+**Infrastructure > Zones**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Pagination
+- [ ] Add zone
+
+**Infrastructure > Zones > selected zone**
+- [ ] Links
+- [ ] Edit zone
+- [ ] Enable/disable zone
+- [ ] Enable/disable out-of-band management
+- [ ] Enable HA (disable?)
+- [ ] Add VMWare datacenter
+- [ ] Delete zone
+- [ ] Settings - edit
+
+**Infrastructure > Pods**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add Pod
+
+**Infrastructure > Pods > selected Pod**
+- [ ] Links
+- [ ] Dedicate/Release Pod
+- [ ] Edit Pod
+- [ ] Disable/enable Pod
+- [ ] Delete Pod
+
+**Infrastructure > Clusters**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add Cluster
+
+**Infrastructure > Clusters > selected cluster**
+- [ ] Links
+- [ ] Dedicate/Release cluster
+- [ ] Enable/disable cluster
+- [ ] Manage/unmanage cluster
+- [ ] Enable/disable out-of-band management
+- [ ] Enable/disable HA
+- [ ] Configure HA
+- [ ] Delete cluster
+- [ ] Settings - edit
+
+**Infrastructure > Hosts**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add host
+
+**Infrastructure > Hosts > selected host**
+- [ ] Links
+- [ ] Add/delete notes
+- [ ] Dedicate/release host
+- [ ] Edit host
+- [ ] Force reconnect
+- [ ] Disable/enable host
+- [ ] Enable/cancel maintenance mode
+- [ ] Enable/disable out-of-band management
+- [ ] Enable/disale HA
+- [ ] Delete host (only if disabled)
+
+**Infrastructure > Primary Storage**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add Primary storage
+
+**Infrastructure > Primary Storage > selected primary storage**
+- [ ] Links
+- [ ] Edit primary storage
+- [ ] Enable/cancel maintenance mode
+- [ ] Delete primary storage
+- [ ] Settings - edit
+
+**Infrastructure > Secondary Storage**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add Secondary storage
+
+**Infrastructure > Secondary Storage > selected secondary storage**
+- [ ] Links
+- [ ] Delete secondary storage
+- [ ] Settings - edit
+
+**Infrastructure > System VMs**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > System VMs > selected system VM**
+- [ ] Links
+- [ ] View console
+- [ ] Start/Stop system VM
+- [ ] Reboot system VM
+- [ ] Change service offering
+- [ ] Migrate system VM
+- [ ] Run diagnostics
+- [ ] Get diagnostics data
+- [ ] Destroy system VM
+
+**Infrastructure > Virtual routers**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > Virtual routers > selected virtual router**
+- [ ] Links
+- [ ] View console (running)
+- [ ] Start/Stop router
+- [ ] Reboot router
+- [ ] Change service offering
+- [ ] Migrate router (running)
+- [ ] Run diagnostics (running)
+- [ ] Get diagnostics data
+- [ ] Destroy router
+
+**Infrastructure > Internal LB VMs**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > Internal LB VMs > selected internal LB VM**
+- [ ] Links
+- [ ] View console
+- [ ] Stop router
+- [ ] Migrate router
+
+**Infrastructure > CPU Sockets**
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > Management servers**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > Management servers > selected management server**
+
+**Infrastructure > Alerts**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+
+**Infrastructure > Alerts > selected alert**
+- [ ] Archive alert
+- [ ] Delete alert
+
+**Offerings > Compute offerings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Add offering
+
+**Offerings > Compute offerings > selected offering**
+- [ ] Links
+- [ ] Edit offering
+- [ ] Update offering access
+- [ ] Delete offering
+
+**Offerings > System offerings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Change order (move to the top/bottom, move one row up/down)
+- [ ] Add offering
+
+**Offerings > System offerings > selected offering**
+- [ ] Edit offering
+- [ ] Delete offering
+
+**Offerings > Disk offerings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Change order (move to the top/bottom, move one row up/down)
+- [ ] Add offering
+
+**Offerings > Disk offerings > selected offering**
+- [ ] Links
+- [ ] Edit offering
+- [ ] Update offering access
+- [ ] Delete offering
+
+**Offerings > Backup offerings**
+
+**Offerings > Network offerings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Change order (move to the top/bottom, move one row up/down)
+- [ ] Add offering
+
+**Offerings > Network offerings > selected offering**
+- [ ] Edit offering
+- [ ] Enable/Disable offering
+- [ ] Update offering access
+- [ ] Delete offering
+
+**Offerings > VPC offerings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Change order
+- [ ] Add offering
+
+**Offerings > VPC offerings > selected offering**
+- [ ] Links
+- [ ] Add / delete tags
+- [ ] Edit offering
+- [ ] Enable/Disable offering
+- [ ] Update offering access
+- [ ] Delete offering
+
+**Configuration > Global settings**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Edit value
+
+**Configuration > LDAP Configuration**
+- [ ] Links
+- [ ] Search
+- [ ] Sort
+- [ ] Configure LDAP
+
+**Configuration > LDAP Configuration > selected LDAP configuration**
+- [ ] TBD
+
+**Configuration > Hypervisor capabilities**
+- [ ] Data
+- [ ] Search
+- [ ] Sort
diff --git a/ui/docs/screenshot-dashboard.png b/ui/docs/screenshot-dashboard.png
new file mode 100644
index 0000000..79216b9
--- /dev/null
+++ b/ui/docs/screenshot-dashboard.png
Binary files differ
diff --git a/ui/docs/smoke-test-plan.template.md b/ui/docs/smoke-test-plan.template.md
new file mode 100644
index 0000000..cc065ed
--- /dev/null
+++ b/ui/docs/smoke-test-plan.template.md
@@ -0,0 +1,181 @@
+---
+name: Smoke Test Plan
+about: Create a smoke test plan for a release
+title: "[TESTPLAN] Smoketest for $VERSION with $Role, $Hypervisor and ACS $Version"
+labels: testing
+
+---
+
+Note: for User role test exclude after Account/User feature, for DomainAdmin role exclude after Infrastructure (except for Offerings)
+
+**Instances**
+- [ ] Create instance using template
+- [ ] Create instance using ISO image and different parameters than the previous one
+- [ ] Test all VM actions - Start/Stop/Reboot/Reinstall/Update, etc
+- [ ] Add/modify/delete VM setting
+- [ ] Add network to VM, change IP address, make it default, delete
+- [ ] Add/delete secondary IP address
+
+**Compute > Kubernetes**
+This requires configuring and setting up CKS: http://docs.cloudstack.apache.org/en/latest/plugins/cloudstack-kubernetes-service.html
+- [ ] Add Kubernetes cluster
+- [ ] Start/stop a Kubernetes cluster
+- [ ] Scale Kubernetes cluster
+- [ ] Upgrade Kubernetes cluster
+- [ ] Delete Kubernetes cluster
+
+**Add Instance groups**
+- [ ] Add/modify/delete instance group
+
+**SSH Key Pairs**
+- [ ] Add/delete SSH key pair
+
+**Affinity Groups**
+- [ ] Add/delete host affinity group
+- [ ] Add/delete host anti-affinity group
+
+**Volumes**
+- [ ] Create volume
+- [ ] Upload local volume
+- [ ] Upload volume from URL
+- [ ] Volume actions - snapshots, resize, migrate, download, create template
+
+**Snapshots**
+- [ ] Snapshot actions - create template/volume, revert, delete
+
+**VM Snapshots**
+- [ ] VM Snapshot actions - revert, delete
+
+**Backups**
+
+**Guest networks**
+- [ ] Add isolated network
+- [ ] Add L2 network
+- [ ] Add shared network
+- [ ] Network actions - update, restart, replace ACL list, delete
+- [ ] Add/delete egress rules
+- [ ] Acquire IP address
+
+**VPC**
+- [ ] Add VPC
+- [ ] VPC actions - updat, restart, delete
+- [ ] Add security group
+- [ ] Add/delete ingress/egress rule
+
+**Public IP Addresses**
+- [ ] Acquire new IP
+- [ ] Actions - enable static NAT, release IP, enable VPN
+
+**Templates**
+- [ ] Register template
+- [ ] Upload local template
+- [ ] Template actions - edit, download, update permissions, copy, delete
+
+**ISOs**
+- [ ] Register ISO
+- [ ] Upload local ISO
+- [ ] ISO actions - edit, download update permissions, copy, delete
+
+**Events**
+- [ ] Search, archive, delete
+
+**Projects**
+- [ ] Add project
+- [ ] Project actions - edit, suspend, add account, delete
+- [ ] Different projects with different permission
+
+**Accounts, users, roles**
+- [ ] Create/modify/check role/delete regular user account
+- [ ] Create/modify/check role/delete resource admin account
+- [ ] Create/modify/check role/delete domain admin account
+- [ ] Create/modify/check role/delete admin user
+- [ ] Account actions - edit, disable, lock, delete
+
+**Domains**
+- [ ] Create new domain
+- [ ] Create subdomain in the new domain
+- [ ] Delete the first domain (2nd, not 3rd level)
+- [ ] Edit/delete domain
+- [ ] Modify domain limits/settings
+
+**Roles**
+- [ ] Add new role
+- [ ] Role actions - edit, delete
+
+**Infrastructure summary**
+
+**Zones**
+- [ ] Add zone
+- [ ] Zone actions - edit, enable/disable, enable/disable HA, delete, etc.
+- [ ] Modify settings
+
+**Pods**
+- [ ] Add pod
+- [ ] Pod actions - edit, enable/disable, delete
+
+**Clusters**
+- [ ] Add cluster
+- [ ] Cluster actions - enable/disable, unmanage, enable/disable HA, delete, etc
+
+**Hosts**
+- [ ] Add host
+- [ ] Host actions - edit, enable/disable, maintenance mode, enable/disable/configure HA, etc.
+
+**Primary storage**
+- [ ] Add primary storage
+- [ ] Primary storage actions - edit, enable/disable maintenance mode
+- [ ] Settings - modify
+
+**Secondary storage**
+- [ ] Add secondary storage
+- [ ] Delete secondary storage
+- [ ] Settings - modify
+
+**Compute offering**
+- [ ] Add shared thin compute offering
+- [ ] Add local fat compute offering
+- [ ] Offering actions - edit, access, delete
+
+**System offering**
+- [ ] Add shared thin system offering for VR
+- [ ] Add local sparse system offering for console proxy
+- [ ] Offering actions - edit, delete
+
+**Disk offering**
+- [ ] Add shared thin disk offering
+- [ ] Add local fat disk offering
+- [ ] Offering actions - edit, access, delete
+
+**Backup offering**
+- [ ] Import offering
+- [ ] Configure backup provider (Veeam)
+- [ ] Create backup offering
+- [ ] Assign VM to backup offering
+- [ ] Revert to backup
+- [ ] Delete backup
+**Network offering**
+- [ ] Add isolated network with some supported services
+- [ ] Add L2 network
+- [ ] Add shared network with some supported services
+- [ ] Network actions - edit, enable/disable, access, delete
+
+**VPC offering**
+- [ ] Change VPC offerings order
+- [ ] Add new VPC offering with some supported services
+- [ ] VPC offering actions - edit, enable/disable, access, delete
+
+**Global settings**
+- [ ] Search setting
+- [ ] Modify setting
+
+**LDAP configuration**
+- [ ] Add LDAP configuration
+- [ ] Login with LDAP account
+
+**Common functionality**
+- [ ] Sorting
+- [ ] Pagination
+- [ ] Searching
+- [ ] Add/remove tags
+- [ ] Refresh
+- [ ] Links
diff --git a/ui/index.html b/ui/index.html
index ef7a461..64421d6 100644
--- a/ui/index.html
+++ b/ui/index.html
@@ -16,1972 +16,14 @@
      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">
+<!doctype html>
+<html>
     <head>
+        <meta charset="utf-8">
         <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" />
+        <title>Apache CloudStack</title>
     </head>
     <body>
-        <!-- 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>
-
-
-                                    <!-- 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>
+        <p>You're in developer mode, please build and run UI using npm.</p>
     </body>
 </html>
diff --git a/ui/jest.config.js b/ui/jest.config.js
new file mode 100644
index 0000000..7fcb5df
--- /dev/null
+++ b/ui/jest.config.js
@@ -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.
+
+module.exports = {
+  testURL: 'http://localhost/',
+  setupFiles: ['<rootDir>/tests/setup.js'],
+  moduleFileExtensions: [
+    'js',
+    'jsx',
+    'json',
+    'vue'
+  ],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|png|svg|jpg|ttf|woff|woff2)?$': 'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest'
+  },
+  moduleNameMapper: {
+    '.+\\.svg?.+$': 'jest-transform-stub',
+    '^@/(.*)$': '<rootDir>/src/$1',
+    '^@public/(.*)$': '<rootDir>/public/$1'
+  },
+  snapshotSerializers: [
+    'jest-serializer-vue'
+  ],
+  testMatch: [
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+  ],
+  transformIgnorePatterns: [
+    '<rootDir>/node_modules/(?!ant-design-vue|vue)'
+  ],
+  collectCoverage: true,
+  collectCoverageFrom: [
+    '<rootDir>/src/**/*.{js,vue}',
+    '!**/node_modules/**',
+    '!<rootDir>/src/locales/*.{js, json}'
+  ],
+  coverageReporters: ['html', 'text-summary']
+}
diff --git a/ui/jsconfig.json b/ui/jsconfig.json
new file mode 100644
index 0000000..1bd0da4
--- /dev/null
+++ b/ui/jsconfig.json
@@ -0,0 +1,11 @@
+{
+  "compilerOptions": {
+    "target": "es6",
+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"],
+  "include": ["src/**/*"]
+}
diff --git a/ui/l10n/ar.js b/ui/l10n/ar.js
deleted file mode 100644
index acfc553..0000000
--- a/ui/l10n/ar.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/ca.js b/ui/l10n/ca.js
deleted file mode 100644
index 3a7c045..0000000
--- a/ui/l10n/ca.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/de_DE.js b/ui/l10n/de_DE.js
deleted file mode 100644
index 4fbc827..0000000
--- a/ui/l10n/de_DE.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": "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.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/l10n/en.js b/ui/l10n/en.js
deleted file mode 100644
index cb967be..0000000
--- a/ui/l10n/en.js
+++ /dev/null
@@ -1,2488 +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.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.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.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.",
-"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/l10n/es.js b/ui/l10n/es.js
deleted file mode 100644
index 875b7a1..0000000
--- a/ui/l10n/es.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": "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.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/l10n/fr_FR.js b/ui/l10n/fr_FR.js
deleted file mode 100644
index 92eb8de..0000000
--- a/ui/l10n/fr_FR.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": "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.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/l10n/hu.js b/ui/l10n/hu.js
deleted file mode 100644
index 6912c1a..0000000
--- a/ui/l10n/hu.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/it_IT.js b/ui/l10n/it_IT.js
deleted file mode 100644
index 4c3ed12..0000000
--- a/ui/l10n/it_IT.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/ja_JP.js b/ui/l10n/ja_JP.js
deleted file mode 100644
index b876d33..0000000
--- a/ui/l10n/ja_JP.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 コード",
-    "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.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/l10n/ko_KR.js b/ui/l10n/ko_KR.js
deleted file mode 100644
index bdcae7d..0000000
--- a/ui/l10n/ko_KR.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/nb_NO.js b/ui/l10n/nb_NO.js
deleted file mode 100644
index 364a3fc..0000000
--- a/ui/l10n/nb_NO.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/nl_NL.js b/ui/l10n/nl_NL.js
deleted file mode 100644
index ffb1f1e..0000000
--- a/ui/l10n/nl_NL.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/pl.js b/ui/l10n/pl.js
deleted file mode 100644
index 7f993c6..0000000
--- a/ui/l10n/pl.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/pt_BR.js b/ui/l10n/pt_BR.js
deleted file mode 100644
index eb5a290..0000000
--- a/ui/l10n/pt_BR.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/ru_RU.js b/ui/l10n/ru_RU.js
deleted file mode 100644
index 49f4d8a..0000000
--- a/ui/l10n/ru_RU.js
+++ /dev/null
@@ -1,2311 +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.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/l10n/zh_CN.js b/ui/l10n/zh_CN.js
deleted file mode 100644
index 26cb708..0000000
--- a/ui/l10n/zh_CN.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 代码",
-    "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.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/config.js b/ui/legacy/config.js
similarity index 100%
rename from ui/config.js
rename to ui/legacy/config.js
diff --git a/ui/legacy/css/cloudstack3.css b/ui/legacy/css/cloudstack3.css
new file mode 100644
index 0000000..98871c9
--- /dev/null
+++ b/ui/legacy/css/cloudstack3.css
@@ -0,0 +1,13408 @@
+/*[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/css/cloudstack3.hu.css b/ui/legacy/css/cloudstack3.hu.css
similarity index 100%
rename from ui/css/cloudstack3.hu.css
rename to ui/legacy/css/cloudstack3.hu.css
diff --git a/ui/css/cloudstack3.ja_JP.css b/ui/legacy/css/cloudstack3.ja_JP.css
similarity index 100%
rename from ui/css/cloudstack3.ja_JP.css
rename to ui/legacy/css/cloudstack3.ja_JP.css
diff --git a/ui/css/custom.css b/ui/legacy/css/custom.css
similarity index 100%
rename from ui/css/custom.css
rename to ui/legacy/css/custom.css
diff --git a/ui/css/src/.jsbeautifyrc b/ui/legacy/css/src/.jsbeautifyrc
similarity index 100%
rename from ui/css/src/.jsbeautifyrc
rename to ui/legacy/css/src/.jsbeautifyrc
diff --git a/ui/css/src/.sass-lint.yml b/ui/legacy/css/src/.sass-lint.yml
similarity index 100%
rename from ui/css/src/.sass-lint.yml
rename to ui/legacy/css/src/.sass-lint.yml
diff --git a/ui/css/src/Gulpfile.js b/ui/legacy/css/src/Gulpfile.js
similarity index 100%
rename from ui/css/src/Gulpfile.js
rename to ui/legacy/css/src/Gulpfile.js
diff --git a/ui/css/src/package-lock.json b/ui/legacy/css/src/package-lock.json
similarity index 100%
rename from ui/css/src/package-lock.json
rename to ui/legacy/css/src/package-lock.json
diff --git a/ui/css/src/package.json b/ui/legacy/css/src/package.json
similarity index 100%
rename from ui/css/src/package.json
rename to ui/legacy/css/src/package.json
diff --git a/ui/css/src/readme.md b/ui/legacy/css/src/readme.md
similarity index 100%
rename from ui/css/src/readme.md
rename to ui/legacy/css/src/readme.md
diff --git a/ui/css/src/scss/cloudstack3.hu.scss b/ui/legacy/css/src/scss/cloudstack3.hu.scss
similarity index 100%
rename from ui/css/src/scss/cloudstack3.hu.scss
rename to ui/legacy/css/src/scss/cloudstack3.hu.scss
diff --git a/ui/css/src/scss/cloudstack3.ja_JP.scss b/ui/legacy/css/src/scss/cloudstack3.ja_JP.scss
similarity index 100%
rename from ui/css/src/scss/cloudstack3.ja_JP.scss
rename to ui/legacy/css/src/scss/cloudstack3.ja_JP.scss
diff --git a/ui/css/src/scss/cloudstack3.scss b/ui/legacy/css/src/scss/cloudstack3.scss
similarity index 100%
rename from ui/css/src/scss/cloudstack3.scss
rename to ui/legacy/css/src/scss/cloudstack3.scss
diff --git a/ui/css/src/scss/common/common.scss b/ui/legacy/css/src/scss/common/common.scss
similarity index 100%
rename from ui/css/src/scss/common/common.scss
rename to ui/legacy/css/src/scss/common/common.scss
diff --git a/ui/css/src/scss/components/accounts-wizzard.scss b/ui/legacy/css/src/scss/components/accounts-wizzard.scss
similarity index 100%
rename from ui/css/src/scss/components/accounts-wizzard.scss
rename to ui/legacy/css/src/scss/components/accounts-wizzard.scss
diff --git a/ui/css/src/scss/components/acl-dialog.scss b/ui/legacy/css/src/scss/components/acl-dialog.scss
similarity index 100%
rename from ui/css/src/scss/components/acl-dialog.scss
rename to ui/legacy/css/src/scss/components/acl-dialog.scss
diff --git a/ui/css/src/scss/components/action-icons.scss b/ui/legacy/css/src/scss/components/action-icons.scss
similarity index 100%
rename from ui/css/src/scss/components/action-icons.scss
rename to ui/legacy/css/src/scss/components/action-icons.scss
diff --git a/ui/css/src/scss/components/actions-dialog.scss b/ui/legacy/css/src/scss/components/actions-dialog.scss
similarity index 100%
rename from ui/css/src/scss/components/actions-dialog.scss
rename to ui/legacy/css/src/scss/components/actions-dialog.scss
diff --git a/ui/css/src/scss/components/actions-table.scss b/ui/legacy/css/src/scss/components/actions-table.scss
similarity index 100%
rename from ui/css/src/scss/components/actions-table.scss
rename to ui/legacy/css/src/scss/components/actions-table.scss
diff --git a/ui/css/src/scss/components/actions.scss b/ui/legacy/css/src/scss/components/actions.scss
similarity index 100%
rename from ui/css/src/scss/components/actions.scss
rename to ui/legacy/css/src/scss/components/actions.scss
diff --git a/ui/css/src/scss/components/advanced-search.scss b/ui/legacy/css/src/scss/components/advanced-search.scss
similarity index 100%
rename from ui/css/src/scss/components/advanced-search.scss
rename to ui/legacy/css/src/scss/components/advanced-search.scss
diff --git a/ui/css/src/scss/components/autoscaler.scss b/ui/legacy/css/src/scss/components/autoscaler.scss
similarity index 100%
rename from ui/css/src/scss/components/autoscaler.scss
rename to ui/legacy/css/src/scss/components/autoscaler.scss
diff --git a/ui/css/src/scss/components/blocking-overlay.scss b/ui/legacy/css/src/scss/components/blocking-overlay.scss
similarity index 100%
rename from ui/css/src/scss/components/blocking-overlay.scss
rename to ui/legacy/css/src/scss/components/blocking-overlay.scss
diff --git a/ui/css/src/scss/components/breadcrumbs.scss b/ui/legacy/css/src/scss/components/breadcrumbs.scss
similarity index 100%
rename from ui/css/src/scss/components/breadcrumbs.scss
rename to ui/legacy/css/src/scss/components/breadcrumbs.scss
diff --git a/ui/css/src/scss/components/browser.scss b/ui/legacy/css/src/scss/components/browser.scss
similarity index 100%
rename from ui/css/src/scss/components/browser.scss
rename to ui/legacy/css/src/scss/components/browser.scss
diff --git a/ui/css/src/scss/components/button-add.scss b/ui/legacy/css/src/scss/components/button-add.scss
similarity index 100%
rename from ui/css/src/scss/components/button-add.scss
rename to ui/legacy/css/src/scss/components/button-add.scss
diff --git a/ui/css/src/scss/components/button-export.scss b/ui/legacy/css/src/scss/components/button-export.scss
similarity index 100%
rename from ui/css/src/scss/components/button-export.scss
rename to ui/legacy/css/src/scss/components/button-export.scss
diff --git a/ui/css/src/scss/components/ca-cert-download.scss b/ui/legacy/css/src/scss/components/ca-cert-download.scss
similarity index 100%
rename from ui/css/src/scss/components/ca-cert-download.scss
rename to ui/legacy/css/src/scss/components/ca-cert-download.scss
diff --git a/ui/css/src/scss/components/copy-template.scss b/ui/legacy/css/src/scss/components/copy-template.scss
similarity index 100%
rename from ui/css/src/scss/components/copy-template.scss
rename to ui/legacy/css/src/scss/components/copy-template.scss
diff --git a/ui/css/src/scss/components/create-form.scss b/ui/legacy/css/src/scss/components/create-form.scss
similarity index 100%
rename from ui/css/src/scss/components/create-form.scss
rename to ui/legacy/css/src/scss/components/create-form.scss
diff --git a/ui/css/src/scss/components/dashboard-project.scss b/ui/legacy/css/src/scss/components/dashboard-project.scss
similarity index 100%
rename from ui/css/src/scss/components/dashboard-project.scss
rename to ui/legacy/css/src/scss/components/dashboard-project.scss
diff --git a/ui/css/src/scss/components/dashboard-system.scss b/ui/legacy/css/src/scss/components/dashboard-system.scss
similarity index 100%
rename from ui/css/src/scss/components/dashboard-system.scss
rename to ui/legacy/css/src/scss/components/dashboard-system.scss
diff --git a/ui/css/src/scss/components/dashboard.scss b/ui/legacy/css/src/scss/components/dashboard.scss
similarity index 100%
rename from ui/css/src/scss/components/dashboard.scss
rename to ui/legacy/css/src/scss/components/dashboard.scss
diff --git a/ui/css/src/scss/components/datepicker.scss b/ui/legacy/css/src/scss/components/datepicker.scss
similarity index 100%
rename from ui/css/src/scss/components/datepicker.scss
rename to ui/legacy/css/src/scss/components/datepicker.scss
diff --git a/ui/css/src/scss/components/details-page.scss b/ui/legacy/css/src/scss/components/details-page.scss
similarity index 100%
rename from ui/css/src/scss/components/details-page.scss
rename to ui/legacy/css/src/scss/components/details-page.scss
diff --git a/ui/css/src/scss/components/dialog-about.scss b/ui/legacy/css/src/scss/components/dialog-about.scss
similarity index 100%
rename from ui/css/src/scss/components/dialog-about.scss
rename to ui/legacy/css/src/scss/components/dialog-about.scss
diff --git a/ui/css/src/scss/components/dynamic-input.scss b/ui/legacy/css/src/scss/components/dynamic-input.scss
similarity index 100%
rename from ui/css/src/scss/components/dynamic-input.scss
rename to ui/legacy/css/src/scss/components/dynamic-input.scss
diff --git a/ui/css/src/scss/components/first-network-resource.scss b/ui/legacy/css/src/scss/components/first-network-resource.scss
similarity index 100%
rename from ui/css/src/scss/components/first-network-resource.scss
rename to ui/legacy/css/src/scss/components/first-network-resource.scss
diff --git a/ui/css/src/scss/components/gpu-groups.scss b/ui/legacy/css/src/scss/components/gpu-groups.scss
similarity index 100%
rename from ui/css/src/scss/components/gpu-groups.scss
rename to ui/legacy/css/src/scss/components/gpu-groups.scss
diff --git a/ui/css/src/scss/components/header-notifications.scss b/ui/legacy/css/src/scss/components/header-notifications.scss
similarity index 100%
rename from ui/css/src/scss/components/header-notifications.scss
rename to ui/legacy/css/src/scss/components/header-notifications.scss
diff --git a/ui/css/src/scss/components/header.scss b/ui/legacy/css/src/scss/components/header.scss
similarity index 100%
rename from ui/css/src/scss/components/header.scss
rename to ui/legacy/css/src/scss/components/header.scss
diff --git a/ui/css/src/scss/components/health-check.scss b/ui/legacy/css/src/scss/components/health-check.scss
similarity index 100%
rename from ui/css/src/scss/components/health-check.scss
rename to ui/legacy/css/src/scss/components/health-check.scss
diff --git a/ui/css/src/scss/components/info-boxes.scss b/ui/legacy/css/src/scss/components/info-boxes.scss
similarity index 100%
rename from ui/css/src/scss/components/info-boxes.scss
rename to ui/legacy/css/src/scss/components/info-boxes.scss
diff --git a/ui/css/src/scss/components/install-wizzard.scss b/ui/legacy/css/src/scss/components/install-wizzard.scss
similarity index 100%
rename from ui/css/src/scss/components/install-wizzard.scss
rename to ui/legacy/css/src/scss/components/install-wizzard.scss
diff --git a/ui/css/src/scss/components/jquery-ui.scss b/ui/legacy/css/src/scss/components/jquery-ui.scss
similarity index 100%
rename from ui/css/src/scss/components/jquery-ui.scss
rename to ui/legacy/css/src/scss/components/jquery-ui.scss
diff --git a/ui/css/src/scss/components/list-view.scss b/ui/legacy/css/src/scss/components/list-view.scss
similarity index 100%
rename from ui/css/src/scss/components/list-view.scss
rename to ui/legacy/css/src/scss/components/list-view.scss
diff --git a/ui/css/src/scss/components/list-view2.scss b/ui/legacy/css/src/scss/components/list-view2.scss
similarity index 100%
rename from ui/css/src/scss/components/list-view2.scss
rename to ui/legacy/css/src/scss/components/list-view2.scss
diff --git a/ui/css/src/scss/components/loading-overlay.scss b/ui/legacy/css/src/scss/components/loading-overlay.scss
similarity index 100%
rename from ui/css/src/scss/components/loading-overlay.scss
rename to ui/legacy/css/src/scss/components/loading-overlay.scss
diff --git a/ui/css/src/scss/components/login.scss b/ui/legacy/css/src/scss/components/login.scss
similarity index 100%
rename from ui/css/src/scss/components/login.scss
rename to ui/legacy/css/src/scss/components/login.scss
diff --git a/ui/css/src/scss/components/migrate-vm.scss b/ui/legacy/css/src/scss/components/migrate-vm.scss
similarity index 100%
rename from ui/css/src/scss/components/migrate-vm.scss
rename to ui/legacy/css/src/scss/components/migrate-vm.scss
diff --git a/ui/css/src/scss/components/multi-edit.scss b/ui/legacy/css/src/scss/components/multi-edit.scss
similarity index 100%
rename from ui/css/src/scss/components/multi-edit.scss
rename to ui/legacy/css/src/scss/components/multi-edit.scss
diff --git a/ui/css/src/scss/components/multi-wizzard.scss b/ui/legacy/css/src/scss/components/multi-wizzard.scss
similarity index 100%
rename from ui/css/src/scss/components/multi-wizzard.scss
rename to ui/legacy/css/src/scss/components/multi-wizzard.scss
diff --git a/ui/css/src/scss/components/navigation.scss b/ui/legacy/css/src/scss/components/navigation.scss
similarity index 100%
rename from ui/css/src/scss/components/navigation.scss
rename to ui/legacy/css/src/scss/components/navigation.scss
diff --git a/ui/css/src/scss/components/network-chart.scss b/ui/legacy/css/src/scss/components/network-chart.scss
similarity index 100%
rename from ui/css/src/scss/components/network-chart.scss
rename to ui/legacy/css/src/scss/components/network-chart.scss
diff --git a/ui/css/src/scss/components/new-project.scss b/ui/legacy/css/src/scss/components/new-project.scss
similarity index 100%
rename from ui/css/src/scss/components/new-project.scss
rename to ui/legacy/css/src/scss/components/new-project.scss
diff --git a/ui/css/src/scss/components/notifications.scss b/ui/legacy/css/src/scss/components/notifications.scss
similarity index 100%
rename from ui/css/src/scss/components/notifications.scss
rename to ui/legacy/css/src/scss/components/notifications.scss
diff --git a/ui/css/src/scss/components/panel-controls.scss b/ui/legacy/css/src/scss/components/panel-controls.scss
similarity index 100%
rename from ui/css/src/scss/components/panel-controls.scss
rename to ui/legacy/css/src/scss/components/panel-controls.scss
diff --git a/ui/css/src/scss/components/plugins-listing.scss b/ui/legacy/css/src/scss/components/plugins-listing.scss
similarity index 100%
rename from ui/css/src/scss/components/plugins-listing.scss
rename to ui/legacy/css/src/scss/components/plugins-listing.scss
diff --git a/ui/css/src/scss/components/project-selector.scss b/ui/legacy/css/src/scss/components/project-selector.scss
similarity index 100%
rename from ui/css/src/scss/components/project-selector.scss
rename to ui/legacy/css/src/scss/components/project-selector.scss
diff --git a/ui/css/src/scss/components/quick-view-tooltip.scss b/ui/legacy/css/src/scss/components/quick-view-tooltip.scss
similarity index 100%
rename from ui/css/src/scss/components/quick-view-tooltip.scss
rename to ui/legacy/css/src/scss/components/quick-view-tooltip.scss
diff --git a/ui/css/src/scss/components/recurring-snapshots.scss b/ui/legacy/css/src/scss/components/recurring-snapshots.scss
similarity index 100%
rename from ui/css/src/scss/components/recurring-snapshots.scss
rename to ui/legacy/css/src/scss/components/recurring-snapshots.scss
diff --git a/ui/css/src/scss/components/region-switcher.scss b/ui/legacy/css/src/scss/components/region-switcher.scss
similarity index 100%
rename from ui/css/src/scss/components/region-switcher.scss
rename to ui/legacy/css/src/scss/components/region-switcher.scss
diff --git a/ui/css/src/scss/components/section-switcher.scss b/ui/legacy/css/src/scss/components/section-switcher.scss
similarity index 100%
rename from ui/css/src/scss/components/section-switcher.scss
rename to ui/legacy/css/src/scss/components/section-switcher.scss
diff --git a/ui/css/src/scss/components/system-chart.scss b/ui/legacy/css/src/scss/components/system-chart.scss
similarity index 100%
rename from ui/css/src/scss/components/system-chart.scss
rename to ui/legacy/css/src/scss/components/system-chart.scss
diff --git a/ui/css/src/scss/components/tagger.scss b/ui/legacy/css/src/scss/components/tagger.scss
similarity index 100%
rename from ui/css/src/scss/components/tagger.scss
rename to ui/legacy/css/src/scss/components/tagger.scss
diff --git a/ui/css/src/scss/components/token-input-facebook.scss b/ui/legacy/css/src/scss/components/token-input-facebook.scss
similarity index 100%
rename from ui/css/src/scss/components/token-input-facebook.scss
rename to ui/legacy/css/src/scss/components/token-input-facebook.scss
diff --git a/ui/css/src/scss/components/toolbar.scss b/ui/legacy/css/src/scss/components/toolbar.scss
similarity index 100%
rename from ui/css/src/scss/components/toolbar.scss
rename to ui/legacy/css/src/scss/components/toolbar.scss
diff --git a/ui/css/src/scss/components/tooltip-box.scss b/ui/legacy/css/src/scss/components/tooltip-box.scss
similarity index 100%
rename from ui/css/src/scss/components/tooltip-box.scss
rename to ui/legacy/css/src/scss/components/tooltip-box.scss
diff --git a/ui/css/src/scss/components/tooltip-info.scss b/ui/legacy/css/src/scss/components/tooltip-info.scss
similarity index 100%
rename from ui/css/src/scss/components/tooltip-info.scss
rename to ui/legacy/css/src/scss/components/tooltip-info.scss
diff --git a/ui/css/src/scss/components/treeview.scss b/ui/legacy/css/src/scss/components/treeview.scss
similarity index 100%
rename from ui/css/src/scss/components/treeview.scss
rename to ui/legacy/css/src/scss/components/treeview.scss
diff --git a/ui/css/src/scss/components/upload-volume.scss b/ui/legacy/css/src/scss/components/upload-volume.scss
similarity index 100%
rename from ui/css/src/scss/components/upload-volume.scss
rename to ui/legacy/css/src/scss/components/upload-volume.scss
diff --git a/ui/css/src/scss/components/user.scss b/ui/legacy/css/src/scss/components/user.scss
similarity index 100%
rename from ui/css/src/scss/components/user.scss
rename to ui/legacy/css/src/scss/components/user.scss
diff --git a/ui/css/src/scss/components/view-switcher.scss b/ui/legacy/css/src/scss/components/view-switcher.scss
similarity index 100%
rename from ui/css/src/scss/components/view-switcher.scss
rename to ui/legacy/css/src/scss/components/view-switcher.scss
diff --git a/ui/css/src/scss/components/view.scss b/ui/legacy/css/src/scss/components/view.scss
similarity index 100%
rename from ui/css/src/scss/components/view.scss
rename to ui/legacy/css/src/scss/components/view.scss
diff --git a/ui/css/src/scss/components/vpc-chart.scss b/ui/legacy/css/src/scss/components/vpc-chart.scss
similarity index 100%
rename from ui/css/src/scss/components/vpc-chart.scss
rename to ui/legacy/css/src/scss/components/vpc-chart.scss
diff --git a/ui/css/src/scss/components/zone-filter.scss b/ui/legacy/css/src/scss/components/zone-filter.scss
similarity index 100%
rename from ui/css/src/scss/components/zone-filter.scss
rename to ui/legacy/css/src/scss/components/zone-filter.scss
diff --git a/ui/css/src/scss/custom.scss b/ui/legacy/css/src/scss/custom.scss
similarity index 100%
rename from ui/css/src/scss/custom.scss
rename to ui/legacy/css/src/scss/custom.scss
diff --git a/ui/css/src/scss/frame/wrapper-elements.scss b/ui/legacy/css/src/scss/frame/wrapper-elements.scss
similarity index 100%
rename from ui/css/src/scss/frame/wrapper-elements.scss
rename to ui/legacy/css/src/scss/frame/wrapper-elements.scss
diff --git a/ui/css/src/scss/languages/hungarian.scss b/ui/legacy/css/src/scss/languages/hungarian.scss
similarity index 100%
rename from ui/css/src/scss/languages/hungarian.scss
rename to ui/legacy/css/src/scss/languages/hungarian.scss
diff --git a/ui/css/src/scss/languages/japanese.scss b/ui/legacy/css/src/scss/languages/japanese.scss
similarity index 100%
rename from ui/css/src/scss/languages/japanese.scss
rename to ui/legacy/css/src/scss/languages/japanese.scss
diff --git a/ui/css/src/scss/licences/AL-css.scss b/ui/legacy/css/src/scss/licences/AL-css.scss
similarity index 100%
rename from ui/css/src/scss/licences/AL-css.scss
rename to ui/legacy/css/src/scss/licences/AL-css.scss
diff --git a/ui/css/src/scss/objects/form-elements.scss b/ui/legacy/css/src/scss/objects/form-elements.scss
similarity index 100%
rename from ui/css/src/scss/objects/form-elements.scss
rename to ui/legacy/css/src/scss/objects/form-elements.scss
diff --git a/ui/css/src/scss/objects/links.scss b/ui/legacy/css/src/scss/objects/links.scss
similarity index 100%
rename from ui/css/src/scss/objects/links.scss
rename to ui/legacy/css/src/scss/objects/links.scss
diff --git a/ui/css/src/scss/objects/table.scss b/ui/legacy/css/src/scss/objects/table.scss
similarity index 100%
rename from ui/css/src/scss/objects/table.scss
rename to ui/legacy/css/src/scss/objects/table.scss
diff --git a/ui/css/src/scss/variables/z-index.scss b/ui/legacy/css/src/scss/variables/z-index.scss
similarity index 100%
rename from ui/css/src/scss/variables/z-index.scss
rename to ui/legacy/css/src/scss/variables/z-index.scss
diff --git a/ui/images/ajax-loader-small.gif b/ui/legacy/images/ajax-loader-small.gif
similarity index 100%
rename from ui/images/ajax-loader-small.gif
rename to ui/legacy/images/ajax-loader-small.gif
Binary files differ
diff --git a/ui/images/ajax-loader.gif b/ui/legacy/images/ajax-loader.gif
similarity index 100%
rename from ui/images/ajax-loader.gif
rename to ui/legacy/images/ajax-loader.gif
Binary files differ
diff --git a/ui/images/bg-breadcrumb-project-view.png b/ui/legacy/images/bg-breadcrumb-project-view.png
similarity index 100%
rename from ui/images/bg-breadcrumb-project-view.png
rename to ui/legacy/images/bg-breadcrumb-project-view.png
Binary files differ
diff --git a/ui/images/bg-breadcrumb.png b/ui/legacy/images/bg-breadcrumb.png
similarity index 100%
rename from ui/images/bg-breadcrumb.png
rename to ui/legacy/images/bg-breadcrumb.png
Binary files differ
diff --git a/ui/images/bg-breadcrumbs-project-view.png b/ui/legacy/images/bg-breadcrumbs-project-view.png
similarity index 100%
rename from ui/images/bg-breadcrumbs-project-view.png
rename to ui/legacy/images/bg-breadcrumbs-project-view.png
Binary files differ
diff --git a/ui/images/bg-breadcrumbs.png b/ui/legacy/images/bg-breadcrumbs.png
similarity index 100%
rename from ui/images/bg-breadcrumbs.png
rename to ui/legacy/images/bg-breadcrumbs.png
Binary files differ
diff --git a/ui/images/bg-button-view-more.png b/ui/legacy/images/bg-button-view-more.png
similarity index 100%
rename from ui/images/bg-button-view-more.png
rename to ui/legacy/images/bg-button-view-more.png
Binary files differ
diff --git a/ui/images/bg-details-tab-gradient.png b/ui/legacy/images/bg-details-tab-gradient.png
similarity index 100%
rename from ui/images/bg-details-tab-gradient.png
rename to ui/legacy/images/bg-details-tab-gradient.png
Binary files differ
diff --git a/ui/images/bg-dialog-body.png b/ui/legacy/images/bg-dialog-body.png
similarity index 100%
rename from ui/images/bg-dialog-body.png
rename to ui/legacy/images/bg-dialog-body.png
Binary files differ
diff --git a/ui/images/bg-dialog-header.png b/ui/legacy/images/bg-dialog-header.png
similarity index 100%
rename from ui/images/bg-dialog-header.png
rename to ui/legacy/images/bg-dialog-header.png
Binary files differ
diff --git a/ui/images/bg-gradient-white-transparent.png b/ui/legacy/images/bg-gradient-white-transparent.png
similarity index 100%
rename from ui/images/bg-gradient-white-transparent.png
rename to ui/legacy/images/bg-gradient-white-transparent.png
Binary files differ
diff --git a/ui/images/bg-gradients.png b/ui/legacy/images/bg-gradients.png
similarity index 100%
rename from ui/images/bg-gradients.png
rename to ui/legacy/images/bg-gradients.png
Binary files differ
diff --git a/ui/images/bg-header.png b/ui/legacy/images/bg-header.png
similarity index 100%
rename from ui/images/bg-header.png
rename to ui/legacy/images/bg-header.png
Binary files differ
diff --git a/ui/images/bg-install-wizard-header.jpg b/ui/legacy/images/bg-install-wizard-header.jpg
similarity index 100%
rename from ui/images/bg-install-wizard-header.jpg
rename to ui/legacy/images/bg-install-wizard-header.jpg
Binary files differ
diff --git a/ui/images/bg-install-wizard-header.png b/ui/legacy/images/bg-install-wizard-header.png
similarity index 100%
rename from ui/images/bg-install-wizard-header.png
rename to ui/legacy/images/bg-install-wizard-header.png
Binary files differ
diff --git a/ui/images/bg-login.jpg b/ui/legacy/images/bg-login.jpg
similarity index 100%
rename from ui/images/bg-login.jpg
rename to ui/legacy/images/bg-login.jpg
Binary files differ
diff --git a/ui/images/bg-login.png b/ui/legacy/images/bg-login.png
similarity index 100%
rename from ui/images/bg-login.png
rename to ui/legacy/images/bg-login.png
Binary files differ
diff --git a/ui/images/bg-naas.png b/ui/legacy/images/bg-naas.png
similarity index 100%
rename from ui/images/bg-naas.png
rename to ui/legacy/images/bg-naas.png
Binary files differ
diff --git a/ui/images/bg-nav-item-active-project-view.png b/ui/legacy/images/bg-nav-item-active-project-view.png
similarity index 100%
rename from ui/images/bg-nav-item-active-project-view.png
rename to ui/legacy/images/bg-nav-item-active-project-view.png
Binary files differ
diff --git a/ui/images/bg-nav-item-active.png b/ui/legacy/images/bg-nav-item-active.png
similarity index 100%
rename from ui/images/bg-nav-item-active.png
rename to ui/legacy/images/bg-nav-item-active.png
Binary files differ
diff --git a/ui/images/bg-nav-item-project-view.png b/ui/legacy/images/bg-nav-item-project-view.png
similarity index 100%
rename from ui/images/bg-nav-item-project-view.png
rename to ui/legacy/images/bg-nav-item-project-view.png
Binary files differ
diff --git a/ui/images/bg-nav-item.png b/ui/legacy/images/bg-nav-item.png
similarity index 100%
rename from ui/images/bg-nav-item.png
rename to ui/legacy/images/bg-nav-item.png
Binary files differ
diff --git a/ui/images/bg-network-nat.png b/ui/legacy/images/bg-network-nat.png
similarity index 100%
rename from ui/images/bg-network-nat.png
rename to ui/legacy/images/bg-network-nat.png
Binary files differ
diff --git a/ui/images/bg-network.png b/ui/legacy/images/bg-network.png
similarity index 100%
rename from ui/images/bg-network.png
rename to ui/legacy/images/bg-network.png
Binary files differ
diff --git a/ui/images/bg-notifications.png b/ui/legacy/images/bg-notifications.png
similarity index 100%
rename from ui/images/bg-notifications.png
rename to ui/legacy/images/bg-notifications.png
Binary files differ
diff --git a/ui/images/bg-panel-shadow.png b/ui/legacy/images/bg-panel-shadow.png
similarity index 100%
rename from ui/images/bg-panel-shadow.png
rename to ui/legacy/images/bg-panel-shadow.png
Binary files differ
diff --git a/ui/images/bg-section-switcher.png b/ui/legacy/images/bg-section-switcher.png
similarity index 100%
rename from ui/images/bg-section-switcher.png
rename to ui/legacy/images/bg-section-switcher.png
Binary files differ
diff --git a/ui/images/bg-status_box.png b/ui/legacy/images/bg-status_box.png
similarity index 100%
rename from ui/images/bg-status_box.png
rename to ui/legacy/images/bg-status_box.png
Binary files differ
diff --git a/ui/images/bg-system-chart-compute.png b/ui/legacy/images/bg-system-chart-compute.png
similarity index 100%
rename from ui/images/bg-system-chart-compute.png
rename to ui/legacy/images/bg-system-chart-compute.png
Binary files differ
diff --git a/ui/images/bg-system-chart-lines.png b/ui/legacy/images/bg-system-chart-lines.png
similarity index 100%
rename from ui/images/bg-system-chart-lines.png
rename to ui/legacy/images/bg-system-chart-lines.png
Binary files differ
diff --git a/ui/images/bg-system-network-traffic.png b/ui/legacy/images/bg-system-network-traffic.png
similarity index 100%
rename from ui/images/bg-system-network-traffic.png
rename to ui/legacy/images/bg-system-network-traffic.png
Binary files differ
diff --git a/ui/images/bg-table-head.png b/ui/legacy/images/bg-table-head.png
similarity index 100%
rename from ui/images/bg-table-head.png
rename to ui/legacy/images/bg-table-head.png
Binary files differ
diff --git a/ui/images/bg-transparent-white.png b/ui/legacy/images/bg-transparent-white.png
similarity index 100%
rename from ui/images/bg-transparent-white.png
rename to ui/legacy/images/bg-transparent-white.png
Binary files differ
diff --git a/ui/images/bg-what-is-cloudstack.png b/ui/legacy/images/bg-what-is-cloudstack.png
similarity index 100%
rename from ui/images/bg-what-is-cloudstack.png
rename to ui/legacy/images/bg-what-is-cloudstack.png
Binary files differ
diff --git a/ui/images/buttons.png b/ui/legacy/images/buttons.png
similarity index 100%
rename from ui/images/buttons.png
rename to ui/legacy/images/buttons.png
Binary files differ
diff --git a/ui/images/cloud.ico b/ui/legacy/images/cloud.ico
similarity index 100%
rename from ui/images/cloud.ico
rename to ui/legacy/images/cloud.ico
Binary files differ
diff --git a/ui/images/destroy-anim.gif b/ui/legacy/images/destroy-anim.gif
similarity index 100%
rename from ui/images/destroy-anim.gif
rename to ui/legacy/images/destroy-anim.gif
Binary files differ
diff --git a/ui/images/exportCsvIcon.png b/ui/legacy/images/exportCsvIcon.png
similarity index 100%
rename from ui/images/exportCsvIcon.png
rename to ui/legacy/images/exportCsvIcon.png
Binary files differ
diff --git a/ui/images/gradients.png b/ui/legacy/images/gradients.png
similarity index 100%
rename from ui/images/gradients.png
rename to ui/legacy/images/gradients.png
Binary files differ
diff --git a/ui/images/header-gradient.png b/ui/legacy/images/header-gradient.png
similarity index 100%
rename from ui/images/header-gradient.png
rename to ui/legacy/images/header-gradient.png
Binary files differ
diff --git a/ui/images/icons.png b/ui/legacy/images/icons.png
similarity index 100%
rename from ui/images/icons.png
rename to ui/legacy/images/icons.png
Binary files differ
diff --git a/ui/images/infrastructure-icons.png b/ui/legacy/images/infrastructure-icons.png
similarity index 100%
rename from ui/images/infrastructure-icons.png
rename to ui/legacy/images/infrastructure-icons.png
Binary files differ
diff --git a/ui/images/install-wizard-parts.png b/ui/legacy/images/install-wizard-parts.png
similarity index 100%
rename from ui/images/install-wizard-parts.png
rename to ui/legacy/images/install-wizard-parts.png
Binary files differ
diff --git a/ui/images/instance-wizard-parts.png b/ui/legacy/images/instance-wizard-parts.png
similarity index 100%
rename from ui/images/instance-wizard-parts.png
rename to ui/legacy/images/instance-wizard-parts.png
Binary files differ
diff --git a/ui/images/logo-login-oss.png b/ui/legacy/images/logo-login-oss.png
similarity index 100%
rename from ui/images/logo-login-oss.png
rename to ui/legacy/images/logo-login-oss.png
Binary files differ
diff --git a/ui/images/logo.png b/ui/legacy/images/logo.png
similarity index 100%
rename from ui/images/logo.png
rename to ui/legacy/images/logo.png
Binary files differ
diff --git a/ui/images/minus.png b/ui/legacy/images/minus.png
similarity index 100%
rename from ui/images/minus.png
rename to ui/legacy/images/minus.png
Binary files differ
diff --git a/ui/images/overlay-pattern.png b/ui/legacy/images/overlay-pattern.png
similarity index 100%
rename from ui/images/overlay-pattern.png
rename to ui/legacy/images/overlay-pattern.png
Binary files differ
diff --git a/ui/images/sample-project-view.png b/ui/legacy/images/sample-project-view.png
similarity index 100%
rename from ui/images/sample-project-view.png
rename to ui/legacy/images/sample-project-view.png
Binary files differ
diff --git a/ui/images/sprites.png b/ui/legacy/images/sprites.png
similarity index 100%
rename from ui/images/sprites.png
rename to ui/legacy/images/sprites.png
Binary files differ
diff --git a/ui/images/vm-instance-screen-sample.png b/ui/legacy/images/vm-instance-screen-sample.png
similarity index 100%
rename from ui/images/vm-instance-screen-sample.png
rename to ui/legacy/images/vm-instance-screen-sample.png
Binary files differ
diff --git a/ui/legacy/index.html b/ui/legacy/index.html
new file mode 100644
index 0000000..a0f6559
--- /dev/null
+++ b/ui/legacy/index.html
@@ -0,0 +1,1998 @@
+<!--
+     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
new file mode 100644
index 0000000..d45f6dc
--- /dev/null
+++ b/ui/legacy/l10n/ar.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..1992040
--- /dev/null
+++ b/ui/legacy/l10n/ca.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..cfa2811
--- /dev/null
+++ b/ui/legacy/l10n/de_DE.js
@@ -0,0 +1,2315 @@
+// 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
new file mode 100644
index 0000000..866b067
--- /dev/null
+++ b/ui/legacy/l10n/en.js
@@ -0,0 +1,2492 @@
+// 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
new file mode 100644
index 0000000..7772cdb
--- /dev/null
+++ b/ui/legacy/l10n/es.js
@@ -0,0 +1,2313 @@
+// 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
new file mode 100644
index 0000000..988f6a4
--- /dev/null
+++ b/ui/legacy/l10n/fr_FR.js
@@ -0,0 +1,2314 @@
+// 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
new file mode 100644
index 0000000..ad16519
--- /dev/null
+++ b/ui/legacy/l10n/hu.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..37da3f9
--- /dev/null
+++ b/ui/legacy/l10n/it_IT.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..b3d114b
--- /dev/null
+++ b/ui/legacy/l10n/ja_JP.js
@@ -0,0 +1,2316 @@
+// 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
new file mode 100644
index 0000000..e2f66c6
--- /dev/null
+++ b/ui/legacy/l10n/ko_KR.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..ce3a257
--- /dev/null
+++ b/ui/legacy/l10n/nb_NO.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..b3f3733
--- /dev/null
+++ b/ui/legacy/l10n/nl_NL.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..7262ced
--- /dev/null
+++ b/ui/legacy/l10n/pl.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..13ca563
--- /dev/null
+++ b/ui/legacy/l10n/pt_BR.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..a3485a5
--- /dev/null
+++ b/ui/legacy/l10n/ru_RU.js
@@ -0,0 +1,2312 @@
+// 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
new file mode 100644
index 0000000..f78083c
--- /dev/null
+++ b/ui/legacy/l10n/zh_CN.js
@@ -0,0 +1,2316 @@
+// 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/lib/date.js b/ui/legacy/lib/date.js
similarity index 100%
rename from ui/lib/date.js
rename to ui/legacy/lib/date.js
diff --git a/ui/lib/excanvas.js b/ui/legacy/lib/excanvas.js
similarity index 100%
rename from ui/lib/excanvas.js
rename to ui/legacy/lib/excanvas.js
diff --git a/ui/lib/flot/jquery.colorhelpers.js b/ui/legacy/lib/flot/jquery.colorhelpers.js
similarity index 100%
rename from ui/lib/flot/jquery.colorhelpers.js
rename to ui/legacy/lib/flot/jquery.colorhelpers.js
diff --git a/ui/lib/flot/jquery.flot.crosshair.js b/ui/legacy/lib/flot/jquery.flot.crosshair.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.crosshair.js
rename to ui/legacy/lib/flot/jquery.flot.crosshair.js
diff --git a/ui/lib/flot/jquery.flot.fillbetween.js b/ui/legacy/lib/flot/jquery.flot.fillbetween.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.fillbetween.js
rename to ui/legacy/lib/flot/jquery.flot.fillbetween.js
diff --git a/ui/lib/flot/jquery.flot.image.js b/ui/legacy/lib/flot/jquery.flot.image.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.image.js
rename to ui/legacy/lib/flot/jquery.flot.image.js
diff --git a/ui/lib/flot/jquery.flot.js b/ui/legacy/lib/flot/jquery.flot.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.js
rename to ui/legacy/lib/flot/jquery.flot.js
diff --git a/ui/lib/flot/jquery.flot.navigate.js b/ui/legacy/lib/flot/jquery.flot.navigate.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.navigate.js
rename to ui/legacy/lib/flot/jquery.flot.navigate.js
diff --git a/ui/lib/flot/jquery.flot.pie.js b/ui/legacy/lib/flot/jquery.flot.pie.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.pie.js
rename to ui/legacy/lib/flot/jquery.flot.pie.js
diff --git a/ui/lib/flot/jquery.flot.resize.js b/ui/legacy/lib/flot/jquery.flot.resize.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.resize.js
rename to ui/legacy/lib/flot/jquery.flot.resize.js
diff --git a/ui/lib/flot/jquery.flot.selection.js b/ui/legacy/lib/flot/jquery.flot.selection.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.selection.js
rename to ui/legacy/lib/flot/jquery.flot.selection.js
diff --git a/ui/lib/flot/jquery.flot.stack.js b/ui/legacy/lib/flot/jquery.flot.stack.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.stack.js
rename to ui/legacy/lib/flot/jquery.flot.stack.js
diff --git a/ui/lib/flot/jquery.flot.symbol.js b/ui/legacy/lib/flot/jquery.flot.symbol.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.symbol.js
rename to ui/legacy/lib/flot/jquery.flot.symbol.js
diff --git a/ui/lib/flot/jquery.flot.threshold.js b/ui/legacy/lib/flot/jquery.flot.threshold.js
similarity index 100%
rename from ui/lib/flot/jquery.flot.threshold.js
rename to ui/legacy/lib/flot/jquery.flot.threshold.js
diff --git a/ui/lib/jquery-ui/css/jquery-ui.css b/ui/legacy/lib/jquery-ui/css/jquery-ui.css
similarity index 100%
rename from ui/lib/jquery-ui/css/jquery-ui.css
rename to ui/legacy/lib/jquery-ui/css/jquery-ui.css
diff --git a/ui/lib/jquery-ui/js/jquery-ui.js b/ui/legacy/lib/jquery-ui/js/jquery-ui.js
similarity index 100%
rename from ui/lib/jquery-ui/js/jquery-ui.js
rename to ui/legacy/lib/jquery-ui/js/jquery-ui.js
diff --git a/ui/lib/jquery.cookies.js b/ui/legacy/lib/jquery.cookies.js
similarity index 100%
rename from ui/lib/jquery.cookies.js
rename to ui/legacy/lib/jquery.cookies.js
diff --git a/ui/lib/jquery.easing.js b/ui/legacy/lib/jquery.easing.js
similarity index 100%
rename from ui/lib/jquery.easing.js
rename to ui/legacy/lib/jquery.easing.js
diff --git a/ui/lib/jquery.js b/ui/legacy/lib/jquery.js
similarity index 100%
rename from ui/lib/jquery.js
rename to ui/legacy/lib/jquery.js
diff --git a/ui/lib/jquery.md5.js b/ui/legacy/lib/jquery.md5.js
similarity index 100%
rename from ui/lib/jquery.md5.js
rename to ui/legacy/lib/jquery.md5.js
diff --git a/ui/lib/jquery.tokeninput.js b/ui/legacy/lib/jquery.tokeninput.js
similarity index 100%
rename from ui/lib/jquery.tokeninput.js
rename to ui/legacy/lib/jquery.tokeninput.js
diff --git a/ui/lib/jquery.validate.additional-methods.js b/ui/legacy/lib/jquery.validate.additional-methods.js
similarity index 100%
rename from ui/lib/jquery.validate.additional-methods.js
rename to ui/legacy/lib/jquery.validate.additional-methods.js
diff --git a/ui/lib/jquery.validate.js b/ui/legacy/lib/jquery.validate.js
similarity index 100%
rename from ui/lib/jquery.validate.js
rename to ui/legacy/lib/jquery.validate.js
diff --git a/ui/lib/qunit/qunit.css b/ui/legacy/lib/qunit/qunit.css
similarity index 100%
rename from ui/lib/qunit/qunit.css
rename to ui/legacy/lib/qunit/qunit.css
diff --git a/ui/lib/qunit/qunit.js b/ui/legacy/lib/qunit/qunit.js
similarity index 100%
rename from ui/lib/qunit/qunit.js
rename to ui/legacy/lib/qunit/qunit.js
diff --git a/ui/lib/require.js b/ui/legacy/lib/require.js
similarity index 100%
rename from ui/lib/require.js
rename to ui/legacy/lib/require.js
diff --git a/ui/lib/reset.css b/ui/legacy/lib/reset.css
similarity index 100%
rename from ui/lib/reset.css
rename to ui/legacy/lib/reset.css
diff --git a/ui/modules/infrastructure/infrastructure.css b/ui/legacy/modules/infrastructure/infrastructure.css
similarity index 100%
rename from ui/modules/infrastructure/infrastructure.css
rename to ui/legacy/modules/infrastructure/infrastructure.css
diff --git a/ui/modules/infrastructure/infrastructure.js b/ui/legacy/modules/infrastructure/infrastructure.js
similarity index 100%
rename from ui/modules/infrastructure/infrastructure.js
rename to ui/legacy/modules/infrastructure/infrastructure.js
diff --git a/ui/modules/modules.js b/ui/legacy/modules/modules.js
similarity index 100%
rename from ui/modules/modules.js
rename to ui/legacy/modules/modules.js
diff --git a/ui/modules/vnmcAsa1000v/vnmcAsa1000v.css b/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.css
similarity index 100%
rename from ui/modules/vnmcAsa1000v/vnmcAsa1000v.css
rename to ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.css
diff --git a/ui/modules/vnmcAsa1000v/vnmcAsa1000v.js b/ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.js
similarity index 100%
rename from ui/modules/vnmcAsa1000v/vnmcAsa1000v.js
rename to ui/legacy/modules/vnmcAsa1000v/vnmcAsa1000v.js
diff --git a/ui/modules/vnmcNetworkProvider/vnmcNetworkProvider.css b/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.css
similarity index 100%
rename from ui/modules/vnmcNetworkProvider/vnmcNetworkProvider.css
rename to ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.css
diff --git a/ui/modules/vnmcNetworkProvider/vnmcNetworkProvider.js b/ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.js
similarity index 100%
rename from ui/modules/vnmcNetworkProvider/vnmcNetworkProvider.js
rename to ui/legacy/modules/vnmcNetworkProvider/vnmcNetworkProvider.js
diff --git a/ui/modules/vpc/vpc.css b/ui/legacy/modules/vpc/vpc.css
similarity index 100%
rename from ui/modules/vpc/vpc.css
rename to ui/legacy/modules/vpc/vpc.css
diff --git a/ui/modules/vpc/vpc.js b/ui/legacy/modules/vpc/vpc.js
similarity index 100%
rename from ui/modules/vpc/vpc.js
rename to ui/legacy/modules/vpc/vpc.js
diff --git a/ui/plugins/cks/cks.css b/ui/legacy/plugins/cks/cks.css
similarity index 100%
rename from ui/plugins/cks/cks.css
rename to ui/legacy/plugins/cks/cks.css
diff --git a/ui/plugins/cks/cks.js b/ui/legacy/plugins/cks/cks.js
similarity index 100%
rename from ui/plugins/cks/cks.js
rename to ui/legacy/plugins/cks/cks.js
diff --git a/ui/plugins/cks/config.js b/ui/legacy/plugins/cks/config.js
similarity index 100%
rename from ui/plugins/cks/config.js
rename to ui/legacy/plugins/cks/config.js
diff --git a/ui/plugins/cks/icon.png b/ui/legacy/plugins/cks/icon.png
similarity index 100%
rename from ui/plugins/cks/icon.png
rename to ui/legacy/plugins/cks/icon.png
Binary files differ
diff --git a/ui/plugins/cloudian/cloudian.css b/ui/legacy/plugins/cloudian/cloudian.css
similarity index 100%
rename from ui/plugins/cloudian/cloudian.css
rename to ui/legacy/plugins/cloudian/cloudian.css
diff --git a/ui/plugins/cloudian/cloudian.js b/ui/legacy/plugins/cloudian/cloudian.js
similarity index 100%
rename from ui/plugins/cloudian/cloudian.js
rename to ui/legacy/plugins/cloudian/cloudian.js
diff --git a/ui/plugins/cloudian/config.js b/ui/legacy/plugins/cloudian/config.js
similarity index 100%
rename from ui/plugins/cloudian/config.js
rename to ui/legacy/plugins/cloudian/config.js
diff --git a/ui/plugins/cloudian/icon.png b/ui/legacy/plugins/cloudian/icon.png
similarity index 100%
rename from ui/plugins/cloudian/icon.png
rename to ui/legacy/plugins/cloudian/icon.png
Binary files differ
diff --git a/ui/plugins/plugins.js b/ui/legacy/plugins/plugins.js
similarity index 100%
rename from ui/plugins/plugins.js
rename to ui/legacy/plugins/plugins.js
diff --git a/ui/plugins/quota/config.js b/ui/legacy/plugins/quota/config.js
similarity index 100%
rename from ui/plugins/quota/config.js
rename to ui/legacy/plugins/quota/config.js
diff --git a/ui/plugins/quota/icon.png b/ui/legacy/plugins/quota/icon.png
similarity index 100%
rename from ui/plugins/quota/icon.png
rename to ui/legacy/plugins/quota/icon.png
Binary files differ
diff --git a/ui/plugins/quota/quota.css b/ui/legacy/plugins/quota/quota.css
similarity index 100%
rename from ui/plugins/quota/quota.css
rename to ui/legacy/plugins/quota/quota.css
diff --git a/ui/plugins/quota/quota.js b/ui/legacy/plugins/quota/quota.js
similarity index 100%
rename from ui/plugins/quota/quota.js
rename to ui/legacy/plugins/quota/quota.js
diff --git a/ui/plugins/testPlugin/config.js b/ui/legacy/plugins/testPlugin/config.js
similarity index 100%
rename from ui/plugins/testPlugin/config.js
rename to ui/legacy/plugins/testPlugin/config.js
diff --git a/ui/plugins/testPlugin/icon.png b/ui/legacy/plugins/testPlugin/icon.png
similarity index 100%
rename from ui/plugins/testPlugin/icon.png
rename to ui/legacy/plugins/testPlugin/icon.png
Binary files differ
diff --git a/ui/plugins/testPlugin/testPlugin.css b/ui/legacy/plugins/testPlugin/testPlugin.css
similarity index 100%
rename from ui/plugins/testPlugin/testPlugin.css
rename to ui/legacy/plugins/testPlugin/testPlugin.css
diff --git a/ui/plugins/testPlugin/testPlugin.js b/ui/legacy/plugins/testPlugin/testPlugin.js
similarity index 100%
rename from ui/plugins/testPlugin/testPlugin.js
rename to ui/legacy/plugins/testPlugin/testPlugin.js
diff --git a/ui/scripts/accounts.js b/ui/legacy/scripts/accounts.js
similarity index 100%
rename from ui/scripts/accounts.js
rename to ui/legacy/scripts/accounts.js
diff --git a/ui/scripts/accountsWizard.js b/ui/legacy/scripts/accountsWizard.js
similarity index 100%
rename from ui/scripts/accountsWizard.js
rename to ui/legacy/scripts/accountsWizard.js
diff --git a/ui/scripts/affinity.js b/ui/legacy/scripts/affinity.js
similarity index 100%
rename from ui/scripts/affinity.js
rename to ui/legacy/scripts/affinity.js
diff --git a/ui/scripts/autoscaler.js b/ui/legacy/scripts/autoscaler.js
similarity index 100%
rename from ui/scripts/autoscaler.js
rename to ui/legacy/scripts/autoscaler.js
diff --git a/ui/scripts/cloud.core.callbacks.js b/ui/legacy/scripts/cloud.core.callbacks.js
similarity index 100%
rename from ui/scripts/cloud.core.callbacks.js
rename to ui/legacy/scripts/cloud.core.callbacks.js
diff --git a/ui/legacy/scripts/cloudStack.js b/ui/legacy/scripts/cloudStack.js
new file mode 100644
index 0000000..9e01271
--- /dev/null
+++ b/ui/legacy/scripts/cloudStack.js
@@ -0,0 +1,546 @@
+// 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
new file mode 100644
index 0000000..c20c4ac
--- /dev/null
+++ b/ui/legacy/scripts/configuration.js
@@ -0,0 +1,6004 @@
+// 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/scripts/dashboard.js b/ui/legacy/scripts/dashboard.js
similarity index 100%
rename from ui/scripts/dashboard.js
rename to ui/legacy/scripts/dashboard.js
diff --git a/ui/legacy/scripts/docs.js b/ui/legacy/scripts/docs.js
new file mode 100755
index 0000000..504a7a2
--- /dev/null
+++ b/ui/legacy/scripts/docs.js
@@ -0,0 +1,1417 @@
+// 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/scripts/domains.js b/ui/legacy/scripts/domains.js
similarity index 100%
rename from ui/scripts/domains.js
rename to ui/legacy/scripts/domains.js
diff --git a/ui/scripts/events.js b/ui/legacy/scripts/events.js
similarity index 100%
rename from ui/scripts/events.js
rename to ui/legacy/scripts/events.js
diff --git a/ui/scripts/globalSettings.js b/ui/legacy/scripts/globalSettings.js
similarity index 100%
rename from ui/scripts/globalSettings.js
rename to ui/legacy/scripts/globalSettings.js
diff --git a/ui/scripts/installWizard.js b/ui/legacy/scripts/installWizard.js
similarity index 100%
rename from ui/scripts/installWizard.js
rename to ui/legacy/scripts/installWizard.js
diff --git a/ui/legacy/scripts/instanceWizard.js b/ui/legacy/scripts/instanceWizard.js
new file mode 100644
index 0000000..466db99
--- /dev/null
+++ b/ui/legacy/scripts/instanceWizard.js
@@ -0,0 +1,1463 @@
+// 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
new file mode 100644
index 0000000..0a9e025
--- /dev/null
+++ b/ui/legacy/scripts/instances.js
@@ -0,0 +1,4258 @@
+// 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/scripts/lbCertificatePolicy.js b/ui/legacy/scripts/lbCertificatePolicy.js
similarity index 100%
rename from ui/scripts/lbCertificatePolicy.js
rename to ui/legacy/scripts/lbCertificatePolicy.js
diff --git a/ui/scripts/lbStickyPolicy.js b/ui/legacy/scripts/lbStickyPolicy.js
similarity index 100%
rename from ui/scripts/lbStickyPolicy.js
rename to ui/legacy/scripts/lbStickyPolicy.js
diff --git a/ui/scripts/metrics.js b/ui/legacy/scripts/metrics.js
similarity index 100%
rename from ui/scripts/metrics.js
rename to ui/legacy/scripts/metrics.js
diff --git a/ui/legacy/scripts/network.js b/ui/legacy/scripts/network.js
new file mode 100644
index 0000000..47e9e3d
--- /dev/null
+++ b/ui/legacy/scripts/network.js
@@ -0,0 +1,7124 @@
+// 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/scripts/plugins.js b/ui/legacy/scripts/plugins.js
similarity index 100%
rename from ui/scripts/plugins.js
rename to ui/legacy/scripts/plugins.js
diff --git a/ui/scripts/postLoad.js b/ui/legacy/scripts/postLoad.js
similarity index 100%
rename from ui/scripts/postLoad.js
rename to ui/legacy/scripts/postLoad.js
diff --git a/ui/scripts/projects.js b/ui/legacy/scripts/projects.js
similarity index 100%
rename from ui/scripts/projects.js
rename to ui/legacy/scripts/projects.js
diff --git a/ui/scripts/regions.js b/ui/legacy/scripts/regions.js
similarity index 100%
rename from ui/scripts/regions.js
rename to ui/legacy/scripts/regions.js
diff --git a/ui/scripts/roles.js b/ui/legacy/scripts/roles.js
similarity index 100%
rename from ui/scripts/roles.js
rename to ui/legacy/scripts/roles.js
diff --git a/ui/legacy/scripts/sharedFunctions.js b/ui/legacy/scripts/sharedFunctions.js
new file mode 100644
index 0000000..3ded990
--- /dev/null
+++ b/ui/legacy/scripts/sharedFunctions.js
@@ -0,0 +1,3200 @@
+// 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
new file mode 100644
index 0000000..65ae293
--- /dev/null
+++ b/ui/legacy/scripts/storage.js
@@ -0,0 +1,3246 @@
+// 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
new file mode 100755
index 0000000..ca0eb7e
--- /dev/null
+++ b/ui/legacy/scripts/system.js
@@ -0,0 +1,23224 @@
+// 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
new file mode 100644
index 0000000..8c9ff62
--- /dev/null
+++ b/ui/legacy/scripts/templates.js
@@ -0,0 +1,4216 @@
+// 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/scripts/ui-custom/accountsWizard.js b/ui/legacy/scripts/ui-custom/accountsWizard.js
similarity index 100%
rename from ui/scripts/ui-custom/accountsWizard.js
rename to ui/legacy/scripts/ui-custom/accountsWizard.js
diff --git a/ui/scripts/ui-custom/affinity.js b/ui/legacy/scripts/ui-custom/affinity.js
similarity index 100%
rename from ui/scripts/ui-custom/affinity.js
rename to ui/legacy/scripts/ui-custom/affinity.js
diff --git a/ui/scripts/ui-custom/autoscaler.js b/ui/legacy/scripts/ui-custom/autoscaler.js
similarity index 100%
rename from ui/scripts/ui-custom/autoscaler.js
rename to ui/legacy/scripts/ui-custom/autoscaler.js
diff --git a/ui/scripts/ui-custom/backupSchedule.js b/ui/legacy/scripts/ui-custom/backupSchedule.js
similarity index 100%
rename from ui/scripts/ui-custom/backupSchedule.js
rename to ui/legacy/scripts/ui-custom/backupSchedule.js
diff --git a/ui/scripts/ui-custom/copyTemplate.js b/ui/legacy/scripts/ui-custom/copyTemplate.js
similarity index 100%
rename from ui/scripts/ui-custom/copyTemplate.js
rename to ui/legacy/scripts/ui-custom/copyTemplate.js
diff --git a/ui/scripts/ui-custom/dashboard.js b/ui/legacy/scripts/ui-custom/dashboard.js
similarity index 100%
rename from ui/scripts/ui-custom/dashboard.js
rename to ui/legacy/scripts/ui-custom/dashboard.js
diff --git a/ui/scripts/ui-custom/enableStaticNAT.js b/ui/legacy/scripts/ui-custom/enableStaticNAT.js
similarity index 100%
rename from ui/scripts/ui-custom/enableStaticNAT.js
rename to ui/legacy/scripts/ui-custom/enableStaticNAT.js
diff --git a/ui/scripts/ui-custom/granularSettings.js b/ui/legacy/scripts/ui-custom/granularSettings.js
similarity index 100%
rename from ui/scripts/ui-custom/granularSettings.js
rename to ui/legacy/scripts/ui-custom/granularSettings.js
diff --git a/ui/scripts/ui-custom/healthCheck.js b/ui/legacy/scripts/ui-custom/healthCheck.js
similarity index 100%
rename from ui/scripts/ui-custom/healthCheck.js
rename to ui/legacy/scripts/ui-custom/healthCheck.js
diff --git a/ui/scripts/ui-custom/installWizard.js b/ui/legacy/scripts/ui-custom/installWizard.js
similarity index 100%
rename from ui/scripts/ui-custom/installWizard.js
rename to ui/legacy/scripts/ui-custom/installWizard.js
diff --git a/ui/legacy/scripts/ui-custom/instanceWizard.js b/ui/legacy/scripts/ui-custom/instanceWizard.js
new file mode 100644
index 0000000..2004257
--- /dev/null
+++ b/ui/legacy/scripts/ui-custom/instanceWizard.js
@@ -0,0 +1,1768 @@
+// 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/scripts/ui-custom/ipRules.js b/ui/legacy/scripts/ui-custom/ipRules.js
similarity index 100%
rename from ui/scripts/ui-custom/ipRules.js
rename to ui/legacy/scripts/ui-custom/ipRules.js
diff --git a/ui/scripts/ui-custom/login.js b/ui/legacy/scripts/ui-custom/login.js
similarity index 100%
rename from ui/scripts/ui-custom/login.js
rename to ui/legacy/scripts/ui-custom/login.js
diff --git a/ui/scripts/ui-custom/metricsView.js b/ui/legacy/scripts/ui-custom/metricsView.js
similarity index 100%
rename from ui/scripts/ui-custom/metricsView.js
rename to ui/legacy/scripts/ui-custom/metricsView.js
diff --git a/ui/scripts/ui-custom/migrate.js b/ui/legacy/scripts/ui-custom/migrate.js
similarity index 100%
rename from ui/scripts/ui-custom/migrate.js
rename to ui/legacy/scripts/ui-custom/migrate.js
diff --git a/ui/scripts/ui-custom/physicalResources.js b/ui/legacy/scripts/ui-custom/physicalResources.js
similarity index 100%
rename from ui/scripts/ui-custom/physicalResources.js
rename to ui/legacy/scripts/ui-custom/physicalResources.js
diff --git a/ui/scripts/ui-custom/pluginListing.js b/ui/legacy/scripts/ui-custom/pluginListing.js
similarity index 100%
rename from ui/scripts/ui-custom/pluginListing.js
rename to ui/legacy/scripts/ui-custom/pluginListing.js
diff --git a/ui/scripts/ui-custom/projectSelect.js b/ui/legacy/scripts/ui-custom/projectSelect.js
similarity index 100%
rename from ui/scripts/ui-custom/projectSelect.js
rename to ui/legacy/scripts/ui-custom/projectSelect.js
diff --git a/ui/scripts/ui-custom/projects.js b/ui/legacy/scripts/ui-custom/projects.js
similarity index 100%
rename from ui/scripts/ui-custom/projects.js
rename to ui/legacy/scripts/ui-custom/projects.js
diff --git a/ui/scripts/ui-custom/recurringSnapshots.js b/ui/legacy/scripts/ui-custom/recurringSnapshots.js
similarity index 100%
rename from ui/scripts/ui-custom/recurringSnapshots.js
rename to ui/legacy/scripts/ui-custom/recurringSnapshots.js
diff --git a/ui/scripts/ui-custom/regions.js b/ui/legacy/scripts/ui-custom/regions.js
similarity index 100%
rename from ui/scripts/ui-custom/regions.js
rename to ui/legacy/scripts/ui-custom/regions.js
diff --git a/ui/scripts/ui-custom/saml.js b/ui/legacy/scripts/ui-custom/saml.js
similarity index 100%
rename from ui/scripts/ui-custom/saml.js
rename to ui/legacy/scripts/ui-custom/saml.js
diff --git a/ui/scripts/ui-custom/securityRules.js b/ui/legacy/scripts/ui-custom/securityRules.js
similarity index 100%
rename from ui/scripts/ui-custom/securityRules.js
rename to ui/legacy/scripts/ui-custom/securityRules.js
diff --git a/ui/scripts/ui-custom/uploadVolume.js b/ui/legacy/scripts/ui-custom/uploadVolume.js
similarity index 100%
rename from ui/scripts/ui-custom/uploadVolume.js
rename to ui/legacy/scripts/ui-custom/uploadVolume.js
diff --git a/ui/scripts/ui-custom/vpc.js b/ui/legacy/scripts/ui-custom/vpc.js
similarity index 100%
rename from ui/scripts/ui-custom/vpc.js
rename to ui/legacy/scripts/ui-custom/vpc.js
diff --git a/ui/scripts/ui-custom/zoneChart.js b/ui/legacy/scripts/ui-custom/zoneChart.js
similarity index 100%
rename from ui/scripts/ui-custom/zoneChart.js
rename to ui/legacy/scripts/ui-custom/zoneChart.js
diff --git a/ui/scripts/ui-custom/zoneFilter.js b/ui/legacy/scripts/ui-custom/zoneFilter.js
similarity index 100%
rename from ui/scripts/ui-custom/zoneFilter.js
rename to ui/legacy/scripts/ui-custom/zoneFilter.js
diff --git a/ui/scripts/ui-custom/zoneWizard.js b/ui/legacy/scripts/ui-custom/zoneWizard.js
similarity index 100%
rename from ui/scripts/ui-custom/zoneWizard.js
rename to ui/legacy/scripts/ui-custom/zoneWizard.js
diff --git a/ui/scripts/ui/core.js b/ui/legacy/scripts/ui/core.js
similarity index 100%
rename from ui/scripts/ui/core.js
rename to ui/legacy/scripts/ui/core.js
diff --git a/ui/scripts/ui/dialog.js b/ui/legacy/scripts/ui/dialog.js
similarity index 100%
rename from ui/scripts/ui/dialog.js
rename to ui/legacy/scripts/ui/dialog.js
diff --git a/ui/scripts/ui/events.js b/ui/legacy/scripts/ui/events.js
similarity index 100%
rename from ui/scripts/ui/events.js
rename to ui/legacy/scripts/ui/events.js
diff --git a/ui/scripts/ui/utils.js b/ui/legacy/scripts/ui/utils.js
similarity index 100%
rename from ui/scripts/ui/utils.js
rename to ui/legacy/scripts/ui/utils.js
diff --git a/ui/scripts/ui/widgets/cloudBrowser.js b/ui/legacy/scripts/ui/widgets/cloudBrowser.js
similarity index 100%
rename from ui/scripts/ui/widgets/cloudBrowser.js
rename to ui/legacy/scripts/ui/widgets/cloudBrowser.js
diff --git a/ui/scripts/ui/widgets/dataTable.js b/ui/legacy/scripts/ui/widgets/dataTable.js
similarity index 100%
rename from ui/scripts/ui/widgets/dataTable.js
rename to ui/legacy/scripts/ui/widgets/dataTable.js
diff --git a/ui/scripts/ui/widgets/detailView.js b/ui/legacy/scripts/ui/widgets/detailView.js
similarity index 100%
rename from ui/scripts/ui/widgets/detailView.js
rename to ui/legacy/scripts/ui/widgets/detailView.js
diff --git a/ui/scripts/ui/widgets/listView.js b/ui/legacy/scripts/ui/widgets/listView.js
similarity index 100%
rename from ui/scripts/ui/widgets/listView.js
rename to ui/legacy/scripts/ui/widgets/listView.js
diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/legacy/scripts/ui/widgets/multiEdit.js
similarity index 100%
rename from ui/scripts/ui/widgets/multiEdit.js
rename to ui/legacy/scripts/ui/widgets/multiEdit.js
diff --git a/ui/scripts/ui/widgets/notifications.js b/ui/legacy/scripts/ui/widgets/notifications.js
similarity index 100%
rename from ui/scripts/ui/widgets/notifications.js
rename to ui/legacy/scripts/ui/widgets/notifications.js
diff --git a/ui/scripts/ui/widgets/overlay.js b/ui/legacy/scripts/ui/widgets/overlay.js
similarity index 100%
rename from ui/scripts/ui/widgets/overlay.js
rename to ui/legacy/scripts/ui/widgets/overlay.js
diff --git a/ui/scripts/ui/widgets/tagger.js b/ui/legacy/scripts/ui/widgets/tagger.js
similarity index 100%
rename from ui/scripts/ui/widgets/tagger.js
rename to ui/legacy/scripts/ui/widgets/tagger.js
diff --git a/ui/scripts/ui/widgets/toolTip.js b/ui/legacy/scripts/ui/widgets/toolTip.js
similarity index 100%
rename from ui/scripts/ui/widgets/toolTip.js
rename to ui/legacy/scripts/ui/widgets/toolTip.js
diff --git a/ui/scripts/ui/widgets/treeView.js b/ui/legacy/scripts/ui/widgets/treeView.js
similarity index 100%
rename from ui/scripts/ui/widgets/treeView.js
rename to ui/legacy/scripts/ui/widgets/treeView.js
diff --git a/ui/scripts/vpc.js b/ui/legacy/scripts/vpc.js
similarity index 100%
rename from ui/scripts/vpc.js
rename to ui/legacy/scripts/vpc.js
diff --git a/ui/legacy/scripts/zoneWizard.js b/ui/legacy/scripts/zoneWizard.js
new file mode 100755
index 0000000..b7e5d01
--- /dev/null
+++ b/ui/legacy/scripts/zoneWizard.js
@@ -0,0 +1,4838 @@
+// 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/tests/index.html b/ui/legacy/tests/index.html
similarity index 100%
rename from ui/tests/index.html
rename to ui/legacy/tests/index.html
diff --git a/ui/tests/test.widget.listView.js b/ui/legacy/tests/test.widget.listView.js
similarity index 100%
rename from ui/tests/test.widget.listView.js
rename to ui/legacy/tests/test.widget.listView.js
diff --git a/ui/nginx/default.conf b/ui/nginx/default.conf
new file mode 100644
index 0000000..9ba96cf
--- /dev/null
+++ b/ui/nginx/default.conf
@@ -0,0 +1,30 @@
+# 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.
+
+server {
+    listen       80;
+    server_name  localhost;
+    location / {
+        root   /usr/share/nginx/html;
+        index  index.html;
+    }
+    location /client/ {
+        # http://127.0.0.1:8080 should be replaced your CloudStack management
+        # Server's actual URI
+        proxy_pass   http://127.0.0.1:8080;
+    }
+}
diff --git a/ui/package-lock.json b/ui/package-lock.json
new file mode 100644
index 0000000..3c3d825
--- /dev/null
+++ b/ui/package-lock.json
@@ -0,0 +1,26504 @@
+{
+  "name": "cloudstack-ui",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@akryum/winattr": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@akryum/winattr/-/winattr-3.0.0.tgz",
+      "integrity": "sha512-t4WmWoGV9gyzypwG3y3JlcK2t8fKLtvzBA7xEoFTj9SMPvOuLsf13uh4ikK0RRaaa9RPPWLgFUdOyIRaQvCpwQ==",
+      "dev": true,
+      "requires": {
+        "fswin": "^2.17.1227"
+      }
+    },
+    "@ant-design/colors": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz",
+      "integrity": "sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==",
+      "requires": {
+        "tinycolor2": "^1.4.1"
+      }
+    },
+    "@ant-design/icons": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-2.1.1.tgz",
+      "integrity": "sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w=="
+    },
+    "@ant-design/icons-vue": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-2.0.0.tgz",
+      "integrity": "sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg==",
+      "requires": {
+        "@ant-design/colors": "^3.1.0",
+        "babel-runtime": "^6.26.0"
+      }
+    },
+    "@antv/adjust": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@antv/adjust/-/adjust-0.1.1.tgz",
+      "integrity": "sha512-9FaMOyBlM4AgoRL0b5o0VhEKAYkexBNUrxV8XmpHU/9NBPJONBOB/NZUlQDqxtLItrt91tCfbAuMQmF529UX2Q==",
+      "requires": {
+        "@antv/util": "~1.3.1"
+      }
+    },
+    "@antv/attr": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@antv/attr/-/attr-0.1.2.tgz",
+      "integrity": "sha512-QXjP+T2I+pJQcwZx1oCA4tipG43vgeCeKcGGKahlcxb71OBAzjJZm1QbF4frKXcnOqRkxVXtCr70X9TRair3Ew==",
+      "requires": {
+        "@antv/util": "~1.3.1"
+      }
+    },
+    "@antv/component": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/@antv/component/-/component-0.3.9.tgz",
+      "integrity": "sha512-Knh/Nq0S8UkTfZj4SL7XizagTfXYqjFAYIqFtOmUaKpRMgccUi7p1oA7fJdNPGktkndljy6fUmCWocEeBXRS2g==",
+      "requires": {
+        "@antv/attr": "~0.1.2",
+        "@antv/g": "~3.3.5",
+        "@antv/util": "~1.3.1",
+        "wolfy87-eventemitter": "~5.1.0"
+      },
+      "dependencies": {
+        "@antv/g": {
+          "version": "3.3.6",
+          "resolved": "https://registry.npmjs.org/@antv/g/-/g-3.3.6.tgz",
+          "integrity": "sha512-2GtyTz++s0BbN6s0ZL2/nrqGYCkd52pVoNH92YkrTdTOvpO6Z4DNoo6jGVgZdPX6Nzwli6yduC8MinVAhE8X6g==",
+          "requires": {
+            "@antv/gl-matrix": "~2.7.1",
+            "@antv/util": "~1.3.1",
+            "d3-ease": "~1.0.3",
+            "d3-interpolate": "~1.1.5",
+            "d3-timer": "~1.0.6",
+            "wolfy87-eventemitter": "~5.1.0"
+          }
+        }
+      }
+    },
+    "@antv/coord": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/@antv/coord/-/coord-0.1.0.tgz",
+      "integrity": "sha512-W1R8h3Jfb3AfMBVfCreFPMVetgEYuwHBIGn0+d3EgYXe2ckOF8XWjkpGF1fZhOMHREMr+Gt27NGiQh8yBdLUgg==",
+      "requires": {
+        "@antv/util": "~1.3.1"
+      }
+    },
+    "@antv/g": {
+      "version": "3.4.10",
+      "resolved": "https://registry.npmjs.org/@antv/g/-/g-3.4.10.tgz",
+      "integrity": "sha512-pKy/L1SyRBsXuujdkggqrdBA0/ciAgHiArYBdIJsxHRxCneUP01wGwHdGfDayh2+S0gcSBHynjhoEahsaZaLkw==",
+      "requires": {
+        "@antv/gl-matrix": "~2.7.1",
+        "@antv/util": "~1.3.1",
+        "d3-ease": "~1.0.3",
+        "d3-interpolate": "~1.1.5",
+        "d3-timer": "~1.0.6",
+        "detect-browser": "^5.1.0"
+      }
+    },
+    "@antv/g2": {
+      "version": "3.5.17",
+      "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-3.5.17.tgz",
+      "integrity": "sha512-gOjfA6pwXYEC5mrLbvg1kA3jZI5J5T2kQeGse+iBBsNc1Vje7zs9G+BleUaI4MLXSnqwhsj/ohfkP7d+h4ArNg==",
+      "requires": {
+        "@antv/adjust": "~0.1.0",
+        "@antv/attr": "~0.1.2",
+        "@antv/component": "~0.3.3",
+        "@antv/coord": "~0.1.0",
+        "@antv/g": "~3.4.10",
+        "@antv/scale": "~0.1.1",
+        "@antv/util": "~1.3.1",
+        "venn.js": "~0.2.20",
+        "wolfy87-eventemitter": "~5.1.0"
+      }
+    },
+    "@antv/g2-brush": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/@antv/g2-brush/-/g2-brush-0.0.2.tgz",
+      "integrity": "sha512-7O9szwem19nmEgReXhFB8kVLRaz8J5MHvrzDSDY36YaBOaHSWRGHnvYt2KkkPqgWtHtLY1srssk4X/UmP5govA=="
+    },
+    "@antv/g2-plugin-slider": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@antv/g2-plugin-slider/-/g2-plugin-slider-2.1.1.tgz",
+      "integrity": "sha512-nB678VEGG3FkrvkDDFADAKjLQIeXzITEYqey5oeOpbf0vT5jOa55lQDyJDZ79cK8PmU/Hz6VPeSb3CNQBA+/FQ=="
+    },
+    "@antv/gl-matrix": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@antv/gl-matrix/-/gl-matrix-2.7.1.tgz",
+      "integrity": "sha512-oOWcVNlpELIKi9x+Mm1Vwbz8pXfkbJKykoCIOJ/dNK79hSIANbpXJ5d3Rra9/wZqK6MC961B7sybFhPlLraT3Q=="
+    },
+    "@antv/scale": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.1.5.tgz",
+      "integrity": "sha512-7RAu4iH5+Hk21h6+aBMiDTfmLf4IibK2SWjx/+E4f4AXRpqucO+8u7IbZdFkakAWxvqhJtN3oePJuTKqOMcmlg==",
+      "requires": {
+        "@antv/util": "~1.3.1",
+        "fecha": "~2.3.3"
+      }
+    },
+    "@antv/util": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@antv/util/-/util-1.3.1.tgz",
+      "integrity": "sha512-cbUta0hIJrKEaW3eKoGarz3Ita+9qUPF2YzTj8A6wds/nNiy20G26ztIWHU+5ThLc13B1n5Ik52LbaCaeg9enA==",
+      "requires": {
+        "@antv/gl-matrix": "^2.7.1"
+      }
+    },
+    "@apollo/federation": {
+      "version": "0.17.0",
+      "resolved": "https://registry.npmjs.org/@apollo/federation/-/federation-0.17.0.tgz",
+      "integrity": "sha512-vSW/M8+SGdu5xALsA/RL37GgB+wNFZpXCyPAcg3b68c8x7uoQHgYwqwUu7D+GnAGeOpDUrNnFPdKAYW7elYkyQ==",
+      "dev": true,
+      "requires": {
+        "apollo-graphql": "^0.4.0",
+        "apollo-server-env": "^2.4.5",
+        "core-js": "^3.4.0",
+        "lodash.xorby": "^4.7.0"
+      },
+      "dependencies": {
+        "apollo-graphql": {
+          "version": "0.4.5",
+          "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.4.5.tgz",
+          "integrity": "sha512-0qa7UOoq7E71kBYE7idi6mNQhHLVdMEDInWk6TNw3KsSWZE2/I68gARP84Mj+paFTO5NYuw1Dht66PVX76Cc2w==",
+          "dev": true,
+          "requires": {
+            "apollo-env": "^0.6.5",
+            "lodash.sortby": "^4.7.0"
+          }
+        }
+      }
+    },
+    "@apollo/protobufjs": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.0.4.tgz",
+      "integrity": "sha512-EE3zx+/D/wur/JiLp6VCiw1iYdyy1lCJMf8CGPkLeDt5QJrN4N8tKFx33Ah4V30AUQzMk7Uz4IXKZ1LOj124gA==",
+      "dev": true,
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.2",
+        "@protobufjs/base64": "^1.1.2",
+        "@protobufjs/codegen": "^2.0.4",
+        "@protobufjs/eventemitter": "^1.1.0",
+        "@protobufjs/fetch": "^1.1.0",
+        "@protobufjs/float": "^1.0.2",
+        "@protobufjs/inquire": "^1.1.0",
+        "@protobufjs/path": "^1.1.2",
+        "@protobufjs/pool": "^1.1.0",
+        "@protobufjs/utf8": "^1.1.0",
+        "@types/long": "^4.0.0",
+        "@types/node": "^10.1.0",
+        "long": "^4.0.0"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "10.17.28",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.28.tgz",
+          "integrity": "sha512-dzjES1Egb4c1a89C7lKwQh8pwjYmlOAG9dW1pBgxEk57tMrLnssOfEthz8kdkNaBd7lIqQx7APm5+mZ619IiCQ==",
+          "dev": true
+        }
+      }
+    },
+    "@apollographql/apollo-tools": {
+      "version": "0.4.8",
+      "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.4.8.tgz",
+      "integrity": "sha512-W2+HB8Y7ifowcf3YyPHgDI05izyRtOeZ4MqIr7LbTArtmJ0ZHULWpn84SGMW7NAvTV1tFExpHlveHhnXuJfuGA==",
+      "dev": true,
+      "requires": {
+        "apollo-env": "^0.6.5"
+      }
+    },
+    "@apollographql/graphql-language-service-interface": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-interface/-/graphql-language-service-interface-2.0.2.tgz",
+      "integrity": "sha512-28wePK0hlIVjgmvMXMAUq8qRSjz9O+6lqFp4PzOTHtfJfSsjVe9EfjF98zTpHsTgT3HcOxmbqDZZy8jlXtOqEA==",
+      "dev": true,
+      "requires": {
+        "@apollographql/graphql-language-service-parser": "^2.0.0",
+        "@apollographql/graphql-language-service-types": "^2.0.0",
+        "@apollographql/graphql-language-service-utils": "^2.0.2"
+      }
+    },
+    "@apollographql/graphql-language-service-parser": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-parser/-/graphql-language-service-parser-2.0.2.tgz",
+      "integrity": "sha512-rpTPrEJu1PMaRQxz5P8BZWsixNNhYloS0H0dwTxNBuE3qctbARvR7o8UCKLsmKgTbo+cz3T3a6IAsWlkHgMWGg==",
+      "dev": true,
+      "requires": {
+        "@apollographql/graphql-language-service-types": "^2.0.0"
+      }
+    },
+    "@apollographql/graphql-language-service-types": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-types/-/graphql-language-service-types-2.0.2.tgz",
+      "integrity": "sha512-vE+Dz8pG+Xa1Z2nMl82LoO66lQ6JqBUjaXqLDvS3eMjvA3N4hf+YUDOWfPdNZ0zjhHhHXzUIIZCkax6bXfFbzQ==",
+      "dev": true
+    },
+    "@apollographql/graphql-language-service-utils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@apollographql/graphql-language-service-utils/-/graphql-language-service-utils-2.0.2.tgz",
+      "integrity": "sha512-fDj5rWlTi/czvUS5t7V7I45Ai6bOO3Z7JARYj21Y2xxfbRGtJi6h8FvLX0N/EbzQgo/fiZc/HAhtfwn+OCjD7A==",
+      "dev": true,
+      "requires": {
+        "@apollographql/graphql-language-service-types": "^2.0.0"
+      }
+    },
+    "@apollographql/graphql-playground-html": {
+      "version": "1.6.26",
+      "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.26.tgz",
+      "integrity": "sha512-XAwXOIab51QyhBxnxySdK3nuMEUohhDsHQ5Rbco/V1vjlP75zZ0ZLHD9dTpXTN8uxKxopb2lUvJTq+M4g2Q0HQ==",
+      "dev": true,
+      "requires": {
+        "xss": "^1.0.6"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz",
+      "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "invariant": "^2.2.4",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/core": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.0.tgz",
+      "integrity": "sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-module-transforms": "^7.11.0",
+        "@babel/helpers": "^7.10.4",
+        "@babel/parser": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.11.0",
+        "@babel/types": "^7.11.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz",
+      "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+      "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
+      "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.10.4",
+        "browserslist": "^4.12.0",
+        "invariant": "^2.2.4",
+        "levenary": "^1.1.1",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+      "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-member-expression-to-functions": "^7.10.5",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
+      "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4",
+        "regexpu-core": "^4.7.0"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/types": "^7.10.5",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz",
+      "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+      "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+      "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.11.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz",
+      "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-wrap-function": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+      "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+      "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
+      "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.11.0"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+      "dev": true
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+      "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "^7.10.4",
+        "@babel/traverse": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@babel/parser": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.0.tgz",
+      "integrity": "sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw==",
+      "dev": true
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+      "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+      "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz",
+      "integrity": "sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-decorators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+      "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
+      "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+      "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-json-strings": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
+      "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+      "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
+      "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-transform-parameters": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
+      "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
+      "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
+      "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
+      "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-bigint": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+      "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-decorators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz",
+      "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
+    "@babel/plugin-syntax-flow": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz",
+      "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz",
+      "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
+      "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-typescript": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz",
+      "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
+      "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
+      "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-remap-async-to-generator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
+      "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz",
+      "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
+      "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-define-map": "^7.10.4",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-optimise-call-expression": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.10.4",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
+      "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
+      "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
+      "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
+      "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
+      "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-flow-strip-types": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz",
+      "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-flow": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
+      "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
+      "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
+      "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+      "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+      "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+      "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-simple-access": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
+      "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.10.4",
+        "@babel/helper-module-transforms": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
+      "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
+      "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
+      "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
+      "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-replace-supers": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
+      "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
+      "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
+      "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "^0.14.2"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
+      "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz",
+      "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "resolve": "^1.8.1",
+        "semver": "^5.5.1"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
+      "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
+      "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
+      "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-regex": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
+      "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
+      "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-typescript": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz",
+      "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.10.5",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-typescript": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
+      "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
+      "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.0.tgz",
+      "integrity": "sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.11.0",
+        "@babel/helper-compilation-targets": "^7.10.4",
+        "@babel/helper-module-imports": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+        "@babel/plugin-proposal-class-properties": "^7.10.4",
+        "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+        "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+        "@babel/plugin-proposal-json-strings": "^7.10.4",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+        "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+        "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+        "@babel/plugin-proposal-private-methods": "^7.10.4",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
+        "@babel/plugin-syntax-async-generators": "^7.8.0",
+        "@babel/plugin-syntax-class-properties": "^7.10.4",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+        "@babel/plugin-syntax-top-level-await": "^7.10.4",
+        "@babel/plugin-transform-arrow-functions": "^7.10.4",
+        "@babel/plugin-transform-async-to-generator": "^7.10.4",
+        "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+        "@babel/plugin-transform-block-scoping": "^7.10.4",
+        "@babel/plugin-transform-classes": "^7.10.4",
+        "@babel/plugin-transform-computed-properties": "^7.10.4",
+        "@babel/plugin-transform-destructuring": "^7.10.4",
+        "@babel/plugin-transform-dotall-regex": "^7.10.4",
+        "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+        "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+        "@babel/plugin-transform-for-of": "^7.10.4",
+        "@babel/plugin-transform-function-name": "^7.10.4",
+        "@babel/plugin-transform-literals": "^7.10.4",
+        "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+        "@babel/plugin-transform-modules-amd": "^7.10.4",
+        "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+        "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+        "@babel/plugin-transform-modules-umd": "^7.10.4",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+        "@babel/plugin-transform-new-target": "^7.10.4",
+        "@babel/plugin-transform-object-super": "^7.10.4",
+        "@babel/plugin-transform-parameters": "^7.10.4",
+        "@babel/plugin-transform-property-literals": "^7.10.4",
+        "@babel/plugin-transform-regenerator": "^7.10.4",
+        "@babel/plugin-transform-reserved-words": "^7.10.4",
+        "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+        "@babel/plugin-transform-spread": "^7.11.0",
+        "@babel/plugin-transform-sticky-regex": "^7.10.4",
+        "@babel/plugin-transform-template-literals": "^7.10.4",
+        "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+        "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+        "@babel/plugin-transform-unicode-regex": "^7.10.4",
+        "@babel/preset-modules": "^0.1.3",
+        "@babel/types": "^7.11.0",
+        "browserslist": "^4.12.0",
+        "core-js-compat": "^3.6.2",
+        "invariant": "^2.2.2",
+        "levenary": "^1.1.1",
+        "semver": "^5.5.0"
+      }
+    },
+    "@babel/preset-flow": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.10.4.tgz",
+      "integrity": "sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-transform-flow-strip-types": "^7.10.4"
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
+      "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      }
+    },
+    "@babel/preset-typescript": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz",
+      "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-transform-typescript": "^7.10.4"
+      }
+    },
+    "@babel/register": {
+      "version": "7.10.5",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.5.tgz",
+      "integrity": "sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^2.0.0",
+        "lodash": "^4.17.19",
+        "make-dir": "^2.1.0",
+        "pirates": "^4.0.0",
+        "source-map-support": "^0.5.16"
+      },
+      "dependencies": {
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.0.tgz",
+      "integrity": "sha512-qArkXsjJq7H+T86WrIFV0Fnu/tNOkZ4cgXmjkzAu3b/58D5mFIO8JH/y77t7C9q0OdDRdh9s7Ue5GasYssxtXw==",
+      "dev": true,
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.13.7",
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+          "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/template": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/parser": "^7.10.4",
+        "@babel/types": "^7.10.4"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz",
+      "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.11.0",
+        "@babel/helper-function-name": "^7.10.4",
+        "@babel/helper-split-export-declaration": "^7.11.0",
+        "@babel/parser": "^7.11.0",
+        "@babel/types": "^7.11.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.11.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz",
+      "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.10.4",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@endemolshinegroup/cosmiconfig-typescript-loader": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.2.tgz",
+      "integrity": "sha512-ZHkXKq2XFFmAUdmSZrmqUSIrRM4O9gtkdpxMmV+LQl7kScUnbo6pMnXu6+FTDgZ12aW6SDoZoOJfS56WD+Eu6A==",
+      "dev": true,
+      "requires": {
+        "lodash.get": "^4",
+        "make-error": "^1",
+        "ts-node": "^8",
+        "tslib": "^1"
+      }
+    },
+    "@fortawesome/fontawesome-common-types": {
+      "version": "0.2.34",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.34.tgz",
+      "integrity": "sha512-XcIn3iYbTEzGIxD0/dY5+4f019jIcEIWBiHc3KrmK/ROahwxmZ/s+tdj97p/5K0klz4zZUiMfUlYP0ajhSJjmA=="
+    },
+    "@fortawesome/fontawesome-svg-core": {
+      "version": "1.2.34",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.34.tgz",
+      "integrity": "sha512-0KNN0nc5eIzaJxlv43QcDmTkDY1CqeN6J7OCGSs+fwGPdtv0yOQqRjieopBCmw+yd7uD3N2HeNL3Zm5isDleLg==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.34"
+      }
+    },
+    "@fortawesome/free-brands-svg-icons": {
+      "version": "5.15.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.2.tgz",
+      "integrity": "sha512-YPlVjE1cEO+OJ9I9ay3TQ3I88+XkxMTYwnnddqAboxLhPNGncsHV0DjWOVLCyuAY66yPfyndWwVn4v7vuqsO1g==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.34"
+      }
+    },
+    "@fortawesome/free-solid-svg-icons": {
+      "version": "5.15.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.2.tgz",
+      "integrity": "sha512-ZfCU+QjaFsdNZmOGmfqEWhzI3JOe37x5dF4kz9GeXvKn/sTxhqMtZ7mh3lBf76SvcYY5/GKFuyG7p1r4iWMQqw==",
+      "requires": {
+        "@fortawesome/fontawesome-common-types": "^0.2.34"
+      }
+    },
+    "@fortawesome/vue-fontawesome": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-2.0.2.tgz",
+      "integrity": "sha512-ecpKSBUWXsxRJVi/dbOds4tkKwEcBQ1JSDZFzE2jTFpF8xIh3OgTX8POIor6bOltjibr3cdEyvnDjecMwUmxhQ=="
+    },
+    "@hapi/address": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
+      "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
+      "dev": true
+    },
+    "@hapi/bourne": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
+      "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
+      "dev": true
+    },
+    "@hapi/hoek": {
+      "version": "8.5.1",
+      "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
+      "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+      "dev": true
+    },
+    "@hapi/joi": {
+      "version": "15.1.1",
+      "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
+      "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/address": "2.x.x",
+        "@hapi/bourne": "1.x.x",
+        "@hapi/hoek": "8.x.x",
+        "@hapi/topo": "3.x.x"
+      }
+    },
+    "@hapi/topo": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
+      "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/hoek": "^8.3.0"
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==",
+      "dev": true,
+      "requires": {
+        "cssnano": "^4.0.0",
+        "cssnano-preset-default": "^4.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "@istanbuljs/load-nyc-config": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "find-up": "^4.1.0",
+        "get-package-type": "^0.1.0",
+        "js-yaml": "^3.13.1",
+        "resolve-from": "^5.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "dev": true
+        }
+      }
+    },
+    "@istanbuljs/schema": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+      "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+      "dev": true
+    },
+    "@jest/console": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
+      "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
+      "dev": true,
+      "requires": {
+        "@jest/source-map": "^24.9.0",
+        "chalk": "^2.0.1",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/core": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
+      "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^24.7.1",
+        "@jest/reporters": "^24.9.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/transform": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.1",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.1.15",
+        "jest-changed-files": "^24.9.0",
+        "jest-config": "^24.9.0",
+        "jest-haste-map": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-regex-util": "^24.3.0",
+        "jest-resolve": "^24.9.0",
+        "jest-resolve-dependencies": "^24.9.0",
+        "jest-runner": "^24.9.0",
+        "jest-runtime": "^24.9.0",
+        "jest-snapshot": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-validate": "^24.9.0",
+        "jest-watcher": "^24.9.0",
+        "micromatch": "^3.1.10",
+        "p-each-series": "^1.0.0",
+        "realpath-native": "^1.1.0",
+        "rimraf": "^2.5.4",
+        "slash": "^2.0.0",
+        "strip-ansi": "^5.0.0"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@jest/environment": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
+      "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
+      "dev": true,
+      "requires": {
+        "@jest/fake-timers": "^24.9.0",
+        "@jest/transform": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "jest-mock": "^24.9.0"
+      }
+    },
+    "@jest/fake-timers": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
+      "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-mock": "^24.9.0"
+      }
+    },
+    "@jest/reporters": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz",
+      "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^24.9.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/transform": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "chalk": "^2.0.1",
+        "exit": "^0.1.2",
+        "glob": "^7.1.2",
+        "istanbul-lib-coverage": "^2.0.2",
+        "istanbul-lib-instrument": "^3.0.1",
+        "istanbul-lib-report": "^2.0.4",
+        "istanbul-lib-source-maps": "^3.0.1",
+        "istanbul-reports": "^2.2.6",
+        "jest-haste-map": "^24.9.0",
+        "jest-resolve": "^24.9.0",
+        "jest-runtime": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-worker": "^24.6.0",
+        "node-notifier": "^5.4.2",
+        "slash": "^2.0.0",
+        "source-map": "^0.6.0",
+        "string-length": "^2.0.0"
+      },
+      "dependencies": {
+        "node-notifier": {
+          "version": "5.4.3",
+          "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz",
+          "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==",
+          "dev": true,
+          "requires": {
+            "growly": "^1.3.0",
+            "is-wsl": "^1.1.0",
+            "semver": "^5.5.0",
+            "shellwords": "^0.1.1",
+            "which": "^1.3.0"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "@jest/source-map": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
+      "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0",
+        "graceful-fs": "^4.1.15",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true
+        }
+      }
+    },
+    "@jest/test-result": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
+      "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "@types/istanbul-lib-coverage": "^2.0.0"
+      }
+    },
+    "@jest/test-sequencer": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
+      "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^24.9.0",
+        "jest-haste-map": "^24.9.0",
+        "jest-runner": "^24.9.0",
+        "jest-runtime": "^24.9.0"
+      }
+    },
+    "@jest/transform": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
+      "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/types": "^24.9.0",
+        "babel-plugin-istanbul": "^5.1.0",
+        "chalk": "^2.0.1",
+        "convert-source-map": "^1.4.0",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graceful-fs": "^4.1.15",
+        "jest-haste-map": "^24.9.0",
+        "jest-regex-util": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "micromatch": "^3.1.10",
+        "pirates": "^4.0.1",
+        "realpath-native": "^1.1.0",
+        "slash": "^2.0.0",
+        "source-map": "^0.6.1",
+        "write-file-atomic": "2.4.1"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "write-file-atomic": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
+          "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
+          }
+        }
+      }
+    },
+    "@jest/types": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+      "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^1.1.1",
+        "@types/yargs": "^13.0.0"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
+      }
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
+      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.stat": "2.0.3",
+        "run-parallel": "^1.1.9"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+          "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+          "dev": true
+        }
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+      "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+      "dev": true
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
+      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+      "dev": true,
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.3",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@npmcli/ci-detect": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz",
+      "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q=="
+    },
+    "@npmcli/git": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.3.tgz",
+      "integrity": "sha512-c/ODsV5ppjB12VDXKc6hzVNgg6ZJX/etILUn3WgF5NLAYBhQLJ3fBq6uB2jQD4OwqOzJdPT1/xA3Xh3aaWGk5w==",
+      "requires": {
+        "@npmcli/promise-spawn": "^1.1.0",
+        "lru-cache": "^6.0.0",
+        "mkdirp": "^1.0.3",
+        "npm-pick-manifest": "^6.0.0",
+        "promise-inflight": "^1.0.1",
+        "promise-retry": "^1.1.1",
+        "semver": "^7.3.2",
+        "unique-filename": "^1.1.1",
+        "which": "^2.0.2"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+        }
+      }
+    },
+    "@npmcli/installed-package-contents": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz",
+      "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==",
+      "requires": {
+        "npm-bundled": "^1.1.1",
+        "npm-normalize-package-bin": "^1.0.1",
+        "read-package-json-fast": "^1.1.1",
+        "readdir-scoped-modules": "^1.1.0"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz",
+      "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==",
+      "requires": {
+        "mkdirp": "^1.0.4"
+      }
+    },
+    "@npmcli/promise-spawn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.2.0.tgz",
+      "integrity": "sha512-nFtqjVETliApiRdjbYwKwhlSHx2ZMagyj5b9YbNt0BWeeOVxJd47ZVE2u16vxDHyTOZvk+YLV7INwfAE9a2uow==",
+      "requires": {
+        "infer-owner": "^1.0.4"
+      }
+    },
+    "@npmcli/run-script": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.4.0.tgz",
+      "integrity": "sha512-evlD0Ur2ILGyTP7FfMYi90x80bto9+nEbGjoWzdF+gmIX3HuA1nW0Ghj91JFaTJAHiXnDEEduZS24oAve/aeOA==",
+      "requires": {
+        "@npmcli/promise-spawn": "^1.2.0",
+        "infer-owner": "^1.0.4",
+        "node-gyp": "^6.1.0",
+        "read-package-json-fast": "^1.1.3"
+      }
+    },
+    "@oclif/color": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.1.2.tgz",
+      "integrity": "sha512-M9o+DOrb8l603qvgz1FogJBUGLqcMFL1aFg2ZEL0FbXJofiNTLOWIeB4faeZTLwE6dt0xH9GpCVpzksMMzGbmA==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "chalk": "^3.0.0",
+        "strip-ansi": "^5.2.0",
+        "supports-color": "^5.4.0",
+        "tslib": "^1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.2.1",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+              "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+              "dev": true,
+              "requires": {
+                "@types/color-name": "^1.1.1",
+                "color-convert": "^2.0.1"
+              }
+            },
+            "supports-color": {
+              "version": "7.1.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+              "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@oclif/command": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.7.0.tgz",
+      "integrity": "sha512-TkknFtWcZI8te0E8sW+ohiblExrLx73rIcV4KdIzDX01u+oTZWZaap51F6TSGFnR/Gey0WctaDvJhZlt4xgKdA==",
+      "dev": true,
+      "requires": {
+        "@oclif/config": "^1.15.1",
+        "@oclif/errors": "^1.3.3",
+        "@oclif/parser": "^3.8.3",
+        "@oclif/plugin-help": "^3",
+        "debug": "^4.1.1",
+        "semver": "^5.6.0"
+      },
+      "dependencies": {
+        "@oclif/plugin-help": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-3.1.0.tgz",
+          "integrity": "sha512-orSWpXGlJaX16eSjAtI8scA8QhrjQOaCSHodEx52t18JKbIVzG8jcngugyWAOB/V4jhPl0rdiVk9XFsaIIiG2g==",
+          "dev": true,
+          "requires": {
+            "@oclif/command": "^1.5.20",
+            "@oclif/config": "^1.15.1",
+            "chalk": "^2.4.1",
+            "indent-string": "^4.0.0",
+            "lodash.template": "^4.4.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0",
+            "widest-line": "^2.0.1",
+            "wrap-ansi": "^4.0.0"
+          }
+        },
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "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
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "widest-line": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+          "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1"
+          },
+          "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
+            },
+            "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"
+              }
+            },
+            "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"
+              }
+            }
+          }
+        },
+        "wrap-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz",
+          "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.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
+            },
+            "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"
+              }
+            },
+            "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"
+              }
+            }
+          }
+        }
+      }
+    },
+    "@oclif/config": {
+      "version": "1.16.0",
+      "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.16.0.tgz",
+      "integrity": "sha512-vOnMPQcHokC03WBCuLipTxksTwgZcmDOnH2H0UHqndfKKN9GVDzpZTH6zaFVQBdjTME5VtRzg9A2UaNmq6OXWw==",
+      "dev": true,
+      "requires": {
+        "@oclif/errors": "^1.3.3",
+        "@oclif/parser": "^3.8.0",
+        "debug": "^4.1.1",
+        "globby": "^11.0.1",
+        "is-wsl": "^2.1.1",
+        "tslib": "^1.9.3"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
+          "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+          "dev": true
+        },
+        "array-union": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+          "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "dir-glob": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+          "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+          "dev": true,
+          "requires": {
+            "path-type": "^4.0.0"
+          }
+        },
+        "fast-glob": {
+          "version": "3.2.4",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+          "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+          "dev": true,
+          "requires": {
+            "@nodelib/fs.stat": "^2.0.2",
+            "@nodelib/fs.walk": "^1.2.3",
+            "glob-parent": "^5.1.0",
+            "merge2": "^1.3.0",
+            "micromatch": "^4.0.2",
+            "picomatch": "^2.2.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "globby": {
+          "version": "11.0.1",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+          "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+          "dev": true,
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.1.1",
+            "ignore": "^5.1.4",
+            "merge2": "^1.3.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "path-type": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+          "dev": true
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@oclif/errors": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.3.3.tgz",
+      "integrity": "sha512-EJR6AIOEkt/NnARNIVAskPDVtdhtO5TTNXmhDrGqMoWVsr0R6DkkLrMyq95BmHvlVWM1nduoq4fQPuCyuF2jaA==",
+      "dev": true,
+      "requires": {
+        "clean-stack": "^3.0.0",
+        "fs-extra": "^9.0.1",
+        "indent-string": "^4.0.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "clean-stack": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.0.tgz",
+          "integrity": "sha512-RHxtgFvXsRQ+1AM7dlozLDY7ssmvUUh0XEnfnyhYgJTO6beNZHBogiaCwGM9Q3rFrUkYxOtsZRC0zAturg5bjg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "4.0.0"
+          }
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^1.0.0"
+          }
+        },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
+        }
+      }
+    },
+    "@oclif/linewrap": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz",
+      "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==",
+      "dev": true
+    },
+    "@oclif/parser": {
+      "version": "3.8.5",
+      "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.5.tgz",
+      "integrity": "sha512-yojzeEfmSxjjkAvMRj0KzspXlMjCfBzNRPkWw8ZwOSoNWoJn+OCS/m/S+yfV6BvAM4u2lTzX9Y5rCbrFIgkJLg==",
+      "dev": true,
+      "requires": {
+        "@oclif/errors": "^1.2.2",
+        "@oclif/linewrap": "^1.0.0",
+        "chalk": "^2.4.2",
+        "tslib": "^1.9.3"
+      }
+    },
+    "@oclif/plugin-autocomplete": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-0.2.0.tgz",
+      "integrity": "sha512-pHbaE2PH7d9lHjCgFrrQ+ZIwvY+7OAQaGoaANqDbicBNDK/Rszt4N4oGj22dJT7sCQ8a/3Eh942rjxYIq9Mi9Q==",
+      "dev": true,
+      "requires": {
+        "@oclif/command": "^1.5.13",
+        "@oclif/config": "^1.13.0",
+        "chalk": "^2.4.1",
+        "cli-ux": "^5.2.1",
+        "debug": "^4.0.0",
+        "fs-extra": "^7.0.0",
+        "moment": "^2.22.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@oclif/plugin-help": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.3.tgz",
+      "integrity": "sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g==",
+      "dev": true,
+      "requires": {
+        "@oclif/command": "^1.5.13",
+        "chalk": "^2.4.1",
+        "indent-string": "^4.0.0",
+        "lodash.template": "^4.4.0",
+        "string-width": "^3.0.0",
+        "strip-ansi": "^5.0.0",
+        "widest-line": "^2.0.1",
+        "wrap-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "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": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "widest-line": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+          "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1"
+          },
+          "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
+            },
+            "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"
+              }
+            },
+            "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"
+              }
+            }
+          }
+        },
+        "wrap-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz",
+          "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.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
+            },
+            "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"
+              }
+            },
+            "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"
+              }
+            }
+          }
+        }
+      }
+    },
+    "@oclif/plugin-not-found": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.4.tgz",
+      "integrity": "sha512-G440PCuMi/OT8b71aWkR+kCWikngGtyRjOR24sPMDbpUFV4+B3r51fz1fcqeUiiEOYqUpr0Uy/sneUe1O/NfBg==",
+      "dev": true,
+      "requires": {
+        "@oclif/color": "^0.x",
+        "@oclif/command": "^1.6.0",
+        "cli-ux": "^4.9.0",
+        "fast-levenshtein": "^2.0.6",
+        "lodash": "^4.17.13"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cli-ux": {
+          "version": "4.9.3",
+          "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz",
+          "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==",
+          "dev": true,
+          "requires": {
+            "@oclif/errors": "^1.2.2",
+            "@oclif/linewrap": "^1.0.0",
+            "@oclif/screen": "^1.0.3",
+            "ansi-escapes": "^3.1.0",
+            "ansi-styles": "^3.2.1",
+            "cardinal": "^2.1.1",
+            "chalk": "^2.4.1",
+            "clean-stack": "^2.0.0",
+            "extract-stack": "^1.0.0",
+            "fs-extra": "^7.0.0",
+            "hyperlinker": "^1.0.0",
+            "indent-string": "^3.2.0",
+            "is-wsl": "^1.1.0",
+            "lodash": "^4.17.11",
+            "password-prompt": "^1.0.7",
+            "semver": "^5.6.0",
+            "strip-ansi": "^5.0.0",
+            "supports-color": "^5.5.0",
+            "supports-hyperlinks": "^1.0.1",
+            "treeify": "^1.1.0",
+            "tslib": "^1.9.3"
+          }
+        },
+        "extract-stack": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz",
+          "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=",
+          "dev": true
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "@oclif/plugin-plugins": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-1.9.0.tgz",
+      "integrity": "sha512-sq31nJk/n5pH5qGDioj2Z9x6MlRUrc/kkQrfCYKRPbQM80qewSP4RcPK3/gDvDSOAWD3wLAK9oMbDQO9lqImMA==",
+      "dev": true,
+      "requires": {
+        "@oclif/color": "^0.x",
+        "@oclif/command": "^1.5.12",
+        "chalk": "^2.4.2",
+        "cli-ux": "^5.2.1",
+        "debug": "^4.1.0",
+        "fs-extra": "^7.0.1",
+        "http-call": "^5.2.2",
+        "load-json-file": "^5.2.0",
+        "npm-run-path": "^3.0.0",
+        "semver": "^7.3.2",
+        "tslib": "^2.0.0",
+        "yarn": "^1.21.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz",
+          "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+          "dev": true
+        },
+        "tslib": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
+          "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==",
+          "dev": true
+        }
+      }
+    },
+    "@oclif/plugin-warn-if-update-available": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-1.7.0.tgz",
+      "integrity": "sha512-Nwyz3BJ8RhsfQ+OmFSsJSPIfn5YJqMrCzPh72Zgo2jqIjKIBWD8N9vTTe4kZlpeUUn77SyXFfwlBQbNCL5OEuQ==",
+      "dev": true,
+      "requires": {
+        "@oclif/command": "^1.5.10",
+        "@oclif/config": "^1.12.8",
+        "@oclif/errors": "^1.2.2",
+        "chalk": "^2.4.1",
+        "debug": "^4.1.0",
+        "fs-extra": "^7.0.0",
+        "http-call": "^5.2.2",
+        "lodash.template": "^4.4.0",
+        "semver": "^5.6.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "@oclif/screen": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz",
+      "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==",
+      "dev": true
+    },
+    "@protobufjs/aspromise": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+      "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
+      "dev": true
+    },
+    "@protobufjs/base64": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+      "dev": true
+    },
+    "@protobufjs/codegen": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+      "dev": true
+    },
+    "@protobufjs/eventemitter": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+      "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
+      "dev": true
+    },
+    "@protobufjs/fetch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+      "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+      "dev": true,
+      "requires": {
+        "@protobufjs/aspromise": "^1.1.1",
+        "@protobufjs/inquire": "^1.1.0"
+      }
+    },
+    "@protobufjs/float": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+      "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=",
+      "dev": true
+    },
+    "@protobufjs/inquire": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+      "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
+      "dev": true
+    },
+    "@protobufjs/path": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+      "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
+      "dev": true
+    },
+    "@protobufjs/pool": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+      "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
+      "dev": true
+    },
+    "@protobufjs/utf8": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+      "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
+      "dev": true
+    },
+    "@samverschueren/stream-to-observable": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz",
+      "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==",
+      "dev": true,
+      "requires": {
+        "any-observable": "^0.3.0"
+      }
+    },
+    "@simonwep/pickr": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.7.4.tgz",
+      "integrity": "sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==",
+      "requires": {
+        "core-js": "^3.6.5",
+        "nanopop": "^2.1.0"
+      }
+    },
+    "@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+    },
+    "@soda/friendly-errors-webpack-plugin": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz",
+      "integrity": "sha512-cWKrGaFX+rfbMrAxVv56DzhPNqOJPZuNIS2HGMELtgGzb+vsMzyig9mml5gZ/hr2BGtSLV+dP2LUEuAL8aG2mQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "error-stack-parser": "^2.0.0",
+        "string-width": "^2.0.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
+        },
+        "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
+        }
+      }
+    },
+    "@soda/get-current-script": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz",
+      "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==",
+      "dev": true
+    },
+    "@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "requires": {
+        "defer-to-connect": "^1.0.1"
+      }
+    },
+    "@tootallnate/once": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
+    },
+    "@types/accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/anymatch": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
+      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
+      "dev": true
+    },
+    "@types/babel__core": {
+      "version": "7.1.9",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz",
+      "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0",
+        "@types/babel__generator": "*",
+        "@types/babel__template": "*",
+        "@types/babel__traverse": "*"
+      }
+    },
+    "@types/babel__generator": {
+      "version": "7.6.1",
+      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz",
+      "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__template": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
+      "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
+      "dev": true,
+      "requires": {
+        "@babel/parser": "^7.1.0",
+        "@babel/types": "^7.0.0"
+      }
+    },
+    "@types/babel__traverse": {
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz",
+      "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.3.0"
+      }
+    },
+    "@types/body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
+      "dev": true,
+      "requires": {
+        "@types/connect": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    },
+    "@types/connect": {
+      "version": "3.4.33",
+      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
+      "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==",
+      "dev": true
+    },
+    "@types/cookies": {
+      "version": "0.7.4",
+      "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.4.tgz",
+      "integrity": "sha512-oTGtMzZZAVuEjTwCjIh8T8FrC8n/uwy+PG0yTvQcdZ7etoel7C7/3MSd7qrukENTgQtotG7gvBlBojuVs7X5rw==",
+      "dev": true,
+      "requires": {
+        "@types/connect": "*",
+        "@types/express": "*",
+        "@types/keygrip": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/cors": {
+      "version": "2.8.6",
+      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.6.tgz",
+      "integrity": "sha512-invOmosX0DqbpA+cE2yoHGUlF/blyf7nB0OGYBBiH27crcVm5NmFaZkLP4Ta1hGaesckCi5lVLlydNJCxkTOSg==",
+      "dev": true,
+      "requires": {
+        "@types/express": "*"
+      }
+    },
+    "@types/d3-format": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz",
+      "integrity": "sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A=="
+    },
+    "@types/express": {
+      "version": "4.17.7",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz",
+      "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==",
+      "dev": true,
+      "requires": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "*",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
+    },
+    "@types/express-serve-static-core": {
+      "version": "4.17.9",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz",
+      "integrity": "sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*"
+      }
+    },
+    "@types/fs-capacitor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz",
+      "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/graceful-fs": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz",
+      "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/graphql-upload": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/@types/graphql-upload/-/graphql-upload-8.0.3.tgz",
+      "integrity": "sha512-hmLg9pCU/GmxBscg8GCr1vmSoEmbItNNxdD5YH2TJkXm//8atjwuprB+xJBK714JG1dkxbbhp5RHX+Pz1KsCMA==",
+      "dev": true,
+      "requires": {
+        "@types/express": "*",
+        "@types/fs-capacitor": "*",
+        "@types/koa": "*",
+        "graphql": "^14.5.3"
+      }
+    },
+    "@types/http-assert": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz",
+      "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==",
+      "dev": true
+    },
+    "@types/istanbul-lib-coverage": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+      "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+      "dev": true
+    },
+    "@types/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*"
+      }
+    },
+    "@types/istanbul-reports": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+      "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+      "dev": true,
+      "requires": {
+        "@types/istanbul-lib-coverage": "*",
+        "@types/istanbul-lib-report": "*"
+      }
+    },
+    "@types/jest": {
+      "version": "24.9.1",
+      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz",
+      "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==",
+      "dev": true,
+      "requires": {
+        "jest-diff": "^24.3.0"
+      }
+    },
+    "@types/json-schema": {
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz",
+      "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==",
+      "dev": true
+    },
+    "@types/json5": {
+      "version": "0.0.29",
+      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "dev": true
+    },
+    "@types/keygrip": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz",
+      "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==",
+      "dev": true
+    },
+    "@types/koa": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.11.3.tgz",
+      "integrity": "sha512-ABxVkrNWa4O/Jp24EYI/hRNqEVRlhB9g09p48neQp4m3xL1TJtdWk2NyNQSMCU45ejeELMQZBYyfstyVvO2H3Q==",
+      "dev": true,
+      "requires": {
+        "@types/accepts": "*",
+        "@types/content-disposition": "*",
+        "@types/cookies": "*",
+        "@types/http-assert": "*",
+        "@types/keygrip": "*",
+        "@types/koa-compose": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/koa-compose": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz",
+      "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==",
+      "dev": true,
+      "requires": {
+        "@types/koa": "*"
+      }
+    },
+    "@types/loader-utils": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz",
+      "integrity": "sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/webpack": "*"
+      }
+    },
+    "@types/lodash": {
+      "version": "4.14.158",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.158.tgz",
+      "integrity": "sha512-InCEXJNTv/59yO4VSfuvNrZHt7eeNtWQEgnieIA+mIC+MOWM9arOWG2eQ8Vhk6NbOre6/BidiXhkZYeDY9U35w=="
+    },
+    "@types/long": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+      "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
+      "dev": true
+    },
+    "@types/mime": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz",
+      "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==",
+      "dev": true
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "dev": true
+    },
+    "@types/node": {
+      "version": "14.0.27",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
+      "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g=="
+    },
+    "@types/node-fetch": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz",
+      "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "form-data": "^3.0.0"
+      },
+      "dependencies": {
+        "form-data": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+          "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+          "dev": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.8",
+            "mime-types": "^2.1.12"
+          }
+        }
+      }
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
+      "dev": true
+    },
+    "@types/q": {
+      "version": "1.5.4",
+      "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
+      "dev": true
+    },
+    "@types/qs": {
+      "version": "6.9.4",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz",
+      "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==",
+      "dev": true
+    },
+    "@types/range-parser": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
+      "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==",
+      "dev": true
+    },
+    "@types/serve-static": {
+      "version": "1.13.5",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz",
+      "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==",
+      "dev": true,
+      "requires": {
+        "@types/express-serve-static-core": "*",
+        "@types/mime": "*"
+      }
+    },
+    "@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
+      "dev": true
+    },
+    "@types/stack-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
+      "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
+      "dev": true
+    },
+    "@types/strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=",
+      "dev": true
+    },
+    "@types/strip-json-comments": {
+      "version": "0.0.30",
+      "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz",
+      "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==",
+      "dev": true
+    },
+    "@types/tapable": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz",
+      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
+      "dev": true
+    },
+    "@types/uglify-js": {
+      "version": "3.9.3",
+      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz",
+      "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "@types/webpack": {
+      "version": "4.41.21",
+      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz",
+      "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==",
+      "dev": true,
+      "requires": {
+        "@types/anymatch": "*",
+        "@types/node": "*",
+        "@types/tapable": "*",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "source-map": "^0.6.0"
+      }
+    },
+    "@types/webpack-sources": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz",
+      "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+          "dev": true
+        }
+      }
+    },
+    "@types/ws": {
+      "version": "7.2.6",
+      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz",
+      "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/yargs": {
+      "version": "13.0.9",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz",
+      "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==",
+      "dev": true,
+      "requires": {
+        "@types/yargs-parser": "*"
+      }
+    },
+    "@types/yargs-parser": {
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
+      "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
+      "dev": true
+    },
+    "@types/zen-observable": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz",
+      "integrity": "sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==",
+      "dev": true
+    },
+    "@vue/babel-helper-vue-jsx-merge-props": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz",
+      "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==",
+      "dev": true
+    },
+    "@vue/babel-plugin-transform-vue-jsx": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz",
+      "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "html-tags": "^2.0.0",
+        "lodash.kebabcase": "^4.1.1",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-preset-app": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.4.6.tgz",
+      "integrity": "sha512-urIa6Qk3lKacLvscrzxMNyYlTqKFcPAUo5MohOjv1ISZ9PssHw693WTOrqSC0XksdMLtp/rnLvc6l5G8Muk0lw==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.9.6",
+        "@babel/helper-compilation-targets": "^7.9.6",
+        "@babel/helper-module-imports": "^7.8.3",
+        "@babel/plugin-proposal-class-properties": "^7.8.3",
+        "@babel/plugin-proposal-decorators": "^7.8.3",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-jsx": "^7.8.3",
+        "@babel/plugin-transform-runtime": "^7.9.6",
+        "@babel/preset-env": "^7.9.6",
+        "@babel/runtime": "^7.9.6",
+        "@vue/babel-preset-jsx": "^1.1.2",
+        "babel-plugin-dynamic-import-node": "^2.3.3",
+        "core-js": "^3.6.5",
+        "core-js-compat": "^3.6.5",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/babel-preset-jsx": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz",
+      "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==",
+      "dev": true,
+      "requires": {
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.1.2",
+        "@vue/babel-sugar-functional-vue": "^1.1.2",
+        "@vue/babel-sugar-inject-h": "^1.1.2",
+        "@vue/babel-sugar-v-model": "^1.1.2",
+        "@vue/babel-sugar-v-on": "^1.1.2"
+      }
+    },
+    "@vue/babel-sugar-functional-vue": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz",
+      "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-inject-h": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz",
+      "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0"
+      }
+    },
+    "@vue/babel-sugar-v-model": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz",
+      "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.1.2",
+        "camelcase": "^5.0.0",
+        "html-tags": "^2.0.0",
+        "svg-tags": "^1.0.0"
+      }
+    },
+    "@vue/babel-sugar-v-on": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz",
+      "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-jsx": "^7.2.0",
+        "@vue/babel-plugin-transform-vue-jsx": "^1.1.2",
+        "camelcase": "^5.0.0"
+      }
+    },
+    "@vue/cli": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli/-/cli-4.4.6.tgz",
+      "integrity": "sha512-IaLrnZ80BrBLPAkBup8bn363S1NHfNf8jfCJLWoXad598cUm6byMqntWtDFeTq0c3KohXcsIbT+nqLc5S9vz0w==",
+      "dev": true,
+      "requires": {
+        "@babel/preset-env": "^7.9.6",
+        "@vue/cli-shared-utils": "^4.4.6",
+        "@vue/cli-ui": "^4.4.6",
+        "@vue/cli-ui-addon-webpack": "^4.4.6",
+        "@vue/cli-ui-addon-widgets": "^4.4.6",
+        "boxen": "^4.1.0",
+        "cmd-shim": "^3.0.3",
+        "commander": "^2.20.0",
+        "debug": "^4.1.0",
+        "deepmerge": "^4.2.2",
+        "download-git-repo": "^3.0.2",
+        "ejs": "^2.7.1",
+        "envinfo": "^7.5.1",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "import-global": "^0.1.0",
+        "ini": "^1.3.5",
+        "inquirer": "^7.1.0",
+        "isbinaryfile": "^4.0.6",
+        "javascript-stringify": "^1.6.0",
+        "js-yaml": "^3.13.1",
+        "jscodeshift": "^0.10.0",
+        "leven": "^3.1.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lru-cache": "^5.1.1",
+        "minimist": "^1.2.5",
+        "recast": "^0.18.8",
+        "resolve": "^1.17.0",
+        "shortid": "^2.2.15",
+        "slash": "^3.0.0",
+        "validate-npm-package-name": "^3.0.0",
+        "vue": "^2.6.11",
+        "vue-jscodeshift-adapter": "^2.1.0",
+        "yaml-front-matter": "^3.4.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.4.6.tgz",
+      "integrity": "sha512-fzjg2gWQt+jw5fyLsD9HZNxGNQgZjLDI2s9bLWJwRucdfmncSi9neqA0TZyszGrgcJA4Qu4V5KgV0qwVSBYCaw==",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.4.6.tgz",
+      "integrity": "sha512-9cX9mN+4DIbcqw3rV6UBOA0t5zikIkrBLQloUzsOBOu5Xb7/UoD7inInFj7bnyHUflr5LqbdWJ+etCQcWAIIXA==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.9.6",
+        "@vue/babel-preset-app": "^4.4.6",
+        "@vue/cli-shared-utils": "^4.4.6",
+        "babel-loader": "^8.1.0",
+        "cache-loader": "^4.1.0",
+        "thread-loader": "^2.1.3",
+        "webpack": "^4.0.0"
+      }
+    },
+    "@vue/cli-plugin-eslint": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.4.6.tgz",
+      "integrity": "sha512-3a9rVpOKPQsDgAlRkhmBMHboGobivG/47BbQGE66Z8YJxrgF/AWikP3Jy67SmxtszRkyiWfw4aJFRV9r3MzffQ==",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^4.4.6",
+        "eslint-loader": "^2.2.1",
+        "globby": "^9.2.0",
+        "inquirer": "^7.1.0",
+        "webpack": "^4.0.0",
+        "yorkie": "^2.0.0"
+      }
+    },
+    "@vue/cli-plugin-router": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.4.6.tgz",
+      "integrity": "sha512-TkLdn0ZYo3zgn78Rk8doPlR+4UkGjGW2R1eGEaZEkue/mw2VhUWtTk9cKLZaYrw0eY8Ro/j+OV6mD+scyrairg==",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "^4.4.6"
+      }
+    },
+    "@vue/cli-plugin-unit-jest": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-4.4.6.tgz",
+      "integrity": "sha512-TwvCZV03JgXLSdc1UaD+Fjt3ooeX0gvRH2bUy58uuEx3qyk7xYx7vRM4uyJ51XZs9l4SEcegwtOlBga6lc6okA==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.9.6",
+        "@babel/plugin-transform-modules-commonjs": "^7.9.6",
+        "@types/jest": "^24.0.19",
+        "@vue/cli-shared-utils": "^4.4.6",
+        "babel-core": "^7.0.0-bridge.0",
+        "babel-jest": "^24.9.0",
+        "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
+        "deepmerge": "^4.2.2",
+        "jest": "^24.9.0",
+        "jest-environment-jsdom-fifteen": "^1.0.2",
+        "jest-serializer-vue": "^2.0.2",
+        "jest-transform-stub": "^2.0.0",
+        "jest-watch-typeahead": "^0.4.2",
+        "ts-jest": "^24.2.0",
+        "vue-jest": "^3.0.5"
+      },
+      "dependencies": {
+        "babel-jest": {
+          "version": "24.9.0",
+          "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
+          "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
+          "dev": true,
+          "requires": {
+            "@jest/transform": "^24.9.0",
+            "@jest/types": "^24.9.0",
+            "@types/babel__core": "^7.1.0",
+            "babel-plugin-istanbul": "^5.1.0",
+            "babel-preset-jest": "^24.9.0",
+            "chalk": "^2.4.2",
+            "slash": "^2.0.0"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-plugin-vuex": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.4.6.tgz",
+      "integrity": "sha512-Ho0YzUivn8BLPqFoFypntR8CMTEXYYHVr0GdnZW99XL+DbGw75f+tJfnrV9UFHDTfvZt7uewKiXDMlrzQ0l3Ug==",
+      "dev": true
+    },
+    "@vue/cli-service": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.4.6.tgz",
+      "integrity": "sha512-k5OFGh2NnvRymCyq9DfBiNJvECUuun3pl5KMm3557IZyA5E5csv+RHoSW3dX8HHe0zXq18g52VswP1llvR9POw==",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "^1.0.5",
+        "@soda/friendly-errors-webpack-plugin": "^1.7.1",
+        "@soda/get-current-script": "^1.0.0",
+        "@vue/cli-overlay": "^4.4.6",
+        "@vue/cli-plugin-router": "^4.4.6",
+        "@vue/cli-plugin-vuex": "^4.4.6",
+        "@vue/cli-shared-utils": "^4.4.6",
+        "@vue/component-compiler-utils": "^3.1.2",
+        "@vue/preload-webpack-plugin": "^1.1.0",
+        "@vue/web-component-wrapper": "^1.2.0",
+        "acorn": "^7.2.0",
+        "acorn-walk": "^7.1.1",
+        "address": "^1.1.2",
+        "autoprefixer": "^9.8.0",
+        "browserslist": "^4.12.0",
+        "cache-loader": "^4.1.0",
+        "case-sensitive-paths-webpack-plugin": "^2.3.0",
+        "cli-highlight": "^2.1.4",
+        "clipboardy": "^2.3.0",
+        "cliui": "^6.0.0",
+        "copy-webpack-plugin": "^5.1.1",
+        "css-loader": "^3.5.3",
+        "cssnano": "^4.1.10",
+        "debug": "^4.1.1",
+        "default-gateway": "^5.0.5",
+        "dotenv": "^8.2.0",
+        "dotenv-expand": "^5.1.0",
+        "file-loader": "^4.2.0",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "hash-sum": "^2.0.0",
+        "html-webpack-plugin": "^3.2.0",
+        "launch-editor-middleware": "^2.2.1",
+        "lodash.defaultsdeep": "^4.6.1",
+        "lodash.mapvalues": "^4.6.0",
+        "lodash.transform": "^4.6.0",
+        "mini-css-extract-plugin": "^0.9.0",
+        "minimist": "^1.2.5",
+        "pnp-webpack-plugin": "^1.6.4",
+        "portfinder": "^1.0.26",
+        "postcss-loader": "^3.0.0",
+        "ssri": "^7.1.0",
+        "terser-webpack-plugin": "^2.3.6",
+        "thread-loader": "^2.1.3",
+        "url-loader": "^2.2.0",
+        "vue-loader": "^15.9.2",
+        "vue-style-loader": "^4.1.2",
+        "webpack": "^4.0.0",
+        "webpack-bundle-analyzer": "^3.8.0",
+        "webpack-chain": "^6.4.0",
+        "webpack-dev-server": "^3.11.0",
+        "webpack-merge": "^4.2.2"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
+          "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+          "dev": true
+        },
+        "acorn-walk": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+          "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "cacache": {
+          "version": "13.0.1",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
+          "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==",
+          "dev": true,
+          "requires": {
+            "chownr": "^1.1.2",
+            "figgy-pudding": "^3.5.1",
+            "fs-minipass": "^2.0.0",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.2.2",
+            "infer-owner": "^1.0.4",
+            "lru-cache": "^5.1.1",
+            "minipass": "^3.0.0",
+            "minipass-collect": "^1.0.2",
+            "minipass-flush": "^1.0.5",
+            "minipass-pipeline": "^1.2.2",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "p-map": "^3.0.0",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.7.1",
+            "ssri": "^7.0.0",
+            "unique-filename": "^1.1.1"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "find-cache-dir": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+          "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^3.0.2",
+            "pkg-dir": "^4.1.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "jest-worker": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
+          "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
+          "dev": true,
+          "requires": {
+            "merge-stream": "^2.0.0",
+            "supports-color": "^7.0.0"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "p-map": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+          "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
+          "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1",
+            "minipass": "^3.1.1"
+          }
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "terser-webpack-plugin": {
+          "version": "2.3.7",
+          "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz",
+          "integrity": "sha512-xzYyaHUNhzgaAdBsXxk2Yvo/x1NJdslUaussK3fdpBbvttm1iIwU+c26dj9UxJcwk2c5UWt5F55MUTIA8BE7Dg==",
+          "dev": true,
+          "requires": {
+            "cacache": "^13.0.1",
+            "find-cache-dir": "^3.3.1",
+            "jest-worker": "^25.4.0",
+            "p-limit": "^2.3.0",
+            "schema-utils": "^2.6.6",
+            "serialize-javascript": "^3.1.0",
+            "source-map": "^0.6.1",
+            "terser": "^4.6.12",
+            "webpack-sources": "^1.4.3"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.4.6.tgz",
+      "integrity": "sha512-ba+FZZCjiTSu2otnLjY4qXqASe7ZIQ/QBljk5oRPgqrR0p1NUkDPUcZhqa041aOaSW1yAfSfhOD7Q84nMnWhzQ==",
+      "dev": true,
+      "requires": {
+        "@hapi/joi": "^15.0.1",
+        "chalk": "^2.4.2",
+        "execa": "^1.0.0",
+        "launch-editor": "^2.2.1",
+        "lru-cache": "^5.1.1",
+        "node-ipc": "^9.1.1",
+        "open": "^6.3.0",
+        "ora": "^3.4.0",
+        "read-pkg": "^5.1.1",
+        "request": "^2.88.2",
+        "semver": "^6.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-ui": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-ui/-/cli-ui-4.4.6.tgz",
+      "integrity": "sha512-9l67vb0J9iubf14Lj6aI8Fg9DPIgB9gCLbwQWVrFtoaDTapdbo0X6cf0zK1RNeN/5CrGa5baIntqsWwC1Iqlcw==",
+      "dev": true,
+      "requires": {
+        "@akryum/winattr": "^3.0.0",
+        "@vue/cli-shared-utils": "^4.4.6",
+        "apollo-server-express": "^2.13.1",
+        "clone": "^2.1.1",
+        "deepmerge": "^4.2.2",
+        "express": "^4.17.1",
+        "express-history-api-fallback": "^2.2.1",
+        "fkill": "^6.1.0",
+        "fs-extra": "^7.0.1",
+        "globby": "^9.2.0",
+        "graphql": "^14.6.0",
+        "graphql-subscriptions": "^1.1.0",
+        "graphql-tag": "^2.10.3",
+        "graphql-type-json": "^0.3.1",
+        "javascript-stringify": "^1.6.0",
+        "js-yaml": "^3.13.1",
+        "lodash.merge": "^4.6.1",
+        "lowdb": "^1.0.0",
+        "lru-cache": "^5.1.1",
+        "node-ipc": "^9.1.1",
+        "node-notifier": "^6.0.0",
+        "parse-git-config": "^2.0.2",
+        "portfinder": "^1.0.26",
+        "prismjs": "^1.20.0",
+        "rss-parser": "^3.8.0",
+        "shortid": "^2.2.15",
+        "typescript": "~3.9.3",
+        "vue-cli-plugin-apollo": "^0.21.3",
+        "watch": "^1.0.2"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-ui-addon-webpack": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-ui-addon-webpack/-/cli-ui-addon-webpack-4.4.6.tgz",
+      "integrity": "sha512-odDx8lo+MNFCnhOB6fsjWJnoWP/YhDhDuCUQC8YQHCtsGRHI8/mJQk1tLI8cPVrY37aAH8Z0loitg4q3klItlQ==",
+      "dev": true
+    },
+    "@vue/cli-ui-addon-widgets": {
+      "version": "4.4.6",
+      "resolved": "https://registry.npmjs.org/@vue/cli-ui-addon-widgets/-/cli-ui-addon-widgets-4.4.6.tgz",
+      "integrity": "sha512-GqtqxFR30LCxiQ+y/8b+XmAaZ983ojYT/6xOeqD0V0bZ3sNrthTxRcTXKJHbw7xdeE7bWHikHKYQ7Jn3J/Dyjw==",
+      "dev": true
+    },
+    "@vue/component-compiler-utils": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
+      "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==",
+      "dev": true,
+      "requires": {
+        "consolidate": "^0.15.1",
+        "hash-sum": "^1.0.2",
+        "lru-cache": "^4.1.2",
+        "merge-source-map": "^1.1.0",
+        "postcss": "^7.0.14",
+        "postcss-selector-parser": "^6.0.2",
+        "prettier": "^1.18.2",
+        "source-map": "~0.6.1",
+        "vue-template-es2015-compiler": "^1.9.0"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/eslint-config-standard": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-standard/-/eslint-config-standard-5.1.2.tgz",
+      "integrity": "sha512-FTz0k77dIrj9r3xskt9jsZyL/YprrLiPRf4m3k7G6dZ5PKuD6OPqYrHR9eduUmHDFpTlRgFpTVQrq+1el9k3QQ==",
+      "dev": true,
+      "requires": {
+        "eslint-config-standard": "^14.1.0",
+        "eslint-import-resolver-node": "^0.3.3",
+        "eslint-import-resolver-webpack": "^0.12.1"
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz",
+      "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==",
+      "dev": true
+    },
+    "@vue/test-utils": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.3.tgz",
+      "integrity": "sha512-mmsKXZSGfvd0bH05l4SNuczZ2MqlJH2DWhiul5wJXFxbf/gRRd2UL4QZgozEMQ30mRi9i4/+p4JJat8S4Js64Q==",
+      "dev": true,
+      "requires": {
+        "dom-event-types": "^1.0.0",
+        "lodash": "^4.17.15",
+        "pretty": "^2.0.0"
+      }
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz",
+      "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@wry/context": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz",
+      "integrity": "sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag==",
+      "dev": true,
+      "requires": {
+        "@types/node": ">=6",
+        "tslib": "^1.9.3"
+      }
+    },
+    "@wry/equality": {
+      "version": "0.1.11",
+      "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz",
+      "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.3"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "dev": true
+    },
+    "abab": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
+      "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
+      "dev": true
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "dev": true,
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "6.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+      "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+      "dev": true
+    },
+    "acorn-globals": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
+      "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
+      "dev": true,
+      "requires": {
+        "acorn": "^6.0.1",
+        "acorn-walk": "^6.0.1"
+      }
+    },
+    "acorn-jsx": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+      "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+      "dev": true
+    },
+    "acorn-walk": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+      "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+      "dev": true
+    },
+    "add-dom-event-listener": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz",
+      "integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==",
+      "requires": {
+        "object-assign": "4.x"
+      }
+    },
+    "address": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
+      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
+      "dev": true
+    },
+    "agent-base": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz",
+      "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==",
+      "requires": {
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "agentkeepalive": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz",
+      "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==",
+      "requires": {
+        "debug": "^4.1.0",
+        "depd": "^1.1.2",
+        "humanize-ms": "^1.2.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "aggregate-error": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
+      "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.3",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
+      "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "dev": true
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "requires": {
+        "kind-of": "^3.0.2",
+        "longest": "^1.0.1",
+        "repeat-string": "^1.5.2"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+    },
+    "ansi-align": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
+      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "requires": {
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+        },
+        "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="
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "dev": true,
+      "requires": {
+        "type-fest": "^0.11.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "dev": true
+        }
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "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==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "ansicolors": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+      "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
+      "dev": true
+    },
+    "ant-design-vue": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.7.3.tgz",
+      "integrity": "sha512-OuJBZmpcy32OvdvP7iW1EqdqU6l/dta1zcQ/U0fep7EGksPviVK7ssifI5QMZFQDDsti0dYQhCEOZWUG0Y/xxQ==",
+      "requires": {
+        "@ant-design/icons": "^2.1.1",
+        "@ant-design/icons-vue": "^2.0.0",
+        "@simonwep/pickr": "~1.7.0",
+        "add-dom-event-listener": "^1.0.2",
+        "array-tree-filter": "^2.1.0",
+        "async-validator": "^3.0.3",
+        "babel-helper-vue-jsx-merge-props": "^2.0.3",
+        "babel-runtime": "6.x",
+        "classnames": "^2.2.5",
+        "component-classes": "^1.2.6",
+        "dom-align": "^1.10.4",
+        "dom-closest": "^0.2.0",
+        "dom-scroll-into-view": "^2.0.0",
+        "enquire.js": "^2.1.6",
+        "intersperse": "^1.0.0",
+        "is-mobile": "^2.2.1",
+        "is-negative-zero": "^2.0.0",
+        "ismobilejs": "^1.0.0",
+        "json2mq": "^0.2.0",
+        "lodash": "^4.17.5",
+        "moment": "^2.21.0",
+        "mutationobserver-shim": "^0.3.2",
+        "node-emoji": "^1.10.0",
+        "omit.js": "^1.0.0",
+        "raf": "^3.4.0",
+        "resize-observer-polyfill": "^1.5.1",
+        "shallow-equal": "^1.0.0",
+        "shallowequal": "^1.0.2",
+        "vue-ref": "^2.0.0",
+        "warning": "^4.0.0"
+      }
+    },
+    "antd-theme-generator": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/antd-theme-generator/-/antd-theme-generator-1.2.8.tgz",
+      "integrity": "sha512-OnwWT76ax7BRiDnZW2Ak3LoJaFlmq9TWt0IwinnjXmNkHfkjtu18Z+ZeViYtz0OT9NnnTmm2ArBC/FdYlKmQVw==",
+      "requires": {
+        "glob": "^7.1.3",
+        "hash.js": "^1.1.5",
+        "less": "^3.9.0",
+        "less-bundle-promise": "^1.0.7",
+        "less-plugin-npm-import": "^2.1.0",
+        "postcss": "^6.0.21",
+        "postcss-less": "^3.1.4",
+        "strip-css-comments": "^4.1.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.6.2",
+          "bundled": true,
+          "optional": 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"
+          }
+        },
+        "ansi-styles": {
+          "version": "3.2.1",
+          "bundled": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "asap": {
+          "version": "2.0.6",
+          "bundled": true
+        },
+        "asn1": {
+          "version": "0.2.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": "~2.1.0"
+          }
+        },
+        "assert-plus": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "bundled": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.7.0",
+          "bundled": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.8.0",
+          "bundled": true,
+          "optional": true
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "tweetnacl": "^0.14.3"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true,
+          "optional": true
+        },
+        "chalk": {
+          "version": "2.4.1",
+          "bundled": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "clone": {
+          "version": "2.1.2",
+          "bundled": true
+        },
+        "color-convert": {
+          "version": "1.9.2",
+          "bundled": true,
+          "requires": {
+            "color-name": "1.1.1"
+          }
+        },
+        "color-name": {
+          "version": "1.1.1",
+          "bundled": true
+        },
+        "combined-stream": {
+          "version": "1.0.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "delayed-stream": "~1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0"
+          }
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "ecc-jsbn": {
+          "version": "0.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "~0.1.0",
+            "safer-buffer": "^2.1.0"
+          }
+        },
+        "errno": {
+          "version": "0.1.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "prr": "~1.0.1"
+          }
+        },
+        "escape-string-regexp": {
+          "version": "1.0.5",
+          "bundled": true
+        },
+        "extend": {
+          "version": "3.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "extsprintf": {
+          "version": "1.3.0",
+          "bundled": true,
+          "optional": true
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "fast-json-stable-stringify": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "bundled": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.3.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "^0.4.0",
+            "combined-stream": "^1.0.6",
+            "mime-types": "^2.1.12"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "bundled": 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"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.15",
+          "bundled": true,
+          "optional": true
+        },
+        "har-schema": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "5.1.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ajv": "^6.5.5",
+            "har-schema": "^2.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "3.0.0",
+          "bundled": true
+        },
+        "hash.js": {
+          "version": "1.1.7",
+          "bundled": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "minimalistic-assert": "^1.0.1"
+          }
+        },
+        "http-signature": {
+          "version": "1.2.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "jsprim": "^1.2.2",
+            "sshpk": "^1.7.0"
+          }
+        },
+        "image-size": {
+          "version": "0.5.5",
+          "bundled": true,
+          "optional": true
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true
+        },
+        "is-regexp": {
+          "version": "2.1.0",
+          "bundled": true
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true,
+          "optional": true
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "bundled": true,
+          "optional": true
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "jsprim": {
+          "version": "1.4.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.3.0",
+            "json-schema": "0.2.3",
+            "verror": "1.10.0"
+          }
+        },
+        "less": {
+          "version": "3.9.0",
+          "bundled": true,
+          "requires": {
+            "clone": "^2.1.2",
+            "errno": "^0.1.1",
+            "graceful-fs": "^4.1.2",
+            "image-size": "~0.5.0",
+            "mime": "^1.4.1",
+            "mkdirp": "^0.5.0",
+            "promise": "^7.1.1",
+            "request": "^2.83.0",
+            "source-map": "~0.6.0"
+          }
+        },
+        "less-plugin-npm-import": {
+          "version": "2.1.0",
+          "bundled": true,
+          "requires": {
+            "promise": "~7.0.1",
+            "resolve": "~1.1.6"
+          },
+          "dependencies": {
+            "promise": {
+              "version": "7.0.4",
+              "bundled": true,
+              "requires": {
+                "asap": "~2.0.3"
+              }
+            }
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "bundled": true,
+          "optional": true
+        },
+        "mime-db": {
+          "version": "1.37.0",
+          "bundled": true,
+          "optional": true
+        },
+        "mime-types": {
+          "version": "2.1.21",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "mime-db": "~1.37.0"
+          }
+        },
+        "minimalistic-assert": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "bundled": true,
+          "optional": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "oauth-sign": {
+          "version": "0.9.0",
+          "bundled": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "performance-now": {
+          "version": "2.1.0",
+          "bundled": true,
+          "optional": true
+        },
+        "postcss": {
+          "version": "6.0.23",
+          "bundled": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.6.1",
+              "bundled": true
+            }
+          }
+        },
+        "promise": {
+          "version": "7.3.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "asap": "~2.0.3"
+          }
+        },
+        "prr": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "psl": {
+          "version": "1.1.31",
+          "bundled": true,
+          "optional": true
+        },
+        "punycode": {
+          "version": "2.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.5.2",
+          "bundled": true,
+          "optional": true
+        },
+        "request": {
+          "version": "2.88.0",
+          "bundled": true,
+          "optional": 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"
+          }
+        },
+        "resolve": {
+          "version": "1.1.7",
+          "bundled": true
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "bundled": true,
+          "optional": true
+        },
+        "sshpk": {
+          "version": "1.15.2",
+          "bundled": true,
+          "optional": 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"
+          }
+        },
+        "strip-css-comments": {
+          "version": "4.1.0",
+          "bundled": true,
+          "requires": {
+            "is-regexp": "^2.1.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.4.0",
+          "bundled": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.4.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.24",
+            "punycode": "^1.4.1"
+          },
+          "dependencies": {
+            "punycode": {
+              "version": "1.4.1",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "optional": true
+        },
+        "uri-js": {
+          "version": "4.2.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "punycode": "^2.1.0"
+          }
+        },
+        "uuid": {
+          "version": "3.3.2",
+          "bundled": true,
+          "optional": true
+        },
+        "verror": {
+          "version": "1.10.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "^1.0.0",
+            "core-util-is": "1.0.2",
+            "extsprintf": "^1.2.0"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        }
+      }
+    },
+    "antd-theme-webpack-plugin": {
+      "version": "1.3.9",
+      "resolved": "https://registry.npmjs.org/antd-theme-webpack-plugin/-/antd-theme-webpack-plugin-1.3.9.tgz",
+      "integrity": "sha512-J/xYPqW8oZrk/UZslRODdKSLmhFlpLKuqL6GMHPoKib9u0RoIeVCUAD+IT4yRwIkFBYVIX0vlahnLvGHNEeMxA==",
+      "requires": {
+        "antd-theme-generator": "^1.2.8",
+        "webpack-sources": "^2.2.0"
+      },
+      "dependencies": {
+        "webpack-sources": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+          "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+          "requires": {
+            "source-list-map": "^2.0.1",
+            "source-map": "^0.6.1"
+          }
+        }
+      }
+    },
+    "any-observable": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz",
+      "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==",
+      "dev": true
+    },
+    "any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+      "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"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "apollo": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/apollo/-/apollo-2.30.1.tgz",
+      "integrity": "sha512-poh2tja2U8U5bGMxfPQjQP1voz2ZaNm/attwC8zpobdeLoT43LeQfFSTqCVmCMZJAfbMa40Cb54yV66DP2w9fw==",
+      "dev": true,
+      "requires": {
+        "@apollographql/apollo-tools": "^0.4.8",
+        "@oclif/command": "1.7.0",
+        "@oclif/config": "1.16.0",
+        "@oclif/errors": "1.3.3",
+        "@oclif/plugin-autocomplete": "0.2.0",
+        "@oclif/plugin-help": "2.2.3",
+        "@oclif/plugin-not-found": "1.2.4",
+        "@oclif/plugin-plugins": "1.9.0",
+        "@oclif/plugin-warn-if-update-available": "1.7.0",
+        "apollo-codegen-core": "^0.37.7",
+        "apollo-codegen-flow": "^0.35.7",
+        "apollo-codegen-scala": "^0.36.7",
+        "apollo-codegen-swift": "^0.37.7",
+        "apollo-codegen-typescript": "^0.37.7",
+        "apollo-env": "^0.6.5",
+        "apollo-graphql": "^0.5.0",
+        "apollo-language-server": "^1.23.2",
+        "chalk": "2.4.2",
+        "cli-ux": "5.4.9",
+        "env-ci": "3.2.2",
+        "gaze": "1.1.3",
+        "git-parse": "1.0.4",
+        "git-rev-sync": "2.0.0",
+        "git-url-parse": "^11.1.2",
+        "glob": "7.1.5",
+        "graphql": "14.0.2 - 14.2.0 || ^14.3.1 || ^15.0.0",
+        "graphql-tag": "2.10.4",
+        "listr": "0.14.3",
+        "lodash.identity": "3.0.0",
+        "lodash.pickby": "4.6.0",
+        "mkdirp": "0.5.5",
+        "moment": "2.27.0",
+        "strip-ansi": "5.2.0",
+        "table": "5.4.6",
+        "tty": "1.0.1",
+        "vscode-uri": "1.0.6"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "glob": {
+          "version": "7.1.5",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
+          "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
+          "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"
+          }
+        },
+        "graphql-tag": {
+          "version": "2.10.4",
+          "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.10.4.tgz",
+          "integrity": "sha512-O7vG5BT3w6Sotc26ybcvLKNTdfr4GfsIVMD+LdYqXCeJIYPRyp8BIsDOUtxw7S1PYvRw5vH3278J2EDezR6mfA==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "apollo-cache": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/apollo-cache/-/apollo-cache-1.3.5.tgz",
+      "integrity": "sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA==",
+      "dev": true,
+      "requires": {
+        "apollo-utilities": "^1.3.4",
+        "tslib": "^1.10.0"
+      }
+    },
+    "apollo-cache-control": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.11.1.tgz",
+      "integrity": "sha512-6iHa8TkcKt4rx5SKRzDNjUIpCQX+7/FlZwD7vRh9JDnM4VH8SWhpj8fUR3CiEY8Kuc4ChXnOY8bCcMju5KPnIQ==",
+      "dev": true,
+      "requires": {
+        "apollo-server-env": "^2.4.5",
+        "apollo-server-plugin-base": "^0.9.1"
+      }
+    },
+    "apollo-cache-inmemory": {
+      "version": "1.6.6",
+      "resolved": "https://registry.npmjs.org/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz",
+      "integrity": "sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A==",
+      "dev": true,
+      "requires": {
+        "apollo-cache": "^1.3.5",
+        "apollo-utilities": "^1.3.4",
+        "optimism": "^0.10.0",
+        "ts-invariant": "^0.4.0",
+        "tslib": "^1.10.0"
+      }
+    },
+    "apollo-client": {
+      "version": "2.6.10",
+      "resolved": "https://registry.npmjs.org/apollo-client/-/apollo-client-2.6.10.tgz",
+      "integrity": "sha512-jiPlMTN6/5CjZpJOkGeUV0mb4zxx33uXWdj/xQCfAMkuNAC3HN7CvYDyMHHEzmcQ5GV12LszWoQ/VlxET24CtA==",
+      "dev": true,
+      "requires": {
+        "@types/zen-observable": "^0.8.0",
+        "apollo-cache": "1.3.5",
+        "apollo-link": "^1.0.0",
+        "apollo-utilities": "1.3.4",
+        "symbol-observable": "^1.0.2",
+        "ts-invariant": "^0.4.0",
+        "tslib": "^1.10.0",
+        "zen-observable": "^0.8.0"
+      }
+    },
+    "apollo-codegen-core": {
+      "version": "0.37.7",
+      "resolved": "https://registry.npmjs.org/apollo-codegen-core/-/apollo-codegen-core-0.37.7.tgz",
+      "integrity": "sha512-7AMnzS+X7z91eUSctc0mQoQzVJrrKo+zLXevMDkGyTH+q541dYfpAdKQ5nffPcb1ZwwOONZCyl8kc8faJzD0Kw==",
+      "dev": true,
+      "requires": {
+        "@babel/generator": "7.10.4",
+        "@babel/parser": "^7.1.3",
+        "@babel/types": "7.10.4",
+        "apollo-env": "^0.6.5",
+        "apollo-language-server": "^1.23.2",
+        "ast-types": "^0.13.0",
+        "common-tags": "^1.5.1",
+        "recast": "^0.19.0"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz",
+          "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz",
+          "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "recast": {
+          "version": "0.19.1",
+          "resolved": "https://registry.npmjs.org/recast/-/recast-0.19.1.tgz",
+          "integrity": "sha512-8FCjrBxjeEU2O6I+2hyHyBFH1siJbMBLwIRvVr1T3FD2cL754sOaJDsJ/8h3xYltasbJ8jqWRIhMuDGBSiSbjw==",
+          "dev": true,
+          "requires": {
+            "ast-types": "0.13.3",
+            "esprima": "~4.0.0",
+            "private": "^0.1.8",
+            "source-map": "~0.6.1"
+          },
+          "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
+            }
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "apollo-codegen-flow": {
+      "version": "0.35.7",
+      "resolved": "https://registry.npmjs.org/apollo-codegen-flow/-/apollo-codegen-flow-0.35.7.tgz",
+      "integrity": "sha512-q7GsbHE0UtqXFat8wGyidUJRdGkbtfUqCtuQkV5qKOOnudFR32G7dz+6i/Z9R5IqOqWVMpxLq7UeiYRiz8c1dg==",
+      "dev": true,
+      "requires": {
+        "@babel/generator": "7.10.4",
+        "@babel/types": "7.10.4",
+        "apollo-codegen-core": "^0.37.7",
+        "change-case": "^4.0.0",
+        "common-tags": "^1.5.1",
+        "inflected": "^2.0.3"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz",
+          "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz",
+          "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "apollo-codegen-scala": {
+      "version": "0.36.7",
+      "resolved": "https://registry.npmjs.org/apollo-codegen-scala/-/apollo-codegen-scala-0.36.7.tgz",
+      "integrity": "sha512-x8EWMOrW4e/kl5QFUHCJsJzemPk1Fa0hMCyjgnlBGQHBrAkHzc33qMMs6WTGvLLL8x8sMvqxCX+NiE/jgtYEvg==",
+      "dev": true,
+      "requires": {
+        "apollo-codegen-core": "^0.37.7",
+        "change-case": "^4.0.0",
+        "common-tags": "^1.5.1",
+        "inflected": "^2.0.3"
+      }
+    },
+    "apollo-codegen-swift": {
+      "version": "0.37.7",
+      "resolved": "https://registry.npmjs.org/apollo-codegen-swift/-/apollo-codegen-swift-0.37.7.tgz",
+      "integrity": "sha512-97uCfBt3UVq0hlAWIBZpQoZjgdeKGObxsNp2L2R5ldMLoD3cQzjzuUDJGG1DoAsn5RMqv2gGNEk5QZMrWhidLw==",
+      "dev": true,
+      "requires": {
+        "apollo-codegen-core": "^0.37.7",
+        "change-case": "^4.0.0",
+        "common-tags": "^1.5.1",
+        "inflected": "^2.0.3"
+      }
+    },
+    "apollo-codegen-typescript": {
+      "version": "0.37.7",
+      "resolved": "https://registry.npmjs.org/apollo-codegen-typescript/-/apollo-codegen-typescript-0.37.7.tgz",
+      "integrity": "sha512-LIx1tsWqRrhTcYcRPjhbzBwSaCbMK3UKSN+AlOzNDvG/Rm6wFutHznj14kn/iqcIHmCbGGuFNjiZNbLwCJ3SyQ==",
+      "dev": true,
+      "requires": {
+        "@babel/generator": "7.10.4",
+        "@babel/types": "7.10.4",
+        "apollo-codegen-core": "^0.37.7",
+        "change-case": "^4.0.0",
+        "common-tags": "^1.5.1",
+        "inflected": "^2.0.3"
+      },
+      "dependencies": {
+        "@babel/generator": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz",
+          "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "^7.10.4",
+            "jsesc": "^2.5.1",
+            "lodash": "^4.17.13",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/types": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz",
+          "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "lodash": "^4.17.13",
+            "to-fast-properties": "^2.0.0"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "apollo-datasource": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.7.2.tgz",
+      "integrity": "sha512-ibnW+s4BMp4K2AgzLEtvzkjg7dJgCaw9M5b5N0YKNmeRZRnl/I/qBTQae648FsRKgMwTbRQIvBhQ0URUFAqFOw==",
+      "dev": true,
+      "requires": {
+        "apollo-server-caching": "^0.5.2",
+        "apollo-server-env": "^2.4.5"
+      }
+    },
+    "apollo-engine-reporting": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/apollo-engine-reporting/-/apollo-engine-reporting-2.3.0.tgz",
+      "integrity": "sha512-SbcPLFuUZcRqDEZ6mSs8uHM9Ftr8yyt2IEu0JA8c3LNBmYXSLM7MHqFe80SVcosYSTBgtMz8mLJO8orhYoSYZw==",
+      "dev": true,
+      "requires": {
+        "apollo-engine-reporting-protobuf": "^0.5.2",
+        "apollo-graphql": "^0.5.0",
+        "apollo-server-caching": "^0.5.2",
+        "apollo-server-env": "^2.4.5",
+        "apollo-server-errors": "^2.4.2",
+        "apollo-server-plugin-base": "^0.9.1",
+        "apollo-server-types": "^0.5.1",
+        "async-retry": "^1.2.1",
+        "uuid": "^8.0.0"
+      },
+      "dependencies": {
+        "uuid": {
+          "version": "8.3.0",
+          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz",
+          "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==",
+          "dev": true
+        }
+      }
+    },
+    "apollo-engine-reporting-protobuf": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/apollo-engine-reporting-protobuf/-/apollo-engine-reporting-protobuf-0.5.2.tgz",
+      "integrity": "sha512-4wm9FR3B7UvJxcK/69rOiS5CAJPEYKufeRWb257ZLfX7NGFTMqvbc1hu4q8Ch7swB26rTpkzfsftLED9DqH9qg==",
+      "dev": true,
+      "requires": {
+        "@apollo/protobufjs": "^1.0.3"
+      }
+    },
+    "apollo-env": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/apollo-env/-/apollo-env-0.6.5.tgz",
+      "integrity": "sha512-jeBUVsGymeTHYWp3me0R2CZRZrFeuSZeICZHCeRflHTfnQtlmbSXdy5E0pOyRM9CU4JfQkKDC98S1YglQj7Bzg==",
+      "dev": true,
+      "requires": {
+        "@types/node-fetch": "2.5.7",
+        "core-js": "^3.0.1",
+        "node-fetch": "^2.2.0",
+        "sha.js": "^2.4.11"
+      }
+    },
+    "apollo-graphql": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.5.0.tgz",
+      "integrity": "sha512-YSdF/BKPbsnQpxWpmCE53pBJX44aaoif31Y22I/qKpB6ZSGzYijV5YBoCL5Q15H2oA/v/02Oazh9lbp4ek3eig==",
+      "dev": true,
+      "requires": {
+        "apollo-env": "^0.6.5",
+        "lodash.sortby": "^4.7.0"
+      }
+    },
+    "apollo-language-server": {
+      "version": "1.23.2",
+      "resolved": "https://registry.npmjs.org/apollo-language-server/-/apollo-language-server-1.23.2.tgz",
+      "integrity": "sha512-2EfnA0DUVhGk018XYPb44EM+KuBnAqdciRD+j9BuUT3+nVq7pc8pjjcS7M8r5ea8hnOYrAoxC6f4I2YNdhjHJg==",
+      "dev": true,
+      "requires": {
+        "@apollo/federation": "0.17.0",
+        "@apollographql/apollo-tools": "^0.4.8",
+        "@apollographql/graphql-language-service-interface": "^2.0.2",
+        "@endemolshinegroup/cosmiconfig-typescript-loader": "^1.0.0",
+        "apollo-datasource": "^0.7.0",
+        "apollo-env": "^0.6.5",
+        "apollo-graphql": "^0.5.0",
+        "apollo-link": "^1.2.3",
+        "apollo-link-context": "^1.0.9",
+        "apollo-link-error": "^1.1.1",
+        "apollo-link-http": "^1.5.5",
+        "apollo-server-errors": "^2.0.2",
+        "await-to-js": "^2.0.1",
+        "core-js": "^3.0.1",
+        "cosmiconfig": "^5.0.6",
+        "dotenv": "^8.0.0",
+        "glob": "^7.1.3",
+        "graphql": "14.0.2 - 14.2.0 || ^14.3.1 || ^15.0.0",
+        "graphql-tag": "^2.10.1",
+        "lodash.debounce": "^4.0.8",
+        "lodash.merge": "^4.6.1",
+        "minimatch": "^3.0.4",
+        "moment": "2.27.0",
+        "vscode-languageserver": "^5.1.0",
+        "vscode-uri": "1.0.6"
+      }
+    },
+    "apollo-link": {
+      "version": "1.2.14",
+      "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz",
+      "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==",
+      "dev": true,
+      "requires": {
+        "apollo-utilities": "^1.3.0",
+        "ts-invariant": "^0.4.0",
+        "tslib": "^1.9.3",
+        "zen-observable-ts": "^0.8.21"
+      }
+    },
+    "apollo-link-context": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmjs.org/apollo-link-context/-/apollo-link-context-1.0.20.tgz",
+      "integrity": "sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "tslib": "^1.9.3"
+      }
+    },
+    "apollo-link-error": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/apollo-link-error/-/apollo-link-error-1.1.13.tgz",
+      "integrity": "sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "apollo-link-http-common": "^0.2.16",
+        "tslib": "^1.9.3"
+      }
+    },
+    "apollo-link-http": {
+      "version": "1.5.17",
+      "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.17.tgz",
+      "integrity": "sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "apollo-link-http-common": "^0.2.16",
+        "tslib": "^1.9.3"
+      }
+    },
+    "apollo-link-http-common": {
+      "version": "0.2.16",
+      "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz",
+      "integrity": "sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "ts-invariant": "^0.4.0",
+        "tslib": "^1.9.3"
+      }
+    },
+    "apollo-link-persisted-queries": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/apollo-link-persisted-queries/-/apollo-link-persisted-queries-0.2.2.tgz",
+      "integrity": "sha512-YL7XBu/5QsSbbYaWUXgm87T2Hn/2AQZk5Wr8CLXGDr3Wl3E/TRhBhKgQQTly9xhaTi7jgBO+AeIyTH5wCBHA9w==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.1",
+        "hash.js": "^1.1.3"
+      }
+    },
+    "apollo-link-state": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/apollo-link-state/-/apollo-link-state-0.4.2.tgz",
+      "integrity": "sha512-xMPcAfuiPVYXaLwC6oJFIZrKgV3GmdO31Ag2eufRoXpvT0AfJZjdaPB4450Nu9TslHRePN9A3quxNueILlQxlw==",
+      "dev": true,
+      "requires": {
+        "apollo-utilities": "^1.0.8",
+        "graphql-anywhere": "^4.1.0-alpha.0"
+      }
+    },
+    "apollo-link-ws": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmjs.org/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz",
+      "integrity": "sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "tslib": "^1.9.3"
+      }
+    },
+    "apollo-server-caching": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.5.2.tgz",
+      "integrity": "sha512-HUcP3TlgRsuGgeTOn8QMbkdx0hLPXyEJehZIPrcof0ATz7j7aTPA4at7gaiFHCo8gk07DaWYGB3PFgjboXRcWQ==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^5.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "apollo-server-core": {
+      "version": "2.16.1",
+      "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.16.1.tgz",
+      "integrity": "sha512-nuwn5ZBbmzPwDetb3FgiFFJlNK7ZBFg8kis/raymrjd3eBGdNcOyMTJDl6J9673X9Xqp+dXQmFYDW/G3G8S1YA==",
+      "dev": true,
+      "requires": {
+        "@apollographql/apollo-tools": "^0.4.3",
+        "@apollographql/graphql-playground-html": "1.6.26",
+        "@types/graphql-upload": "^8.0.0",
+        "@types/ws": "^7.0.0",
+        "apollo-cache-control": "^0.11.1",
+        "apollo-datasource": "^0.7.2",
+        "apollo-engine-reporting": "^2.3.0",
+        "apollo-server-caching": "^0.5.2",
+        "apollo-server-env": "^2.4.5",
+        "apollo-server-errors": "^2.4.2",
+        "apollo-server-plugin-base": "^0.9.1",
+        "apollo-server-types": "^0.5.1",
+        "apollo-tracing": "^0.11.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "graphql-extensions": "^0.12.4",
+        "graphql-tag": "^2.9.2",
+        "graphql-tools": "^4.0.0",
+        "graphql-upload": "^8.0.2",
+        "loglevel": "^1.6.7",
+        "sha.js": "^2.4.11",
+        "subscriptions-transport-ws": "^0.9.11",
+        "ws": "^6.0.0"
+      }
+    },
+    "apollo-server-env": {
+      "version": "2.4.5",
+      "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-2.4.5.tgz",
+      "integrity": "sha512-nfNhmGPzbq3xCEWT8eRpoHXIPNcNy3QcEoBlzVMjeglrBGryLG2LXwBSPnVmTRRrzUYugX0ULBtgE3rBFNoUgA==",
+      "dev": true,
+      "requires": {
+        "node-fetch": "^2.1.2",
+        "util.promisify": "^1.0.0"
+      }
+    },
+    "apollo-server-errors": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.4.2.tgz",
+      "integrity": "sha512-FeGxW3Batn6sUtX3OVVUm7o56EgjxDlmgpTLNyWcLb0j6P8mw9oLNyAm3B+deHA4KNdNHO5BmHS2g1SJYjqPCQ==",
+      "dev": true
+    },
+    "apollo-server-express": {
+      "version": "2.16.1",
+      "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.16.1.tgz",
+      "integrity": "sha512-Oq5YNcaMYnRk6jDmA9LWf8oSd2KHDVe7jQ4wtooAvG9FVUD+FaFBgSkytXHMvtifQh2wdF07Ri8uDLMz6IQjTw==",
+      "dev": true,
+      "requires": {
+        "@apollographql/graphql-playground-html": "1.6.26",
+        "@types/accepts": "^1.3.5",
+        "@types/body-parser": "1.19.0",
+        "@types/cors": "^2.8.4",
+        "@types/express": "4.17.7",
+        "accepts": "^1.3.5",
+        "apollo-server-core": "^2.16.1",
+        "apollo-server-types": "^0.5.1",
+        "body-parser": "^1.18.3",
+        "cors": "^2.8.4",
+        "express": "^4.17.1",
+        "graphql-subscriptions": "^1.0.0",
+        "graphql-tools": "^4.0.0",
+        "parseurl": "^1.3.2",
+        "subscriptions-transport-ws": "^0.9.16",
+        "type-is": "^1.6.16"
+      }
+    },
+    "apollo-server-plugin-base": {
+      "version": "0.9.1",
+      "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.9.1.tgz",
+      "integrity": "sha512-kvrX4Z3FdpjrZdHkyl5iY2A1Wvp4b6KQp00DeZqss7GyyKNUBKr80/7RQgBLEw7EWM7WB19j459xM/TjvW0FKQ==",
+      "dev": true,
+      "requires": {
+        "apollo-server-types": "^0.5.1"
+      }
+    },
+    "apollo-server-types": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.5.1.tgz",
+      "integrity": "sha512-my2cPw+DAb2qVnIuBcsRKGyS28uIc2vjFxa1NpRoJZe9gK0BWUBk7wzXnIzWy3HZ5Er11e/40MPTUesNfMYNVA==",
+      "dev": true,
+      "requires": {
+        "apollo-engine-reporting-protobuf": "^0.5.2",
+        "apollo-server-caching": "^0.5.2",
+        "apollo-server-env": "^2.4.5"
+      }
+    },
+    "apollo-tracing": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.11.1.tgz",
+      "integrity": "sha512-l7g+uILw7v32GA46IRXIx5XXbZhFI96BhSqrGK9yyvfq+NMcvVZrj3kIhRImPGhAjMdV+5biA/jztabElAbDjg==",
+      "dev": true,
+      "requires": {
+        "apollo-server-env": "^2.4.5",
+        "apollo-server-plugin-base": "^0.9.1"
+      }
+    },
+    "apollo-upload-client": {
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/apollo-upload-client/-/apollo-upload-client-11.0.0.tgz",
+      "integrity": "sha512-JChTrBi1VSF8u6OPrkWUApJlyUvzwhw98kqRB3fSi7/CU6z0OUD42Mee9s5h8mfjKEfOanK6GNZhF4t2tIPXSw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.5.4",
+        "apollo-link": "^1.2.12",
+        "apollo-link-http-common": "^0.2.14",
+        "extract-files": "^5.0.1"
+      }
+    },
+    "apollo-utilities": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz",
+      "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==",
+      "dev": true,
+      "requires": {
+        "@wry/equality": "^0.1.2",
+        "fast-json-stable-stringify": "^2.0.0",
+        "ts-invariant": "^0.4.0",
+        "tslib": "^1.10.0"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+    },
+    "arch": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz",
+      "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==",
+      "dev": true
+    },
+    "archive-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
+      "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=",
+      "dev": true,
+      "requires": {
+        "file-type": "^4.2.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
+          "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=",
+          "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==",
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "arg": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "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-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-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-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+      "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
+      "dev": true
+    },
+    "array-find": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/array-find/-/array-find-1.0.0.tgz",
+      "integrity": "sha1-bI4obRHtdoMn+OYuzuhzU8o+eLg=",
+      "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-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+      "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0",
+        "is-string": "^1.0.5"
+      }
+    },
+    "array-tree-filter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
+      "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "^1.0.1"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "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
+    },
+    "array.prototype.flat": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+      "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "arrify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+      "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+    },
+    "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
+    },
+    "ast-types": {
+      "version": "0.13.3",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz",
+      "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==",
+      "dev": true
+    },
+    "astral-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "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-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "dev": true
+    },
+    "async-retry": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz",
+      "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==",
+      "dev": true,
+      "requires": {
+        "retry": "0.12.0"
+      },
+      "dependencies": {
+        "retry": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+          "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+          "dev": true
+        }
+      }
+    },
+    "async-validator": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz",
+      "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ=="
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+    },
+    "at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+      "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.8.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "await-to-js": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/await-to-js/-/await-to-js-2.1.1.tgz",
+      "integrity": "sha512-CHBC6gQGCIzjZ09tJ+XmpQoZOn4GdWePB4qUweCaKNJ0D3f115YdhmYVTZ4rMVpiJ3cFzZcTYK1VMYEICV4YXw==",
+      "dev": true
+    },
+    "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="
+    },
+    "aws4": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
+      "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA=="
+    },
+    "axios": {
+      "version": "0.21.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+      "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+      "requires": {
+        "follow-redirects": "^1.10.0"
+      },
+      "dependencies": {
+        "follow-redirects": {
+          "version": "1.13.1",
+          "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz",
+          "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg=="
+        }
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "esutils": "^2.0.2",
+        "js-tokens": "^3.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"
+          }
+        },
+        "js-tokens": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+          "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+          "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
+        }
+      }
+    },
+    "babel-core": {
+      "version": "7.0.0-bridge.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
+      "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
+      "dev": true
+    },
+    "babel-eslint": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+      "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@babel/parser": "^7.7.0",
+        "@babel/traverse": "^7.7.0",
+        "@babel/types": "^7.7.0",
+        "eslint-visitor-keys": "^1.0.0",
+        "resolve": "^1.12.0"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "babel-jest": {
+      "version": "25.5.1",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz",
+      "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==",
+      "dev": true,
+      "requires": {
+        "@jest/transform": "^25.5.1",
+        "@jest/types": "^25.5.0",
+        "@types/babel__core": "^7.1.7",
+        "babel-plugin-istanbul": "^6.0.0",
+        "babel-preset-jest": "^25.5.0",
+        "chalk": "^3.0.0",
+        "graceful-fs": "^4.2.4",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "@jest/transform": {
+          "version": "25.5.1",
+          "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz",
+          "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==",
+          "dev": true,
+          "requires": {
+            "@babel/core": "^7.1.0",
+            "@jest/types": "^25.5.0",
+            "babel-plugin-istanbul": "^6.0.0",
+            "chalk": "^3.0.0",
+            "convert-source-map": "^1.4.0",
+            "fast-json-stable-stringify": "^2.0.0",
+            "graceful-fs": "^4.2.4",
+            "jest-haste-map": "^25.5.1",
+            "jest-regex-util": "^25.2.6",
+            "jest-util": "^25.5.0",
+            "micromatch": "^4.0.2",
+            "pirates": "^4.0.1",
+            "realpath-native": "^2.0.0",
+            "slash": "^3.0.0",
+            "source-map": "^0.6.1",
+            "write-file-atomic": "^3.0.0"
+          }
+        },
+        "@jest/types": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
+          "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
+          "dev": true,
+          "requires": {
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^1.1.1",
+            "@types/yargs": "^15.0.0",
+            "chalk": "^3.0.0"
+          }
+        },
+        "@types/yargs": {
+          "version": "15.0.5",
+          "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
+          "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
+          "dev": true,
+          "requires": {
+            "@types/yargs-parser": "*"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "babel-plugin-istanbul": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+          "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.0.0",
+            "@istanbuljs/load-nyc-config": "^1.0.0",
+            "@istanbuljs/schema": "^0.1.2",
+            "istanbul-lib-instrument": "^4.0.0",
+            "test-exclude": "^6.0.0"
+          }
+        },
+        "babel-plugin-jest-hoist": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz",
+          "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==",
+          "dev": true,
+          "requires": {
+            "@babel/template": "^7.3.3",
+            "@babel/types": "^7.3.3",
+            "@types/babel__traverse": "^7.0.6"
+          }
+        },
+        "babel-preset-jest": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz",
+          "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==",
+          "dev": true,
+          "requires": {
+            "babel-plugin-jest-hoist": "^25.5.0",
+            "babel-preset-current-node-syntax": "^0.1.2"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "istanbul-lib-coverage": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+          "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+          "dev": true
+        },
+        "istanbul-lib-instrument": {
+          "version": "4.0.3",
+          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+          "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+          "dev": true,
+          "requires": {
+            "@babel/core": "^7.7.5",
+            "@istanbuljs/schema": "^0.1.2",
+            "istanbul-lib-coverage": "^3.0.0",
+            "semver": "^6.3.0"
+          }
+        },
+        "jest-haste-map": {
+          "version": "25.5.1",
+          "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz",
+          "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^25.5.0",
+            "@types/graceful-fs": "^4.1.2",
+            "anymatch": "^3.0.3",
+            "fb-watchman": "^2.0.0",
+            "fsevents": "^2.1.2",
+            "graceful-fs": "^4.2.4",
+            "jest-serializer": "^25.5.0",
+            "jest-util": "^25.5.0",
+            "jest-worker": "^25.5.0",
+            "micromatch": "^4.0.2",
+            "sane": "^4.0.3",
+            "walker": "^1.0.7",
+            "which": "^2.0.2"
+          }
+        },
+        "jest-regex-util": {
+          "version": "25.2.6",
+          "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+          "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+          "dev": true
+        },
+        "jest-serializer": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz",
+          "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.4"
+          }
+        },
+        "jest-util": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz",
+          "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^25.5.0",
+            "chalk": "^3.0.0",
+            "graceful-fs": "^4.2.4",
+            "is-ci": "^2.0.0",
+            "make-dir": "^3.0.0"
+          }
+        },
+        "jest-worker": {
+          "version": "25.5.0",
+          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz",
+          "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==",
+          "dev": true,
+          "requires": {
+            "merge-stream": "^2.0.0",
+            "supports-color": "^7.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "realpath-native": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+          "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "test-exclude": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+          "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+          "dev": true,
+          "requires": {
+            "@istanbuljs/schema": "^0.1.2",
+            "glob": "^7.1.4",
+            "minimatch": "^3.0.4"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "babel-loader": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+      "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^2.1.0",
+        "loader-utils": "^1.4.0",
+        "mkdirp": "^0.5.3",
+        "pify": "^4.0.1",
+        "schema-utils": "^2.6.5"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0"
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+      "dev": true,
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-import": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.0.tgz",
+      "integrity": "sha512-bHU8m0SrY89ub2hBBuYjbennOeH0YUYkVpH6jxKFk0uD8rhN+0jNHIPtXnac+Vn7N/hgkLGGDcIoYK7je3Hhew==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.0.0",
+        "@babel/runtime": "^7.0.0"
+      }
+    },
+    "babel-plugin-istanbul": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
+      "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "find-up": "^3.0.0",
+        "istanbul-lib-instrument": "^3.3.0",
+        "test-exclude": "^5.2.3"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
+      }
+    },
+    "babel-plugin-jest-hoist": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz",
+      "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==",
+      "dev": true,
+      "requires": {
+        "@types/babel__traverse": "^7.0.6"
+      }
+    },
+    "babel-plugin-require-context-hook": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-require-context-hook/-/babel-plugin-require-context-hook-1.0.0.tgz",
+      "integrity": "sha512-EMZD1563QUqLhzrqcThk759RhuNVX/ZJdrtGK6drwzgvnR+ARjWyXIHPbu+tUNaMGtPz/gQeAM2M6VUw2UiUeA=="
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.26.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+      "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-strict-mode": "^6.24.1",
+        "babel-runtime": "^6.26.0",
+        "babel-template": "^6.26.0",
+        "babel-types": "^6.26.0"
+      }
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.22.0",
+        "babel-types": "^6.24.1"
+      }
+    },
+    "babel-preset-current-node-syntax": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz",
+      "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-bigint": "^7.8.3",
+        "@babel/plugin-syntax-class-properties": "^7.8.3",
+        "@babel/plugin-syntax-import-meta": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "babel-preset-jest": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz",
+      "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
+        "babel-plugin-jest-hoist": "^24.9.0"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "^2.4.0",
+        "regenerator-runtime": "^0.11.0"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.11",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+          "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+        }
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "babel-traverse": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "lodash": "^4.17.4"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "^6.26.0",
+        "babel-messages": "^6.23.0",
+        "babel-runtime": "^6.26.0",
+        "babel-types": "^6.26.0",
+        "babylon": "^6.18.0",
+        "debug": "^2.6.8",
+        "globals": "^9.18.0",
+        "invariant": "^2.2.2",
+        "lodash": "^4.17.4"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "globals": {
+          "version": "9.18.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+          "dev": true
+        }
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "^6.26.0",
+        "esutils": "^2.0.2",
+        "lodash": "^4.17.4",
+        "to-fast-properties": "^1.0.3"
+      },
+      "dependencies": {
+        "to-fast-properties": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+          "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+          "dev": true
+        }
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "backo2": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+      "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "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"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "base64-js": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
+    "bfj": {
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+      "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.5.5",
+        "check-types": "^8.0.3",
+        "hoopy": "^0.1.4",
+        "tryer": "^1.0.1"
+      }
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "dev": true
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "bl": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
+      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^2.3.5",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "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"
+      }
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz",
+      "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "http-errors": {
+          "version": "1.7.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+          "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "boxen": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
+      "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
+      "requires": {
+        "ansi-align": "^3.0.0",
+        "camelcase": "^5.3.1",
+        "chalk": "^3.0.0",
+        "cli-boxes": "^2.2.0",
+        "string-width": "^4.1.0",
+        "term-size": "^2.1.0",
+        "type-fest": "^0.8.1",
+        "widest-line": "^3.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "requires": {
+            "has-flag": "^4.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==",
+      "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"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browser-process-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+      "dev": true
+    },
+    "browser-resolve": {
+      "version": "1.11.3",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+      "dev": true,
+      "requires": {
+        "resolve": "1.1.7"
+      }
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "randombytes": "^2.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "browserify-sign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz",
+      "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.2",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.13.0",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz",
+      "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "^1.0.30001093",
+        "electron-to-chromium": "^1.3.488",
+        "escalade": "^3.0.1",
+        "node-releases": "^1.1.58"
+      }
+    },
+    "bs-logger": {
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz",
+      "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==",
+      "dev": true,
+      "requires": {
+        "fast-json-stable-stringify": "2.x"
+      }
+    },
+    "bser": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+      "dev": true,
+      "requires": {
+        "node-int64": "^0.4.0"
+      }
+    },
+    "buffer": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
+      "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+      "dev": true,
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4"
+      }
+    },
+    "buffer-alloc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+      "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc-unsafe": "^1.1.0",
+        "buffer-fill": "^1.0.0"
+      }
+    },
+    "buffer-alloc-unsafe": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+      "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+      "dev": true
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+      "dev": true
+    },
+    "buffer-fill": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+      "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=",
+      "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
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-json": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz",
+      "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "builtins": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz",
+      "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og="
+    },
+    "busboy": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
+      "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
+      "dev": true,
+      "requires": {
+        "dicer": "0.3.0"
+      }
+    },
+    "byline": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+      "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "dev": true
+    },
+    "cacache": {
+      "version": "15.0.5",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz",
+      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
+      "requires": {
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.0",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      }
+    },
+    "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"
+      }
+    },
+    "cache-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz",
+      "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==",
+      "dev": true,
+      "requires": {
+        "buffer-json": "^2.0.0",
+        "find-cache-dir": "^3.0.0",
+        "loader-utils": "^1.2.3",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+          "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^3.0.2",
+            "pkg-dir": "^4.1.0"
+          }
+        },
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "dev": true,
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "dev": true,
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "cacheable-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "requires": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^3.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^4.1.0",
+        "responselike": "^1.0.2"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "lowercase-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+        }
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "dev": true,
+      "requires": {
+        "callsites": "^2.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "dev": true,
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz",
+      "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==",
+      "dev": true,
+      "requires": {
+        "pascal-case": "^3.1.1",
+        "tslib": "^1.10.0"
+      }
+    },
+    "camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+    },
+    "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-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001109",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001109.tgz",
+      "integrity": "sha512-4JIXRodHzdS3HdK8nSgIqXYLExOvG+D2/EenSvcub2Kp3QEADjo2v2oUn5g0n0D+UNwG9BtwKOyGcSq2qvQXvQ==",
+      "dev": true
+    },
+    "capital-case": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.3.tgz",
+      "integrity": "sha512-OlUSJpUr7SY0uZFOxcwnDOU7/MpHlKTZx2mqnDYQFrDudXLFm0JJ9wr/l4csB+rh2Ug0OPuoSO53PqiZBqno9A==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0",
+        "upper-case-first": "^2.0.1"
+      }
+    },
+    "capture-exit": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+      "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+      "dev": true,
+      "requires": {
+        "rsvp": "^4.8.4"
+      }
+    },
+    "capture-stack-trace": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
+      "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
+      "dev": true
+    },
+    "cardinal": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+      "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=",
+      "dev": true,
+      "requires": {
+        "ansicolors": "~0.3.2",
+        "redeyed": "~2.1.0"
+      }
+    },
+    "case-sensitive-paths-webpack-plugin": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz",
+      "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+    },
+    "caw": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz",
+      "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==",
+      "dev": true,
+      "requires": {
+        "get-proxy": "^2.0.0",
+        "isurl": "^1.0.0-alpha5",
+        "tunnel-agent": "^0.6.0",
+        "url-to-options": "^1.0.1"
+      }
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "requires": {
+        "align-text": "^0.1.3",
+        "lazy-cache": "^1.0.3"
+      }
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "change-case": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.1.tgz",
+      "integrity": "sha512-qRlUWn/hXnX1R1LBDF/RelJLiqNjKjUqlmuBVSEIyye8kq49CXqkZWKmi8XeUAdDXWFOcGLUMZ+aHn3Q5lzUXw==",
+      "dev": true,
+      "requires": {
+        "camel-case": "^4.1.1",
+        "capital-case": "^1.0.3",
+        "constant-case": "^3.0.3",
+        "dot-case": "^3.0.3",
+        "header-case": "^2.0.3",
+        "no-case": "^3.0.3",
+        "param-case": "^3.0.3",
+        "pascal-case": "^3.1.1",
+        "path-case": "^3.0.3",
+        "sentence-case": "^3.0.3",
+        "snake-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+      "dev": true
+    },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+    },
+    "check-types": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+      "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
+      "dev": true
+    },
+    "cheerio": {
+      "version": "1.0.0-rc.3",
+      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
+      "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
+      "dev": true,
+      "requires": {
+        "css-select": "~1.2.0",
+        "dom-serializer": "~0.1.1",
+        "entities": "~1.1.1",
+        "htmlparser2": "^3.9.1",
+        "lodash": "^4.15.0",
+        "parse5": "^3.0.1"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        }
+      }
+    },
+    "chokidar": {
+      "version": "2.1.8",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "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"
+      }
+    },
+    "chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
+    },
+    "chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+    },
+    "cint": {
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz",
+      "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI="
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "classnames": {
+      "version": "2.2.6",
+      "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
+      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+    },
+    "clean-css": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      }
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+    },
+    "cli-boxes": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
+      "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w=="
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "^2.0.0"
+      }
+    },
+    "cli-highlight": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.4.tgz",
+      "integrity": "sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^3.0.0",
+        "highlight.js": "^9.6.0",
+        "mz": "^2.4.0",
+        "parse5": "^5.1.1",
+        "parse5-htmlparser2-tree-adapter": "^5.1.1",
+        "yargs": "^15.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "parse5": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+          "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.4.1",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+          "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+          "dev": true,
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
+    "cli-progress": {
+      "version": "3.8.2",
+      "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.8.2.tgz",
+      "integrity": "sha512-qRwBxLldMSfxB+YGFgNRaj5vyyHe1yMpVeDL79c+7puGujdKJHQHydgqXDcrkvQgJ5U/d3lpf6vffSoVVUftVQ==",
+      "dev": true,
+      "requires": {
+        "colors": "^1.1.2",
+        "string-width": "^4.2.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "colors": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+          "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "cli-spinners": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz",
+      "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==",
+      "dev": true
+    },
+    "cli-table": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
+      "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+      "requires": {
+        "colors": "1.0.3"
+      }
+    },
+    "cli-table3": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
+      "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
+      "dev": true,
+      "requires": {
+        "colors": "^1.1.2",
+        "object-assign": "^4.1.0",
+        "string-width": "^2.1.1"
+      },
+      "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
+        },
+        "colors": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+          "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+          "dev": true,
+          "optional": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "cli-truncate": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
+      "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=",
+      "dev": true,
+      "requires": {
+        "slice-ansi": "0.0.4",
+        "string-width": "^1.0.1"
+      }
+    },
+    "cli-ux": {
+      "version": "5.4.9",
+      "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.9.tgz",
+      "integrity": "sha512-4yCKJbFQqNQxf1v0E5T5aBJLt3SbW6dXc/R7zHp4ycdPMg9fAy5f2vhPsWgXEGCMQg+fgN0Sp7EYcZ1XGkFyUA==",
+      "dev": true,
+      "requires": {
+        "@oclif/command": "^1.6.0",
+        "@oclif/errors": "^1.2.1",
+        "@oclif/linewrap": "^1.0.0",
+        "@oclif/screen": "^1.0.3",
+        "ansi-escapes": "^4.3.0",
+        "ansi-styles": "^4.2.0",
+        "cardinal": "^2.1.1",
+        "chalk": "^3.0.0",
+        "clean-stack": "^3.0.0",
+        "cli-progress": "^3.4.0",
+        "extract-stack": "^2.0.0",
+        "fs-extra": "^9.0.1",
+        "hyperlinker": "^1.0.0",
+        "indent-string": "^4.0.0",
+        "is-wsl": "^2.2.0",
+        "js-yaml": "^3.13.1",
+        "lodash": "^4.17.11",
+        "natural-orderby": "^2.0.1",
+        "object-treeify": "^1.1.4",
+        "password-prompt": "^1.1.2",
+        "semver": "^5.6.0",
+        "string-width": "^4.2.0",
+        "strip-ansi": "^5.1.0",
+        "supports-color": "^7.1.0",
+        "supports-hyperlinks": "^1.0.1",
+        "tslib": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "clean-stack": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.0.tgz",
+          "integrity": "sha512-RHxtgFvXsRQ+1AM7dlozLDY7ssmvUUh0XEnfnyhYgJTO6beNZHBogiaCwGM9Q3rFrUkYxOtsZRC0zAturg5bjg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "4.0.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "fs-extra": {
+          "version": "9.0.1",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^1.0.0"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
+        "jsonfile": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "6.0.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+              "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^5.0.0"
+              }
+            }
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          },
+          "dependencies": {
+            "ansi-regex": {
+              "version": "4.1.0",
+              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+              "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+              "dev": true
+            }
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "tslib": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
+          "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==",
+          "dev": true
+        },
+        "universalify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "dev": true
+        }
+      }
+    },
+    "cli-width": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+      "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+      "dev": true
+    },
+    "clipboard": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
+      "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "clipboardy": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
+      "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==",
+      "dev": true,
+      "requires": {
+        "arch": "^2.1.1",
+        "execa": "^1.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        }
+      }
+    },
+    "cliui": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+      "requires": {
+        "center-align": "^0.1.1",
+        "right-align": "^0.1.1",
+        "wordwrap": "0.0.2"
+      }
+    },
+    "clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+      "dev": true
+    },
+    "clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dev": true,
+      "requires": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "cmd-shim": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-3.0.3.tgz",
+      "integrity": "sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "mkdirp": "~0.5.0"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "dev": true,
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      }
+    },
+    "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="
+    },
+    "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": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
+      "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
+      "dev": true,
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.2"
+      }
+    },
+    "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==",
+      "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="
+    },
+    "color-string": {
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+      "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+      "dev": true,
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "colorette": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+      "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+      "dev": true
+    },
+    "colors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+      "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs="
+    },
+    "combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
+    "commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+    },
+    "common-tags": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+      "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-classes": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz",
+      "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=",
+      "requires": {
+        "component-indexof": "0.0.3"
+      }
+    },
+    "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
+    },
+    "component-indexof": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz",
+      "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ="
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "dev": true,
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+          "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+          "dev": true
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "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"
+      }
+    },
+    "condense-newlines": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz",
+      "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-whitespace": "^0.3.0",
+        "kind-of": "^3.0.2"
+      },
+      "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"
+          }
+        }
+      }
+    },
+    "config-chain": {
+      "version": "1.1.12",
+      "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
+      "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
+      "dev": true,
+      "requires": {
+        "ini": "^1.3.4",
+        "proto-list": "~1.2.1"
+      }
+    },
+    "configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+          "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+          "requires": {
+            "semver": "^6.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+      "dev": true
+    },
+    "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="
+    },
+    "consolidate": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
+      "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
+      "dev": true,
+      "requires": {
+        "bluebird": "^3.1.1"
+      }
+    },
+    "constant-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.3.tgz",
+      "integrity": "sha512-FXtsSnnrFYpzDmvwDGQW+l8XK3GV1coLyBN0eBz16ZUzGaZcT2ANVCJmLeuw2GQgxKHQIe9e0w2dzkSfaRlUmA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0",
+        "upper-case": "^2.0.1"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "contour_plot": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/contour_plot/-/contour_plot-0.0.1.tgz",
+      "integrity": "sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc="
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "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-webpack-plugin": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz",
+      "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.3",
+        "find-cache-dir": "^2.1.0",
+        "glob-parent": "^3.1.0",
+        "globby": "^7.1.1",
+        "is-glob": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "minimatch": "^3.0.4",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^2.1.2",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "globby": {
+          "version": "7.1.1",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+          "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "dir-glob": "^2.0.0",
+            "glob": "^7.1.2",
+            "ignore": "^3.3.5",
+            "pify": "^3.0.0",
+            "slash": "^1.0.0"
+          }
+        },
+        "ignore": {
+          "version": "3.3.10",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+          "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "serialize-javascript": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
+          "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
+          "dev": true
+        },
+        "slash": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "core-js": {
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+      "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
+    },
+    "core-js-compat": {
+      "version": "3.6.5",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+      "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.8.5",
+        "semver": "7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+          "dev": true
+        }
+      }
+    },
+    "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="
+    },
+    "cors": {
+      "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4",
+        "vary": "^1"
+      }
+    },
+    "cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "dev": true,
+      "requires": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
+      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "create-error-class": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+      "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+      "dev": true,
+      "requires": {
+        "capture-stack-trace": "^1.0.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "dev": true,
+      "requires": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+    },
+    "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"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "css-loader": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
+      "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.3.1",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^4.1.1",
+        "loader-utils": "^1.2.3",
+        "normalize-path": "^3.0.0",
+        "postcss": "^7.0.32",
+        "postcss-modules-extract-imports": "^2.0.0",
+        "postcss-modules-local-by-default": "^3.0.2",
+        "postcss-modules-scope": "^2.2.0",
+        "postcss-modules-values": "^3.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^2.7.0",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "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"
+          }
+        }
+      }
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
+        "domutils": "1.5.1",
+        "nth-check": "~1.0.1"
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+      "dev": true
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "dev": true,
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      }
+    },
+    "css-what": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "dev": true
+    },
+    "cssfilter": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
+      "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "dev": true,
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "dev": true
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "dev": true
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
+    },
+    "csso": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
+      "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+      "dev": true,
+      "requires": {
+        "css-tree": "1.0.0-alpha.39"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.0.0-alpha.39",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
+          "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.6",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
+          "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+          "dev": true
+        }
+      }
+    },
+    "cssom": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+      "dev": true
+    },
+    "cssstyle": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
+      "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
+      "dev": true,
+      "requires": {
+        "cssom": "0.3.x"
+      }
+    },
+    "csv-parser": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-1.12.1.tgz",
+      "integrity": "sha512-r45M92nLnGP246ot0Yo5RvbiiMF5Bw/OTIdWJ3OQ4Vbv4hpOeoXVIPxdSmUw+fPJlQOseY+iigJyLSfPMIrddQ==",
+      "dev": true,
+      "requires": {
+        "buffer-alloc": "^1.1.0",
+        "buffer-from": "^1.0.0",
+        "generate-function": "^1.0.1",
+        "generate-object-property": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimist": "^1.2.0",
+        "ndjson": "^1.4.0"
+      }
+    },
+    "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"
+      }
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "dev": true
+    },
+    "d3-color": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
+      "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+    },
+    "d3-dispatch": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
+      "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+    },
+    "d3-ease": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz",
+      "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ=="
+    },
+    "d3-format": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz",
+      "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw=="
+    },
+    "d3-interpolate": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+      "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+      "requires": {
+        "d3-color": "1"
+      }
+    },
+    "d3-selection": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
+      "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
+    },
+    "d3-timer": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
+      "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
+    },
+    "d3-transition": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
+      "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
+      "requires": {
+        "d3-color": "1",
+        "d3-dispatch": "1",
+        "d3-ease": "1",
+        "d3-interpolate": "1",
+        "d3-selection": "^1.1.0",
+        "d3-timer": "1"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "data-urls": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
+      "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "whatwg-mimetype": "^2.2.0",
+        "whatwg-url": "^7.0.0"
+      },
+      "dependencies": {
+        "whatwg-url": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+          "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+          "dev": true,
+          "requires": {
+            "lodash.sortby": "^4.7.0",
+            "tr46": "^1.0.1",
+            "webidl-conversions": "^4.0.2"
+          }
+        }
+      }
+    },
+    "date-fns": {
+      "version": "1.30.1",
+      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz",
+      "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==",
+      "dev": true
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+      "dev": true
+    },
+    "deasync": {
+      "version": "0.1.20",
+      "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.20.tgz",
+      "integrity": "sha512-E1GI7jMI57hL30OX6Ht/hfQU8DO4AuB9m72WFm4c38GNbUD4Q03//XZaOIHZiY+H1xUaomcot5yk2q/qIZQkGQ==",
+      "dev": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "node-addon-api": "^1.7.1"
+      }
+    },
+    "debug": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+      "dev": true,
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "debuglog": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
+      "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI="
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "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
+    },
+    "decompress": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
+      "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.0.0",
+        "decompress-tarbz2": "^4.0.0",
+        "decompress-targz": "^4.0.0",
+        "decompress-unzip": "^4.0.1",
+        "graceful-fs": "^4.1.10",
+        "make-dir": "^1.0.0",
+        "pify": "^2.3.0",
+        "strip-dirs": "^2.0.0"
+      },
+      "dependencies": {
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "decompress-tar": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
+      "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+      "dev": true,
+      "requires": {
+        "file-type": "^5.2.0",
+        "is-stream": "^1.1.0",
+        "tar-stream": "^1.5.2"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-tarbz2": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
+      "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.1.0",
+        "file-type": "^6.1.0",
+        "is-stream": "^1.1.0",
+        "seek-bzip": "^1.0.5",
+        "unbzip2-stream": "^1.0.9"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
+          "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
+          "dev": true
+        }
+      }
+    },
+    "decompress-targz": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
+      "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
+      "dev": true,
+      "requires": {
+        "decompress-tar": "^4.1.1",
+        "file-type": "^5.2.0",
+        "is-stream": "^1.1.0"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+          "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=",
+          "dev": true
+        }
+      }
+    },
+    "decompress-unzip": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
+      "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=",
+      "dev": true,
+      "requires": {
+        "file-type": "^3.8.0",
+        "get-stream": "^2.2.0",
+        "pify": "^2.3.0",
+        "yauzl": "^2.4.2"
+      },
+      "dependencies": {
+        "file-type": {
+          "version": "3.9.0",
+          "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+          "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
+          "dev": true
+        },
+        "get-stream": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+          "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "pinkie-promise": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "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
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "dev": true
+    },
+    "default-gateway": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz",
+      "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==",
+      "dev": true,
+      "requires": {
+        "execa": "^3.3.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        }
+      }
+    },
+    "defaults": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+      "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+      "dev": true,
+      "requires": {
+        "clone": "^1.0.2"
+      }
+    },
+    "defer-to-connect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+    },
+    "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==",
+      "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"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+    },
+    "del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+    },
+    "deprecated-decorator": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
+      "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-browser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.1.1.tgz",
+      "integrity": "sha512-5n2aWI57qC3kZaK4j2zYsG6L1LrxgLptGCNhMQgdKhVn6cSdcq43pp6xHPfTHG3TYM6myF4tIPWiZtfdVDgb9w=="
+    },
+    "detect-indent": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
+      "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
+      "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
+    },
+    "detect-node": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+      "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+      "dev": true
+    },
+    "dezalgo": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz",
+      "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=",
+      "requires": {
+        "asap": "^2.0.0",
+        "wrappy": "1"
+      }
+    },
+    "dicer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
+      "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
+      "dev": true,
+      "requires": {
+        "streamsearch": "0.1.2"
+      }
+    },
+    "diff": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+      "dev": true
+    },
+    "diff-sequences": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
+      "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "dir-glob": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
+      "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+      "dev": true,
+      "requires": {
+        "path-type": "^3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "requires": {
+        "esutils": "^2.0.2"
+      }
+    },
+    "dom-align": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz",
+      "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA=="
+    },
+    "dom-closest": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-closest/-/dom-closest-0.2.0.tgz",
+      "integrity": "sha1-69n5HRvyLo1vR3h2u80+yQIWwM8=",
+      "requires": {
+        "dom-matches": ">=1.0.1"
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "dev": true,
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-event-types": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz",
+      "integrity": "sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==",
+      "dev": true
+    },
+    "dom-matches": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-matches/-/dom-matches-2.0.0.tgz",
+      "integrity": "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw="
+    },
+    "dom-scroll-into-view": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz",
+      "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
+    },
+    "dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "dev": true
+    },
+    "domexception": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
+      "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+      "dev": true,
+      "requires": {
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "dot-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz",
+      "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "dot-object": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-1.9.0.tgz",
+      "integrity": "sha512-7MPN6y7XhAO4vM4eguj5+5HNKLjJYfkVG1ZR1Aput4Q4TR6SYeSjhpVQ77IzJHoSHffKbDxBC+48aCiiRurDPw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "glob": "^7.1.4"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        }
+      }
+    },
+    "dot-prop": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+      "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "dotenv": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+      "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
+      "dev": true
+    },
+    "dotenv-expand": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+      "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+      "dev": true
+    },
+    "dotignore": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
+      "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "download": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz",
+      "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==",
+      "dev": true,
+      "requires": {
+        "archive-type": "^4.0.0",
+        "caw": "^2.0.1",
+        "content-disposition": "^0.5.2",
+        "decompress": "^4.2.0",
+        "ext-name": "^5.0.0",
+        "file-type": "^8.1.0",
+        "filenamify": "^2.0.0",
+        "get-stream": "^3.0.0",
+        "got": "^8.3.1",
+        "make-dir": "^1.2.0",
+        "p-event": "^2.1.0",
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "@sindresorhus/is": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
+          "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
+          "dev": true
+        },
+        "cacheable-request": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
+          "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
+          "dev": true,
+          "requires": {
+            "clone-response": "1.0.2",
+            "get-stream": "3.0.0",
+            "http-cache-semantics": "3.8.1",
+            "keyv": "3.0.0",
+            "lowercase-keys": "1.0.0",
+            "normalize-url": "2.0.1",
+            "responselike": "1.0.2"
+          },
+          "dependencies": {
+            "lowercase-keys": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+              "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+              "dev": true
+            }
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "got": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
+          "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
+          "dev": true,
+          "requires": {
+            "@sindresorhus/is": "^0.7.0",
+            "cacheable-request": "^2.1.1",
+            "decompress-response": "^3.3.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^3.0.0",
+            "into-stream": "^3.1.0",
+            "is-retry-allowed": "^1.1.0",
+            "isurl": "^1.0.0-alpha5",
+            "lowercase-keys": "^1.0.0",
+            "mimic-response": "^1.0.0",
+            "p-cancelable": "^0.4.0",
+            "p-timeout": "^2.0.1",
+            "pify": "^3.0.0",
+            "safe-buffer": "^5.1.1",
+            "timed-out": "^4.0.1",
+            "url-parse-lax": "^3.0.0",
+            "url-to-options": "^1.0.1"
+          }
+        },
+        "http-cache-semantics": {
+          "version": "3.8.1",
+          "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+          "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==",
+          "dev": true
+        },
+        "into-stream": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+          "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
+          "dev": true,
+          "requires": {
+            "from2": "^2.1.1",
+            "p-is-promise": "^1.1.0"
+          }
+        },
+        "keyv": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
+          "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+          "dev": true,
+          "requires": {
+            "json-buffer": "3.0.0"
+          }
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "normalize-url": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+          "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+          "dev": true,
+          "requires": {
+            "prepend-http": "^2.0.0",
+            "query-string": "^5.0.1",
+            "sort-keys": "^2.0.0"
+          }
+        },
+        "p-cancelable": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+          "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+          "dev": true
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "sort-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+          "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
+          "dev": true,
+          "requires": {
+            "is-plain-obj": "^1.0.0"
+          }
+        }
+      }
+    },
+    "download-git-repo": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/download-git-repo/-/download-git-repo-3.0.2.tgz",
+      "integrity": "sha512-N8hWXD4hXqmEcNoR8TBYFntaOcYvEQ7Bz90mgm3bZRTuteGQqwT32VDMnTyD0KTEvb8BWrMc1tVmzuV9u/WrAg==",
+      "dev": true,
+      "requires": {
+        "download": "^7.1.0",
+        "git-clone": "^0.1.0",
+        "rimraf": "^3.0.0"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "dev": true
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+    },
+    "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"
+      }
+    },
+    "easy-stack": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz",
+      "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "editorconfig": {
+      "version": "0.15.3",
+      "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
+      "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.19.0",
+        "lru-cache": "^4.1.5",
+        "semver": "^5.6.0",
+        "sigmund": "^1.0.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "ejs": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+      "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.514",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.514.tgz",
+      "integrity": "sha512-8vb8zKIeGlZigeDzNWWthmGeLzo5CC43Lc+CZshMs7UXFVMPNLtXJGa/txedpu3OJFrXXVheBwp9PqOJJlHQ8w==",
+      "dev": true
+    },
+    "elegant-spinner": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz",
+      "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=",
+      "dev": true
+    },
+    "elliptic": {
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
+      "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.4.0",
+        "brorand": "^1.0.1",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+    },
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "encoding": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+      "optional": true,
+      "requires": {
+        "iconv-lite": "^0.6.2"
+      }
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
+      "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "dependencies": {
+        "memory-fs": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+          "dev": true,
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        }
+      }
+    },
+    "enquire.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz",
+      "integrity": "sha1-PoeAybi4NQhMP2DhZtvDwqPImBQ="
+    },
+    "entities": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+      "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+      "dev": true
+    },
+    "env-ci": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.2.2.tgz",
+      "integrity": "sha512-AOiNZ3lmxrtva3r/roqaYDF+1PX2V+ouUzuGqJf7KNxyyYkuU+CsfFbbUeibQPdixxjI/lP6eDtvtkX1/wymJw==",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0",
+        "java-properties": "^1.0.0"
+      }
+    },
+    "env-paths": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz",
+      "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA=="
+    },
+    "envinfo": {
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz",
+      "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==",
+      "dev": true
+    },
+    "err-code": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
+      "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA="
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "dev": true,
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "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"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
+      "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
+      "dev": true,
+      "requires": {
+        "stackframe": "^1.1.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.17.6",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "requires": {
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1",
+        "is-callable": "^1.2.0",
+        "is-regex": "^1.1.0",
+        "object-inspect": "^1.7.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.0",
+        "string.prototype.trimend": "^1.0.1",
+        "string.prototype.trimstart": "^1.0.1"
+      },
+      "dependencies": {
+        "is-regex": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+          "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+          "requires": {
+            "has-symbols": "^1.0.1"
+          }
+        }
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escalade": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz",
+      "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==",
+      "dev": true
+    },
+    "escape-goat": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "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="
+    },
+    "escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "dev": true,
+      "requires": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1",
+        "source-map": "~0.6.1"
+      }
+    },
+    "eslint": {
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "ajv": "^6.10.0",
+        "chalk": "^2.1.0",
+        "cross-spawn": "^6.0.5",
+        "debug": "^4.0.1",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^5.0.0",
+        "eslint-utils": "^1.4.3",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.1.2",
+        "esquery": "^1.0.1",
+        "esutils": "^2.0.2",
+        "file-entry-cache": "^5.0.1",
+        "functional-red-black-tree": "^1.0.1",
+        "glob-parent": "^5.0.0",
+        "globals": "^12.1.0",
+        "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "inquirer": "^7.0.0",
+        "is-glob": "^4.0.0",
+        "js-yaml": "^3.13.1",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.3.0",
+        "lodash": "^4.17.14",
+        "minimatch": "^3.0.4",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.8.3",
+        "progress": "^2.0.0",
+        "regexpp": "^2.0.1",
+        "semver": "^6.1.2",
+        "strip-ansi": "^5.2.0",
+        "strip-json-comments": "^3.0.1",
+        "table": "^5.2.3",
+        "text-table": "^0.2.0",
+        "v8-compile-cache": "^2.0.3"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eslint-scope": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+          "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "globals": {
+          "version": "12.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.8.1"
+          }
+        },
+        "import-fresh": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "dev": true
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-config-standard": {
+      "version": "14.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz",
+      "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==",
+      "dev": true
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+      "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "resolve": "^1.13.1"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "eslint-import-resolver-webpack": {
+      "version": "0.12.2",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.12.2.tgz",
+      "integrity": "sha512-7Jnm4YAoNNkvqPaZkKdIHsKGmv8/uNnYC5QsXkiSodvX4XEEfH2AKOna98FK52fCDXm3q4HzuX+7pRMKkJ64EQ==",
+      "dev": true,
+      "requires": {
+        "array-find": "^1.0.0",
+        "debug": "^2.6.9",
+        "enhanced-resolve": "^0.9.1",
+        "find-root": "^1.1.0",
+        "has": "^1.0.3",
+        "interpret": "^1.2.0",
+        "lodash": "^4.17.15",
+        "node-libs-browser": "^1.0.0 || ^2.0.0",
+        "resolve": "^1.13.1",
+        "semver": "^5.7.1"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "enhanced-resolve": {
+          "version": "0.9.1",
+          "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
+          "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "memory-fs": "^0.2.0",
+            "tapable": "^0.1.8"
+          }
+        },
+        "memory-fs": {
+          "version": "0.2.0",
+          "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
+          "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        },
+        "tapable": {
+          "version": "0.1.10",
+          "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
+          "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-loader": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
+      "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
+      "dev": true,
+      "requires": {
+        "loader-fs-cache": "^1.0.0",
+        "loader-utils": "^1.0.2",
+        "object-assign": "^4.0.1",
+        "object-hash": "^1.1.4",
+        "rimraf": "^2.6.1"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+      "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "pkg-dir": "^2.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "pkg-dir": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.1.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-es": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+      "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+      "dev": true,
+      "requires": {
+        "eslint-utils": "^2.0.0",
+        "regexpp": "^3.0.0"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "regexpp": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+          "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-html": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.0.2.tgz",
+      "integrity": "sha512-Ik/z32UteKLo8GEfwNqVKcJ/WOz/be4h8N5mbMmxxnZ+9aL9XczOXQFz/bGu+nAGVoRg8CflldxJhONFpqlrxw==",
+      "dev": true,
+      "requires": {
+        "htmlparser2": "^4.1.0"
+      },
+      "dependencies": {
+        "dom-serializer": {
+          "version": "0.2.2",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+          "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "entities": "^2.0.0"
+          }
+        },
+        "domelementtype": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
+          "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
+          "dev": true
+        },
+        "domhandler": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz",
+          "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1"
+          }
+        },
+        "domutils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.1.0.tgz",
+          "integrity": "sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "^0.2.1",
+            "domelementtype": "^2.0.1",
+            "domhandler": "^3.0.0"
+          }
+        },
+        "htmlparser2": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+          "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
+          "dev": true,
+          "requires": {
+            "domelementtype": "^2.0.1",
+            "domhandler": "^3.0.0",
+            "domutils": "^2.0.0",
+            "entities": "^2.0.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.22.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz",
+      "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==",
+      "dev": true,
+      "requires": {
+        "array-includes": "^3.1.1",
+        "array.prototype.flat": "^1.2.3",
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.3",
+        "eslint-module-utils": "^2.6.0",
+        "has": "^1.0.3",
+        "minimatch": "^3.0.4",
+        "object.values": "^1.1.1",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.17.0",
+        "tsconfig-paths": "^3.9.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "find-up": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+          "dev": true,
+          "requires": {
+            "locate-path": "^2.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+          "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^2.2.0",
+            "pify": "^2.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+          "dev": true,
+          "requires": {
+            "p-locate": "^2.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-limit": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+          "dev": true,
+          "requires": {
+            "p-try": "^1.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+          "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+          "dev": true,
+          "requires": {
+            "p-limit": "^1.1.0"
+          }
+        },
+        "p-try": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "^2.0.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+          "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^2.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^2.0.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+          "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+          "dev": true,
+          "requires": {
+            "find-up": "^2.0.0",
+            "read-pkg": "^2.0.0"
+          }
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+      "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+      "dev": true,
+      "requires": {
+        "eslint-plugin-es": "^3.0.0",
+        "eslint-utils": "^2.0.0",
+        "ignore": "^5.1.1",
+        "minimatch": "^3.0.4",
+        "resolve": "^1.10.1",
+        "semver": "^6.1.0"
+      },
+      "dependencies": {
+        "eslint-utils": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+          "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+          "dev": true,
+          "requires": {
+            "eslint-visitor-keys": "^1.1.0"
+          }
+        },
+        "ignore": {
+          "version": "5.1.8",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+          "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-promise": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz",
+      "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==",
+      "dev": true
+    },
+    "eslint-plugin-standard": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz",
+      "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==",
+      "dev": true
+    },
+    "eslint-plugin-vue": {
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
+      "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
+      "dev": true,
+      "requires": {
+        "natural-compare": "^1.4.0",
+        "semver": "^5.6.0",
+        "vue-eslint-parser": "^7.0.0"
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "dev": true,
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "eslint-utils": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+      "dev": true,
+      "requires": {
+        "eslint-visitor-keys": "^1.1.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+      "dev": true
+    },
+    "esm": {
+      "version": "3.2.25",
+      "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+      "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+      "dev": true
+    },
+    "espree": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-jsx": "^5.2.0",
+        "eslint-visitor-keys": "^1.1.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
+          "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+          "dev": true
+        }
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+    },
+    "esquery": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "^5.1.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
+          "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+          "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.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-pubsub": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz",
+      "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==",
+      "dev": true
+    },
+    "eventemitter3": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
+      "dev": true
+    },
+    "events": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+      "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+      "dev": true,
+      "requires": {
+        "original": "^1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "exec-sh": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
+      "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
+      "dev": true,
+      "requires": {
+        "merge": "^1.2.0"
+      }
+    },
+    "execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      }
+    },
+    "exit": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+      "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": {
+        "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"
+          }
+        },
+        "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"
+      }
+    },
+    "expect": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
+      "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "ansi-styles": "^3.2.0",
+        "jest-get-type": "^24.9.0",
+        "jest-matcher-utils": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-regex-util": "^24.9.0"
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+          "dev": true
+        }
+      }
+    },
+    "express-history-api-fallback": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/express-history-api-fallback/-/express-history-api-fallback-2.2.1.tgz",
+      "integrity": "sha1-OirSf3vryQ/FM9EQ18bYMJe80Fc=",
+      "dev": true
+    },
+    "ext-list": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+      "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+      "dev": true,
+      "requires": {
+        "mime-db": "^1.28.0"
+      }
+    },
+    "ext-name": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
+      "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
+      "dev": true,
+      "requires": {
+        "ext-list": "^2.0.0",
+        "sort-keys-length": "^1.0.0"
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dev": true,
+      "requires": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
+      }
+    },
+    "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"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "extract-files": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-5.0.1.tgz",
+      "integrity": "sha512-qRW6y9eKF0VbCyOoOEtFhzJ3uykAw8GKwQVXyAIqwocyEWW4m+v+evec34RwtUkkxxHh7NKBLJ6AnXM8W4dH5w==",
+      "dev": true
+    },
+    "extract-from-css": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/extract-from-css/-/extract-from-css-0.4.4.tgz",
+      "integrity": "sha1-HqffLnx8brmSL6COitrqSG9vj5I=",
+      "dev": true,
+      "requires": {
+        "css": "^2.1.0"
+      }
+    },
+    "extract-stack": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-2.0.0.tgz",
+      "integrity": "sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==",
+      "dev": true
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fast-glob": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+      "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+      "dev": true,
+      "requires": {
+        "@mrmlnc/readdir-enhanced": "^2.2.1",
+        "@nodelib/fs.stat": "^1.1.2",
+        "glob-parent": "^3.1.0",
+        "is-glob": "^4.0.0",
+        "merge2": "^1.2.3",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "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
+    },
+    "fastq": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
+      "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+      "dev": true,
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fb-watchman": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+      "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+      "dev": true,
+      "requires": {
+        "bser": "2.1.1"
+      }
+    },
+    "fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+      "dev": true,
+      "requires": {
+        "pend": "~1.2.0"
+      }
+    },
+    "fecha": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
+      "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
+    },
+    "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": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "dev": true,
+      "requires": {
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "file-loader": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
+      "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "schema-utils": "^2.5.0"
+      }
+    },
+    "file-type": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz",
+      "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==",
+      "dev": true
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true
+    },
+    "filename-reserved-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+      "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=",
+      "dev": true
+    },
+    "filenamify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz",
+      "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==",
+      "dev": true,
+      "requires": {
+        "filename-reserved-regex": "^2.0.0",
+        "strip-outer": "^1.0.0",
+        "trim-repeated": "^1.0.0"
+      }
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+      "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+      "dev": true
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "find-babel-config": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz",
+      "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==",
+      "dev": true,
+      "requires": {
+        "json5": "^0.5.1",
+        "path-exists": "^3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+      "dev": true,
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      }
+    },
+    "find-root": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+      "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+      "dev": true
+    },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
+    "fkill": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/fkill/-/fkill-6.2.0.tgz",
+      "integrity": "sha512-VoPpKScAzvZ07jtciOY0bJieJwyd/VVCuo4fn3nBLh4iBagzYED7GLQeFBpMpy7HP5edEKTDo8yxaIrYrwb7hg==",
+      "dev": true,
+      "requires": {
+        "aggregate-error": "^3.0.0",
+        "arrify": "^2.0.1",
+        "execa": "^1.0.0",
+        "pid-from-port": "^1.1.3",
+        "process-exists": "^3.1.0",
+        "taskkill": "^3.0.0"
+      }
+    },
+    "flat": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "dev": true
+    },
+    "flat-cache": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "dev": true,
+      "requires": {
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "flatted": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "dev": true
+    },
+    "flow-parser": {
+      "version": "0.130.0",
+      "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.130.0.tgz",
+      "integrity": "sha512-h9NATB7QsKhj2ucgEH2XzB7p+5ubk8IZX5u/qHkN+oyQoECi1diq6mYfIuYBOyL35f3AhJf/YDkBYQBTqqYK+w==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "fmin": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/fmin/-/fmin-0.0.2.tgz",
+      "integrity": "sha1-Wbu0DUP/3ByUzQClaMQflfGXMBc=",
+      "requires": {
+        "contour_plot": "^0.0.1",
+        "json2module": "^0.0.3",
+        "rollup": "^0.25.8",
+        "tape": "^4.5.1",
+        "uglify-js": "^2.6.2"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+      "dev": true,
+      "requires": {
+        "debug": "=3.1.0"
+      }
+    },
+    "for-each": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+      "requires": {
+        "is-callable": "^1.1.3"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+    },
+    "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==",
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-capacitor": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz",
+      "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==",
+      "dev": true
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+      "dev": true
+    },
+    "fs-exists-sync": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+      "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+      "dev": true
+    },
+    "fs-extra": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      }
+    },
+    "fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "fswin": {
+      "version": "2.17.1227",
+      "resolved": "https://registry.npmjs.org/fswin/-/fswin-2.17.1227.tgz",
+      "integrity": "sha512-xNDktvwzSsXT8Xqnpz59VbuFwGHhtn1w+dS7QQ+wAu5cbH0p3WMGKU9Duf7cPna+nubhR+5ZG1MTl6/V6xgRgw==",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "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": "1.1.0",
+      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-1.1.0.tgz",
+      "integrity": "sha1-VMIbCAGSsW2Yd3ecW7gWZudyNl8=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "dev": true
+    },
+    "get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+      "dev": true
+    },
+    "get-proxy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz",
+      "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==",
+      "dev": true,
+      "requires": {
+        "npm-conf": "^1.1.0"
+      }
+    },
+    "get-stdin": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+      "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg=="
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "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=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "git-clone": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/git-clone/-/git-clone-0.1.0.tgz",
+      "integrity": "sha1-DXYWN3gJOu9/HDAjjyqe8/B6Lrk=",
+      "dev": true
+    },
+    "git-config-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-1.0.1.tgz",
+      "integrity": "sha1-bTP37WPbDQ4RgTFQO6s6ykfVRmQ=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "fs-exists-sync": "^0.1.0",
+        "homedir-polyfill": "^1.0.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"
+          }
+        }
+      }
+    },
+    "git-parse": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/git-parse/-/git-parse-1.0.4.tgz",
+      "integrity": "sha512-NSC71SqG6jN0XYPbib8t/mgguVLddw+xvkkLv2EsCFvHfsZjO+ZqMcGoGHHMqfhZllCDDAkOwZESkZEmICj9ZA==",
+      "dev": true,
+      "requires": {
+        "byline": "5.0.0",
+        "util.promisify": "1.0.1"
+      }
+    },
+    "git-rev-sync": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-2.0.0.tgz",
+      "integrity": "sha512-vnHFv2eocTmt/wHqZm3ksxtVshK4vptT0cEoumk6hAYRFx3do6Qo7xHBTBCv29+r3ZZCQOQ1i328MUCsYF7AUw==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5",
+        "graceful-fs": "4.1.15",
+        "shelljs": "0.7.7"
+      },
+      "dependencies": {
+        "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
+        }
+      }
+    },
+    "git-up": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz",
+      "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==",
+      "dev": true,
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "parse-url": "^5.0.0"
+      }
+    },
+    "git-url-parse": {
+      "version": "11.1.2",
+      "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz",
+      "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==",
+      "dev": true,
+      "requires": {
+        "git-up": "^4.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "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-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
+    "global-dirs": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
+      "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+      "requires": {
+        "ini": "^1.3.5"
+      }
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true
+    },
+    "globby": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+      "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+      "dev": true,
+      "requires": {
+        "@types/glob": "^7.1.1",
+        "array-union": "^1.0.2",
+        "dir-glob": "^2.2.2",
+        "fast-glob": "^2.2.6",
+        "glob": "^7.1.3",
+        "ignore": "^4.0.3",
+        "pify": "^4.0.1",
+        "slash": "^2.0.0"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "globule": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz",
+      "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
+      "dev": true,
+      "requires": {
+        "glob": "~7.1.1",
+        "lodash": "~4.17.10",
+        "minimatch": "~3.0.2"
+      }
+    },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "requires": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "requires": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+      "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
+    },
+    "graceful-readlink": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+      "dev": true
+    },
+    "graphql": {
+      "version": "14.7.0",
+      "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.7.0.tgz",
+      "integrity": "sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==",
+      "dev": true,
+      "requires": {
+        "iterall": "^1.2.2"
+      }
+    },
+    "graphql-anywhere": {
+      "version": "4.2.7",
+      "resolved": "https://registry.npmjs.org/graphql-anywhere/-/graphql-anywhere-4.2.7.tgz",
+      "integrity": "sha512-fJHvVywWVWjiHuPIMs16Nfjf4zdQUwSO1LKycwBJCWIPeoeQ8LqXK2BgYoZAHkhKEFktZZeYyzS4o/uIUG0z5A==",
+      "dev": true,
+      "requires": {
+        "apollo-utilities": "^1.3.4",
+        "ts-invariant": "^0.3.2",
+        "tslib": "^1.10.0"
+      },
+      "dependencies": {
+        "ts-invariant": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.3.3.tgz",
+          "integrity": "sha512-UReOKsrJFGC9tUblgSRWo+BsVNbEd77Cl6WiV/XpMlkifXwNIJbknViCucHvVZkXSC/mcWeRnIGdY7uprcwvdQ==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.3"
+          }
+        }
+      }
+    },
+    "graphql-extensions": {
+      "version": "0.12.4",
+      "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.12.4.tgz",
+      "integrity": "sha512-GnR4LiWk3s2bGOqIh6V1JgnSXw2RCH4NOgbCFEWvB6JqWHXTlXnLZ8bRSkCiD4pltv7RHUPWqN/sGh8R6Ae/ag==",
+      "dev": true,
+      "requires": {
+        "@apollographql/apollo-tools": "^0.4.3",
+        "apollo-server-env": "^2.4.5",
+        "apollo-server-types": "^0.5.1"
+      }
+    },
+    "graphql-subscriptions": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.1.0.tgz",
+      "integrity": "sha512-6WzlBFC0lWmXJbIVE8OgFgXIP4RJi3OQgTPa0DVMsDXdpRDjTsM1K9wfl5HSYX7R87QAGlvcv2Y4BIZa/ItonA==",
+      "dev": true,
+      "requires": {
+        "iterall": "^1.2.1"
+      }
+    },
+    "graphql-tag": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.11.0.tgz",
+      "integrity": "sha512-VmsD5pJqWJnQZMUeRwrDhfgoyqcfwEkvtpANqcoUG8/tOLkwNgU9mzub/Mc78OJMhHjx7gfAMTxzdG43VGg3bA==",
+      "dev": true
+    },
+    "graphql-tools": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz",
+      "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==",
+      "dev": true,
+      "requires": {
+        "apollo-link": "^1.2.14",
+        "apollo-utilities": "^1.0.1",
+        "deprecated-decorator": "^0.1.6",
+        "iterall": "^1.1.3",
+        "uuid": "^3.1.0"
+      }
+    },
+    "graphql-type-json": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.3.2.tgz",
+      "integrity": "sha512-J+vjof74oMlCWXSvt0DOf2APEdZOCdubEvGDUAlqH//VBYcOYsGgRW7Xzorr44LvkjiuvecWc8fChxuZZbChtg==",
+      "dev": true
+    },
+    "graphql-upload": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/graphql-upload/-/graphql-upload-8.1.0.tgz",
+      "integrity": "sha512-U2OiDI5VxYmzRKw0Z2dmfk0zkqMRaecH9Smh1U277gVgVe9Qn+18xqf4skwr4YJszGIh7iQDZ57+5ygOK9sM/Q==",
+      "dev": true,
+      "requires": {
+        "busboy": "^0.3.1",
+        "fs-capacitor": "^2.0.4",
+        "http-errors": "^1.7.3",
+        "object-path": "^0.11.4"
+      }
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+      "dev": true
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+    },
+    "har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "requires": {
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "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="
+    },
+    "has-symbol-support-x": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+      "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
+      "dev": true
+    },
+    "has-symbols": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+      "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
+    },
+    "has-to-string-tag-x": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+      "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+      "dev": true,
+      "requires": {
+        "has-symbol-support-x": "^1.4.1"
+      }
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "has-yarn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.2.1",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+          "dev": true
+        }
+      }
+    },
+    "hash-sum": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+      "dev": true
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "dev": true
+    },
+    "header-case": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.3.tgz",
+      "integrity": "sha512-LChe/V32mnUQnTwTxd3aAlNMk8ia9tjCDb/LjYtoMrdAPApxLB+azejUk5ERZIZdIqvinwv6BAUuFXH/tQPdZA==",
+      "dev": true,
+      "requires": {
+        "capital-case": "^1.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "dev": true
+    },
+    "highlight.js": {
+      "version": "9.18.3",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.3.tgz",
+      "integrity": "sha512-zBZAmhSupHIl5sITeMqIJnYCDfAEc3Gdkqj65wC1lpI468MMQeeQkhcIAvk+RylAkxrCcI9xy9piHiXeQ1BdzQ==",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "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"
+      }
+    },
+    "hoopy": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz",
+      "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz",
+      "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==",
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "dev": true
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "dev": true
+    },
+    "html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
+      "dev": true
+    },
+    "html-encoding-sniffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+      "dev": true,
+      "requires": {
+        "whatwg-encoding": "^1.0.1"
+      }
+    },
+    "html-entities": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+      "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
+      "dev": true
+    },
+    "html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.21",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+      "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.x",
+        "clean-css": "4.2.x",
+        "commander": "2.17.x",
+        "he": "1.2.x",
+        "param-case": "2.1.x",
+        "relateurl": "0.2.x",
+        "uglify-js": "3.4.x"
+      },
+      "dependencies": {
+        "camel-case": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+          "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+          "dev": true,
+          "requires": {
+            "no-case": "^2.2.0",
+            "upper-case": "^1.1.1"
+          }
+        },
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+          "dev": true
+        },
+        "lower-case": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+          "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+          "dev": true
+        },
+        "no-case": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+          "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+          "dev": true,
+          "requires": {
+            "lower-case": "^1.1.1"
+          }
+        },
+        "param-case": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+          "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+          "dev": true,
+          "requires": {
+            "no-case": "^2.2.0"
+          }
+        },
+        "uglify-js": {
+          "version": "3.4.10",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
+          "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
+          "dev": true,
+          "requires": {
+            "commander": "~2.19.0",
+            "source-map": "~0.6.1"
+          },
+          "dependencies": {
+            "commander": {
+              "version": "2.19.0",
+              "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+              "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+              "dev": true
+            }
+          }
+        },
+        "upper-case": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+          "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+          "dev": true
+        }
+      }
+    },
+    "html-tags": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
+      "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=",
+      "dev": true
+    },
+    "html-webpack-plugin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+      "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+      "dev": true,
+      "requires": {
+        "html-minifier": "^3.2.3",
+        "loader-utils": "^0.2.16",
+        "lodash": "^4.17.3",
+        "pretty-error": "^2.0.2",
+        "tapable": "^1.0.0",
+        "toposort": "^1.0.0",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "big.js": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+          "dev": true
+        },
+        "emojis-list": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0",
+            "object-assign": "^4.0.1"
+          }
+        },
+        "util.promisify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+          "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+          "dev": true,
+          "requires": {
+            "define-properties": "^1.1.2",
+            "object.getownpropertydescriptors": "^2.0.3"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "dev": true,
+      "requires": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+    },
+    "http-call": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz",
+      "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==",
+      "dev": true,
+      "requires": {
+        "content-type": "^1.0.4",
+        "debug": "^4.1.1",
+        "is-retry-allowed": "^1.1.0",
+        "is-stream": "^2.0.0",
+        "parse-json": "^4.0.0",
+        "tunnel-agent": "^0.6.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
+      "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
+      "dev": true,
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      }
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      },
+      "dependencies": {
+        "eventemitter3": {
+          "version": "4.0.4",
+          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
+          "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
+          "dev": true
+        }
+      }
+    },
+    "http-proxy-agent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+      "requires": {
+        "@tootallnate/once": "1",
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "https-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+      "requires": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "human-signals": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+      "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+      "dev": true
+    },
+    "humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
+      "requires": {
+        "ms": "^2.0.0"
+      }
+    },
+    "hyperlinker": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz",
+      "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz",
+      "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==",
+      "optional": true,
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "icss-utils": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
+      "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "ieee754": {
+      "version": "1.1.13",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+      "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+      "dev": true
+    },
+    "ignore-by-default": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+      "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
+      "dev": true
+    },
+    "ignore-walk": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
+      "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "dev": true,
+      "optional": true
+    },
+    "import-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
+      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
+      "dev": true,
+      "requires": {
+        "import-from": "^2.1.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
+      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-global": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/import-global/-/import-global-0.1.0.tgz",
+      "integrity": "sha1-l7OP1EQRTuwWgkqTX42ldbV6oc4=",
+      "dev": true,
+      "requires": {
+        "global-dirs": "^0.1.0"
+      },
+      "dependencies": {
+        "global-dirs": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+          "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+          "dev": true,
+          "requires": {
+            "ini": "^1.3.4"
+          }
+        }
+      }
+    },
+    "import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "in-publish": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+      "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+    },
+    "inflected": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.0.4.tgz",
+      "integrity": "sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA==",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+    },
+    "inquirer": {
+      "version": "7.3.3",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+      "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^3.0.0",
+        "external-editor": "^3.0.3",
+        "figures": "^3.0.0",
+        "lodash": "^4.17.19",
+        "mute-stream": "0.0.8",
+        "run-async": "^2.4.0",
+        "rxjs": "^6.6.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "through": "^2.3.6"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "figures": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "dependencies": {
+        "default-gateway": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+          "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+          "dev": true,
+          "requires": {
+            "execa": "^1.0.0",
+            "ip-regex": "^2.1.0"
+          }
+        }
+      }
+    },
+    "interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "dev": true
+    },
+    "intersperse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/intersperse/-/intersperse-1.0.0.tgz",
+      "integrity": "sha1-8lYfsc/vn1J3zDNHoiiGtDUaUYE="
+    },
+    "into-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-2.0.1.tgz",
+      "integrity": "sha1-25sANpRFPq4JHYpchMwRUHt4HTE=",
+      "dev": true,
+      "requires": {
+        "from2": "^2.1.1"
+      }
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "is-arguments": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
+    },
+    "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=="
+    },
+    "is-callable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+      "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw=="
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "requires": {
+        "ci-info": "^2.0.0"
+      }
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "dev": true,
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "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"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+    },
+    "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-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-docker": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
+      "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
+      "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.1.0",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+      "dev": true
+    },
+    "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=",
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true
+    },
+    "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-installed-globally": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
+      "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
+      "requires": {
+        "global-dirs": "^2.0.1",
+        "is-path-inside": "^3.0.1"
+      }
+    },
+    "is-lambda": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+      "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU="
+    },
+    "is-mobile": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz",
+      "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg=="
+    },
+    "is-natural-number": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
+      "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=",
+      "dev": true
+    },
+    "is-negative-zero": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+    },
+    "is-npm": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz",
+      "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="
+    },
+    "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"
+      }
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+    },
+    "is-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
+      "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=",
+      "dev": true
+    },
+    "is-observable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz",
+      "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==",
+      "dev": true,
+      "requires": {
+        "symbol-observable": "^1.1.0"
+      }
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "^2.1.0"
+      },
+      "dependencies": {
+        "is-path-inside": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+          "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+          "dev": true,
+          "requires": {
+            "path-is-inside": "^1.0.2"
+          }
+        }
+      }
+    },
+    "is-path-inside": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+      "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "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.2.2",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+      "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+      "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-redirect": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+      "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+      "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "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-retry-allowed": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+      "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
+      "dev": true
+    },
+    "is-ssh": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz",
+      "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==",
+      "dev": true,
+      "requires": {
+        "protocols": "^1.1.0"
+      }
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+      "dev": true
+    },
+    "is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+      "dev": true,
+      "requires": {
+        "html-comment-regex": "^1.1.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "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-whitespace": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz",
+      "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=",
+      "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
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "is-yarn-global": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isbinaryfile": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz",
+      "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "ismobilejs": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
+      "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
+    },
+    "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="
+    },
+    "istanbul-lib-coverage": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+      "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+      "dev": true
+    },
+    "istanbul-lib-instrument": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
+      "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
+      "dev": true,
+      "requires": {
+        "@babel/generator": "^7.4.0",
+        "@babel/parser": "^7.4.3",
+        "@babel/template": "^7.4.0",
+        "@babel/traverse": "^7.4.3",
+        "@babel/types": "^7.4.0",
+        "istanbul-lib-coverage": "^2.0.5",
+        "semver": "^6.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "istanbul-lib-report": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
+      "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
+      "dev": true,
+      "requires": {
+        "istanbul-lib-coverage": "^2.0.5",
+        "make-dir": "^2.1.0",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "istanbul-lib-source-maps": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
+      "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^2.0.5",
+        "make-dir": "^2.1.0",
+        "rimraf": "^2.6.3",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "istanbul-reports": {
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
+      "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
+      "dev": true,
+      "requires": {
+        "html-escaper": "^2.0.0"
+      }
+    },
+    "isurl": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
+      "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+      "dev": true,
+      "requires": {
+        "has-to-string-tag-x": "^1.2.0",
+        "is-object": "^1.0.1"
+      }
+    },
+    "iterall": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
+      "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==",
+      "dev": true
+    },
+    "java-properties": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz",
+      "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==",
+      "dev": true
+    },
+    "javascript-stringify": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz",
+      "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=",
+      "dev": true
+    },
+    "jest": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
+      "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
+      "dev": true,
+      "requires": {
+        "import-local": "^2.0.0",
+        "jest-cli": "^24.9.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.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
+        },
+        "jest-cli": {
+          "version": "24.9.0",
+          "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
+          "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
+          "dev": true,
+          "requires": {
+            "@jest/core": "^24.9.0",
+            "@jest/test-result": "^24.9.0",
+            "@jest/types": "^24.9.0",
+            "chalk": "^2.0.1",
+            "exit": "^0.1.2",
+            "import-local": "^2.0.0",
+            "is-ci": "^2.0.0",
+            "jest-config": "^24.9.0",
+            "jest-util": "^24.9.0",
+            "jest-validate": "^24.9.0",
+            "prompts": "^2.0.1",
+            "realpath-native": "^1.1.0",
+            "yargs": "^13.3.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        }
+      }
+    },
+    "jest-changed-files": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz",
+      "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "execa": "^1.0.0",
+        "throat": "^4.0.0"
+      }
+    },
+    "jest-config": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
+      "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.0",
+        "@jest/test-sequencer": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "babel-jest": "^24.9.0",
+        "chalk": "^2.0.1",
+        "glob": "^7.1.1",
+        "jest-environment-jsdom": "^24.9.0",
+        "jest-environment-node": "^24.9.0",
+        "jest-get-type": "^24.9.0",
+        "jest-jasmine2": "^24.9.0",
+        "jest-regex-util": "^24.3.0",
+        "jest-resolve": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-validate": "^24.9.0",
+        "micromatch": "^3.1.10",
+        "pretty-format": "^24.9.0",
+        "realpath-native": "^1.1.0"
+      },
+      "dependencies": {
+        "babel-jest": {
+          "version": "24.9.0",
+          "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
+          "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
+          "dev": true,
+          "requires": {
+            "@jest/transform": "^24.9.0",
+            "@jest/types": "^24.9.0",
+            "@types/babel__core": "^7.1.0",
+            "babel-plugin-istanbul": "^5.1.0",
+            "babel-preset-jest": "^24.9.0",
+            "chalk": "^2.4.2",
+            "slash": "^2.0.0"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "jest-diff": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
+      "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1",
+        "diff-sequences": "^24.9.0",
+        "jest-get-type": "^24.9.0",
+        "pretty-format": "^24.9.0"
+      }
+    },
+    "jest-docblock": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz",
+      "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==",
+      "dev": true,
+      "requires": {
+        "detect-newline": "^2.1.0"
+      }
+    },
+    "jest-each": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz",
+      "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "chalk": "^2.0.1",
+        "jest-get-type": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "pretty-format": "^24.9.0"
+      }
+    },
+    "jest-environment-jsdom": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
+      "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^24.9.0",
+        "@jest/fake-timers": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "jest-mock": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jsdom": "^11.5.1"
+      }
+    },
+    "jest-environment-jsdom-fifteen": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz",
+      "integrity": "sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^24.3.0",
+        "@jest/fake-timers": "^24.3.0",
+        "@jest/types": "^24.3.0",
+        "jest-mock": "^24.0.0",
+        "jest-util": "^24.0.0",
+        "jsdom": "^15.2.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
+          "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
+          "dev": true
+        },
+        "cssom": {
+          "version": "0.4.4",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+          "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+          "dev": true
+        },
+        "cssstyle": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+          "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+          "dev": true,
+          "requires": {
+            "cssom": "~0.3.6"
+          },
+          "dependencies": {
+            "cssom": {
+              "version": "0.3.8",
+              "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+              "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+              "dev": true
+            }
+          }
+        },
+        "jsdom": {
+          "version": "15.2.1",
+          "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz",
+          "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==",
+          "dev": true,
+          "requires": {
+            "abab": "^2.0.0",
+            "acorn": "^7.1.0",
+            "acorn-globals": "^4.3.2",
+            "array-equal": "^1.0.0",
+            "cssom": "^0.4.1",
+            "cssstyle": "^2.0.0",
+            "data-urls": "^1.1.0",
+            "domexception": "^1.0.1",
+            "escodegen": "^1.11.1",
+            "html-encoding-sniffer": "^1.0.2",
+            "nwsapi": "^2.2.0",
+            "parse5": "5.1.0",
+            "pn": "^1.1.0",
+            "request": "^2.88.0",
+            "request-promise-native": "^1.0.7",
+            "saxes": "^3.1.9",
+            "symbol-tree": "^3.2.2",
+            "tough-cookie": "^3.0.1",
+            "w3c-hr-time": "^1.0.1",
+            "w3c-xmlserializer": "^1.1.2",
+            "webidl-conversions": "^4.0.2",
+            "whatwg-encoding": "^1.0.5",
+            "whatwg-mimetype": "^2.3.0",
+            "whatwg-url": "^7.0.0",
+            "ws": "^7.0.0",
+            "xml-name-validator": "^3.0.0"
+          }
+        },
+        "parse5": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+          "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
+          "dev": true
+        },
+        "tough-cookie": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+          "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+          "dev": true,
+          "requires": {
+            "ip-regex": "^2.1.0",
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "whatwg-url": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+          "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+          "dev": true,
+          "requires": {
+            "lodash.sortby": "^4.7.0",
+            "tr46": "^1.0.1",
+            "webidl-conversions": "^4.0.2"
+          }
+        },
+        "ws": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+          "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+          "dev": true
+        }
+      }
+    },
+    "jest-environment-node": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
+      "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^24.9.0",
+        "@jest/fake-timers": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "jest-mock": "^24.9.0",
+        "jest-util": "^24.9.0"
+      }
+    },
+    "jest-get-type": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
+      "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+      "dev": true
+    },
+    "jest-haste-map": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
+      "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "anymatch": "^2.0.0",
+        "fb-watchman": "^2.0.0",
+        "fsevents": "^1.2.7",
+        "graceful-fs": "^4.1.15",
+        "invariant": "^2.2.4",
+        "jest-serializer": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-worker": "^24.9.0",
+        "micromatch": "^3.1.10",
+        "sane": "^4.0.3",
+        "walker": "^1.0.7"
+      }
+    },
+    "jest-jasmine2": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz",
+      "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "^7.1.0",
+        "@jest/environment": "^24.9.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "chalk": "^2.0.1",
+        "co": "^4.6.0",
+        "expect": "^24.9.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^24.9.0",
+        "jest-matcher-utils": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-runtime": "^24.9.0",
+        "jest-snapshot": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "pretty-format": "^24.9.0",
+        "throat": "^4.0.0"
+      }
+    },
+    "jest-leak-detector": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz",
+      "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==",
+      "dev": true,
+      "requires": {
+        "jest-get-type": "^24.9.0",
+        "pretty-format": "^24.9.0"
+      }
+    },
+    "jest-matcher-utils": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
+      "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1",
+        "jest-diff": "^24.9.0",
+        "jest-get-type": "^24.9.0",
+        "pretty-format": "^24.9.0"
+      }
+    },
+    "jest-message-util": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
+      "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "@types/stack-utils": "^1.0.1",
+        "chalk": "^2.0.1",
+        "micromatch": "^3.1.10",
+        "slash": "^2.0.0",
+        "stack-utils": "^1.0.1"
+      },
+      "dependencies": {
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "jest-mock": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
+      "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0"
+      }
+    },
+    "jest-pnp-resolver": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+      "dev": true
+    },
+    "jest-regex-util": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
+      "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
+      "dev": true
+    },
+    "jest-resolve": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
+      "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "browser-resolve": "^1.11.3",
+        "chalk": "^2.0.1",
+        "jest-pnp-resolver": "^1.2.1",
+        "realpath-native": "^1.1.0"
+      }
+    },
+    "jest-resolve-dependencies": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
+      "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "jest-regex-util": "^24.3.0",
+        "jest-snapshot": "^24.9.0"
+      }
+    },
+    "jest-runner": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
+      "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^24.7.1",
+        "@jest/environment": "^24.9.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "chalk": "^2.4.2",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.1.15",
+        "jest-config": "^24.9.0",
+        "jest-docblock": "^24.3.0",
+        "jest-haste-map": "^24.9.0",
+        "jest-jasmine2": "^24.9.0",
+        "jest-leak-detector": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-resolve": "^24.9.0",
+        "jest-runtime": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-worker": "^24.6.0",
+        "source-map-support": "^0.5.6",
+        "throat": "^4.0.0"
+      },
+      "dependencies": {
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
+      }
+    },
+    "jest-runtime": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz",
+      "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^24.7.1",
+        "@jest/environment": "^24.9.0",
+        "@jest/source-map": "^24.3.0",
+        "@jest/transform": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "@types/yargs": "^13.0.0",
+        "chalk": "^2.0.1",
+        "exit": "^0.1.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.1.15",
+        "jest-config": "^24.9.0",
+        "jest-haste-map": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-mock": "^24.9.0",
+        "jest-regex-util": "^24.3.0",
+        "jest-resolve": "^24.9.0",
+        "jest-snapshot": "^24.9.0",
+        "jest-util": "^24.9.0",
+        "jest-validate": "^24.9.0",
+        "realpath-native": "^1.1.0",
+        "slash": "^2.0.0",
+        "strip-bom": "^3.0.0",
+        "yargs": "^13.3.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.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
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        }
+      }
+    },
+    "jest-serializer": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
+      "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+      "dev": true
+    },
+    "jest-serializer-vue": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz",
+      "integrity": "sha1-sjjvKGNX7GtIBCG9RxRQUJh9WbM=",
+      "dev": true,
+      "requires": {
+        "pretty": "2.0.0"
+      }
+    },
+    "jest-snapshot": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
+      "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "^7.0.0",
+        "@jest/types": "^24.9.0",
+        "chalk": "^2.0.1",
+        "expect": "^24.9.0",
+        "jest-diff": "^24.9.0",
+        "jest-get-type": "^24.9.0",
+        "jest-matcher-utils": "^24.9.0",
+        "jest-message-util": "^24.9.0",
+        "jest-resolve": "^24.9.0",
+        "mkdirp": "^0.5.1",
+        "natural-compare": "^1.4.0",
+        "pretty-format": "^24.9.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "jest-transform-stub": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz",
+      "integrity": "sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==",
+      "dev": true
+    },
+    "jest-util": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
+      "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+      "dev": true,
+      "requires": {
+        "@jest/console": "^24.9.0",
+        "@jest/fake-timers": "^24.9.0",
+        "@jest/source-map": "^24.9.0",
+        "@jest/test-result": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "callsites": "^3.0.0",
+        "chalk": "^2.0.1",
+        "graceful-fs": "^4.1.15",
+        "is-ci": "^2.0.0",
+        "mkdirp": "^0.5.1",
+        "slash": "^2.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "jest-validate": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
+      "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "camelcase": "^5.3.1",
+        "chalk": "^2.0.1",
+        "jest-get-type": "^24.9.0",
+        "leven": "^3.1.0",
+        "pretty-format": "^24.9.0"
+      }
+    },
+    "jest-watch-typeahead": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz",
+      "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^2.4.1",
+        "jest-regex-util": "^24.9.0",
+        "jest-watcher": "^24.3.0",
+        "slash": "^3.0.0",
+        "string-length": "^3.1.0",
+        "strip-ansi": "^5.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "string-length": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
+          "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
+          "dev": true,
+          "requires": {
+            "astral-regex": "^1.0.0",
+            "strip-ansi": "^5.2.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "jest-watcher": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
+      "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
+      "dev": true,
+      "requires": {
+        "@jest/test-result": "^24.9.0",
+        "@jest/types": "^24.9.0",
+        "@types/yargs": "^13.0.0",
+        "ansi-escapes": "^3.0.0",
+        "chalk": "^2.0.1",
+        "jest-util": "^24.9.0",
+        "string-length": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        }
+      }
+    },
+    "jest-worker": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
+      "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+      "dev": true,
+      "requires": {
+        "merge-stream": "^2.0.0",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "jju": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+      "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo="
+    },
+    "js-base64": {
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz",
+      "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==",
+      "dev": true
+    },
+    "js-beautify": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz",
+      "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==",
+      "dev": true,
+      "requires": {
+        "config-chain": "^1.1.12",
+        "editorconfig": "^0.15.3",
+        "glob": "^7.1.3",
+        "mkdirp": "~1.0.3",
+        "nopt": "^4.0.3"
+      }
+    },
+    "js-cookie": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+      "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+    },
+    "js-message": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz",
+      "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=",
+      "dev": true
+    },
+    "js-queue": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz",
+      "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=",
+      "dev": true,
+      "requires": {
+        "easy-stack": "^1.0.0"
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+      "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="
+    },
+    "jscodeshift": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.10.0.tgz",
+      "integrity": "sha512-xpH2FVSEepXoNr6+cPlPHzPzBY1W9bPulufhCHOShzk8+CTCzAOQKytuOXT0b/9PvmO4biRi0g/ZIylVew815w==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "^7.1.6",
+        "@babel/parser": "^7.1.6",
+        "@babel/plugin-proposal-class-properties": "^7.1.0",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.1.0",
+        "@babel/plugin-proposal-optional-chaining": "^7.1.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.1.0",
+        "@babel/preset-flow": "^7.0.0",
+        "@babel/preset-typescript": "^7.1.0",
+        "@babel/register": "^7.0.0",
+        "babel-core": "^7.0.0-bridge.0",
+        "colors": "^1.1.2",
+        "flow-parser": "0.*",
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "neo-async": "^2.5.0",
+        "node-dir": "^0.1.17",
+        "recast": "^0.18.1",
+        "temp": "^0.8.1",
+        "write-file-atomic": "^2.3.0"
+      },
+      "dependencies": {
+        "colors": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+          "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+          "dev": true
+        },
+        "write-file-atomic": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+          "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
+          }
+        }
+      }
+    },
+    "jsdom": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
+      "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
+      "dev": true,
+      "requires": {
+        "abab": "^2.0.0",
+        "acorn": "^5.5.3",
+        "acorn-globals": "^4.1.0",
+        "array-equal": "^1.0.0",
+        "cssom": ">= 0.3.2 < 0.4.0",
+        "cssstyle": "^1.0.0",
+        "data-urls": "^1.0.0",
+        "domexception": "^1.0.1",
+        "escodegen": "^1.9.1",
+        "html-encoding-sniffer": "^1.0.2",
+        "left-pad": "^1.3.0",
+        "nwsapi": "^2.0.7",
+        "parse5": "4.0.0",
+        "pn": "^1.1.0",
+        "request": "^2.87.0",
+        "request-promise-native": "^1.0.5",
+        "sax": "^1.2.4",
+        "symbol-tree": "^3.2.2",
+        "tough-cookie": "^2.3.4",
+        "w3c-hr-time": "^1.0.1",
+        "webidl-conversions": "^4.0.2",
+        "whatwg-encoding": "^1.0.3",
+        "whatwg-mimetype": "^2.1.0",
+        "whatwg-url": "^6.4.1",
+        "ws": "^5.2.0",
+        "xml-name-validator": "^3.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "5.7.4",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+          "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+          "dev": true
+        },
+        "parse5": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+          "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+          "dev": true
+        },
+        "ws": {
+          "version": "5.2.2",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+          "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+          "dev": true,
+          "requires": {
+            "async-limiter": "~1.0.0"
+          }
+        }
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "dev": true
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz",
+      "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g=="
+    },
+    "json-parse-helpfulerror": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+      "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=",
+      "requires": {
+        "jju": "^1.1.0"
+      }
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+    },
+    "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=="
+    },
+    "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="
+    },
+    "json2module": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/json2module/-/json2module-0.0.3.tgz",
+      "integrity": "sha1-APtfSpt638PwZHwpyxe80Zeb6bI=",
+      "requires": {
+        "rw": "^1.3.2"
+      }
+    },
+    "json2mq": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+      "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=",
+      "requires": {
+        "string-convert": "^0.2.0"
+      }
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "dev": true
+    },
+    "json5": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "keyv": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "requires": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "requires": {
+        "is-buffer": "^1.1.5"
+      }
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+    },
+    "latest-version": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "requires": {
+        "package-json": "^6.3.0"
+      }
+    },
+    "launch-editor": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz",
+      "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.3.0",
+        "shell-quote": "^1.6.1"
+      }
+    },
+    "launch-editor-middleware": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz",
+      "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==",
+      "dev": true,
+      "requires": {
+        "launch-editor": "^2.2.1"
+      }
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+    },
+    "left-pad": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
+      "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
+      "dev": true
+    },
+    "less": {
+      "version": "3.12.2",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz",
+      "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "native-request": "^1.0.5",
+        "source-map": "~0.6.0",
+        "tslib": "^1.10.0"
+      }
+    },
+    "less-bundle-promise": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/less-bundle-promise/-/less-bundle-promise-1.0.7.tgz",
+      "integrity": "sha512-B4mN+YtkOxAPUHyorhup+ETVNZ9E1PO65sPhgPvDDHDVtR1oYRd87EbYVYOsU0Oev0MW/6MSouS5QYlhe7XrzA=="
+    },
+    "less-loader": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
+      "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
+      "dev": true,
+      "requires": {
+        "clone": "^2.1.1",
+        "loader-utils": "^1.1.0",
+        "pify": "^4.0.1"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+          "dev": true
+        }
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true
+    },
+    "levenary": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+      "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+      "dev": true,
+      "requires": {
+        "leven": "^3.1.0"
+      }
+    },
+    "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"
+      }
+    },
+    "libnpmconfig": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz",
+      "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==",
+      "requires": {
+        "figgy-pudding": "^3.5.1",
+        "find-up": "^3.0.0",
+        "ini": "^1.3.5"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+        }
+      }
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
+    },
+    "listr": {
+      "version": "0.14.3",
+      "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
+      "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
+      "dev": true,
+      "requires": {
+        "@samverschueren/stream-to-observable": "^0.3.0",
+        "is-observable": "^1.1.0",
+        "is-promise": "^2.1.0",
+        "is-stream": "^1.1.0",
+        "listr-silent-renderer": "^1.1.1",
+        "listr-update-renderer": "^0.5.0",
+        "listr-verbose-renderer": "^0.5.0",
+        "p-map": "^2.0.0",
+        "rxjs": "^6.3.3"
+      },
+      "dependencies": {
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+          "dev": true
+        }
+      }
+    },
+    "listr-silent-renderer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz",
+      "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=",
+      "dev": true
+    },
+    "listr-update-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
+      "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.3",
+        "cli-truncate": "^0.2.1",
+        "elegant-spinner": "^1.0.1",
+        "figures": "^1.7.0",
+        "indent-string": "^3.0.0",
+        "log-symbols": "^1.0.2",
+        "log-update": "^2.3.0",
+        "strip-ansi": "^3.0.1"
+      },
+      "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"
+          }
+        },
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        },
+        "log-symbols": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+          "dev": true,
+          "requires": {
+            "chalk": "^1.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
+        }
+      }
+    },
+    "listr-verbose-renderer": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
+      "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "cli-cursor": "^2.1.0",
+        "date-fns": "^1.27.2",
+        "figures": "^2.0.0"
+      },
+      "dependencies": {
+        "figures": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        }
+      }
+    },
+    "load-json-file": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz",
+      "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.15",
+        "parse-json": "^4.0.0",
+        "pify": "^4.0.1",
+        "strip-bom": "^3.0.0",
+        "type-fest": "^0.3.0"
+      },
+      "dependencies": {
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "type-fest": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+          "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+          "dev": true
+        }
+      }
+    },
+    "loader-fs-cache": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
+      "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "^0.1.1",
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+          "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+          "dev": true,
+          "requires": {
+            "commondir": "^1.0.1",
+            "mkdirp": "^0.5.1",
+            "pkg-dir": "^1.0.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"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "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"
+          }
+        },
+        "pkg-dir": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+          "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+          "dev": true,
+          "requires": {
+            "find-up": "^1.0.0"
+          }
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "dev": true,
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        }
+      }
+    },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.19",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+      "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+    },
+    "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.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.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
+    },
+    "lodash.defaultsdeep": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==",
+      "dev": true
+    },
+    "lodash.get": {
+      "version": "4.4.2",
+      "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+      "dev": true
+    },
+    "lodash.identity": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-3.0.0.tgz",
+      "integrity": "sha1-rXvGpOZH15yXLhuA/u968VYmeHY=",
+      "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.mapvalues": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz",
+      "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "lodash.pickby": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz",
+      "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=",
+      "dev": true
+    },
+    "lodash.sortby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+      "dev": true
+    },
+    "lodash.template": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.templatesettings": "^4.0.0"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "dev": true,
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0"
+      }
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE="
+    },
+    "lodash.transform": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz",
+      "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "lodash.xorby": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/lodash.xorby/-/lodash.xorby-4.7.0.tgz",
+      "integrity": "sha1-nBmm+fBjputT3QPBtocXmYAUY9c=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.0.1"
+      }
+    },
+    "log-update": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz",
+      "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.0.0",
+        "cli-cursor": "^2.0.0",
+        "wrap-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "wrap-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz",
+          "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1",
+            "strip-ansi": "^4.0.0"
+          }
+        }
+      }
+    },
+    "loglevel": {
+      "version": "1.6.8",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
+      "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
+      "dev": true
+    },
+    "long": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+      "dev": true
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.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"
+      }
+    },
+    "lowdb": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz",
+      "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.3",
+        "is-promise": "^2.1.0",
+        "lodash": "4",
+        "pify": "^3.0.0",
+        "steno": "^0.4.1"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "lower-case": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz",
+      "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.10.0"
+      }
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dev": true,
+      "requires": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      }
+    },
+    "make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+      "dev": true
+    },
+    "make-fetch-happen": {
+      "version": "8.0.9",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.9.tgz",
+      "integrity": "sha512-uHa4gv/NIdm9cUvfOhYb57nxrCY08iyMRXru0jbpaH57Q3NCge/ypY7fOvgCr8tPyucKrGbVndKhjXE0IX0VfQ==",
+      "requires": {
+        "agentkeepalive": "^4.1.0",
+        "cacache": "^15.0.0",
+        "http-cache-semantics": "^4.0.4",
+        "http-proxy-agent": "^4.0.1",
+        "https-proxy-agent": "^5.0.0",
+        "is-lambda": "^1.0.1",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.3",
+        "minipass-collect": "^1.0.2",
+        "minipass-fetch": "^1.3.0",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "promise-retry": "^1.1.1",
+        "socks-proxy-agent": "^5.0.0",
+        "ssri": "^8.0.0"
+      }
+    },
+    "makeerror": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+      "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+      "dev": true,
+      "requires": {
+        "tmpl": "1.0.x"
+      }
+    },
+    "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"
+      }
+    },
+    "md5": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+      "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+      "requires": {
+        "charenc": "~0.0.1",
+        "crypt": "~0.0.1",
+        "is-buffer": "~1.1.1"
+      }
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "dev": true
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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-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"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "merge": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
+      "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==",
+      "dev": true
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "merge-source-map": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+      "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+      "dev": true,
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "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"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true
+    },
+    "mime-db": {
+      "version": "1.44.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+    },
+    "mime-types": {
+      "version": "2.1.27",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+      "requires": {
+        "mime-db": "1.44.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz",
+      "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+          "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "prepend-http": "^1.0.0",
+            "query-string": "^4.1.0",
+            "sort-keys": "^1.0.0"
+          }
+        },
+        "prepend-http": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+          "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+          "dev": true
+        },
+        "query-string": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+          "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.1.0",
+            "strict-uri-encode": "^1.0.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "minipass": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-fetch": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.0.tgz",
+      "integrity": "sha512-Yb23ESZZ/8QxiBvSpJ4atbVMVDx2CXrerzrtQzQ67eLqKg+zFIkYFTagk3xh6fdo+e/FvDtVuCD4QcuYDRR3hw==",
+      "requires": {
+        "encoding": "^0.1.12",
+        "minipass": "^3.1.0",
+        "minipass-sized": "^1.0.3",
+        "minizlib": "^2.0.0"
+      },
+      "dependencies": {
+        "minizlib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
+          "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-json-stream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
+      "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
+      "requires": {
+        "jsonparse": "^1.3.1",
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-sized": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minizlib": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
+      "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
+      "requires": {
+        "minipass": "^2.9.0"
+      },
+      "dependencies": {
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        }
+      }
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "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": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+    },
+    "moment": {
+      "version": "2.27.0",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
+      "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "mutationobserver-shim": {
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz",
+      "integrity": "sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ=="
+    },
+    "mute-stream": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+      "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+      "dev": true
+    },
+    "mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "nan": {
+      "version": "2.14.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
+      "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
+      "dev": true
+    },
+    "nanoid": {
+      "version": "2.1.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz",
+      "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==",
+      "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"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "nanopop": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.1.0.tgz",
+      "integrity": "sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw=="
+    },
+    "native-request": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz",
+      "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==",
+      "dev": true,
+      "optional": true
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "natural-orderby": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz",
+      "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==",
+      "dev": true
+    },
+    "ndjson": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz",
+      "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=",
+      "dev": true,
+      "requires": {
+        "json-stringify-safe": "^5.0.1",
+        "minimist": "^1.2.0",
+        "split2": "^2.1.0",
+        "through2": "^2.0.3"
+      }
+    },
+    "neat-csv": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/neat-csv/-/neat-csv-2.1.0.tgz",
+      "integrity": "sha1-BvWDYMTDuVW9Rn3cha5FEaOQekw=",
+      "dev": true,
+      "requires": {
+        "csv-parser": "^1.6.0",
+        "get-stream": "^2.1.0",
+        "into-stream": "^2.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+          "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
+          "dev": true,
+          "requires": {
+            "object-assign": "^4.0.1",
+            "pinkie-promise": "^2.0.0"
+          }
+        }
+      }
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "nested-error-stacks": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz",
+      "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A=="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "dev": true
+    },
+    "no-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz",
+      "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==",
+      "dev": true,
+      "requires": {
+        "lower-case": "^2.0.1",
+        "tslib": "^1.10.0"
+      }
+    },
+    "node-addon-api": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
+      "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
+      "dev": true
+    },
+    "node-alias": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/node-alias/-/node-alias-1.0.4.tgz",
+      "integrity": "sha1-HxuRa1a56iQcATX5fO1pQPVW8pI=",
+      "requires": {
+        "chalk": "^1.1.1",
+        "lodash": "^4.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "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="
+        }
+      }
+    },
+    "node-cache": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-4.2.1.tgz",
+      "integrity": "sha512-BOb67bWg2dTyax5kdef5WfU3X8xu4wPg+zHzkvls0Q/QpYycIFRLEEIdAx9Wma43DxG6Qzn4illdZoYseKWa4A==",
+      "dev": true,
+      "requires": {
+        "clone": "2.x",
+        "lodash": "^4.17.15"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+          "dev": true
+        }
+      }
+    },
+    "node-dir": {
+      "version": "0.1.17",
+      "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
+      "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=",
+      "dev": true,
+      "requires": {
+        "minimatch": "^3.0.2"
+      }
+    },
+    "node-emoji": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz",
+      "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==",
+      "requires": {
+        "lodash.toarray": "^4.4.0"
+      }
+    },
+    "node-fetch": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
+      "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
+      "dev": true
+    },
+    "node-forge": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
+      "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz",
+      "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==",
+      "requires": {
+        "env-paths": "^2.2.0",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.2",
+        "mkdirp": "^0.5.1",
+        "nopt": "^4.0.1",
+        "npmlog": "^4.1.2",
+        "request": "^2.88.0",
+        "rimraf": "^2.6.3",
+        "semver": "^5.7.1",
+        "tar": "^4.4.12",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+        },
+        "fs-minipass": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
+          "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
+          "requires": {
+            "minipass": "^2.6.0"
+          }
+        },
+        "minipass": {
+          "version": "2.9.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
+          "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "tar": {
+          "version": "4.4.13",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
+          "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.8.6",
+            "minizlib": "^1.2.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.3"
+          }
+        },
+        "which": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+          "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        }
+      }
+    },
+    "node-int64": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+      "dev": true
+    },
+    "node-ipc": {
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz",
+      "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==",
+      "dev": true,
+      "requires": {
+        "event-pubsub": "4.3.0",
+        "js-message": "1.0.5",
+        "js-queue": "2.0.0"
+      }
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "dev": true,
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "buffer": {
+          "version": "4.9.2",
+          "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+          "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+          "dev": true,
+          "requires": {
+            "base64-js": "^1.0.2",
+            "ieee754": "^1.1.4",
+            "isarray": "^1.0.0"
+          }
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
+    "node-modules-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+      "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+      "dev": true
+    },
+    "node-notifier": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz",
+      "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==",
+      "dev": true,
+      "requires": {
+        "growly": "^1.3.0",
+        "is-wsl": "^2.1.1",
+        "semver": "^6.3.0",
+        "shellwords": "^0.1.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "dev": true,
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.60",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz",
+      "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==",
+      "dev": true
+    },
+    "node-sass": {
+      "version": "4.14.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+      "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+      "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": "^4.17.15",
+        "meow": "^3.7.0",
+        "mkdirp": "^0.5.1",
+        "nan": "^2.13.2",
+        "node-gyp": "^3.8.0",
+        "npmlog": "^4.0.0",
+        "request": "^2.88.0",
+        "sass-graph": "2.2.5",
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "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.2",
+          "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+          "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+          "dev": true,
+          "requires": {
+            "block-stream": "*",
+            "fstream": "^1.0.12",
+            "inherits": "2"
+          }
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "nodemon": {
+      "version": "1.19.4",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz",
+      "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^2.1.8",
+        "debug": "^3.2.6",
+        "ignore-by-default": "^1.0.1",
+        "minimatch": "^3.0.4",
+        "pstree.remy": "^1.1.7",
+        "semver": "^5.7.1",
+        "supports-color": "^5.5.0",
+        "touch": "^3.1.0",
+        "undefsafe": "^2.0.2",
+        "update-notifier": "^2.5.0"
+      },
+      "dependencies": {
+        "ansi-align": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
+          "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.0.0"
+          }
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "boxen": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
+          "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
+          "dev": true,
+          "requires": {
+            "ansi-align": "^2.0.0",
+            "camelcase": "^4.0.0",
+            "chalk": "^2.0.1",
+            "cli-boxes": "^1.0.0",
+            "string-width": "^2.0.0",
+            "term-size": "^1.2.0",
+            "widest-line": "^2.0.0"
+          }
+        },
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "ci-info": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+          "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+          "dev": true
+        },
+        "cli-boxes": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+          "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+          "dev": true
+        },
+        "configstore": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
+          "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^4.1.0",
+            "graceful-fs": "^4.1.2",
+            "make-dir": "^1.0.0",
+            "unique-string": "^1.0.0",
+            "write-file-atomic": "^2.0.0",
+            "xdg-basedir": "^3.0.0"
+          }
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "crypto-random-string": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+          "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "dot-prop": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
+          "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
+          "dev": true,
+          "requires": {
+            "is-obj": "^1.0.0"
+          }
+        },
+        "execa": {
+          "version": "0.7.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "global-dirs": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
+          "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
+          "dev": true,
+          "requires": {
+            "ini": "^1.3.4"
+          }
+        },
+        "got": {
+          "version": "6.7.1",
+          "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+          "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+          "dev": true,
+          "requires": {
+            "create-error-class": "^3.0.0",
+            "duplexer3": "^0.1.4",
+            "get-stream": "^3.0.0",
+            "is-redirect": "^1.0.0",
+            "is-retry-allowed": "^1.0.0",
+            "is-stream": "^1.0.0",
+            "lowercase-keys": "^1.0.0",
+            "safe-buffer": "^5.0.1",
+            "timed-out": "^4.0.0",
+            "unzip-response": "^2.0.1",
+            "url-parse-lax": "^1.0.0"
+          }
+        },
+        "is-ci": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+          "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^1.5.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
+        },
+        "is-installed-globally": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
+          "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
+          "dev": true,
+          "requires": {
+            "global-dirs": "^0.1.0",
+            "is-path-inside": "^1.0.0"
+          }
+        },
+        "is-npm": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+          "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+          "dev": true
+        },
+        "is-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+          "dev": true
+        },
+        "is-path-inside": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+          "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+          "dev": true,
+          "requires": {
+            "path-is-inside": "^1.0.1"
+          }
+        },
+        "latest-version": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+          "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+          "dev": true,
+          "requires": {
+            "package-json": "^4.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"
+          }
+        },
+        "make-dir": {
+          "version": "1.3.0",
+          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+          "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "package-json": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
+          "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
+          "dev": true,
+          "requires": {
+            "got": "^6.7.1",
+            "registry-auth-token": "^3.0.1",
+            "registry-url": "^3.0.3",
+            "semver": "^5.1.0"
+          }
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "prepend-http": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+          "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+          "dev": true
+        },
+        "registry-auth-token": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
+          "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
+          "dev": true,
+          "requires": {
+            "rc": "^1.1.6",
+            "safe-buffer": "^5.0.1"
+          }
+        },
+        "registry-url": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+          "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+          "dev": true,
+          "requires": {
+            "rc": "^1.0.1"
+          }
+        },
+        "semver-diff": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+          "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+          "dev": true,
+          "requires": {
+            "semver": "^5.0.3"
+          }
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "term-size": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
+          "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
+          "dev": true,
+          "requires": {
+            "execa": "^0.7.0"
+          }
+        },
+        "unique-string": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+          "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+          "dev": true,
+          "requires": {
+            "crypto-random-string": "^1.0.0"
+          }
+        },
+        "update-notifier": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
+          "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
+          "dev": true,
+          "requires": {
+            "boxen": "^1.2.1",
+            "chalk": "^2.0.1",
+            "configstore": "^3.0.0",
+            "import-lazy": "^2.1.0",
+            "is-ci": "^1.0.10",
+            "is-installed-globally": "^0.1.0",
+            "is-npm": "^1.0.0",
+            "latest-version": "^3.0.0",
+            "semver-diff": "^2.0.0",
+            "xdg-basedir": "^3.0.0"
+          }
+        },
+        "url-parse-lax": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+          "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+          "dev": true,
+          "requires": {
+            "prepend-http": "^1.0.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"
+          }
+        },
+        "widest-line": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
+          "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^2.1.1"
+          }
+        },
+        "write-file-atomic": {
+          "version": "2.4.3",
+          "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
+          "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.11",
+            "imurmurhash": "^0.1.4",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "xdg-basedir": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+          "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+          "dev": true
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "nopt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
+      "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
+      "requires": {
+        "abbrev": "1",
+        "osenv": "^0.1.4"
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "dev": true,
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "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
+    },
+    "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
+    },
+    "normalize-url": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+    },
+    "npm-bundled": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
+      "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
+      "requires": {
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "npm-check-updates": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-6.0.1.tgz",
+      "integrity": "sha512-lzoVW35KWaBn0m1O1AVr0G9/20niK13mYftoAr09WuQszoeTdlrjCNyC0pRNiTfb5ZxubZaUAi7HdVzkEihwwA==",
+      "requires": {
+        "chalk": "^4.0.0",
+        "cint": "^8.2.1",
+        "cli-table": "^0.3.1",
+        "commander": "^5.1.0",
+        "find-up": "4.1.0",
+        "get-stdin": "^8.0.0",
+        "json-parse-helpfulerror": "^1.0.3",
+        "libnpmconfig": "^1.2.1",
+        "lodash": "^4.17.15",
+        "node-alias": "^1.0.4",
+        "p-map": "^4.0.0",
+        "pacote": "^11.1.10",
+        "progress": "^2.0.3",
+        "prompts": "^2.3.2",
+        "rc-config-loader": "^3.0.0",
+        "requireg": "^0.2.2",
+        "semver": "^7.3.2",
+        "semver-utils": "^1.1.4",
+        "spawn-please": "^0.3.0",
+        "update-notifier": "^4.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "npm-conf": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
+      "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
+      "dev": true,
+      "requires": {
+        "config-chain": "^1.1.11",
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "npm-install-checks": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz",
+      "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==",
+      "requires": {
+        "semver": "^7.1.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+        }
+      }
+    },
+    "npm-normalize-package-bin": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+      "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
+    },
+    "npm-package-arg": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz",
+      "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==",
+      "requires": {
+        "hosted-git-info": "^3.0.2",
+        "semver": "^7.0.0",
+        "validate-npm-package-name": "^3.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+        }
+      }
+    },
+    "npm-packlist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.2.tgz",
+      "integrity": "sha512-eByPaP+wsKai0BJX5pmb58d3mfR0zUATcnyuvSxIudTEn+swCPFLxh7srCmqB4hr7i9V24/DPjjq5b2qUtbgXQ==",
+      "requires": {
+        "glob": "^7.1.6",
+        "ignore-walk": "^3.0.3",
+        "npm-bundled": "^1.1.1",
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "npm-pick-manifest": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz",
+      "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==",
+      "requires": {
+        "npm-install-checks": "^4.0.0",
+        "npm-package-arg": "^8.0.0",
+        "semver": "^7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.2",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ=="
+        }
+      }
+    },
+    "npm-registry-fetch": {
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.1.3.tgz",
+      "integrity": "sha512-xpBFcg13wkFR0SsscvemmrIe1Sxe1SPgGUOAb7+5Uo6fR8SIRMenMHeDSjfyulv1px66/y0Ib40rtKO20PcgPg==",
+      "requires": {
+        "@npmcli/ci-detect": "^1.0.0",
+        "lru-cache": "^6.0.0",
+        "make-fetch-happen": "^8.0.9",
+        "minipass": "^3.1.3",
+        "minipass-fetch": "^1.3.0",
+        "minipass-json-stream": "^1.0.1",
+        "minizlib": "^2.0.0",
+        "npm-package-arg": "^8.0.0"
+      },
+      "dependencies": {
+        "minizlib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
+          "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E="
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "dev": true,
+      "requires": {
+        "boolbase": "~1.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="
+    },
+    "nwsapi": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+      "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+      "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=="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "object-hash": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+      "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+      "dev": true
+    },
+    "object-inspect": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+      "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
+    },
+    "object-is": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+      "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.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=="
+    },
+    "object-path": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
+      "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=",
+      "dev": true
+    },
+    "object-treeify": {
+      "version": "1.1.26",
+      "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.26.tgz",
+      "integrity": "sha512-0WTfU7SGM8umY4YPpOg+oHXL66E6dPVCr+sMR6KitPmvg8CkVrHUUZYEFtx0+5Wb0HjFEsBwBYXyGRNeX7c/oQ==",
+      "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==",
+      "requires": {
+        "define-properties": "^1.1.2",
+        "function-bind": "^1.1.1",
+        "has-symbols": "^1.0.0",
+        "object-keys": "^1.0.11"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+      "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "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.values": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "omit.js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz",
+      "integrity": "sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==",
+      "requires": {
+        "babel-runtime": "^6.23.0"
+      }
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^1.0.0"
+      }
+    },
+    "open": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+      "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "opencollective-postinstall": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+    },
+    "opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optimism": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.10.3.tgz",
+      "integrity": "sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw==",
+      "dev": true,
+      "requires": {
+        "@wry/context": "^0.4.0"
+      }
+    },
+    "optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dev": true,
+      "requires": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      }
+    },
+    "ora": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz",
+      "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.2",
+        "cli-cursor": "^2.1.0",
+        "cli-spinners": "^2.0.0",
+        "log-symbols": "^2.2.0",
+        "strip-ansi": "^5.2.0",
+        "wcwidth": "^1.0.1"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "dev": true,
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+    },
+    "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="
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "requires": {
+        "os-homedir": "^1.0.0",
+        "os-tmpdir": "^1.0.0"
+      }
+    },
+    "p-cancelable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+    },
+    "p-each-series": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
+      "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
+      "dev": true,
+      "requires": {
+        "p-reduce": "^1.0.0"
+      }
+    },
+    "p-event": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
+      "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
+      "dev": true,
+      "requires": {
+        "p-timeout": "^2.0.1"
+      }
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-is-promise": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+      "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-reduce": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
+      "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
+      "dev": true
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "dev": true,
+      "requires": {
+        "retry": "^0.12.0"
+      },
+      "dependencies": {
+        "retry": {
+          "version": "0.12.0",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+          "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+          "dev": true
+        }
+      }
+    },
+    "p-timeout": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+      "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+      "dev": true,
+      "requires": {
+        "p-finally": "^1.0.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "package-json": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "requires": {
+        "got": "^9.6.0",
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "pacote": {
+      "version": "11.1.11",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.11.tgz",
+      "integrity": "sha512-r6PHtCEhkaGv+QPx1JdE/xRdkSkZUG7dE2oloNk/CGTPGNOtaJyYqZPFeN6d6UcUrTPRvZXFo3IBzJIBopPuSA==",
+      "requires": {
+        "@npmcli/git": "^2.0.1",
+        "@npmcli/installed-package-contents": "^1.0.5",
+        "@npmcli/promise-spawn": "^1.2.0",
+        "@npmcli/run-script": "^1.3.0",
+        "cacache": "^15.0.5",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.1.0",
+        "infer-owner": "^1.0.4",
+        "minipass": "^3.1.3",
+        "mkdirp": "^1.0.3",
+        "npm-package-arg": "^8.0.1",
+        "npm-packlist": "^2.1.0",
+        "npm-pick-manifest": "^6.0.0",
+        "npm-registry-fetch": "^8.1.3",
+        "promise-retry": "^1.1.1",
+        "read-package-json-fast": "^1.1.3",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.0",
+        "tar": "^6.0.1"
+      }
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "dev": true,
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "param-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
+      "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==",
+      "dev": true,
+      "requires": {
+        "dot-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+          "dev": true
+        }
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
+      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "^4.0.0",
+        "browserify-aes": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-git-config": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-2.0.3.tgz",
+      "integrity": "sha512-Js7ueMZOVSZ3tP8C7E3KZiHv6QQl7lnJ+OkbxoaFazzSa2KyEHqApfGbU3XboUgUnq4ZuUmskUpYKTNx01fm5A==",
+      "dev": true,
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "git-config-path": "^1.0.1",
+        "ini": "^1.3.5"
+      }
+    },
+    "parse-json": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+      "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "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
+    },
+    "parse-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz",
+      "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==",
+      "dev": true,
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "protocols": "^1.4.0"
+      }
+    },
+    "parse-url": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz",
+      "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==",
+      "dev": true,
+      "requires": {
+        "is-ssh": "^1.3.0",
+        "normalize-url": "^3.3.0",
+        "parse-path": "^4.0.0",
+        "protocols": "^1.4.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+          "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+          "dev": true
+        }
+      }
+    },
+    "parse5": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+      "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "parse5-htmlparser2-tree-adapter": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz",
+      "integrity": "sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw==",
+      "dev": true,
+      "requires": {
+        "parse5": "^5.1.1"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+          "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+          "dev": true
+        }
+      }
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "dev": true
+    },
+    "pascal-case": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz",
+      "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "password-prompt": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz",
+      "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "^3.1.0",
+        "cross-spawn": "^6.0.5"
+      },
+      "dependencies": {
+        "ansi-escapes": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+          "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+          "dev": true
+        }
+      }
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "dev": true
+    },
+    "path-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.3.tgz",
+      "integrity": "sha512-UMFU6UETFpCNWbIWNczshPrnK/7JAXBP2NYw80ojElbQ2+JYxdqWDBkvvqM93u4u6oLmuJ/tPOf2tM8KtXv4eg==",
+      "dev": true,
+      "requires": {
+        "dot-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "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": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
+    "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="
+    },
+    "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-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "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=="
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        }
+      }
+    },
+    "pbkdf2": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+      "dev": true,
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "pend": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+      "dev": true
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true
+    },
+    "pid-from-port": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/pid-from-port/-/pid-from-port-1.1.3.tgz",
+      "integrity": "sha512-OlE82n3yMOE5dY9RMOwxhoWefeMlxwk5IVxoj0sSzSFIlmvhN4obzTvO3s/d/b5JhcgXikjaspsy/HuUDTqbBg==",
+      "dev": true,
+      "requires": {
+        "execa": "^0.9.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.9.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz",
+          "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "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"
+      }
+    },
+    "pirates": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+      "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+      "dev": true,
+      "requires": {
+        "node-modules-regexp": "^1.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        }
+      }
+    },
+    "pn": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+      "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+      "dev": true
+    },
+    "pnp-webpack-plugin": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
+      "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
+      "dev": true,
+      "requires": {
+        "ts-pnp": "^1.1.6"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "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"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "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.35",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "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==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
+      "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-less": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
+      "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
+      "requires": {
+        "postcss": "^7.0.14"
+      }
+    },
+    "postcss-load-config": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
+      "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "import-cwd": "^2.0.0"
+      }
+    },
+    "postcss-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
+      "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "postcss": "^7.0.0",
+        "postcss-load-config": "^2.0.0",
+        "schema-utils": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "dev": true,
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
+      "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.5"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
+      "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.1.1",
+        "postcss": "^7.0.32",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
+      "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^6.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
+      "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^4.0.0",
+        "postcss": "^7.0.6"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "normalize-url": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+          "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
+      "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "dev": true,
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "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
+    },
+    "prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+    },
+    "prettier": {
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
+      "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
+      "dev": true,
+      "optional": true
+    },
+    "pretty": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz",
+      "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=",
+      "dev": true,
+      "requires": {
+        "condense-newlines": "^0.2.1",
+        "extend-shallow": "^2.0.1",
+        "js-beautify": "^1.6.12"
+      },
+      "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"
+          }
+        }
+      }
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "dev": true,
+      "requires": {
+        "renderkid": "^2.0.1",
+        "utila": "~0.4"
+      }
+    },
+    "pretty-format": {
+      "version": "24.9.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
+      "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+      "dev": true,
+      "requires": {
+        "@jest/types": "^24.9.0",
+        "ansi-regex": "^4.0.0",
+        "ansi-styles": "^3.2.0",
+        "react-is": "^16.8.4"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        }
+      }
+    },
+    "prismjs": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz",
+      "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==",
+      "dev": true,
+      "requires": {
+        "clipboard": "^2.0.0"
+      }
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-exists": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-3.1.0.tgz",
+      "integrity": "sha512-X11vso1oNLtyDa2j8fsMol2fph1+5PoQ4vpEc1it/rM8eLuRTmrmTg4jfn82WhNur241AYitgjKCgmlgMRZesw==",
+      "dev": true,
+      "requires": {
+        "ps-list": "^4.0.0"
+      }
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+    },
+    "promise-retry": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz",
+      "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=",
+      "requires": {
+        "err-code": "^1.0.0",
+        "retry": "^0.10.0"
+      }
+    },
+    "prompts": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
+      "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
+      "requires": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.4"
+      }
+    },
+    "proto-list": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+      "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
+      "dev": true
+    },
+    "protocols": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz",
+      "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg==",
+      "dev": true
+    },
+    "proxy-addr": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+      "dev": true,
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "dev": true
+    },
+    "ps-list": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-4.1.0.tgz",
+      "integrity": "sha512-DSpMj8PI5W7v2G4+rE+BymTKZPjlu6t/M1N6rPAa6Hwn+/e8jDmFJaq8/kpoGCvwd75g2h5DbjF2MduOMNyrsQ==",
+      "dev": true,
+      "requires": {
+        "pify": "^3.0.0",
+        "tasklist": "^3.1.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "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.8.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+      "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
+    },
+    "pstree.remy": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+      "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "4.11.9",
+          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+          "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+          "dev": true
+        }
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "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"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+    },
+    "pupa": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
+      "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
+      "requires": {
+        "escape-goat": "^2.0.0"
+      }
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "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=="
+    },
+    "query-string": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
+      "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+      "dev": true,
+      "requires": {
+        "decode-uri-component": "^0.2.0",
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
+      "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==",
+      "dev": true
+    },
+    "raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "requires": {
+        "performance-now": "^2.1.0"
+      }
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "dev": true,
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "http-errors": {
+          "version": "1.7.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+          "dev": true
+        }
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      }
+    },
+    "rc-config-loader": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz",
+      "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==",
+      "requires": {
+        "debug": "^4.1.1",
+        "js-yaml": "^3.12.0",
+        "json5": "^2.1.1",
+        "require-from-string": "^2.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "dev": true
+    },
+    "read-package-json-fast": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz",
+      "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==",
+      "requires": {
+        "json-parse-even-better-errors": "^2.0.1",
+        "npm-normalize-package-bin": "^1.0.1"
+      }
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
+      "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
+      "dev": true,
+      "requires": {
+        "find-up": "^3.0.0",
+        "read-pkg": "^3.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "load-json-file": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+          "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.2",
+            "parse-json": "^4.0.0",
+            "pify": "^3.0.0",
+            "strip-bom": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "dev": true,
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "pify": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+          "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "^4.0.0",
+            "normalize-package-data": "^2.3.2",
+            "path-type": "^3.0.0"
+          }
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "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"
+      }
+    },
+    "readdir-scoped-modules": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz",
+      "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==",
+      "requires": {
+        "debuglog": "^1.0.1",
+        "dezalgo": "^1.0.0",
+        "graceful-fs": "^4.1.2",
+        "once": "^1.3.0"
+      }
+    },
+    "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"
+      }
+    },
+    "realpath-native": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
+      "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
+      "dev": true,
+      "requires": {
+        "util.promisify": "^1.0.0"
+      }
+    },
+    "recast": {
+      "version": "0.18.10",
+      "resolved": "https://registry.npmjs.org/recast/-/recast-0.18.10.tgz",
+      "integrity": "sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ==",
+      "dev": true,
+      "requires": {
+        "ast-types": "0.13.3",
+        "esprima": "~4.0.0",
+        "private": "^0.1.8",
+        "source-map": "~0.6.1"
+      }
+    },
+    "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"
+      },
+      "dependencies": {
+        "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
+        },
+        "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"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "redeyed": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+      "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
+      "dev": true,
+      "requires": {
+        "esprima": "~4.0.0"
+      }
+    },
+    "regenerate": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+      "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "dev": true,
+      "requires": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "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"
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1"
+      }
+    },
+    "regexpp": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
+      "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+      "dev": true,
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.2.0"
+      }
+    },
+    "registry-auth-token": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
+      "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "registry-url": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+      "dev": true,
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "dev": true
+    },
+    "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
+    },
+    "renderkid": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
+      "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
+      "dev": true,
+      "requires": {
+        "css-select": "^1.1.0",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.3.0",
+        "strip-ansi": "^3.0.0",
+        "utila": "^0.4.0"
+      }
+    },
+    "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="
+    },
+    "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"
+      }
+    },
+    "request": {
+      "version": "2.88.2",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+      "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.3",
+        "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.5.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "request-promise-core": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+      "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.19"
+      }
+    },
+    "request-promise-native": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+      "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+      "dev": true,
+      "requires": {
+        "request-promise-core": "1.1.4",
+        "stealthy-require": "^1.1.1",
+        "tough-cookie": "^2.3.3"
+      }
+    },
+    "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-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "dev": true
+    },
+    "requireg": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz",
+      "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==",
+      "requires": {
+        "nested-error-stacks": "~2.0.1",
+        "rc": "~1.2.7",
+        "resolve": "~1.7.1"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.7.1",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+          "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+          "requires": {
+            "path-parse": "^1.0.5"
+          }
+        }
+      }
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resize-observer-polyfill": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+    },
+    "resolve": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+      "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+      "dev": true
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "dev": true
+    },
+    "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
+    },
+    "responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "requires": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "resumer": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
+      "requires": {
+        "through": "~2.3.4"
+      }
+    },
+    "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
+    },
+    "retry": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q="
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "requires": {
+        "align-text": "^0.1.1"
+      }
+    },
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "dev": true,
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "rollup": {
+      "version": "0.25.8",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.25.8.tgz",
+      "integrity": "sha1-v2zoO4dRDRY0Ru6qV37WpvxYNeA=",
+      "requires": {
+        "chalk": "^1.1.1",
+        "minimist": "^1.2.0",
+        "source-map-support": "^0.3.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "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="
+        }
+      }
+    },
+    "rss-parser": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.9.0.tgz",
+      "integrity": "sha512-wlRSfGrotOXuWo19Dtl2KmQt7o9i5zzCExUrxpechE0O54BAx7JD+xhWyGumPPqiJj771ndflV3sE3bTHen0HQ==",
+      "dev": true,
+      "requires": {
+        "entities": "^2.0.3",
+        "xml2js": "^0.4.19"
+      }
+    },
+    "rsvp": {
+      "version": "4.8.5",
+      "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+      "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
+      "dev": true
+    },
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+      "dev": true
+    },
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+      "dev": true
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
+    },
+    "rxjs": {
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+      "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.0"
+      }
+    },
+    "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=="
+    },
+    "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=="
+    },
+    "sane": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+      "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+      "dev": true,
+      "requires": {
+        "@cnakazawa/watch": "^1.0.3",
+        "anymatch": "^2.0.0",
+        "capture-exit": "^2.0.0",
+        "exec-sh": "^0.3.2",
+        "execa": "^1.0.0",
+        "fb-watchman": "^2.0.0",
+        "micromatch": "^3.1.4",
+        "minimist": "^1.1.1",
+        "walker": "~1.0.5"
+      },
+      "dependencies": {
+        "@cnakazawa/watch": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+          "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+          "dev": true,
+          "requires": {
+            "exec-sh": "^0.3.2",
+            "minimist": "^1.2.0"
+          }
+        },
+        "exec-sh": {
+          "version": "0.3.4",
+          "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
+          "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
+          "dev": true
+        }
+      }
+    },
+    "sass-graph": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+      "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "lodash": "^4.0.0",
+        "scss-tokenizer": "^0.2.3",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.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
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        }
+      }
+    },
+    "sass-loader": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz",
+      "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==",
+      "dev": true,
+      "requires": {
+        "clone-deep": "^4.0.1",
+        "loader-utils": "^1.2.3",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.6.1",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "saxes": {
+      "version": "3.1.11",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+      "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+      "dev": true,
+      "requires": {
+        "xmlchars": "^2.1.1"
+      }
+    },
+    "schema-utils": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+      "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+      "dev": true,
+      "requires": {
+        "@types/json-schema": "^7.0.4",
+        "ajv": "^6.12.2",
+        "ajv-keywords": "^3.4.1"
+      }
+    },
+    "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"
+          }
+        }
+      }
+    },
+    "sec": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/sec/-/sec-1.0.0.tgz",
+      "integrity": "sha1-Az1go60g7PLgCUDRT5eCNGV3QzU=",
+      "dev": true
+    },
+    "seek-bzip": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz",
+      "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=",
+      "dev": true,
+      "requires": {
+        "commander": "~2.8.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.8.1",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+          "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+          "dev": true,
+          "requires": {
+            "graceful-readlink": ">= 1.0.0"
+          }
+        }
+      }
+    },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.7",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
+      "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.9.0"
+      }
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+    },
+    "semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "requires": {
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+        }
+      }
+    },
+    "semver-utils": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz",
+      "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA=="
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "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"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+              "dev": true
+            }
+          }
+        },
+        "http-errors": {
+          "version": "1.7.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "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
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+          "dev": true
+        }
+      }
+    },
+    "sentence-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.3.tgz",
+      "integrity": "sha512-ZPr4dgTcNkEfcGOMFQyDdJrTU9uQO1nb1cjf+nuzb6FxgMDgKddZOM29qEsB7jvsZSMruLRcL2KfM4ypKpa0LA==",
+      "dev": true,
+      "requires": {
+        "no-case": "^3.0.3",
+        "tslib": "^1.10.0",
+        "upper-case-first": "^2.0.1"
+      }
+    },
+    "serialize-javascript": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
+      "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
+      "dev": true,
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        },
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "dev": true,
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+          "dev": true
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "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"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "shallow-equal": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
+      "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
+    },
+    "shallowequal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
+      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz",
+      "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=",
+      "dev": true,
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
+    },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true
+    },
+    "shortid": {
+      "version": "2.2.15",
+      "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.15.tgz",
+      "integrity": "sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==",
+      "dev": true,
+      "requires": {
+        "nanoid": "^2.1.0"
+      }
+    },
+    "sigmund": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+      "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+          "dev": true
+        }
+      }
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "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
+    },
+    "smart-buffer": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz",
+      "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw=="
+    },
+    "snake-case": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.3.tgz",
+      "integrity": "sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q==",
+      "dev": true,
+      "requires": {
+        "dot-case": "^3.0.3",
+        "tslib": "^1.10.0"
+      }
+    },
+    "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": {
+        "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"
+          }
+        },
+        "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"
+          }
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "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"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.3",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+          "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+          "dev": true
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "sockjs": {
+      "version": "0.3.20",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+      "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "^0.10.0",
+        "uuid": "^3.4.0",
+        "websocket-driver": "0.6.5"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+      "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
+      "dev": true,
+      "requires": {
+        "debug": "^3.2.5",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "~0.11.1",
+        "inherits": "^2.0.3",
+        "json3": "^3.3.2",
+        "url-parse": "^1.4.3"
+      },
+      "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"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.3",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+          "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+          "dev": true,
+          "requires": {
+            "websocket-driver": ">=0.5.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "socks": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.4.1.tgz",
+      "integrity": "sha512-8mWHeYC1OA0500qzb+sqwm0Hzi8oBpeuI1JugoBVMEJtJvxSgco8xFSK+NRnZcHeeWjTbF82KUDo5sXH22TY5A==",
+      "requires": {
+        "ip": "1.1.5",
+        "smart-buffer": "^4.1.0"
+      }
+    },
+    "socks-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==",
+      "requires": {
+        "agent-base": "6",
+        "debug": "4",
+        "socks": "^2.3.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      }
+    },
+    "sort-keys-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+      "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
+      "dev": true,
+      "requires": {
+        "sort-keys": "^1.0.0"
+      }
+    },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "dev": true,
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz",
+      "integrity": "sha1-NJAJd9W6PwfHdX7nLnO7GptTdU8=",
+      "requires": {
+        "source-map": "0.1.32"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.1.32",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
+          "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=",
+          "requires": {
+            "amdefine": ">=0.0.4"
+          }
+        }
+      }
+    },
+    "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
+    },
+    "spawn-please": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz",
+      "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE="
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+      "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "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"
+      }
+    },
+    "split2": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
+      "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
+      "dev": true,
+      "requires": {
+        "through2": "^2.0.2"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+      "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "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"
+      }
+    },
+    "ssri": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz",
+      "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==",
+      "requires": {
+        "minipass": "^3.1.1"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stack-utils": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
+      "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
+      "dev": true
+    },
+    "stackframe": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz",
+      "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==",
+      "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"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "stealthy-require": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+      "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+      "dev": true
+    },
+    "steno": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz",
+      "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.3"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "dev": true,
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+      "dev": true
+    },
+    "streamsearch": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+      "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=",
+      "dev": true
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string-convert": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+      "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c="
+    },
+    "string-length": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
+      "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
+      "dev": true,
+      "requires": {
+        "astral-regex": "^1.0.0",
+        "strip-ansi": "^4.0.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"
+          }
+        }
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "requires": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "string.prototype.trim": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz",
+      "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.0-next.1",
+        "function-bind": "^1.1.1"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.5"
+      }
+    },
+    "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==",
+      "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=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
+    "strip-dirs": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
+      "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+      "dev": true,
+      "requires": {
+        "is-natural-number": "^4.0.1"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
+      "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
+      "dev": true
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+    },
+    "strip-outer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.2"
+      }
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "7.0.32",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
+          "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "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"
+          }
+        }
+      }
+    },
+    "subscriptions-transport-ws": {
+      "version": "0.9.17",
+      "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.17.tgz",
+      "integrity": "sha512-hNHi2N80PBz4T0V0QhnnsMGvG3XDFDS9mS6BhZ3R12T6EBywC8d/uJscsga0cVO4DKtXCkCRrWm2sOYrbOdhEA==",
+      "dev": true,
+      "requires": {
+        "backo2": "^1.0.2",
+        "eventemitter3": "^3.1.0",
+        "iterall": "^1.2.1",
+        "symbol-observable": "^1.0.4",
+        "ws": "^5.2.0"
+      },
+      "dependencies": {
+        "ws": {
+          "version": "5.2.2",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+          "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+          "dev": true,
+          "requires": {
+            "async-limiter": "~1.0.0"
+          }
+        }
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-hyperlinks": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz",
+      "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^2.0.0",
+        "supports-color": "^5.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+          "dev": true
+        }
+      }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+      "dev": true
+    },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      },
+      "dependencies": {
+        "css-select": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+          "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+          "dev": true,
+          "requires": {
+            "boolbase": "^1.0.0",
+            "css-what": "^3.2.1",
+            "domutils": "^1.7.0",
+            "nth-check": "^1.0.2"
+          }
+        },
+        "css-what": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
+          "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
+          "dev": true
+        },
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "dev": true,
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==",
+      "dev": true
+    },
+    "symbol-tree": {
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+      "dev": true
+    },
+    "table": {
+      "version": "5.4.6",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.10.2",
+        "lodash": "^4.17.14",
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "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
+        },
+        "slice-ansi": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+          "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "astral-regex": "^1.0.0",
+            "is-fullwidth-code-point": "^2.0.0"
+          }
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
+      }
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "dev": true
+    },
+    "tape": {
+      "version": "4.13.3",
+      "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz",
+      "integrity": "sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw==",
+      "requires": {
+        "deep-equal": "~1.1.1",
+        "defined": "~1.0.0",
+        "dotignore": "~0.1.2",
+        "for-each": "~0.3.3",
+        "function-bind": "~1.1.1",
+        "glob": "~7.1.6",
+        "has": "~1.0.3",
+        "inherits": "~2.0.4",
+        "is-regex": "~1.0.5",
+        "minimist": "~1.2.5",
+        "object-inspect": "~1.7.0",
+        "resolve": "~1.17.0",
+        "resumer": "~0.0.0",
+        "string.prototype.trim": "~1.2.1",
+        "through": "~2.3.8"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.17.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+          "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+          "requires": {
+            "path-parse": "^1.0.6"
+          }
+        }
+      }
+    },
+    "tar": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz",
+      "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==",
+      "requires": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^3.0.0",
+        "minizlib": "^2.1.0",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "minizlib": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz",
+          "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==",
+          "requires": {
+            "minipass": "^3.0.0",
+            "yallist": "^4.0.0"
+          }
+        }
+      }
+    },
+    "tar-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
+      "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+      "dev": true,
+      "requires": {
+        "bl": "^1.0.0",
+        "buffer-alloc": "^1.2.0",
+        "end-of-stream": "^1.0.0",
+        "fs-constants": "^1.0.0",
+        "readable-stream": "^2.3.0",
+        "to-buffer": "^1.1.1",
+        "xtend": "^4.0.0"
+      }
+    },
+    "taskkill": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-3.1.0.tgz",
+      "integrity": "sha512-5KcOFzPvd1nGFVrmB7H4+QAWVjYOf//+QTbOj0GpXbqtqbKGWVczG+rq6VhXAtdtlKLTs16NAmHRyF5vbggQ2w==",
+      "dev": true,
+      "requires": {
+        "arrify": "^2.0.1",
+        "execa": "^3.3.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        }
+      }
+    },
+    "tasklist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/tasklist/-/tasklist-3.1.1.tgz",
+      "integrity": "sha512-G3I7QWUBSNWaekrJcDabydF6dcvy+vZ2PrX04JYq1p914TOLgpN+ryMtheGavs1LYVevTbTmwjQY8aeX8yLsyA==",
+      "dev": true,
+      "requires": {
+        "neat-csv": "^2.1.0",
+        "pify": "^2.2.0",
+        "sec": "^1.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "temp": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
+      "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==",
+      "dev": true,
+      "requires": {
+        "rimraf": "~2.6.2"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "term-size": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
+      "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
+    },
+    "terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        },
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz",
+      "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^3.1.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.1.2",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "test-exclude": {
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
+      "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3",
+        "minimatch": "^3.0.4",
+        "read-pkg-up": "^4.0.0",
+        "require-main-filename": "^2.0.0"
+      }
+    },
+    "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
+    },
+    "thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dev": true,
+      "requires": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+      "dev": true,
+      "requires": {
+        "thenify": ">= 3.1.0 < 4"
+      }
+    },
+    "thread-loader": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
+      "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
+      "dev": true,
+      "requires": {
+        "loader-runner": "^2.3.1",
+        "loader-utils": "^1.1.0",
+        "neo-async": "^2.6.0"
+      }
+    },
+    "throat": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
+      "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=",
+      "dev": true
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
+    "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"
+      }
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+      "dev": true
+    },
+    "timed-out": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+      "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "dev": true
+    },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+    },
+    "tinycolor2": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
+      "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "~1.0.2"
+      }
+    },
+    "tmpl": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+      "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+      "dev": true
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-buffer": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
+      "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "to-readable-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+    },
+    "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"
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "dev": true
+    },
+    "toposort": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
+      "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+      "dev": true
+    },
+    "touch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+      "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+      "dev": true,
+      "requires": {
+        "nopt": "~1.0.10"
+      },
+      "dependencies": {
+        "nopt": {
+          "version": "1.0.10",
+          "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+          "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+          "dev": true,
+          "requires": {
+            "abbrev": "1"
+          }
+        }
+      }
+    },
+    "tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "requires": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      }
+    },
+    "tr46": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+      "dev": true,
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "treeify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz",
+      "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==",
+      "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
+    },
+    "trim-repeated": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.2"
+      }
+    },
+    "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"
+      }
+    },
+    "tryer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz",
+      "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==",
+      "dev": true
+    },
+    "ts-invariant": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz",
+      "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.3"
+      }
+    },
+    "ts-jest": {
+      "version": "24.3.0",
+      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz",
+      "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==",
+      "dev": true,
+      "requires": {
+        "bs-logger": "0.x",
+        "buffer-from": "1.x",
+        "fast-json-stable-stringify": "2.x",
+        "json5": "2.x",
+        "lodash.memoize": "4.x",
+        "make-error": "1.x",
+        "mkdirp": "0.x",
+        "resolve": "1.x",
+        "semver": "^5.5",
+        "yargs-parser": "10.x"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "yargs-parser": {
+          "version": "10.1.0",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+          "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^4.1.0"
+          }
+        }
+      }
+    },
+    "ts-node": {
+      "version": "8.10.2",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
+      "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
+      "dev": true,
+      "requires": {
+        "arg": "^4.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "source-map-support": "^0.5.17",
+        "yn": "3.1.1"
+      },
+      "dependencies": {
+        "source-map-support": {
+          "version": "0.5.19",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+          "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+          "dev": true,
+          "requires": {
+            "buffer-from": "^1.0.0",
+            "source-map": "^0.6.0"
+          }
+        }
+      }
+    },
+    "ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz",
+      "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==",
+      "dev": true
+    },
+    "tsconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz",
+      "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==",
+      "dev": true,
+      "requires": {
+        "@types/strip-bom": "^3.0.0",
+        "@types/strip-json-comments": "0.0.30",
+        "strip-bom": "^3.0.0",
+        "strip-json-comments": "^2.0.0"
+      }
+    },
+    "tsconfig-paths": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+      "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+      "dev": true,
+      "requires": {
+        "@types/json5": "^0.0.29",
+        "json5": "^1.0.1",
+        "minimist": "^1.2.0",
+        "strip-bom": "^3.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        }
+      }
+    },
+    "tslib": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+      "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+      "dev": true
+    },
+    "tty": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tty/-/tty-1.0.1.tgz",
+      "integrity": "sha1-5ECayYsN0cULWf846G6sPwdk7kU=",
+      "dev": true
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "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="
+    },
+    "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"
+      }
+    },
+    "type-fest": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "typescript": {
+      "version": "3.9.7",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
+      "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "2.8.29",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+      "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+      "requires": {
+        "source-map": "~0.5.1",
+        "uglify-to-browserify": "~1.0.0",
+        "yargs": "~3.10.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "optional": true
+    },
+    "uglifyjs-webpack-plugin": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz",
+      "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==",
+      "dev": true,
+      "requires": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^1.7.0",
+        "source-map": "^0.6.1",
+        "uglify-js": "^3.6.0",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+          "dev": true
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "rimraf": {
+          "version": "2.7.1",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+          "dev": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "serialize-javascript": {
+          "version": "1.9.1",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
+          "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==",
+          "dev": true
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "dev": true,
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "uglify-js": {
+          "version": "3.10.0",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz",
+          "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==",
+          "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
+        }
+      }
+    },
+    "unbzip2-stream": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+      "dev": true,
+      "requires": {
+        "buffer": "^5.2.1",
+        "through": "^2.3.8"
+      }
+    },
+    "undefsafe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
+      "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.2.0"
+      },
+      "dependencies": {
+        "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"
+          }
+        }
+      }
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+      "dev": true
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "dev": true,
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+      "dev": true
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+      "dev": true
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "requires": {
+        "crypto-random-string": "^2.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
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "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
+        }
+      }
+    },
+    "unzip-response": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+      "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+      "dev": true
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "dev": true
+    },
+    "update-notifier": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz",
+      "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==",
+      "requires": {
+        "boxen": "^4.2.0",
+        "chalk": "^3.0.0",
+        "configstore": "^5.0.1",
+        "has-yarn": "^2.1.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^2.0.0",
+        "is-installed-globally": "^0.3.1",
+        "is-npm": "^4.0.0",
+        "is-yarn-global": "^0.3.0",
+        "latest-version": "^5.0.0",
+        "pupa": "^2.0.1",
+        "semver-diff": "^3.1.1",
+        "xdg-basedir": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+          "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "supports-color": {
+          "version": "7.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+          "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "upper-case": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.1.tgz",
+      "integrity": "sha512-laAsbea9SY5osxrv7S99vH9xAaJKrw5Qpdh4ENRLcaxipjKsiaBwiAsxfa8X5mObKNTQPsupSq0J/VIxsSJe3A==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.10.0"
+      }
+    },
+    "upper-case-first": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.1.tgz",
+      "integrity": "sha512-105J8XqQ+9RxW3l9gHZtgve5oaiR9TIwvmZAMAIZWRHe00T21cdvewKORTlOJf/zXW6VukuTshM+HXZNWz7N5w==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.10.0"
+      }
+    },
+    "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==",
+      "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
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-loader": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz",
+      "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "^1.2.3",
+        "mime": "^2.4.4",
+        "schema-utils": "^2.5.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+          "dev": true
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
+      "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+      "dev": true,
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "requires": {
+        "prepend-http": "^2.0.0"
+      }
+    },
+    "url-to-options": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+      "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=",
+      "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
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "util.promisify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+      "dev": true,
+      "requires": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.2",
+        "has-symbols": "^1.0.1",
+        "object.getownpropertydescriptors": "^2.1.0"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+    },
+    "v8-compile-cache": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+      "dev": true
+    },
+    "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"
+      }
+    },
+    "validate-npm-package-name": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
+      "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=",
+      "requires": {
+        "builtins": "^1.0.3"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+      "dev": true
+    },
+    "venn.js": {
+      "version": "0.2.20",
+      "resolved": "https://registry.npmjs.org/venn.js/-/venn.js-0.2.20.tgz",
+      "integrity": "sha512-bb5SYq/wamY9fvcuErb9a0FJkgIFHJjkLZWonQ+DoKKuDX3WPH2B4ouI1ce4K2iejBklQy6r1ly8nOGIyOCO6w==",
+      "requires": {
+        "d3-selection": "^1.0.2",
+        "d3-transition": "^1.0.1",
+        "fmin": "0.0.2"
+      }
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
+    "viser": {
+      "version": "2.4.9",
+      "resolved": "https://registry.npmjs.org/viser/-/viser-2.4.9.tgz",
+      "integrity": "sha512-DKsqtMa3TZYQHEZ7jp4kpNp1Iqomda7d+3IkkIjIdKQvfL8OeksXfy/ECZUY1hTrGoOe7cq85+6PMS+MPn4mgQ==",
+      "requires": {
+        "@antv/g2": "~3.5.3",
+        "@antv/g2-brush": "^0.0.2",
+        "@antv/g2-plugin-slider": "^2.1.0",
+        "@types/d3-format": "*",
+        "@types/lodash": "*",
+        "@types/node": "^8.0.53",
+        "d3-format": "^1.3.0",
+        "lodash": "^4.17.4"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "8.10.62",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.62.tgz",
+          "integrity": "sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw=="
+        }
+      }
+    },
+    "viser-vue": {
+      "version": "2.4.8",
+      "resolved": "https://registry.npmjs.org/viser-vue/-/viser-vue-2.4.8.tgz",
+      "integrity": "sha512-ERAREN+6k/ywrwT+swcMo4CDIAq6dBjnB0+lhmsSfaip06BGHSBfNKg6yl7/4GJ9Nk2kioUw3llNhEboJuIKmQ==",
+      "requires": {
+        "@types/node": "*",
+        "viser": "^2.0.0",
+        "vue": "^2.5.3"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "dev": true
+    },
+    "vscode-jsonrpc": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz",
+      "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==",
+      "dev": true
+    },
+    "vscode-languageserver": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz",
+      "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==",
+      "dev": true,
+      "requires": {
+        "vscode-languageserver-protocol": "3.14.1",
+        "vscode-uri": "^1.0.6"
+      }
+    },
+    "vscode-languageserver-protocol": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz",
+      "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==",
+      "dev": true,
+      "requires": {
+        "vscode-jsonrpc": "^4.0.0",
+        "vscode-languageserver-types": "3.14.0"
+      }
+    },
+    "vscode-languageserver-types": {
+      "version": "3.14.0",
+      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz",
+      "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==",
+      "dev": true
+    },
+    "vscode-uri": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz",
+      "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==",
+      "dev": true
+    },
+    "vue": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
+      "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
+    },
+    "vue-cli-plugin-apollo": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/vue-cli-plugin-apollo/-/vue-cli-plugin-apollo-0.21.3.tgz",
+      "integrity": "sha512-8CzRVrAsFkB9lpl600cRCNR9OUnrSYYAIVF9/qW4pP0TMXbhrd1F1wEAAN6E0CPimjTLB+qSt6zWS4vb2wC8Wg==",
+      "dev": true,
+      "requires": {
+        "apollo": "^2.20.0",
+        "apollo-cache-inmemory": "^1.6.3",
+        "apollo-client": "^2.6.4",
+        "apollo-link": "^1.2.13",
+        "apollo-link-context": "^1.0.19",
+        "apollo-link-http": "^1.5.16",
+        "apollo-link-persisted-queries": "^0.2.2",
+        "apollo-link-state": "^0.4.2",
+        "apollo-link-ws": "^1.0.19",
+        "apollo-server-express": "^2.9.6",
+        "apollo-upload-client": "^11.0.0",
+        "apollo-utilities": "^1.3.2",
+        "chalk": "^2.4.2",
+        "deepmerge": "^4.1.1",
+        "dotenv": "^8.2.0",
+        "esm": "^3.2.25",
+        "execa": "^3.2.0",
+        "express": "^4.17.1",
+        "fs-extra": "^8.1.0",
+        "graphql": "^14.5.8",
+        "graphql-subscriptions": "^1.1.0",
+        "graphql-tag": "^2.10.1",
+        "graphql-tools": "^4.0.5",
+        "node-fetch": "^2.6.0",
+        "nodemon": "^1.19.4",
+        "subscriptions-transport-ws": "^0.9.16",
+        "ts-node": "^8.4.1"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+          "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.1.0",
+            "shebang-command": "^2.0.0",
+            "which": "^2.0.1"
+          }
+        },
+        "execa": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+          "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "p-finally": "^2.0.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
+        "fs-extra": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^4.0.0",
+            "universalify": "^0.1.0"
+          }
+        },
+        "get-stream": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+          "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+          "dev": true,
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+          "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+          "dev": true
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "npm-run-path": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+          "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+          "dev": true,
+          "requires": {
+            "path-key": "^3.0.0"
+          }
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "p-finally": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+          "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+          "dev": true
+        },
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+          "dev": true
+        },
+        "shebang-command": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+          "dev": true,
+          "requires": {
+            "shebang-regex": "^3.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+          "dev": true
+        }
+      }
+    },
+    "vue-cli-plugin-i18n": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vue-cli-plugin-i18n/-/vue-cli-plugin-i18n-1.0.1.tgz",
+      "integrity": "sha512-sLo6YzudaWgn5dOMvrKixE5bb/onYGxcxm+0YexqoOx0QtR+7hZ/P5WPFBMM9v/2i1ec2YYe2PvKTBel7KE+tA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.0",
+        "deepmerge": "^4.2.0",
+        "dotenv": "^8.2.0",
+        "flat": "^5.0.0",
+        "rimraf": "^3.0.0",
+        "vue": "^2.6.11",
+        "vue-i18n": "^8.17.0",
+        "vue-i18n-extract": "1.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "vue-clipboard2": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.3.1.tgz",
+      "integrity": "sha512-H5S/agEDj0kXjUb5GP2c0hCzIXWRBygaWLN3NEFsaI9I3uWin778SFEMt8QRXiPG+7anyjqWiw2lqcxWUSfkYg==",
+      "requires": {
+        "clipboard": "^2.0.0"
+      }
+    },
+    "vue-cropper": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.5.6.tgz",
+      "integrity": "sha512-54Z/AipXDBcE5nzJweTM+BryzSAcC0FCTMQLvLt6f4XanP4AWB3mPkQw3PG3NRICo7knljHO+N+pjZxYAKoTLQ=="
+    },
+    "vue-eslint-parser": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz",
+      "integrity": "sha512-Kr21uPfthDc63nDl27AGQEhtt9VrZ9nkYk/NTftJ2ws9XiJwzJJCnCr3AITQ2jpRMA0XPGDECxYH8E027qMK9Q==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.1.1",
+        "eslint-scope": "^5.0.0",
+        "eslint-visitor-keys": "^1.1.0",
+        "espree": "^6.2.1",
+        "esquery": "^1.0.1",
+        "lodash": "^4.17.15"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "eslint-scope": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
+          "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
+          "dev": true,
+          "requires": {
+            "esrecurse": "^4.1.0",
+            "estraverse": "^4.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        }
+      }
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
+      "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
+      "dev": true
+    },
+    "vue-i18n": {
+      "version": "8.22.4",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.4.tgz",
+      "integrity": "sha512-XLI5s0AdqMP2Lf4I4CmdmOq8kjb5DDFGR77wAuxCfpEuYSfhTRyyx6MetgZMiL6Lxa0DasjBOiOcciU3NkL3/Q=="
+    },
+    "vue-i18n-extract": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/vue-i18n-extract/-/vue-i18n-extract-1.0.2.tgz",
+      "integrity": "sha512-+zwDKvle4KcfloXZnj5hF01ViKDiFr5RMx5507D7oyDXpSleRpekF5YHgZa/+Ra6Go68//z0Nya58J9tKFsCjw==",
+      "dev": true,
+      "requires": {
+        "cli-table3": "^0.5.1",
+        "dot-object": "^1.7.1",
+        "esm": "^3.2.13",
+        "glob": "^7.1.3",
+        "is-valid-glob": "^1.0.0",
+        "yargs": "^13.2.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.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
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        }
+      }
+    },
+    "vue-jest": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.6.tgz",
+      "integrity": "sha512-VyuM8wR0vAlYCbPRY+PhIqRU5yUyBnUmwYTo4IFScs2+tiuis5VBItU0PGC8Wcx6qJwKB5jq5p7WFhabzMFMgQ==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
+        "chalk": "^2.1.0",
+        "deasync": "^0.1.15",
+        "extract-from-css": "^0.4.4",
+        "find-babel-config": "^1.1.0",
+        "js-beautify": "^1.6.14",
+        "node-cache": "^4.1.1",
+        "object-assign": "^4.1.1",
+        "source-map": "^0.5.6",
+        "tsconfig": "^7.0.0",
+        "vue-template-es2015-compiler": "^1.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "dev": true
+        }
+      }
+    },
+    "vue-jscodeshift-adapter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/vue-jscodeshift-adapter/-/vue-jscodeshift-adapter-2.1.0.tgz",
+      "integrity": "sha512-xDn8kpZ0/yG9Z1Z+osrfnd1k1y5AJIdUtqHWNJY2eRz37Gs1tftiZ8BUK89Pab0ddnwhZqh5eNFfOT0SFlZnWQ==",
+      "dev": true,
+      "requires": {
+        "cheerio": "^1.0.0-rc.2",
+        "detect-indent": "^6.0.0",
+        "indent-string": "^4.0.0",
+        "vue-sfc-descriptor-to-string": "^1.0.0",
+        "vue-template-compiler": "^2.5.13"
+      }
+    },
+    "vue-loader": {
+      "version": "15.9.3",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.3.tgz",
+      "integrity": "sha512-Y67VnGGgVLH5Voostx8JBZgPQTlDQeOVBLOEsjc2cXbCYBKexSKEpOA56x0YZofoDOTszrLnIShyOX1p9uCEHA==",
+      "dev": true,
+      "requires": {
+        "@vue/component-compiler-utils": "^3.1.0",
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.1.0",
+        "vue-hot-reload-api": "^2.3.0",
+        "vue-style-loader": "^4.1.0"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+          "dev": true
+        }
+      }
+    },
+    "vue-ls": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/vue-ls/-/vue-ls-3.2.2.tgz",
+      "integrity": "sha512-xros9Zheckv+8x9PerHvWe5SMYud0+ZlPAMrKWKNtDN/usMOKRoluj6kBZyQo6BxwpmiBL8/EjKMYjxmCNXOMg==",
+      "requires": {
+        "opencollective-postinstall": "^2.0.2"
+      }
+    },
+    "vue-ref": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vue-ref/-/vue-ref-2.0.0.tgz",
+      "integrity": "sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ=="
+    },
+    "vue-router": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz",
+      "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw=="
+    },
+    "vue-sfc-descriptor-to-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/vue-sfc-descriptor-to-string/-/vue-sfc-descriptor-to-string-1.0.0.tgz",
+      "integrity": "sha512-VYNMsrIPZQZau5Gk8IVtgonN1quOznP9/pLIF5m2c4R30KCDDe3NwthrsM7lSUY2K4lezcb8j3Wu8cQhBuZEMQ==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^3.2.0"
+      },
+      "dependencies": {
+        "indent-string": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
+          "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
+          "dev": true
+        }
+      }
+    },
+    "vue-style-loader": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
+      "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
+      "dev": true,
+      "requires": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      },
+      "dependencies": {
+        "hash-sum": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+          "dev": true
+        }
+      }
+    },
+    "vue-svg-component-builder": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/vue-svg-component-builder/-/vue-svg-component-builder-2.0.3.tgz",
+      "integrity": "sha512-We9ZLSYPQx9y3v5+HNWyjkGFaxZMlWPTqYBU08y4YT46f453BQ4JxIoS8rV0a8PIxnKap7m/YIzrdIfoHxrpaA==",
+      "dev": true
+    },
+    "vue-svg-component-runtime": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vue-svg-component-runtime/-/vue-svg-component-runtime-1.0.1.tgz",
+      "integrity": "sha512-TkmZ1qwFeFJSRH6b6KVqDU2f8DCSdoNoo/veKqog7FsyF0UETTI66ALKX1rrLXy/KT6LSaJB5IfZkuuSfaQsEA=="
+    },
+    "vue-svg-icon-loader": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/vue-svg-icon-loader/-/vue-svg-icon-loader-2.1.1.tgz",
+      "integrity": "sha512-JOL4fyh9rnbcqMLTF5NVG8YVupnLIMHMY+3CLMaEb9xDUmfk6Cp3RqyI/8gBea7d51i4lyNdzZ3tQ/EJLQxQDA==",
+      "dev": true,
+      "requires": {
+        "@types/loader-utils": "1.1.3",
+        "@types/node": "8.9",
+        "loader-utils": "1.1.0",
+        "vue-svg-component-builder": "2.0.3"
+      },
+      "dependencies": {
+        "@types/node": {
+          "version": "8.9.5",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz",
+          "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==",
+          "dev": true
+        },
+        "big.js": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+          "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+          "dev": true
+        },
+        "emojis-list": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+          "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+          "dev": true
+        },
+        "json5": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+          "dev": true
+        },
+        "loader-utils": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+          "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+          "dev": true,
+          "requires": {
+            "big.js": "^3.1.3",
+            "emojis-list": "^2.0.0",
+            "json5": "^0.5.0"
+          }
+        }
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
+      "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
+      "dev": true,
+      "requires": {
+        "de-indent": "^1.0.2",
+        "he": "^1.1.0"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
+      "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
+      "dev": true
+    },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
+    "vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+    },
+    "w3c-hr-time": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+      "dev": true,
+      "requires": {
+        "browser-process-hrtime": "^1.0.0"
+      }
+    },
+    "w3c-xmlserializer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
+      "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+      "dev": true,
+      "requires": {
+        "domexception": "^1.0.1",
+        "webidl-conversions": "^4.0.2",
+        "xml-name-validator": "^3.0.0"
+      }
+    },
+    "walker": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+      "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+      "dev": true,
+      "requires": {
+        "makeerror": "1.0.x"
+      }
+    },
+    "warning": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+      "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
+    "watch": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz",
+      "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=",
+      "dev": true,
+      "requires": {
+        "exec-sh": "^0.2.0",
+        "minimist": "^1.2.0"
+      }
+    },
+    "watchpack": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+      "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+      "dev": true,
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.0"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+          "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+          "dev": true,
+          "optional": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.4.1",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz",
+          "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.1.2",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.4.0"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+          "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+          "dev": true,
+          "optional": true
+        },
+        "glob-parent": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+          "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-glob": "^4.0.1"
+          }
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true,
+          "optional": true
+        },
+        "readdirp": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+          "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+      "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+      "dev": true,
+      "requires": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "dev": true
+    },
+    "webpack": {
+      "version": "4.44.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz",
+      "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.3.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz",
+      "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==",
+      "dev": true,
+      "requires": {
+        "acorn": "^7.1.1",
+        "acorn-walk": "^7.1.1",
+        "bfj": "^6.1.1",
+        "chalk": "^2.4.1",
+        "commander": "^2.18.0",
+        "ejs": "^2.6.1",
+        "express": "^4.16.3",
+        "filesize": "^3.6.1",
+        "gzip-size": "^5.0.0",
+        "lodash": "^4.17.19",
+        "mkdirp": "^0.5.1",
+        "opener": "^1.5.1",
+        "ws": "^6.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "7.4.1",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+          "dev": true
+        },
+        "acorn-walk": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+          "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+          "dev": true
+        },
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "webpack-chain": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz",
+      "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==",
+      "dev": true,
+      "requires": {
+        "deepmerge": "^1.5.2",
+        "javascript-stringify": "^2.0.1"
+      },
+      "dependencies": {
+        "deepmerge": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+          "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==",
+          "dev": true
+        },
+        "javascript-stringify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz",
+          "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==",
+          "dev": true
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+      "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "2.4.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+          "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+      "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.8",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.3",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.7",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "0.3.20",
+        "sockjs-client": "1.4.0",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "cliui": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+          "dev": true,
+          "requires": {
+            "string-width": "^3.1.0",
+            "strip-ansi": "^5.2.0",
+            "wrap-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "find-up": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "dev": true,
+          "requires": {
+            "locate-path": "^3.0.0"
+          }
+        },
+        "is-absolute-url": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+          "dev": true
+        },
+        "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
+        },
+        "locate-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^3.0.0",
+            "path-exists": "^3.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "p-locate": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "dev": true,
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "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"
+          }
+        },
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          },
+          "dependencies": {
+            "strip-ansi": {
+              "version": "5.2.0",
+              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+              "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+              "dev": true,
+              "requires": {
+                "ansi-regex": "^4.1.0"
+              }
+            }
+          }
+        },
+        "yargs": {
+          "version": "13.3.2",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^5.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.1.2"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "dev": true,
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+      "dev": true,
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+      "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
+      "dev": true,
+      "requires": {
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+      "dev": true
+    },
+    "whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "dev": true,
+      "requires": {
+        "iconv-lite": "0.4.24"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "dev": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        }
+      }
+    },
+    "whatwg-mimetype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+      "dev": true
+    },
+    "whatwg-url": {
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
+      "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
+      "dev": true,
+      "requires": {
+        "lodash.sortby": "^4.7.0",
+        "tr46": "^1.0.1",
+        "webidl-conversions": "^4.0.2"
+      }
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "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==",
+      "requires": {
+        "string-width": "^1.0.2 || 2"
+      }
+    },
+    "widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "requires": {
+        "string-width": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+    },
+    "wolfy87-eventemitter": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz",
+      "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE="
+    },
+    "word-wrap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+      "dev": true
+    },
+    "wordwrap": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "dev": true,
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "dev": true,
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+      "dev": true,
+      "requires": {
+        "mkdirp": "^0.5.1"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.5.5",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+          "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+          "dev": true,
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        }
+      }
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "ws": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xdg-basedir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
+    },
+    "xml-name-validator": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+      "dev": true
+    },
+    "xml2js": {
+      "version": "0.4.23",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+      "dev": true,
+      "requires": {
+        "sax": ">=0.6.0",
+        "xmlbuilder": "~11.0.0"
+      }
+    },
+    "xmlbuilder": {
+      "version": "11.0.1",
+      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+      "dev": true
+    },
+    "xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+      "dev": true
+    },
+    "xss": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz",
+      "integrity": "sha512-3MgPdaXV8rfQ/pNn16Eio6VXYPTkqwa0vc7GkiymmY/DqR1SE/7VPAAVZz1GJsJFrllMYO3RHfEaiUGjab6TNw==",
+      "dev": true,
+      "requires": {
+        "commander": "^2.20.3",
+        "cssfilter": "0.0.10"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+          "dev": true
+        }
+      }
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "dev": true
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "yaml-front-matter": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/yaml-front-matter/-/yaml-front-matter-3.4.1.tgz",
+      "integrity": "sha1-5S6E/qaYO5N1XpsVZNupibAGtaU=",
+      "dev": true,
+      "requires": {
+        "commander": "1.0.0",
+        "js-yaml": "^3.5.2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-1.0.0.tgz",
+          "integrity": "sha1-XmqI5wcP9ZCINurRkWlUjDD5C80=",
+          "dev": true
+        }
+      }
+    },
+    "yargs": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+      "requires": {
+        "camelcase": "^1.0.2",
+        "cliui": "^2.1.0",
+        "decamelize": "^1.0.0",
+        "window-size": "0.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+          "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "13.1.2",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "dev": true,
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    },
+    "yarn": {
+      "version": "1.22.4",
+      "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.4.tgz",
+      "integrity": "sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA==",
+      "dev": true
+    },
+    "yauzl": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+      "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+      "dev": true,
+      "requires": {
+        "buffer-crc32": "~0.2.3",
+        "fd-slicer": "~1.1.0"
+      }
+    },
+    "yn": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+      "dev": true
+    },
+    "yorkie": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz",
+      "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==",
+      "dev": true,
+      "requires": {
+        "execa": "^0.8.0",
+        "is-ci": "^1.0.10",
+        "normalize-path": "^1.0.0",
+        "strip-indent": "^2.0.0"
+      },
+      "dependencies": {
+        "ci-info": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
+          "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
+          "dev": true
+        },
+        "cross-spawn": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^4.0.1",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "0.8.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+          "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^5.0.1",
+            "get-stream": "^3.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "get-stream": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+          "dev": true
+        },
+        "is-ci": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
+          "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
+          "dev": true,
+          "requires": {
+            "ci-info": "^1.5.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"
+          }
+        },
+        "normalize-path": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz",
+          "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=",
+          "dev": true
+        },
+        "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"
+          }
+        },
+        "yallist": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+          "dev": true
+        }
+      }
+    },
+    "zen-observable": {
+      "version": "0.8.15",
+      "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
+      "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==",
+      "dev": true
+    },
+    "zen-observable-ts": {
+      "version": "0.8.21",
+      "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz",
+      "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==",
+      "dev": true,
+      "requires": {
+        "tslib": "^1.9.3",
+        "zen-observable": "^0.8.0"
+      }
+    }
+  }
+}
diff --git a/ui/package.json b/ui/package.json
new file mode 100644
index 0000000..fcc561f
--- /dev/null
+++ b/ui/package.json
@@ -0,0 +1,165 @@
+{
+  "name": "cloudstack-ui",
+  "description": "Modern role-based Apache CloudStack UI",
+  "version": "1.0.0",
+  "homepage": "https://cloudstack.apache.org/",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/apache/cloudstack.git"
+  },
+  "author": {
+    "name": "Apache CloudStack Developers",
+    "email": "dev@cloudstack.apache.org",
+    "url": "https://cloudstack.apache.org"
+  },
+  "license": "Apache-2.0",
+  "licenses": [
+    {
+      "type": "Apache-2.0",
+      "url": "http://www.apache.org/licenses/LICENSE-2.0"
+    }
+  ],
+  "bugs": {
+    "mail": "dev@cloudstack.apache.org",
+    "url": "https://github.com/apache/cloudstack/issues"
+  },
+  "scripts": {
+    "start": "vue-cli-service lint --no-fix && vue-cli-service serve",
+    "serve": "vue-cli-service lint --no-fix && vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint",
+    "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'",
+    "test:unit": "vue-cli-service test:unit"
+  },
+  "dependencies": {
+    "@fortawesome/fontawesome-svg-core": "^1.2.34",
+    "@fortawesome/free-brands-svg-icons": "^5.15.2",
+    "@fortawesome/free-solid-svg-icons": "^5.15.2",
+    "@fortawesome/vue-fontawesome": "^2.0.2",
+    "ant-design-vue": "~1.7.3",
+    "antd-theme-webpack-plugin": "^1.3.9",
+    "axios": "^0.21.1",
+    "babel-plugin-require-context-hook": "^1.0.0",
+    "core-js": "^3.6.5",
+    "enquire.js": "^2.1.6",
+    "js-cookie": "^2.2.1",
+    "lodash": "^4.17.15",
+    "md5": "^2.2.1",
+    "moment": "^2.26.0",
+    "npm-check-updates": "^6.0.1",
+    "nprogress": "^0.2.0",
+    "viser-vue": "^2.4.8",
+    "vue": "^2.6.12",
+    "vue-clipboard2": "^0.3.1",
+    "vue-cropper": "0.5.6",
+    "vue-i18n": "^8.22.4",
+    "vue-ls": "^3.2.2",
+    "vue-router": "^3.5.1",
+    "vue-svg-component-runtime": "^1.0.1",
+    "vuedraggable": "^2.24.3",
+    "vuex": "^3.6.2"
+  },
+  "devDependencies": {
+    "@vue/cli": "^4.4.1",
+    "@vue/cli-plugin-babel": "^4.4.1",
+    "@vue/cli-plugin-eslint": "^4.4.1",
+    "@vue/cli-plugin-unit-jest": "^4.4.1",
+    "@vue/cli-service": "^4.4.1",
+    "@vue/eslint-config-standard": "^5.1.2",
+    "@vue/test-utils": "^1.0.3",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "^10.0.3",
+    "babel-jest": "^25.1.0",
+    "babel-plugin-import": "^1.13.0",
+    "eslint": "^6.8.0",
+    "eslint-plugin-html": "^6.0.2",
+    "eslint-plugin-import": "^2.20.2",
+    "eslint-plugin-node": "^11.1.0",
+    "eslint-plugin-promise": "^4.2.1",
+    "eslint-plugin-standard": "^4.0.1",
+    "eslint-plugin-vue": "^6.2.2",
+    "less": "^3.11.1",
+    "less-loader": "^5.0.0",
+    "node-sass": "^4.13.1",
+    "sass-loader": "^8.0.2",
+    "uglifyjs-webpack-plugin": "^2.2.0",
+    "vue-cli-plugin-i18n": "^1.0.1",
+    "vue-svg-icon-loader": "^2.1.1",
+    "vue-template-compiler": "^2.6.12",
+    "webpack": "^4.43.0"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/strongly-recommended",
+      "@vue/standard"
+    ],
+    "parserOptions": {
+      "parser": "babel-eslint"
+    },
+    "rules": {
+      "generator-star-spacing": "off",
+      "no-mixed-operators": 0,
+      "vue/max-attributes-per-line": [
+        2,
+        {
+          "singleline": 5,
+          "multiline": {
+            "max": 1,
+            "allowFirstLine": false
+          }
+        }
+      ],
+      "vue/attribute-hyphenation": 0,
+      "vue/html-self-closing": 0,
+      "vue/component-name-in-template-casing": 0,
+      "vue/html-closing-bracket-spacing": 0,
+      "vue/singleline-html-element-content-newline": 0,
+      "vue/no-unused-components": 0,
+      "vue/multiline-html-element-content-newline": 0,
+      "vue/no-use-v-if-with-v-for": 0,
+      "vue/html-closing-bracket-newline": 0,
+      "vue/no-parsing-error": 0,
+      "no-console": 0,
+      "no-tabs": 0,
+      "quotes": [
+        2,
+        "single",
+        {
+          "avoidEscape": true,
+          "allowTemplateLiterals": true
+        }
+      ],
+      "semi": [
+        2,
+        "never",
+        {
+          "beforeStatementContinuationChars": "never"
+        }
+      ],
+      "no-delete-var": 2,
+      "prefer-const": [
+        2,
+        {
+          "ignoreReadBeforeAssign": false
+        }
+      ]
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "jest": {
+    "testEnvironment": "node"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 10"
+  ]
+}
diff --git a/ui/public/assets/403.png b/ui/public/assets/403.png
new file mode 100644
index 0000000..5ce416c
--- /dev/null
+++ b/ui/public/assets/403.png
Binary files differ
diff --git a/ui/public/assets/404.png b/ui/public/assets/404.png
new file mode 100644
index 0000000..4720b68
--- /dev/null
+++ b/ui/public/assets/404.png
Binary files differ
diff --git a/ui/public/assets/500.png b/ui/public/assets/500.png
new file mode 100644
index 0000000..bdb9418
--- /dev/null
+++ b/ui/public/assets/500.png
Binary files differ
diff --git a/ui/public/assets/banner.svg b/ui/public/assets/banner.svg
new file mode 100644
index 0000000..23eefed
--- /dev/null
+++ b/ui/public/assets/banner.svg
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 1484.4133 362.9483"
+   height="362.9483"
+   width="1484.4133"
+   xml:space="preserve"
+   id="svg2"
+   version="1.1"
+   sodipodi:docname="banner.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1866"
+     inkscape:window-height="1017"
+     id="namedview93"
+     showgrid="false"
+     inkscape:zoom="1.6427873"
+     inkscape:cx="59.013394"
+     inkscape:cy="181.47415"
+     inkscape:window-x="54"
+     inkscape:window-y="26"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" /><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mend"
+       style="overflow:visible;"
+       inkscape:isstock="true"><path
+         id="path913"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#7787ff;stroke-width:1pt;stroke-opacity:1;fill:#5affff;fill-opacity:1"
+         transform="scale(0.4) rotate(180) translate(10,0)" /></marker><clipPath
+       id="clipPath18"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path16"
+         d="M 0,2000 H 2000 V 0 H 0 Z" /></clipPath><clipPath
+       id="clipPath90"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path88"
+         d="m 1317.766,1308.723 v -15.945 h -0.107 c -1.215,2.153 -3.975,4.082 -8.06,4.082 v 0 c -6.512,0 -12.028,-5.46 -11.973,-14.345 v 0 c 0,-8.111 4.967,-13.573 11.419,-13.573 v 0 c 4.36,0 7.62,2.261 9.107,5.244 v 0 h 0.109 l 0.218,-4.637 h 4.368 c -0.17,1.822 -0.227,4.523 -0.227,6.898 v 0 32.276 z m -15.23,-25.985 c 0,5.904 2.981,10.317 8,10.317 v 0 c 3.645,0 6.291,-2.535 7.01,-5.628 v 0 c 0.164,-0.607 0.22,-1.435 0.22,-2.042 v 0 -4.632 c 0,-0.776 -0.056,-1.437 -0.22,-2.099 v 0 c -0.881,-3.64 -3.862,-5.795 -7.117,-5.795 v 0 c -5.245,0 -7.893,4.469 -7.893,9.879 m -76.687,-13.189 h 4.852 v 39.174 h -4.852 z m 296.659,34.21 c 0,-1.653 1.214,-2.976 2.923,-2.976 v 0 c 1.933,0 3.146,1.323 3.088,2.976 v 0 c 0,1.713 -1.155,3.036 -2.977,3.036 v 0 c -1.767,0 -3.034,-1.323 -3.034,-3.036 m -16.55,-1.103 v -6.4 h -4.142 v -3.699 h 4.142 v -14.565 c 0,-3.146 0.494,-5.516 1.873,-6.95 v 0 c 1.16,-1.325 2.978,-2.045 5.242,-2.045 v 0 c 1.877,0 3.366,0.275 4.307,0.662 v 0 l -0.223,3.642 c -0.609,-0.163 -1.543,-0.33 -2.814,-0.33 v 0 c -2.703,0 -3.641,1.875 -3.641,5.186 v 0 14.4 h 6.954 v 3.699 h -6.954 v 7.668 z m 58.758,-19.974 c 0,-7.397 4.744,-13.023 11.363,-13.023 v 0 c 4.141,0 7.007,1.986 8.5,4.472 v 0 h 0.111 v -2.982 c 0,-6.732 -3.642,-9.325 -8.611,-9.325 v 0 c -3.31,0 -6.066,0.994 -7.836,2.097 v 0 l -1.212,-3.698 c 2.153,-1.436 5.683,-2.207 8.886,-2.207 v 0 c 3.363,0 7.117,0.771 9.711,3.199 v 0 c 2.592,2.318 3.804,6.071 3.804,12.196 v 0 15.506 c 0,3.256 0.112,5.405 0.224,7.339 v 0 h -4.251 l -0.221,-4.03 h -0.111 c -1.158,2.206 -3.693,4.634 -8.332,4.634 v 0 c -6.123,0 -12.025,-5.128 -12.025,-14.178 m 4.91,0.275 c 0,6.179 3.308,10.098 7.943,10.098 v 0 c 3.534,0 5.906,-2.314 6.787,-5.133 v 0 c 0.223,-0.66 0.276,-1.377 0.276,-2.206 v 0 -4.802 c 0,-0.825 -0.11,-1.766 -0.385,-2.592 v 0 c -1.051,-3.088 -3.75,-4.963 -6.734,-4.963 v 0 c -5.241,0 -7.887,4.354 -7.887,9.598 m -29.133,8.884 h -0.109 l -0.278,4.415 h -4.302 c 0.166,-2.208 0.221,-4.471 0.221,-7.23 v 0 -19.477 h 4.855 v 16.058 c 0,0.826 0.109,1.655 0.329,2.263 v 0 c 0.829,2.703 3.313,4.965 6.511,4.965 v 0 c 4.582,0 6.183,-3.588 6.183,-7.892 v 0 -15.394 h 4.856 v 15.949 c 0,9.156 -5.741,11.362 -9.436,11.362 v 0 c -4.414,0 -7.506,-2.479 -8.83,-5.019 m -92.963,-0.167 h -0.113 l -0.217,4.582 h -4.361 c 0.109,-2.538 0.22,-5.297 0.22,-8.717 v 0 -28.915 h 4.803 v 14.514 h 0.109 c 1.599,-2.65 4.69,-4.196 8.224,-4.196 v 0 c 6.289,0 12.136,4.747 12.136,14.344 v 0 c 0,8.114 -4.855,13.574 -11.308,13.574 v 0 c -4.362,0 -7.506,-1.929 -9.493,-5.186 m 0.551,-13.24 c -0.11,0.603 -0.219,1.268 -0.219,1.986 v 0 4.58 c 0,0.662 0.164,1.377 0.331,1.986 v 0 c 0.935,3.642 4.026,6.013 7.339,6.013 v 0 c 5.127,0 7.944,-4.578 7.944,-9.931 v 0 c 0,-6.125 -2.981,-10.319 -8.109,-10.319 v 0 c -3.479,0 -6.403,2.319 -7.286,5.685 m -27.584,16.55 c -1.103,-0.825 -2.15,-1.985 -2.981,-3.473 v 0 h -0.11 c -1.157,3.143 -3.915,5.349 -7.56,5.349 v 0 c -4.411,0 -6.895,-2.369 -8.388,-4.908 v 0 h -0.164 l -0.219,4.304 h -4.25 c 0.166,-2.208 0.221,-4.471 0.221,-7.23 v 0 -19.477 h 4.744 v 16.113 c 0,0.829 0.109,1.657 0.388,2.371 v 0 c 0.773,2.427 2.979,4.856 6.016,4.856 v 0 c 3.694,0 5.571,-3.09 5.571,-7.336 v 0 -16.004 h 4.744 v 16.498 c 0,0.884 0.17,1.767 0.387,2.427 v 0 c 0.825,2.375 2.978,4.415 5.737,4.415 v 0 c 3.919,0 5.797,-3.09 5.797,-8.219 v 0 -15.121 h 4.747 v 15.727 c 0,9.269 -5.244,11.584 -8.778,11.584 v 0 c -2.535,0 -4.303,-0.66 -5.902,-1.876 m -55.674,-12.302 c 0,-8.442 5.576,-13.74 12.805,-13.74 v 0 c 6.453,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.19,13.739 -12.856,13.739 v 0 c -7.394,0 -13.246,-5.24 -13.246,-14.178 m 4.914,0.164 c 0,5.076 2.479,10.373 8.221,10.373 v 0 c 5.738,0 8,-5.737 8,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.109,-10.373 v 0 c -4.744,0 -8.112,4.413 -8.112,10.262 m -132.799,-0.164 c 0,-8.442 5.57,-13.74 12.799,-13.74 v 0 c 6.457,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.183,13.739 -12.856,13.739 v 0 c -7.394,0 -13.24,-5.24 -13.24,-14.178 m 4.909,0.164 c 0,5.076 2.482,10.373 8.222,10.373 v 0 c 5.739,0 8,-5.737 8,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.111,-10.373 v 0 c -4.744,0 -8.111,4.413 -8.111,10.262 m -81.985,-0.387 c 0,-8.055 4.908,-13.462 13.132,-13.462 v 0 c 4.248,0 7.172,0.884 8.885,1.657 v 0 l -0.831,3.477 c -1.819,-0.772 -3.915,-1.382 -7.392,-1.382 v 0 c -4.857,0 -9.048,2.705 -9.159,9.269 v 0 h 18.759 c 0.058,0.497 0.167,1.268 0.167,2.263 v 0 c 0,4.913 -2.317,12.579 -11.035,12.579 v 0 c -7.78,0 -12.526,-6.34 -12.526,-14.401 m 12.138,10.929 c 5.465,0 6.787,-4.803 6.732,-7.89 v 0 h -14.182 c 0.388,3.365 2.539,7.89 7.45,7.89 m -47.668,-2.374 h -0.222 l -0.167,5.242 h -4.246 c 0.163,-2.485 0.221,-5.185 0.221,-8.334 v 0 -18.373 h 4.797 v 14.234 c 0,0.83 0.111,1.602 0.223,2.264 v 0 c 0.66,3.641 3.089,6.235 6.514,6.235 v 0 c 0.659,0 1.157,-0.056 1.653,-0.166 v 0 4.58 c -0.442,0.111 -0.829,0.164 -1.379,0.164 v 0 c -3.258,0 -6.18,-2.26 -7.394,-5.846 m -67.036,-8.332 c 0,-8.442 5.572,-13.74 12.802,-13.74 v 0 c 6.454,0 13.298,4.305 13.298,14.179 v 0 c 0,8.168 -5.19,13.739 -12.856,13.739 v 0 c -7.396,0 -13.244,-5.24 -13.244,-14.178 m 4.91,0.164 c 0,5.076 2.482,10.373 8.223,10.373 v 0 c 5.738,0 7.998,-5.737 7.998,-10.262 v 0 c 0,-6.014 -3.473,-10.373 -8.108,-10.373 v 0 c -4.745,0 -8.113,4.413 -8.113,10.262 m -25.931,6.18 c 0,-3.2 2.261,-5.846 7.062,-7.56 v 0 c 3.59,-1.324 4.967,-2.591 4.967,-4.909 v 0 c 0,-2.205 -1.656,-3.973 -5.187,-3.973 v 0 c -2.428,0 -4.966,0.993 -6.399,1.931 v 0 l -1.215,-3.694 c 1.875,-1.104 4.578,-1.824 7.502,-1.824 v 0 c 6.348,0 9.99,3.31 9.99,8 v 0 c 0,3.972 -2.375,6.289 -7.009,8.058 v 0 c -3.476,1.322 -5.075,2.314 -5.075,4.524 v 0 c 0,1.986 1.599,3.64 4.469,3.64 v 0 c 2.482,0 4.415,-0.883 5.461,-1.545 v 0 l 1.215,3.532 c -1.489,0.882 -3.864,1.654 -6.565,1.654 v 0 c -5.742,0 -9.216,-3.53 -9.216,-7.834 m -36.745,2.815 h -0.11 l -0.274,4.415 h -4.303 c 0.164,-2.208 0.22,-4.471 0.22,-7.23 v 0 -19.477 h 4.854 v 16.058 c 0,0.826 0.113,1.655 0.332,2.263 v 0 c 0.826,2.703 3.31,4.965 6.512,4.965 v 0 c 4.58,0 6.177,-3.588 6.177,-7.892 v 0 -15.394 h 4.856 v 15.949 c 0,9.156 -5.739,11.362 -9.431,11.362 v 0 c -4.418,0 -7.508,-2.479 -8.833,-5.019 m -34.039,-9.382 c 0,-8.055 4.91,-13.462 13.131,-13.462 v 0 c 4.249,0 7.172,0.884 8.883,1.657 v 0 l -0.829,3.477 c -1.819,-0.772 -3.916,-1.382 -7.394,-1.382 v 0 c -4.853,0 -9.047,2.705 -9.157,9.269 v 0 h 18.763 c 0.053,0.497 0.162,1.268 0.162,2.263 v 0 c 0,4.913 -2.317,12.579 -11.034,12.579 v 0 c -7.781,0 -12.525,-6.34 -12.525,-14.401 m 12.138,10.929 c 5.463,0 6.788,-4.803 6.732,-7.89 v 0 h -14.183 c 0.389,3.365 2.538,7.89 7.451,7.89 m -37.13,-1.714 h -0.111 l -0.219,4.582 h -4.362 c 0.111,-2.538 0.221,-5.297 0.221,-8.717 v 0 -28.915 h 4.801 v 14.514 h 0.111 c 1.599,-2.65 4.688,-4.196 8.219,-4.196 v 0 c 6.294,0 12.141,4.747 12.141,14.344 v 0 c 0,8.114 -4.854,13.574 -11.31,13.574 v 0 c -4.362,0 -7.503,-1.929 -9.491,-5.186 m 0.552,-13.24 c -0.111,0.603 -0.222,1.268 -0.222,1.986 v 0 4.58 c 0,0.662 0.165,1.377 0.331,1.986 v 0 c 0.937,3.642 4.027,6.013 7.337,6.013 v 0 c 5.133,0 7.949,-4.578 7.949,-9.931 v 0 c 0,-6.125 -2.98,-10.319 -8.113,-10.319 v 0 c -3.477,0 -6.399,2.319 -7.282,5.685 m -37.243,4.248 c 0,-8.442 5.575,-13.74 12.801,-13.74 v 0 c 6.455,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.187,13.739 -12.854,13.739 v 0 c -7.397,0 -13.244,-5.24 -13.244,-14.178 m 4.912,0.164 c 0,5.076 2.481,10.373 8.223,10.373 v 0 c 5.737,0 7.997,-5.737 7.997,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.109,-10.373 v 0 c -4.747,0 -8.111,4.413 -8.111,10.262 m 431.72,-0.222 c 0,-8.162 5.243,-13.627 13.295,-13.627 v 0 c 3.59,0 6.401,0.884 7.672,1.546 v 0 l -0.83,3.643 c -1.377,-0.609 -3.199,-1.327 -5.959,-1.327 v 0 c -5.295,0 -9.267,3.807 -9.267,9.987 v 0 c 0,5.575 3.31,10.098 9.433,10.098 v 0 c 2.651,0 4.469,-0.608 5.631,-1.27 v 0 l 1.103,3.752 c -1.325,0.662 -3.863,1.381 -6.734,1.381 v 0 c -8.721,0 -14.344,-5.958 -14.344,-14.183 m -141.24,0 c 0,-8.162 5.238,-13.627 13.297,-13.627 v 0 c 3.586,0 6.4,0.884 7.668,1.546 v 0 l -0.826,3.643 c -1.381,-0.609 -3.2,-1.327 -5.961,-1.327 v 0 c -5.293,0 -9.271,3.807 -9.271,9.987 v 0 c 0,5.575 3.316,10.098 9.437,10.098 v 0 c 2.649,0 4.471,-0.608 5.628,-1.27 v 0 l 1.106,3.752 c -1.328,0.662 -3.867,1.381 -6.734,1.381 v 0 c -8.717,0 -14.344,-5.958 -14.344,-14.183 m -63.723,0 c 0,-8.162 5.239,-13.627 13.297,-13.627 v 0 c 3.584,0 6.401,0.884 7.668,1.546 v 0 l -0.827,3.643 c -1.379,-0.609 -3.199,-1.327 -5.958,-1.327 v 0 c -5.299,0 -9.272,3.807 -9.272,9.987 v 0 c 0,5.575 3.311,10.098 9.436,10.098 v 0 c 2.649,0 4.471,-0.608 5.627,-1.27 v 0 l 1.106,3.752 c -1.326,0.662 -3.865,1.381 -6.733,1.381 v 0 c -8.716,0 -14.344,-5.958 -14.344,-14.183 m 387.637,-13.075 h 4.854 v 26.707 h -4.854 z m -31.168,26.707 v -16.389 c 0,-0.882 -0.168,-1.765 -0.441,-2.485 v 0 c -0.883,-2.148 -3.144,-4.411 -6.402,-4.411 v 0 c -4.417,0 -5.961,3.419 -5.961,8.495 v 0 14.79 h -4.856 v -15.615 c 0,-9.38 5.023,-11.699 9.217,-11.699 v 0 c 4.744,0 7.56,2.815 8.826,4.967 v 0 h 0.111 l 0.276,-4.36 h 4.304 c -0.165,2.096 -0.22,4.523 -0.22,7.281 v 0 19.426 z m -205.297,0 v -16.389 c 0,-0.882 -0.166,-1.765 -0.441,-2.485 v 0 c -0.883,-2.148 -3.148,-4.411 -6.404,-4.411 v 0 c -4.414,0 -5.956,3.419 -5.956,8.495 v 0 14.79 h -4.857 v -15.615 c 0,-9.38 5.022,-11.699 9.215,-11.699 v 0 c 4.744,0 7.563,2.815 8.828,4.967 v 0 h 0.109 l 0.282,-4.36 h 4.301 c -0.168,2.096 -0.219,4.523 -0.219,7.281 v 0 19.426 z m -179.642,0 v -16.389 c 0,-0.882 -0.165,-1.765 -0.442,-2.485 v 0 c -0.883,-2.148 -3.144,-4.411 -6.398,-4.411 v 0 c -4.416,0 -5.959,3.419 -5.959,8.495 v 0 14.79 h -4.854 v -15.615 c 0,-9.38 5.017,-11.699 9.211,-11.699 v 0 c 4.749,0 7.56,2.815 8.829,4.967 v 0 h 0.111 l 0.275,-4.36 h 4.303 c -0.165,2.096 -0.22,4.523 -0.22,7.281 v 0 19.426 z" /></clipPath><clipPath
+       id="clipPath104"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path102"
+         d="m 892.093,1318.587 h 744.665 v 1.564 H 892.093 Z" /></clipPath><clipPath
+       id="clipPath122"
+       clipPathUnits="userSpaceOnUse"><path
+         id="path120"
+         d="M 0,2000 H 2000 V 0 H 0 Z" /></clipPath></defs><g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 2"
+     style="display:inline"><path
+       style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:21;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
+       d="M 74.644451,333.81717 C 49.698347,322.45232 37.89043,305.98469 37.89043,282.55906 c 0,-23.39691 7.977608,-37.44115 26.795419,-47.17222 14.940601,-7.72609 51.524811,-8.91366 55.912041,-1.81499 2.13409,3.45303 4.37116,3.47 7.78213,0.059 5.41915,-5.41914 -12.124,-27.19361 -21.90923,-27.19361 -16.197294,0 -7.273924,-29.50548 15.35848,-50.78343 18.73596,-17.6147 51.631,-21.18268 73.07972,-7.92664 31.16098,19.25854 45.20833,67.48547 24.47251,84.01829 -16.44689,13.11323 -25.47165,29.10995 -25.47165,45.14944 0,19.37926 9.39884,16.85175 14.48552,-3.8954 9.82256,-40.06356 59.31622,-47.91776 86.9271,-13.79456 8.67269,10.71824 7.07534,47.01718 -2.4483,55.63595 -13.41156,12.1373 -66.43385,21.22792 -136.85475,23.46362 -53.06689,1.68476 -69.859697,0.75873 -81.374969,-4.48736 z"
+       id="path97"
+       inkscape:connector-curvature="0" /></g><g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Layer 1"
+     style="display:inline"
+     sodipodi:insensitive="true"><g
+       transform="matrix(1.3333333,0,0,-1.3333333,-309.27816,2052.7205)"
+       id="g10"><g
+   transform="translate(-317.59883,17.977292)"
+   id="g12"><g
+     clip-path="url(#clipPath18)"
+     id="g14"><g
+       transform="translate(580.6621,1256.1953)"
+       id="g20"><path
+         id="path22"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 9.63,-7.223 31.054,-5.803 0,0 3.756,0.065 6.57,4.261 0,0 2.303,5.23 -7.628,2.955 0,0 -12.195,-1.746 -23.595,4.163 0,0 -23.961,13.35 -27.992,33.429 0,0 -7.314,19.798 4.423,40.527 0,0 7.256,12.282 15.439,17.959 0,0 13.64,12.94 33.83,9.306 0,0 9.942,-0.793 29.76,-16.845 0,0 6.359,-1.79 4.877,3.766 0,0 -5.246,13.335 -26.608,18.151 0,0 -0.555,17.718 8.149,25.435 0,0 14.879,28.153 47.352,25.066 0,0 29.265,0.679 45.131,-37.166 0,0 5.062,-16.916 1.543,-30.251 l 20.744,3.704 -19.818,39.821 c 0,0 -12.409,25.342 -45.007,31.007 0,0 -29.448,6.776 -54.266,-24.154 0,0 -10.743,-18.336 -11.484,-31.487 0,0 -36.302,9.261 -58.712,-34.449 0,0 -21.608,-49.329 26.238,-79.395"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(769.1968,1270.9512)"
+       id="g24"><path
+         id="path26"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 40.635,35.561 2.852,71.862 0,0 2.075,10.187 -2.852,13.706 0,0 -1.964,5.001 -15.484,-1.482 0,0 -11.299,-3.704 -21.115,5.001 l -11.668,-9.446 c 0,0 -15.743,-7.038 -23.151,-24.263 0,0 -5.001,-15.557 0,-21.484 0,0 3.704,-1.852 5.927,2.593 0,0 -1.853,15.557 10.927,29.819 0,0 28.418,22.814 56.77,-7.746 0,0 16.982,-24.851 -2.206,-47.818 0,0 -10.484,-9.075 -9.372,-10.742 0,0 3.001,-2.778 9.372,0"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(669.2554,1426.3086)"
+       id="g28"><path
+         id="path30"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -0.249,14.112 4.075,26.088 0,0 2.24,6.106 10.125,18.028 1.244,1.881 5.186,6.914 6.421,11.483 0,0 6.668,20.99 -17.225,24.319 0,0 -7.613,1.355 -12.593,-2.648 -3.15,-2.532 -6.113,-4.014 -8.398,-4.631 0,0 -11.298,-3.889 -10.927,3.334 0,0 -2.038,10.742 23.522,13.705 0,0 31.271,5.371 34.897,-19.447 0,0 5.108,-15.188 -13.413,-37.969 0,0 -10.187,-15.774 -7.779,-32.89 2.408,-17.117 0,-0.818 0,-0.818 l -3.148,-2.037 -6.112,2.855"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(721.856,1393.8394)"
+       id="g32"><path
+         id="path34"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 16.616,4.073 19.333,17.902 l -23.708,1.604 c 0,0 -6.419,2.254 -9.877,13.166 0,0 -14.323,7.702 -13.335,18.815 0,0 2.222,13.829 14.076,15.805 0,0 12.364,3.056 14.879,-16.7 0,0 5.817,-16.732 -5.519,-17.92 0,0 -2.446,-5.386 6.444,-5.633 0,0 10.838,-3.211 18.507,3.21 0,0 5.2,4.785 11.375,3.875 0,0 1.326,2.361 -1.266,3.842 0,0 -15.373,13.15 -18.058,31.764 0,0 -12.688,1.76 -14.262,10.743 0,0 -2.964,13.891 8.52,16.669 0,0 7.316,1.667 11.02,0 0,0 9.353,25.467 36.024,29.819 0,0 22.04,5.185 29.912,-11.483 0,0 3.241,-9.076 1.481,-16.669 0,0 -1.852,-8.335 0.093,-10.465 0,0 7.131,1.667 10.094,-2.963 2.963,-4.631 4.26,-14.539 -1.667,-16.855 0,0 1.76,-7.871 -4.167,-13.242 0,0 -18.799,-10.928 -24.17,-20.188 0,0 -1.656,-2.115 -2.5,-2.856 -2.034,-1.784 -4.739,-3.312 -7.224,-3.966 0,0 -2.233,-0.968 -4.723,0.247 0,0 -0.741,-3.705 3.426,-4.353 0,0 7.918,1.097 16.531,3.736 l 62.278,22.271 c 0,0 -2.895,7.78 -0.58,11.576 0,0 1.281,2.018 2.447,2.461 2.159,0.822 4.738,4.932 4.846,8.142 0,0 -0.602,8.119 5.233,8.489 0,0 5.586,0.34 5.123,-6.513 l -0.4,-4.507 c 0,0 8.543,3.241 11.402,-2.593 0,0 5.774,-11.708 -0.349,-21.153 0,0 -9.009,-8.881 -20.87,-3.295 l -4.074,2.501 c 0,0 -72.419,-29.974 -73.252,-31.95 0,0 -5.688,-2.869 -9.909,-10.557 0,0 -14.539,-25.93 -22.04,-32.782 0,0 -4.908,-5.927 -8.427,-7.409 l 1.389,-3.704 H 8.22 l -1.852,11.923 -2.315,23.36 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(788.5322,1499.6885)"
+       id="g36"><path
+         id="path38"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 9.816,6.112 13.521,-0.556 0,0 -1.112,-9.075 -0.556,-16.484 0,0 1.111,-8.705 8.149,-13.706 0,0 6.668,-7.408 0,-14.075 0,0 -20.002,-14.077 -23.707,-22.596 0,0 -8.89,-12.595 -23.337,-2.964 0,0 -18.891,11.483 -15.558,28.152 0,0 2.223,3.334 7.038,4.446 0,0 -11.853,19.262 -1.111,32.968 0,0 17.41,22.225 35.561,4.815"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(736.4878,1483.019)"
+       id="g40"><path
+         id="path42"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -3.982,-5.834 -4.167,-14.539 0,0 -6.112,0.926 -6.668,6.76 0,0 -1.574,8.427 5.927,9.817 0,0 3.797,0.926 4.908,-2.038"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(805.7573,1476.4443)"
+       id="g44"><path
+         id="path46"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 4.074,2.778 6.853,0 0,0 4.147,-4.047 1.759,-7.501 0,0 -1.759,-1.019 -2.871,0 0,0 -2.338,2.892 -4.815,4.537 0,0 -1.759,1.205 -0.926,2.964"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(719.4482,1443.7544)"
+       id="g48"><path
+         id="path50"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -1.852,9.446 -8.026,12.039 0,0 -4.445,1.172 -7.779,-2.655 0,0 -6.112,-6.236 -4.074,-13.829 0,0 3.519,-8.336 12.841,-10.064 0,0 5.248,-1.605 8.273,6.36 0,0 0.761,2.479 -1.235,8.149"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(727.7827,1385.103)"
+       id="g52"><path
+         id="path54"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 12.055,4.899 26.917,22.966 0,0 4.074,5.681 9.755,4.199 0,0 8.274,-1.975 2.963,-15.187 0,0 -10.371,-32.722 -35.066,-36.055 0,0 0,17.163 -4.569,24.077"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(635.6704,1351.6421)"
+       id="g56"><path
+         id="path58"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -43.462,8.149 -58.773,-28.152 0,0 -13.089,-43.217 40.252,-57.045 0,0 38.277,-6.174 85.939,1.481 0,0 55.415,7.161 66.108,15.311 0,0 -4.864,-18.522 -56.477,-26.671 0,0 -75.32,-10.866 -100.756,-5.927 0,0 3.704,-0.493 6.914,4.939 0,0 1.236,3.951 -9.877,1.729 0,0 -25.188,-2.717 -42.476,22.225 0,0 -28.398,38.361 11.113,72.892 0,0 23.708,26.136 58.033,-0.782"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(774.2251,1475.8418)"
+       id="g60"><path
+         id="path62"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -0.51,5.094 -7.501,5.51 0,0 -6.622,1.297 -8.243,-5.047 0,0 0.602,-2.5 3.381,-0.787 0,0 -0.009,3.725 5,3.936 0,0 4.769,-0.875 5.279,-4.535 0,0 1.945,-0.744 2.084,0.923"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(784.8511,1475.0781)"
+       id="g64"><path
+         id="path66"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 0.371,5.186 4.677,6.159 0,0 6.251,2.013 8.983,-3.589 0,0 0.972,-2.27 0.092,-2.895 0,0 -1.956,-0.717 -2.546,2.686 0,0 -1.575,3.079 -4.7,2.431 0,0 -2.778,-0.301 -3.473,-3.217 C 3.033,1.575 2.895,-1.504 0,0"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(761.3672,1457.7686)"
+       id="g68"><path
+         id="path70"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 1.418,0.874 3.46,0.125 4.756,-0.666 1.408,-0.859 2.941,-1.667 4.432,-2.374 2.923,-1.383 5.96,-2.278 9.27,-2.27 1.718,0.005 3.547,-0.174 5.233,0.063 1.407,0.199 2.852,0.354 4.257,0.497 1.707,0.172 3.483,0.529 5.035,1.34 0.777,0.407 1.556,0.73 2.306,1.188 0.698,0.429 1.344,0.996 2.018,1.419 0.311,0.196 1.15,0.817 1.525,0.749 0.5,-0.092 0.974,-1.441 0.843,-1.912 C 38.728,-2.247 37.82,-3 36.914,-3.439 c -1.258,-0.609 -2.431,-1.435 -3.579,-2.226 -1.627,-1.123 -3.529,-2.704 -4.564,-4.398 -2.423,-3.972 -5.177,-8.017 -9.198,-10.495 -2.113,-1.301 -4.482,-1.669 -6.932,-1.668 -2.327,10e-4 -5.273,0.425 -7.276,1.677 -1.948,1.216 -3.455,2.752 -4.072,4.991 -0.61,2.218 0.003,4.442 0.003,6.695 0,1.757 0.469,4.361 -0.368,5.901 -0.286,0.53 -0.394,0.373 -0.869,0.783 -0.364,0.316 -0.549,0.913 -0.375,1.592 C -0.287,-0.47 -0.12,0.01 0,0"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(779.457,1464.9844)"
+       id="g72"><path
+         id="path74"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-1.036 -0.881,-1.875 -1.968,-1.875 -1.087,0 -1.968,0.839 -1.968,1.875 0,1.036 0.881,1.875 1.968,1.875 C -0.881,1.875 0,1.036 0,0"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(787.5132,1465.3081)"
+       id="g76"><path
+         id="path78"
+         style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-1.036 -0.881,-1.875 -1.967,-1.875 -1.087,0 -1.968,0.839 -1.968,1.875 0,1.036 0.881,1.875 1.968,1.875 C -0.881,1.875 0,1.036 0,0"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(857.1938,1448.3535)"
+       id="g80"><path
+         id="path82"
+         style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,0 -2.887,5.018 0.984,8.986 0,0 5.068,1.737 5.206,5.665 0,0 -1.398,6.182 1.491,8.342 0,0 4.789,3.286 5.406,-2.412 0,0 1.044,-5.282 -0.676,-8.613 0,0 7.063,1.813 10.257,0 3.196,-1.814 4.302,-11.503 1.415,-16.522 0,0 -3.44,-6.009 -13.086,-5.601 0,0 -8.601,-0.35 -8.786,5.895 0,0 -0.829,2.665 -2.211,4.26"
+         inkscape:connector-curvature="0" /></g></g></g><g
+   transform="translate(-317.59883,17.977292)"
+   id="g84"><g
+     clip-path="url(#clipPath90)"
+     id="g86"><g
+       id="g92"><g
+         transform="matrix(1008.8768,0,0,756.6576,710.18262,943.2384)"
+         id="g94"><image
+           id="image96"
+           xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAABHNCSVQICAgIfAhkiAAACP9JREFUeJzt2MGNQjEQBUEbkSdaAgMRqbnvEST8oasieNJcWjPHGGsAAJBx2j0AAIDPEoAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBizrsH8J611u4JAHA4c87dEw7NBxAAIMYH8AfdHvfdEwDgo66Xv90TvooPIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxc4yxdo/gdWs5HwD8N+fcPeHQfAABAGJ8AAEAYnwAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAICYJ3DqD79QHb+PAAAAAElFTkSuQmCC"
+           transform="matrix(1,0,0,-1,0,1)"
+           preserveAspectRatio="none"
+           style="image-rendering:optimizeSpeed"
+           height="1"
+           width="1" /></g></g></g></g><g
+   transform="translate(-317.59883,17.977292)"
+   id="g98"><g
+     clip-path="url(#clipPath104)"
+     id="g100"><g
+       id="g106"><g
+         transform="matrix(1014.016,0,0,750.59521,706.7168,947.9795)"
+         id="g108"><image
+           id="image110"
+           xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAABHNCSVQICAgIfAhkiAAACOVJREFUeJzt2LENg1AUBMGH5ZIRRSD3DB0gOeEHO1PBhavbZuYaAAAyPqsHAADwLgEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACDmu3oAz87fuXoCAPCnYz9WT3jkAQQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYraZuVaPAADgPR5AAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAg5gbWAAi/xKrGrgAAAABJRU5ErkJggg=="
+           transform="matrix(1,0,0,-1,0,1)"
+           preserveAspectRatio="none"
+           style="image-rendering:optimizeSpeed"
+           height="1"
+           width="1" /></g></g></g></g><text
+   y="-1409.2434"
+   x="1326.4393"
+   id="text114"
+   style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.74979973px;font-family:'Avenir LT Std 55 Roman';-inkscape-font-specification:AvenirLTStd-Heavy;writing-mode:lr-tb;fill:#808181;fill-opacity:1;fill-rule:nonzero;stroke:none"
+   transform="scale(1,-1)"><tspan
+     id="tspan112"
+     y="-1409.2434"
+     x="1326.4393 1333.7577">TM</tspan></text>
+
+<g
+   transform="translate(-317.59883,17.977292)"
+   id="g116"><g
+     clip-path="url(#clipPath122)"
+     id="g118"><g
+       transform="translate(833.8633,1358.5918)"
+       id="g124"><path
+         id="path126"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.736,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.122,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.781,-3.2 2.348,-4.083 1.564,-0.885 3.197,-1.327 4.899,-1.327 1.496,0 2.943,0.204 4.339,0.612 1.393,0.409 2.636,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.787,-5.716 -2.825,-1.157 -5.803,-1.736 -8.932,-1.736 -2.314,0 -4.542,0.324 -6.686,0.97 -2.143,0.646 -4.032,1.616 -5.665,2.909 -1.633,1.292 -2.926,2.892 -3.878,4.797 -0.954,1.905 -1.43,4.117 -1.43,6.635 0,2.859 0.527,5.273 1.583,7.248 1.054,1.972 2.483,3.606 4.286,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.712,1.241 7.196,1.582 2.483,0.34 4.967,0.544 7.452,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.908,6.482 -1.94,1.597 -4.237,2.398 -6.89,2.398 -2.519,0 -4.815,-0.528 -6.891,-1.582 -2.076,-1.055 -3.929,-2.501 -5.563,-4.338 l -8.165,8.37 c 2.858,2.654 6.191,4.644 10.003,5.971 3.81,1.327 7.758,1.991 11.841,1.991 4.491,0 8.181,-0.562 11.074,-1.684 2.892,-1.123 5.206,-2.774 6.941,-4.951 1.736,-2.179 2.943,-4.849 3.624,-8.013 C 17.521,11.279 17.863,7.62 17.863,3.47 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(875.8135,1361.6538)"
+       id="g128"><path
+         id="path130"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-3.743 1.072,-6.772 3.215,-9.084 2.144,-2.314 5.155,-3.471 9.034,-3.471 3.879,0 6.89,1.157 9.033,3.471 2.144,2.312 3.216,5.341 3.216,9.084 0,3.742 -1.072,6.771 -3.216,9.084 -2.143,2.313 -5.154,3.471 -9.033,3.471 -3.879,0 -6.89,-1.158 -9.034,-3.471 C 1.072,6.771 0,3.742 0,0 M -14.086,24.804 H 0 v -6.533 h 0.204 c 0.613,0.884 1.412,1.787 2.399,2.705 0.986,0.919 2.144,1.751 3.471,2.501 1.326,0.748 2.772,1.36 4.338,1.837 1.564,0.476 3.231,0.715 5.001,0.715 3.675,0 7.008,-0.63 10.004,-1.889 2.993,-1.26 5.562,-3.028 7.706,-5.307 2.144,-2.281 3.793,-4.986 4.95,-8.115 1.157,-3.131 1.736,-6.568 1.736,-10.31 0,-3.47 -0.528,-6.787 -1.582,-9.952 -1.056,-3.164 -2.552,-5.971 -4.492,-8.421 -1.939,-2.45 -4.304,-4.407 -7.094,-5.869 -2.791,-1.462 -5.955,-2.195 -9.493,-2.195 -3.199,0 -6.175,0.495 -8.931,1.481 -2.756,0.985 -5.019,2.669 -6.788,5.052 H 1.225 v -28.58 h -15.311 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(950.939,1358.5918)"
+       id="g132"><path
+         id="path134"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.736,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.122,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.781,-3.2 2.348,-4.083 1.564,-0.885 3.197,-1.327 4.899,-1.327 1.496,0 2.943,0.204 4.339,0.612 1.393,0.409 2.636,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.787,-5.716 -2.825,-1.157 -5.803,-1.736 -8.932,-1.736 -2.314,0 -4.542,0.324 -6.686,0.97 -2.143,0.646 -4.032,1.616 -5.665,2.909 -1.633,1.292 -2.926,2.892 -3.878,4.797 -0.954,1.905 -1.43,4.117 -1.43,6.635 0,2.859 0.527,5.273 1.583,7.248 1.054,1.972 2.483,3.606 4.286,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.712,1.241 7.196,1.582 2.483,0.34 4.967,0.544 7.452,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.908,6.482 -1.94,1.597 -4.237,2.398 -6.89,2.398 -2.519,0 -4.815,-0.528 -6.891,-1.582 -2.076,-1.055 -3.929,-2.501 -5.563,-4.338 l -8.165,8.37 c 2.858,2.654 6.191,4.644 10.003,5.971 3.81,1.327 7.758,1.991 11.841,1.991 4.491,0 8.181,-0.562 11.074,-1.684 2.892,-1.123 5.206,-2.774 6.941,-4.951 1.736,-2.179 2.944,-4.849 3.623,-8.013 0.68,-3.164 1.022,-6.823 1.022,-10.973 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1010.9561,1370.4321)"
+       id="g136"><path
+         id="path138"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.361,0.714 -2.824,1.072 -4.389,1.072 -3.879,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.072,-6.772 3.216,-9.085 2.143,-2.314 5.154,-3.47 9.033,-3.47 1.699,0 3.164,0.373 4.389,1.123 1.225,0.748 2.279,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.189,-4.169 -8.42,-5.155 -3.234,-0.986 -6.313,-1.48 -9.238,-1.48 -3.812,0 -7.4,0.613 -10.769,1.837 -3.368,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.429,3.198 -2.144,6.77 -2.144,10.718 0,3.945 0.715,7.518 2.144,10.717 1.428,3.198 3.384,5.936 5.869,8.217 2.483,2.28 5.41,4.032 8.778,5.257 3.369,1.225 6.957,1.837 10.769,1.837 2.925,0 6.004,-0.494 9.238,-1.479 3.231,-0.988 6.038,-2.706 8.42,-5.155 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1040.8633,1414.0176)"
+       id="g140"><path
+         id="path142"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 v -34.297 h 0.204 c 0.34,0.952 0.919,1.904 1.735,2.859 0.818,0.952 1.802,1.801 2.96,2.551 1.157,0.748 2.518,1.361 4.083,1.837 1.566,0.476 3.267,0.715 5.105,0.715 3.878,0 7.008,-0.597 9.391,-1.786 2.38,-1.191 4.235,-2.842 5.562,-4.951 1.326,-2.11 2.229,-4.593 2.705,-7.451 0.475,-2.858 0.715,-5.956 0.715,-9.289 V -77.167 H 17.148 v 24.293 c 0,1.429 -0.051,2.909 -0.153,4.44 -0.101,1.531 -0.408,2.943 -0.918,4.236 -0.511,1.292 -1.294,2.348 -2.348,3.164 -1.056,0.817 -2.57,1.225 -4.542,1.225 -1.975,0 -3.573,-0.357 -4.797,-1.071 C 3.165,-41.595 2.228,-42.549 1.583,-43.739 0.935,-44.93 0.511,-46.274 0.306,-47.771 0.103,-49.268 0,-50.833 0,-52.466 V -77.167 H -15.312 V 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1117.1104,1367.2681)"
+       id="g144"><path
+         id="path146"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0.067,2.585 -0.783,4.797 -2.551,6.635 -1.771,1.837 -4.051,2.756 -6.84,2.756 -1.701,0 -3.199,-0.273 -4.491,-0.817 C -15.176,8.028 -16.28,7.332 -17.199,6.481 -18.117,5.63 -18.832,4.644 -19.342,3.521 -19.854,2.398 -20.143,1.225 -20.21,0 Z m 12.963,-21.844 c -2.449,-3.131 -5.547,-5.547 -9.288,-7.247 -3.743,-1.7 -7.622,-2.552 -11.636,-2.552 -3.812,0 -7.4,0.613 -10.769,1.837 -3.369,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.43,3.198 -2.144,6.77 -2.144,10.718 0,3.946 0.714,7.518 2.144,10.718 1.428,3.197 3.384,5.936 5.869,8.216 2.483,2.28 5.409,4.032 8.778,5.257 3.369,1.225 6.957,1.838 10.769,1.838 3.537,0 6.752,-0.613 9.646,-1.838 2.891,-1.225 5.34,-2.977 7.348,-5.257 2.007,-2.28 3.556,-5.019 4.645,-8.216 1.088,-3.2 1.634,-6.772 1.634,-10.718 v -4.798 H -20.21 c 0.612,-2.926 1.939,-5.256 3.981,-6.992 2.041,-1.735 4.558,-2.602 7.553,-2.602 2.517,0 4.645,0.561 6.379,1.684 1.736,1.122 3.25,2.568 4.543,4.338 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1174.2705,1370.4321)"
+       id="g148"><path
+         id="path150"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.361,0.714 -2.824,1.072 -4.389,1.072 -3.879,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.072,-6.772 3.216,-9.085 2.143,-2.314 5.154,-3.47 9.033,-3.47 1.699,0 3.164,0.373 4.389,1.123 1.225,0.748 2.279,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.189,-4.169 -8.42,-5.155 -3.234,-0.986 -6.313,-1.48 -9.238,-1.48 -3.812,0 -7.4,0.613 -10.769,1.837 -3.368,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.429,3.198 -2.144,6.77 -2.144,10.718 0,3.945 0.715,7.518 2.144,10.717 1.428,3.198 3.384,5.936 5.869,8.217 2.483,2.28 5.41,4.032 8.778,5.257 3.369,1.225 6.957,1.837 10.769,1.837 2.925,0 6.004,-0.494 9.238,-1.479 3.231,-0.988 6.038,-2.706 8.42,-5.155 z"
+         inkscape:connector-curvature="0" /></g><path
+       id="path152"
+       style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 1189.071,1414.018 h 15.311 v -77.167 h -15.311 z"
+       inkscape:connector-curvature="0" /><g
+       transform="translate(1227.8584,1361.6538)"
+       id="g154"><path
+         id="path156"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-3.743 1.071,-6.772 3.215,-9.084 2.143,-2.314 5.154,-3.471 9.033,-3.471 3.879,0 6.891,1.157 9.034,3.471 2.144,2.312 3.215,5.341 3.215,9.084 0,3.742 -1.071,6.771 -3.215,9.084 -2.143,2.313 -5.155,3.471 -9.034,3.471 -3.879,0 -6.89,-1.158 -9.033,-3.471 C 1.071,6.771 0,3.742 0,0 m -15.311,0 c 0,3.946 0.714,7.519 2.143,10.718 1.43,3.198 3.385,5.936 5.869,8.217 2.484,2.279 5.41,4.031 8.779,5.256 3.368,1.226 6.957,1.838 10.768,1.838 3.811,0 7.4,-0.612 10.77,-1.838 3.368,-1.225 6.293,-2.977 8.777,-5.256 2.484,-2.281 4.441,-5.019 5.869,-8.217 1.43,-3.199 2.145,-6.772 2.145,-10.718 0,-3.947 -0.715,-7.52 -2.145,-10.718 -1.428,-3.199 -3.385,-5.937 -5.869,-8.217 -2.484,-2.28 -5.409,-4.031 -8.777,-5.256 -3.37,-1.225 -6.959,-1.838 -10.77,-1.838 -3.811,0 -7.4,0.613 -10.768,1.838 -3.369,1.225 -6.295,2.976 -8.779,5.256 -2.484,2.28 -4.439,5.018 -5.869,8.217 -1.429,3.198 -2.143,6.771 -2.143,10.718"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1323.3965,1336.8501)"
+       id="g158"><path
+         id="path160"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h -14.698 v 6.737 h -0.204 c -0.545,-0.954 -1.243,-1.906 -2.093,-2.858 -0.852,-0.954 -1.888,-1.804 -3.113,-2.552 -1.225,-0.75 -2.621,-1.361 -4.185,-1.837 -1.566,-0.476 -3.267,-0.715 -5.103,-0.715 -3.879,0 -7.028,0.597 -9.443,1.787 -2.416,1.189 -4.287,2.84 -5.613,4.95 -1.327,2.109 -2.213,4.593 -2.654,7.451 -0.444,2.858 -0.665,5.954 -0.665,9.289 v 27.355 h 15.312 V 25.314 c 0,-1.429 0.051,-2.909 0.153,-4.44 0.102,-1.531 0.409,-2.944 0.919,-4.236 0.51,-1.294 1.292,-2.348 2.348,-3.164 1.054,-0.817 2.567,-1.225 4.542,-1.225 1.973,0 3.572,0.357 4.798,1.071 1.224,0.715 2.159,1.667 2.806,2.859 0.646,1.189 1.072,2.534 1.276,4.031 0.204,1.497 0.306,3.062 0.306,4.696 V 49.607 H 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1371.166,1361.6538)"
+       id="g162"><path
+         id="path164"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,3.742 -1.071,6.771 -3.215,9.084 -2.143,2.313 -5.155,3.471 -9.034,3.471 -3.878,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.313 -3.215,-5.342 -3.215,-9.084 0,-3.743 1.071,-6.772 3.215,-9.084 2.143,-2.314 5.155,-3.471 9.033,-3.471 3.879,0 6.891,1.157 9.034,3.471 C -1.071,-6.772 0,-3.743 0,0 M 14.086,-24.804 H 0 v 6.533 h -0.204 c -0.612,-0.885 -1.413,-1.786 -2.399,-2.705 -0.987,-0.919 -2.143,-1.753 -3.47,-2.501 -1.327,-0.75 -2.791,-1.36 -4.389,-1.837 -1.6,-0.476 -3.251,-0.715 -4.951,-0.715 -3.675,0 -7.01,0.631 -10.003,1.889 -2.995,1.258 -5.563,3.027 -7.706,5.307 -2.144,2.28 -3.795,4.984 -4.951,8.115 -1.157,3.13 -1.736,6.567 -1.736,10.31 0,3.471 0.527,6.787 1.582,9.952 1.055,3.164 2.552,5.971 4.492,8.421 1.939,2.45 4.303,4.405 7.094,5.869 2.789,1.463 5.954,2.195 9.493,2.195 3.198,0 6.175,-0.495 8.931,-1.48 2.756,-0.987 5.018,-2.672 6.788,-5.053 h 0.204 v 32.868 h 15.311 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1424.5498,1371.8613)"
+       id="g166"><path
+         id="path168"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -2.246,2.79 -5.206,4.185 -8.881,4.185 -1.293,0 -2.552,-0.307 -3.776,-0.919 -1.226,-0.612 -1.838,-1.668 -1.838,-3.164 0,-1.225 0.629,-2.128 1.889,-2.705 1.258,-0.579 2.858,-1.089 4.797,-1.531 1.939,-0.444 4.014,-0.919 6.226,-1.429 2.211,-0.511 4.287,-1.311 6.227,-2.399 1.939,-1.089 3.538,-2.569 4.797,-4.44 1.258,-1.872 1.889,-4.373 1.889,-7.502 0,-3.2 -0.699,-5.836 -2.093,-7.911 -1.395,-2.077 -3.181,-3.743 -5.359,-5.002 -2.179,-1.26 -4.628,-2.143 -7.349,-2.654 -2.722,-0.51 -5.41,-0.765 -8.064,-0.765 -3.47,0 -6.976,0.494 -10.513,1.48 -3.539,0.985 -6.533,2.738 -8.982,5.256 l 9.288,10.31 c 1.429,-1.77 3.012,-3.113 4.746,-4.032 1.735,-0.919 3.76,-1.378 6.074,-1.378 1.769,0 3.368,0.255 4.797,0.766 1.429,0.51 2.144,1.445 2.144,2.807 0,1.292 -0.63,2.261 -1.889,2.909 -1.26,0.646 -2.858,1.19 -4.797,1.633 -1.939,0.442 -4.016,0.919 -6.227,1.429 -2.211,0.511 -4.287,1.276 -6.226,2.297 -1.94,1.02 -3.539,2.466 -4.798,4.338 -1.26,1.871 -1.888,4.371 -1.888,7.502 0,2.925 0.595,5.443 1.786,7.554 1.19,2.108 2.756,3.844 4.696,5.205 1.939,1.361 4.168,2.364 6.685,3.012 2.517,0.646 5.069,0.969 7.656,0.969 3.266,0 6.566,-0.477 9.901,-1.429 3.334,-0.954 6.158,-2.654 8.473,-5.103 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1476.5049,1374.209)"
+       id="g170"><path
+         id="path172"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h -13.474 v -16.536 c 0,-1.362 0.067,-2.603 0.204,-3.726 0.136,-1.122 0.442,-2.092 0.919,-2.909 0.475,-0.816 1.207,-1.446 2.195,-1.888 0.985,-0.443 2.297,-0.664 3.929,-0.664 0.817,0 1.889,0.085 3.215,0.256 1.327,0.169 2.33,0.561 3.012,1.174 v -12.76 c -1.702,-0.612 -3.471,-1.02 -5.308,-1.224 -1.838,-0.205 -3.641,-0.307 -5.41,-0.307 -2.587,0 -4.968,0.273 -7.145,0.817 -2.179,0.544 -4.083,1.412 -5.716,2.602 -1.633,1.19 -2.909,2.739 -3.828,4.645 -0.918,1.904 -1.378,4.219 -1.378,6.941 V 0 h -9.799 v 12.249 h 9.799 v 14.698 h 15.311 V 12.249 H 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1510.5967,1358.5918)"
+       id="g174"><path
+         id="path176"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.735,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.123,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.782,-3.2 2.347,-4.083 1.566,-0.885 3.198,-1.327 4.901,-1.327 1.496,0 2.942,0.204 4.338,0.612 1.393,0.409 2.635,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.788,-5.716 -2.824,-1.157 -5.802,-1.736 -8.93,-1.736 -2.315,0 -4.543,0.324 -6.687,0.97 -2.144,0.646 -4.031,1.616 -5.665,2.909 -1.633,1.292 -2.927,2.892 -3.879,4.797 -0.953,1.905 -1.429,4.117 -1.429,6.635 0,2.859 0.527,5.273 1.582,7.248 1.055,1.972 2.484,3.606 4.287,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.711,1.241 7.197,1.582 2.483,0.34 4.965,0.544 7.451,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.909,6.482 -1.939,1.597 -4.235,2.398 -6.889,2.398 -2.519,0 -4.816,-0.528 -6.89,-1.582 -2.077,-1.055 -3.93,-2.501 -5.564,-4.338 l -8.166,8.37 c 2.859,2.654 6.192,4.644 10.004,5.971 3.81,1.327 7.757,1.991 11.84,1.991 4.491,0 8.182,-0.562 11.075,-1.684 2.892,-1.123 5.206,-2.774 6.942,-4.951 1.734,-2.179 2.942,-4.849 3.623,-8.013 0.679,-3.164 1.02,-6.823 1.02,-10.973 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1570.6143,1370.4321)"
+       id="g178"><path
+         id="path180"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.362,0.714 -2.825,1.072 -4.39,1.072 -3.879,0 -6.889,-1.158 -9.033,-3.471 -2.143,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.073,-6.772 3.216,-9.085 2.144,-2.314 5.154,-3.47 9.033,-3.47 1.7,0 3.164,0.373 4.39,1.123 1.225,0.748 2.278,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.19,-4.169 -8.421,-5.155 -3.233,-0.986 -6.313,-1.48 -9.238,-1.48 -3.811,0 -7.4,0.613 -10.768,1.837 -3.368,1.225 -6.295,2.976 -8.779,5.257 -2.485,2.279 -4.44,5.018 -5.869,8.217 -1.428,3.198 -2.143,6.77 -2.143,10.718 0,3.945 0.715,7.518 2.143,10.717 1.429,3.198 3.384,5.936 5.869,8.217 2.484,2.28 5.411,4.032 8.779,5.257 3.368,1.225 6.957,1.837 10.768,1.837 2.925,0 6.005,-0.494 9.238,-1.479 3.231,-0.988 6.039,-2.706 8.421,-5.155 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1585.2109,1414.0176)"
+       id="g182"><path
+         id="path184"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h 15.311 v -47.158 l 16.944,19.598 h 18.781 l -19.7,-22.354 20.211,-27.253 H 32.255 l -16.74,25.109 H 15.311 V -77.167 H 0 Z"
+         inkscape:connector-curvature="0" /></g></g></g></g></g></svg>
\ No newline at end of file
diff --git a/ui/images/bg-what-is-cloudstack.png b/ui/public/assets/bg-what-is-cloudstack.png
similarity index 100%
copy from ui/images/bg-what-is-cloudstack.png
copy to ui/public/assets/bg-what-is-cloudstack.png
Binary files differ
diff --git a/ui/public/assets/error.png b/ui/public/assets/error.png
new file mode 100644
index 0000000..25d6974
--- /dev/null
+++ b/ui/public/assets/error.png
Binary files differ
diff --git a/ui/public/assets/logo.svg b/ui/public/assets/logo.svg
new file mode 100644
index 0000000..ed6cb89
--- /dev/null
+++ b/ui/public/assets/logo.svg
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 256 64"
+   height="64"
+   width="256"
+   xml:space="preserve"
+   id="svg2"
+   version="1.1"
+   sodipodi:docname="logo.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1308"
+     inkscape:window-height="704"
+     id="namedview93"
+     showgrid="false"
+     inkscape:zoom="4.61"
+     inkscape:cx="70.146228"
+     inkscape:cy="46.916542"
+     inkscape:window-x="58"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer2" /><metadata
+     id="metadata8"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+     id="defs6"><marker
+   inkscape:stockid="Arrow1Mend"
+   orient="auto"
+   refY="0"
+   refX="0"
+   id="Arrow1Mend"
+   style="overflow:visible"
+   inkscape:isstock="true"><path
+     id="path913"
+     d="M 0,0 5,-5 -12.5,0 5,5 Z"
+     style="fill:#5affff;fill-opacity:1;fill-rule:evenodd;stroke:#7787ff;stroke-width:1.00000003pt;stroke-opacity:1"
+     transform="matrix(-0.4,0,0,-0.4,-4,0)"
+     inkscape:connector-curvature="0" /></marker><clipPath
+   id="clipPath18"
+   clipPathUnits="userSpaceOnUse"><path
+     id="path16"
+     d="M 0,2000 H 2000 V 0 H 0 Z"
+     inkscape:connector-curvature="0" /></clipPath><clipPath
+   id="clipPath90"
+   clipPathUnits="userSpaceOnUse"><path
+     id="path88"
+     d="m 1317.766,1308.723 v -15.945 h -0.107 c -1.215,2.153 -3.975,4.082 -8.06,4.082 v 0 c -6.512,0 -12.028,-5.46 -11.973,-14.345 v 0 c 0,-8.111 4.967,-13.573 11.419,-13.573 v 0 c 4.36,0 7.62,2.261 9.107,5.244 v 0 h 0.109 l 0.218,-4.637 h 4.368 c -0.17,1.822 -0.227,4.523 -0.227,6.898 v 0 32.276 z m -15.23,-25.985 c 0,5.904 2.981,10.317 8,10.317 v 0 c 3.645,0 6.291,-2.535 7.01,-5.628 v 0 c 0.164,-0.607 0.22,-1.435 0.22,-2.042 v 0 -4.632 c 0,-0.776 -0.056,-1.437 -0.22,-2.099 v 0 c -0.881,-3.64 -3.862,-5.795 -7.117,-5.795 v 0 c -5.245,0 -7.893,4.469 -7.893,9.879 m -76.687,-13.189 h 4.852 v 39.174 h -4.852 z m 296.659,34.21 c 0,-1.653 1.214,-2.976 2.923,-2.976 v 0 c 1.933,0 3.146,1.323 3.088,2.976 v 0 c 0,1.713 -1.155,3.036 -2.977,3.036 v 0 c -1.767,0 -3.034,-1.323 -3.034,-3.036 m -16.55,-1.103 v -6.4 h -4.142 v -3.699 h 4.142 v -14.565 c 0,-3.146 0.494,-5.516 1.873,-6.95 v 0 c 1.16,-1.325 2.978,-2.045 5.242,-2.045 v 0 c 1.877,0 3.366,0.275 4.307,0.662 v 0 l -0.223,3.642 c -0.609,-0.163 -1.543,-0.33 -2.814,-0.33 v 0 c -2.703,0 -3.641,1.875 -3.641,5.186 v 0 14.4 h 6.954 v 3.699 h -6.954 v 7.668 z m 58.758,-19.974 c 0,-7.397 4.744,-13.023 11.363,-13.023 v 0 c 4.141,0 7.007,1.986 8.5,4.472 v 0 h 0.111 v -2.982 c 0,-6.732 -3.642,-9.325 -8.611,-9.325 v 0 c -3.31,0 -6.066,0.994 -7.836,2.097 v 0 l -1.212,-3.698 c 2.153,-1.436 5.683,-2.207 8.886,-2.207 v 0 c 3.363,0 7.117,0.771 9.711,3.199 v 0 c 2.592,2.318 3.804,6.071 3.804,12.196 v 0 15.506 c 0,3.256 0.112,5.405 0.224,7.339 v 0 h -4.251 l -0.221,-4.03 h -0.111 c -1.158,2.206 -3.693,4.634 -8.332,4.634 v 0 c -6.123,0 -12.025,-5.128 -12.025,-14.178 m 4.91,0.275 c 0,6.179 3.308,10.098 7.943,10.098 v 0 c 3.534,0 5.906,-2.314 6.787,-5.133 v 0 c 0.223,-0.66 0.276,-1.377 0.276,-2.206 v 0 -4.802 c 0,-0.825 -0.11,-1.766 -0.385,-2.592 v 0 c -1.051,-3.088 -3.75,-4.963 -6.734,-4.963 v 0 c -5.241,0 -7.887,4.354 -7.887,9.598 m -29.133,8.884 h -0.109 l -0.278,4.415 h -4.302 c 0.166,-2.208 0.221,-4.471 0.221,-7.23 v 0 -19.477 h 4.855 v 16.058 c 0,0.826 0.109,1.655 0.329,2.263 v 0 c 0.829,2.703 3.313,4.965 6.511,4.965 v 0 c 4.582,0 6.183,-3.588 6.183,-7.892 v 0 -15.394 h 4.856 v 15.949 c 0,9.156 -5.741,11.362 -9.436,11.362 v 0 c -4.414,0 -7.506,-2.479 -8.83,-5.019 m -92.963,-0.167 h -0.113 l -0.217,4.582 h -4.361 c 0.109,-2.538 0.22,-5.297 0.22,-8.717 v 0 -28.915 h 4.803 v 14.514 h 0.109 c 1.599,-2.65 4.69,-4.196 8.224,-4.196 v 0 c 6.289,0 12.136,4.747 12.136,14.344 v 0 c 0,8.114 -4.855,13.574 -11.308,13.574 v 0 c -4.362,0 -7.506,-1.929 -9.493,-5.186 m 0.551,-13.24 c -0.11,0.603 -0.219,1.268 -0.219,1.986 v 0 4.58 c 0,0.662 0.164,1.377 0.331,1.986 v 0 c 0.935,3.642 4.026,6.013 7.339,6.013 v 0 c 5.127,0 7.944,-4.578 7.944,-9.931 v 0 c 0,-6.125 -2.981,-10.319 -8.109,-10.319 v 0 c -3.479,0 -6.403,2.319 -7.286,5.685 m -27.584,16.55 c -1.103,-0.825 -2.15,-1.985 -2.981,-3.473 v 0 h -0.11 c -1.157,3.143 -3.915,5.349 -7.56,5.349 v 0 c -4.411,0 -6.895,-2.369 -8.388,-4.908 v 0 h -0.164 l -0.219,4.304 h -4.25 c 0.166,-2.208 0.221,-4.471 0.221,-7.23 v 0 -19.477 h 4.744 v 16.113 c 0,0.829 0.109,1.657 0.388,2.371 v 0 c 0.773,2.427 2.979,4.856 6.016,4.856 v 0 c 3.694,0 5.571,-3.09 5.571,-7.336 v 0 -16.004 h 4.744 v 16.498 c 0,0.884 0.17,1.767 0.387,2.427 v 0 c 0.825,2.375 2.978,4.415 5.737,4.415 v 0 c 3.919,0 5.797,-3.09 5.797,-8.219 v 0 -15.121 h 4.747 v 15.727 c 0,9.269 -5.244,11.584 -8.778,11.584 v 0 c -2.535,0 -4.303,-0.66 -5.902,-1.876 m -55.674,-12.302 c 0,-8.442 5.576,-13.74 12.805,-13.74 v 0 c 6.453,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.19,13.739 -12.856,13.739 v 0 c -7.394,0 -13.246,-5.24 -13.246,-14.178 m 4.914,0.164 c 0,5.076 2.479,10.373 8.221,10.373 v 0 c 5.738,0 8,-5.737 8,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.109,-10.373 v 0 c -4.744,0 -8.112,4.413 -8.112,10.262 m -132.799,-0.164 c 0,-8.442 5.57,-13.74 12.799,-13.74 v 0 c 6.457,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.183,13.739 -12.856,13.739 v 0 c -7.394,0 -13.24,-5.24 -13.24,-14.178 m 4.909,0.164 c 0,5.076 2.482,10.373 8.222,10.373 v 0 c 5.739,0 8,-5.737 8,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.111,-10.373 v 0 c -4.744,0 -8.111,4.413 -8.111,10.262 m -81.985,-0.387 c 0,-8.055 4.908,-13.462 13.132,-13.462 v 0 c 4.248,0 7.172,0.884 8.885,1.657 v 0 l -0.831,3.477 c -1.819,-0.772 -3.915,-1.382 -7.392,-1.382 v 0 c -4.857,0 -9.048,2.705 -9.159,9.269 v 0 h 18.759 c 0.058,0.497 0.167,1.268 0.167,2.263 v 0 c 0,4.913 -2.317,12.579 -11.035,12.579 v 0 c -7.78,0 -12.526,-6.34 -12.526,-14.401 m 12.138,10.929 c 5.465,0 6.787,-4.803 6.732,-7.89 v 0 h -14.182 c 0.388,3.365 2.539,7.89 7.45,7.89 m -47.668,-2.374 h -0.222 l -0.167,5.242 h -4.246 c 0.163,-2.485 0.221,-5.185 0.221,-8.334 v 0 -18.373 h 4.797 v 14.234 c 0,0.83 0.111,1.602 0.223,2.264 v 0 c 0.66,3.641 3.089,6.235 6.514,6.235 v 0 c 0.659,0 1.157,-0.056 1.653,-0.166 v 0 4.58 c -0.442,0.111 -0.829,0.164 -1.379,0.164 v 0 c -3.258,0 -6.18,-2.26 -7.394,-5.846 m -67.036,-8.332 c 0,-8.442 5.572,-13.74 12.802,-13.74 v 0 c 6.454,0 13.298,4.305 13.298,14.179 v 0 c 0,8.168 -5.19,13.739 -12.856,13.739 v 0 c -7.396,0 -13.244,-5.24 -13.244,-14.178 m 4.91,0.164 c 0,5.076 2.482,10.373 8.223,10.373 v 0 c 5.738,0 7.998,-5.737 7.998,-10.262 v 0 c 0,-6.014 -3.473,-10.373 -8.108,-10.373 v 0 c -4.745,0 -8.113,4.413 -8.113,10.262 m -25.931,6.18 c 0,-3.2 2.261,-5.846 7.062,-7.56 v 0 c 3.59,-1.324 4.967,-2.591 4.967,-4.909 v 0 c 0,-2.205 -1.656,-3.973 -5.187,-3.973 v 0 c -2.428,0 -4.966,0.993 -6.399,1.931 v 0 l -1.215,-3.694 c 1.875,-1.104 4.578,-1.824 7.502,-1.824 v 0 c 6.348,0 9.99,3.31 9.99,8 v 0 c 0,3.972 -2.375,6.289 -7.009,8.058 v 0 c -3.476,1.322 -5.075,2.314 -5.075,4.524 v 0 c 0,1.986 1.599,3.64 4.469,3.64 v 0 c 2.482,0 4.415,-0.883 5.461,-1.545 v 0 l 1.215,3.532 c -1.489,0.882 -3.864,1.654 -6.565,1.654 v 0 c -5.742,0 -9.216,-3.53 -9.216,-7.834 m -36.745,2.815 h -0.11 l -0.274,4.415 h -4.303 c 0.164,-2.208 0.22,-4.471 0.22,-7.23 v 0 -19.477 h 4.854 v 16.058 c 0,0.826 0.113,1.655 0.332,2.263 v 0 c 0.826,2.703 3.31,4.965 6.512,4.965 v 0 c 4.58,0 6.177,-3.588 6.177,-7.892 v 0 -15.394 h 4.856 v 15.949 c 0,9.156 -5.739,11.362 -9.431,11.362 v 0 c -4.418,0 -7.508,-2.479 -8.833,-5.019 m -34.039,-9.382 c 0,-8.055 4.91,-13.462 13.131,-13.462 v 0 c 4.249,0 7.172,0.884 8.883,1.657 v 0 l -0.829,3.477 c -1.819,-0.772 -3.916,-1.382 -7.394,-1.382 v 0 c -4.853,0 -9.047,2.705 -9.157,9.269 v 0 h 18.763 c 0.053,0.497 0.162,1.268 0.162,2.263 v 0 c 0,4.913 -2.317,12.579 -11.034,12.579 v 0 c -7.781,0 -12.525,-6.34 -12.525,-14.401 m 12.138,10.929 c 5.463,0 6.788,-4.803 6.732,-7.89 v 0 h -14.183 c 0.389,3.365 2.538,7.89 7.451,7.89 m -37.13,-1.714 h -0.111 l -0.219,4.582 h -4.362 c 0.111,-2.538 0.221,-5.297 0.221,-8.717 v 0 -28.915 h 4.801 v 14.514 h 0.111 c 1.599,-2.65 4.688,-4.196 8.219,-4.196 v 0 c 6.294,0 12.141,4.747 12.141,14.344 v 0 c 0,8.114 -4.854,13.574 -11.31,13.574 v 0 c -4.362,0 -7.503,-1.929 -9.491,-5.186 m 0.552,-13.24 c -0.111,0.603 -0.222,1.268 -0.222,1.986 v 0 4.58 c 0,0.662 0.165,1.377 0.331,1.986 v 0 c 0.937,3.642 4.027,6.013 7.337,6.013 v 0 c 5.133,0 7.949,-4.578 7.949,-9.931 v 0 c 0,-6.125 -2.98,-10.319 -8.113,-10.319 v 0 c -3.477,0 -6.399,2.319 -7.282,5.685 m -37.243,4.248 c 0,-8.442 5.575,-13.74 12.801,-13.74 v 0 c 6.455,0 13.297,4.305 13.297,14.179 v 0 c 0,8.168 -5.187,13.739 -12.854,13.739 v 0 c -7.397,0 -13.244,-5.24 -13.244,-14.178 m 4.912,0.164 c 0,5.076 2.481,10.373 8.223,10.373 v 0 c 5.737,0 7.997,-5.737 7.997,-10.262 v 0 c 0,-6.014 -3.474,-10.373 -8.109,-10.373 v 0 c -4.747,0 -8.111,4.413 -8.111,10.262 m 431.72,-0.222 c 0,-8.162 5.243,-13.627 13.295,-13.627 v 0 c 3.59,0 6.401,0.884 7.672,1.546 v 0 l -0.83,3.643 c -1.377,-0.609 -3.199,-1.327 -5.959,-1.327 v 0 c -5.295,0 -9.267,3.807 -9.267,9.987 v 0 c 0,5.575 3.31,10.098 9.433,10.098 v 0 c 2.651,0 4.469,-0.608 5.631,-1.27 v 0 l 1.103,3.752 c -1.325,0.662 -3.863,1.381 -6.734,1.381 v 0 c -8.721,0 -14.344,-5.958 -14.344,-14.183 m -141.24,0 c 0,-8.162 5.238,-13.627 13.297,-13.627 v 0 c 3.586,0 6.4,0.884 7.668,1.546 v 0 l -0.826,3.643 c -1.381,-0.609 -3.2,-1.327 -5.961,-1.327 v 0 c -5.293,0 -9.271,3.807 -9.271,9.987 v 0 c 0,5.575 3.316,10.098 9.437,10.098 v 0 c 2.649,0 4.471,-0.608 5.628,-1.27 v 0 l 1.106,3.752 c -1.328,0.662 -3.867,1.381 -6.734,1.381 v 0 c -8.717,0 -14.344,-5.958 -14.344,-14.183 m -63.723,0 c 0,-8.162 5.239,-13.627 13.297,-13.627 v 0 c 3.584,0 6.401,0.884 7.668,1.546 v 0 l -0.827,3.643 c -1.379,-0.609 -3.199,-1.327 -5.958,-1.327 v 0 c -5.299,0 -9.272,3.807 -9.272,9.987 v 0 c 0,5.575 3.311,10.098 9.436,10.098 v 0 c 2.649,0 4.471,-0.608 5.627,-1.27 v 0 l 1.106,3.752 c -1.326,0.662 -3.865,1.381 -6.733,1.381 v 0 c -8.716,0 -14.344,-5.958 -14.344,-14.183 m 387.637,-13.075 h 4.854 v 26.707 h -4.854 z m -31.168,26.707 v -16.389 c 0,-0.882 -0.168,-1.765 -0.441,-2.485 v 0 c -0.883,-2.148 -3.144,-4.411 -6.402,-4.411 v 0 c -4.417,0 -5.961,3.419 -5.961,8.495 v 0 14.79 h -4.856 v -15.615 c 0,-9.38 5.023,-11.699 9.217,-11.699 v 0 c 4.744,0 7.56,2.815 8.826,4.967 v 0 h 0.111 l 0.276,-4.36 h 4.304 c -0.165,2.096 -0.22,4.523 -0.22,7.281 v 0 19.426 z m -205.297,0 v -16.389 c 0,-0.882 -0.166,-1.765 -0.441,-2.485 v 0 c -0.883,-2.148 -3.148,-4.411 -6.404,-4.411 v 0 c -4.414,0 -5.956,3.419 -5.956,8.495 v 0 14.79 h -4.857 v -15.615 c 0,-9.38 5.022,-11.699 9.215,-11.699 v 0 c 4.744,0 7.563,2.815 8.828,4.967 v 0 h 0.109 l 0.282,-4.36 h 4.301 c -0.168,2.096 -0.219,4.523 -0.219,7.281 v 0 19.426 z m -179.642,0 v -16.389 c 0,-0.882 -0.165,-1.765 -0.442,-2.485 v 0 c -0.883,-2.148 -3.144,-4.411 -6.398,-4.411 v 0 c -4.416,0 -5.959,3.419 -5.959,8.495 v 0 14.79 h -4.854 v -15.615 c 0,-9.38 5.017,-11.699 9.211,-11.699 v 0 c 4.749,0 7.56,2.815 8.829,4.967 v 0 h 0.111 l 0.275,-4.36 h 4.303 c -0.165,2.096 -0.22,4.523 -0.22,7.281 v 0 19.426 z"
+     inkscape:connector-curvature="0" /></clipPath><clipPath
+   id="clipPath104"
+   clipPathUnits="userSpaceOnUse"><path
+     id="path102"
+     d="m 892.093,1318.587 h 744.665 v 1.564 H 892.093 Z"
+     inkscape:connector-curvature="0" /></clipPath><clipPath
+   id="clipPath122"
+   clipPathUnits="userSpaceOnUse"><path
+     id="path120"
+     d="M 0,2000 H 2000 V 0 H 0 Z"
+     inkscape:connector-curvature="0" /></clipPath>
+
+
+</defs><g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Layer 2"
+     style="display:inline"
+     transform="translate(0,-298.9483)"
+     sodipodi:insensitive="true"><path
+       style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.89999998;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="m 24.076585,353.85243 c -3.737293,-0.43539 -7.03116,-2.47076 -8.345309,-5.15678 -0.479828,-0.98073 -0.607487,-1.58528 -0.678732,-3.21422 -0.07696,-1.75969 -0.02611,-2.13447 0.413697,-3.04903 1.456842,-3.02942 4.81563,-4.83882 8.982291,-4.83882 1.159138,0 1.476072,0.0929 2.263912,0.66361 1.062673,0.7698 1.616301,0.75954 1.708622,-0.0316 0.04784,-0.41001 -0.171475,-0.80109 -0.829525,-1.47917 -0.831125,-0.85641 -3.188526,-2.18911 -3.873005,-2.18951 -0.233112,-1.3e-4 -0.26764,-0.23728 -0.156514,-1.075 0.217829,-1.64207 0.647154,-2.64889 1.745209,-4.09274 1.257788,-1.65388 2.479567,-2.70661 4.018337,-3.46234 1.094231,-0.5374 1.419183,-0.58917 3.697703,-0.58917 2.381533,0 2.565128,0.033 3.936253,0.70748 0.977423,0.48082 1.845041,1.14292 2.708026,2.06654 2.202631,2.3574 3.11364,4.66429 3.11364,7.88446 v 1.35972 l -1.030369,0.69263 c -2.333261,1.56844 -3.584794,3.17731 -4.102007,5.2732 -0.529707,2.14652 -0.04966,3.73323 0.965148,3.19013 0.311772,-0.16686 0.450631,-0.55562 0.55495,-1.5537 0.268247,-2.56646 1.445586,-4.41578 3.34592,-5.25565 2.542689,-1.12378 5.016987,-0.91402 7.33021,0.62141 1.617629,1.07372 2.184534,1.82246 2.723584,3.59716 0.597613,1.96751 0.487275,3.73114 -0.33494,5.35371 -0.498768,0.98427 -0.750303,1.22571 -1.726967,1.65763 -2.07572,0.91798 -9.569215,2.35058 -15.286474,2.92244 -2.545025,0.25457 -8.949967,0.25322 -11.14366,-0.002 z"
+       id="path98"
+       inkscape:connector-curvature="0" /></g><g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Layer 1"
+     style="display:inline"
+     transform="translate(0,-298.9483)"
+     sodipodi:insensitive="true"><g
+       id="g12"
+       transform="matrix(0.18829928,0,0,-0.18829928,-93.481273,592.20033)"><g
+         id="g14"
+         clip-path="url(#clipPath18)"><g
+           id="g20"
+           transform="translate(580.6621,1256.1953)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 9.63,-7.223 31.054,-5.803 0,0 3.756,0.065 6.57,4.261 0,0 2.303,5.23 -7.628,2.955 0,0 -12.195,-1.746 -23.595,4.163 0,0 -23.961,13.35 -27.992,33.429 0,0 -7.314,19.798 4.423,40.527 0,0 7.256,12.282 15.439,17.959 0,0 13.64,12.94 33.83,9.306 0,0 9.942,-0.793 29.76,-16.845 0,0 6.359,-1.79 4.877,3.766 0,0 -5.246,13.335 -26.608,18.151 0,0 -0.555,17.718 8.149,25.435 0,0 14.879,28.153 47.352,25.066 0,0 29.265,0.679 45.131,-37.166 0,0 5.062,-16.916 1.543,-30.251 l 20.744,3.704 -19.818,39.821 c 0,0 -12.409,25.342 -45.007,31.007 0,0 -29.448,6.776 -54.266,-24.154 0,0 -10.743,-18.336 -11.484,-31.487 0,0 -36.302,9.261 -58.712,-34.449 0,0 -21.608,-49.329 26.238,-79.395"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path22" /></g><g
+           id="g24"
+           transform="translate(769.1968,1270.9512)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 40.635,35.561 2.852,71.862 0,0 2.075,10.187 -2.852,13.706 0,0 -1.964,5.001 -15.484,-1.482 0,0 -11.299,-3.704 -21.115,5.001 l -11.668,-9.446 c 0,0 -15.743,-7.038 -23.151,-24.263 0,0 -5.001,-15.557 0,-21.484 0,0 3.704,-1.852 5.927,2.593 0,0 -1.853,15.557 10.927,29.819 0,0 28.418,22.814 56.77,-7.746 0,0 16.982,-24.851 -2.206,-47.818 0,0 -10.484,-9.075 -9.372,-10.742 0,0 3.001,-2.778 9.372,0"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path26" /></g><g
+           id="g28"
+           transform="translate(669.2554,1426.3086)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -0.249,14.112 4.075,26.088 0,0 2.24,6.106 10.125,18.028 1.244,1.881 5.186,6.914 6.421,11.483 0,0 6.668,20.99 -17.225,24.319 0,0 -7.613,1.355 -12.593,-2.648 -3.15,-2.532 -6.113,-4.014 -8.398,-4.631 0,0 -11.298,-3.889 -10.927,3.334 0,0 -2.038,10.742 23.522,13.705 0,0 31.271,5.371 34.897,-19.447 0,0 5.108,-15.188 -13.413,-37.969 0,0 -10.187,-15.774 -7.779,-32.89 2.408,-17.117 0,-0.818 0,-0.818 l -3.148,-2.037 -6.112,2.855"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path30" /></g><g
+           id="g32"
+           transform="translate(721.856,1393.8394)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 16.616,4.073 19.333,17.902 l -23.708,1.604 c 0,0 -6.419,2.254 -9.877,13.166 0,0 -14.323,7.702 -13.335,18.815 0,0 2.222,13.829 14.076,15.805 0,0 12.364,3.056 14.879,-16.7 0,0 5.817,-16.732 -5.519,-17.92 0,0 -2.446,-5.386 6.444,-5.633 0,0 10.838,-3.211 18.507,3.21 0,0 5.2,4.785 11.375,3.875 0,0 1.326,2.361 -1.266,3.842 0,0 -15.373,13.15 -18.058,31.764 0,0 -12.688,1.76 -14.262,10.743 0,0 -2.964,13.891 8.52,16.669 0,0 7.316,1.667 11.02,0 0,0 9.353,25.467 36.024,29.819 0,0 22.04,5.185 29.912,-11.483 0,0 3.241,-9.076 1.481,-16.669 0,0 -1.852,-8.335 0.093,-10.465 0,0 7.131,1.667 10.094,-2.963 2.963,-4.631 4.26,-14.539 -1.667,-16.855 0,0 1.76,-7.871 -4.167,-13.242 0,0 -18.799,-10.928 -24.17,-20.188 0,0 -1.656,-2.115 -2.5,-2.856 -2.034,-1.784 -4.739,-3.312 -7.224,-3.966 0,0 -2.233,-0.968 -4.723,0.247 0,0 -0.741,-3.705 3.426,-4.353 0,0 7.918,1.097 16.531,3.736 l 62.278,22.271 c 0,0 -2.895,7.78 -0.58,11.576 0,0 1.281,2.018 2.447,2.461 2.159,0.822 4.738,4.932 4.846,8.142 0,0 -0.602,8.119 5.233,8.489 0,0 5.586,0.34 5.123,-6.513 l -0.4,-4.507 c 0,0 8.543,3.241 11.402,-2.593 0,0 5.774,-11.708 -0.349,-21.153 0,0 -9.009,-8.881 -20.87,-3.295 l -4.074,2.501 c 0,0 -72.419,-29.974 -73.252,-31.95 0,0 -5.688,-2.869 -9.909,-10.557 0,0 -14.539,-25.93 -22.04,-32.782 0,0 -4.908,-5.927 -8.427,-7.409 l 1.389,-3.704 H 8.22 l -1.852,11.923 -2.315,23.36 z"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path34" /></g><g
+           id="g36"
+           transform="translate(788.5322,1499.6885)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 9.816,6.112 13.521,-0.556 0,0 -1.112,-9.075 -0.556,-16.484 0,0 1.111,-8.705 8.149,-13.706 0,0 6.668,-7.408 0,-14.075 0,0 -20.002,-14.077 -23.707,-22.596 0,0 -8.89,-12.595 -23.337,-2.964 0,0 -18.891,11.483 -15.558,28.152 0,0 2.223,3.334 7.038,4.446 0,0 -11.853,19.262 -1.111,32.968 0,0 17.41,22.225 35.561,4.815"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path38" /></g><g
+           id="g40"
+           transform="translate(736.4878,1483.019)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -3.982,-5.834 -4.167,-14.539 0,0 -6.112,0.926 -6.668,6.76 0,0 -1.574,8.427 5.927,9.817 0,0 3.797,0.926 4.908,-2.038"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path42" /></g><g
+           id="g44"
+           transform="translate(805.7573,1476.4443)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 4.074,2.778 6.853,0 0,0 4.147,-4.047 1.759,-7.501 0,0 -1.759,-1.019 -2.871,0 0,0 -2.338,2.892 -4.815,4.537 0,0 -1.759,1.205 -0.926,2.964"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path46" /></g><g
+           id="g48"
+           transform="translate(719.4482,1443.7544)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -1.852,9.446 -8.026,12.039 0,0 -4.445,1.172 -7.779,-2.655 0,0 -6.112,-6.236 -4.074,-13.829 0,0 3.519,-8.336 12.841,-10.064 0,0 5.248,-1.605 8.273,6.36 0,0 0.761,2.479 -1.235,8.149"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path50" /></g><g
+           id="g52"
+           transform="translate(727.7827,1385.103)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 12.055,4.899 26.917,22.966 0,0 4.074,5.681 9.755,4.199 0,0 8.274,-1.975 2.963,-15.187 0,0 -10.371,-32.722 -35.066,-36.055 0,0 0,17.163 -4.569,24.077"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path54" /></g><g
+           id="g56"
+           transform="translate(635.6704,1351.6421)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -43.462,8.149 -58.773,-28.152 0,0 -13.089,-43.217 40.252,-57.045 0,0 38.277,-6.174 85.939,1.481 0,0 55.415,7.161 66.108,15.311 0,0 -4.864,-18.522 -56.477,-26.671 0,0 -75.32,-10.866 -100.756,-5.927 0,0 3.704,-0.493 6.914,4.939 0,0 1.236,3.951 -9.877,1.729 0,0 -25.188,-2.717 -42.476,22.225 0,0 -28.398,38.361 11.113,72.892 0,0 23.708,26.136 58.033,-0.782"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path58" /></g><g
+           id="g60"
+           transform="translate(774.2251,1475.8418)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -0.51,5.094 -7.501,5.51 0,0 -6.622,1.297 -8.243,-5.047 0,0 0.602,-2.5 3.381,-0.787 0,0 -0.009,3.725 5,3.936 0,0 4.769,-0.875 5.279,-4.535 0,0 1.945,-0.744 2.084,0.923"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path62" /></g><g
+           id="g64"
+           transform="translate(784.8511,1475.0781)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 0.371,5.186 4.677,6.159 0,0 6.251,2.013 8.983,-3.589 0,0 0.972,-2.27 0.092,-2.895 0,0 -1.956,-0.717 -2.546,2.686 0,0 -1.575,3.079 -4.7,2.431 0,0 -2.778,-0.301 -3.473,-3.217 C 3.033,1.575 2.895,-1.504 0,0"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path66" /></g><g
+           id="g68"
+           transform="translate(761.3672,1457.7686)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 1.418,0.874 3.46,0.125 4.756,-0.666 1.408,-0.859 2.941,-1.667 4.432,-2.374 2.923,-1.383 5.96,-2.278 9.27,-2.27 1.718,0.005 3.547,-0.174 5.233,0.063 1.407,0.199 2.852,0.354 4.257,0.497 1.707,0.172 3.483,0.529 5.035,1.34 0.777,0.407 1.556,0.73 2.306,1.188 0.698,0.429 1.344,0.996 2.018,1.419 0.311,0.196 1.15,0.817 1.525,0.749 0.5,-0.092 0.974,-1.441 0.843,-1.912 C 38.728,-2.247 37.82,-3 36.914,-3.439 c -1.258,-0.609 -2.431,-1.435 -3.579,-2.226 -1.627,-1.123 -3.529,-2.704 -4.564,-4.398 -2.423,-3.972 -5.177,-8.017 -9.198,-10.495 -2.113,-1.301 -4.482,-1.669 -6.932,-1.668 -2.327,10e-4 -5.273,0.425 -7.276,1.677 -1.948,1.216 -3.455,2.752 -4.072,4.991 -0.61,2.218 0.003,4.442 0.003,6.695 0,1.757 0.469,4.361 -0.368,5.901 -0.286,0.53 -0.394,0.373 -0.869,0.783 -0.364,0.316 -0.549,0.913 -0.375,1.592 C -0.287,-0.47 -0.12,0.01 0,0"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path70" /></g><g
+           id="g72"
+           transform="translate(779.457,1464.9844)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,-1.036 -0.881,-1.875 -1.968,-1.875 -1.087,0 -1.968,0.839 -1.968,1.875 0,1.036 0.881,1.875 1.968,1.875 C -0.881,1.875 0,1.036 0,0"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path74" /></g><g
+           id="g76"
+           transform="translate(787.5132,1465.3081)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,-1.036 -0.881,-1.875 -1.967,-1.875 -1.087,0 -1.968,0.839 -1.968,1.875 0,1.036 0.881,1.875 1.968,1.875 C -0.881,1.875 0,1.036 0,0"
+             style="fill:#2aa5dc;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path78" /></g><g
+           id="g80"
+           transform="translate(857.1938,1448.3535)"><path
+             inkscape:connector-curvature="0"
+             d="m 0,0 c 0,0 -2.887,5.018 0.984,8.986 0,0 5.068,1.737 5.206,5.665 0,0 -1.398,6.182 1.491,8.342 0,0 4.789,3.286 5.406,-2.412 0,0 1.044,-5.282 -0.676,-8.613 0,0 7.063,1.813 10.257,0 3.196,-1.814 4.302,-11.503 1.415,-16.522 0,0 -3.44,-6.009 -13.086,-5.601 0,0 -8.601,-0.35 -8.786,5.895 0,0 -0.829,2.665 -2.211,4.26"
+             style="fill:#b9e1f6;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path82" /></g></g></g><g
+       id="g545"
+       transform="matrix(1.1498338,0,0,1.1498338,-23.728627,-49.846833)"><g
+   transform="matrix(0.16701663,0,0,-0.18099948,-42.665269,573.72911)"
+   id="g84"><g
+     clip-path="url(#clipPath90)"
+     id="g86"><g
+       id="g92"><g
+         transform="matrix(1008.8768,0,0,756.6576,710.18262,943.2384)"
+         id="g94"><image
+           id="image96"
+           xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAABHNCSVQICAgIfAhkiAAACP9JREFUeJzt2MGNQjEQBUEbkSdaAgMRqbnvEST8oasieNJcWjPHGGsAAJBx2j0AAIDPEoAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBizrsH8J611u4JAHA4c87dEw7NBxAAIMYH8AfdHvfdEwDgo66Xv90TvooPIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxc4yxdo/gdWs5HwD8N+fcPeHQfAABAGJ8AAEAYnwAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAICYJ3DqD79QHb+PAAAAAElFTkSuQmCC"
+           transform="matrix(1,0,0,-1,0,1)"
+           preserveAspectRatio="none"
+           style="image-rendering:optimizeSpeed"
+           height="1"
+           width="1" /></g></g></g></g><g
+   transform="matrix(0.16701663,0,0,-0.18099948,-42.665269,573.72911)"
+   id="g98"><g
+     clip-path="url(#clipPath104)"
+     id="g100"><g
+       id="g106"><g
+         transform="matrix(1014.016,0,0,750.59521,706.7168,947.9795)"
+         id="g108"><image
+           id="image110"
+           xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAABHNCSVQICAgIfAhkiAAACOVJREFUeJzt2LENg1AUBMGH5ZIRRSD3DB0gOeEHO1PBhavbZuYaAAAyPqsHAADwLgEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACDmu3oAz87fuXoCAPCnYz9WT3jkAQQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYraZuVaPAADgPR5AAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAgRgACAMQIQACAGAEIABAjAAEAYgQgAECMAAQAiBGAAAAxAhAAIEYAAgDECEAAgBgBCAAQIwABAGIEIABAjAAEAIgRgAAAMQIQACBGAAIAxAhAAIAYAQgAECMAAQBiBCAAQIwABACIEYAAADECEAAg5gbWAAi/xKrGrgAAAABJRU5ErkJggg=="
+           transform="matrix(1,0,0,-1,0,1)"
+           preserveAspectRatio="none"
+           style="image-rendering:optimizeSpeed"
+           height="1"
+           width="1" /></g></g></g></g><text
+   y="309.22644"
+   x="241.4295"
+   id="text114"
+   style="font-variant:normal;font-weight:bold;font-stretch:normal;font-size:2.21677637px;font-family:'Avenir LT Std 55 Roman';-inkscape-font-specification:AvenirLTStd-Heavy;writing-mode:lr-tb;fill:#808181;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.17386755"
+   transform="scale(0.96059698,1.0410193)"><tspan
+     id="tspan112"
+     y="309.22644"
+     x="241.4295 242.70193"
+     style="stroke-width:0.17386755">TM</tspan></text>
+
+<g
+   transform="matrix(0.18829928,0,0,-0.18829928,-77.55372,592.20033)"
+   id="g116"><g
+     clip-path="url(#clipPath122)"
+     id="g118"
+     transform="matrix(0.8869744,0,0,0.961233,185.28191,98.09498)"><g
+       transform="translate(833.8633,1358.5918)"
+       id="g124"><path
+         id="path126"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.736,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.122,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.781,-3.2 2.348,-4.083 1.564,-0.885 3.197,-1.327 4.899,-1.327 1.496,0 2.943,0.204 4.339,0.612 1.393,0.409 2.636,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.787,-5.716 -2.825,-1.157 -5.803,-1.736 -8.932,-1.736 -2.314,0 -4.542,0.324 -6.686,0.97 -2.143,0.646 -4.032,1.616 -5.665,2.909 -1.633,1.292 -2.926,2.892 -3.878,4.797 -0.954,1.905 -1.43,4.117 -1.43,6.635 0,2.859 0.527,5.273 1.583,7.248 1.054,1.972 2.483,3.606 4.286,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.712,1.241 7.196,1.582 2.483,0.34 4.967,0.544 7.452,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.908,6.482 -1.94,1.597 -4.237,2.398 -6.89,2.398 -2.519,0 -4.815,-0.528 -6.891,-1.582 -2.076,-1.055 -3.929,-2.501 -5.563,-4.338 l -8.165,8.37 c 2.858,2.654 6.191,4.644 10.003,5.971 3.81,1.327 7.758,1.991 11.841,1.991 4.491,0 8.181,-0.562 11.074,-1.684 2.892,-1.123 5.206,-2.774 6.941,-4.951 1.736,-2.179 2.943,-4.849 3.624,-8.013 C 17.521,11.279 17.863,7.62 17.863,3.47 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(875.8135,1361.6538)"
+       id="g128"><path
+         id="path130"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-3.743 1.072,-6.772 3.215,-9.084 2.144,-2.314 5.155,-3.471 9.034,-3.471 3.879,0 6.89,1.157 9.033,3.471 2.144,2.312 3.216,5.341 3.216,9.084 0,3.742 -1.072,6.771 -3.216,9.084 -2.143,2.313 -5.154,3.471 -9.033,3.471 -3.879,0 -6.89,-1.158 -9.034,-3.471 C 1.072,6.771 0,3.742 0,0 M -14.086,24.804 H 0 v -6.533 h 0.204 c 0.613,0.884 1.412,1.787 2.399,2.705 0.986,0.919 2.144,1.751 3.471,2.501 1.326,0.748 2.772,1.36 4.338,1.837 1.564,0.476 3.231,0.715 5.001,0.715 3.675,0 7.008,-0.63 10.004,-1.889 2.993,-1.26 5.562,-3.028 7.706,-5.307 2.144,-2.281 3.793,-4.986 4.95,-8.115 1.157,-3.131 1.736,-6.568 1.736,-10.31 0,-3.47 -0.528,-6.787 -1.582,-9.952 -1.056,-3.164 -2.552,-5.971 -4.492,-8.421 -1.939,-2.45 -4.304,-4.407 -7.094,-5.869 -2.791,-1.462 -5.955,-2.195 -9.493,-2.195 -3.199,0 -6.175,0.495 -8.931,1.481 -2.756,0.985 -5.019,2.669 -6.788,5.052 H 1.225 v -28.58 h -15.311 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(950.939,1358.5918)"
+       id="g132"><path
+         id="path134"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.736,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.122,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.781,-3.2 2.348,-4.083 1.564,-0.885 3.197,-1.327 4.899,-1.327 1.496,0 2.943,0.204 4.339,0.612 1.393,0.409 2.636,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.787,-5.716 -2.825,-1.157 -5.803,-1.736 -8.932,-1.736 -2.314,0 -4.542,0.324 -6.686,0.97 -2.143,0.646 -4.032,1.616 -5.665,2.909 -1.633,1.292 -2.926,2.892 -3.878,4.797 -0.954,1.905 -1.43,4.117 -1.43,6.635 0,2.859 0.527,5.273 1.583,7.248 1.054,1.972 2.483,3.606 4.286,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.712,1.241 7.196,1.582 2.483,0.34 4.967,0.544 7.452,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.908,6.482 -1.94,1.597 -4.237,2.398 -6.89,2.398 -2.519,0 -4.815,-0.528 -6.891,-1.582 -2.076,-1.055 -3.929,-2.501 -5.563,-4.338 l -8.165,8.37 c 2.858,2.654 6.191,4.644 10.003,5.971 3.81,1.327 7.758,1.991 11.841,1.991 4.491,0 8.181,-0.562 11.074,-1.684 2.892,-1.123 5.206,-2.774 6.941,-4.951 1.736,-2.179 2.944,-4.849 3.623,-8.013 0.68,-3.164 1.022,-6.823 1.022,-10.973 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1010.9561,1370.4321)"
+       id="g136"><path
+         id="path138"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.361,0.714 -2.824,1.072 -4.389,1.072 -3.879,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.072,-6.772 3.216,-9.085 2.143,-2.314 5.154,-3.47 9.033,-3.47 1.699,0 3.164,0.373 4.389,1.123 1.225,0.748 2.279,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.189,-4.169 -8.42,-5.155 -3.234,-0.986 -6.313,-1.48 -9.238,-1.48 -3.812,0 -7.4,0.613 -10.769,1.837 -3.368,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.429,3.198 -2.144,6.77 -2.144,10.718 0,3.945 0.715,7.518 2.144,10.717 1.428,3.198 3.384,5.936 5.869,8.217 2.483,2.28 5.41,4.032 8.778,5.257 3.369,1.225 6.957,1.837 10.769,1.837 2.925,0 6.004,-0.494 9.238,-1.479 3.231,-0.988 6.038,-2.706 8.42,-5.155 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1040.8633,1414.0176)"
+       id="g140"><path
+         id="path142"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 v -34.297 h 0.204 c 0.34,0.952 0.919,1.904 1.735,2.859 0.818,0.952 1.802,1.801 2.96,2.551 1.157,0.748 2.518,1.361 4.083,1.837 1.566,0.476 3.267,0.715 5.105,0.715 3.878,0 7.008,-0.597 9.391,-1.786 2.38,-1.191 4.235,-2.842 5.562,-4.951 1.326,-2.11 2.229,-4.593 2.705,-7.451 0.475,-2.858 0.715,-5.956 0.715,-9.289 V -77.167 H 17.148 v 24.293 c 0,1.429 -0.051,2.909 -0.153,4.44 -0.101,1.531 -0.408,2.943 -0.918,4.236 -0.511,1.292 -1.294,2.348 -2.348,3.164 -1.056,0.817 -2.57,1.225 -4.542,1.225 -1.975,0 -3.573,-0.357 -4.797,-1.071 C 3.165,-41.595 2.228,-42.549 1.583,-43.739 0.935,-44.93 0.511,-46.274 0.306,-47.771 0.103,-49.268 0,-50.833 0,-52.466 V -77.167 H -15.312 V 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1117.1104,1367.2681)"
+       id="g144"><path
+         id="path146"
+         style="fill:#989898;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0.067,2.585 -0.783,4.797 -2.551,6.635 -1.771,1.837 -4.051,2.756 -6.84,2.756 -1.701,0 -3.199,-0.273 -4.491,-0.817 C -15.176,8.028 -16.28,7.332 -17.199,6.481 -18.117,5.63 -18.832,4.644 -19.342,3.521 -19.854,2.398 -20.143,1.225 -20.21,0 Z m 12.963,-21.844 c -2.449,-3.131 -5.547,-5.547 -9.288,-7.247 -3.743,-1.7 -7.622,-2.552 -11.636,-2.552 -3.812,0 -7.4,0.613 -10.769,1.837 -3.369,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.43,3.198 -2.144,6.77 -2.144,10.718 0,3.946 0.714,7.518 2.144,10.718 1.428,3.197 3.384,5.936 5.869,8.216 2.483,2.28 5.409,4.032 8.778,5.257 3.369,1.225 6.957,1.838 10.769,1.838 3.537,0 6.752,-0.613 9.646,-1.838 2.891,-1.225 5.34,-2.977 7.348,-5.257 2.007,-2.28 3.556,-5.019 4.645,-8.216 1.088,-3.2 1.634,-6.772 1.634,-10.718 v -4.798 H -20.21 c 0.612,-2.926 1.939,-5.256 3.981,-6.992 2.041,-1.735 4.558,-2.602 7.553,-2.602 2.517,0 4.645,0.561 6.379,1.684 1.736,1.122 3.25,2.568 4.543,4.338 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1174.2705,1370.4321)"
+       id="g148"><path
+         id="path150"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.361,0.714 -2.824,1.072 -4.389,1.072 -3.879,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.072,-6.772 3.216,-9.085 2.143,-2.314 5.154,-3.47 9.033,-3.47 1.699,0 3.164,0.373 4.389,1.123 1.225,0.748 2.279,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.189,-4.169 -8.42,-5.155 -3.234,-0.986 -6.313,-1.48 -9.238,-1.48 -3.812,0 -7.4,0.613 -10.769,1.837 -3.368,1.225 -6.295,2.976 -8.778,5.257 -2.485,2.279 -4.441,5.018 -5.869,8.217 -1.429,3.198 -2.144,6.77 -2.144,10.718 0,3.945 0.715,7.518 2.144,10.717 1.428,3.198 3.384,5.936 5.869,8.217 2.483,2.28 5.41,4.032 8.778,5.257 3.369,1.225 6.957,1.837 10.769,1.837 2.925,0 6.004,-0.494 9.238,-1.479 3.231,-0.988 6.038,-2.706 8.42,-5.155 z"
+         inkscape:connector-curvature="0" /></g><path
+       id="path152"
+       style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 1189.071,1414.018 h 15.311 v -77.167 h -15.311 z"
+       inkscape:connector-curvature="0" /><g
+       transform="translate(1227.8584,1361.6538)"
+       id="g154"><path
+         id="path156"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,-3.743 1.071,-6.772 3.215,-9.084 2.143,-2.314 5.154,-3.471 9.033,-3.471 3.879,0 6.891,1.157 9.034,3.471 2.144,2.312 3.215,5.341 3.215,9.084 0,3.742 -1.071,6.771 -3.215,9.084 -2.143,2.313 -5.155,3.471 -9.034,3.471 -3.879,0 -6.89,-1.158 -9.033,-3.471 C 1.071,6.771 0,3.742 0,0 m -15.311,0 c 0,3.946 0.714,7.519 2.143,10.718 1.43,3.198 3.385,5.936 5.869,8.217 2.484,2.279 5.41,4.031 8.779,5.256 3.368,1.226 6.957,1.838 10.768,1.838 3.811,0 7.4,-0.612 10.77,-1.838 3.368,-1.225 6.293,-2.977 8.777,-5.256 2.484,-2.281 4.441,-5.019 5.869,-8.217 1.43,-3.199 2.145,-6.772 2.145,-10.718 0,-3.947 -0.715,-7.52 -2.145,-10.718 -1.428,-3.199 -3.385,-5.937 -5.869,-8.217 -2.484,-2.28 -5.409,-4.031 -8.777,-5.256 -3.37,-1.225 -6.959,-1.838 -10.77,-1.838 -3.811,0 -7.4,0.613 -10.768,1.838 -3.369,1.225 -6.295,2.976 -8.779,5.256 -2.484,2.28 -4.439,5.018 -5.869,8.217 -1.429,3.198 -2.143,6.771 -2.143,10.718"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1323.3965,1336.8501)"
+       id="g158"><path
+         id="path160"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h -14.698 v 6.737 h -0.204 c -0.545,-0.954 -1.243,-1.906 -2.093,-2.858 -0.852,-0.954 -1.888,-1.804 -3.113,-2.552 -1.225,-0.75 -2.621,-1.361 -4.185,-1.837 -1.566,-0.476 -3.267,-0.715 -5.103,-0.715 -3.879,0 -7.028,0.597 -9.443,1.787 -2.416,1.189 -4.287,2.84 -5.613,4.95 -1.327,2.109 -2.213,4.593 -2.654,7.451 -0.444,2.858 -0.665,5.954 -0.665,9.289 v 27.355 h 15.312 V 25.314 c 0,-1.429 0.051,-2.909 0.153,-4.44 0.102,-1.531 0.409,-2.944 0.919,-4.236 0.51,-1.294 1.292,-2.348 2.348,-3.164 1.054,-0.817 2.567,-1.225 4.542,-1.225 1.973,0 3.572,0.357 4.798,1.071 1.224,0.715 2.159,1.667 2.806,2.859 0.646,1.189 1.072,2.534 1.276,4.031 0.204,1.497 0.306,3.062 0.306,4.696 V 49.607 H 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1371.166,1361.6538)"
+       id="g162"><path
+         id="path164"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c 0,3.742 -1.071,6.771 -3.215,9.084 -2.143,2.313 -5.155,3.471 -9.034,3.471 -3.878,0 -6.89,-1.158 -9.033,-3.471 -2.144,-2.313 -3.215,-5.342 -3.215,-9.084 0,-3.743 1.071,-6.772 3.215,-9.084 2.143,-2.314 5.155,-3.471 9.033,-3.471 3.879,0 6.891,1.157 9.034,3.471 C -1.071,-6.772 0,-3.743 0,0 M 14.086,-24.804 H 0 v 6.533 h -0.204 c -0.612,-0.885 -1.413,-1.786 -2.399,-2.705 -0.987,-0.919 -2.143,-1.753 -3.47,-2.501 -1.327,-0.75 -2.791,-1.36 -4.389,-1.837 -1.6,-0.476 -3.251,-0.715 -4.951,-0.715 -3.675,0 -7.01,0.631 -10.003,1.889 -2.995,1.258 -5.563,3.027 -7.706,5.307 -2.144,2.28 -3.795,4.984 -4.951,8.115 -1.157,3.13 -1.736,6.567 -1.736,10.31 0,3.471 0.527,6.787 1.582,9.952 1.055,3.164 2.552,5.971 4.492,8.421 1.939,2.45 4.303,4.405 7.094,5.869 2.789,1.463 5.954,2.195 9.493,2.195 3.198,0 6.175,-0.495 8.931,-1.48 2.756,-0.987 5.018,-2.672 6.788,-5.053 h 0.204 v 32.868 h 15.311 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1424.5498,1371.8613)"
+       id="g166"><path
+         id="path168"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -2.246,2.79 -5.206,4.185 -8.881,4.185 -1.293,0 -2.552,-0.307 -3.776,-0.919 -1.226,-0.612 -1.838,-1.668 -1.838,-3.164 0,-1.225 0.629,-2.128 1.889,-2.705 1.258,-0.579 2.858,-1.089 4.797,-1.531 1.939,-0.444 4.014,-0.919 6.226,-1.429 2.211,-0.511 4.287,-1.311 6.227,-2.399 1.939,-1.089 3.538,-2.569 4.797,-4.44 1.258,-1.872 1.889,-4.373 1.889,-7.502 0,-3.2 -0.699,-5.836 -2.093,-7.911 -1.395,-2.077 -3.181,-3.743 -5.359,-5.002 -2.179,-1.26 -4.628,-2.143 -7.349,-2.654 -2.722,-0.51 -5.41,-0.765 -8.064,-0.765 -3.47,0 -6.976,0.494 -10.513,1.48 -3.539,0.985 -6.533,2.738 -8.982,5.256 l 9.288,10.31 c 1.429,-1.77 3.012,-3.113 4.746,-4.032 1.735,-0.919 3.76,-1.378 6.074,-1.378 1.769,0 3.368,0.255 4.797,0.766 1.429,0.51 2.144,1.445 2.144,2.807 0,1.292 -0.63,2.261 -1.889,2.909 -1.26,0.646 -2.858,1.19 -4.797,1.633 -1.939,0.442 -4.016,0.919 -6.227,1.429 -2.211,0.511 -4.287,1.276 -6.226,2.297 -1.94,1.02 -3.539,2.466 -4.798,4.338 -1.26,1.871 -1.888,4.371 -1.888,7.502 0,2.925 0.595,5.443 1.786,7.554 1.19,2.108 2.756,3.844 4.696,5.205 1.939,1.361 4.168,2.364 6.685,3.012 2.517,0.646 5.069,0.969 7.656,0.969 3.266,0 6.566,-0.477 9.901,-1.429 3.334,-0.954 6.158,-2.654 8.473,-5.103 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1476.5049,1374.209)"
+       id="g170"><path
+         id="path172"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h -13.474 v -16.536 c 0,-1.362 0.067,-2.603 0.204,-3.726 0.136,-1.122 0.442,-2.092 0.919,-2.909 0.475,-0.816 1.207,-1.446 2.195,-1.888 0.985,-0.443 2.297,-0.664 3.929,-0.664 0.817,0 1.889,0.085 3.215,0.256 1.327,0.169 2.33,0.561 3.012,1.174 v -12.76 c -1.702,-0.612 -3.471,-1.02 -5.308,-1.224 -1.838,-0.205 -3.641,-0.307 -5.41,-0.307 -2.587,0 -4.968,0.273 -7.145,0.817 -2.179,0.544 -4.083,1.412 -5.716,2.602 -1.633,1.19 -2.909,2.739 -3.828,4.645 -0.918,1.904 -1.378,4.219 -1.378,6.941 V 0 h -9.799 v 12.249 h 9.799 v 14.698 h 15.311 V 12.249 H 0 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1510.5967,1358.5918)"
+       id="g174"><path
+         id="path176"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -1.158,0 -2.603,-0.051 -4.338,-0.153 -1.735,-0.102 -3.404,-0.392 -5.002,-0.868 -1.599,-0.477 -2.96,-1.191 -4.083,-2.144 -1.123,-0.953 -1.684,-2.28 -1.684,-3.98 0,-1.837 0.782,-3.2 2.347,-4.083 1.566,-0.885 3.198,-1.327 4.901,-1.327 1.496,0 2.942,0.204 4.338,0.612 1.393,0.409 2.635,0.986 3.725,1.735 1.088,0.749 1.955,1.701 2.603,2.858 0.646,1.157 0.969,2.517 0.969,4.083 L 3.776,0 Z M 3.776,-15.515 H 3.572 c -1.701,-2.654 -3.965,-4.56 -6.788,-5.716 -2.824,-1.157 -5.802,-1.736 -8.93,-1.736 -2.315,0 -4.543,0.324 -6.687,0.97 -2.144,0.646 -4.031,1.616 -5.665,2.909 -1.633,1.292 -2.927,2.892 -3.879,4.797 -0.953,1.905 -1.429,4.117 -1.429,6.635 0,2.859 0.527,5.273 1.582,7.248 1.055,1.972 2.484,3.606 4.287,4.899 1.803,1.292 3.862,2.297 6.176,3.011 2.313,0.715 4.711,1.241 7.197,1.582 2.483,0.34 4.965,0.544 7.451,0.613 2.483,0.067 4.78,0.102 6.889,0.102 0,2.721 -0.969,4.882 -2.909,6.482 -1.939,1.597 -4.235,2.398 -6.889,2.398 -2.519,0 -4.816,-0.528 -6.89,-1.582 -2.077,-1.055 -3.93,-2.501 -5.564,-4.338 l -8.166,8.37 c 2.859,2.654 6.192,4.644 10.004,5.971 3.81,1.327 7.757,1.991 11.84,1.991 4.491,0 8.182,-0.562 11.075,-1.684 2.892,-1.123 5.206,-2.774 6.942,-4.951 1.734,-2.179 2.942,-4.849 3.623,-8.013 0.679,-3.164 1.02,-6.823 1.02,-10.973 V -21.742 H 3.776 Z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1570.6143,1370.4321)"
+       id="g178"><path
+         id="path180"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 c -0.75,1.088 -1.804,1.99 -3.164,2.705 -1.362,0.714 -2.825,1.072 -4.39,1.072 -3.879,0 -6.889,-1.158 -9.033,-3.471 -2.143,-2.314 -3.216,-5.343 -3.216,-9.084 0,-3.743 1.073,-6.772 3.216,-9.085 2.144,-2.314 5.154,-3.47 9.033,-3.47 1.7,0 3.164,0.373 4.39,1.123 1.225,0.748 2.278,1.633 3.164,2.653 l 10.105,-10.615 c -2.382,-2.45 -5.19,-4.169 -8.421,-5.155 -3.233,-0.986 -6.313,-1.48 -9.238,-1.48 -3.811,0 -7.4,0.613 -10.768,1.837 -3.368,1.225 -6.295,2.976 -8.779,5.257 -2.485,2.279 -4.44,5.018 -5.869,8.217 -1.428,3.198 -2.143,6.77 -2.143,10.718 0,3.945 0.715,7.518 2.143,10.717 1.429,3.198 3.384,5.936 5.869,8.217 2.484,2.28 5.411,4.032 8.779,5.257 3.368,1.225 6.957,1.837 10.768,1.837 2.925,0 6.005,-0.494 9.238,-1.479 3.231,-0.988 6.039,-2.706 8.421,-5.155 z"
+         inkscape:connector-curvature="0" /></g><g
+       transform="translate(1585.2109,1414.0176)"
+       id="g182"><path
+         id="path184"
+         style="fill:#69afd8;fill-opacity:1;fill-rule:nonzero;stroke:none"
+         d="m 0,0 h 15.311 v -47.158 l 16.944,19.598 h 18.781 l -19.7,-22.354 20.211,-27.253 H 32.255 l -16.74,25.109 H 15.311 V -77.167 H 0 Z"
+         inkscape:connector-curvature="0" /></g></g></g></g></g></svg>
\ No newline at end of file
diff --git a/ui/public/assets/success.png b/ui/public/assets/success.png
new file mode 100644
index 0000000..fdfef8c
--- /dev/null
+++ b/ui/public/assets/success.png
Binary files differ
diff --git a/ui/images/cloud.ico b/ui/public/cloud.ico
similarity index 100%
copy from ui/images/cloud.ico
copy to ui/public/cloud.ico
Binary files differ
diff --git a/ui/public/color.less b/ui/public/color.less
new file mode 100644
index 0000000..58071f0
--- /dev/null
+++ b/ui/public/color.less
@@ -0,0 +1,7700 @@
+// 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.
+@primary-color: #1890ff;
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable */
+.bezierEasingMixin() {
+  @functions: ~`(function() {
+  var NEWTON_ITERATIONS = 4;
+  var NEWTON_MIN_SLOPE = 0.001;
+  var SUBDIVISION_PRECISION = 0.0000001;
+  var SUBDIVISION_MAX_ITERATIONS = 10;
+
+  var kSplineTableSize = 11;
+  var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
+
+  var float32ArraySupported = typeof Float32Array === 'function';
+
+  function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
+  function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
+  function C (aA1)      { return 3.0 * aA1; }
+
+  // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
+  function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
+
+  // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
+  function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
+
+  function binarySubdivide (aX, aA, aB, mX1, mX2) {
+    var currentX, currentT, i = 0;
+    do {
+      currentT = aA + (aB - aA) / 2.0;
+      currentX = calcBezier(currentT, mX1, mX2) - aX;
+      if (currentX > 0.0) {
+        aB = currentT;
+      } else {
+        aA = currentT;
+      }
+    } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
+    return currentT;
+  }
+
+  function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
+   for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
+     var currentSlope = getSlope(aGuessT, mX1, mX2);
+     if (currentSlope === 0.0) {
+       return aGuessT;
+     }
+     var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
+     aGuessT -= currentX / currentSlope;
+   }
+   return aGuessT;
+  }
+
+  var BezierEasing = function (mX1, mY1, mX2, mY2) {
+    if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
+      throw new Error('bezier x values must be in [0, 1] range');
+    }
+
+    // Precompute samples table
+    var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
+    if (mX1 !== mY1 || mX2 !== mY2) {
+      for (var i = 0; i < kSplineTableSize; ++i) {
+        sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
+      }
+    }
+
+    function getTForX (aX) {
+      var intervalStart = 0.0;
+      var currentSample = 1;
+      var lastSample = kSplineTableSize - 1;
+
+      for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
+        intervalStart += kSampleStepSize;
+      }
+      --currentSample;
+
+      // Interpolate to provide an initial guess for t
+      var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
+      var guessForT = intervalStart + dist * kSampleStepSize;
+
+      var initialSlope = getSlope(guessForT, mX1, mX2);
+      if (initialSlope >= NEWTON_MIN_SLOPE) {
+        return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
+      } else if (initialSlope === 0.0) {
+        return guessForT;
+      } else {
+        return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
+      }
+    }
+
+    return function BezierEasing (x) {
+      if (mX1 === mY1 && mX2 === mY2) {
+        return x; // linear
+      }
+      // Because JavaScript number are imprecise, we should guarantee the extremes are right.
+      if (x === 0) {
+        return 0;
+      }
+      if (x === 1) {
+        return 1;
+      }
+      return calcBezier(getTForX(x), mY1, mY2);
+    };
+  };
+
+  this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18);
+  // less 3 requires a return
+  return '';
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.bezierEasingMixin();
+
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+.tinyColorMixin() {
+  @functions: ~`(function() {
+// TinyColor v1.4.1
+// https://github.com/bgrins/TinyColor
+// 2016-07-07, Brian Grinstead, MIT License
+var trimLeft = /^\s+/,
+    trimRight = /\s+$/,
+    tinyCounter = 0,
+    mathRound = Math.round,
+    mathMin = Math.min,
+    mathMax = Math.max,
+    mathRandom = Math.random;
+
+function tinycolor (color, opts) {
+
+    color = (color) ? color : '';
+    opts = opts || { };
+
+    // If input is already a tinycolor, return itself
+    if (color instanceof tinycolor) {
+       return color;
+    }
+    // If we are called as a function, call using new instead
+    if (!(this instanceof tinycolor)) {
+        return new tinycolor(color, opts);
+    }
+
+    var rgb = inputToRGB(color);
+    this._originalInput = color,
+    this._r = rgb.r,
+    this._g = rgb.g,
+    this._b = rgb.b,
+    this._a = rgb.a,
+    this._roundA = mathRound(100*this._a) / 100,
+    this._format = opts.format || rgb.format;
+    this._gradientType = opts.gradientType;
+
+    // Don't let the range of [0,255] come back in [0,1].
+    // Potentially lose a little bit of precision here, but will fix issues where
+    // .5 gets interpreted as half of the total, instead of half of 1
+    // If it was supposed to be 128, this was already taken care of by inputToRgb
+    if (this._r < 1) { this._r = mathRound(this._r); }
+    if (this._g < 1) { this._g = mathRound(this._g); }
+    if (this._b < 1) { this._b = mathRound(this._b); }
+
+    this._ok = rgb.ok;
+    this._tc_id = tinyCounter++;
+}
+
+tinycolor.prototype = {
+    isDark: function() {
+        return this.getBrightness() < 128;
+    },
+    isLight: function() {
+        return !this.isDark();
+    },
+    isValid: function() {
+        return this._ok;
+    },
+    getOriginalInput: function() {
+      return this._originalInput;
+    },
+    getFormat: function() {
+        return this._format;
+    },
+    getAlpha: function() {
+        return this._a;
+    },
+    getBrightness: function() {
+        //http://www.w3.org/TR/AERT#color-contrast
+        var rgb = this.toRgb();
+        return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
+    },
+    getLuminance: function() {
+        //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
+        var rgb = this.toRgb();
+        var RsRGB, GsRGB, BsRGB, R, G, B;
+        RsRGB = rgb.r/255;
+        GsRGB = rgb.g/255;
+        BsRGB = rgb.b/255;
+
+        if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}
+        if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}
+        if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}
+        return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);
+    },
+    setAlpha: function(value) {
+        this._a = boundAlpha(value);
+        this._roundA = mathRound(100*this._a) / 100;
+        return this;
+    },
+    toHsv: function() {
+        var hsv = rgbToHsv(this._r, this._g, this._b);
+        return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
+    },
+    toHsvString: function() {
+        var hsv = rgbToHsv(this._r, this._g, this._b);
+        var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
+        return (this._a == 1) ?
+          "hsv("  + h + ", " + s + "%, " + v + "%)" :
+          "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
+    },
+    toHsl: function() {
+        var hsl = rgbToHsl(this._r, this._g, this._b);
+        return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
+    },
+    toHslString: function() {
+        var hsl = rgbToHsl(this._r, this._g, this._b);
+        var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
+        return (this._a == 1) ?
+          "hsl("  + h + ", " + s + "%, " + l + "%)" :
+          "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
+    },
+    toHex: function(allow3Char) {
+        return rgbToHex(this._r, this._g, this._b, allow3Char);
+    },
+    toHexString: function(allow3Char) {
+        return '#' + this.toHex(allow3Char);
+    },
+    toHex8: function(allow4Char) {
+        return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
+    },
+    toHex8String: function(allow4Char) {
+        return '#' + this.toHex8(allow4Char);
+    },
+    toRgb: function() {
+        return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
+    },
+    toRgbString: function() {
+        return (this._a == 1) ?
+          "rgb("  + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
+          "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
+    },
+    toPercentageRgb: function() {
+        return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
+    },
+    toPercentageRgbString: function() {
+        return (this._a == 1) ?
+          "rgb("  + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
+          "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
+    },
+    toName: function() {
+        if (this._a === 0) {
+            return "transparent";
+        }
+
+        if (this._a < 1) {
+            return false;
+        }
+
+        return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
+    },
+    toFilter: function(secondColor) {
+        var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
+        var secondHex8String = hex8String;
+        var gradientType = this._gradientType ? "GradientType = 1, " : "";
+
+        if (secondColor) {
+            var s = tinycolor(secondColor);
+            secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
+        }
+
+        return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
+    },
+    toString: function(format) {
+        var formatSet = !!format;
+        format = format || this._format;
+
+        var formattedString = false;
+        var hasAlpha = this._a < 1 && this._a >= 0;
+        var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
+
+        if (needsAlphaFormat) {
+            // Special case for "transparent", all other non-alpha formats
+            // will return rgba when there is transparency.
+            if (format === "name" && this._a === 0) {
+                return this.toName();
+            }
+            return this.toRgbString();
+        }
+        if (format === "rgb") {
+            formattedString = this.toRgbString();
+        }
+        if (format === "prgb") {
+            formattedString = this.toPercentageRgbString();
+        }
+        if (format === "hex" || format === "hex6") {
+            formattedString = this.toHexString();
+        }
+        if (format === "hex3") {
+            formattedString = this.toHexString(true);
+        }
+        if (format === "hex4") {
+            formattedString = this.toHex8String(true);
+        }
+        if (format === "hex8") {
+            formattedString = this.toHex8String();
+        }
+        if (format === "name") {
+            formattedString = this.toName();
+        }
+        if (format === "hsl") {
+            formattedString = this.toHslString();
+        }
+        if (format === "hsv") {
+            formattedString = this.toHsvString();
+        }
+
+        return formattedString || this.toHexString();
+    },
+    clone: function() {
+        return tinycolor(this.toString());
+    },
+
+    _applyModification: function(fn, args) {
+        var color = fn.apply(null, [this].concat([].slice.call(args)));
+        this._r = color._r;
+        this._g = color._g;
+        this._b = color._b;
+        this.setAlpha(color._a);
+        return this;
+    },
+    lighten: function() {
+        return this._applyModification(lighten, arguments);
+    },
+    brighten: function() {
+        return this._applyModification(brighten, arguments);
+    },
+    darken: function() {
+        return this._applyModification(darken, arguments);
+    },
+    desaturate: function() {
+        return this._applyModification(desaturate, arguments);
+    },
+    saturate: function() {
+        return this._applyModification(saturate, arguments);
+    },
+    greyscale: function() {
+        return this._applyModification(greyscale, arguments);
+    },
+    spin: function() {
+        return this._applyModification(spin, arguments);
+    },
+
+    _applyCombination: function(fn, args) {
+        return fn.apply(null, [this].concat([].slice.call(args)));
+    },
+    analogous: function() {
+        return this._applyCombination(analogous, arguments);
+    },
+    complement: function() {
+        return this._applyCombination(complement, arguments);
+    },
+    monochromatic: function() {
+        return this._applyCombination(monochromatic, arguments);
+    },
+    splitcomplement: function() {
+        return this._applyCombination(splitcomplement, arguments);
+    },
+    triad: function() {
+        return this._applyCombination(triad, arguments);
+    },
+    tetrad: function() {
+        return this._applyCombination(tetrad, arguments);
+    }
+};
+
+// If input is an object, force 1 into "1.0" to handle ratios properly
+// String input requires "1.0" as input, so 1 will be treated as 1
+tinycolor.fromRatio = function(color, opts) {
+    if (typeof color == "object") {
+        var newColor = {};
+        for (var i in color) {
+            if (color.hasOwnProperty(i)) {
+                if (i === "a") {
+                    newColor[i] = color[i];
+                }
+                else {
+                    newColor[i] = convertToPercentage(color[i]);
+                }
+            }
+        }
+        color = newColor;
+    }
+
+    return tinycolor(color, opts);
+};
+
+// Given a string or object, convert that input to RGB
+// Possible string inputs:
+//
+//     "red"
+//     "#f00" or "f00"
+//     "#ff0000" or "ff0000"
+//     "#ff000000" or "ff000000"
+//     "rgb 255 0 0" or "rgb (255, 0, 0)"
+//     "rgb 1.0 0 0" or "rgb (1, 0, 0)"
+//     "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
+//     "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
+//     "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
+//     "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
+//     "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
+//
+function inputToRGB(color) {
+
+    var rgb = { r: 0, g: 0, b: 0 };
+    var a = 1;
+    var s = null;
+    var v = null;
+    var l = null;
+    var ok = false;
+    var format = false;
+
+    if (typeof color == "string") {
+        color = stringInputToObject(color);
+    }
+
+    if (typeof color == "object") {
+        if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
+            rgb = rgbToRgb(color.r, color.g, color.b);
+            ok = true;
+            format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
+        }
+        else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
+            s = convertToPercentage(color.s);
+            v = convertToPercentage(color.v);
+            rgb = hsvToRgb(color.h, s, v);
+            ok = true;
+            format = "hsv";
+        }
+        else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
+            s = convertToPercentage(color.s);
+            l = convertToPercentage(color.l);
+            rgb = hslToRgb(color.h, s, l);
+            ok = true;
+            format = "hsl";
+        }
+
+        if (color.hasOwnProperty("a")) {
+            a = color.a;
+        }
+    }
+
+    a = boundAlpha(a);
+
+    return {
+        ok: ok,
+        format: color.format || format,
+        r: mathMin(255, mathMax(rgb.r, 0)),
+        g: mathMin(255, mathMax(rgb.g, 0)),
+        b: mathMin(255, mathMax(rgb.b, 0)),
+        a: a
+    };
+}
+
+// Conversion Functions
+// --------------------
+
+// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from:
+// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+
+// rgbToRgb
+// Handle bounds / percentage checking to conform to CSS color spec
+// <http://www.w3.org/TR/css3-color/>
+// *Assumes:* r, g, b in [0, 255] or [0, 1]
+// *Returns:* { r, g, b } in [0, 255]
+function rgbToRgb(r, g, b){
+    return {
+        r: bound01(r, 255) * 255,
+        g: bound01(g, 255) * 255,
+        b: bound01(b, 255) * 255
+    };
+}
+
+// rgbToHsl
+// Converts an RGB color value to HSL.
+// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
+// *Returns:* { h, s, l } in [0,1]
+function rgbToHsl(r, g, b) {
+
+    r = bound01(r, 255);
+    g = bound01(g, 255);
+    b = bound01(b, 255);
+
+    var max = mathMax(r, g, b), min = mathMin(r, g, b);
+    var h, s, l = (max + min) / 2;
+
+    if(max == min) {
+        h = s = 0; // achromatic
+    }
+    else {
+        var d = max - min;
+        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+        switch(max) {
+            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+            case g: h = (b - r) / d + 2; break;
+            case b: h = (r - g) / d + 4; break;
+        }
+
+        h /= 6;
+    }
+
+    return { h: h, s: s, l: l };
+}
+
+// hslToRgb
+// Converts an HSL color value to RGB.
+// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
+// *Returns:* { r, g, b } in the set [0, 255]
+function hslToRgb(h, s, l) {
+    var r, g, b;
+
+    h = bound01(h, 360);
+    s = bound01(s, 100);
+    l = bound01(l, 100);
+
+    function hue2rgb(p, q, t) {
+        if(t < 0) t += 1;
+        if(t > 1) t -= 1;
+        if(t < 1/6) return p + (q - p) * 6 * t;
+        if(t < 1/2) return q;
+        if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
+        return p;
+    }
+
+    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 = hue2rgb(p, q, h + 1/3);
+        g = hue2rgb(p, q, h);
+        b = hue2rgb(p, q, h - 1/3);
+    }
+
+    return { r: r * 255, g: g * 255, b: b * 255 };
+}
+
+// rgbToHsv
+// Converts an RGB color value to HSV
+// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
+// *Returns:* { h, s, v } in [0,1]
+function rgbToHsv(r, g, b) {
+
+    r = bound01(r, 255);
+    g = bound01(g, 255);
+    b = bound01(b, 255);
+
+    var max = mathMax(r, g, b), min = mathMin(r, g, b);
+    var h, s, v = max;
+
+    var d = max - min;
+    s = max === 0 ? 0 : d / max;
+
+    if(max == min) {
+        h = 0; // achromatic
+    }
+    else {
+        switch(max) {
+            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+            case g: h = (b - r) / d + 2; break;
+            case b: h = (r - g) / d + 4; break;
+        }
+        h /= 6;
+    }
+    return { h: h, s: s, v: v };
+}
+
+// hsvToRgb
+// Converts an HSV color value to RGB.
+// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
+// *Returns:* { r, g, b } in the set [0, 255]
+ function hsvToRgb(h, s, v) {
+
+    h = bound01(h, 360) * 6;
+    s = bound01(s, 100);
+    v = bound01(v, 100);
+
+    var i = Math.floor(h),
+        f = h - i,
+        p = v * (1 - s),
+        q = v * (1 - f * s),
+        t = v * (1 - (1 - f) * s),
+        mod = i % 6,
+        r = [v, q, p, p, t, v][mod],
+        g = [t, v, v, q, p, p][mod],
+        b = [p, p, t, v, v, q][mod];
+
+    return { r: r * 255, g: g * 255, b: b * 255 };
+}
+
+// rgbToHex
+// Converts an RGB color to hex
+// Assumes r, g, and b are contained in the set [0, 255]
+// Returns a 3 or 6 character hex
+function rgbToHex(r, g, b, allow3Char) {
+
+    var hex = [
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16))
+    ];
+
+    // Return a 3 character hex if possible
+    if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
+        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
+    }
+
+    return hex.join("");
+}
+
+// rgbaToHex
+// Converts an RGBA color plus alpha transparency to hex
+// Assumes r, g, b are contained in the set [0, 255] and
+// a in [0, 1]. Returns a 4 or 8 character rgba hex
+function rgbaToHex(r, g, b, a, allow4Char) {
+
+    var hex = [
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16)),
+        pad2(convertDecimalToHex(a))
+    ];
+
+    // Return a 4 character hex if possible
+    if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
+        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
+    }
+
+    return hex.join("");
+}
+
+// rgbaToArgbHex
+// Converts an RGBA color to an ARGB Hex8 string
+// Rarely used, but required for "toFilter()"
+function rgbaToArgbHex(r, g, b, a) {
+
+    var hex = [
+        pad2(convertDecimalToHex(a)),
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16))
+    ];
+
+    return hex.join("");
+}
+
+// equals
+// Can be called with any tinycolor input
+tinycolor.equals = function (color1, color2) {
+    if (!color1 || !color2) { return false; }
+    return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
+};
+
+tinycolor.random = function() {
+    return tinycolor.fromRatio({
+        r: mathRandom(),
+        g: mathRandom(),
+        b: mathRandom()
+    });
+};
+
+// Modification Functions
+// ----------------------
+// Thanks to less.js for some of the basics here
+// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
+
+function desaturate(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.s -= amount / 100;
+    hsl.s = clamp01(hsl.s);
+    return tinycolor(hsl);
+}
+
+function saturate(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.s += amount / 100;
+    hsl.s = clamp01(hsl.s);
+    return tinycolor(hsl);
+}
+
+function greyscale(color) {
+    return tinycolor(color).desaturate(100);
+}
+
+function lighten (color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.l += amount / 100;
+    hsl.l = clamp01(hsl.l);
+    return tinycolor(hsl);
+}
+
+function brighten(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var rgb = tinycolor(color).toRgb();
+    rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
+    rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
+    rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
+    return tinycolor(rgb);
+}
+
+function darken (color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.l -= amount / 100;
+    hsl.l = clamp01(hsl.l);
+    return tinycolor(hsl);
+}
+
+// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
+// Values outside of this range will be wrapped into this range.
+function spin(color, amount) {
+    var hsl = tinycolor(color).toHsl();
+    var hue = (hsl.h + amount) % 360;
+    hsl.h = hue < 0 ? 360 + hue : hue;
+    return tinycolor(hsl);
+}
+
+// Combination Functions
+// ---------------------
+// Thanks to jQuery xColor for some of the ideas behind these
+// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
+
+function complement(color) {
+    var hsl = tinycolor(color).toHsl();
+    hsl.h = (hsl.h + 180) % 360;
+    return tinycolor(hsl);
+}
+
+function triad(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
+    ];
+}
+
+function tetrad(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
+    ];
+}
+
+function splitcomplement(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
+        tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
+    ];
+}
+
+function analogous(color, results, slices) {
+    results = results || 6;
+    slices = slices || 30;
+
+    var hsl = tinycolor(color).toHsl();
+    var part = 360 / slices;
+    var ret = [tinycolor(color)];
+
+    for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
+        hsl.h = (hsl.h + part) % 360;
+        ret.push(tinycolor(hsl));
+    }
+    return ret;
+}
+
+function monochromatic(color, results) {
+    results = results || 6;
+    var hsv = tinycolor(color).toHsv();
+    var h = hsv.h, s = hsv.s, v = hsv.v;
+    var ret = [];
+    var modification = 1 / results;
+
+    while (results--) {
+        ret.push(tinycolor({ h: h, s: s, v: v}));
+        v = (v + modification) % 1;
+    }
+
+    return ret;
+}
+
+// Utility Functions
+// ---------------------
+
+tinycolor.mix = function(color1, color2, amount) {
+    amount = (amount === 0) ? 0 : (amount || 50);
+
+    var rgb1 = tinycolor(color1).toRgb();
+    var rgb2 = tinycolor(color2).toRgb();
+
+    var p = amount / 100;
+
+    var rgba = {
+        r: ((rgb2.r - rgb1.r) * p) + rgb1.r,
+        g: ((rgb2.g - rgb1.g) * p) + rgb1.g,
+        b: ((rgb2.b - rgb1.b) * p) + rgb1.b,
+        a: ((rgb2.a - rgb1.a) * p) + rgb1.a
+    };
+
+    return tinycolor(rgba);
+};
+
+// Readability Functions
+// ---------------------
+// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
+
+// contrast
+// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
+tinycolor.readability = function(color1, color2) {
+    var c1 = tinycolor(color1);
+    var c2 = tinycolor(color2);
+    return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05);
+};
+
+// isReadable
+// Ensure that foreground and background color combinations meet WCAG2 guidelines.
+// The third argument is an optional Object.
+//      the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
+//      the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
+// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
+
+// *Example*
+//    tinycolor.isReadable("#000", "#111") => false
+//    tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
+tinycolor.isReadable = function(color1, color2, wcag2) {
+    var readability = tinycolor.readability(color1, color2);
+    var wcag2Parms, out;
+
+    out = false;
+
+    wcag2Parms = validateWCAG2Parms(wcag2);
+    switch (wcag2Parms.level + wcag2Parms.size) {
+        case "AAsmall":
+        case "AAAlarge":
+            out = readability >= 4.5;
+            break;
+        case "AAlarge":
+            out = readability >= 3;
+            break;
+        case "AAAsmall":
+            out = readability >= 7;
+            break;
+    }
+    return out;
+
+};
+
+// mostReadable
+// Given a base color and a list of possible foreground or background
+// colors for that base, returns the most readable color.
+// Optionally returns Black or White if the most readable color is unreadable.
+// *Example*
+//    tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
+//    tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString();  // "#ffffff"
+//    tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
+//    tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
+tinycolor.mostReadable = function(baseColor, colorList, args) {
+    var bestColor = null;
+    var bestScore = 0;
+    var readability;
+    var includeFallbackColors, level, size ;
+    args = args || {};
+    includeFallbackColors = args.includeFallbackColors ;
+    level = args.level;
+    size = args.size;
+
+    for (var i= 0; i < colorList.length ; i++) {
+        readability = tinycolor.readability(baseColor, colorList[i]);
+        if (readability > bestScore) {
+            bestScore = readability;
+            bestColor = tinycolor(colorList[i]);
+        }
+    }
+
+    if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) {
+        return bestColor;
+    }
+    else {
+        args.includeFallbackColors=false;
+        return tinycolor.mostReadable(baseColor,["#fff", "#000"],args);
+    }
+};
+
+// Big List of Colors
+// ------------------
+// <http://www.w3.org/TR/css3-color/#svg-color>
+var names = tinycolor.names = {
+    aliceblue: "f0f8ff",
+    antiquewhite: "faebd7",
+    aqua: "0ff",
+    aquamarine: "7fffd4",
+    azure: "f0ffff",
+    beige: "f5f5dc",
+    bisque: "ffe4c4",
+    black: "000",
+    blanchedalmond: "ffebcd",
+    blue: "00f",
+    blueviolet: "8a2be2",
+    brown: "a52a2a",
+    burlywood: "deb887",
+    burntsienna: "ea7e5d",
+    cadetblue: "5f9ea0",
+    chartreuse: "7fff00",
+    chocolate: "d2691e",
+    coral: "ff7f50",
+    cornflowerblue: "6495ed",
+    cornsilk: "fff8dc",
+    crimson: "dc143c",
+    cyan: "0ff",
+    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",
+    fuchsia: "f0f",
+    gainsboro: "dcdcdc",
+    ghostwhite: "f8f8ff",
+    gold: "ffd700",
+    goldenrod: "daa520",
+    gray: "808080",
+    green: "008000",
+    greenyellow: "adff2f",
+    grey: "808080",
+    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",
+    lightgray: "d3d3d3",
+    lightgreen: "90ee90",
+    lightgrey: "d3d3d3",
+    lightpink: "ffb6c1",
+    lightsalmon: "ffa07a",
+    lightseagreen: "20b2aa",
+    lightskyblue: "87cefa",
+    lightslategray: "789",
+    lightslategrey: "789",
+    lightsteelblue: "b0c4de",
+    lightyellow: "ffffe0",
+    lime: "0f0",
+    limegreen: "32cd32",
+    linen: "faf0e6",
+    magenta: "f0f",
+    maroon: "800000",
+    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",
+    navy: "000080",
+    oldlace: "fdf5e6",
+    olive: "808000",
+    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",
+    purple: "800080",
+    rebeccapurple: "663399",
+    red: "f00",
+    rosybrown: "bc8f8f",
+    royalblue: "4169e1",
+    saddlebrown: "8b4513",
+    salmon: "fa8072",
+    sandybrown: "f4a460",
+    seagreen: "2e8b57",
+    seashell: "fff5ee",
+    sienna: "a0522d",
+    silver: "c0c0c0",
+    skyblue: "87ceeb",
+    slateblue: "6a5acd",
+    slategray: "708090",
+    slategrey: "708090",
+    snow: "fffafa",
+    springgreen: "00ff7f",
+    steelblue: "4682b4",
+    tan: "d2b48c",
+    teal: "008080",
+    thistle: "d8bfd8",
+    tomato: "ff6347",
+    turquoise: "40e0d0",
+    violet: "ee82ee",
+    wheat: "f5deb3",
+    white: "fff",
+    whitesmoke: "f5f5f5",
+    yellow: "ff0",
+    yellowgreen: "9acd32"
+};
+
+// Make it easy to access colors via hexNames[hex]
+var hexNames = tinycolor.hexNames = flip(names);
+
+// Utilities
+// ---------
+
+// { 'name1': 'val1' } becomes { 'val1': 'name1' }
+function flip(o) {
+    var flipped = { };
+    for (var i in o) {
+        if (o.hasOwnProperty(i)) {
+            flipped[o[i]] = i;
+        }
+    }
+    return flipped;
+}
+
+// Return a valid alpha value [0,1] with all invalid values being set to 1
+function boundAlpha(a) {
+    a = parseFloat(a);
+
+    if (isNaN(a) || a < 0 || a > 1) {
+        a = 1;
+    }
+
+    return a;
+}
+
+// Take input from [0, n] and return it as [0, 1]
+function bound01(n, max) {
+    if (isOnePointZero(n)) { n = "100%"; }
+
+    var processPercent = isPercentage(n);
+    n = mathMin(max, mathMax(0, parseFloat(n)));
+
+    // Automatically convert percentage into number
+    if (processPercent) {
+        n = parseInt(n * max, 10) / 100;
+    }
+
+    // Handle floating point rounding errors
+    if ((Math.abs(n - max) < 0.000001)) {
+        return 1;
+    }
+
+    // Convert into [0, 1] range if it isn't already
+    return (n % max) / parseFloat(max);
+}
+
+// Force a number between 0 and 1
+function clamp01(val) {
+    return mathMin(1, mathMax(0, val));
+}
+
+// Parse a base-16 hex value into a base-10 integer
+function parseIntFromHex(val) {
+    return parseInt(val, 16);
+}
+
+// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
+// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
+function isOnePointZero(n) {
+    return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
+}
+
+// Check to see if string passed in is a percentage
+function isPercentage(n) {
+    return typeof n === "string" && n.indexOf('%') != -1;
+}
+
+// Force a hex value to have 2 characters
+function pad2(c) {
+    return c.length == 1 ? '0' + c : '' + c;
+}
+
+// Replace a decimal with it's percentage value
+function convertToPercentage(n) {
+    if (n <= 1) {
+        n = (n * 100) + "%";
+    }
+
+    return n;
+}
+
+// Converts a decimal to a hex value
+function convertDecimalToHex(d) {
+    return Math.round(parseFloat(d) * 255).toString(16);
+}
+// Converts a hex value to a decimal
+function convertHexToDecimal(h) {
+    return (parseIntFromHex(h) / 255);
+}
+
+var matchers = (function() {
+
+    // <http://www.w3.org/TR/css3-values/#integers>
+    var CSS_INTEGER = "[-\\+]?\\d+%?";
+
+    // <http://www.w3.org/TR/css3-values/#number-value>
+    var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
+
+    // Allow positive/negative integer/number.  Don't capture the either/or, just the entire outcome.
+    var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
+
+    // Actual matching.
+    // Parentheses and commas are optional, but not required.
+    // Whitespace can take the place of commas or opening paren
+    var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+    var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+
+    return {
+        CSS_UNIT: new RegExp(CSS_UNIT),
+        rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
+        rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
+        hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
+        hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
+        hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
+        hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
+        hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+        hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
+        hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+        hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
+    };
+})();
+
+// isValidCSSUnit
+// Take in a single string / number and check to see if it looks like a CSS unit
+// (see matchers above for definition).
+function isValidCSSUnit(color) {
+    return !!matchers.CSS_UNIT.exec(color);
+}
+
+// stringInputToObject
+// Permissive string parsing.  Take in a number of formats, and output an object
+// based on detected format.  Returns { r, g, b } or { h, s, l } or { h, s, v}
+function stringInputToObject(color) {
+
+    color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
+    var named = false;
+    if (names[color]) {
+        color = names[color];
+        named = true;
+    }
+    else if (color == 'transparent') {
+        return { r: 0, g: 0, b: 0, a: 0, format: "name" };
+    }
+
+    // Try to match string input using regular expressions.
+    // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
+    // Just return an object and let the conversion functions handle that.
+    // This way the result will be the same whether the tinycolor is initialized with string or object.
+    var match;
+    if ((match = matchers.rgb.exec(color))) {
+        return { r: match[1], g: match[2], b: match[3] };
+    }
+    if ((match = matchers.rgba.exec(color))) {
+        return { r: match[1], g: match[2], b: match[3], a: match[4] };
+    }
+    if ((match = matchers.hsl.exec(color))) {
+        return { h: match[1], s: match[2], l: match[3] };
+    }
+    if ((match = matchers.hsla.exec(color))) {
+        return { h: match[1], s: match[2], l: match[3], a: match[4] };
+    }
+    if ((match = matchers.hsv.exec(color))) {
+        return { h: match[1], s: match[2], v: match[3] };
+    }
+    if ((match = matchers.hsva.exec(color))) {
+        return { h: match[1], s: match[2], v: match[3], a: match[4] };
+    }
+    if ((match = matchers.hex8.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1]),
+            g: parseIntFromHex(match[2]),
+            b: parseIntFromHex(match[3]),
+            a: convertHexToDecimal(match[4]),
+            format: named ? "name" : "hex8"
+        };
+    }
+    if ((match = matchers.hex6.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1]),
+            g: parseIntFromHex(match[2]),
+            b: parseIntFromHex(match[3]),
+            format: named ? "name" : "hex"
+        };
+    }
+    if ((match = matchers.hex4.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1] + '' + match[1]),
+            g: parseIntFromHex(match[2] + '' + match[2]),
+            b: parseIntFromHex(match[3] + '' + match[3]),
+            a: convertHexToDecimal(match[4] + '' + match[4]),
+            format: named ? "name" : "hex8"
+        };
+    }
+    if ((match = matchers.hex3.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1] + '' + match[1]),
+            g: parseIntFromHex(match[2] + '' + match[2]),
+            b: parseIntFromHex(match[3] + '' + match[3]),
+            format: named ? "name" : "hex"
+        };
+    }
+
+    return false;
+}
+
+function validateWCAG2Parms(parms) {
+    // return valid WCAG2 parms for isReadable.
+    // If input parms are invalid, return {"level":"AA", "size":"small"}
+    var level, size;
+    parms = parms || {"level":"AA", "size":"small"};
+    level = (parms.level || "AA").toUpperCase();
+    size = (parms.size || "small").toLowerCase();
+    if (level !== "AA" && level !== "AAA") {
+        level = "AA";
+    }
+    if (size !== "small" && size !== "large") {
+        size = "small";
+    }
+    return {"level":level, "size":size};
+}
+
+this.tinycolor = tinycolor;
+
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.tinyColorMixin();
+
+// We create a very complex algorithm which take the place of original tint/shade color system
+// to make sure no one can understand it 👻
+// and create an entire color palette magicly by inputing just a single primary color.
+// We are using bezier-curve easing function and some color manipulations like tint/shade/darken/spin
+.colorPaletteMixin() {
+  @functions: ~`(function() {
+  var hueStep = 2;
+  var saturationStep = 16;
+  var saturationStep2 = 5;
+  var brightnessStep1 = 5;
+  var brightnessStep2 = 15;
+  var lightColorCount = 5;
+  var darkColorCount = 4;
+
+  var getHue = function(hsv, i, isLight) {
+    var hue;
+    if (hsv.h >= 60 && hsv.h <= 240) {
+      hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i;
+    } else {
+      hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i;
+    }
+    if (hue < 0) {
+      hue += 360;
+    } else if (hue >= 360) {
+      hue -= 360;
+    }
+    return Math.round(hue);
+  };
+  var getSaturation = function(hsv, i, isLight) {
+    var saturation;
+    if (isLight) {
+      saturation = Math.round(hsv.s * 100) - saturationStep * i;
+    } else if (i == darkColorCount) {
+      saturation = Math.round(hsv.s * 100) + saturationStep;
+    } else {
+      saturation = Math.round(hsv.s * 100) + saturationStep2 * i;
+    }
+    if (saturation > 100) {
+      saturation = 100;
+    }
+    if (isLight && i === lightColorCount && saturation > 10) {
+      saturation = 10;
+    }
+    if (saturation < 6) {
+      saturation = 6;
+    }
+    return Math.round(saturation);
+  };
+  var getValue = function(hsv, i, isLight) {
+    if (isLight) {
+      return Math.round(hsv.v * 100) + brightnessStep1 * i;
+    }
+    return Math.round(hsv.v * 100) - brightnessStep2 * i;
+  };
+
+  this.colorPalette = function(color, index) {
+    var isLight = index <= 6;
+    var hsv = tinycolor(color).toHsv();
+    var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1;
+    return tinycolor({
+      h: getHue(hsv, i, isLight),
+      s: getSaturation(hsv, i, isLight),
+      v: getValue(hsv, i, isLight),
+    }).toHexString();
+  };
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.colorPaletteMixin();
+
+// color palettes
+@blue-1: color(~`colorPalette("@{blue-6}", 1)`);
+@blue-2: color(~`colorPalette("@{blue-6}", 2)`);
+@blue-3: color(~`colorPalette("@{blue-6}", 3)`);
+@blue-4: color(~`colorPalette("@{blue-6}", 4)`);
+@blue-5: color(~`colorPalette("@{blue-6}", 5)`);
+@blue-6: #1890ff;
+@blue-7: color(~`colorPalette("@{blue-6}", 7)`);
+@blue-8: color(~`colorPalette("@{blue-6}", 8)`);
+@blue-9: color(~`colorPalette("@{blue-6}", 9)`);
+@blue-10: color(~`colorPalette("@{blue-6}", 10)`);
+
+@purple-1: color(~`colorPalette("@{purple-6}", 1)`);
+@purple-2: color(~`colorPalette("@{purple-6}", 2)`);
+@purple-3: color(~`colorPalette("@{purple-6}", 3)`);
+@purple-4: color(~`colorPalette("@{purple-6}", 4)`);
+@purple-5: color(~`colorPalette("@{purple-6}", 5)`);
+@purple-6: #722ed1;
+@purple-7: color(~`colorPalette("@{purple-6}", 7)`);
+@purple-8: color(~`colorPalette("@{purple-6}", 8)`);
+@purple-9: color(~`colorPalette("@{purple-6}", 9)`);
+@purple-10: color(~`colorPalette("@{purple-6}", 10)`);
+
+@cyan-1: color(~`colorPalette("@{cyan-6}", 1)`);
+@cyan-2: color(~`colorPalette("@{cyan-6}", 2)`);
+@cyan-3: color(~`colorPalette("@{cyan-6}", 3)`);
+@cyan-4: color(~`colorPalette("@{cyan-6}", 4)`);
+@cyan-5: color(~`colorPalette("@{cyan-6}", 5)`);
+@cyan-6: #13c2c2;
+@cyan-7: color(~`colorPalette("@{cyan-6}", 7)`);
+@cyan-8: color(~`colorPalette("@{cyan-6}", 8)`);
+@cyan-9: color(~`colorPalette("@{cyan-6}", 9)`);
+@cyan-10: color(~`colorPalette("@{cyan-6}", 10)`);
+
+@green-1: color(~`colorPalette("@{green-6}", 1)`);
+@green-2: color(~`colorPalette("@{green-6}", 2)`);
+@green-3: color(~`colorPalette("@{green-6}", 3)`);
+@green-4: color(~`colorPalette("@{green-6}", 4)`);
+@green-5: color(~`colorPalette("@{green-6}", 5)`);
+@green-6: #52c41a;
+@green-7: color(~`colorPalette("@{green-6}", 7)`);
+@green-8: color(~`colorPalette("@{green-6}", 8)`);
+@green-9: color(~`colorPalette("@{green-6}", 9)`);
+@green-10: color(~`colorPalette("@{green-6}", 10)`);
+
+@magenta-1: color(~`colorPalette("@{magenta-6}", 1)`);
+@magenta-2: color(~`colorPalette("@{magenta-6}", 2)`);
+@magenta-3: color(~`colorPalette("@{magenta-6}", 3)`);
+@magenta-4: color(~`colorPalette("@{magenta-6}", 4)`);
+@magenta-5: color(~`colorPalette("@{magenta-6}", 5)`);
+@magenta-6: #eb2f96;
+@magenta-7: color(~`colorPalette("@{magenta-6}", 7)`);
+@magenta-8: color(~`colorPalette("@{magenta-6}", 8)`);
+@magenta-9: color(~`colorPalette("@{magenta-6}", 9)`);
+@magenta-10: color(~`colorPalette("@{magenta-6}", 10)`);
+
+// alias of magenta
+@pink-1: color(~`colorPalette("@{pink-6}", 1)`);
+@pink-2: color(~`colorPalette("@{pink-6}", 2)`);
+@pink-3: color(~`colorPalette("@{pink-6}", 3)`);
+@pink-4: color(~`colorPalette("@{pink-6}", 4)`);
+@pink-5: color(~`colorPalette("@{pink-6}", 5)`);
+@pink-6: #eb2f96;
+@pink-7: color(~`colorPalette("@{pink-6}", 7)`);
+@pink-8: color(~`colorPalette("@{pink-6}", 8)`);
+@pink-9: color(~`colorPalette("@{pink-6}", 9)`);
+@pink-10: color(~`colorPalette("@{pink-6}", 10)`);
+
+@red-1: color(~`colorPalette("@{red-6}", 1)`);
+@red-2: color(~`colorPalette("@{red-6}", 2)`);
+@red-3: color(~`colorPalette("@{red-6}", 3)`);
+@red-4: color(~`colorPalette("@{red-6}", 4)`);
+@red-5: color(~`colorPalette("@{red-6}", 5)`);
+@red-6: #f5222d;
+@red-7: color(~`colorPalette("@{red-6}", 7)`);
+@red-8: color(~`colorPalette("@{red-6}", 8)`);
+@red-9: color(~`colorPalette("@{red-6}", 9)`);
+@red-10: color(~`colorPalette("@{red-6}", 10)`);
+
+@orange-1: color(~`colorPalette("@{orange-6}", 1)`);
+@orange-2: color(~`colorPalette("@{orange-6}", 2)`);
+@orange-3: color(~`colorPalette("@{orange-6}", 3)`);
+@orange-4: color(~`colorPalette("@{orange-6}", 4)`);
+@orange-5: color(~`colorPalette("@{orange-6}", 5)`);
+@orange-6: #fa8c16;
+@orange-7: color(~`colorPalette("@{orange-6}", 7)`);
+@orange-8: color(~`colorPalette("@{orange-6}", 8)`);
+@orange-9: color(~`colorPalette("@{orange-6}", 9)`);
+@orange-10: color(~`colorPalette("@{orange-6}", 10)`);
+
+@yellow-1: color(~`colorPalette("@{yellow-6}", 1)`);
+@yellow-2: color(~`colorPalette("@{yellow-6}", 2)`);
+@yellow-3: color(~`colorPalette("@{yellow-6}", 3)`);
+@yellow-4: color(~`colorPalette("@{yellow-6}", 4)`);
+@yellow-5: color(~`colorPalette("@{yellow-6}", 5)`);
+@yellow-6: #fadb14;
+@yellow-7: color(~`colorPalette("@{yellow-6}", 7)`);
+@yellow-8: color(~`colorPalette("@{yellow-6}", 8)`);
+@yellow-9: color(~`colorPalette("@{yellow-6}", 9)`);
+@yellow-10: color(~`colorPalette("@{yellow-6}", 10)`);
+
+@volcano-1: color(~`colorPalette("@{volcano-6}", 1)`);
+@volcano-2: color(~`colorPalette("@{volcano-6}", 2)`);
+@volcano-3: color(~`colorPalette("@{volcano-6}", 3)`);
+@volcano-4: color(~`colorPalette("@{volcano-6}", 4)`);
+@volcano-5: color(~`colorPalette("@{volcano-6}", 5)`);
+@volcano-6: #fa541c;
+@volcano-7: color(~`colorPalette("@{volcano-6}", 7)`);
+@volcano-8: color(~`colorPalette("@{volcano-6}", 8)`);
+@volcano-9: color(~`colorPalette("@{volcano-6}", 9)`);
+@volcano-10: color(~`colorPalette("@{volcano-6}", 10)`);
+
+@geekblue-1: color(~`colorPalette("@{geekblue-6}", 1)`);
+@geekblue-2: color(~`colorPalette("@{geekblue-6}", 2)`);
+@geekblue-3: color(~`colorPalette("@{geekblue-6}", 3)`);
+@geekblue-4: color(~`colorPalette("@{geekblue-6}", 4)`);
+@geekblue-5: color(~`colorPalette("@{geekblue-6}", 5)`);
+@geekblue-6: #2f54eb;
+@geekblue-7: color(~`colorPalette("@{geekblue-6}", 7)`);
+@geekblue-8: color(~`colorPalette("@{geekblue-6}", 8)`);
+@geekblue-9: color(~`colorPalette("@{geekblue-6}", 9)`);
+@geekblue-10: color(~`colorPalette("@{geekblue-6}", 10)`);
+
+@lime-1: color(~`colorPalette("@{lime-6}", 1)`);
+@lime-2: color(~`colorPalette("@{lime-6}", 2)`);
+@lime-3: color(~`colorPalette("@{lime-6}", 3)`);
+@lime-4: color(~`colorPalette("@{lime-6}", 4)`);
+@lime-5: color(~`colorPalette("@{lime-6}", 5)`);
+@lime-6: #a0d911;
+@lime-7: color(~`colorPalette("@{lime-6}", 7)`);
+@lime-8: color(~`colorPalette("@{lime-6}", 8)`);
+@lime-9: color(~`colorPalette("@{lime-6}", 9)`);
+@lime-10: color(~`colorPalette("@{lime-6}", 10)`);
+
+@gold-1: color(~`colorPalette("@{gold-6}", 1)`);
+@gold-2: color(~`colorPalette("@{gold-6}", 2)`);
+@gold-3: color(~`colorPalette("@{gold-6}", 3)`);
+@gold-4: color(~`colorPalette("@{gold-6}", 4)`);
+@gold-5: color(~`colorPalette("@{gold-6}", 5)`);
+@gold-6: #faad14;
+@gold-7: color(~`colorPalette("@{gold-6}", 7)`);
+@gold-8: color(~`colorPalette("@{gold-6}", 8)`);
+@gold-9: color(~`colorPalette("@{gold-6}", 9)`);
+@gold-10: color(~`colorPalette("@{gold-6}", 10)`);
+
+// The prefix to use on all css classes from ant.
+@ant-prefix             : ant;
+
+// -------- Colors -----------
+
+@info-color             : @blue-6;
+@success-color          : @green-6;
+@processing-color       : @blue-6;
+@error-color            : @red-6;
+@highlight-color        : @red-6;
+@warning-color          : @gold-6;
+@normal-color           : #d9d9d9;
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: color(~`colorPalette("@{primary-color}", 1)`);  // replace tint(@primary-color, 90%)
+@primary-2: color(~`colorPalette("@{primary-color}", 2)`);  // replace tint(@primary-color, 80%)
+@primary-3: color(~`colorPalette("@{primary-color}", 3)`);  // unused
+@primary-4: color(~`colorPalette("@{primary-color}", 4)`);  // unused
+@primary-5: color(~`colorPalette("@{primary-color}", 5)`);  // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%)
+@primary-6: @primary-color;                                 // color used to control the text color of active buttons, don't use, use @primary-color
+@primary-7: color(~`colorPalette("@{primary-color}", 7)`);  // replace shade(@primary-color, 5%)
+@primary-8: color(~`colorPalette("@{primary-color}", 8)`);  // unused
+@primary-9: color(~`colorPalette("@{primary-color}", 9)`);  // unused
+@primary-10: color(~`colorPalette("@{primary-color}", 10)`);  // unused
+
+// Base Scaffolding Variables
+// ---
+
+// Background color for `<body>`
+@body-background        : #fff;
+// Base background color for most components
+@component-background   : #fff;
+@font-family  : "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif,
+"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+@code-family            : "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
+@heading-color          : fade(#000, 85%);
+@text-color             : fade(#000, 65%);
+@text-color-secondary   : fade(#000, 45%);
+@heading-color-dark     : fade(#fff, 100%);
+@text-color-dark        : fade(#fff, 85%);
+@text-color-secondary-dark: fade(#fff, 65%);
+@font-size-base         : 14px;
+@font-size-lg           : @font-size-base + 2px;
+@font-size-sm           : 12px;
+@line-height-base       : 1.5;
+@border-radius-base     : 4px;
+@border-radius-sm       : 2px;
+
+// vertical paddings
+@padding-lg    : 24px; // containers
+@padding-md    : 16px; // small containers and buttons
+@padding-sm    : 12px; // Form controls and items
+@padding-xs    : 8px;  // small items
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @padding-xs;
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg         : @primary-1;
+@item-hover-bg          : @primary-1;
+
+// ICONFONT
+@iconfont-css-prefix    : anticon;
+
+// LINK
+@link-color             : @primary-color;
+@link-hover-color       : color(~`colorPalette("@{link-color}", 5)`);
+@link-active-color      : color(~`colorPalette("@{link-color}", 7)`);
+@link-decoration        : none;
+@link-hover-decoration  : none;
+
+// Animation
+@ease-base-out       : cubic-bezier(0.7, 0.3, 0.1, 1);
+@ease-base-in        : cubic-bezier(0.9, 0, 0.3, 0.7);
+@ease-out            : cubic-bezier(0.215, 0.61, 0.355, 1);
+@ease-in             : cubic-bezier(0.55, 0.055, 0.675, 0.19);
+@ease-in-out         : cubic-bezier(0.645, 0.045, 0.355, 1);
+@ease-out-back       : cubic-bezier(0.12, 0.4, 0.29, 1.46);
+@ease-in-back        : cubic-bezier(0.71, -0.46, 0.88, 0.6);
+@ease-in-out-back    : cubic-bezier(0.71, -0.46, 0.29, 1.46);
+@ease-out-circ       : cubic-bezier(0.08, 0.82, 0.17, 1);
+@ease-in-circ        : cubic-bezier(0.6, 0.04, 0.98, 0.34);
+@ease-in-out-circ    : cubic-bezier(0.78, 0.14, 0.15, 0.86);
+@ease-out-quint      : cubic-bezier(0.23, 1, 0.32, 1);
+@ease-in-quint       : cubic-bezier(0.755, 0.05, 0.855, 0.06);
+@ease-in-out-quint   : cubic-bezier(0.86, 0, 0.07, 1);
+
+// Border color
+@border-color-base      : hsv(0, 0, 85%);  // base border outline a component
+@border-color-split     : hsv(0, 0, 91%);  // split border inside a component
+@border-width-base      : 1px;            // width of the border for a component
+@border-style-base      : solid;          // style of a components border
+
+// Outline
+@outline-blur-size      : 0;
+@outline-width          : 2px;
+@outline-color          : @primary-color;
+
+@background-color-light : hsv(0, 0, 98%);  // background of header and selected item
+@background-color-base  : hsv(0, 0, 96%);  // Default grey background color
+
+// Disabled states
+@disabled-color         : fade(#000, 25%);
+@disabled-bg            : @background-color-base;
+@disabled-color-dark    : fade(#fff, 35%);
+
+// Shadow
+@shadow-color           : rgba(0, 0, 0, .15);
+@box-shadow-base        : @shadow-1-down;
+@shadow-1-up            : 0 -2px 8px @shadow-color;
+@shadow-1-down          : 0 2px 8px @shadow-color;
+@shadow-1-left          : -2px 0 8px @shadow-color;
+@shadow-1-right         : 2px 0 8px @shadow-color;
+@shadow-2               : 0 4px 12px @shadow-color;
+
+// Buttons
+@btn-font-weight        : 400;
+@btn-border-radius-base : @border-radius-base;
+@btn-border-radius-sm   : @border-radius-base;
+
+@btn-primary-color      : #fff;
+@btn-primary-bg         : @primary-color;
+
+@btn-default-color      : @text-color;
+@btn-default-bg         : #fff;
+@btn-default-border     : @border-color-base;
+
+@btn-danger-color       : @error-color;
+@btn-danger-bg          : @background-color-base;
+@btn-danger-border      : @border-color-base;
+
+@btn-disable-color      : @disabled-color;
+@btn-disable-bg         : @disabled-bg;
+@btn-disable-border     : @border-color-base;
+
+@btn-padding-base       : 0 @padding-md - 1px;
+@btn-font-size-lg       : @font-size-lg;
+@btn-font-size-sm       : @font-size-base;
+@btn-padding-lg         : @btn-padding-base;
+@btn-padding-sm         : 0 @padding-xs - 1px;
+
+@btn-height-base        : 32px;
+@btn-height-lg          : 40px;
+@btn-height-sm          : 24px;
+
+@btn-circle-size        : @btn-height-base;
+@btn-circle-size-lg     : @btn-height-lg;
+@btn-circle-size-sm     : @btn-height-sm;
+
+@btn-group-border       : @primary-5;
+
+// Checkbox
+@checkbox-size          : 16px;
+@checkbox-color         : @primary-color;
+@checkbox-check-color   : #fff;
+
+// Radio
+@radio-size             : 16px;
+@radio-dot-color        : @primary-color;
+
+// Radio buttons
+@radio-button-bg           : @btn-default-bg;
+@radio-button-color        : @btn-default-color;
+@radio-button-hover-color  : @primary-5;
+@radio-button-active-color : @primary-7;
+
+// Media queries breakpoints
+// Extra small screen / phone
+@screen-xs              : 480px;
+@screen-xs-min          : @screen-xs;
+
+// Small screen / tablet
+@screen-sm              : 576px;
+@screen-sm-min          : @screen-sm;
+
+// Medium screen / desktop
+@screen-md              : 768px;
+@screen-md-min          : @screen-md;
+
+// Large screen / wide desktop
+@screen-lg              : 992px;
+@screen-lg-min          : @screen-lg;
+
+// Extra large screen / full hd
+@screen-xl              : 1200px;
+@screen-xl-min          : @screen-xl;
+
+// Extra extra large screen / large descktop
+@screen-xxl              : 1600px;
+@screen-xxl-min          : @screen-xxl;
+
+// provide a maximum
+@screen-xs-max          : (@screen-sm-min - 1px);
+@screen-sm-max          : (@screen-md-min - 1px);
+@screen-md-max          : (@screen-lg-min - 1px);
+@screen-lg-max          : (@screen-xl-min - 1px);
+@screen-xl-max          : (@screen-xxl-min - 1px);
+
+// Grid system
+@grid-columns           : 24;
+@grid-gutter-width      : 0;
+
+// Layout
+@layout-body-background         : #f0f2f5;
+@layout-header-background       : #001529;
+@layout-footer-background       : @layout-body-background;
+@layout-header-height           : 64px;
+@layout-header-padding          : 0 50px;
+@layout-footer-padding          : 24px 50px;
+@layout-sider-background        : @layout-header-background;
+@layout-trigger-height          : 48px;
+@layout-trigger-background      : #002140;
+@layout-trigger-color           : #fff;
+@layout-zero-trigger-width      : 36px;
+@layout-zero-trigger-height     : 42px;
+// Layout light theme
+@layout-sider-background-light  : #fff;
+@layout-trigger-background-light: #fff;
+@layout-trigger-color-light     : @text-color;
+
+// z-index list
+@zindex-affix           : 10;
+@zindex-back-top        : 10;
+@zindex-modal-mask      : 1000;
+@zindex-modal           : 1000;
+@zindex-notification    : 1010;
+@zindex-message         : 1010;
+@zindex-popover         : 1030;
+@zindex-picker          : 1050;
+@zindex-dropdown        : 1050;
+@zindex-tooltip         : 1060;
+
+// Animation
+@animation-duration-slow: .3s; // Modal
+@animation-duration-base: .2s;
+@animation-duration-fast: .1s; // Tooltip
+
+// Form
+// ---
+@label-required-color        : @highlight-color;
+@label-color                 : @heading-color;
+@form-item-margin-bottom     : 24px;
+@form-item-trailing-colon    : true;
+@form-vertical-label-padding : 0 0 8px;
+@form-vertical-label-margin  : 0;
+
+// Input
+// ---
+@input-height-base           : 32px;
+@input-height-lg             : 40px;
+@input-height-sm             : 24px;
+@input-padding-horizontal    : @control-padding-horizontal - 1px;
+@input-padding-horizontal-base: @input-padding-horizontal;
+@input-padding-horizontal-sm : @control-padding-horizontal-sm - 1px;
+@input-padding-horizontal-lg : @input-padding-horizontal;
+@input-padding-vertical-base : 4px;
+@input-padding-vertical-sm   : 1px;
+@input-padding-vertical-lg   : 6px;
+@input-placeholder-color     : hsv(0, 0, 75%);
+@input-color                 : @text-color;
+@input-border-color          : @border-color-base;
+@input-bg                    : #fff;
+@input-addon-bg              : @background-color-light;
+@input-hover-border-color    : @primary-color;
+@input-disabled-bg           : @disabled-bg;
+@input-outline-offset        : 0 0;
+
+// Tooltip
+// ---
+//* Tooltip max width
+@tooltip-max-width: 250px;
+//** Tooltip text color
+@tooltip-color: #fff;
+//** Tooltip background color
+@tooltip-bg: rgba(0, 0, 0, .75);
+//** Tooltip arrow width
+@tooltip-arrow-width: 5px;
+//** Tooltip distance with trigger
+@tooltip-distance: @tooltip-arrow-width - 1px + 4px;
+//** Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+
+// Popover
+// ---
+//** Popover body background color
+@popover-bg: #fff;
+//** Popover text color
+@popover-color: @text-color;
+//** Popover maximum width
+@popover-min-width: 177px;
+//** Popover arrow width
+@popover-arrow-width: 6px;
+//** Popover arrow color
+@popover-arrow-color: @popover-bg;
+//** Popover outer arrow width
+//** Popover outer arrow color
+@popover-arrow-outer-color: @popover-bg;
+//** Popover distance with trigger
+@popover-distance: @popover-arrow-width + 4px;
+
+// Modal
+// --
+@modal-mask-bg: rgba(0, 0, 0, 0.65);
+
+// Progress
+// --
+@progress-default-color: @processing-color;
+@progress-remaining-color: @background-color-base;
+@progress-text-color: @text-color;
+
+// Menu
+// ---
+@menu-inline-toplevel-item-height: 40px;
+@menu-item-height: 40px;
+@menu-collapsed-width: 80px;
+@menu-bg: @component-background;
+@menu-item-color: @text-color;
+@menu-highlight-color: @primary-color;
+@menu-item-active-bg: @item-active-bg;
+@menu-item-active-border-width: 3px;
+@menu-item-group-title-color: @text-color-secondary;
+// dark theme
+@menu-dark-color: @text-color-secondary-dark;
+@menu-dark-bg: @layout-header-background;
+@menu-dark-arrow-color: #fff;
+@menu-dark-submenu-bg: #000c17;
+@menu-dark-highlight-color: #fff;
+@menu-dark-item-active-bg: @primary-color;
+
+// Spin
+// ---
+@spin-dot-size-sm: 14px;
+@spin-dot-size: 20px;
+@spin-dot-size-lg: 32px;
+
+// Table
+// --
+@table-header-bg: @background-color-light;
+@table-header-color: @heading-color;
+@table-header-sort-bg: @background-color-base;
+@table-body-sort-bg: rgba(0, 0, 0, .01);
+@table-row-hover-bg: @primary-1;
+@table-selected-row-bg: #fafafa;
+@table-expanded-row-bg: #fbfbfb;
+@table-padding-vertical: 16px;
+@table-padding-horizontal: 16px;
+
+// Tag
+// --
+@tag-default-bg: @background-color-light;
+@tag-default-color: @text-color;
+@tag-font-size: @font-size-sm;
+
+// TimePicker
+// ---
+@time-picker-panel-column-width: 56px;
+@time-picker-panel-width: @time-picker-panel-column-width * 3;
+@time-picker-selected-bg: @background-color-base;
+
+// Carousel
+// ---
+@carousel-dot-width: 16px;
+@carousel-dot-height: 3px;
+@carousel-dot-active-width: 24px;
+
+// Badge
+// ---
+@badge-height: 20px;
+@badge-dot-size: 6px;
+@badge-font-size: @font-size-sm;
+@badge-font-weight: normal;
+@badge-status-size: 6px;
+
+// Rate
+// ---
+@rate-star-color: @yellow-6;
+@rate-star-bg: @border-color-split;
+
+// Card
+// ---
+@card-head-color: @heading-color;
+@card-head-background: transparent;
+@card-head-padding: 16px;
+@card-inner-head-padding: 12px;
+@card-padding-base: 24px;
+@card-padding-wider: 32px;
+@card-actions-background: @background-color-light;
+@card-shadow: 0 2px 8px rgba(0, 0, 0, .09);
+
+// Tabs
+// ---
+@tabs-card-head-background: @background-color-light;
+@tabs-card-height: 40px;
+@tabs-card-active-color: @primary-color;
+@tabs-title-font-size: @font-size-base;
+@tabs-title-font-size-lg: @font-size-lg;
+@tabs-title-font-size-sm: @font-size-base;
+@tabs-ink-bar-color: @primary-color;
+@tabs-bar-margin: 0 0 16px 0;
+@tabs-horizontal-margin: 0 32px 0 0;
+@tabs-horizontal-padding: 12px 16px;
+@tabs-vertical-padding: 8px 24px;
+@tabs-vertical-margin: 0 0 16px 0;
+@tabs-scrolling-size: 32px;
+@tabs-highlight-color: @primary-color;
+@tabs-hover-color: @primary-5;
+@tabs-active-color: @primary-7;
+
+// BackTop
+// ---
+@back-top-color: #fff;
+@back-top-bg: @text-color-secondary;
+@back-top-hover-bg: @text-color;
+
+// Avatar
+// ---
+@avatar-size-base: 32px;
+@avatar-size-lg: 40px;
+@avatar-size-sm: 24px;
+@avatar-font-size-base: 18px;
+@avatar-font-size-lg: 24px;
+@avatar-font-size-sm: 14px;
+@avatar-bg: #ccc;
+@avatar-color: #fff;
+@avatar-border-radius: @border-radius-base;
+
+// Switch
+// ---
+@switch-height: 22px;
+@switch-sm-height: 16px;
+@switch-sm-checked-margin-left: -(@switch-sm-height - 3px);
+@switch-disabled-opacity: 0.4;
+@switch-color: @primary-color;
+
+// Pagination
+// ---
+@pagination-item-size: 32px;
+@pagination-item-size-sm: 24px;
+@pagination-font-family: Arial;
+@pagination-font-weight-active: 500;
+
+// Breadcrumb
+// ---
+@breadcrumb-base-color:        @text-color-secondary;
+@breadcrumb-last-item-color:   @text-color;
+@breadcrumb-font-size:         @font-size-base;
+@breadcrumb-icon-font-size:    @font-size-base;
+@breadcrumb-link-color:        @text-color-secondary;
+@breadcrumb-link-color-hover:  @primary-5;
+@breadcrumb-separator-color:   @text-color-secondary;
+@breadcrumb-separator-margin:  0 @padding-xs;
+
+// Slider
+// ---
+@slider-margin:                       14px 6px 10px;
+@slider-rail-background-color:        @background-color-base;
+@slider-rail-background-color-hover:  #e1e1e1;
+@slider-track-background-color:       @primary-3;
+@slider-track-background-color-hover: @primary-4;
+@slider-handle-color:                 @primary-3;
+@slider-handle-color-hover:           @primary-4;
+@slider-handle-color-focus:           tint(@primary-color, 20%);
+@slider-handle-color-focus-shadow:    tint(@primary-color, 50%);
+@slider-handle-color-tooltip-open:    @primary-color;
+@slider-dot-border-color:             @border-color-split;
+@slider-dot-border-color-active:      tint(@primary-color, 50%);
+@slider-disabled-color:               @disabled-color;
+@slider-disabled-background-color:    @component-background;
+
+// Tree
+// ---
+@tree-title-height:                   24px;
+@tree-child-padding:                  18px;
+@tree-directory-selected-color:       #fff;
+@tree-directory-selected-bg:          @primary-color;
+
+// Collapse
+// ---
+@collapse-header-padding:             12px 0 12px 40px;
+@collapse-header-bg:                  @background-color-light;
+@collapse-content-padding:            @padding-md;
+@collapse-content-bg:                 @component-background;
+
+// Skeleton
+// ---
+@skeleton-color:                      #f2f2f2;
+
+// Transfer
+// ---
+@transfer-disabled-bg:                @disabled-bg;
+
+// Message
+// ---
+@message-notice-content-padding:      10px 16px;
+
+// Motion
+// ---
+@wave-animation-width: 6px;
+
+// Alert
+// ---
+@alert-success-border-color: ~`colorPalette("@{success-color}", 3)`;
+@alert-success-bg-color: ~`colorPalette("@{success-color}", 1)`;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: ~`colorPalette("@{info-color}", 3)`;
+@alert-info-bg-color: ~`colorPalette("@{info-color}", 1)`;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: ~`colorPalette("@{warning-color}", 3)`;
+@alert-warning-bg-color: ~`colorPalette("@{warning-color}", 1)`;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: ~`colorPalette("@{error-color}", 3)`;
+@alert-error-bg-color: ~`colorPalette("@{error-color}", 1)`;
+@alert-error-icon-color: @error-color;
+
+// List
+// ---
+@list-empty-text-padding:                    @padding-md;
+@list-item-padding:                          @padding-sm 0;
+@list-item-content-margin:                   0 0 @padding-md 0;
+@list-item-meta-margin-bottom:               @padding-md;
+@list-item-meta-avatar-margin-right:         @padding-md;
+@list-item-meta-title-margin-bottom:         @padding-sm;
+
+// Menu
+@menu-dark-item-selected-bg: @menu-dark-item-active-bg;
+
+// Tabs
+@tab-bar-margin: @tabs-bar-margin;
+@tab-horizontal-margin: @tabs-horizontal-margin;
+@tab-vertical-margin: @tabs-vertical-margin;
+@tab-horizontal-padding: @tabs-horizontal-padding;
+@tab-vertical-padding: @tabs-vertical-padding;
+@tab-scrolling-size: @tabs-scrolling-size;
+@tab-highlight-color: @tabs-highlight-color;
+@tab-hover-color: @tabs-hover-color;
+@tab-active-color: @tabs-active-color;
+@tabs-ink-bar-bg-color: @tabs-ink-bar-color;
+
+.listContent .extra {
+  color: rgba(0, 0, 0, 0.45);
+}
+.listContent .extra > em {
+  color: rgba(0, 0, 0, 0.25);
+}
+.avatarItem :global .ant-avatar {
+  border: 1px solid #fff;
+}
+.chartCard .avatar img {
+  border-radius: 100%;
+}
+.chartCard .meta {
+  color: rgba(0, 0, 0, 0.45);
+}
+.chartCard .total {
+  color: rgba(0, 0, 0, 0.85);
+}
+.chartCard .footer {
+  border-top: 1px solid #e8e8e8;
+}
+.field span:last-child {
+  color: rgba(0, 0, 0, 0.85);
+}
+.miniProgress .progressWrap {
+  background-color: #f5f5f5;
+}
+.miniProgress .progress {
+  border-radius: 1px 0 0 1px;
+  background-color: @primary-color;
+}
+.miniProgress .target span {
+  border-radius: 100px;
+}
+.pie .dot {
+  border-radius: 8px;
+}
+.pie .line {
+  background-color: #e8e8e8;
+}
+.pie .legendTitle {
+  color: rgba(0, 0, 0, 0.65);
+}
+.pie .percent {
+  color: rgba(0, 0, 0, 0.45);
+}
+.pie .total > h4 {
+  color: rgba(0, 0, 0, 0.45);
+}
+.pie .total > p {
+  color: rgba(0, 0, 0, 0.85);
+}
+.radar .legend .legendItem {
+  color: rgba(0, 0, 0, 0.45);
+}
+.radar .legend .legendItem h6 {
+  color: rgba(0, 0, 0, 0.85);
+}
+.radar .legend .legendItem:after {
+  background-color: #e8e8e8;
+}
+.radar .legend .dot {
+  border-radius: 6px;
+}
+
+.timelineChart {
+  background: #fff;
+}
+.waterWave .text span {
+  color: rgba(0, 0, 0, 0.45);
+}
+.waterWave .text h4 {
+  color: rgba(0, 0, 0, 0.85);
+}
+.descriptionList .title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.descriptionList .term {
+  color: rgba(0, 0, 0, 0.85);
+}
+.descriptionList .detail {
+  color: rgba(0, 0, 0, 0.65);
+}
+.descriptionList.small .title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.linkGroup > a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.linkGroup > a:hover {
+  color: @primary-color;
+}
+.lines .shadow {
+  color: transparent;
+}
+.exception .imgEle {
+  background-repeat: no-repeat;
+  background-position: 50% 50%;
+  background-size: contain;
+}
+.exception .content h1 {
+  color: #434e59;
+}
+.exception .content .desc {
+  color: rgba(0, 0, 0, 0.45);
+}
+.toolbar {
+  box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03);
+  background: #fff;
+  border-top: 1px solid #e8e8e8;
+}
+.globalFooter .links a {
+  color: rgba(0, 0, 0, 0.45);
+}
+.globalFooter .links a:hover {
+  color: rgba(0, 0, 0, 0.65);
+}
+.globalFooter .copyright {
+  color: rgba(0, 0, 0, 0.45);
+}
+.header {
+  background: #fff;
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+}
+i.trigger:hover {
+  background: rgba(0, 0, 0, 0.025);
+}
+.right .action > i {
+  color: rgba(0, 0, 0, 0.65);
+}
+.right .action:hover {
+  background: rgba(0, 0, 0, 0.025);
+}
+:global(.right .action.ant-popover-open) {
+  background: rgba(0, 0, 0, 0.025);
+}
+.right .search:hover {
+  background: transparent;
+}
+.right .account .avatar {
+  color: @primary-color;
+  background: rgba(255, 255, 255, 0.85);
+}
+.dark .action {
+  color: rgba(255, 255, 255, 0.85);
+}
+.dark .action > i {
+  color: rgba(255, 255, 255, 0.85);
+}
+.dark .action:hover,
+.dark .action:global(.ant-popover-open) {
+  background: @primary-color;
+}
+.dark .action :global(.ant-badge) {
+  color: rgba(255, 255, 255, 0.85);
+}
+.headerSearch .input {
+  background: transparent;
+  border-radius: 0;
+}
+.headerSearch .input :global(.ant-select-selection) {
+  background: transparent;
+}
+.headerSearch .input input {
+  border: 0;
+  box-shadow: none !important;
+}
+.headerSearch .input,
+.headerSearch .input:hover,
+.headerSearch .input:focus {
+  border-bottom: 1px solid #d9d9d9;
+}
+.login :global .ant-tabs .ant-tabs-bar {
+  border-bottom: 0;
+}
+.login .icon {
+  color: rgba(0, 0, 0, 0.2);
+}
+.login .icon:hover {
+  color: @primary-color;
+}
+.login .prefixIcon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.list .item .avatar {
+  background: #fff;
+}
+.list .item:last-child {
+  border-bottom: 0;
+}
+.list .item:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.list .item .extra {
+  color: rgba(0, 0, 0, 0.45);
+}
+.notFound {
+  color: rgba(0, 0, 0, 0.45);
+}
+.clear {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 0 0 4px 4px;
+  border-top: 1px solid #e8e8e8;
+}
+.clear:hover {
+  color: rgba(0, 0, 0, 0.85);
+}
+.numberInfo .suffix {
+  color: rgba(0, 0, 0, 0.65);
+}
+.numberInfo .numberInfoTitle {
+  color: rgba(0, 0, 0, 0.65);
+}
+.numberInfo .numberInfoSubTitle {
+  color: rgba(0, 0, 0, 0.45);
+}
+.numberInfo .numberInfoValue > span {
+  color: rgba(0, 0, 0, 0.85);
+}
+.numberInfo .numberInfoValue .subTotal {
+  color: rgba(0, 0, 0, 0.45);
+}
+.numberInfo .numberInfoValue .subTotal :global .anticon-caret-up {
+  color: #f5222d;
+}
+.numberInfo .numberInfoValue .subTotal :global .anticon-caret-down {
+  color: #52c41a;
+}
+.numberInfolight .numberInfoValue > span {
+  color: rgba(0, 0, 0, 0.65);
+}
+.pageHeader {
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+}
+.pageHeader .tabs :global .ant-tabs-bar {
+  border-bottom: 1px solid #e8e8e8;
+}
+.pageHeader .logo > img {
+  border-radius: 4px;
+}
+.pageHeader .title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.result .icon > .success {
+  color: #52c41a;
+}
+.result .icon > .error {
+  color: #f5222d;
+}
+.result .title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.result .description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.result .extra {
+  background: #fafafa;
+  border-radius: 2px;
+}
+.blockChecbox .item {
+  border-radius: 4px;
+}
+.blockChecbox .selectIcon {
+  color: @primary-color;
+}
+.color_block {
+  border-radius: 4px;
+}
+.title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.handle {
+  background: @primary-color;
+  border-radius: 4px 0 0 4px;
+}
+.setting-drawer-index-handle {
+  /* 暂时不知道放哪解决 */
+  background: @primary-color !important;
+}
+.themeColor .title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.themeColor .colorBlock {
+  border-radius: 2px;
+  color: #fff;
+}
+.logo {
+}
+.logo h1 {
+  color: white;
+}
+.sider {
+  box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
+}
+.sider.light {
+  box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05);
+  background-color: white;
+}
+.sider.light .logo {
+  background: white;
+  box-shadow: 1px 1px 0 0 #e8e8e8;
+}
+.sider.light .logo h1 {
+  color: @primary-color;
+}
+.sider.light :global(.ant-menu-light) {
+  border-right-color: transparent;
+}
+:global .drawer .drawer-content {
+  background: #001529;
+}
+.standardFormRow {
+  border-bottom: 1px dashed #e8e8e8;
+}
+.standardFormRow :global .ant-form-item-label label {
+  color: rgba(0, 0, 0, 0.65);
+}
+.standardFormRow .label {
+  color: rgba(0, 0, 0, 0.85);
+}
+.standardFormRowLast {
+  border: none;
+}
+
+.head {
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+}
+.head.light {
+  background-color: #fff;
+}
+.logo h1 {
+  color: #fff;
+}
+.light h1 {
+  color: #002140;
+}
+.trendItem .up {
+  color: #f5222d;
+}
+.trendItem .down {
+  color: #52c41a;
+}
+.trendItem.trendItemGrey .up,
+.trendItem.trendItemGrey .down {
+  color: rgba(0, 0, 0, 0.65);
+}
+.trendItem.reverseColor .up {
+  color: #52c41a;
+}
+.trendItem.reverseColor .down {
+  color: #f5222d;
+}
+.container {
+  background: #f0f2f5;
+}
+.title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.desc {
+  color: rgba(0, 0, 0, 0.45);
+}
+a.listItemMetaTitle {
+  color: rgba(0, 0, 0, 0.85);
+}
+.baseView .right .avatar_title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.main {
+  background-color: #fff;
+}
+.main .leftmenu {
+  border-right: 1px solid #e8e8e8;
+}
+.main .leftmenu :global .ant-menu-inline {
+  border: none;
+}
+.main .right .title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.main :global .ant-list-split .ant-list-item:last-child {
+  border-bottom: 1px solid #e8e8e8;
+}
+:global .ant-list-item-meta .taobao {
+  color: #ff4000;
+  border-radius: 4px;
+}
+:global .ant-list-item-meta .dingding {
+  background-color: #2eabff;
+  color: #fff;
+  border-radius: 4px;
+}
+:global .ant-list-item-meta .alipay {
+  color: #2eabff;
+  border-radius: 4px;
+}
+:global font.strong {
+  color: #52c41a;
+}
+:global font.medium {
+  color: #faad14;
+}
+:global font.weak {
+  color: #f5222d;
+}
+
+
+
+
+.trigger {
+  background: 'red';
+}
+.desc {
+  color: rgba(0, 0, 0, 0.45);
+}
+.desc h3 {
+  color: rgba(0, 0, 0, 0.45);
+}
+.desc h4 {
+  color: rgba(0, 0, 0, 0.45);
+}
+.information .label {
+  color: rgba(0, 0, 0, 0.85);
+}
+.errorIcon {
+  color: #f5222d;
+}
+.errorListItem {
+  border-bottom: 1px solid #e8e8e8;
+}
+.errorListItem:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.errorListItem:last-child {
+  border: 0;
+}
+.errorListItem .errorIcon {
+  color: #f5222d;
+}
+.errorListItem .errorField {
+  color: rgba(0, 0, 0, 0.45);
+}
+.optional {
+  color: rgba(0, 0, 0, 0.45);
+}
+a.listItemMetaTitle {
+  color: rgba(0, 0, 0, 0.85);
+}
+.noData {
+  color: rgba(0, 0, 0, 0.25);
+}
+.heading {
+  color: rgba(0, 0, 0, 0.85);
+}
+.textSecondary {
+  color: rgba(0, 0, 0, 0.45);
+}
+.title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.main .icon {
+  color: rgba(0, 0, 0, 0.2);
+}
+.main .icon:hover {
+  color: @primary-color;
+}
+.success {
+  color: #52c41a;
+}
+.warning {
+  color: #faad14;
+}
+.error {
+  color: #f5222d;
+}
+.progress-pass > .progress :global .ant-progress-bg {
+  background-color: #faad14;
+}
+html {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  color: rgba(0, 0, 0, 0.85);
+}
+abbr[title],
+abbr[data-original-title] {
+  border-bottom: 0;
+}
+a {
+  color: @primary-color;
+  background-color: transparent;
+}
+a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+a:active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+a[disabled] {
+  color: rgba(0, 0, 0, 0.25);
+}
+img {
+  border-style: none;
+}
+table {
+  border-collapse: collapse;
+}
+caption {
+  color: rgba(0, 0, 0, 0.45);
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+  color: inherit;
+}
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+  border-style: none;
+}
+fieldset {
+  border: 0;
+}
+legend {
+  color: inherit;
+}
+mark {
+  background-color: #feffe6;
+}
+::selection {
+  background: @primary-color;
+  color: #fff;
+}
+[ant-click-animating-without-extra-node]:after,
+.ant-click-animating-node {
+  border-radius: inherit;
+  border: 0 solid @primary-color;
+}
+.ant-alert {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 4px;
+}
+.ant-alert-success {
+  border: 1px solid #b7eb8f;
+  background-color: #f6ffed;
+}
+.ant-alert-success .ant-alert-icon {
+  color: #52c41a;
+}
+.ant-alert-info {
+  border: 1px solid color(~`colorPalette("@{primary-color}", 3)`);
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-alert-info .ant-alert-icon {
+  color: @primary-color;
+}
+.ant-alert-warning {
+  border: 1px solid #ffe58f;
+  background-color: #fffbe6;
+}
+.ant-alert-warning .ant-alert-icon {
+  color: #faad14;
+}
+.ant-alert-error {
+  border: 1px solid #ffa39e;
+  background-color: #fff1f0;
+}
+.ant-alert-error .ant-alert-icon {
+  color: #f5222d;
+}
+.ant-alert-close-icon .anticon-close {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-alert-close-icon .anticon-close:hover {
+  color: #404040;
+}
+.ant-alert-with-description {
+  border-radius: 4px;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-alert-with-description .ant-alert-message {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-alert-banner {
+  border-radius: 0;
+  border: 0;
+}
+.ant-anchor {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-anchor-wrapper {
+  background-color: #fff;
+}
+.ant-anchor-ink:before {
+  background-color: #e8e8e8;
+}
+.ant-anchor-ink-ball {
+  border-radius: 8px;
+  border: 2px solid @primary-color;
+  background-color: #fff;
+}
+.ant-anchor-link-title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-anchor-link-active > .ant-anchor-link-title {
+  color: @primary-color;
+}
+.ant-select-auto-complete {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-auto-complete.ant-select .ant-select-selection {
+  border: 0;
+  box-shadow: none;
+}
+.ant-select-auto-complete.ant-select .ant-input {
+  background: transparent;
+  border-width: 1px;
+}
+.ant-select-auto-complete.ant-select .ant-input:focus,
+.ant-select-auto-complete.ant-select .ant-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-avatar {
+  color: rgba(0, 0, 0, 0.65);
+  background: #ccc;
+  color: #fff;
+  border-radius: 50%;
+}
+.ant-avatar-image {
+  background: transparent;
+}
+.ant-avatar-lg {
+  border-radius: 50%;
+}
+.ant-avatar-sm {
+  border-radius: 50%;
+}
+.ant-avatar-square {
+  border-radius: 4px;
+}
+.ant-back-top {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-back-top-content {
+  border-radius: 20px;
+  background-color: rgba(0, 0, 0, 0.45);
+  color: #fff;
+}
+.ant-back-top-content:hover {
+  background-color: rgba(0, 0, 0, 0.65);
+}
+.ant-back-top-icon {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat;
+}
+.ant-badge {
+  color: rgba(0, 0, 0, 0.65);
+  color: unset;
+}
+.ant-badge-count {
+  border-radius: 10px;
+  background: #f5222d;
+  color: #fff;
+  box-shadow: 0 0 0 1px #fff;
+}
+.ant-badge-count a,
+.ant-badge-count a:hover {
+  color: #fff;
+}
+.ant-badge-dot {
+  border-radius: 100%;
+  background: #f5222d;
+  box-shadow: 0 0 0 1px #fff;
+}
+.ant-badge-status-dot {
+  border-radius: 50%;
+}
+.ant-badge-status-success {
+  background-color: #52c41a;
+}
+.ant-badge-status-processing {
+  background-color: @primary-color;
+}
+.ant-badge-status-processing:after {
+  border-radius: 50%;
+  border: 1px solid @primary-color;
+}
+.ant-badge-status-default {
+  background-color: #d9d9d9;
+}
+.ant-badge-status-error {
+  background-color: #f5222d;
+}
+.ant-badge-status-warning {
+  background-color: #faad14;
+}
+.ant-badge-status-text {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-breadcrumb {
+  color: rgba(0, 0, 0, 0.65);
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-breadcrumb a {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-breadcrumb a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-breadcrumb > span:last-child {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-breadcrumb-separator {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-btn {
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  border-color: #d9d9d9;
+}
+.ant-btn:not([disabled]):active {
+  box-shadow: none;
+}
+.ant-btn-lg {
+  border-radius: 4px;
+}
+.ant-btn-sm {
+  border-radius: 4px;
+}
+.ant-btn > a:only-child {
+  color: currentColor;
+}
+.ant-btn > a:only-child:after {
+  background: transparent;
+}
+.ant-btn:hover,
+.ant-btn:focus {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+  background-color: #fff;
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn:hover > a:only-child,
+.ant-btn:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn:hover > a:only-child:after,
+.ant-btn:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn:active,
+.ant-btn.active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+  background-color: #fff;
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-btn:active > a:only-child,
+.ant-btn.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn:active > a:only-child:after,
+.ant-btn.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn.disabled,
+.ant-btn[disabled],
+.ant-btn.disabled:hover,
+.ant-btn[disabled]:hover,
+.ant-btn.disabled:focus,
+.ant-btn[disabled]:focus,
+.ant-btn.disabled:active,
+.ant-btn[disabled]:active,
+.ant-btn.disabled.active,
+.ant-btn[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn.disabled > a:only-child,
+.ant-btn[disabled] > a:only-child,
+.ant-btn.disabled:hover > a:only-child,
+.ant-btn[disabled]:hover > a:only-child,
+.ant-btn.disabled:focus > a:only-child,
+.ant-btn[disabled]:focus > a:only-child,
+.ant-btn.disabled:active > a:only-child,
+.ant-btn[disabled]:active > a:only-child,
+.ant-btn.disabled.active > a:only-child,
+.ant-btn[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn.disabled > a:only-child:after,
+.ant-btn[disabled] > a:only-child:after,
+.ant-btn.disabled:hover > a:only-child:after,
+.ant-btn[disabled]:hover > a:only-child:after,
+.ant-btn.disabled:focus > a:only-child:after,
+.ant-btn[disabled]:focus > a:only-child:after,
+.ant-btn.disabled:active > a:only-child:after,
+.ant-btn[disabled]:active > a:only-child:after,
+.ant-btn.disabled.active > a:only-child:after,
+.ant-btn[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn:hover,
+.ant-btn:focus,
+.ant-btn:active,
+.ant-btn.active {
+  background: #fff;
+}
+.ant-btn-primary {
+  color: #fff;
+  background-color: @primary-color;
+  border-color: @primary-color;
+  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
+}
+.ant-btn-primary > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-primary:hover,
+.ant-btn-primary:focus {
+  color: #fff;
+  background-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-primary:hover > a:only-child,
+.ant-btn-primary:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary:hover > a:only-child:after,
+.ant-btn-primary:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-primary:active,
+.ant-btn-primary.active {
+  color: #fff;
+  background-color: color(~`colorPalette("@{primary-color}", 7)`);
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-btn-primary:active > a:only-child,
+.ant-btn-primary.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary:active > a:only-child:after,
+.ant-btn-primary.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-primary.disabled,
+.ant-btn-primary[disabled],
+.ant-btn-primary.disabled:hover,
+.ant-btn-primary[disabled]:hover,
+.ant-btn-primary.disabled:focus,
+.ant-btn-primary[disabled]:focus,
+.ant-btn-primary.disabled:active,
+.ant-btn-primary[disabled]:active,
+.ant-btn-primary.disabled.active,
+.ant-btn-primary[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-primary.disabled > a:only-child,
+.ant-btn-primary[disabled] > a:only-child,
+.ant-btn-primary.disabled:hover > a:only-child,
+.ant-btn-primary[disabled]:hover > a:only-child,
+.ant-btn-primary.disabled:focus > a:only-child,
+.ant-btn-primary[disabled]:focus > a:only-child,
+.ant-btn-primary.disabled:active > a:only-child,
+.ant-btn-primary[disabled]:active > a:only-child,
+.ant-btn-primary.disabled.active > a:only-child,
+.ant-btn-primary[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-primary.disabled > a:only-child:after,
+.ant-btn-primary[disabled] > a:only-child:after,
+.ant-btn-primary.disabled:hover > a:only-child:after,
+.ant-btn-primary[disabled]:hover > a:only-child:after,
+.ant-btn-primary.disabled:focus > a:only-child:after,
+.ant-btn-primary[disabled]:focus > a:only-child:after,
+.ant-btn-primary.disabled:active > a:only-child:after,
+.ant-btn-primary[disabled]:active > a:only-child:after,
+.ant-btn-primary.disabled.active > a:only-child:after,
+.ant-btn-primary[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) {
+  border-right-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-left-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled {
+  border-color: #d9d9d9;
+}
+.ant-btn-group .ant-btn-primary:first-child:not(:last-child) {
+  border-right-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] {
+  border-right-color: #d9d9d9;
+}
+.ant-btn-group .ant-btn-primary:last-child:not(:first-child),
+.ant-btn-group .ant-btn-primary + .ant-btn-primary {
+  border-left-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled],
+.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] {
+  border-left-color: #d9d9d9;
+}
+.ant-btn-ghost {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: transparent;
+  border-color: #d9d9d9;
+}
+.ant-btn-ghost > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-ghost:hover,
+.ant-btn-ghost:focus {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+  background-color: transparent;
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-ghost:hover > a:only-child,
+.ant-btn-ghost:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost:hover > a:only-child:after,
+.ant-btn-ghost:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-ghost:active,
+.ant-btn-ghost.active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+  background-color: transparent;
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-btn-ghost:active > a:only-child,
+.ant-btn-ghost.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost:active > a:only-child:after,
+.ant-btn-ghost.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-ghost.disabled,
+.ant-btn-ghost[disabled],
+.ant-btn-ghost.disabled:hover,
+.ant-btn-ghost[disabled]:hover,
+.ant-btn-ghost.disabled:focus,
+.ant-btn-ghost[disabled]:focus,
+.ant-btn-ghost.disabled:active,
+.ant-btn-ghost[disabled]:active,
+.ant-btn-ghost.disabled.active,
+.ant-btn-ghost[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-ghost.disabled > a:only-child,
+.ant-btn-ghost[disabled] > a:only-child,
+.ant-btn-ghost.disabled:hover > a:only-child,
+.ant-btn-ghost[disabled]:hover > a:only-child,
+.ant-btn-ghost.disabled:focus > a:only-child,
+.ant-btn-ghost[disabled]:focus > a:only-child,
+.ant-btn-ghost.disabled:active > a:only-child,
+.ant-btn-ghost[disabled]:active > a:only-child,
+.ant-btn-ghost.disabled.active > a:only-child,
+.ant-btn-ghost[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-ghost.disabled > a:only-child:after,
+.ant-btn-ghost[disabled] > a:only-child:after,
+.ant-btn-ghost.disabled:hover > a:only-child:after,
+.ant-btn-ghost[disabled]:hover > a:only-child:after,
+.ant-btn-ghost.disabled:focus > a:only-child:after,
+.ant-btn-ghost[disabled]:focus > a:only-child:after,
+.ant-btn-ghost.disabled:active > a:only-child:after,
+.ant-btn-ghost[disabled]:active > a:only-child:after,
+.ant-btn-ghost.disabled.active > a:only-child:after,
+.ant-btn-ghost[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-dashed {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  border-color: #d9d9d9;
+  border-style: dashed;
+}
+.ant-btn-dashed > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-dashed:hover,
+.ant-btn-dashed:focus {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+  background-color: #fff;
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-dashed:hover > a:only-child,
+.ant-btn-dashed:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed:hover > a:only-child:after,
+.ant-btn-dashed:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-dashed:active,
+.ant-btn-dashed.active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+  background-color: #fff;
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-btn-dashed:active > a:only-child,
+.ant-btn-dashed.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed:active > a:only-child:after,
+.ant-btn-dashed.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-dashed.disabled,
+.ant-btn-dashed[disabled],
+.ant-btn-dashed.disabled:hover,
+.ant-btn-dashed[disabled]:hover,
+.ant-btn-dashed.disabled:focus,
+.ant-btn-dashed[disabled]:focus,
+.ant-btn-dashed.disabled:active,
+.ant-btn-dashed[disabled]:active,
+.ant-btn-dashed.disabled.active,
+.ant-btn-dashed[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-dashed.disabled > a:only-child,
+.ant-btn-dashed[disabled] > a:only-child,
+.ant-btn-dashed.disabled:hover > a:only-child,
+.ant-btn-dashed[disabled]:hover > a:only-child,
+.ant-btn-dashed.disabled:focus > a:only-child,
+.ant-btn-dashed[disabled]:focus > a:only-child,
+.ant-btn-dashed.disabled:active > a:only-child,
+.ant-btn-dashed[disabled]:active > a:only-child,
+.ant-btn-dashed.disabled.active > a:only-child,
+.ant-btn-dashed[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-dashed.disabled > a:only-child:after,
+.ant-btn-dashed[disabled] > a:only-child:after,
+.ant-btn-dashed.disabled:hover > a:only-child:after,
+.ant-btn-dashed[disabled]:hover > a:only-child:after,
+.ant-btn-dashed.disabled:focus > a:only-child:after,
+.ant-btn-dashed[disabled]:focus > a:only-child:after,
+.ant-btn-dashed.disabled:active > a:only-child:after,
+.ant-btn-dashed[disabled]:active > a:only-child:after,
+.ant-btn-dashed.disabled.active > a:only-child:after,
+.ant-btn-dashed[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-danger {
+  color: #f5222d;
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-btn-danger > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-danger:hover {
+  color: #fff;
+  background-color: #ff4d4f;
+  border-color: #ff4d4f;
+}
+.ant-btn-danger:hover > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:hover > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-danger:focus {
+  color: #ff4d4f;
+  background-color: #fff;
+  border-color: #ff4d4f;
+}
+.ant-btn-danger:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-danger:active,
+.ant-btn-danger.active {
+  color: #fff;
+  background-color: #cf1322;
+  border-color: #cf1322;
+}
+.ant-btn-danger:active > a:only-child,
+.ant-btn-danger.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger:active > a:only-child:after,
+.ant-btn-danger.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-danger.disabled,
+.ant-btn-danger[disabled],
+.ant-btn-danger.disabled:hover,
+.ant-btn-danger[disabled]:hover,
+.ant-btn-danger.disabled:focus,
+.ant-btn-danger[disabled]:focus,
+.ant-btn-danger.disabled:active,
+.ant-btn-danger[disabled]:active,
+.ant-btn-danger.disabled.active,
+.ant-btn-danger[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-danger.disabled > a:only-child,
+.ant-btn-danger[disabled] > a:only-child,
+.ant-btn-danger.disabled:hover > a:only-child,
+.ant-btn-danger[disabled]:hover > a:only-child,
+.ant-btn-danger.disabled:focus > a:only-child,
+.ant-btn-danger[disabled]:focus > a:only-child,
+.ant-btn-danger.disabled:active > a:only-child,
+.ant-btn-danger[disabled]:active > a:only-child,
+.ant-btn-danger.disabled.active > a:only-child,
+.ant-btn-danger[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-danger.disabled > a:only-child:after,
+.ant-btn-danger[disabled] > a:only-child:after,
+.ant-btn-danger.disabled:hover > a:only-child:after,
+.ant-btn-danger[disabled]:hover > a:only-child:after,
+.ant-btn-danger.disabled:focus > a:only-child:after,
+.ant-btn-danger[disabled]:focus > a:only-child:after,
+.ant-btn-danger.disabled:active > a:only-child:after,
+.ant-btn-danger[disabled]:active > a:only-child:after,
+.ant-btn-danger.disabled.active > a:only-child:after,
+.ant-btn-danger[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-circle,
+.ant-btn-circle-outline {
+  border-radius: 50%;
+}
+.ant-btn-circle.ant-btn-lg,
+.ant-btn-circle-outline.ant-btn-lg {
+  border-radius: 50%;
+}
+.ant-btn-circle.ant-btn-sm,
+.ant-btn-circle-outline.ant-btn-sm {
+  border-radius: 50%;
+}
+.ant-btn:before {
+  background: #fff;
+  border-radius: inherit;
+}
+.ant-btn-group-lg > .ant-btn,
+.ant-btn-group-lg > span > .ant-btn {
+  border-radius: 0;
+}
+.ant-btn-group-sm > .ant-btn,
+.ant-btn-group-sm > span > .ant-btn {
+  border-radius: 0;
+}
+.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) {
+  border-left-color: transparent;
+}
+.ant-btn-group .ant-btn {
+  border-radius: 0;
+}
+.ant-btn-group > .ant-btn:only-child {
+  border-radius: 4px;
+}
+.ant-btn-group > span:only-child > .ant-btn {
+  border-radius: 4px;
+}
+.ant-btn-group > .ant-btn:first-child:not(:last-child),
+.ant-btn-group > span:first-child:not(:last-child) > .ant-btn {
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+}
+.ant-btn-group > .ant-btn:last-child:not(:first-child),
+.ant-btn-group > span:last-child:not(:first-child) > .ant-btn {
+  border-bottom-right-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.ant-btn-group-sm > .ant-btn:only-child {
+  border-radius: 4px;
+}
+.ant-btn-group-sm > span:only-child > .ant-btn {
+  border-radius: 4px;
+}
+.ant-btn-group-sm > .ant-btn:first-child:not(:last-child),
+.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn {
+  border-bottom-left-radius: 4px;
+  border-top-left-radius: 4px;
+}
+.ant-btn-group-sm > .ant-btn:last-child:not(:first-child),
+.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn {
+  border-bottom-right-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn {
+  border-radius: 0;
+}
+.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-btn-background-ghost {
+  background: transparent !important;
+  border-color: #fff;
+  color: #fff;
+}
+.ant-btn-background-ghost.ant-btn-primary {
+  color: @primary-color;
+  background-color: transparent;
+  border-color: @primary-color;
+}
+.ant-btn-background-ghost.ant-btn-primary > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary:hover,
+.ant-btn-background-ghost.ant-btn-primary:focus {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+  background-color: transparent;
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary:active,
+.ant-btn-background-ghost.ant-btn-primary.active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+  background-color: transparent;
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-btn-background-ghost.ant-btn-primary:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled,
+.ant-btn-background-ghost.ant-btn-primary[disabled],
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger {
+  color: #f5222d;
+  background-color: transparent;
+  border-color: #f5222d;
+}
+.ant-btn-background-ghost.ant-btn-danger > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover,
+.ant-btn-background-ghost.ant-btn-danger:focus {
+  color: #ff4d4f;
+  background-color: transparent;
+  border-color: #ff4d4f;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger:active,
+.ant-btn-background-ghost.ant-btn-danger.active {
+  color: #cf1322;
+  background-color: transparent;
+  border-color: #cf1322;
+}
+.ant-btn-background-ghost.ant-btn-danger:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.active > a:only-child:after {
+  background: transparent;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled,
+.ant-btn-background-ghost.ant-btn-danger[disabled],
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child:after,
+.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.christmas.ant-btn-primary:before {
+  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAXCAYAAABOHMIhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABiZJREFUeNrsWMtPlFcUvzPMwIDysLyRR4uATDHWCiVgSmRlios2DeiiXUFs0nRBd6arxqQhJDapkYXhP4BqDKTQhZaFNQSCaBEVJjwdHsNr5DUMDDPDzPT3u7nTDEgRKrKgc5KT+z3uufec33de99P4fD4RpL2RNgjB3kn35MkTeRERESFiYmLkGBoaKnQ6nWSNRvPPZFxr+vv7k6KioiIdDsfa8vLyQkFBgcP3Bnel3MDAQArWI0eFhISE87nb7bZ7PJ4VvLYuLi5O5+fnu9+kMNfq6+tLjIyMzMY6KeBEbK/XarXReI3lPDZMWcc4v7GxYV1dXR3Jy8ub2E5HPvJ6vRSSDH0ku1wuAfsEZOV1IEFHoeNFdHS0yMrK2knR0Lm5uR+hxLdQMjbwHTZbB41h8RGwCdc9MzMzneHh4bGJiYlf4SN8ijkfwqiIncCAAR7Iz2GPSShudjqdfeCeqampvwBQfFxc3JdYqwTv8gB8/F48A8BgKecE14V+L7ju2tpae05OzkuCCZvkPOj8mizmC6vVKtmPu+bx48cC3qI1mUyFUOyywWD4SHlELBaLJmCHNcwAghuAOujtuF4FqHO4nsX4EsAS3I4TJ04ME1h8PDE9PS09TYZoY2Pj1729vd6lpSVfkDYTPG0UkfNDRUWFgQ5Gb2Mh0N29e9eG/GQfHh4W8/PzwUy/ObQ/gMfVVlZW1iAiZdQxp3nv3LljRoL/5erVq1UIxzSiiVD9X4EDYATynCwAzGO858hCQRoaGmJFZNJz8YIcBc4BF966dau6sLAwBxVSJCUlCSThQwuU3W6XkYUok1Vzm5znQx5bbm9v77p+/frPeNSNRzZ/ISBwrG4ZR48eLamtrf2+uLjYSEG9Xi/wTISFhQlWGXohyzO/CJlVl23KQRLbABoaHx+/Z1lUZ/Hq1SsJFj3JT3hmHx8fnydPTEzMj46OziHPW2w22wxeD4Kfgadh/4YEzU8Az4DhffAn5eXlX1y6dKkEoCTspAQ9Mjs7+0BBo8Fms1lkZGTsOo0QLLRNkvnR+fEJzIMHD0xtbW39CL8JTFtSbAOvBIyLHIGVm9VzE2gKuDAMSSpcT6KXyT137lx2cnLyMXhcGDb3wq3XuWF3d/fCzZs3P0c4v5eSknJQbYLo7Ox0gC2lpaVZ3Be67Th/dnZWoAJKsJC3XA8fPhxoamp6hMb+BaaMgWcUMGtszZjiFDNmvcDI91pzG0iY4ARwkwrxkcHBwUdgNrRMbnrqoRbkVzDcvn3bl5qaWsmcgFH4G8XdEGUWFhak51AuISFBnkoCTyFbyWKxCJwIxlC0fq2rq7tcVFRkRKskjh8/Lr0+kBjCCDV/knfdv3//WX19/R8IRRNemxlu4AXwKqM+EJwdj1HbPYSwh3sCPAJDABm2LLchCjS+5/kirKGhwWk0GrMuXrxYQuX9hm/XXTMXMY+srKwI5ApZrbYmZh7deEJhAUKjLe/pLTzSsCuHrK+1tbUJVe3P6upq87Vr174rKysrYHVj/uW+OH3IfEuw4F3ee/fuPQfAvwOs5yyE4CnlFOu7BWrTCWlreO6FACpBZGwUw4BvkANLobReHb3kGZYGsGzTq/zlO8AT1ru6uoZbWlqeA6gINJAfnz59OlVLoX8Jtebm5raampqfcMvQYgTknz9//sKVK1c+y83NTdIEuCnaKMuNGzd+6+np6cCtSTkAw9D9X8Dyh+dbgaaAC1XAnUlPTy+qqqq6cPbs2UzkmWjNljiDJzpwHFnCkW2yo6NjCKW8H54wjlezKvRT09LSTsJrz5w6dSoN+Yp51ADAPUj8VoDbDq9pxrwuJcNIYQllJTIi/xopBw/VA7DJp0+f9hA78CgL5F5C8J2CpoCj8sfA6WCe/FPRhsRlZmbGIs8Y4FFO5CJgtrSsvrRVGW1V93b1myoGnKAKEcHgnwsWpg1lNI0fphwrmdqbckeU18WrnlOjqp5/j7W3BWvfQVPKa5SBkcrYCNVB65TRTlWZ1lXiXVU5xbtlDb2SPaLWYwrgHIcqPg6Vc7fbX69Yoyqfa7/AeiegbWOEVhmsVcWDwPn224iDJgla8Hd38Hd3ELQgaIeI/hZgAIPEp0vmQJdoAAAAAElFTkSuQmCC) no-repeat 50% 0;
+  background-size: 64px;
+}
+.christmas.ant-btn-primary.ant-btn-lg:before {
+  background-size: 72px;
+}
+.christmas.ant-btn-primary.ant-btn-sm:before {
+  background-size: 56px;
+}
+.ant-fullcalendar {
+  color: rgba(0, 0, 0, 0.65);
+  border-top: 1px solid #d9d9d9;
+}
+.ant-fullcalendar table {
+  border-collapse: collapse;
+  background-color: transparent;
+}
+.ant-fullcalendar table,
+.ant-fullcalendar th,
+.ant-fullcalendar td {
+  border: 0;
+}
+.ant-fullcalendar-calendar-table {
+  border-spacing: 0;
+}
+.ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 2px;
+  background: transparent;
+}
+.ant-fullcalendar-value:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-fullcalendar-value:active {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-fullcalendar-today .ant-fullcalendar-value,
+.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value {
+  box-shadow: 0 0 0 1px @primary-color inset;
+}
+.ant-fullcalendar-selected-day .ant-fullcalendar-value,
+.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.ant-fullcalendar-last-month-cell .ant-fullcalendar-value,
+.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-fullcalendar-month-panel-table {
+  border-collapse: separate;
+}
+.ant-fullcalendar-fullscreen {
+  border-top: 0;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date {
+  color: rgba(0, 0, 0, 0.65);
+  border-top: 2px solid #e8e8e8;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active {
+  background: color(~`colorPalette("@{primary-color}", 2)`);
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-value {
+  background: transparent;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date {
+  border-top-color: @primary-color;
+  background: transparent;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value {
+  box-shadow: none;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value {
+  color: @primary-color;
+}
+.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date,
+.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date,
+.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover {
+  background: transparent;
+}
+.ant-fullcalendar-disabled-cell .ant-fullcalendar-value {
+  color: rgba(0, 0, 0, 0.25);
+  border-radius: 0;
+}
+.ant-card {
+  color: rgba(0, 0, 0, 0.65);
+  background: #fff;
+  border-radius: 2px;
+}
+.ant-card-hoverable:hover {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);
+  border-color: rgba(0, 0, 0, 0.09);
+}
+.ant-card-bordered {
+  border: 1px solid #e8e8e8;
+}
+.ant-card-head {
+  background: transparent;
+  border-bottom: 1px solid #e8e8e8;
+  border-radius: 2px 2px 0 0;
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-card-head .ant-tabs {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-card-head .ant-tabs-bar {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-card-extra {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-card-grid {
+  border-radius: 0;
+  border: 0;
+  box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset;
+}
+.ant-card-grid:hover {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-card-cover img {
+  border-radius: 2px 2px 0 0;
+}
+.ant-card-actions {
+  border-top: 1px solid #e8e8e8;
+  background: #fafafa;
+}
+.ant-card-actions > li {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-actions > li > span:hover {
+  color: @primary-color;
+}
+.ant-card-actions > li > span a {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-actions > li > span a:hover {
+  color: @primary-color;
+}
+.ant-card-actions > li:not(:last-child) {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-card-type-inner .ant-card-head {
+  background: #fafafa;
+}
+.ant-card-meta-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-card-meta-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-card-loading-block {
+  border-radius: 2px;
+  background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2));
+  background-size: 600% 600%;
+}
+.ant-carousel {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-carousel .slick-slider {
+  -webkit-tap-highlight-color: transparent;
+}
+.ant-carousel .slick-vertical .slick-slide {
+  border: 1px solid transparent;
+}
+.ant-carousel .slick-prev,
+.ant-carousel .slick-next {
+  background: transparent;
+  color: transparent;
+  border: 0;
+}
+.ant-carousel .slick-prev:hover,
+.ant-carousel .slick-next:hover,
+.ant-carousel .slick-prev:focus,
+.ant-carousel .slick-next:focus {
+  background: transparent;
+  color: transparent;
+}
+.ant-carousel .slick-dots li button {
+  border: 0;
+  background: #fff;
+  border-radius: 1px;
+  color: transparent;
+}
+.ant-carousel .slick-dots li.slick-active button {
+  background: #fff;
+}
+.ant-cascader {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-cascader-input.ant-input {
+  background-color: transparent !important;
+}
+.ant-cascader-picker {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  border-radius: 4px;
+}
+.ant-cascader-picker-with-value .ant-cascader-picker-label {
+  color: transparent;
+}
+.ant-cascader-picker-disabled {
+  background: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-picker:focus .ant-cascader-input {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-cascader-picker-show-search.ant-cascader-picker-focused {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-picker-clear {
+  background: #fff;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-picker-clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-cascader-picker-arrow {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-menus {
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-cascader-menu {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-cascader-menu:first-child {
+  border-radius: 4px 0 0 4px;
+}
+.ant-cascader-menu:last-child {
+  border-right-color: transparent;
+  border-radius: 0 4px 4px 0;
+}
+.ant-cascader-menu:only-child {
+  border-radius: 4px;
+}
+.ant-cascader-menu-item:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-cascader-menu-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-cascader-menu-item-disabled:hover {
+  background: transparent;
+}
+.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),
+.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover {
+  background: #f5f5f5;
+}
+.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,
+.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-cascader-menu-item .ant-cascader-menu-item-keyword {
+  color: #f5222d;
+}
+.ant-checkbox {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-checkbox-wrapper:hover .ant-checkbox-inner,
+.ant-checkbox:hover .ant-checkbox-inner,
+.ant-checkbox-input:focus + .ant-checkbox-inner {
+  border-color: @primary-color;
+}
+.ant-checkbox-checked:after {
+  border-radius: 2px;
+  border: 1px solid @primary-color;
+}
+.ant-checkbox-inner {
+  border: 1px solid #d9d9d9;
+  border-radius: 2px;
+  background-color: #fff;
+}
+.ant-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-checkbox-indeterminate .ant-checkbox-inner:after {
+  border: 0;
+  background-color: @primary-color;
+}
+.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-checkbox-checked .ant-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-checkbox-checked .ant-checkbox-inner {
+  background-color: @primary-color;
+  border-color: @primary-color;
+}
+.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-checkbox-disabled .ant-checkbox-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-checkbox-disabled .ant-checkbox-inner:after {
+  border-color: #f5f5f5;
+}
+.ant-checkbox-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-checkbox-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-checkbox-group {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-collapse {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fafafa;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  border-bottom: 0;
+}
+.ant-collapse > .ant-collapse-item {
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-collapse > .ant-collapse-item:last-child,
+.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header {
+  border-radius: 0 0 4px 4px;
+}
+.ant-collapse > .ant-collapse-item > .ant-collapse-header {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-collapse-content {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  border-top: 1px solid #d9d9d9;
+}
+.ant-collapse-item:last-child > .ant-collapse-content {
+  border-radius: 0 0 4px 4px;
+}
+.ant-collapse-borderless {
+  background-color: #fff;
+  border: 0;
+}
+.ant-collapse-borderless > .ant-collapse-item {
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-collapse-borderless > .ant-collapse-item:last-child,
+.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header {
+  border-radius: 0;
+}
+.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content {
+  background-color: transparent;
+  border-top: 0;
+}
+.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header,
+.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-picker-container {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-calendar-picker {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled) {
+  border-color: @primary-color;
+}
+.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled) {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-calendar-picker-clear {
+  color: rgba(0, 0, 0, 0.25);
+  background: #fff;
+}
+.ant-calendar-picker-clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-picker-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar {
+  border: 1px solid #fff;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+}
+.ant-calendar-input-wrap {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-input {
+  border: 0;
+  color: rgba(0, 0, 0, 0.65);
+  background: #fff;
+}
+.ant-calendar-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-header a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar-header .ant-calendar-century-select,
+.ant-calendar-header .ant-calendar-decade-select,
+.ant-calendar-header .ant-calendar-year-select,
+.ant-calendar-header .ant-calendar-month-select {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-calendar-header .ant-calendar-prev-century-btn,
+.ant-calendar-header .ant-calendar-next-century-btn,
+.ant-calendar-header .ant-calendar-prev-decade-btn,
+.ant-calendar-header .ant-calendar-next-decade-btn,
+.ant-calendar-header .ant-calendar-prev-month-btn,
+.ant-calendar-header .ant-calendar-next-month-btn,
+.ant-calendar-header .ant-calendar-prev-year-btn,
+.ant-calendar-header .ant-calendar-next-year-btn {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar table {
+  border-collapse: collapse;
+  background-color: transparent;
+}
+.ant-calendar table,
+.ant-calendar th,
+.ant-calendar td {
+  border: 0;
+}
+.ant-calendar-calendar-table {
+  border-spacing: 0;
+}
+.ant-calendar-date {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 2px;
+  border: 1px solid transparent;
+  background: transparent;
+}
+.ant-calendar-date:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-calendar-date:active {
+  color: #fff;
+  background: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar-today .ant-calendar-date {
+  border-color: @primary-color;
+  color: @primary-color;
+}
+.ant-calendar-last-month-cell .ant-calendar-date,
+.ant-calendar-next-month-btn-day .ant-calendar-date {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-selected-day .ant-calendar-date {
+  background: #d1e9ff;
+}
+.ant-calendar-selected-date .ant-calendar-date,
+.ant-calendar-selected-start-date .ant-calendar-date,
+.ant-calendar-selected-end-date .ant-calendar-date {
+  background: @primary-color;
+  color: #fff;
+  border: 1px solid transparent;
+}
+.ant-calendar-selected-date .ant-calendar-date:hover,
+.ant-calendar-selected-start-date .ant-calendar-date:hover,
+.ant-calendar-selected-end-date .ant-calendar-date:hover {
+  background: @primary-color;
+}
+.ant-calendar-disabled-cell .ant-calendar-date {
+  color: #bcbcbc;
+  background: #f5f5f5;
+  border-radius: 0;
+  border: 1px solid transparent;
+}
+.ant-calendar-disabled-cell .ant-calendar-date:hover {
+  background: #f5f5f5;
+}
+.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before {
+  border: 1px solid #bcbcbc;
+  border-radius: 2px;
+}
+.ant-calendar-disabled-cell-first-of-row .ant-calendar-date {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-calendar-disabled-cell-last-of-row .ant-calendar-date {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.ant-calendar-footer {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-calendar-footer:empty {
+  border-top: 0;
+}
+.ant-calendar .ant-calendar-today-btn-disabled,
+.ant-calendar .ant-calendar-clear-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar .ant-calendar-clear-btn:after {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar .ant-calendar-clear-btn:hover:after {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar .ant-calendar-ok-btn {
+  background-image: none;
+  border: 1px solid transparent;
+  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+  color: #fff;
+  background-color: @primary-color;
+  border-color: @primary-color;
+  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
+  border-radius: 4px;
+}
+.ant-calendar .ant-calendar-ok-btn:not([disabled]):active {
+  box-shadow: none;
+}
+.ant-calendar .ant-calendar-ok-btn-lg {
+  border-radius: 4px;
+}
+.ant-calendar .ant-calendar-ok-btn-sm {
+  border-radius: 4px;
+}
+.ant-calendar .ant-calendar-ok-btn > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn:hover,
+.ant-calendar .ant-calendar-ok-btn:focus {
+  color: #fff;
+  background-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar .ant-calendar-ok-btn:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn:focus > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn:focus > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn:active,
+.ant-calendar .ant-calendar-ok-btn.active {
+  color: #fff;
+  background-color: color(~`colorPalette("@{primary-color}", 7)`);
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-calendar .ant-calendar-ok-btn:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.active > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.active > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled,
+.ant-calendar .ant-calendar-ok-btn[disabled],
+.ant-calendar .ant-calendar-ok-btn.disabled:hover,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus,
+.ant-calendar .ant-calendar-ok-btn.disabled:active,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active,
+.ant-calendar .ant-calendar-ok-btn.disabled.active,
+.ant-calendar .ant-calendar-ok-btn[disabled].active {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child,
+.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child:after,
+.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #f5f5f5;
+  border-color: #d9d9d9;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child {
+  color: currentColor;
+}
+.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child:after {
+  background: transparent;
+}
+.ant-calendar-range-picker-input {
+  background-color: transparent;
+  border: 0;
+}
+.ant-calendar-range-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range-picker-separator {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-range-left .ant-calendar-time-picker-inner {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-calendar-range-right .ant-calendar-time-picker-inner {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-calendar-range-middle {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-range .ant-calendar-input,
+.ant-calendar-range .ant-calendar-time-picker-input {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+  border: 0;
+  box-shadow: none;
+}
+.ant-calendar-range .ant-calendar-input::-moz-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range .ant-calendar-input:-ms-input-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder,
+.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-calendar-range .ant-calendar-input:hover,
+.ant-calendar-range .ant-calendar-time-picker-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-calendar-range .ant-calendar-input:focus,
+.ant-calendar-range .ant-calendar-time-picker-input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-calendar-range .ant-calendar-input-disabled,
+.ant-calendar-range .ant-calendar-time-picker-input-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-range .ant-calendar-input-disabled:hover,
+.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-calendar-range .ant-calendar-input:focus,
+.ant-calendar-range .ant-calendar-time-picker-input:focus {
+  box-shadow: none;
+}
+.ant-calendar-range .ant-calendar-in-range-cell {
+  border-radius: 0;
+}
+.ant-calendar-range .ant-calendar-in-range-cell:before {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+  border-radius: 0;
+  border: 0;
+}
+.ant-calendar-range .ant-calendar-header,
+.ant-calendar-range .ant-calendar-month-panel-header,
+.ant-calendar-range .ant-calendar-year-panel-header {
+  border-bottom: 0;
+}
+.ant-calendar-range .ant-calendar-body,
+.ant-calendar-range .ant-calendar-month-panel-body,
+.ant-calendar-range .ant-calendar-year-panel-body {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner {
+  background: none;
+}
+.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox {
+  background-color: #fff;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body {
+  border-top-color: transparent;
+}
+.ant-calendar-time-picker {
+  background-color: #fff;
+}
+.ant-calendar-time-picker-inner {
+  background-color: #fff;
+  background-clip: padding-box;
+}
+.ant-calendar-time-picker-select {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-calendar-time-picker-select:first-child {
+  border-left: 0;
+}
+.ant-calendar-time-picker-select:last-child {
+  border-right: 0;
+}
+.ant-calendar-time-picker-select li:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+li.ant-calendar-time-picker-select-option-selected {
+  background: #f5f5f5;
+}
+li.ant-calendar-time-picker-select-option-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-calendar-time-picker-select-option-disabled:hover {
+  background: transparent;
+}
+.ant-calendar-time .ant-calendar-day-select {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-month-panel {
+  border-radius: 4px;
+  background: #fff;
+}
+.ant-calendar-month-panel-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-month-panel-header a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn,
+.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-month-panel-table {
+  border-collapse: separate;
+}
+.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month,
+.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover {
+  color: #bcbcbc;
+  background: #f5f5f5;
+}
+.ant-calendar-month-panel-month {
+  color: rgba(0, 0, 0, 0.65);
+  background: transparent;
+  border-radius: 2px;
+}
+.ant-calendar-month-panel-month:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-calendar-year-panel {
+  border-radius: 4px;
+  background: #fff;
+}
+.ant-calendar-year-panel-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-year-panel-header a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn,
+.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-year-panel-table {
+  border-collapse: separate;
+}
+.ant-calendar-year-panel-year {
+  color: rgba(0, 0, 0, 0.65);
+  background: transparent;
+  border-radius: 2px;
+}
+.ant-calendar-year-panel-year:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year,
+.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-decade-panel {
+  background: #fff;
+  border-radius: 4px;
+}
+.ant-calendar-decade-panel-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-calendar-decade-panel-header a:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn,
+.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-calendar-decade-panel-table {
+  border-collapse: separate;
+}
+.ant-calendar-decade-panel-decade {
+  color: rgba(0, 0, 0, 0.65);
+  background: transparent;
+  border-radius: 2px;
+}
+.ant-calendar-decade-panel-decade:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade,
+.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-calendar-week-number .ant-calendar-body tr:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week {
+  background: color(~`colorPalette("@{primary-color}", 2)`);
+}
+.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date,
+.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date {
+  background: transparent;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-divider {
+  color: rgba(0, 0, 0, 0.65);
+  background: #e8e8e8;
+}
+.ant-divider-horizontal.ant-divider-with-text,
+.ant-divider-horizontal.ant-divider-with-text-left,
+.ant-divider-horizontal.ant-divider-with-text-right {
+  background: transparent;
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-divider-horizontal.ant-divider-with-text:before,
+.ant-divider-horizontal.ant-divider-with-text-left:before,
+.ant-divider-horizontal.ant-divider-with-text-right:before,
+.ant-divider-horizontal.ant-divider-with-text:after,
+.ant-divider-horizontal.ant-divider-with-text-left:after,
+.ant-divider-horizontal.ant-divider-with-text-right:after {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-divider-dashed {
+  background: none;
+  border-top: 1px dashed #e8e8e8;
+}
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed,
+.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed,
+.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed {
+  border-top: 0;
+}
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before,
+.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before,
+.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before,
+.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after,
+.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after,
+.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after {
+  border-style: dashed none none;
+}
+.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper {
+  box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);
+}
+.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper {
+  box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15);
+}
+.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper {
+  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-drawer-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-drawer-content {
+  background-color: #fff;
+  border: 0;
+  background-clip: padding-box;
+}
+.ant-drawer-close {
+  border: 0;
+  background: transparent;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-drawer-close:focus,
+.ant-drawer-close:hover {
+  color: #444;
+}
+.ant-drawer-header {
+  border-radius: 4px 4px 0 0;
+  background: #fff;
+  color: rgba(0, 0, 0, 0.65);
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-drawer-mask {
+  background-color: rgba(0, 0, 0, 0.65);
+}
+.ant-drawer-open-content {
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+.ant-dropdown {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-dropdown-menu {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+}
+.ant-dropdown-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-dropdown-menu-item,
+.ant-dropdown-menu-submenu-title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-dropdown-menu-item > a,
+.ant-dropdown-menu-submenu-title > a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-dropdown-menu-item-selected,
+.ant-dropdown-menu-submenu-title-selected,
+.ant-dropdown-menu-item-selected > a,
+.ant-dropdown-menu-submenu-title-selected > a {
+  color: @primary-color;
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-dropdown-menu-item:hover,
+.ant-dropdown-menu-submenu-title:hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-dropdown-menu-item-disabled,
+.ant-dropdown-menu-submenu-title-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-dropdown-menu-item-disabled:hover,
+.ant-dropdown-menu-submenu-title-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+}
+.ant-dropdown-menu-item-divider,
+.ant-dropdown-menu-submenu-title-divider {
+  background-color: #e8e8e8;
+}
+.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon,
+.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,
+.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-dropdown-menu-dark,
+.ant-dropdown-menu-dark .ant-dropdown-menu {
+  background: #001529;
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a {
+  color: rgba(255, 255, 255, 0.65);
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow:after {
+  color: rgba(255, 255, 255, 0.65);
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover {
+  color: #fff;
+  background: transparent;
+}
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,
+.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a {
+  background: @primary-color;
+  color: #fff;
+}
+.ant-form {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-form legend {
+  color: rgba(0, 0, 0, 0.45);
+  border: 0;
+  border-bottom: 1px solid #d9d9d9;
+}
+.ant-form output {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-form-item-required:before {
+  color: #f5222d;
+}
+.ant-form-item {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-form-item-label label {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-form-explain,
+.ant-form-extra {
+  color: rgba(0, 0, 0, 0.45);
+}
+form .ant-upload {
+  background: transparent;
+}
+.ant-input-group-wrap .ant-select-selection {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group-wrap .ant-select-selection:hover {
+  border-color: #d9d9d9;
+}
+.ant-input-group-wrap .ant-select-selection--single {
+  background-color: #eee;
+}
+.ant-input-group-wrap .ant-select-open .ant-select-selection {
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.has-success.has-feedback .ant-form-item-children-icon {
+  color: #52c41a;
+}
+.has-warning .ant-form-explain,
+.has-warning .ant-form-split {
+  color: #faad14;
+}
+.has-warning .ant-input,
+.has-warning .ant-input:hover {
+  border-color: #faad14;
+}
+.has-warning .ant-input:focus {
+  border-color: #ffc53d;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+  border-right-width: 1px !important;
+}
+.has-warning .ant-input:not([disabled]):hover {
+  border-color: #faad14;
+}
+.has-warning .ant-calendar-picker-open .ant-calendar-picker-input {
+  border-color: #ffc53d;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+  border-right-width: 1px !important;
+}
+.has-warning .ant-input-prefix {
+  color: #faad14;
+}
+.has-warning .ant-input-group-addon {
+  color: #faad14;
+  border-color: #faad14;
+  background-color: #fff;
+}
+.has-warning .has-feedback {
+  color: #faad14;
+}
+.has-warning.has-feedback .ant-form-item-children-icon {
+  color: #faad14;
+}
+.has-warning .ant-select-selection {
+  border-color: #faad14;
+}
+.has-warning .ant-select-open .ant-select-selection,
+.has-warning .ant-select-focused .ant-select-selection {
+  border-color: #ffc53d;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+  border-right-width: 1px !important;
+}
+.has-warning .ant-calendar-picker-icon:after,
+.has-warning .ant-time-picker-icon:after,
+.has-warning .ant-picker-icon:after,
+.has-warning .ant-select-arrow,
+.has-warning .ant-cascader-picker-arrow {
+  color: #faad14;
+}
+.has-warning .ant-input-number,
+.has-warning .ant-time-picker-input {
+  border-color: #faad14;
+}
+.has-warning .ant-input-number-focused,
+.has-warning .ant-time-picker-input-focused,
+.has-warning .ant-input-number:focus,
+.has-warning .ant-time-picker-input:focus {
+  border-color: #ffc53d;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+  border-right-width: 1px !important;
+}
+.has-warning .ant-input-number:not([disabled]):hover,
+.has-warning .ant-time-picker-input:not([disabled]):hover {
+  border-color: #faad14;
+}
+.has-warning .ant-cascader-picker:focus .ant-cascader-input {
+  border-color: #ffc53d;
+  box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-form-explain,
+.has-error .ant-form-split {
+  color: #f5222d;
+}
+.has-error .ant-input,
+.has-error .ant-input:hover {
+  border-color: #f5222d;
+}
+.has-error .ant-input:focus {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-input:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-calendar-picker-open .ant-calendar-picker-input {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-input-prefix {
+  color: #f5222d;
+}
+.has-error .ant-input-group-addon {
+  color: #f5222d;
+  border-color: #f5222d;
+  background-color: #fff;
+}
+.has-error .has-feedback {
+  color: #f5222d;
+}
+.has-error.has-feedback .ant-form-item-children-icon {
+  color: #f5222d;
+}
+.has-error .ant-select-selection {
+  border-color: #f5222d;
+}
+.has-error .ant-select-open .ant-select-selection,
+.has-error .ant-select-focused .ant-select-selection {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-select.ant-select-auto-complete .ant-input:focus {
+  border-color: #f5222d;
+}
+.has-error .ant-input-group-addon .ant-select-selection {
+  border-color: transparent;
+  box-shadow: none;
+}
+.has-error .ant-calendar-picker-icon:after,
+.has-error .ant-time-picker-icon:after,
+.has-error .ant-picker-icon:after,
+.has-error .ant-select-arrow,
+.has-error .ant-cascader-picker-arrow {
+  color: #f5222d;
+}
+.has-error .ant-input-number,
+.has-error .ant-time-picker-input {
+  border-color: #f5222d;
+}
+.has-error .ant-input-number-focused,
+.has-error .ant-time-picker-input-focused,
+.has-error .ant-input-number:focus,
+.has-error .ant-time-picker-input:focus {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-input-number:not([disabled]):hover,
+.has-error .ant-time-picker-input:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-mention-wrapper .ant-mention-editor,
+.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover {
+  border-color: #f5222d;
+}
+.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor,
+.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.has-error .ant-cascader-picker:focus .ant-cascader-input {
+  border-color: #ff4d4f;
+  box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2);
+  border-right-width: 1px !important;
+}
+.is-validating.has-feedback .ant-form-item-children-icon {
+  color: @primary-color;
+}
+.ant-input-number {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-input-number::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-number:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-number-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-number-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-input-number-handler {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-input-number-handler:active {
+  background: #f4f4f4;
+}
+.ant-input-number-handler:hover .ant-input-number-handler-up-inner,
+.ant-input-number-handler:hover .ant-input-number-handler-down-inner {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-input-number-handler-up-inner,
+.ant-input-number-handler-down-inner {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-input-number:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-number-focused {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-number-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-number-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-input-number-input {
+  background-color: transparent;
+  border: 0;
+  border-radius: 4px;
+}
+.ant-input-number-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input-number-handler-wrap {
+  border-left: 1px solid #d9d9d9;
+  background: #fff;
+  border-radius: 0 4px 4px 0;
+}
+.ant-input-number-handler-down {
+  border-top: 1px solid #d9d9d9;
+}
+.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner,
+.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-input-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-input-group {
+  color: rgba(0, 0, 0, 0.65);
+  border-collapse: separate;
+  border-spacing: 0;
+}
+.ant-input-group-addon:not(:first-child):not(:last-child),
+.ant-input-group-wrap:not(:first-child):not(:last-child),
+.ant-input-group > .ant-input:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.ant-input-group .ant-input:focus {
+  border-right-width: 1px;
+}
+.ant-input-group .ant-input:hover {
+  border-right-width: 1px;
+}
+.ant-input-group-addon {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fafafa;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-input-group-addon .ant-select .ant-select-selection {
+  background-color: inherit;
+  border: 1px solid transparent;
+  box-shadow: none;
+}
+.ant-input-group-addon .ant-select-open .ant-select-selection,
+.ant-input-group-addon .ant-select-focused .ant-select-selection {
+  color: @primary-color;
+}
+.ant-input-group > .ant-input:first-child,
+.ant-input-group-addon:first-child {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group > .ant-input:first-child .ant-select .ant-select-selection,
+.ant-input-group-addon:first-child .ant-select .ant-select-selection {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-input-group-addon:first-child {
+  border-right: 0;
+}
+.ant-input-group-addon:last-child {
+  border-left: 0;
+}
+.ant-input-group > .ant-input:last-child,
+.ant-input-group-addon:last-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group > .ant-input:last-child .ant-select .ant-select-selection,
+.ant-input-group-addon:last-child .ant-select .ant-select-selection {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child),
+.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child),
+.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child) {
+  border-right-width: 1px;
+  border-right-color: transparent;
+}
+.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):hover,
+.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):hover,
+.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact-addon:not(:first-child):not(:last-child):focus,
+.ant-input-group.ant-input-group-compact-wrap:not(:first-child):not(:last-child):focus,
+.ant-input-group.ant-input-group-compact > .ant-input:not(:first-child):not(:last-child):focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact > * {
+  border-radius: 0;
+  border-right-width: 0;
+}
+.ant-input-group.ant-input-group-compact > span:not(:last-child) > .ant-input {
+  border-right-width: 0;
+}
+.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input {
+  border-radius: 0;
+  border-right-width: 1px;
+  border-right-color: transparent;
+}
+.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:hover,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:hover,
+.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection:focus,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor:focus,
+.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact > *:first-child,
+.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.ant-input-group.ant-input-group-compact > *:last-child,
+.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  border-right-width: 1px;
+  border-right-color: #d9d9d9;
+}
+.ant-input-group.ant-input-group-compact > *:last-child:hover,
+.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:hover,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:hover,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:hover,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact > *:last-child:focus,
+.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-group.ant-input-group-compact > *:last-child:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-cascader-picker-focused:last-child .ant-input:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor:focus .ant-cascader-input,
+.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input:focus .ant-cascader-input {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-input-affix-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-input-affix-wrapper .ant-input-prefix,
+.ant-input-affix-wrapper .ant-input-suffix {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-input-search-icon {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-input-search-icon:hover {
+  color: #333;
+}
+.ant-input-search > .ant-input-suffix > .ant-input-search-button {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.ant-layout {
+  background: #f0f2f5;
+}
+.ant-layout-header {
+  background: #001529;
+}
+.ant-layout-footer {
+  background: #f0f2f5;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-layout-sider {
+  background: #001529;
+}
+.ant-layout-sider-trigger {
+  color: #fff;
+  background: #002140;
+}
+.ant-layout-sider-zero-width-trigger {
+  background: #001529;
+  color: #fff;
+  border-radius: 0 4px 4px 0;
+}
+.ant-layout-sider-zero-width-trigger:hover {
+  background: #192c3e;
+}
+.ant-layout-sider-light {
+  background: #fff;
+}
+.ant-layout-sider-light .ant-layout-sider-trigger {
+  color: rgba(0, 0, 0, 0.65);
+  background: #fff;
+}
+.ant-layout-sider-light .ant-layout-sider-zero-width-trigger {
+  color: rgba(0, 0, 0, 0.65);
+  background: #fff;
+}
+.ant-list {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-list-empty-text {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-list-item-meta-title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-list-item-meta-title > a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-list-item-meta-title > a:hover {
+  color: @primary-color;
+}
+.ant-list-item-meta-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-list-item-action > li {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-list-item-action-split {
+  background-color: #e8e8e8;
+}
+.ant-list-empty {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-list-split .ant-list-item {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-split .ant-list-item:last-child {
+  border-bottom: none;
+}
+.ant-list-split .ant-list-header {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-something-after-last-item .ant-spin-container > .ant-list-item:last-child {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-list-vertical .ant-list-item-meta-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-list-vertical .ant-list-item-content {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-list-grid .ant-list-item {
+  border-bottom: none;
+}
+.ant-list-bordered {
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+}
+.ant-list-bordered .ant-list-item {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-mention-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-mention-wrapper .ant-mention-editor {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-mention-wrapper .ant-mention-editor::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-mention-wrapper .ant-mention-editor:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-mention-wrapper .ant-mention-editor:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-mention-wrapper .ant-mention-editor-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-wrapper .ant-mention-editor-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-mention-wrapper.disabled .ant-mention-editor {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-wrapper.disabled .ant-mention-editor:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner {
+  color: #bfbfbf;
+}
+.ant-mention-dropdown {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+}
+.ant-mention-dropdown-notfound.ant-mention-dropdown-item {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading {
+  color: @primary-color;
+}
+.ant-mention-dropdown-item {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-mention-dropdown-item:hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-mention-dropdown-item.focus,
+.ant-mention-dropdown-item-active {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-mention-dropdown-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-mention-dropdown-item-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+}
+.ant-mention-dropdown-item-selected,
+.ant-mention-dropdown-item-selected:hover {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-mention-dropdown-item-divider {
+  background-color: #e8e8e8;
+}
+.ant-menu {
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  color: rgba(0, 0, 0, 0.65);
+  background: #fff;
+}
+.ant-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-menu-item:active,
+.ant-menu-submenu-title:active {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-menu-item > a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-menu-item > a:hover {
+  color: @primary-color;
+}
+.ant-menu-item > a:before {
+  background-color: transparent;
+}
+.ant-menu-item-divider {
+  background-color: #e8e8e8;
+}
+.ant-menu-item:hover,
+.ant-menu-item-active,
+.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,
+.ant-menu-submenu-active,
+.ant-menu-submenu-title:hover {
+  color: @primary-color;
+}
+.ant-menu-horizontal > .ant-menu-item:hover,
+.ant-menu-horizontal > .ant-menu-item-active,
+.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover {
+  background-color: transparent;
+}
+.ant-menu-item-selected {
+  color: @primary-color;
+}
+.ant-menu-item-selected > a,
+.ant-menu-item-selected > a:hover {
+  color: @primary-color;
+}
+.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-menu-inline,
+.ant-menu-vertical,
+.ant-menu-vertical-left {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-menu-vertical-right {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-menu-vertical.ant-menu-sub,
+.ant-menu-vertical-left.ant-menu-sub,
+.ant-menu-vertical-right.ant-menu-sub {
+  border-right: 0;
+}
+.ant-menu-vertical.ant-menu-sub .ant-menu-item,
+.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,
+.ant-menu-vertical-right.ant-menu-sub .ant-menu-item {
+  border-right: 0;
+}
+.ant-menu-vertical.ant-menu-sub .ant-menu-item:after,
+.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,
+.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after {
+  border-right: 0;
+}
+.ant-menu > .ant-menu-item-divider {
+  background-color: #e8e8e8;
+}
+.ant-menu-submenu-popup {
+  border-radius: 4px;
+}
+.ant-menu-submenu > .ant-menu {
+  background-color: #fff;
+  border-radius: 4px;
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after {
+  background: #fff;
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65));
+  border-radius: 2px;
+}
+.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before {
+  background: linear-gradient(to right, @primary-color, @primary-color);
+}
+.ant-menu-vertical .ant-menu-submenu-selected,
+.ant-menu-vertical-left .ant-menu-submenu-selected,
+.ant-menu-vertical-right .ant-menu-submenu-selected {
+  color: @primary-color;
+}
+.ant-menu-vertical .ant-menu-submenu-selected > a,
+.ant-menu-vertical-left .ant-menu-submenu-selected > a,
+.ant-menu-vertical-right .ant-menu-submenu-selected > a {
+  color: @primary-color;
+}
+.ant-menu-horizontal {
+  border: 0;
+  border-bottom: 1px solid #e8e8e8;
+  box-shadow: none;
+}
+.ant-menu-horizontal > .ant-menu-item,
+.ant-menu-horizontal > .ant-menu-submenu {
+  border-bottom: 2px solid transparent;
+}
+.ant-menu-horizontal > .ant-menu-item:hover,
+.ant-menu-horizontal > .ant-menu-submenu:hover,
+.ant-menu-horizontal > .ant-menu-item-active,
+.ant-menu-horizontal > .ant-menu-submenu-active,
+.ant-menu-horizontal > .ant-menu-item-open,
+.ant-menu-horizontal > .ant-menu-submenu-open,
+.ant-menu-horizontal > .ant-menu-item-selected,
+.ant-menu-horizontal > .ant-menu-submenu-selected {
+  border-bottom: 2px solid @primary-color;
+  color: @primary-color;
+}
+.ant-menu-horizontal > .ant-menu-item > a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-menu-horizontal > .ant-menu-item > a:hover {
+  color: @primary-color;
+}
+.ant-menu-horizontal > .ant-menu-item-selected > a {
+  color: @primary-color;
+}
+.ant-menu-vertical .ant-menu-item:after,
+.ant-menu-vertical-left .ant-menu-item:after,
+.ant-menu-vertical-right .ant-menu-item:after,
+.ant-menu-inline .ant-menu-item:after {
+  border-right: 3px solid @primary-color;
+}
+.ant-menu-inline-collapsed-tooltip a {
+  color: rgba(255, 255, 255, 0.85);
+}
+.ant-menu-root.ant-menu-vertical,
+.ant-menu-root.ant-menu-vertical-left,
+.ant-menu-root.ant-menu-vertical-right,
+.ant-menu-root.ant-menu-inline {
+  box-shadow: none;
+}
+.ant-menu-sub.ant-menu-inline {
+  border: 0;
+  box-shadow: none;
+  border-radius: 0;
+}
+.ant-menu-item-disabled,
+.ant-menu-submenu-disabled {
+  color: rgba(0, 0, 0, 0.25) !important;
+  background: none;
+  border-color: transparent !important;
+}
+.ant-menu-item-disabled > a,
+.ant-menu-submenu-disabled > a {
+  color: rgba(0, 0, 0, 0.25) !important;
+}
+.ant-menu-item-disabled > .ant-menu-submenu-title,
+.ant-menu-submenu-disabled > .ant-menu-submenu-title {
+  color: rgba(0, 0, 0, 0.25) !important;
+}
+.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after {
+  background: rgba(0, 0, 0, 0.25) !important;
+}
+.ant-menu-dark,
+.ant-menu-dark .ant-menu-sub {
+  color: rgba(255, 255, 255, 0.65);
+  background: #001529;
+}
+.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before {
+  background: #fff;
+}
+.ant-menu-dark.ant-menu-submenu-popup {
+  background: transparent;
+}
+.ant-menu-dark .ant-menu-inline.ant-menu-sub {
+  background: #000c17;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset;
+}
+.ant-menu-dark.ant-menu-horizontal {
+  border-bottom: 0;
+}
+.ant-menu-dark.ant-menu-horizontal > .ant-menu-item,
+.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu {
+  border-color: #001529;
+  border-bottom: 0;
+}
+.ant-menu-dark .ant-menu-item,
+.ant-menu-dark .ant-menu-item-group-title,
+.ant-menu-dark .ant-menu-item > a {
+  color: rgba(255, 255, 255, 0.65);
+}
+.ant-menu-dark.ant-menu-inline,
+.ant-menu-dark.ant-menu-vertical,
+.ant-menu-dark.ant-menu-vertical-left,
+.ant-menu-dark.ant-menu-vertical-right {
+  border-right: 0;
+}
+.ant-menu-dark.ant-menu-inline .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-dark.ant-menu-vertical-right .ant-menu-item {
+  border-right: 0;
+}
+.ant-menu-dark.ant-menu-inline .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,
+.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after {
+  border-right: 0;
+}
+.ant-menu-dark .ant-menu-item:hover,
+.ant-menu-dark .ant-menu-item-active,
+.ant-menu-dark .ant-menu-submenu-active,
+.ant-menu-dark .ant-menu-submenu-open,
+.ant-menu-dark .ant-menu-submenu-selected,
+.ant-menu-dark .ant-menu-submenu-title:hover {
+  background-color: transparent;
+  color: #fff;
+}
+.ant-menu-dark .ant-menu-item:hover > a,
+.ant-menu-dark .ant-menu-item-active > a,
+.ant-menu-dark .ant-menu-submenu-active > a,
+.ant-menu-dark .ant-menu-submenu-open > a,
+.ant-menu-dark .ant-menu-submenu-selected > a,
+.ant-menu-dark .ant-menu-submenu-title:hover > a {
+  color: #fff;
+}
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before {
+  background: #fff;
+}
+.ant-menu-dark .ant-menu-item-selected {
+  border-right: 0;
+  color: #fff;
+}
+.ant-menu-dark .ant-menu-item-selected:after {
+  border-right: 0;
+}
+.ant-menu-dark .ant-menu-item-selected > a,
+.ant-menu-dark .ant-menu-item-selected > a:hover {
+  color: #fff;
+}
+.ant-menu.ant-menu-dark .ant-menu-item-selected,
+.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected {
+  background-color: @primary-color;
+}
+.ant-menu-dark .ant-menu-item-disabled,
+.ant-menu-dark .ant-menu-submenu-disabled,
+.ant-menu-dark .ant-menu-item-disabled > a,
+.ant-menu-dark .ant-menu-submenu-disabled > a {
+  color: rgba(255, 255, 255, 0.35) !important;
+}
+.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title,
+.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title {
+  color: rgba(255, 255, 255, 0.35) !important;
+}
+.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before,
+.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after,
+.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after {
+  background: rgba(255, 255, 255, 0.35) !important;
+}
+.ant-message {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-message-notice-content {
+  border-radius: 4px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  background: #fff;
+}
+.ant-message-success .anticon {
+  color: #52c41a;
+}
+.ant-message-error .anticon {
+  color: #f5222d;
+}
+.ant-message-warning .anticon {
+  color: #faad14;
+}
+.ant-message-info .anticon,
+.ant-message-loading .anticon {
+  color: @primary-color;
+}
+.ant-modal {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-modal-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-modal-content {
+  background-color: #fff;
+  border: 0;
+  border-radius: 4px;
+  background-clip: padding-box;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+}
+.ant-modal-close {
+  border: 0;
+  background: transparent;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-modal-close:focus,
+.ant-modal-close:hover {
+  color: #444;
+}
+.ant-modal-header {
+  border-radius: 4px 4px 0 0;
+  background: #fff;
+  color: rgba(0, 0, 0, 0.65);
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-modal-footer {
+  border-top: 1px solid #e8e8e8;
+  border-radius: 0 0 4px 4px;
+}
+.ant-modal-mask {
+  background-color: rgba(0, 0, 0, 0.65);
+}
+.ant-confirm-body .ant-confirm-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-confirm-body .ant-confirm-content {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-confirm-error .ant-confirm-body > .anticon {
+  color: #f5222d;
+}
+.ant-confirm-warning .ant-confirm-body > .anticon,
+.ant-confirm-confirm .ant-confirm-body > .anticon {
+  color: #faad14;
+}
+.ant-confirm-info .ant-confirm-body > .anticon {
+  color: @primary-color;
+}
+.ant-confirm-success .ant-confirm-body > .anticon {
+  color: #52c41a;
+}
+.ant-notification {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-notification-notice {
+  border-radius: 4px;
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+  background: #fff;
+}
+.ant-notification-notice-message {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-notification-notice-message-single-line-auto-margin {
+  background-color: transparent;
+}
+.ant-notification-notice-icon-success {
+  color: #52c41a;
+}
+.ant-notification-notice-icon-info {
+  color: @primary-color;
+}
+.ant-notification-notice-icon-warning {
+  color: #faad14;
+}
+.ant-notification-notice-icon-error {
+  color: #f5222d;
+}
+.ant-notification-notice-close {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-notification-notice-close:hover {
+  color: rgba(0, 0, 0, 0.67);
+}
+.ant-pagination {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-pagination-item {
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  background-color: #fff;
+}
+.ant-pagination-item a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-pagination-item:focus,
+.ant-pagination-item:hover {
+  border-color: @primary-color;
+}
+.ant-pagination-item:focus a,
+.ant-pagination-item:hover a {
+  color: @primary-color;
+}
+.ant-pagination-item-active {
+  border-color: @primary-color;
+}
+.ant-pagination-item-active a {
+  color: @primary-color;
+}
+.ant-pagination-item-active:focus,
+.ant-pagination-item-active:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-pagination-item-active:focus a,
+.ant-pagination-item-active:hover a {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon,
+.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon {
+  color: @primary-color;
+}
+.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis,
+.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-pagination-prev,
+.ant-pagination-next,
+.ant-pagination-jump-prev,
+.ant-pagination-jump-next {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 4px;
+}
+.ant-pagination-prev a,
+.ant-pagination-next a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-pagination-prev:hover a,
+.ant-pagination-next:hover a {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination-next .ant-pagination-item-link {
+  border: 1px solid #d9d9d9;
+  background-color: #fff;
+  border-radius: 4px;
+}
+.ant-pagination-prev:focus .ant-pagination-item-link,
+.ant-pagination-next:focus .ant-pagination-item-link,
+.ant-pagination-prev:hover .ant-pagination-item-link,
+.ant-pagination-next:hover .ant-pagination-item-link {
+  border-color: @primary-color;
+  color: @primary-color;
+}
+.ant-pagination-disabled a,
+.ant-pagination-disabled:hover a,
+.ant-pagination-disabled:focus a,
+.ant-pagination-disabled .ant-pagination-item-link,
+.ant-pagination-disabled:hover .ant-pagination-item-link,
+.ant-pagination-disabled:focus .ant-pagination-item-link {
+  border-color: #d9d9d9;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-pagination-options-quick-jumper input {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-pagination-options-quick-jumper input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-pagination-options-quick-jumper input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-pagination-options-quick-jumper input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-pagination-options-quick-jumper input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-pagination-options-quick-jumper input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-pagination-options-quick-jumper input-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-pagination-options-quick-jumper input-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link {
+  border: 0;
+}
+.ant-pagination-simple .ant-pagination-simple-pager input {
+  background-color: #fff;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+}
+.ant-pagination-simple .ant-pagination-simple-pager input:hover {
+  border-color: @primary-color;
+}
+.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) {
+  background: transparent;
+  border-color: transparent;
+}
+.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link,
+.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link {
+  border-color: transparent;
+  background: transparent;
+}
+.ant-popover {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-popover:after {
+  background: rgba(255, 255, 255, 0.01);
+}
+.ant-popover-inner {
+  background-color: #fff;
+  background-clip: padding-box;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-popover-title {
+  border-bottom: 1px solid #e8e8e8;
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-popover-inner-content {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-popover-message {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-popover-message > .anticon {
+  color: #faad14;
+}
+.ant-popover-arrow {
+  background: #fff;
+  border-color: transparent;
+  border-style: solid;
+}
+.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow {
+  box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow {
+  box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow {
+  box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06);
+}
+.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow,
+.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow {
+  box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07);
+}
+.ant-progress {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-progress-inner {
+  background-color: #f5f5f5;
+  border-radius: 100px;
+}
+.ant-progress-success-bg,
+.ant-progress-bg {
+  background-color: @primary-color;
+}
+.ant-progress-success-bg {
+  background-color: #52c41a;
+}
+.ant-progress-text {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-progress-status-active .ant-progress-bg:before {
+  background: #fff;
+  border-radius: 10px;
+}
+.ant-progress-status-exception .ant-progress-bg {
+  background-color: #f5222d;
+}
+.ant-progress-status-exception .ant-progress-text {
+  color: #f5222d;
+}
+.ant-progress-status-success .ant-progress-bg {
+  background-color: #52c41a;
+}
+.ant-progress-status-success .ant-progress-text {
+  color: #52c41a;
+}
+.ant-progress-circle .ant-progress-inner {
+  background-color: transparent;
+}
+.ant-progress-circle .ant-progress-text {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-progress-circle.ant-progress-status-exception .ant-progress-text {
+  color: #f5222d;
+}
+.ant-progress-circle.ant-progress-status-success .ant-progress-text {
+  color: #52c41a;
+}
+.ant-radio-group {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-radio-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-radio {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-radio-wrapper:hover .ant-radio .ant-radio-inner,
+.ant-radio:hover .ant-radio-inner,
+.ant-radio-focused .ant-radio-inner {
+  border-color: @primary-color;
+}
+.ant-radio-checked:after {
+  border-radius: 50%;
+  border: 1px solid @primary-color;
+}
+.ant-radio-inner {
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 100px;
+  border-color: #d9d9d9;
+  background-color: #fff;
+}
+.ant-radio-inner:after {
+  border-radius: 8px;
+  border-top: 0;
+  border-left: 0;
+  background-color: @primary-color;
+}
+.ant-radio-checked .ant-radio-inner {
+  border-color: @primary-color;
+}
+.ant-radio-disabled .ant-radio-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-radio-disabled .ant-radio-inner:after {
+  background-color: #ccc;
+}
+.ant-radio-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-radio-button-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+  border: 1px solid #d9d9d9;
+  border-left: 0;
+  border-top-width: 1.02px;
+  background: #fff;
+}
+.ant-radio-button-wrapper a {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-radio-button-wrapper:not(:first-child)::before {
+  background-color: #d9d9d9;
+}
+.ant-radio-button-wrapper:first-child {
+  border-radius: 4px 0 0 4px;
+  border-left: 1px solid #d9d9d9;
+}
+.ant-radio-button-wrapper:last-child {
+  border-radius: 0 4px 4px 0;
+}
+.ant-radio-button-wrapper:first-child:last-child {
+  border-radius: 4px;
+}
+.ant-radio-button-wrapper:hover,
+.ant-radio-button-wrapper-focused {
+  color: @primary-color;
+}
+.ant-radio-button-wrapper-checked {
+  background: #fff;
+  border-color: @primary-color;
+  color: @primary-color;
+  box-shadow: -1px 0 0 0 @primary-color;
+}
+.ant-radio-button-wrapper-checked::before {
+  background-color: @primary-color !important;
+}
+.ant-radio-button-wrapper-checked:first-child {
+  border-color: @primary-color;
+  box-shadow: none !important;
+}
+.ant-radio-button-wrapper-checked:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 5)`);
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-radio-button-wrapper-checked:active {
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+  box-shadow: -1px 0 0 0 color(~`colorPalette("@{primary-color}", 7)`);
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
+  background: @primary-color;
+  border-color: @primary-color;
+  color: #fff;
+}
+.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  background: color(~`colorPalette("@{primary-color}", 5)`);
+  color: #fff;
+}
+.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active {
+  border-color: color(~`colorPalette("@{primary-color}", 7)`);
+  background: color(~`colorPalette("@{primary-color}", 7)`);
+  color: #fff;
+}
+.ant-radio-button-wrapper-disabled {
+  border-color: #d9d9d9;
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-radio-button-wrapper-disabled:first-child,
+.ant-radio-button-wrapper-disabled:hover {
+  border-color: #d9d9d9;
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-radio-button-wrapper-disabled:first-child {
+  border-left-color: #d9d9d9;
+}
+.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked {
+  color: #fff;
+  background-color: #e6e6e6;
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-rate {
+  color: rgba(0, 0, 0, 0.65);
+  color: #fadb14;
+}
+.ant-rate-star {
+  color: inherit;
+}
+.ant-rate-star-first,
+.ant-rate-star-second {
+  color: #e8e8e8;
+}
+.ant-rate-star-half .ant-rate-star-first,
+.ant-rate-star-full .ant-rate-star-second {
+  color: inherit;
+}
+.ant-select {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select > ul > li > a {
+  background-color: #fff;
+}
+.ant-select-arrow {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-selection {
+  background-color: #fff;
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  border-top-width: 1.02px;
+}
+.ant-select-selection:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-select-focused .ant-select-selection,
+.ant-select-selection:focus,
+.ant-select-selection:active {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-select-selection__clear {
+  background: #fff;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-selection__clear:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-select-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-disabled .ant-select-selection {
+  background: #f5f5f5;
+}
+.ant-select-disabled .ant-select-selection:hover,
+.ant-select-disabled .ant-select-selection:focus,
+.ant-select-disabled .ant-select-selection:active {
+  border-color: #d9d9d9;
+  box-shadow: none;
+}
+.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice {
+  background: #f5f5f5;
+  color: #aaa;
+}
+.ant-select-disabled .ant-select-selection__choice__remove {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-disabled .ant-select-selection__choice__remove:hover {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-selection__placeholder,
+.ant-select-search__field__placeholder {
+  color: #bfbfbf;
+}
+.ant-select-search--inline .ant-select-search__field {
+  border-width: 0;
+  background: transparent;
+  border-radius: 4px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fafafa;
+  border: 1px solid #e8e8e8;
+  border-radius: 2px;
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-select-selection--multiple .ant-select-selection__choice__remove:hover {
+  color: #404040;
+}
+.ant-select-open .ant-select-selection {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-select-combobox .ant-select-search__field {
+  box-shadow: none;
+}
+.ant-select-dropdown {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  border-radius: 4px;
+}
+.ant-select-dropdown-menu-item-group-title {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child),
+.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child {
+  border-radius: 0;
+}
+.ant-select-dropdown-menu-item {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-dropdown-menu-item:hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-select-dropdown-menu-item:first-child {
+  border-radius: 4px 4px 0 0;
+}
+.ant-select-dropdown-menu-item:last-child {
+  border-radius: 0 0 4px 4px;
+}
+.ant-select-dropdown-menu-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-dropdown-menu-item-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+}
+.ant-select-dropdown-menu-item-selected,
+.ant-select-dropdown-menu-item-selected:hover {
+  background-color: #fafafa;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-dropdown-menu-item-active {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-select-dropdown-menu-item-divider {
+  background-color: #e8e8e8;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon {
+  color: transparent;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon {
+  color: #ddd;
+}
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon,
+.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon {
+  color: @primary-color;
+}
+.ant-skeleton-header .ant-skeleton-avatar {
+  background: #f2f2f2;
+}
+.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle {
+  border-radius: 50%;
+}
+.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle {
+  border-radius: 50%;
+}
+.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle {
+  border-radius: 50%;
+}
+.ant-skeleton-content .ant-skeleton-title {
+  background: #f2f2f2;
+}
+.ant-skeleton-content .ant-skeleton-paragraph > li {
+  background: #f2f2f2;
+}
+.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title,
+.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li {
+  background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
+  background-size: 400% 100%;
+}
+.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar {
+  background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
+  background-size: 400% 100%;
+}
+.ant-slider {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-slider-rail {
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+.ant-slider-track {
+  border-radius: 4px;
+  background-color: color(~`colorPalette("@{primary-color}", 3)`);
+}
+.ant-slider-handle {
+  border-radius: 50%;
+  border: solid 2px color(~`colorPalette("@{primary-color}", 3)`);
+  background-color: #fff;
+}
+.ant-slider-handle:focus {
+  border-color: #46a6ff;
+  box-shadow: 0 0 0 5px #8cc8ff;
+}
+.ant-slider-handle.ant-tooltip-open {
+  border-color: @primary-color;
+}
+.ant-slider:hover .ant-slider-rail {
+  background-color: #e1e1e1;
+}
+.ant-slider:hover .ant-slider-track {
+  background-color: color(~`colorPalette("@{primary-color}", 4)`);
+}
+.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) {
+  border-color: color(~`colorPalette("@{primary-color}", 4)`);
+}
+.ant-slider-mark-text {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-slider-mark-text-active {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-slider-step {
+  background: transparent;
+}
+.ant-slider-dot {
+  border: 2px solid #e8e8e8;
+  background-color: #fff;
+  border-radius: 50%;
+}
+.ant-slider-dot-active {
+  border-color: #8cc8ff;
+}
+.ant-slider-disabled .ant-slider-track {
+  background-color: rgba(0, 0, 0, 0.25) !important;
+}
+.ant-slider-disabled .ant-slider-handle,
+.ant-slider-disabled .ant-slider-dot {
+  border-color: rgba(0, 0, 0, 0.25) !important;
+  background-color: #fff;
+  box-shadow: none;
+}
+.ant-spin {
+  color: rgba(0, 0, 0, 0.65);
+  color: @primary-color;
+}
+.ant-spin-blur:after {
+  background: #fff;
+}
+.ant-spin-tip {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-spin-dot i {
+  border-radius: 100%;
+  background-color: @primary-color;
+}
+.ant-steps {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-steps-item-icon {
+  border: 1px solid rgba(0, 0, 0, 0.25);
+  border-radius: 32px;
+}
+.ant-steps-item-icon > .ant-steps-icon {
+  color: @primary-color;
+}
+.ant-steps-item-tail:after {
+  background: #e8e8e8;
+  border-radius: 1px;
+}
+.ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-steps-item-title:after {
+  background: #e8e8e8;
+}
+.ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait .ant-steps-item-icon {
+  border-color: rgba(0, 0, 0, 0.25);
+  background-color: #fff;
+}
+.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: rgba(0, 0, 0, 0.25);
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-wait > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process .ant-steps-item-icon {
+  border-color: @primary-color;
+  background-color: #fff;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: @primary-color;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: @primary-color;
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-steps-item-process > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-process .ant-steps-item-icon {
+  background: @primary-color;
+}
+.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: #fff;
+}
+.ant-steps-item-finish .ant-steps-item-icon {
+  border-color: @primary-color;
+  background-color: #fff;
+}
+.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon {
+  color: @primary-color;
+}
+.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: @primary-color;
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: @primary-color;
+}
+.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-item-finish > .ant-steps-item-tail:after {
+  background-color: @primary-color;
+}
+.ant-steps-item-error .ant-steps-item-icon {
+  border-color: #f5222d;
+  background-color: #fff;
+}
+.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon {
+  color: #f5222d;
+}
+.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot {
+  background: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title {
+  color: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-description {
+  color: #f5222d;
+}
+.ant-steps-item-error > .ant-steps-item-tail:after {
+  background-color: #e8e8e8;
+}
+.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after {
+  background: #f5222d;
+}
+.ant-steps-item-custom .ant-steps-item-icon {
+  background: none;
+  border: 0;
+}
+.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon {
+  color: @primary-color;
+}
+.ant-steps-small .ant-steps-item-icon {
+  border-radius: 24px;
+}
+.ant-steps-small .ant-steps-item-description {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon {
+  border-radius: 0;
+  border: 0;
+  background: none;
+}
+.ant-steps-dot .ant-steps-item-icon {
+  border: 0;
+  background: transparent;
+}
+.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot {
+  border-radius: 100px;
+}
+.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after {
+  background: rgba(0, 0, 0, 0.001);
+}
+.ant-switch {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 100px;
+  border: 1px solid transparent;
+  background-color: rgba(0, 0, 0, 0.25);
+}
+.ant-switch-inner {
+  color: #fff;
+}
+.ant-switch-loading-icon,
+.ant-switch:after {
+  border-radius: 18px;
+  background-color: #fff;
+}
+.ant-switch:after {
+  box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2);
+}
+.ant-switch-loading-icon {
+  background: transparent;
+}
+.ant-switch-loading .ant-switch-loading-icon {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon {
+  color: @primary-color;
+}
+.ant-switch:focus {
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+}
+.ant-switch:focus:hover {
+  box-shadow: none;
+}
+.ant-switch-checked {
+  background-color: @primary-color;
+}
+.ant-table {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-table table {
+  border-collapse: collapse;
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-thead > tr > th {
+  background: #fafafa;
+  color: rgba(0, 0, 0, 0.85);
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-thead > tr > th .anticon-filter,
+.ant-table-thead > tr > th .ant-table-filter-icon {
+  color: #bfbfbf;
+}
+.ant-table-thead > tr > th .ant-table-filter-selected.anticon-filter {
+  color: @primary-color;
+}
+.ant-table-thead > tr > th .ant-table-column-sorter {
+  color: #bfbfbf;
+}
+.ant-table-thead > tr > th .ant-table-column-sorter-up.on,
+.ant-table-thead > tr > th .ant-table-column-sorter-down.on {
+  color: @primary-color;
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover {
+  background: #f5f5f5;
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter,
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon {
+  background: #f5f5f5;
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:hover,
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:hover {
+  color: rgba(0, 0, 0, 0.45);
+  background: #ebebeb;
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .anticon-filter:active,
+.ant-table-thead > tr > th.ant-table-column-has-actions:hover .ant-table-filter-icon:active {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions .anticon-filter.ant-table-filter-open,
+.ant-table-thead > tr > th.ant-table-column-has-actions .ant-table-filter-icon.ant-table-filter-open {
+  color: rgba(0, 0, 0, 0.45);
+  background: #ebebeb;
+}
+.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-up:not(.on),
+.ant-table-thead > tr > th.ant-table-column-has-actions:active .ant-table-column-sorter-down:not(.on) {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-table-thead > tr > th .ant-table-column-sorters:before {
+  background: transparent;
+}
+.ant-table-thead > tr > th .ant-table-column-sorters:hover:before {
+  background: rgba(0, 0, 0, 0.04);
+}
+.ant-table-thead > tr:first-child > th:first-child {
+  border-top-left-radius: 4px;
+}
+.ant-table-thead > tr:first-child > th:last-child {
+  border-top-right-radius: 4px;
+}
+.ant-table-thead > tr:not(:last-child) > th[colspan] {
+  border-bottom: 0;
+}
+.ant-table-tbody > tr > td {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-thead > tr.ant-table-row-hover > td,
+.ant-table-tbody > tr.ant-table-row-hover > td,
+.ant-table-thead > tr:hover > td,
+.ant-table-tbody > tr:hover > td {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-table-thead > tr:hover {
+  background: none;
+}
+.ant-table-footer {
+  background: #fafafa;
+  border-radius: 0 0 4px 4px;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-table-footer:before {
+  background: #fafafa;
+}
+.ant-table.ant-table-bordered .ant-table-footer {
+  border: 1px solid #e8e8e8;
+}
+.ant-table-title {
+  border-radius: 4px 4px 0 0;
+}
+.ant-table.ant-table-bordered .ant-table-title {
+  border: 1px solid #e8e8e8;
+}
+.ant-table-title + .ant-table-content {
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-bordered .ant-table-title + .ant-table-content,
+.ant-table-bordered .ant-table-title + .ant-table-content table,
+.ant-table-bordered .ant-table-title + .ant-table-content .ant-table-thead > tr:first-child > th {
+  border-radius: 0;
+}
+.ant-table-without-column-header .ant-table-title + .ant-table-content,
+.ant-table-without-column-header table {
+  border-radius: 0;
+}
+.ant-table-tbody > tr.ant-table-row-selected td {
+  background: #fafafa;
+}
+.ant-table-thead > tr > th.ant-table-column-sort {
+  background: #f5f5f5;
+}
+.ant-table-tbody > tr > td.ant-table-column-sort {
+  background: rgba(0, 0, 0, 0.01);
+}
+.ant-table-header {
+  background: #fafafa;
+}
+.ant-table-header table {
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-loading .ant-table-body {
+  background: #fff;
+}
+.ant-table-bordered .ant-table-header > table,
+.ant-table-bordered .ant-table-body > table,
+.ant-table-bordered .ant-table-fixed-left table,
+.ant-table-bordered .ant-table-fixed-right table {
+  border: 1px solid #e8e8e8;
+  border-right: 0;
+  border-bottom: 0;
+}
+.ant-table-bordered.ant-table-empty .ant-table-placeholder {
+  border-left: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-header > table {
+  border-bottom: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-body > table {
+  border-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner > table {
+  border-top: 0;
+}
+.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder {
+  border: 0;
+}
+.ant-table-bordered .ant-table-thead > tr:not(:last-child) > th {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-bordered .ant-table-thead > tr > th,
+.ant-table-bordered .ant-table-tbody > tr > td {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-placeholder {
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-table-filter-dropdown {
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-filter-dropdown .ant-dropdown-menu {
+  border: 0;
+  box-shadow: none;
+  border-radius: 4px 4px 0 0;
+}
+.ant-table-filter-dropdown .ant-dropdown-menu-sub {
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after {
+  color: @primary-color;
+}
+.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-item:last-child,
+.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title {
+  border-radius: 0;
+}
+.ant-table-filter-dropdown-btns {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-table-filter-dropdown-link {
+  color: @primary-color;
+}
+.ant-table-filter-dropdown-link:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-table-filter-dropdown-link:active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-table-selection .anticon-down {
+  color: #bfbfbf;
+}
+.ant-table-selection-menu {
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-table-selection-menu .ant-action-down {
+  color: #bfbfbf;
+}
+.ant-table-selection-down:hover .anticon-down {
+  color: #666;
+}
+.ant-table-row-expand-icon {
+  border: 1px solid #e8e8e8;
+  background: #fff;
+}
+tr.ant-table-expanded-row,
+tr.ant-table-expanded-row:hover {
+  background: #fbfbfb;
+}
+.ant-table-fixed-header > .ant-table-content > .ant-table-scroll > .ant-table-body {
+  background: #fff;
+}
+.ant-table-fixed-left,
+.ant-table-fixed-right {
+  border-radius: 0;
+}
+.ant-table-fixed-left table,
+.ant-table-fixed-right table {
+  background: #fff;
+}
+.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed,
+.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed {
+  border-radius: 0;
+}
+.ant-table-fixed-left {
+  box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15);
+}
+.ant-table-fixed-left,
+.ant-table-fixed-left table {
+  border-radius: 4px 0 0 0;
+}
+.ant-table-fixed-left .ant-table-thead > tr > th:last-child {
+  border-top-right-radius: 0;
+}
+.ant-table-fixed-right {
+  box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15);
+}
+.ant-table-fixed-right,
+.ant-table-fixed-right table {
+  border-radius: 0 4px 0 0;
+}
+.ant-table-fixed-right .ant-table-expanded-row {
+  color: transparent;
+}
+.ant-table-fixed-right .ant-table-thead > tr > th:first-child {
+  border-top-left-radius: 0;
+}
+.ant-table.ant-table-scroll-position-left .ant-table-fixed-left {
+  box-shadow: none;
+}
+.ant-table.ant-table-scroll-position-right .ant-table-fixed-right {
+  box-shadow: none;
+}
+.ant-table-small {
+  border: 1px solid #e8e8e8;
+  border-radius: 4px;
+}
+.ant-table-small > .ant-table-title {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-small > .ant-table-content > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-body > table,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table {
+  border: 0;
+}
+.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th,
+.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th {
+  background: #fff;
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-table-small > .ant-table-content .ant-table-header {
+  background: #fff;
+}
+.ant-table-small > .ant-table-content .ant-table-placeholder,
+.ant-table-small > .ant-table-content .ant-table-row:last-child td {
+  border-bottom: 0;
+}
+.ant-table-small.ant-table-bordered {
+  border-right: 0;
+}
+.ant-table-small.ant-table-bordered .ant-table-title {
+  border: 0;
+  border-bottom: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-content {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-footer {
+  border: 0;
+  border-top: 1px solid #e8e8e8;
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-placeholder {
+  border-left: 0;
+  border-bottom: 0;
+}
+.ant-table-small.ant-table-bordered .ant-table-thead > tr > th:last-child,
+.ant-table-small.ant-table-bordered .ant-table-tbody > tr > td:last-child {
+  border-right: none;
+}
+.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead > tr > th:last-child,
+.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody > tr > td:last-child {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-table-small.ant-table-bordered .ant-table-fixed-right {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  border: 1px solid #e8e8e8;
+  border-bottom: 0;
+  border-radius: 4px 4px 0 0;
+  background: #fafafa;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active {
+  background: #fff;
+  border-color: #e8e8e8;
+  color: @primary-color;
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x:hover {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-tabs-extra-content .ant-tabs-new-tab {
+  border-radius: 2px;
+  border: 1px solid #e8e8e8;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tabs-extra-content .ant-tabs-new-tab:hover {
+  color: @primary-color;
+  border-color: @primary-color;
+}
+.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab {
+  border-right: 0;
+  border-radius: 4px 0 0 4px;
+}
+.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab {
+  border-left: 0;
+  border-radius: 0 4px 4px 0;
+}
+.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab {
+  border-bottom: 1px solid #e8e8e8;
+  border-top: 0;
+  border-radius: 0 0 4px 4px;
+}
+.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab-active {
+  color: @primary-color;
+}
+.ant-tabs {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tabs-ink-bar {
+  background-color: @primary-color;
+}
+.ant-tabs-bar {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-tabs-bottom .ant-tabs-bar {
+  border-bottom: none;
+  border-top: 1px solid #e8e8e8;
+}
+.ant-tabs-tab-prev,
+.ant-tabs-tab-next {
+  border: 0;
+  background-color: transparent;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-tabs-tab-prev:hover,
+.ant-tabs-tab-next:hover {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tabs-tab-btn-disabled,
+.ant-tabs-tab-btn-disabled:hover {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tabs-nav .ant-tabs-tab-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tabs-nav .ant-tabs-tab:hover {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-tabs-nav .ant-tabs-tab:active {
+  color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-tabs-nav .ant-tabs-tab-active {
+  color: @primary-color;
+}
+.ant-tabs-vertical > .ant-tabs-bar {
+  border-bottom: 0;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-tabs-vertical.ant-tabs-left > .ant-tabs-content {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-tabs-vertical.ant-tabs-right > .ant-tabs-content {
+  border-right: 1px solid #e8e8e8;
+}
+.ant-tag {
+  color: rgba(0, 0, 0, 0.65);
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+  background: #fafafa;
+}
+.ant-tag,
+.ant-tag a,
+.ant-tag a:hover {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tag .anticon-close {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-tag .anticon-close:hover {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-tag-has-color {
+  border-color: transparent;
+}
+.ant-tag-has-color,
+.ant-tag-has-color a,
+.ant-tag-has-color a:hover,
+.ant-tag-has-color .anticon-close,
+.ant-tag-has-color .anticon-close:hover {
+  color: #fff;
+}
+.ant-tag-checkable {
+  background-color: transparent;
+  border-color: transparent;
+}
+.ant-tag-checkable:not(.ant-tag-checkable-checked):hover {
+  color: @primary-color;
+}
+.ant-tag-checkable:active,
+.ant-tag-checkable-checked {
+  color: #fff;
+}
+.ant-tag-checkable-checked {
+  background-color: @primary-color;
+}
+.ant-tag-checkable:active {
+  background-color: color(~`colorPalette("@{primary-color}", 7)`);
+}
+.ant-tag-pink {
+  color: #eb2f96;
+  background: #fff0f6;
+  border-color: #ffadd2;
+}
+.ant-tag-pink-inverse {
+  background: #eb2f96;
+  border-color: #eb2f96;
+  color: #fff;
+}
+.ant-tag-magenta {
+  color: #eb2f96;
+  background: #fff0f6;
+  border-color: #ffadd2;
+}
+.ant-tag-magenta-inverse {
+  background: #eb2f96;
+  border-color: #eb2f96;
+  color: #fff;
+}
+.ant-tag-red {
+  color: #f5222d;
+  background: #fff1f0;
+  border-color: #ffa39e;
+}
+.ant-tag-red-inverse {
+  background: #f5222d;
+  border-color: #f5222d;
+  color: #fff;
+}
+.ant-tag-volcano {
+  color: #fa541c;
+  background: #fff2e8;
+  border-color: #ffbb96;
+}
+.ant-tag-volcano-inverse {
+  background: #fa541c;
+  border-color: #fa541c;
+  color: #fff;
+}
+.ant-tag-orange {
+  color: #fa8c16;
+  background: #fff7e6;
+  border-color: #ffd591;
+}
+.ant-tag-orange-inverse {
+  background: #fa8c16;
+  border-color: #fa8c16;
+  color: #fff;
+}
+.ant-tag-yellow {
+  color: #fadb14;
+  background: #feffe6;
+  border-color: #fffb8f;
+}
+.ant-tag-yellow-inverse {
+  background: #fadb14;
+  border-color: #fadb14;
+  color: #fff;
+}
+.ant-tag-gold {
+  color: #faad14;
+  background: #fffbe6;
+  border-color: #ffe58f;
+}
+.ant-tag-gold-inverse {
+  background: #faad14;
+  border-color: #faad14;
+  color: #fff;
+}
+.ant-tag-cyan {
+  color: #13c2c2;
+  background: #e6fffb;
+  border-color: #87e8de;
+}
+.ant-tag-cyan-inverse {
+  background: #13c2c2;
+  border-color: #13c2c2;
+  color: #fff;
+}
+.ant-tag-lime {
+  color: #a0d911;
+  background: #fcffe6;
+  border-color: #eaff8f;
+}
+.ant-tag-lime-inverse {
+  background: #a0d911;
+  border-color: #a0d911;
+  color: #fff;
+}
+.ant-tag-green {
+  color: #52c41a;
+  background: #f6ffed;
+  border-color: #b7eb8f;
+}
+.ant-tag-green-inverse {
+  background: #52c41a;
+  border-color: #52c41a;
+  color: #fff;
+}
+.ant-tag-blue {
+  color: @primary-color;
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+  border-color: color(~`colorPalette("@{primary-color}", 3)`);
+}
+.ant-tag-blue-inverse {
+  background: @primary-color;
+  border-color: @primary-color;
+  color: #fff;
+}
+.ant-tag-geekblue {
+  color: #2f54eb;
+  background: #f0f5ff;
+  border-color: #adc6ff;
+}
+.ant-tag-geekblue-inverse {
+  background: #2f54eb;
+  border-color: #2f54eb;
+  color: #fff;
+}
+.ant-tag-purple {
+  color: #722ed1;
+  background: #f9f0ff;
+  border-color: #d3adf7;
+}
+.ant-tag-purple-inverse {
+  background: #722ed1;
+  border-color: #722ed1;
+  color: #fff;
+}
+.ant-time-picker-panel {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-time-picker-panel-inner {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+}
+.ant-time-picker-panel-input {
+  border: 0;
+}
+.ant-time-picker-panel-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-panel-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-panel-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-panel-input-wrap {
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-time-picker-panel-input-invalid {
+  border-color: red;
+}
+.ant-time-picker-panel-clear-btn-icon svg {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-panel-clear-btn-icon svg:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-time-picker-panel-select {
+  border-left: 1px solid #e8e8e8;
+}
+.ant-time-picker-panel-select:first-child {
+  border-left: 0;
+}
+.ant-time-picker-panel-select:last-child {
+  border-right: 0;
+}
+.ant-time-picker-panel-select li:hover {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+li.ant-time-picker-panel-select-option-selected {
+  background: #f5f5f5;
+}
+li.ant-time-picker-panel-select-option-selected:hover {
+  background: #f5f5f5;
+}
+li.ant-time-picker-panel-select-option-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-time-picker-panel-select-option-disabled:hover {
+  background: transparent;
+}
+.ant-time-picker-panel-addon {
+  border-top: 1px solid #e8e8e8;
+}
+.ant-time-picker {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-time-picker-input {
+  color: rgba(0, 0, 0, 0.65);
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-time-picker-input::-moz-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-input:-ms-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-input::-webkit-input-placeholder {
+  color: #bfbfbf;
+}
+.ant-time-picker-input:hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  border-right-width: 1px !important;
+}
+.ant-time-picker-input:focus {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+  box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
+  border-right-width: 1px !important;
+}
+.ant-time-picker-input-disabled {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-input-disabled:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-time-picker-input[disabled] {
+  background-color: #f5f5f5;
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-input[disabled]:hover {
+  border-color: #e6d8d8;
+  border-right-width: 1px !important;
+}
+.ant-time-picker-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-time-picker-icon .ant-time-picker-clock-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-timeline {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-timeline-item-tail {
+  border-left: 2px solid #e8e8e8;
+}
+.ant-timeline-item-head {
+  background-color: #fff;
+  border-radius: 100px;
+  border: 2px solid transparent;
+}
+.ant-timeline-item-head-blue {
+  border-color: @primary-color;
+  color: @primary-color;
+}
+.ant-timeline-item-head-red {
+  border-color: #f5222d;
+  color: #f5222d;
+}
+.ant-timeline-item-head-green {
+  border-color: #52c41a;
+  color: #52c41a;
+}
+.ant-timeline-item-head-custom {
+  border: 0;
+  border-radius: 0;
+}
+.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail {
+  border-left: 2px dotted #e8e8e8;
+}
+.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail {
+  border-left: 2px dotted #e8e8e8;
+}
+.ant-tooltip {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tooltip-inner {
+  color: #fff;
+  background-color: rgba(0, 0, 0, 0.75);
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+.ant-tooltip-arrow {
+  border-color: transparent;
+  border-style: solid;
+}
+.ant-tooltip-placement-top .ant-tooltip-arrow,
+.ant-tooltip-placement-topLeft .ant-tooltip-arrow,
+.ant-tooltip-placement-topRight .ant-tooltip-arrow {
+  border-width: 5px 5px 0;
+  border-top-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-right .ant-tooltip-arrow,
+.ant-tooltip-placement-rightTop .ant-tooltip-arrow,
+.ant-tooltip-placement-rightBottom .ant-tooltip-arrow {
+  border-width: 5px 5px 5px 0;
+  border-right-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-left .ant-tooltip-arrow,
+.ant-tooltip-placement-leftTop .ant-tooltip-arrow,
+.ant-tooltip-placement-leftBottom .ant-tooltip-arrow {
+  border-width: 5px 0 5px 5px;
+  border-left-color: rgba(0, 0, 0, 0.75);
+}
+.ant-tooltip-placement-bottom .ant-tooltip-arrow,
+.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,
+.ant-tooltip-placement-bottomRight .ant-tooltip-arrow {
+  border-width: 0 5px 5px;
+  border-bottom-color: rgba(0, 0, 0, 0.75);
+}
+.ant-transfer {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-transfer-disabled .ant-transfer-list {
+  background: #f5f5f5;
+}
+.ant-transfer-list {
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-transfer-list-search-action {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-search-action .anticon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-search-action .anticon:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-transfer-list-header {
+  border-radius: 4px 4px 0 0;
+  background: #fff;
+  color: rgba(0, 0, 0, 0.65);
+  border-bottom: 1px solid #e8e8e8;
+}
+.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-transfer-list-content-item-disabled {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-body-not-found {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-transfer-list-footer {
+  border-top: 1px solid #e8e8e8;
+  border-radius: 0 0 4px 4px;
+}
+.ant-select-tree-checkbox {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,
+.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner,
+.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner {
+  border-color: @primary-color;
+}
+.ant-select-tree-checkbox-checked:after {
+  border-radius: 2px;
+  border: 1px solid @primary-color;
+}
+.ant-select-tree-checkbox-inner {
+  border: 1px solid #d9d9d9;
+  border-radius: 2px;
+  background-color: #fff;
+}
+.ant-select-tree-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after {
+  border: 0;
+  background-color: @primary-color;
+}
+.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner {
+  background-color: @primary-color;
+  border-color: @primary-color;
+}
+.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after {
+  border-color: #f5f5f5;
+}
+.ant-select-tree-checkbox-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-select-tree-checkbox-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree-checkbox-group {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree li .ant-select-tree-node-content-wrapper {
+  border-radius: 2px;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree li .ant-select-tree-node-content-wrapper:hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected {
+  background-color: color(~`colorPalette("@{primary-color}", 2)`);
+}
+.ant-select-tree li span.ant-select-tree-switcher,
+.ant-select-tree li span.ant-select-tree-iconEle {
+  border: 0 none;
+}
+.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon {
+  color: @primary-color;
+}
+.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon,
+.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon {
+  color: @primary-color;
+}
+li.ant-select-tree-treenode-disabled > span:not(.ant-select-tree-switcher),
+li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper,
+li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper span {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper:hover {
+  background: transparent;
+}
+.ant-select-tree-dropdown {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field {
+  border: 1px solid #d9d9d9;
+  border-radius: 4px;
+}
+.ant-select-tree-dropdown .ant-select-not-found {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper {
+  border-radius: 0;
+}
+.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover {
+  background: transparent;
+}
+.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover:before,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover:before {
+  background: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper.ant-tree-node-selected,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper.ant-tree-node-selected {
+  color: #fff;
+  background: transparent;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-switcher,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-switcher {
+  color: #fff;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner {
+  border-color: @primary-color;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after {
+  border-color: #fff;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner {
+  background: #fff;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after {
+  border-color: @primary-color;
+}
+.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before,
+.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before {
+  background: @primary-color;
+}
+.ant-tree-checkbox {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,
+.ant-tree-checkbox:hover .ant-tree-checkbox-inner,
+.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner {
+  border-color: @primary-color;
+}
+.ant-tree-checkbox-checked:after {
+  border-radius: 2px;
+  border: 1px solid @primary-color;
+}
+.ant-tree-checkbox-inner {
+  border: 1px solid #d9d9d9;
+  border-radius: 2px;
+  background-color: #fff;
+}
+.ant-tree-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after {
+  border: 0;
+  background-color: @primary-color;
+}
+.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after {
+  border: 2px solid #fff;
+  border-top: 0;
+  border-left: 0;
+}
+.ant-tree-checkbox-checked .ant-tree-checkbox-inner {
+  background-color: @primary-color;
+  border-color: @primary-color;
+}
+.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after {
+  border-color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree-checkbox-disabled .ant-tree-checkbox-inner {
+  border-color: #d9d9d9 !important;
+  background-color: #f5f5f5;
+}
+.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after {
+  border-color: #f5f5f5;
+}
+.ant-tree-checkbox-disabled + span {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-tree-checkbox-wrapper {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tree-checkbox-group {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tree {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tree li span[draggable],
+.ant-tree li span[draggable="true"] {
+  border-top: 2px transparent solid;
+  border-bottom: 2px transparent solid;
+}
+.ant-tree li.drag-over > span[draggable] {
+  background-color: @primary-color;
+  color: white;
+}
+.ant-tree li.drag-over-gap-top > span[draggable] {
+  border-top-color: @primary-color;
+}
+.ant-tree li.drag-over-gap-bottom > span[draggable] {
+  border-bottom-color: @primary-color;
+}
+.ant-tree li.filter-node > span {
+  color: #f5222d !important;
+}
+.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon,
+.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon {
+  color: @primary-color;
+}
+.ant-tree li .ant-tree-node-content-wrapper {
+  border-radius: 2px;
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-tree li .ant-tree-node-content-wrapper:hover {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected {
+  background-color: color(~`colorPalette("@{primary-color}", 2)`);
+}
+.ant-tree li span.ant-tree-switcher,
+.ant-tree li span.ant-tree-iconEle {
+  border: 0 none;
+}
+li.ant-tree-treenode-disabled > span:not(.ant-tree-switcher),
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper,
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span {
+  color: rgba(0, 0, 0, 0.25);
+}
+li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper:hover {
+  background: transparent;
+}
+.ant-tree.ant-tree-show-line li span.ant-tree-switcher {
+  background: #fff;
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-tree.ant-tree-show-line li:not(:last-child):before {
+  border-left: 1px solid #d9d9d9;
+}
+.ant-upload {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-upload.ant-upload-select-picture-card {
+  border: 1px dashed #d9d9d9;
+  border-radius: 4px;
+  background-color: #fafafa;
+}
+.ant-upload.ant-upload-select-picture-card:hover {
+  border-color: @primary-color;
+}
+.ant-upload.ant-upload-drag {
+  border: 1px dashed #d9d9d9;
+  border-radius: 4px;
+  background: #fafafa;
+}
+.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) {
+  border: 2px dashed color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover {
+  border-color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon {
+  color: color(~`colorPalette("@{primary-color}", 5)`);
+}
+.ant-upload.ant-upload-drag p.ant-upload-text {
+  color: rgba(0, 0, 0, 0.85);
+}
+.ant-upload.ant-upload-drag p.ant-upload-hint {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload.ant-upload-drag .anticon-plus {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-upload.ant-upload-drag .anticon-plus:hover {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload.ant-upload-drag:hover .anticon-plus {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-upload-list-item-info .anticon-loading,
+.ant-upload-list-item-info .anticon-paper-clip {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list-item .anticon-close {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list-item .anticon-close:hover {
+  color: rgba(0, 0, 0, 0.65);
+}
+.ant-upload-list-item:hover .ant-upload-list-item-info {
+  background-color: color(~`colorPalette("@{primary-color}", 1)`);
+}
+.ant-upload-list-item-error,
+.ant-upload-list-item-error .anticon-paper-clip,
+.ant-upload-list-item-error .ant-upload-list-item-name {
+  color: #f5222d;
+}
+.ant-upload-list-item-error .anticon-close {
+  color: #f5222d !important;
+}
+.ant-upload-list-picture .ant-upload-list-item,
+.ant-upload-list-picture-card .ant-upload-list-item {
+  border-radius: 4px;
+  border: 1px solid #d9d9d9;
+}
+.ant-upload-list-picture .ant-upload-list-item:hover,
+.ant-upload-list-picture-card .ant-upload-list-item:hover {
+  background: transparent;
+}
+.ant-upload-list-picture .ant-upload-list-item-error,
+.ant-upload-list-picture-card .ant-upload-list-item-error {
+  border-color: #f5222d;
+}
+.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info,
+.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info {
+  background: transparent;
+}
+.ant-upload-list-picture .ant-upload-list-item-uploading,
+.ant-upload-list-picture-card .ant-upload-list-item-uploading {
+  border-style: dashed;
+}
+.ant-upload-list-picture .ant-upload-list-item-icon,
+.ant-upload-list-picture-card .ant-upload-list-item-icon {
+  color: rgba(0, 0, 0, 0.25);
+}
+.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before,
+.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list-picture-card .ant-upload-list-item-info:before {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o,
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete {
+  color: rgba(255, 255, 255, 0.85);
+}
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover,
+.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover {
+  color: #fff;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item {
+  background-color: #fafafa;
+}
+.ant-upload-list-picture-card .ant-upload-list-item-uploading-text {
+  color: rgba(0, 0, 0, 0.45);
+}
+.ant-upload-list .ant-upload-success-icon {
+  color: #52c41a;
+}
+
+.drawer .drawer-content {
+  background: #001529;
+}
+
+.ant-list-item-meta .taobao {
+  color: #ff4000;
+  border-radius: 4px;
+}
+.ant-list-item-meta .dingding {
+  background-color: #2eabff;
+  color: #fff;
+  border-radius: 4px;
+}
+.ant-list-item-meta .alipay {
+  color: #2eabff;
+  border-radius: 4px;
+}
+font.strong {
+  color: #52c41a;
+}
+font.medium {
+  color: #faad14;
+}
+font.weak {
+  color: #f5222d;
+}
diff --git a/ui/public/config.json b/ui/public/config.json
new file mode 100644
index 0000000..f4fda41
--- /dev/null
+++ b/ui/public/config.json
@@ -0,0 +1,50 @@
+{
+  "apiBase": "/client/api",
+  "docBase": "http://docs.cloudstack.apache.org/en/latest",
+  "appTitle": "CloudStack",
+  "footer": "Licensed under the <a href='http://www.apache.org/licenses/' target='_blank'>Apache License</a>, Version 2.0.",
+  "logo": "assets/logo.svg",
+  "banner": "assets/banner.svg",
+  "error": {
+    "404": "assets/404.png",
+    "403": "assets/403.png",
+    "500": "assets/500.png"
+  },
+  "theme": {
+    "@logo-background-color": "#ffffff",
+    "@navigation-background-color": "#ffffff",
+    "@project-nav-background-color": "#001529",
+    "@project-nav-text-color": "rgba(255, 255, 255, 0.65)",
+    "@navigation-text-color": "rgba(0, 0, 0, 0.65)",
+    "@primary-color": "#1890ff",
+    "@link-color": "#1890ff",
+    "@link-hover-color": "#40a9ff",
+    "@loading-color": "#1890ff",
+    "@processing-color": "#1890ff",
+    "@success-color": "#52c41a",
+    "@warning-color": "#faad14",
+    "@error-color": "#f5222d",
+    "@font-size-base": "14px",
+    "@heading-color": "rgba(0, 0, 0, 0.85)",
+    "@text-color": "rgba(0, 0, 0, 0.65)",
+    "@text-color-secondary": "rgba(0, 0, 0, 0.45)",
+    "@disabled-color": "rgba(0, 0, 0, 0.25)",
+    "@border-color-base": "#d9d9d9",
+    "@border-radius-base": "4px",
+    "@box-shadow-base": "0 2px 8px rgba(0, 0, 0, 0.15)",
+    "@logo-width": "256px",
+    "@logo-height": "64px",
+    "@banner-width": "700px",
+    "@banner-height": "110px",
+    "@error-width": "256px",
+    "@error-height": "256px"
+  },
+  "keyboardOptions": {
+    "us": "label.standard.us.keyboard",
+    "uk": "label.uk.keyboard",
+    "fr": "label.french.azerty.keyboard",
+    "jp": "label.japanese.keyboard",
+    "sc": "label.simplified.chinese.keyboard"
+  },
+  "plugins": []
+}
diff --git a/ui/error.html b/ui/public/error.html
similarity index 100%
rename from ui/error.html
rename to ui/public/error.html
diff --git a/ui/public/example.html b/ui/public/example.html
new file mode 100644
index 0000000..df59d49
--- /dev/null
+++ b/ui/public/example.html
@@ -0,0 +1,30 @@
+<!--
+     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>
+<html lang="en-gb">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <title>Example Plugin</title>
+  </head>
+  <body>
+    This is an example iframe plugin, please configure the config.json to remove this in production environment.
+  </body>
+</html>
diff --git a/ui/public/index.html b/ui/public/index.html
new file mode 100644
index 0000000..54ec6da
--- /dev/null
+++ b/ui/public/index.html
@@ -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.
+-->
+<!DOCTYPE html>
+<html lang="en-gb">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>cloud.ico">
+    <title>Apache CloudStack</title>
+    <style>
+      .loader {
+        border: 16px solid #F3F3F3;
+        border-top: 16px solid #39A7DE;
+        border-radius: 50%;
+        width: 80px;
+        height: 80px;
+        animation: spin 1s linear infinite;
+        position: fixed;
+        left: 0; right: 0;
+        top: 0; bottom: 0;
+        margin: auto;
+        max-width: 100%;
+        max-height: 100%;
+        overflow: hidden;
+      }
+      @keyframes spin {
+        0% { transform: rotate(0deg); }
+        100% { transform: rotate(360deg); }
+      }
+    </style>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but CloudStack UI needs JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app">
+      <div class="loader"></div>
+    </div>
+  </body>
+</html>
diff --git a/ui/public/locales/ar.json b/ui/public/locales/ar.json
new file mode 100644
index 0000000..bcb3976
--- /dev/null
+++ b/ui/public/locales/ar.json
@@ -0,0 +1,2364 @@
+{
+"changed.item.properties": "\u062a\u063a\u064a\u0631 \u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0639\u0646\u0635\u0631",
+"confirm.enable.s3": "\u0641\u0636\u0644\u0627 \u0642\u0645 \u0628\u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0627\u062f\u0645\u0629 \u0644\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629.",
+"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.unable.to.reach.management.server": "Unable to reach Management Server",
+"error.unresolved.internet.name": "Your internet name cannot be resolved.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Image Directory",
+"inline": "Inline",
+"label.about": "About",
+"label.about.app": "About CloudStack",
+"label.accept.project.invitation": "\u0642\u0628\u0648\u0644 \u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.accesskey": "\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0648\u0635\u0648\u0644",
+"label.account": "Account",
+"label.account.and.security.group": "Account, Security group",
+"label.account.details": "Account details",
+"label.account.id": "Account ID",
+"label.account.name": "Account Name",
+"label.account.specific": "Account-Specific",
+"label.accounts": "Accounts",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "\u0625\u062c\u0645\u0627\u0644 \u0634\u0628\u0643\u0629 ACL",
+"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.configure.stickiness": "Stickiness",
+"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.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.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.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.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": "\u062d\u0630\u0641 \u0646\u0638\u0627\u0645 \u062a\u0642\u062f\u064a\u0645 \u0627\u0644\u062e\u062f\u0645\u0629",
+"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": "\u062a\u0639\u0637\u064a\u0644 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629",
+"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.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.iso": "Edit ISO",
+"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": "\u062a\u0645\u0643\u064a\u0646 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629",
+"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.project.add.account": "\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628 \u0644\u0644\u0645\u0634\u0631\u0648\u0639",
+"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": "\u062a\u0641\u0639\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.activeviewersessions": "Active Sessions",
+"label.add": "Add",
+"label.add.account": "Add Account",
+"label.add.accounts": "\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a",
+"label.add.accounts.to": "\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a \u0625\u0644\u0649",
+"label.add.acl": "\u0625\u0636\u0627\u0641\u0629 ACL",
+"label.add.acl.list": "Add 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.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"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.f5.device": "Add F5 device",
+"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": "\u0625\u0636\u0627\u0641\u0629 \u0634\u0628\u0643\u0629 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.gateway": "\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u062c\u062f\u064a\u062f\u0629",
+"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.tier": "\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629 \u062c\u062f\u064a\u062f\u0629",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Add Nvp Controller",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "Add Palo Alto device",
+"label.add.physical.network": "Add physical network",
+"label.add.pod": "Add Pod",
+"label.add.port.forwarding.rule": "\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629 \u0645\u0646\u0641\u0630 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647",
+"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": "\u0625\u0636\u0627\u0641\u0629 \u0645\u0633\u0627\u0631",
+"label.add.rule": "\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629",
+"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.srx.device": "Add SRX device",
+"label.add.static.nat.rule": "Add static NAT rule",
+"label.add.static.route": "\u0625\u0636\u0627\u0641\u0629 \u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a",
+"label.add.system.service.offering": "Add System Service Offering",
+"label.add.template": "Add Template",
+"label.add.to.group": "\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629",
+"label.add.ucs.manager": "Add UCS Manager",
+"label.add.user": "Add User",
+"label.add.vlan": "Add VLAN",
+"label.add.vm": "Add VM",
+"label.add.vm.to.tier": "\u0625\u0636\u0627\u0641\u0629 \u062c\u0647\u0627\u0632 \u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0641\u064a \u0637\u0628\u0642\u0629",
+"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": "\u0625\u0636\u0627\u0641\u0629 \u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629",
+"label.add.vpc.offering": "Add VPC Offering",
+"label.add.vpn.customer.gateway": "Add VPN Customer Gateway",
+"label.add.vpn.gateway": "\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"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.address": "Address",
+"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.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "Agent Password",
+"label.agent.username": "Agent Username",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "Agree",
+"label.alert": "Alert",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a",
+"label.algorithm": "Algorithm",
+"label.all": "\u0627\u0644\u0643\u0644",
+"label.allocated": "\u062a\u062e\u0635\u064a\u0635",
+"label.allocationstate": "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.version": "API Version",
+"label.apikey": "API Key",
+"label.app.name": "CloudStack",
+"label.apply": "\u062a\u0637\u0628\u064a\u0642",
+"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.associatednetwork": "\u0634\u0628\u0643\u0629 \u0645\u0631\u062a\u0628\u0637\u0629",
+"label.associatednetworkid": "Associated Network ID",
+"label.associatednetworkname": "Network Name",
+"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.availabilityzone": "availabilityZone",
+"label.available": "Available",
+"label.available.public.ips": "Available Public IP Addresses",
+"label.back": "Back",
+"label.balance": "Balance",
+"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.baremetalcpu": "\u0648\u062d\u062f\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0631\u0643\u0632\u064a\u0629 (\u0628\u0627\u0644\u0645\u064a\u063a\u0627\u0647\u064a\u0631\u062a\u0632)",
+"label.baremetalcpucores": "# of CPU Cores",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "\u0627\u0644\u0630\u0627\u0643\u0631\u0629 ( \u0628\u0627\u0644\u0645\u064a\u062c\u0627\u0628\u0627\u064a\u0628\u062a)",
+"label.basic": "Basic",
+"label.basic.mode": "Basic Mode",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootable",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "\u062f\u0644\u0648",
+"label.by.account": "By Account",
+"label.by.alert.type": "By alert type",
+"label.by.availability": "By Availability",
+"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.cachemode": "Write-cache Type",
+"label.cancel": "Cancel",
+"label.capacity": "Capacity",
+"label.capacity.iops": "Capacity IOPS",
+"label.capacitybytes": "Capacity Bytes",
+"label.capacityiops": "IOPS Total",
+"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": "\u062a\u063a\u064a\u0631 \u0627\u0644\u0642\u064a\u0645\u0629",
+"label.character": "Character",
+"label.chassis": "Chassis",
+"label.checksum": "checksum",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR or Account/Security Group",
+"label.cidr.of.destination.network": "CIDR \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0648\u062c\u0647\u0629.",
+"label.cidrlist": "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.cleanup": "\u062a\u0646\u0638\u064a\u0641",
+"label.clear.list": "\u0645\u0633\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629",
+"label.close": "Close",
+"label.cloud.console": "Cloud Management Console",
+"label.cloud.managed": "Cloud.com Managed",
+"label.cluster": "Cluster",
+"label.cluster.name": "Cluster Name",
+"label.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Cluster Name",
+"label.clusters": "Clusters",
+"label.clustertype": "Cluster Type",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.community": "Community",
+"label.compute": "Compute",
+"label.compute.and.storage": "Compute and Storage",
+"label.compute.offerings": "Compute Offerings",
+"label.configuration": "\u062a\u0631\u062a\u064a\u0628",
+"label.configure": "\u0642\u0645 \u0628\u062a\u0643\u0648\u064a\u0646",
+"label.configure.ldap": "Configure LDAP",
+"label.configure.network.acls": "\u0636\u0628\u0637 \u0634\u0628\u0643\u0629 ACLs",
+"label.configure.sticky.policy": "Configure Sticky Policy",
+"label.configure.vpc": "\u062a\u0643\u0648\u064a\u0646 VPC",
+"label.confirmation": "Confirmation",
+"label.confirmdeclineinvitation": "\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0631\u0641\u0636 \u0647\u0630\u0647 \u0627\u0644\u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639\u061f",
+"label.confirmpassword": "Confirm password",
+"label.congratulations": "Congratulations!",
+"label.connectiontimeout": "\u0645\u0647\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644",
+"label.conservemode": "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": "\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0635\u062d\u064a\u062d\u0627\u062a",
+"label.counterid": "Counter",
+"label.cpu": "\u0648 \u0645 \u0645",
+"label.cpu.allocated": "CPU Allocated",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "CPU Allocated for VMs",
+"label.cpuallocatedghz": "\u062a\u062e\u0635\u064a\u0635",
+"label.cpulimit": "CPU limits",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "\u0648\u062d\u062f\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0631\u0643\u0632\u064a\u0629 (\u0628\u0627\u0644\u0645\u064a\u063a\u0627\u0647\u064a\u0631\u062a\u0632)",
+"label.cputotal": "Total CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilized",
+"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": "\u0623\u0646\u0634\u0626 \u0645\u0634\u0631\u0648\u0639",
+"label.create.ssh.key.pair": "Create a SSH Key Pair",
+"label.create.template": "Create template",
+"label.create.vpn.connection": "\u0625\u0646\u0634\u0627\u0621 \u0627\u062a\u0635\u0627\u0644 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.created": "Created",
+"label.created.by.system": "Created by system",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "Custom Disk Size",
+"label.daily": "Daily",
+"label.dashboard": "\u0644\u0648\u062d\u0629 \u0627\u0644\u0642\u064a\u0627\u062f\u0629",
+"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.decline.invitation": "\u0631\u0641\u0636 \u0627\u0644\u062f\u0639\u0648\u0629",
+"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": "\u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a",
+"label.default.use": "Default Use",
+"label.default.view": "\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629",
+"label.delete": "Delete",
+"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.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "Delete events",
+"label.delete.f5": "Delete F5",
+"label.delete.gateway": "\u0627\u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629",
+"label.delete.internal.lb": "Delete Internal LB",
+"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.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "\u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "Delete SRX",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"label.delete.vpn.connection": "\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.delete.vpn.customer.gateway": "\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 VPN \u0627\u0644\u0645\u062e\u0635\u0635\u0629",
+"label.delete.vpn.gateway": "\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.delete.vpn.user": "Delete VPN user",
+"label.deleteprofile": "Delete Profile",
+"label.deleting.failed": "Deleting Failed",
+"label.deleting.processing": "Deleting....",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Description",
+"label.destinationphysicalnetworkid": "Destination physical network ID",
+"label.destinationzoneid": "Destination Zone",
+"label.destroy": "\u0647\u062f\u0645",
+"label.destroy.router": "Destroy router",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "Detaching Disk",
+"label.details": "Details",
+"label.deviceid": "Device ID",
+"label.devices": "\u0627\u0644\u0623\u062c\u0647\u0632\u0629",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 IPs",
+"label.directdownload": "Direct Download",
+"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.disconnected": "Last Disconnected",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "\u0639\u0631\u0648\u0636 \u0627\u0644\u0642\u0631\u0635",
+"label.disk.size": "Disk Size",
+"label.disk.volume": "Disk Volume",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Disk Offering",
+"label.diskofferingid": "Disk Offering",
+"label.disksize": "Disk Size (in GB)",
+"label.disksizeallocated": "Disk Allocated",
+"label.disksizeallocatedgb": "\u062a\u062e\u0635\u064a\u0635",
+"label.disksizetotal": "Disk Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "Used",
+"label.display.text": "Display Text",
+"label.displayname": "Display Name",
+"label.displaytext": "Description",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "\u0646\u0638\u0627\u0645 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062c\u0627\u0644 DNS",
+"label.dns.domain.for.guest.networks": "\u0645\u062c\u0627\u0644 DNS \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0632\u0627\u0626\u0631",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domain",
+"label.domains": "Domain",
+"label.domain.details": "Domain details",
+"label.domain.name": "Domain Name",
+"label.domain.router": "Domain router",
+"label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
+"label.domainid": "Domain ID",
+"label.domainname": "Domain",
+"label.domainpath": "Domain",
+"label.done": "Done",
+"label.double.quotes.are.not.allowed": "Double quotes are not allowed",
+"label.download.progress": "Download Progress",
+"label.dpd": "\u0643\u0634\u0641 \u0627\u0644\u0642\u0631\u064a\u0646 \u0627\u0644\u0645\u0641\u0642\u0648\u062f",
+"label.drag.new.position": "\u0627\u0633\u062d\u0628 \u0644\u0645\u0648\u0642\u0641 \u062c\u062f\u064a\u062f",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "Edit",
+"label.edit.acl.list": "Edit ACL List",
+"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": "\u062a\u062d\u0631\u064a\u0631 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629",
+"label.edit.project.details": "\u0627\u0636\u0627\u0641\u0629 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"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": "\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a",
+"label.edit.traffic.type": "Edit traffic type",
+"label.edit.vpc": "\u062a\u0639\u062f\u064a\u0644 VPC",
+"label.egress.default.policy": "Egress Default Policy",
+"label.egress.rule": "Egress rule",
+"label.egress.rules": "\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062e\u0631\u0648\u062c",
+"label.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "\u0645\u0631\u0646",
+"label.email": "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": "\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u0648\u064a 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.reserved.system.ip": "End Reserved system IP",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "By date (end)",
+"label.endip": "End IP",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "End Port",
+"label.enter.token": "Enter token",
+"label.error": "\u062e\u0637\u0623",
+"label.error.code": "Error Code",
+"label.error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP Encryption",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "\u0639\u0645\u0631 ESP (\u062b\u0627\u0646\u064a\u0629)",
+"label.esppolicy": "\u0633\u064a\u0627\u0633\u0629 ESP",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "\u0623\u062d\u062f\u0627\u062b",
+"label.every": "Every",
+"label.example": "Example",
+"label.expunge": "Expunge",
+"label.external.link": "External link",
+"label.f5": "F5",
+"label.f5.details": "F5 details",
+"label.failed": "\u062e\u0637\u0623",
+"label.featured": "Featured",
+"label.fetch.latest": "Fetch latest",
+"label.filterby": "\u062a\u0635\u0641\u064a\u0629 \u062d\u0633\u0628",
+"label.fingerprint": "FingerPrint",
+"label.firewall": "Firewall",
+"label.firstname": "First Name",
+"label.firstname.lower": "firstname",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "Format",
+"label.friday": "Friday",
+"label.full": "Full",
+"label.full.path": "\u0645\u0633\u0627\u0631 \u0643\u0627\u0645\u0644",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "General Alerts",
+"label.generating.url": "Generating URL",
+"label.global.settings": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0639\u0645\u0648\u0645\u064a\u0629",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "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": "\u0648\u0639\u0631",
+"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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "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.guestcidraddress": "Guest CIDR",
+"label.guestendip": "Guest end IP",
+"label.guestgateway": "Guest Gateway",
+"label.guestipaddress": "Guest IP Address",
+"label.guestiptype": "\u0646\u0648\u0639 \u0627\u0644\u0636\u064a\u0641",
+"label.guestnetmask": "Guest Netmask",
+"label.guestnetworkid": "Network ID",
+"label.guestnetworkname": "Network Name",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Guest start IP",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "HA Enabled",
+"label.hahost": "HA Enabled",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
+"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.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Hourly",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor capabilities",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor version",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "ICMP Code",
+"label.icmptype": "ICMP Type",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE Encryption",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "\u0639\u0645\u0631 IKE (\u062b\u0627\u0646\u064a\u0629)",
+"label.ikepolicy": "\u0633\u064a\u0627\u0633\u0629 IKE",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastructure",
+"label.ingress.rule": "Ingress Rule",
+"label.initiated.by": "Initiated By",
+"label.insideportprofile": "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.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.name": "Instance Name",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "Internal name",
+"label.instanceport": "Instance Port",
+"label.instances": "\u0627\u0644\u062d\u0627\u0644\u0627\u062a",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"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.internaldns1": "Internal DNS 1",
+"label.internaldns2": "Internal DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "Interval Type",
+"label.introduction.to.cloudstack": "Introduction to CloudStack&#8482",
+"label.invalid.integer": "Invalid Integer",
+"label.invalid.number": "Invalid Number",
+"label.invitations": "\u062f\u0639\u0648\u0627\u062a",
+"label.invite": "Invite",
+"label.invite.to": "\u062f\u0639\u0648\u0629 \u0644\u0640",
+"label.invited.accounts": "\u062f\u0639\u0648\u0629 \u062d\u0633\u0627\u0628\u0627\u062a",
+"label.ip": "IP",
+"label.ip.allocations": "IP Allocations",
+"label.ip.or.fqdn": "IP or FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "IP Ranges",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP Address",
+"label.ipaddress1": "IP Address",
+"label.ipaddress2": "IP Address",
+"label.iplimit": "Public IP Limits",
+"label.ips": "IPs",
+"label.ipsecpsk": "\u0645\u0641\u062a\u0627\u062d \u0623\u0645\u0646 \u0628\u0631\u0648\u062a\u0648\u0643\u0648\u0644 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u062a\u0645\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647 \u0645\u0633\u0628\u0642\u0627",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Is Shared",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Custom Disk Size",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "Dedicated",
+"label.isdefault": "Is Default",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "Extractable",
+"label.isfeatured": "Featured",
+"label.isforced": "Force Delete",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Isolated networks",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "Isolation method",
+"label.isolation.mode": "Isolation Mode",
+"label.isolationmethod": "Isolation method",
+"label.isolationmethods": "Isolation method",
+"label.isolationuri": "\u0639\u0632\u0644 \u0627\u0644\u0631\u0627\u0628\u0637",
+"label.isoname": "Attached ISO",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Password Enabled",
+"label.ispersistent": "Persistent ",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Public",
+"label.isready": "\u062c\u0627\u0647\u0632",
+"label.isredundantrouter": "Redundant Router",
+"label.isrouting": "Routing",
+"label.isshared": "Shared",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is System",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Item listing",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Keep",
+"label.keep.colon": "Keep:",
+"label.key": "Key",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "\u0646\u0648\u0639 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "KVM traffic label",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "Last Update",
+"label.lastname": "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": "\u0623\u0642\u0644 \u0627\u0644\u0625\u062a\u0635\u0627\u0644\u0627\u062a",
+"label.lb.algorithm.roundrobin": "Round-robin",
+"label.lb.algorithm.source": "\u0645\u0635\u062f\u0631",
+"label.lbdevicededicated": "Dedicated",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "Level",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Load balancing policies",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "Load Balancing",
+"label.loading": "Loading",
+"label.local": "Local",
+"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.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "Login",
+"label.logout": "Logout",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "\u062c\u0639\u0644 \u0627\u0644\u062d\u0633\u0627\u0628 \u0645\u0627\u0644\u0643 \u0644\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.makeredundant": "Make redundant",
+"label.manage": "Manage",
+"label.manage.resources": "Manage Resources",
+"label.management": "Management",
+"label.management.ips": "Management IP Addresses",
+"label.management.server": "Management Server",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "\u0623\u0642\u0635\u0649 \u062e\u0637\u0623 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629",
+"label.maxguestslimit": "\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0627\u0621 \u0644\u0636\u064a\u0641",
+"label.maximum": "Maximum",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. memory (MiB)",
+"label.maxnetwork": "Max. networks",
+"label.maxpublicip": "Max. public IPs",
+"label.maxsnapshot": "Max. snapshots",
+"label.maxtemplate": "Max. templates",
+"label.maxuservm": "Max. user VMs",
+"label.maxvolume": "Max. volumes",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "You may now continue.",
+"label.memallocated": "Mem Allocation",
+"label.memory": "\u0627\u0644\u0630\u0627\u0643\u0631\u0629",
+"label.memory.total": "Memory Total",
+"label.memory.used": "Memory Used",
+"label.memoryallocated": "Memory Allocated",
+"label.memoryallocatedgb": "\u062a\u062e\u0635\u064a\u0635",
+"label.memorylimit": "Memory limits (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Memory Allocated",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Used",
+"label.menu.all.accounts": "\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a",
+"label.menu.all.instances": "\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0627\u0644\u0627\u062a",
+"label.menu.community.isos": "\u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a \u0627\u0644\u0645\u062c\u062a\u0645\u0639\u064a",
+"label.menu.community.templates": "\u0642\u0648\u0627\u0644\u0628 \u0627\u0644\u0645\u062c\u062a\u0645\u0639",
+"label.menu.destroyed.instances": "\u062d\u0627\u0644\u0627\u062a \u0627\u0644\u062a\u062f\u0645\u064a\u0631",
+"label.menu.featured.isos": "\u0645\u0645\u064a\u0632\u0627\u062a \u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a",
+"label.menu.featured.templates": "\u0642\u0648\u0627\u0644\u0628 \u0645\u0645\u064a\u0632\u0629",
+"label.menu.ipaddresses": "IP Addresses",
+"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.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.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Stopped Instances",
+"label.menu.storage": "Storage",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtual Appliances",
+"label.menu.virtual.resources": "Virtual Resources",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "Migrate instance to",
+"label.migrate.instance.to.host": "\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631",
+"label.migrate.instance.to.ps": "\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629",
+"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": "\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0636\u064a\u0641",
+"label.migrate.to.storage": "\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062a\u062e\u0632\u064a\u0646",
+"label.migrate.volume": "Migrate Volume",
+"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.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "Monday",
+"label.monthly": "Monthly",
+"label.more.templates": "More Templates",
+"label.move.down.row": "\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f",
+"label.move.to.bottom": "\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644",
+"label.move.to.top": "\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0623\u0639\u0644\u0649",
+"label.move.up.row": "\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f",
+"label.my.account": "My Account",
+"label.my.network": "\u0634\u0628\u0643\u062a\u064a",
+"label.my.templates": "\u0642\u0648\u0627\u0644\u0628\u064a",
+"label.na": "N/A",
+"label.name": "Name",
+"label.name.optional": "Name (Optional)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "NAT Port Range",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "Network",
+"label.network.acl": "\u0634\u0628\u0643\u0629 ACL",
+"label.network.acls": "\u0634\u0628\u0643\u0629 ACLs",
+"label.network.addvm": "Add network to VM",
+"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.label.display.for.blank.value": "Use default gateway",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Network Offerings",
+"label.network.service.providers": "Network Service Providers",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network Domain",
+"label.networkid": "Network",
+"label.networking.and.security": "Networking and security",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Network limits",
+"label.networkname": "Network Name",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Network Rate (Mb/s)",
+"label.networkread": "Network Read",
+"label.networks": "\u0627\u0644\u0634\u0628\u0643\u0627\u062a",
+"label.networktype": "Network Type",
+"label.networkwrite": "Network Write",
+"label.new": "\u062c\u062f\u064a\u062f",
+"label.new.password": "New Password",
+"label.new.project": "\u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f",
+"label.new.vm": "New VM",
+"label.newdiskoffering": "New Offering",
+"label.newsize": "New Size (GB)",
+"label.next": "Next",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Storage",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Path",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "NIC adapter type",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"label.nics": "NICs",
+"label.no": "No",
+"label.no.actions": "No Available Actions",
+"label.no.alerts": "No Recent Alerts",
+"label.no.data": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0644\u0639\u0631\u0636",
+"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.none": "None",
+"label.noselect": "\u0644\u0627\u061b \u0634\u0643\u0631\u0627\u064b",
+"label.not.found": "Not Found",
+"label.notifications": "\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a",
+"label.num.cpu.cores": "# of CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Number of Clusters",
+"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.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "Number of Retries",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "Offer HA",
+"label.ok": "\u0645\u0648\u0627\u0641\u0642",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight Controller",
+"label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
+"label.opendaylight.controllers": "OpenDaylight Controllers",
+"label.optional": "Optional",
+"label.order": "\u062a\u0631\u062a\u064a\u0628",
+"label.oscategoryid": "OS Preference",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Owned Public IP Addresses",
+"label.owner.account": "Owner Account",
+"label.owner.domain": "Owner Domain",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "Parent Domain",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "Password",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "Password Enabled",
+"label.path": "Path",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Virtual Router",
+"label.pcidevice": "\u0648\u0639\u0631",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Physical Network",
+"label.physical.network.id": "Physical network ID",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "Physical Network",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING storage IP",
+"label.plannermode": "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.podid": "Pod",
+"label.podname": "Pod name",
+"label.pods": "Pods",
+"label.port": "Port",
+"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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "\u0627\u0644\u0633\u0627\u0628\u0642",
+"label.primary.network": "Primary Network",
+"label.primary.storage": "Primary Storage",
+"label.primary.storage.allocated": "Primary Storage Allocated",
+"label.primary.storage.count": "Primary Storage Pools",
+"label.primary.storage.used": "Primary Storage Used",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "Primary Storage",
+"label.private.gateway": "\u0645\u0646\u0641\u0630Gateway \u062e\u0627\u0635",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Private IP Range",
+"label.private.ips": "Private IP Addresses",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Private IP Address",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Private network",
+"label.privateport": "Private Port",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "\u0645\u0634\u0631\u0648\u0639",
+"label.project.dashboard": "Project dashboard",
+"label.project.invite": "\u062f\u0639\u0648\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.project.name": "\u0627\u0633\u0645 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.project.view": "\u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.projectid": "Project ID",
+"label.projects": "\u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639",
+"label.property": "Property",
+"label.protocol": "Protocol",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Providers",
+"label.provisioningtype": "Provisioning Type",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Public IP Address",
+"label.public.ip.addresses": "Public IP Addresses",
+"label.public.ips": "Public IP Addresses",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "Public network",
+"label.public.traffic": "Public traffic",
+"label.public.zone": "Public Zone",
+"label.publicinterface": "Public Interface",
+"label.publicip": "IP Address",
+"label.publickey": "Public Key",
+"label.publicnetwork": "Public network",
+"label.publicport": "Public Port",
+"label.purpose": "Purpose",
+"label.pxe.server.type": "Pxe Server Type",
+"label.qostype": "QoS Type",
+"label.quickview": "\u0646\u0638\u0631\u0629 \u0633\u0631\u064a\u0639\u0629",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644",
+"label.receivedbytes": "Bytes Received",
+"label.recent.errors": "Recent Errors",
+"label.recover.vm": "Recover VM",
+"label.redundantrouter": "Redundant Router",
+"label.redundantrouterstate": "Redundant state",
+"label.redundantstate": "Redundant state",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Refresh",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.reinstall.vm": "Reinstall VM",
+"label.related": "Related",
+"label.relationaloperator": "Operator",
+"label.release.account": "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": "\u0630\u0643\u0631\u0646\u064a \u0644\u0627\u062d\u0642\u0627\u064b",
+"label.remove.acl": "\u0625\u0632\u0627\u0644\u0629 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": "\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a",
+"label.remove.this.physical.network": "Remove this physical network",
+"label.remove.tier": "\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629",
+"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": "\u0625\u0632\u0627\u0644\u0629 VPC",
+"label.remove.vpc.offering": "Remove VPC offering",
+"label.removing": "Removing",
+"label.removing.user": "Removing User",
+"label.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "Required",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "Reserved system gateway",
+"label.reserved.system.ip": "Reserved System IP",
+"label.reserved.system.netmask": "Reserved system netmask",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "End Reserved system IP",
+"label.reservedsystemgateway": "Reserved system gateway",
+"label.reservedsystemnetmask": "Reserved system netmask",
+"label.reservedsystemstartip": "Start Reserved system IP",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.resetvm": "Reset VM",
+"label.resource": "Resource",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "Resource Limits",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "Resources",
+"label.resourcestate": "Resource state",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629",
+"label.restart.vpc": "\u0625\u0639\u062f\u0627\u0629 \u062a\u0634\u063a\u064a\u0644 VPC",
+"label.restartrequired": "\u0645\u0637\u0644\u0648\u0628 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644",
+"label.restore": "\u0625\u0633\u062a\u0639\u0627\u062f\u0629",
+"label.retry.interval": "Retry Interval",
+"label.review": "\u0645\u0631\u0627\u062c\u0639\u0629",
+"label.revoke.project.invite": "\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062f\u0639\u0648\u0629",
+"label.role": "Role",
+"label.rolename": "Role",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Root disk controller",
+"label.rootdiskcontrollertypekvm": "Root disk controller",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "Type",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "Rules",
+"label.running": "Running VMs",
+"label.s3.access.key": "\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0648\u0635\u0648\u0644",
+"label.s3.bucket": "\u062f\u0644\u0648",
+"label.s3.connection.timeout": "\u0645\u0647\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644",
+"label.s3.endpoint": "\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629",
+"label.s3.max.error.retry": "\u0623\u0642\u0635\u0649 \u062e\u0637\u0623 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629",
+"label.s3.nfs.path": "S3 NFS Path",
+"label.s3.nfs.server": "S3 NFS Server",
+"label.s3.secret.key": "\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a",
+"label.s3.socket.timeout": "\u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0642\u0628\u0633",
+"label.s3.use.https": "\u0627\u0633\u062a\u062e\u062f\u0645 HTTPS",
+"label.samlenable": "Authorize SAML SSO",
+"label.samlentity": "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": "\u0627\u0644\u0645\u062c\u0627\u0644",
+"label.search": "\u0628\u062d\u062b",
+"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.vm": "Secondary storage VM",
+"label.secondary.used": "Secondary Storage Used",
+"label.secondaryips": "Secondary IPs",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a",
+"label.security.group.name": "Security Group Name",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Enabled",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Security Groups",
+"label.select": "Select",
+"label.select-view": "\u062d\u062f\u062f \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636",
+"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": "\u062d\u062f\u062f \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"label.select.region": "Select region",
+"label.select.tier": "\u062d\u062f\u062f \u0637\u0628\u0642\u0629",
+"label.select.vm.for.static.nat": "Select VM for static NAT",
+"label.self": "Mine",
+"label.sent": "Sent",
+"label.sentbytes": "Bytes Sent",
+"label.server": "Server",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastic LB",
+"label.service.lb.inlinemodedropdown": "Mode",
+"label.service.lb.lbisolationdropdown": "LB isolation",
+"label.service.offering": "Service Offering",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundant router capability",
+"label.service.state": "Service State",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "Elastic IP",
+"label.servicecapabilities": "\u0642\u062f\u0631\u0627\u062a \u0627\u0644\u062e\u062f\u0645\u0629",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Compute offering",
+"label.serviceofferingname": "Compute offering",
+"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": "\u0627\u0644\u062a\u062b\u0628\u064a\u062a",
+"label.setup.network": "Set up Network",
+"label.setup.zone": "Set up Zone",
+"label.shared": "Shared",
+"label.sharedexecutable": "Shared",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Show Ingress Rule",
+"label.shrinkok": "Shrink OK",
+"label.shutdown.provider": "Shutdown provider",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.site.to.site.vpn": "\u0645\u0648\u0642\u0639 \u0625\u0644\u0649 \u0645\u0648\u0642\u0639-\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629  VPN",
+"label.size": "Size",
+"label.sizegb": "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.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Name",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "Snapshot Limits",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "\u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0642\u0628\u0633",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Source CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Supported Source NAT type",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "Specify VXLAN",
+"label.specifyipranges": "\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642\u0627\u062a IP",
+"label.specifyvlan": "Specify VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "Start IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Start Reserved system IP",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "By date (start)",
+"label.startip": "Start IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start Port",
+"label.startquota": "Quota Value",
+"label.state": "State",
+"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.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie name",
+"label.sticky.expire": "Expires",
+"label.sticky.holdtime": "Hold time",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "Length",
+"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": "\u062d\u062c\u0645 \u0627\u0644\u062c\u062f\u0648\u0644",
+"label.stop": "\u062a\u0648\u0642\u0641",
+"label.stop.lb.vm": "Stop LB VM",
+"label.stopped": "Stopped VMs",
+"label.storage": "Storage",
+"label.storage.tags": "Storage Tags",
+"label.storage.traffic": "Storage Traffic",
+"label.storageid": "Primary Storage",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "Storage Tags",
+"label.storagetype": "Storage Type",
+"label.subdomainaccess": "Subdomain Access",
+"label.submit": "Submit",
+"label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Succeeded",
+"label.sunday": "Sunday",
+"label.supportedservices": "t\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062f\u0639\u0648\u0645\u0629",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"label.suspend.project": "\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"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.offerings": "System Offerings",
+"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.vms": "System VMs",
+"label.system.wide.capacity": "System-wide capacity",
+"label.systemvmtype": "System VM Type",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Target IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Task completed",
+"label.template": "Template",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "Template Limits",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Template",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0637\u0628\u0642\u0629",
+"label.tiername": "\u0637\u0628\u0642\u0629",
+"label.time": "Time",
+"label.time.colon": "Time:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "Timezone",
+"label.timezone.colon": "Timezone:",
+"label.token": "Token",
+"label.total.hosts": "Total Hosts",
+"label.total.memory": "Total Memory",
+"label.total.storage": "Total Storage",
+"label.total.vms": "Total VMs",
+"label.totalcpu": "Total CPU",
+"label.traffic.label": "Traffic label",
+"label.traffic.types": "Traffic Types",
+"label.traffictype": "Traffic Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Tuesday",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "Unavailable",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"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.router.newer.template": "Upgrade Router to Use Newer Template",
+"label.upload": "\u0631\u0641\u0639",
+"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.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Use VM IPs",
+"label.usehttps": "\u0627\u0633\u062a\u062e\u062f\u0645 HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "User",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "Username",
+"label.users": "Users",
+"label.usevpc": "\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "vCenter IP Address",
+"label.vcsdeviceid": "ID",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"label.view": "\u0639\u0631\u0636",
+"label.view.all": "\u0639\u0631\u0636 \u0627\u0644\u0643\u0644",
+"label.view.console": "View console",
+"label.view.more": "View more",
+"label.view.secondary.ips": "View secondary IPs",
+"label.viewing": "\u0639\u0631\u0636",
+"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.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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm.add": "Add Instance",
+"label.vm.destroy": "\u0647\u062f\u0645",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Start",
+"label.vm.stop": "\u062a\u0648\u0642\u0641",
+"label.vmdisplayname": "VM display name",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "VM IP Address",
+"label.vmlimit": "Instance Limits",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0641\u064a \u0637\u0628\u0642\u0629",
+"label.vmstate": "VM state",
+"label.vmtotal": "Total of VMs",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware traffic label",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "Volume Group",
+"label.volume": "Volume",
+"label.volume.details": "Volume details",
+"label.volume.migrated": "Volume migrated",
+"label.volumechecksum": "MD5 checksum",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "Volume Group",
+"label.volumelimit": "\u062d\u062f\u0648\u062f \u0627\u0644\u0645\u0646\u0637\u0642\u0629",
+"label.volumename": "Volume Name",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC",
+"label.vpc.id": "\u0647\u0648\u064a\u0629 \u062e\u0627\u0635\u0629 \u0628\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpn": "VPN",
+"label.vpn.connection": "\u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.vpn.gateway": "\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"label.vpncustomergatewayid": "\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0644\u0644\u0639\u0645\u064a\u0644",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "Name",
+"label.vsmdevicestate": "State",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN Range",
+"label.waiting": "\u0642\u064a\u062f \u0627\u0644\u0625\u0646\u062a\u0638\u0627\u0631",
+"label.warn": "\u062a\u062d\u0630\u064a\u0631",
+"label.warn.upper": "WARN",
+"label.warning": "Warning",
+"label.wednesday": "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621",
+"label.weekly": "\u0625\u0633\u0628\u0648\u0639\u064a",
+"label.welcome": "\u0645\u0631\u062d\u0628\u0627",
+"label.welcome.cloud.console": "\u0645\u0631\u062d\u0628\u0627 \u0628\u0643\u0645 \u0641\u064a \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062d\u0643\u0645 \u0627\u0644\u0625\u0631\u0627\u062f\u064a\u0629",
+"label.what.is.cloudstack": "What is CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer traffic label",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "\u0646\u0639\u0645",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0646\u0637\u0642\u0629",
+"label.zone.id": "Zone ID",
+"label.zone.step.1.title": "\u0627\u0644\u062e\u0637\u0648\u0629 1 : \u0639\u0644\u0649 .<\u0642\u0648\u064a> \u0627\u062e\u062a\u0631 \u0634\u0628\u0643\u0629 </ \u0642\u0648\u064a>",
+"label.zone.step.2.title": "\u0627\u0644\u062e\u0637\u0648\u0629 2 : <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u0646\u0637\u0642\u0629 </ \u0642\u0648\u064a>",
+"label.zone.step.3.title": "\u0627\u0644\u062e\u0637\u0648\u0629 3 : \u0639\u0644\u0649 <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u062f </ \u0642\u0648\u064a>",
+"label.zone.step.4.title": "\u0627\u0644\u062e\u0637\u0648\u0629 4 : <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u062c\u0645\u0648\u0639\u0629 IP <\u0642\u0648\u064a>",
+"label.zone.type": "Zone Type",
+"label.zone.wide": "\u0645\u0646\u0637\u0642\u0629 \u0648\u0627\u0633\u0639\u0629",
+"label.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "Zones",
+"label.zonewizard.traffictype.guest": "\u0627\u0644\u0636\u064a\u0641 : \u0627\u0644\u062d\u0631\u0643\u0629 \u0628\u064a\u0646 \u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0646\u0647\u0627\u0626\u064a.",
+"label.zonewizard.traffictype.management": "\u0625\u062f\u0627\u0631\u0629: \u0627\u0644\u062d\u0631\u0643\u0629 \u0628\u064a\u0646 \u0627\u0644\u0645\u0648\u0627\u0631\u062f \u0627\u0644\u062f\u0627\u062e\u0644\u064a\u0629 \u0644 \u0643\u0644\u0627\u0648\u062f \u0633\u062a\u0627\u0643 \u060c \u0645\u062a\u0636\u0645\u0646\u0629 \u0623\u064a \u062c\u0632\u0621 \u064a\u062a\u0635\u0644 \u0628\u062e\u0627\u062f\u0645\u0633\u064a\u0631\u0641\u0631 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u060c \u0645\u062b\u0644 \u0627\u0644\u0645\u0636\u064a\u0641\u0627\u062a \u0648 \u0623\u0646\u0638\u0645\u0629 \u0643\u0644\u0627\u0648\u062f \u0633\u062a\u0627\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629.",
+"label.zonewizard.traffictype.public": "\u0627\u0644\u0639\u0627\u0645\u0629 : \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629 \u0641\u064a \u0627\u0644\u0633\u062d\u0627\u0628\u0629.",
+"label.zonewizard.traffictype.storage": "\u0627\u0644\u062a\u062e\u0632\u064a\u0646 : \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0645\u0644\u0642\u0645\u0627\u062a \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0627\u0628\u062a\u062f\u0627\u0626\u064a\u0629 \u0648\u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629\u060c \u0645\u062b\u0644 \u0642\u0648\u0627\u0644\u0628 VM \u0648\u0627\u0644\u0644\u0642\u0637\u0627\u062a",
+"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": "\u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0628\u0648\u0631\u062a\u0648\u0643\u0648\u0644 \u0625\u0646\u062a\u0631\u0646\u062a \u062c\u062f\u064a\u062f \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0627\u0633\u0648\u0628 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a.",
+"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.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.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.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.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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u062e\u062f\u0645\u0629 \u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0645\u0642\u062f\u0645\u0629.",
+"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": "\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629",
+"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": "\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629",
+"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.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": "\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f",
+"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": "\u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u062c\u0627\u0644 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u0646\u0634\u0627\u0621 \u062a\u062d\u062a \u0647\u0630\u0627 \u0627\u0644\u0646\u0637\u0627\u0642",
+"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": "\u0641\u0636\u0644\u0627 \u062d\u062f\u062f \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0644\u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 gateway \u0644\u0647\u0630\u0647 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0644\u0625\u0636\u0627\u0641\u0629 \u0646\u0638\u0627\u0645 \u062c\u062f\u064a\u062f \u0644\u0637\u0631\u062d",
+"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.add.vpn.gateway": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "Adding host",
+"message.adding.netscaler.device": "Adding Netscaler device",
+"message.adding.netscaler.provider": "Adding Netscaler provider",
+"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": "\u062a\u0645 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629. \u062a\u0646\u0648\u064a\u0647 : \u0639\u0646\u062f \u0645\u063a\u0627\u062f\u0631\u062a\u0643 \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0644\u0646 \u064a\u0643\u0648\u0646 \u0628\u0625\u0645\u0643\u0627\u0646\u0643 \u0625\u0639\u0627\u062f\u0629 \u0636\u0628\u0637 S3 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.",
+"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.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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "Please confirm that you would like to delete F5",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"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.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "Please confirm that you would like to delete SRX",
+"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": "\u0646\u0631\u062c\u0648 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0641\u064a \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "Please confirm that you would like to remove this IP range.",
+"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.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"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": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629",
+"message.delete.project": "\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f",
+"message.delete.user": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062d\u0630\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645",
+"message.delete.vpn.connection": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN",
+"message.delete.vpn.customer.gateway": "Please confirm that you want to delete this VPN Customer Gateway",
+"message.delete.vpn.gateway": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629",
+"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": "\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0641\u0635\u0644 \u0647\u0630\u0627 \u0627\u0644\u0642\u0631\u0635\u061f",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628.",
+"message.enable.user": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u0625\u0646\u0634\u0627\u0621 \u0645\u0641\u0627\u062a\u064a\u062d \u062c\u062f\u064a\u062f\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645",
+"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": "\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0642\u0648\u0627\u0644\u0628 \u0645\u062a\u0627\u062d\u0629\u061b \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0644\u0628 \u0645\u062a\u0648\u0627\u0641\u0642\u060c \u0648\u0625\u0639\u0627\u062f\u0629 \u0625\u0637\u0644\u0627\u0642 \u0627\u0644\u0645\u0639\u0627\u0644\u062c .",
+"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": "\u0644\u0642\u062f \u0627\u0646\u0636\u0645\u0645\u062a \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0628\u062f\u064a\u0644 \u0625\u0644\u0649 \u0637\u0631\u064a\u0642\u0629 \u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639",
+"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": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631.",
+"message.migrate.instance.to.ps": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629.",
+"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.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"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": "\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639. <br/> \u064a\u0631\u062c\u0649 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f \u0645\u0646 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639.",
+"message.no.projects.adminonly": "\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639. <br/> \u0627\u0644\u0631\u062c\u0627\u0621 \u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0645\u0633\u0624\u0648\u0644 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f.",
+"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.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": "\u0644\u062f\u064a\u0643 \u062f\u0639\u0648\u0627\u062a \u0645\u0634\u0631\u0648\u0639 \u0645\u0639\u0644\u0642\u0629/:",
+"message.pending.projects.2": "\u0644\u0639\u0631\u0636\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0630\u0647\u0627\u0628 \u0625\u0644\u0649 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639\u060c \u062b\u0645 \u062d\u062f\u062f \u062f\u0639\u0648\u0627\u062a \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0646\u0633\u062f\u0644\u0629.",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0634\u0628\u0643\u0627\u062a \u0644\u062c\u0647\u0627\u0632\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a",
+"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": "\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062f\u0639\u0648\u0629 ; \u0633\u064a\u062a\u0645 \u0625\u0636\u0627\u0641\u062a\u0647\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0628\u0645\u062c\u0631\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062f\u0639\u0648\u0629",
+"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": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0640VPC",
+"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.password.warning.notpasswordenabled": "\u0627\u0644\u0642\u0627\u0644\u0628 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u062a\u0645 \u0627\u0646\u0634\u0627\u0626\u0647 \u0645\u0646 \u062f\u0648\u0646 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0645\u0645\u0643\u0646\u0629",
+"message.reset.password.warning.notstopped": "\u064a\u062c\u0628 \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0642\u0628\u0644 \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629",
+"message.reset.vpn.connection": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u0639\u0627\u062f\u0629-\u0636\u0628\u0637 \u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN",
+"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": "\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0640VPN",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0642\u0627\u0644\u0628 \u0644\u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0627\u0644\u062c\u062f\u064a\u062f",
+"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.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "Please specify URL",
+"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": "\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u064a\u0642\u0627\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f",
+"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.template.iso": "Please select a template or ISO to continue",
+"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": "\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u062d\u062f\u064a\u062b \u0645\u0635\u0627\u062f\u0631 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628",
+"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.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.validate.url": "Please enter a valid URL.",
+"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": "\u064a\u0631\u062c\u0649 \u0645\u0631\u0627\u062c\u0639\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0648\u062a\u0623\u0643\u062f \u0623\u0646 \u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0635\u062d\u064a\u062d \u0642\u0628\u0644 \u0627\u0644\u0625\u0646\u0637\u0644\u0627\u0642",
+"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.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"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": "Zone creation complete",
+"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}.",
+"network.rate": "Network Rate",
+"side.by.side": "Side by Side",
+"state.accepted": "\u062a\u0645 \u0627\u0644\u0642\u0628\u0648\u0644",
+"state.active": "\u0646\u0634\u0637",
+"state.allocating": "Allocating",
+"state.backedup": "Backed Up",
+"state.backingup": "Backing Up",
+"state.completed": "\u062a\u0645 \u0627\u0644\u0627\u0643\u0645\u0627\u0644",
+"state.creating": "\u0625\u0646\u0634\u0627\u0621",
+"state.declined": "\u062a\u0645 \u0627\u0644\u0631\u0641\u0636",
+"state.destroyed": "\u062f\u0645\u0631",
+"state.detached": "Detached",
+"state.disabled": "Disabled",
+"state.enabled": "\u062a\u0645\u0643\u064a\u0646",
+"state.error": "\u062e\u0637\u0623",
+"state.expunging": "\u0645\u062d\u0648",
+"state.migrating": "Migrating",
+"state.pending": "\u0641\u064a \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631",
+"state.running": "Running",
+"state.starting": "Starting",
+"state.stopped": "\u062a\u0648\u0642\u0641",
+"state.stopping": "Stopping",
+"state.suspended": "\u062a\u0645 \u0627\u0644\u0625\u064a\u0642\u0627\u0641",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/ca.json b/ui/public/locales/ca.json
new file mode 100644
index 0000000..743d82f
--- /dev/null
+++ b/ui/public/locales/ca.json
@@ -0,0 +1,2364 @@
+{
+"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\u00fcent informaci\u00f3 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\u00e8 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.unable.to.reach.management.server": "Unable to reach Management Server",
+"error.unresolved.internet.name": "Your internet name cannot be resolved.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Image Directory",
+"inline": "En l\u00ednia",
+"label.about": "About",
+"label.about.app": "About CloudStack",
+"label.accept.project.invitation": "Accpetar invitaci\u00f3 al projecte",
+"label.accesskey": "Access Key",
+"label.account": "Account",
+"label.account.and.security.group": "Account, Security group",
+"label.account.details": "Account details",
+"label.account.id": "Account ID",
+"label.account.name": "Account Name",
+"label.account.specific": "Account-Specific",
+"label.accounts": "Accounts",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "Network ACL Total",
+"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.configure.stickiness": "Tend\u00e8ncia",
+"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.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.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.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.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.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.iso": "Edit ISO",
+"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.project.add.account": "Afegir compte al projecte",
+"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.activeviewersessions": "Active Sessions",
+"label.add": "Add",
+"label.add.account": "Add Account",
+"label.add.accounts": "Afegir comptes",
+"label.add.accounts.to": "Afegir comptes a",
+"label.add.acl": "Add ACL",
+"label.add.acl.list": "Add 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.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"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.f5.device": "Add F5 device",
+"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.gateway": "Add new gateway",
+"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.tier": "Add new tier",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Add Nvp Controller",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "Add Palo Alto device",
+"label.add.physical.network": "Afegir xarxa f\u00edsica",
+"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.srx.device": "Add SRX device",
+"label.add.static.nat.rule": "Afegir regla de NAT est\u00e0tic",
+"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.vlan": "Add VLAN",
+"label.add.vm": "Afegir MV",
+"label.add.vm.to.tier": "Add VM to tier",
+"label.add.vms": "Afegir MVs",
+"label.add.vms.to.lb": "Afegir MV(s) a la regla de balanceig de c\u00e0rrega",
+"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.gateway": "Add VPN 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.address": "Address",
+"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.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "Agent Password",
+"label.agent.username": "Agent Username",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "D'acord",
+"label.alert": "Alert",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "Alerts",
+"label.algorithm": "Algorithm",
+"label.all": "All",
+"label.allocated": "Allocated",
+"label.allocationstate": "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.version": "API Version",
+"label.apikey": "API Key",
+"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.associatednetwork": "Associated Network",
+"label.associatednetworkid": "Associated Network ID",
+"label.associatednetworkname": "Network Name",
+"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.availabilityzone": "availabilityZone",
+"label.available": "Available",
+"label.available.public.ips": "Available Public IP Addresses",
+"label.back": "Back",
+"label.balance": "Balance",
+"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.baremetalcpu": "CPU (in MHz)",
+"label.baremetalcpucores": "# of CPU Cores",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "Memory (in MB)",
+"label.basic": "Basic",
+"label.basic.mode": "Basic Mode",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootable",
+"label.broadcastdomainrange": "Rang del domini de broadcast",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "By Account",
+"label.by.alert.type": "By alert type",
+"label.by.availability": "By Availability",
+"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.cachemode": "Write-cache Type",
+"label.cancel": "Cancel",
+"label.capacity": "Capacitat",
+"label.capacity.iops": "Capacity IOPS",
+"label.capacitybytes": "Capacity Bytes",
+"label.capacityiops": "IOPS Total",
+"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.of.destination.network": "CIDR of destination network",
+"label.cidrlist": "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.cleanup": "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.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Cluster Name",
+"label.clusters": "Clusters",
+"label.clustertype": "Cluster Type",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.community": "Comunitat",
+"label.compute": "Computaci\u00f3",
+"label.compute.and.storage": "Computaci\u00f3 i Emmagatzematge",
+"label.compute.offerings": "Compute Offerings",
+"label.configuration": "Configuraci\u00f3",
+"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.confirmation": "Confirmation",
+"label.confirmdeclineinvitation": "Esteu segurs de declinar aquesta invitaci\u00f3 per al projecte?",
+"label.confirmpassword": "Confirmar contrasenya",
+"label.congratulations": "Enorabona!",
+"label.connectiontimeout": "Connection Timeout",
+"label.conservemode": "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\u00b7laci\u00f3 b\u00e0sica",
+"label.copying.iso": "Copying ISO",
+"label.corrections.saved": "Correccions guardades",
+"label.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU Allocated",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "CPU Allocated for VMs",
+"label.cpuallocatedghz": "Allocated",
+"label.cpulimit": "CPU limits",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (in MHz)",
+"label.cputotal": "Total de CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilized",
+"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.create.vpn.connection": "Create VPN Connection",
+"label.created": "Created",
+"label.created.by.system": "Created by system",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "Custom Disk Size",
+"label.daily": "Daily",
+"label.dashboard": "Dashboard",
+"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.decline.invitation": "Declinar invitaci\u00f3",
+"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.use": "Default Use",
+"label.default.view": "Default View",
+"label.delete": "Delete",
+"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.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "Delete events",
+"label.delete.f5": "Esborrar F5",
+"label.delete.gateway": "Delete gateway",
+"label.delete.internal.lb": "Delete Internal LB",
+"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.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "Esborrar projecte",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "Esborar SRX",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"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.vpn.user": "Esborrar usuari VPN",
+"label.deleteprofile": "Delete Profile",
+"label.deleting.failed": "Deleting Failed",
+"label.deleting.processing": "Deleting....",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Description",
+"label.destinationphysicalnetworkid": "ID de xarxa f\u00edsica de dest\u00ed",
+"label.destinationzoneid": "Zona de dest\u00ed",
+"label.destroy": "Destroy",
+"label.destroy.router": "Destruir router",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "Detaching Disk",
+"label.details": "Details",
+"label.deviceid": "Device ID",
+"label.devices": "Devices",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "Shared Network IPs",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "Disable Autoscale",
+"label.disable.host": "Disable Host",
+"label.disable.network.offering": "Disable network offering",
+"label.disable.provider": "Deshabilitar prove\u00efdor",
+"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.disconnected": "Last Disconnected",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "Disk Offerings",
+"label.disk.size": "Disk Size",
+"label.disk.volume": "Disk Volume",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Disk Offering",
+"label.diskofferingid": "Disk Offering",
+"label.disksize": "Disk Size (in GB)",
+"label.disksizeallocated": "Disk Allocated",
+"label.disksizeallocatedgb": "Allocated",
+"label.disksizetotal": "Disk Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "Used",
+"label.display.text": "Display Text",
+"label.displayname": "Display Name",
+"label.displaytext": "Description",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS domain for Guest Networks",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domain",
+"label.domains": "Domain",
+"label.domain.details": "Domain details",
+"label.domain.name": "Domain Name",
+"label.domain.router": "Domain router",
+"label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
+"label.domainid": "Domain ID",
+"label.domainname": "Domain",
+"label.domainpath": "Domain",
+"label.done": "Done",
+"label.double.quotes.are.not.allowed": "Double quotes are not allowed",
+"label.download.progress": "Download Progress",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "Arrosegar a la nova posici\u00f3",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "Edit",
+"label.edit.acl.list": "Edit ACL List",
+"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.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "El\u00e0stic",
+"label.email": "Email",
+"label.enable.autoscale": "Enable Autoscale",
+"label.enable.host": "Enable Host",
+"label.enable.network.offering": "Enable network offering",
+"label.enable.provider": "Habilitar prove\u00efdor",
+"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.reserved.system.ip": "End Reserved system IP",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "By date (end)",
+"label.endip": "End IP",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "End Port",
+"label.enter.token": "Enter token",
+"label.error": "Error",
+"label.error.code": "Error Code",
+"label.error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP Encryption",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "ESP Lifetime (second)",
+"label.esppolicy": "ESP policy",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "Events",
+"label.every": "Every",
+"label.example": "Example",
+"label.expunge": "Expunge",
+"label.external.link": "External link",
+"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.firstname": "First Name",
+"label.firstname.lower": "firstname",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "Format",
+"label.friday": "Friday",
+"label.full": "Full",
+"label.full.path": "Cam\u00ed sencer",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "General Alerts",
+"label.generating.url": "Generating URL",
+"label.global.settings": "Global Settings",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "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\u00e0fic de MV",
+"label.guestcidraddress": "Guest CIDR",
+"label.guestendip": "Fi d'IP per a MV",
+"label.guestgateway": "Guest Gateway",
+"label.guestipaddress": "Guest IP Address",
+"label.guestiptype": "Guest Type",
+"label.guestnetmask": "Guest Netmask",
+"label.guestnetworkid": "Network ID",
+"label.guestnetworkname": "Network Name",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Inici d'IP per a MV",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "HA Enabled",
+"label.hahost": "HA Enabled",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
+"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.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Hourly",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor capabilities",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor version",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "ICMP Code",
+"label.icmptype": "ICMP Type",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE Encryption",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE lifetime (second)",
+"label.ikepolicy": "IKE policy",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastructure",
+"label.ingress.rule": "Ingress Rule",
+"label.initiated.by": "Initiated By",
+"label.insideportprofile": "Inside Port Profile",
+"label.installwizard.addclusterintro.subtitle": "Que \u00e9s un cluster?",
+"label.installwizard.addclusterintro.title": "Anem a afegir un cluster",
+"label.installwizard.addhostintro.subtitle": "Qu\u00e8 \u00e9s un amfitri\u00f3 \"host\"?",
+"label.installwizard.addhostintro.title": "Anem a afegir un amfitri\u00f3",
+"label.installwizard.addpodintro.subtitle": "Que \u00e9s un pod?",
+"label.installwizard.addpodintro.title": "Anem a afegir un pod",
+"label.installwizard.addprimarystorageintro.subtitle": "Qu\u00e8 \u00e9s l'emmagatzematge primari?",
+"label.installwizard.addprimarystorageintro.title": "Anem a afegir emmagatzematge primari",
+"label.installwizard.addsecondarystorageintro.subtitle": "Qu\u00e8 \u00e9s el emmagatzematge secundari?",
+"label.installwizard.addsecondarystorageintro.title": "Anem a afegir emmagatzematge secundari",
+"label.installwizard.addzoneintro.subtitle": "Que \u00e9s una zona?",
+"label.installwizard.addzoneintro.title": "Anem a afegir una zona",
+"label.installwizard.click.launch": "Feu clic al bot\u00f3 d'inici.",
+"label.installwizard.subtitle": "Auqesta guia us ajudar\u00e0 a configurar la vostra instal\u00b7laci\u00f3 de CloudStack&#8482",
+"label.installwizard.title": "Hola i benvigut a CloudStack&#8482",
+"label.instance": "Instance",
+"label.instance.name": "Instance Name",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "Internal name",
+"label.instanceport": "Instance Port",
+"label.instances": "Instances",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"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.internaldns1": "Internal DNS 1",
+"label.internaldns2": "Internal DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "Interval Type",
+"label.introduction.to.cloudstack": "Introducci\u00f3 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.allocations": "IP Allocations",
+"label.ip.or.fqdn": "IP or FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "Rangs d'IPs",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP Address",
+"label.ipaddress1": "IP Address",
+"label.ipaddress2": "IP Address",
+"label.iplimit": "Public IP Limits",
+"label.ips": "IPs",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Is Shared",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Custom Disk Size",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "Dedicat",
+"label.isdefault": "Is Default",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "Es pot extreure",
+"label.isfeatured": "Featured",
+"label.isforced": "Force Delete",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Isolated networks",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "Isolation method",
+"label.isolation.mode": "Isolation Mode",
+"label.isolationmethod": "Isolation method",
+"label.isolationmethods": "Isolation method",
+"label.isolationuri": "Isolation URI",
+"label.isoname": "Attached ISO",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Password Enabled",
+"label.ispersistent": "Persistent ",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Public",
+"label.isready": "Preparat",
+"label.isredundantrouter": "Redundant Router",
+"label.isrouting": "Routing",
+"label.isshared": "Shared",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is System",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Llista d'articles",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Keep",
+"label.keep.colon": "Keep:",
+"label.key": "Clau",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "Tipus de teclat",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "KVM traffic label",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "Last Update",
+"label.lastname": "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.lbdevicededicated": "Dedicat",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "Level",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Pol\u00b7l\u00edtiques de balanceig de c\u00e0rrega",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "Balanceig de c\u00e0rrega",
+"label.loading": "Loading",
+"label.local": "Local",
+"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.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "Login",
+"label.logout": "Logout",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "Feu la compta propiet\u00e0ria del projecte",
+"label.makeredundant": "Make redundant",
+"label.manage": "Manage",
+"label.manage.resources": "Administrar Recursos",
+"label.management": "Administraci\u00f3",
+"label.management.ips": "Management IP Addresses",
+"label.management.server": "Management Server",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "Max Error Retry",
+"label.maxguestslimit": "Max guest limit",
+"label.maximum": "Maximum",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. memory (MiB)",
+"label.maxnetwork": "Max. networks",
+"label.maxpublicip": "Max. IP p\u00fabliques",
+"label.maxsnapshot": "Max. instant\u00e0nies",
+"label.maxtemplate": "Max. plantilles",
+"label.maxuservm": "Max. MV d'usuari",
+"label.maxvolume": "Max. Volums",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "Ara pot continuar",
+"label.memallocated": "Mem Allocation",
+"label.memory": "Memory",
+"label.memory.total": "Memory Total",
+"label.memory.used": "Memory Used",
+"label.memoryallocated": "Memory Allocated",
+"label.memoryallocatedgb": "Allocated",
+"label.memorylimit": "Memory limits (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Memory Allocated",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Used",
+"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.destroyed.instances": "Destroyed Instances",
+"label.menu.featured.isos": "Featured ISOs",
+"label.menu.featured.templates": "Featured Templates",
+"label.menu.ipaddresses": "IP Addresses",
+"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.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.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Stopped Instances",
+"label.menu.storage": "Storage",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtual Appliances",
+"label.menu.virtual.resources": "Virtual Resources",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "Migrate instance to",
+"label.migrate.instance.to.host": "Migrar inst\u00e0ncia a un altre amfitri\u00f3 \"Host\"",
+"label.migrate.instance.to.ps": "Migrar inst\u00e0ncia 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.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.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"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.optional": "Name (Optional)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "NAT Port Range",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "Network",
+"label.network.acl": "Network ACL",
+"label.network.acls": "Network ACLs",
+"label.network.addvm": "Add network to VM",
+"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.label.display.for.blank.value": "Use default gateway",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Network Offerings",
+"label.network.service.providers": "Network Service Providers",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network Domain",
+"label.networkid": "Network",
+"label.networking.and.security": "Xarxa i seguretat",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Network limits",
+"label.networkname": "Network Name",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Velocitat de xarxa",
+"label.networkread": "Network Read",
+"label.networks": "Xarxes",
+"label.networktype": "Network Type",
+"label.networkwrite": "Network Write",
+"label.new": "Nou",
+"label.new.password": "New Password",
+"label.new.project": "Nou projecte",
+"label.new.vm": "Nova MV",
+"label.newdiskoffering": "New Offering",
+"label.newsize": "New Size (GB)",
+"label.next": "Next",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Storage",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Path",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "Tipus de tarja de xarxa",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"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.none": "None",
+"label.noselect": "No gr\u00e0cies",
+"label.not.found": "Not Found",
+"label.notifications": "Notifications",
+"label.num.cpu.cores": "# of CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Nombre de cl\u00fasters",
+"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.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "Number of Retries",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "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.optional": "Optional",
+"label.order": "Ordre",
+"label.oscategoryid": "OS Preference",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Owned Public IP Addresses",
+"label.owner.account": "Owner Account",
+"label.owner.domain": "Owner Domain",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "Parent Domain",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "Password",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "Password Enabled",
+"label.path": "Path",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Router virtual",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Physical Network",
+"label.physical.network.id": "ID de xarxa f\u00edsica",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "Physical Network",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING storage IP",
+"label.plannermode": "Planner mode",
+"label.please.complete.the.following.fields": "Please complete the following fields",
+"label.please.specify.netscaler.info": "Si us plau doneu informaci\u00f3 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.podid": "Pod",
+"label.podname": "Nom de rack",
+"label.pods": "Racks",
+"label.port": "Port",
+"label.port.forwarding.policies": "Pol\u00b7l\u00edtiques 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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "Anterior",
+"label.primary.network": "Primary Network",
+"label.primary.storage": "Primary Storage",
+"label.primary.storage.allocated": "Primary Storage Allocated",
+"label.primary.storage.count": "Primary Storage Pools",
+"label.primary.storage.used": "Primary Storage Used",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "Primary Storage",
+"label.private.gateway": "Private Gateway",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Private IP Range",
+"label.private.ips": "Private IP Addresses",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Private IP Address",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Xarxa privada",
+"label.privateport": "Private Port",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "Projecte",
+"label.project.dashboard": "Quadre de comandament del projecte",
+"label.project.invite": "Convidar al projecte",
+"label.project.name": "Nom del projecte",
+"label.project.view": "Project View",
+"label.projectid": "ID de projecte",
+"label.projects": "Projectes",
+"label.property": "Property",
+"label.protocol": "Protocol",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Prove\u00efdors",
+"label.provisioningtype": "Provisioning Type",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Public IP Address",
+"label.public.ip.addresses": "Public IP Addresses",
+"label.public.ips": "Public IP Addresses",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "Xarxa p\u00fablica",
+"label.public.traffic": "Public traffic",
+"label.public.zone": "Public Zone",
+"label.publicinterface": "Public Interface",
+"label.publicip": "IP Address",
+"label.publickey": "Public Key",
+"label.publicnetwork": "Xarxa p\u00fablica",
+"label.publicport": "Public Port",
+"label.purpose": "Purpose",
+"label.pxe.server.type": "Tipus de servidor PXE",
+"label.qostype": "QoS Type",
+"label.quickview": "Quickview",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "All Accounts",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "Reboot",
+"label.receivedbytes": "Bytes Received",
+"label.recent.errors": "Recent Errors",
+"label.recover.vm": "Recover VM",
+"label.redundantrouter": "Redundant Router",
+"label.redundantrouterstate": "Estat redundant",
+"label.redundantstate": "Estat redundant",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Refresh",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.reinstall.vm": "Reinstall VM",
+"label.related": "Related",
+"label.relationaloperator": "Operator",
+"label.release.account": "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\u00e9s",
+"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\u00e0tic",
+"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\u00e0rrega",
+"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.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "Required",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "Pasarel\u00b7la reservada del sistema",
+"label.reserved.system.ip": "Reserved System IP",
+"label.reserved.system.netmask": "M\u00e0scara reservada del sistema",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "End Reserved system IP",
+"label.reservedsystemgateway": "Pasarel\u00b7la reservada del sistema",
+"label.reservedsystemnetmask": "M\u00e0scara reservada del sistema",
+"label.reservedsystemstartip": "Start Reserved system IP",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "Reset VPN connection",
+"label.resetvm": "Reset VM",
+"label.resource": "Resource",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "Resource Limits",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "Resources",
+"label.resourcestate": "Resource state",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "Restart network",
+"label.restart.vpc": "Restart VPC",
+"label.restartrequired": "Restart required",
+"label.restore": "Restore",
+"label.retry.interval": "Retry Interval",
+"label.review": "Review",
+"label.revoke.project.invite": "Revocar invitaci\u00f3",
+"label.role": "Role",
+"label.rolename": "Role",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Controlador de disc arrel",
+"label.rootdiskcontrollertypekvm": "Controlador de disc arrel",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "Type",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "Rules",
+"label.running": "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.samlenable": "Authorize SAML SSO",
+"label.samlentity": "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.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.vm": "Secondary storage VM",
+"label.secondary.used": "Secondary Storage Used",
+"label.secondaryips": "Secondary IPs",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "Secret Key",
+"label.security.group.name": "Security Group Name",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Enabled",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Security Groups",
+"label.select": "Select",
+"label.select-view": "Sel\u00b7lecioni vista",
+"label.select.a.zone": "Sel\u00b7leccioni 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\u00b7leccioni ISO o plantilla",
+"label.select.offering": "Select offering",
+"label.select.project": "Sel\u00b7leccionar projecte",
+"label.select.region": "Select region",
+"label.select.tier": "Select Tier",
+"label.select.vm.for.static.nat": "Select VM for static NAT",
+"label.self": "Mine",
+"label.sent": "Sent",
+"label.sentbytes": "Bytes Sent",
+"label.server": "Server",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastic LB",
+"label.service.lb.inlinemodedropdown": "Mode",
+"label.service.lb.lbisolationdropdown": "LB isolation",
+"label.service.offering": "Service Offering",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundant router capability",
+"label.service.state": "Service State",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "Elastic IP",
+"label.servicecapabilities": "Service Capabilities",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Compute offering",
+"label.serviceofferingname": "Compute offering",
+"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\u00f3",
+"label.setup.network": "Set up Network",
+"label.setup.zone": "Set up Zone",
+"label.shared": "Shared",
+"label.sharedexecutable": "Shared",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Show Ingress Rule",
+"label.shrinkok": "Shrink OK",
+"label.shutdown.provider": "Apagar prove\u00efdor",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.size": "Size",
+"label.sizegb": "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.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Name",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "Snapshot Limits",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Socket Timeout",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Source CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Supported Source NAT type",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "Specify VXLAN",
+"label.specifyipranges": "Specify IP ranges",
+"label.specifyvlan": "Specify VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "Start IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Start Reserved system IP",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "By date (start)",
+"label.startip": "Start IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start Port",
+"label.startquota": "Quota Value",
+"label.state": "State",
+"label.static.nat.enabled": "NAT est\u00e0tic 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.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie name",
+"label.sticky.expire": "Expires",
+"label.sticky.holdtime": "Hold time",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "Length",
+"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": "Stopped VMs",
+"label.storage": "Storage",
+"label.storage.tags": "Storage Tags",
+"label.storage.traffic": "Tr\u00e0fic d'emmagatzemament",
+"label.storageid": "Primary Storage",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "Storage Tags",
+"label.storagetype": "Storage Type",
+"label.subdomainaccess": "Acc\u00e9s de subdomini",
+"label.submit": "Submit",
+"label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Succeeded",
+"label.sunday": "Sunday",
+"label.supportedservices": "Supported Services",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"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.offerings": "System Offerings",
+"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.vms": "System VMs",
+"label.system.wide.capacity": "System-wide capacity",
+"label.systemvmtype": "System VM Type",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Target IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Tasca complerta",
+"label.template": "Template",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "Template Limits",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Template",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "Tier details",
+"label.tiername": "Tier",
+"label.time": "Time",
+"label.time.colon": "Time:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "Timezone",
+"label.timezone.colon": "Timezone:",
+"label.token": "Token",
+"label.total.hosts": "Total de hosts",
+"label.total.memory": "Total de RAM",
+"label.total.storage": "Total d'emmagatzemament",
+"label.total.vms": "Total VMs",
+"label.totalcpu": "Total de CPU",
+"label.traffic.label": "Traffic label",
+"label.traffic.types": "Tipus de tr\u00e0fics",
+"label.traffictype": "Traffic Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Tuesday",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "Unavailable",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"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.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.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Use VM IPs",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "User",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "Username",
+"label.users": "Users",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "vCenter IP Address",
+"label.vcsdeviceid": "ID",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"label.view": "Veure",
+"label.view.all": "Veure tots",
+"label.view.console": "Veure consola",
+"label.view.more": "Veure m\u00e9s",
+"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.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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm.add": "Add Instance",
+"label.vm.destroy": "Destroy",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "Reboot",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Start",
+"label.vm.stop": "Stop",
+"label.vmdisplayname": "VM display name",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "VM IP Address",
+"label.vmlimit": "Instance Limits",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "VMs in tier",
+"label.vmstate": "VM state",
+"label.vmtotal": "Total of VMs",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware traffic label",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "Volume Group",
+"label.volume": "Volume",
+"label.volume.details": "Volume details",
+"label.volume.migrated": "Volume migrated",
+"label.volumechecksum": "MD5 checksum",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "Volume Group",
+"label.volumelimit": "Volume Limits",
+"label.volumename": "Volume Name",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN Connection",
+"label.vpn.gateway": "VPN Gateway",
+"label.vpncustomergatewayid": "VPN Customer Gateway",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "Name",
+"label.vsmdevicestate": "State",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"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 \u00e9s CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer traffic label",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"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.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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "Zones",
+"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",
+"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.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.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.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.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.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.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.add.vpn.gateway": "Please confirm that you want to add a VPN Gateway",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "Adding host",
+"message.adding.netscaler.device": "Adding Netscaler device",
+"message.adding.netscaler.provider": "Adding Netscaler provider",
+"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\u00e0gina, no sereu capa\u00e7os 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.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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "Si us plau confirmeu que voleu esborrar l'F5",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"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.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "Si us plau confirmeu que voleu esborrar l'SRX",
+"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\u00efdor",
+"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\u00efdor",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "Please confirm that you would like to remove this IP range.",
+"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\u00efdor",
+"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.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"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.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.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": "\u00bfEsteu 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\u00e9s VPN per aquesta adre\u00e7a 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\u00f3 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\u00fcent:<ul><li>Plantilles - Imatges de SO que es poden fer servir per arrencar MVs i poden incloure altra informaci\u00f3 de configuraci\u00f3, com ara aplicacions instal\u00b7lades</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\u00f3 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\u00f3 i no utilitzat per CloudStack.",
+"message.installwizard.tooltip.addhost.hostname": "El nom DNS o adre\u00e7a de l'amfitri\u00f3 \"host\".",
+"message.installwizard.tooltip.addhost.password": "Aquesta \u00e9s la contrasenya per a l'usuari del d'amunt (des de la instal\u00b7laci\u00f3 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 \u00e9s 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\u00f3.",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "La passarel\u00b7la per als amfitrions en aquest pot.",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "La m\u00e0scara de xarxa en \u00fas en la subxarxa dels clients a utilitzar",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "Aquest \u00e9s 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\u00f3.",
+"message.installwizard.tooltip.addprimarystorage.name": "El nom per al dispositiu d'emmagatzematge",
+"message.installwizard.tooltip.addprimarystorage.path": "(per a NFS) A NFS, aquest \u00e9s el cam\u00ed exportat des del servidor. Cam\u00ed (per SharedMountPoint). Amb KVM aquest \u00e9s el cam\u00ed 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\u00e7a IP o nom DNS del dispositiu d'emmagatzematge.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "L'adre\u00e7a IP del servidor NFS que allotja l'emmagatzematge secundari",
+"message.installwizard.tooltip.addsecondarystorage.path": "La ruta d'exportaci\u00f3, 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\u00f3 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\u00b7la que els convidats han d'utilitzar",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "La m\u00e0scara de xarxa en \u00fas 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\u00e0ncia a un altra  amfitri\u00f3 \"host\"",
+"message.migrate.instance.to.ps": "Si us plau, confirmi que vol migrar la inst\u00e0ncia 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.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"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\u00f3 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.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\u00f3 de projectes, i sel\u00b7leccioneu 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\u00f3 enviada a l'usuari; ser\u00e0 afegit al projecte quan accepti l'invitaci\u00f3",
+"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.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.reset.vpn.connection": "Please confirm that you want to reset VPN connection",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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\u00b7leccioneu 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\u00b7laci\u00f3 del cloud correcte!",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "Please specify URL",
+"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.template.iso": "Please select a template or ISO to continue",
+"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.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.validate.url": "Please enter a valid URL.",
+"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.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"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": "Zone creation complete",
+"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}.",
+"network.rate": "Velocitat de xarxa",
+"side.by.side": "Costat a costat",
+"state.accepted": "Acceptat",
+"state.active": "Actiu",
+"state.allocating": "Allocating",
+"state.backedup": "Backed Up",
+"state.backingup": "Backing Up",
+"state.completed": "Complert",
+"state.creating": "Creant",
+"state.declined": "Declinat",
+"state.destroyed": "Destroyed",
+"state.detached": "Detached",
+"state.disabled": "Deshabilitat",
+"state.enabled": "Habilitat",
+"state.error": "Error",
+"state.expunging": "Esborrant",
+"state.migrating": "Migrating",
+"state.pending": "Pendent",
+"state.running": "Running",
+"state.starting": "Arrencant",
+"state.stopped": "Stopped",
+"state.stopping": "Stopping",
+"state.suspended": "Susp\u00e9s",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/de_DE.json b/ui/public/locales/de_DE.json
new file mode 100644
index 0000000..4a3e7dc
--- /dev/null
+++ b/ui/public/locales/de_DE.json
@@ -0,0 +1,3176 @@
+{
+"changed.item.properties": "Geänderte Eintragseigenschaften",
+"confirm.enable.s3": "Bitte fügen Sie die folgenden Informationen hinzu, um die Unterstützung für \"S3-backend Secondary Storage\" zu aktivieren",
+"confirm.enable.swift": "Bitte fügen Sie die folgenden Informationen hinzu, um die Unterstützung für Swift zu aktivieren",
+"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.dedicate.cluster.failed": "Dedizieren des Clusters fehlgeschlagen",
+"error.dedicate.host.failed": "Dedizieren des Hosts fehlgeschlagen",
+"error.dedicate.pod.failed": "Dedizieren des Pods fehlgeschlagen",
+"error.dedicate.zone.failed": "Dedizieren der Zone fehlgeschlagen",
+"error.execute.api.failed": "Aufruf der API fehlgeschlagen",
+"error.fetching.async.job.result": "Es ist ein Fehler bei Statusabfrage eines asynchronen Jobs aufgetreten",
+"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 oder Passwort konnte nicht validiert werden.",
+"error.menu.select": "Es ist nicht möglich dies auszuführen, weil nichts ausgewählt wurde.",
+"error.mgmt.server.inaccessible": "Der Management Server ist nicht erreichbar. Bitte versuchen 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.release.dedicate.cluster": "Freigabe des dedizierten Clusters fehlgeschlagen",
+"error.release.dedicate.host": "Freigabe des dedizierten Hosts fehlgeschlagen",
+"error.release.dedicate.pod": "Freigabe des dedizierten Pods fehlgeschlagen",
+"error.release.dedicate.zone": "Freigabe der dedizierten Zone fehlgeschlagen",
+"error.session.expired": "Ihre Sitzung ist abgelaufen.",
+"error.unable.to.reach.management.server": "Verwaltungsserver kann nicht erreicht werden",
+"error.unresolved.internet.name": "Ihr Internetname kann nicht aufgelöst werden.",
+"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 zum sofortigen Anhalten der virtuellen Maschine führen, bevor CloudStack den Host vom Cluster entfernt.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Bildverzeichnis",
+"inline": "Inline",
+"label.about": "Über",
+"label.about.app": "Über CloudStack",
+"label.accept": "Akzeptieren",
+"label.accept.project.invitation": "Projekteinladung annehmen",
+"label.access": "Zugang",
+"label.accesskey": "Zugriffsschlüssel",
+"label.account": "Benutzerkonto",
+"label.account.and.security.group": "Konto, Sicherheitsgruppe",
+"label.account.details": "Kontodetails",
+"label.account.id": "Benutzerkonto-ID",
+"label.account.name": "Benutzerkonto-Name",
+"label.account.specific": "Besonderheiten des Benutzerkontos",
+"label.accounts": "Benutzerkonten",
+"label.accounttype": "Benutzerkontotyp",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL-Kennung",
+"label.acl.list.rules": "ACL-Listenregeln",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL ersetzt",
+"label.aclid": "ACL",
+"label.aclname": "ACL-Name",
+"label.acltotal": "Netzwerk-ACL Total",
+"label.acquire.new.ip": "Neue IP erwerben",
+"label.acquire.new.secondary.ip": "Neue sekundäre IP anfordern",
+"label.acquiring.ip": "IP anfordern",
+"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.configure.stickiness": "Klebrigkeit",
+"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.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.account": "Benutzerkonto löschen",
+"label.action.delete.account.processing": "Konto wird gelöscht....",
+"label.action.delete.backup.offering": "Backup-Angebot löschen",
+"label.action.delete.cluster": "Löschen des Clusters",
+"label.action.delete.cluster.processing": "Cluster wird gelöscht....",
+"label.action.delete.disk.offering": "Disk-Offering löschen",
+"label.action.delete.disk.offering.processing": "Disk-Offering 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": "Ingress-Regel wird gelöscht....",
+"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.load.balancer": "Loadbalancer-Regel löschen",
+"label.action.delete.load.balancer.processing": "Loadbalancer-Regel 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": "Primary Storage wird gelöscht....",
+"label.action.delete.secondary.storage": "Sekundärspeicher löschen",
+"label.action.delete.secondary.storage.processing": "Secondary Storage 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": "Service-Offering löschen",
+"label.action.delete.service.offering.processing": "Service-Offering 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": "System-Service-Offering 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": "Datenträger 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.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.iso": "ISO 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.get.diagnostics": "Diagnosedaten anfordern",
+"label.action.iso.permission": "Berechtigungen für ISO aktualisieren",
+"label.action.iso.share": "Freigabe für ISO aktualisieren",
+"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.project.add.account": "Konto zu Projekt hinzufügen",
+"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.ncc": "NCC 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.remove.vm": "Freigabe der VM",
+"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ücksetzen",
+"label.action.revert.snapshot.processing": "Es wird auf den Schnappschuss zurückgesetzt...",
+"label.action.router.health.checks": "Gesundheitsüberprüfungen des Routers anfordern",
+"label.action.run.diagnostics": "Diagnose starten",
+"label.action.secure.host": "Beschaffe Sicherheitsschlüssel des Hosts",
+"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.template.permission": "Berechtigungen für Vorlage aktualisieren",
+"label.action.template.share": "Update Template Verteilung",
+"label.action.unmanage.cluster": "Vernachlässige Cluster",
+"label.action.unmanage.cluster.processing": "Cluster wird nicht mehr verwaltet....",
+"label.action.unmanage.virtualmachine": "Verwaltung der VM beenden",
+"label.action.update.offering.access": "Update Zugangsangebot",
+"label.action.update.os.preference": "Bevorzugtes Betriebssystem 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.activeviewersessions": "Aktive Sitzungen",
+"label.add": "Hinzufügen",
+"label.add.account": "Konto hinzufügen",
+"label.add.accounts": "Konten hinzufügen",
+"label.add.accounts.to": "Konten hinzufügen zu",
+"label.add.acl": "ACL hinzufügen",
+"label.add.acl.list": "ACL-Liste hinzufügen",
+"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.bigswitchbcf.device": "Füge BigSwitch BCF Controller hinzu",
+"label.add.brocadevcs.device": "Brocade Vcs Switch 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.certificate": "Zertifikat hinzufügen",
+"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.f5.device": "F5-Gerät 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.kubernetes.cluster": "Kubernetes Cluster hinzufügen",
+"label.add.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "LDAP-Konto hinzufügen",
+"label.add.ldap.list.users": "LDAP-Nutzer auflisten",
+"label.add.list.name": "ACL-Listename",
+"label.add.load.balancer": "Lastverteiler hinzufügen",
+"label.add.management.ip.range": "Management IP-Bereich 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.gateway": "Neues Gateway hinzufügen",
+"label.add.new.iso": "Neue ISO 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.tier": "Neue Ebene hinzufügen",
+"label.add.nfs.secondary.staging.store": "NFS Sekundär Staging Store hinzufügen",
+"label.add.niciranvp.device": "Nvp Controller hinzufügen",
+"label.add.note": "Bemerkung hinzufügen",
+"label.add.opendaylight.device": "OpenDaylight Controller hinzufügen",
+"label.add.pa.device": "Palo Alto-Gerät 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.ip": "Sekundäre IP hinzufügen",
+"label.add.secondary.storage": "Sekundärspeicher hinzufügen",
+"label.add.security.group": "Sicherheitsgruppe hinzufügen",
+"label.add.service.offering": "Dienstangebot hinzufügen",
+"label.add.setting": "Einstellung hinzufügen",
+"label.add.srx.device": "SRX-Gerät 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.traffic": "Datenverkehr hinzufügen",
+"label.add.ucs.manager": "UCS Manager hinzufügen",
+"label.add.user": "Benutzer hinzufügen",
+"label.add.vlan": "VLAN hinzufügen",
+"label.add.vm": "VM hinzufügen",
+"label.add.vm.to.tier": "VM zur Ebene 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.gateway": "VPN Gateway hinzufügen",
+"label.add.vpn.user": "VPN-Benutzer hinzufügen",
+"label.add.vxlan": "VXLAN hinzufügen",
+"label.add.zone": "Zone hinzufügen",
+"label.addanothernetwork": "Weiteres Netzwerk 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.addnewnetworks": "Neues Netzwerk hinzufügen",
+"label.address": "Adresse",
+"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.groups": "Affinitätsgruppen",
+"label.affinitygroup": "Affinitätsgruppe",
+"label.agent.password": "Agent-Passwort",
+"label.agent.username": "Agent-Benutzername",
+"label.agentport": "Agent-Port",
+"label.agentstate": "Agent-Status",
+"label.agree": "Zustimmen",
+"label.alert": "Warnung",
+"label.alert.archived": "Alarm archiviert",
+"label.alert.deleted": "Alarm gelöscht",
+"label.alert.details": "Alarmdetails",
+"label.alerts": "Alarme",
+"label.algorithm": "Algorithmus",
+"label.all": "Alle",
+"label.all.zone": "Alle Zonen",
+"label.allocated": "Zugeteilt",
+"label.allocatediops": "IOPS zuweisen",
+"label.allocationstate": "Belegungszustand",
+"label.allow": "Erlauben",
+"label.allowuserdrivenbackups": "Benutzer gesteuerte Backups erlauben",
+"label.annotated.by": "Anmerkung von",
+"label.annotation": "Anmerkung",
+"label.anti.affinity": "Anti-Affinität",
+"label.anti.affinity.group": "Anti-Affinitätsgruppe",
+"label.anti.affinity.groups": "Anti-Affinitätsgruppen",
+"label.api.version": "API-Version",
+"label.apikey": "API Schlüssel",
+"label.app.cookie": "AppCookie",
+"label.app.name": "CloudStack",
+"label.apply": "Anwenden",
+"label.archive": "Archiv",
+"label.archive.alerts": "Alarme archivieren",
+"label.archive.events": "Ereignisse archivieren",
+"label.as.default": "auf default",
+"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.assigning.vms": "VMs zuordnen",
+"label.associatednetwork": "Zugehöriges Netzwerk",
+"label.associatednetworkid": "Assozierte Netzwerk ID",
+"label.associatednetworkname": "Netzwerk Name",
+"label.asyncbackup": "Asynchrones Backup",
+"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.availabilityzone": "Verfügbarkeitszone",
+"label.available": "Verfügbar",
+"label.available.public.ips": "Verfügbaren öffentlichen IP-Adressen",
+"label.back": "Zurück",
+"label.backup": "Backup",
+"label.backup.attach.restore": "Backup-Volume wiederherstellen und anhängen",
+"label.backup.offering.assign": "VM zum Backup-Angebot zuordnen",
+"label.backup.offering.remove": "VM vom Backup-Angebot entfernen",
+"label.backup.offerings": "Backup-Angebote",
+"label.backup.restore": "VM Backup wiederherstellen",
+"label.backupofferingid": "Backup-Angebot",
+"label.backupofferingname": "Backup-Angebot",
+"label.balance": "Abgleich",
+"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.baremetalcpu": "CPU (in MHz)",
+"label.baremetalcpucores": "Anzahl an CPU-Kernen",
+"label.baremetalmac": "Host-MAC",
+"label.baremetalmemory": "Speicher (in MB)",
+"label.based.on": "Basierend auf",
+"label.basic": "Basis",
+"label.basic.mode": "Grundmodus",
+"label.basicsetup": "Basiseinrichtung",
+"label.bcfdeviceid": "Identifikation",
+"label.bigswitch.bcf.details": "BigSwitch BCF Details",
+"label.bigswitch.controller.address": "Adresse des BigSwitch BCF Controllers",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootbar",
+"label.bootintosetup": "In das BIOS-Setup booten",
+"label.bootmode": "Boot-Modus",
+"label.boottype": "Boot-Typ",
+"label.broadcastdomainrange": "Broadcast-Domain Bereich",
+"label.broadcastdomaintype": "Broadcast Domain Typ",
+"label.broadcasturi": "Broadcast-URI",
+"label.brocade.vcs.address": "Vcs Switch Adresse",
+"label.brocade.vcs.details": "Brocade Vcs Switch Details",
+"label.bucket": "Bucket",
+"label.by.account": "Nach Benutzerkonto",
+"label.by.alert.type": "Nach Alarmtyp",
+"label.by.availability": "Nach Verfügbarkeit",
+"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.bypassvlanoverlapcheck": "Umgehe die VLAN ID/Bereich Überlappung",
+"label.cachemode": "Schreib-Cache-Typ",
+"label.cancel": "Abbrechen",
+"label.capacity": "Kapazität",
+"label.capacity.iops": "Kapazitäts-IOPS",
+"label.capacitybytes": "Kapazitäts-Bytes",
+"label.capacityiops": "Gesamte IOPS",
+"label.category": "Kategorie",
+"label.certchain": "Zertifikatskette",
+"label.certificate": "Serverzertifikat",
+"label.certificate.details": "Zertifikatsdetails",
+"label.certificate.upload": "Zertifikat hochladen",
+"label.certificate.upload.failed": "Hochladen des Zertifikats fehlgeschlagen",
+"label.certificate.upload.failed.description": "Update des SSL-Zertifikats und Validierung des Zertifikats fehlgeschlagen",
+"label.certificateid": "Zertifikats-ID",
+"label.change.affinity": "Affinität ändern",
+"label.change.ip.addess": "IP-Adresse ä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.choose.saml.indentity": "SAML Identitäts-Anbieter wechseln",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR oder Benutzerkonto/Sicherheitsgruppe",
+"label.cidr.destination.network": "Ziel-Netzwerk CIDR",
+"label.cidr.of.destination.network": "CIDR des Zielnetzwerks",
+"label.cidrlist": "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.cks.cluster.size": "Clustergröße (Arbeiterknoten)",
+"label.cleanup": "Bereinigen",
+"label.clear": "Löschen",
+"label.clear.list": "Liste löschen",
+"label.close": "Schliessen",
+"label.cloud.console": "Cloud Verwaltungskonsole",
+"label.cloud.managed": "Geleitet von cloud.com",
+"label.cloudian.storage": "Cloudian Speicher",
+"label.cluster": "Cluster",
+"label.cluster.name": "Clustername",
+"label.cluster.size": "Clustergröße",
+"label.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Clustername",
+"label.clusters": "Cluster",
+"label.clustertype": "Cluster-Typ",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.comma.separated.list.description": "Komma-separierte Liste von Kommandos eintragen",
+"label.comments": "Kommentare",
+"label.community": "Gemeinschaft",
+"label.compute": "Berechnen",
+"label.compute.and.storage": "Berechnen und Speicher",
+"label.compute.offering.access": "Berechne verfügbaren Zugang",
+"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.confirmacceptinvitation": "Wollen Sie dem Projekt wirklich beitreten?",
+"label.confirmation": "Bestätigung",
+"label.confirmdeclineinvitation": "Sind Sie sicher, dass Sie diese Einladung zu dem Projekt ablehnen möchten?",
+"label.confirmpassword": "Passwort bestätigen",
+"label.confirmpassword.description": "Bitte das Passwort wiederholen",
+"label.congratulations": "Herzlichen Glückwunsch",
+"label.connectiontimeout": "Verbindungszeitüberschreitung",
+"label.conservemode": "Konserven-Modus",
+"label.console.proxy": "Konsolenproxy",
+"label.console.proxy.vm": "Konsolenproxy-VM",
+"label.continue": "Fortsetzen",
+"label.continue.basic.install": "Weiterfahren mit Basisinstallation",
+"label.copied.clipboard": "Zum Clipboard kopiert",
+"label.copy": "Kopieren",
+"label.copy.clipboard": "Zum Clipboard kopieren",
+"label.copy.text": "Text kopieren",
+"label.copyid": "ID kopieren",
+"label.copying.iso": "ISO wird kopiert",
+"label.corrections.saved": "Korrekturen gespeichert",
+"label.counterid": "Zähler",
+"label.cpu": "CPU",
+"label.cpu.allocated": "Zugeteilte CPU",
+"label.cpu.sockets": "CPU-Sockets",
+"label.cpuallocated": "CPU alloziert für VMs",
+"label.cpuallocatedghz": "Zugeteilt",
+"label.cpulimit": "CPU-Begrenzungen",
+"label.cpumaxdeviation": "Abweichung",
+"label.cpunumber": "CPU Kerne",
+"label.cpusockets": "Die Anzahl der CPU-Sockeln",
+"label.cpuspeed": "CPU (in MHz)",
+"label.cputotal": "Gesamtanzahl CPU",
+"label.cputotalghz": "Gesamt",
+"label.cpuused": "genutzte CPU",
+"label.cpuusedghz": "CPU Nutzung",
+"label.create.account": "Account erstellen",
+"label.create.backup": "Backup erstellen",
+"label.create.network.gateway.description": "Das Gateway des Netzwerkes muss in dem super CIDR Bereich liegen and darf sich nicht einem anderen Netzwerk CIDR Bereich vom dem VPC überlappen",
+"label.create.network.netmask.description": "Netzmaske des Netzwerkes. Zum Beispiel, mit einer VPC CIDR von 10.0.0.0/16 und einer Netzwerk CIDR von 10.1.1.0/24, ist das Gateway 10.1.1.1 und die Netzmaske ist 255.255.255.0",
+"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.site.vpn.connection": "Erstelle Site-to-Site VPN Verbindung",
+"label.create.site.vpn.gateway": "Erstelle Site-to-Site VPN Gateway",
+"label.create.ssh.key.pair": "Erstelle ein SSH-Schlüsselpaar",
+"label.create.template": "Vorlage erstellen",
+"label.create.vpn.connection": "VPN-Verbindung erstellen",
+"label.created": "Erstellt",
+"label.created.by.system": "Vom System erstellt",
+"label.createnfscache": "NFS sekundärer Staging Store erstellen",
+"label.creating.iprange": "Erstelle IP-Bereich",
+"label.credit": "Guthaben",
+"label.crosszones": "überschneidende Zonen",
+"label.currency": "Währung",
+"label.current": "istAktuell",
+"label.currentpassword": "Current Password",
+"label.custom": "Benutzerdefiniert",
+"label.custom.disk.offering": "Benutzerdefiniertes Festplattenangebot",
+"label.customconstrained": "Eigene Einschränkung",
+"label.customdisksize": "Benutzerdefinierte Festplattengrösse",
+"label.customunconstrained": "Eigene Freigabe",
+"label.daily": "Täglich",
+"label.dashboard": "Dashboard",
+"label.dashboard.endpoint": "Dashboard Endpunkt",
+"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.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.use": "Standardeinstellung nutzen",
+"label.default.view": "Standardansicht",
+"label.defaultnetwork": "Standard-Netzwerk",
+"label.delete": "Löschen",
+"label.delete.acl.list": "ACL-Liste ersetzen",
+"label.delete.affinity.group": "Affinitätsgruppe entfernen",
+"label.delete.alerts": "Alarme löschen",
+"label.delete.backup": "Backup löschen",
+"label.delete.baremetal.rack.configuration": "Barematel Rackkonfiguration entfernen",
+"label.delete.bigswitchbcf": "BigSwitch BCF Controller entfernen",
+"label.delete.brocadevcs": "Brocade Vcs Switch löschen",
+"label.delete.certificate": "Zertifikat löschen",
+"label.delete.ciscoasa1000v": "CiscoASA1000v löschen",
+"label.delete.ciscovnmc.resource": "CiscoVNMC-Ressource löschen",
+"label.delete.confirm": "Löschen?",
+"label.delete.dedicated.vlan.range": "Lösche den dedizierte VLAN/VNI-Bereich",
+"label.delete.domain": "Domain löschen",
+"label.delete.events": "Ereignisse löschen",
+"label.delete.f5": "F5 löschen",
+"label.delete.gateway": "Lösche Gateway",
+"label.delete.instance.group": "Instanzgruppe löschen",
+"label.delete.internal.lb": "Interne LB 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.portable.ip.range": "Portablen IP-Bereich löschen",
+"label.delete.project": "Projekt löschen",
+"label.delete.role": "Rolle löschen",
+"label.delete.rule": "Regel löschen",
+"label.delete.secondary.staging.store": "Sekundärer Staging Store löschen",
+"label.delete.snapshot.policy": "Schnappschussplan löschen",
+"label.delete.srx": "SRX löschen",
+"label.delete.sslcertificate": "SSL-Zertifikat löschen",
+"label.delete.ucs.manager": "UCS Manager löschen",
+"label.delete.volumes": "Volumes 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.vpn.user": "VPN-Benutzer löschen",
+"label.deleteconfirm": "Wollen Sie es wirklich löschen?",
+"label.deleteprofile": "Profil löschen",
+"label.deleting": "Lösche",
+"label.deleting.failed": "Löschen fehlgeschlagen",
+"label.deleting.iso": "ISO löschen",
+"label.deleting.processing": "Lösche....",
+"label.deleting.template": "Template löschen",
+"label.deny": "Verweigern",
+"label.deploymentplanner": "Deployment-Planer",
+"label.description": "Beschreibung",
+"label.destcidr": "Zielort CIDR",
+"label.destination": "Zielort",
+"label.destinationphysicalnetworkid": "Physiche Netzwerk-ID des Zielorts",
+"label.destinationzoneid": "Zielzone",
+"label.destroy": "Zerstören",
+"label.destroy.kubernetes.cluster": "Kubernetes Cluster löschen",
+"label.destroy.router": "Router zerstören",
+"label.destroyvmgraceperiod": "Gnadenfrist bis zur Zerstörung der VM",
+"label.detaching.disk": "Entfernen der Festplatte",
+"label.details": "Details",
+"label.deviceid": "Geräte-ID",
+"label.devices": "Geräte",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "Direkt angeschlossene öffentliche IP",
+"label.direct.ips": "Gemeinsame Netzwerk-IPs",
+"label.directdownload": "Direct Download",
+"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.disconnected": "Zuletzt getrennt",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.access": "verfügbares Festplattenangebot",
+"label.disk.offering.details": "Festplattenangebotdetails",
+"label.disk.offerings": "Festplattenangebote",
+"label.disk.size": "Festplattengröße",
+"label.disk.volume": "Festplattenvolumen",
+"label.diskbytesreadrate": "Festplatten-Leserate (BPS)",
+"label.diskbyteswriterate": "Festplatten-Schreibrate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Festplatten-Leserate (IOPS)",
+"label.diskiopstotal": "Festplatten IOPS",
+"label.diskiopswriterate": "Festplatten-Schreibrate (IOPS)",
+"label.diskioread": "Festplatte Lesen (EA)",
+"label.diskiowrite": "Festplatte Schreiben (EA)",
+"label.diskkbsread": "Festplatte Lesen (Bytes)",
+"label.diskkbswrite": "Festplatte Schreiben (Bytes)",
+"label.diskoffering": "Festplattenangebot",
+"label.diskofferingdisplaytext": "Festplattenangebot",
+"label.diskofferingid": "Festplattenangebot",
+"label.disksize": "Festplattengröße (in GB)",
+"label.disksizeallocated": "Zugeordnete Festplatte",
+"label.disksizeallocatedgb": "Zugeteilt",
+"label.disksizetotal": "Gesamtzahl der Festplatten",
+"label.disksizetotalgb": "Gesamt",
+"label.disksizeunallocatedgb": "Unbelegt",
+"label.disksizeused": "Genutzte Festplattengröße",
+"label.disksizeusedgb": "Gebraucht",
+"label.display.text": "Anzeigetext",
+"label.displayname": "Anzeigename",
+"label.displaytext": "Beschreibung",
+"label.distributedvpcrouter": "Verteilter VPC-Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS Domain für Gast-Netzwerke",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domain",
+"label.domain.details": "Nährere Angaben zu Domains",
+"label.domain.id": "Domain-ID",
+"label.domain.name": "Domain Name",
+"label.domain.router": "Domain Router",
+"label.domain.suffix": "DNS Domainsuffix (z.B. xzy.com)",
+"label.domainid": "Domain ID",
+"label.domainname": "Domain",
+"label.domainpath": "Domain",
+"label.domains": "Domain",
+"label.done": "Fertig",
+"label.double.quotes.are.not.allowed": "Anführungszeichen sind nicht erlaubt",
+"label.download": "Herunterladen",
+"label.download.kubeconfig.cluster": "Herunterladen der kubeconfig für das Cluster. <br><br> Das <code>kubectl</code> Kommandozeilenwerkzeug nutzt die kubeconfig Dateien zum Finden von Informationen, um ein Cluster auszuwählen und mit dem API Server eines Clusters zu kommunizieren.",
+"label.download.kubectl": "Herunterladen des <code>kubectl</code> Werkzeugs für die passende Cluster Kubernetes Version",
+"label.download.kubernetes.cluster.config": "Herunterladen der Kubernetes Cluster Config",
+"label.download.progress": "Download-Fortschritt",
+"label.dpd": "Dead-Peer-Erkennung",
+"label.drag.new.position": "Ziehe zu neuer Position",
+"label.driver": "Treiber",
+"label.duration.in.sec": "Dauer (in Sekunden)",
+"label.edit": "Bearbeiten",
+"label.edit.acl.list": "Edit ACL List",
+"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": "Austritt",
+"label.egress.default.policy": "Egress Standard Richtlinie",
+"label.egress.rule": "Egress-Regel",
+"label.egress.rules": "Egress-Regeln",
+"label.egressdefaultpolicy": "Standard Egress Richtlinie",
+"label.elastic": "Elastisch",
+"label.email": "E-Mail",
+"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": "Ende",
+"label.end.ip": "End-IP",
+"label.end.reserved.system.ip": "Reservierte System-End-IP",
+"label.end.vlan": "End-VLAN",
+"label.end.vxlan": "End-VXLAN",
+"label.enddate": "Nach Datum (Ende)",
+"label.endip": "End-IP",
+"label.endipv4": "IPv4 End-IP",
+"label.endipv6": "IPv6 End-IP",
+"label.endpoint": "Endpunkt",
+"label.endpoint.or.operation": "Endpunkt oder Bedienung",
+"label.endport": "Beende Port",
+"label.enter.token": "Token eingeben",
+"label.error": "Fehler",
+"label.error.code": "Fehlercode",
+"label.error.file.read": "Datei konnte nicht gelesen werden",
+"label.error.file.upload": "Datei Upload fehlgeschlagen",
+"label.error.rules.file.import": "Bitte wählen Sie eine gültige CSV-Datei",
+"label.error.setting": "Error Einstellungen",
+"label.error.something.went.wrong.please.correct.the.following": "Etwas ging schief; bitte korrigieren Sie folgende Angaben",
+"label.error.upper": "FEHLER",
+"label.error.volume.upload": "Bitte eine Datei auswählen",
+"label.espencryption": "ESP-Verschlüsselung",
+"label.esphash": "ESP-Prüfsumme",
+"label.esplifetime": "ESP-Lebensdauer (Sekunde)",
+"label.esppolicy": "ESP-Richtlinie",
+"label.event": "Ereignis",
+"label.event.archived": "Ereignis archiviert",
+"label.event.deleted": "Ereignis gelöscht",
+"label.event.timeline": "Event-Timeline",
+"label.events": "Events",
+"label.every": "Jeder",
+"label.example": "Beispiel",
+"label.existingnetworks": "Bestehende Netzwerke",
+"label.expunge": "Unwiederbringlich löschen",
+"label.expunged": "Gelöscht",
+"label.expunging": "Löschen",
+"label.external.link": "Externer Link",
+"label.externalid": "Externe Id",
+"label.externalloadbalanceripaddress": "Externe Load Balancer IP-Adresse",
+"label.extra": "Extra Arguments",
+"label.f5": "F5",
+"label.f5.details": "F5-Details",
+"label.f5.ip.loadbalancer": "F5 Big IP Load Balancer",
+"label.failed": "Fehlgeschlagen",
+"label.featured": "Empfohlen",
+"label.fetch.latest": "Neuste abrufen",
+"label.files": "Alternative Dateien empfangen",
+"label.filter": "Filter",
+"label.filterby": "Filtern nach",
+"label.fingerprint": "FingerAbdruck",
+"label.firewall": "Firewall",
+"label.firstname": "Vorname",
+"label.firstname.lower": "Vorname",
+"label.fix.errors": "Fehler beheben",
+"label.fixed": "Korrigiertes Angebot",
+"label.for": "für",
+"label.forced": "Erzwingen",
+"label.forceencap": "Erzwinge eine Kapselung der UDP- in ESP-Pakete",
+"label.forgedtransmits": "Gefälschte Übertragung",
+"label.format": "Format",
+"label.french.azerty.keyboard": "Französische AZERTY-Tastatur",
+"label.friday": "Freitag",
+"label.from": "von",
+"label.from.lb": "von LB",
+"label.full": "Voll",
+"label.full.path": "Vollständiger Pfad",
+"label.fwdeviceid": "Identifikation",
+"label.fwdevicename": "Typ",
+"label.fwdevicestate": "Status",
+"label.gateway": "Schnittstelle",
+"label.general.alerts": "Allgemeine Alarme",
+"label.generating.url": "Generieren der URL",
+"label.get.diagnostics.desc": "Wenn Sie die erhaltenen Standarddateien überschreiben wollen, dann geben Sie sie hier ein. Andernfalls lassen Sie das Feld leer und drücken OK",
+"label.global.settings": "Allgemeine Einstellungen",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS-Konfiguration",
+"label.glustervolume": "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.lb.details": "Lastverteilungsdetails",
+"label.gslb.lb.remove": "Lastverteilung aus diesem GSLB entfernen",
+"label.gslb.service": "GSLB-Dienst",
+"label.gslb.service.private.ip": "GSLB-Dienst Private IP",
+"label.gslb.service.public.ip": "GSLB-Dienst Öffentliche IP",
+"label.gslbdomainname": "GSLB-Domänenname",
+"label.gslbprovider": "GSLB-Dienst",
+"label.gslbproviderprivateip": "GSLB-Dienst Private IP",
+"label.gslbproviderpublicip": "GSLB-Dienst Öffentliche IP",
+"label.gslbservicetype": "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.guestcidraddress": "Gast CIDR",
+"label.guestendip": "Gast-End-IP",
+"label.guestgateway": "Gast-Schnittstelle",
+"label.guestipaddress": "Gast IP-Adresse",
+"label.guestiptype": "Gasttyp",
+"label.guestnetmask": "Gast Netzmaske",
+"label.guestnetwork": "Gastnetzwerk",
+"label.guestnetworkid": "Netzwerk-ID",
+"label.guestnetworkname": "Netzwerk Name",
+"label.guestosid": "OS Typ",
+"label.gueststartip": "Gast-Start-IP",
+"label.guestvlanrange": "VLAN-Bereich(e)",
+"label.guestvmcidr": "CIDR",
+"label.ha": "HA",
+"label.ha.configure": "HA konfigurieren",
+"label.ha.disable": "HA deaktivieren",
+"label.ha.enable": "HA aktivieren",
+"label.haenable": "HA aktiviert",
+"label.hahost": "HA aktiviert",
+"label.haprovider": "HA Anbieter",
+"label.hardware": "Hardware",
+"label.hastate": "HA Status",
+"label.header.backup.schedule": "Sie können einen wiederholenden Backup Plan einstellen, in dem Sie die verfügbaren Optionen auswählen und Ihre Auswahl bestätigen.",
+"label.header.volume.snapshot": "Sie können wiederkehrende Schnapschuss-Zeitpläne einrichten in dem Sie die untenstehenden verfügbaren Optionen auswählen und Ihren Regeleinstellungen anwenden",
+"label.header.volume.take.snapshot": "Bitte bestätigen Sie, dass Sie einen Schnappschuss von diesem Volumen sichern möchten.",
+"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.hideipaddressusage": "IP-Adressen Nutzung verstecken",
+"label.hints": "Hinweise",
+"label.home": "Start",
+"label.host": "Host",
+"label.host.alerts": "Hosts im Alarmzustand",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.host.ueficapability": "UEFI unterstützt",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Markierungen des Hosts",
+"label.hourly": "Stündlich",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisorfähigkeiten",
+"label.hypervisor.type": "Hypervisor Typ",
+"label.hypervisors": "Hypervisoren",
+"label.hypervisorsnapshotreserve": "Hypervisor Schnappschuss-Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor-Version",
+"label.hypervnetworklabel": "HyperV Datenverkehrs-Bezeichnung",
+"label.icmp": "ICMP",
+"label.icmpcode": "ICMP-Code",
+"label.icmpcode.end.port": "ICMP Code / End Port",
+"label.icmptype": "ICMP-Typ",
+"label.icmptype.start.port": "ICMP Type / Start Port",
+"label.id": "Identifikation",
+"label.identity.and.access": "Identität und Zugang",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE-Verschlüsselung",
+"label.ikehash": "IKE-Prüfsumme",
+"label.ikelifetime": "IKE-Lebensdauer (Sekunde)",
+"label.ikepolicy": "IKE-Richtlinie",
+"label.images": "Bilder",
+"label.import.backup.offering": "Importiere verfügbares Backup-Angebot",
+"label.import.offering": "Importiere Backup-Angebot",
+"label.import.role": "Importiere Rolle",
+"label.in.progress": "in Bearbeitung",
+"label.in.progress.for": "in Bearbeitung für",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastruktur",
+"label.ingress": "Zutritt",
+"label.ingress.rule": "Zutrittsregel",
+"label.initiated.by": "Initiiert durch",
+"label.insideportprofile": "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.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.groups": "Instanzgruppen",
+"label.instance.name": "Name der Instanz",
+"label.instance.scaled.up": "Instanz wurde zum gewünschten Angebot skaliert",
+"label.instancename": "Interner Name",
+"label.instanceport": "Instanz-Port",
+"label.instances": "Instanzen",
+"label.instanciate.template.associate.profile.blade": "Vorlage instanzieren und Profil zu Blade assoziieren",
+"label.intermediate.certificate": "Intermediate Zertifikat",
+"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.internaldns1": "Interner DNS 1",
+"label.internaldns2": "Interner DNS 2",
+"label.internallb.description": "Kurze Beschreibung des internen LB",
+"label.internallb.name.description": "Eindeutiger Name für den internen LB",
+"label.internallb.sourceip.description": "Eindeutige quell IP-Adresse des internen LB",
+"label.internallbvm": "Interne LV VM",
+"label.interval": "Abfrageintervall (in Sekunden)",
+"label.intervaltype": "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.allocations": "IP-Zuweisungen",
+"label.ip.or.fqdn": "IP oder FQDN",
+"label.ip.range": "IP-Bereich",
+"label.ip.ranges": "IP-Bereiche",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4-Netzmaske",
+"label.ip6address": "IPv6-IP-Adresse",
+"label.ip6cidr": "IPv6-CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6-Gateway",
+"label.ipaddress": "IP-Adresse",
+"label.ipaddress1": "IP-Adresse",
+"label.ipaddress2": "IP-Adresse",
+"label.iplimit": "Öffentliche IP-Begrenzungen",
+"label.ips": "IPs",
+"label.ipsecpsk": "IPsec Preshared-Schlüssel",
+"label.iptotal": "Gesamtzahl der IP-Adressen",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Ziel-IQN",
+"label.is.in.progress": "ist in Bearbeitung",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Gemeinsam",
+"label.isadvanced": "Erweiterte Einstellungen anzeigen",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Benutzerdefinierte Festplattengrösse",
+"label.iscustomizeddiskiops": "Benutzerspezifische IOPS",
+"label.iscustomizediops": "Benutzerspezifische IOPS",
+"label.isdedicated": "Dediziert",
+"label.isdefault": "Ist vorgegeben",
+"label.isdynamicallyscalable": "Dynamisch skalierbar",
+"label.isextractable": "Extrahierbar",
+"label.isfeatured": "Empfohlen",
+"label.isforced": "Erzwinge Löschung",
+"label.ismanaged": "Verwaltet",
+"label.iso": "ISO",
+"label.iso.boot": "ISO-Boot",
+"label.iso.id": "ISO-ID",
+"label.iso.name": "ISO-Name",
+"label.isoid": "ISO",
+"label.isolated": "Isoliert",
+"label.isolated.networks": "Isolierte Netzwerke",
+"label.isolatedpvlanid": "Sekundäre isolierte VLAN ID",
+"label.isolatedpvlantype": "Sekundärer VLAN-Typ",
+"label.isolation.method": "Isolationsmethode",
+"label.isolation.mode": "Isolationsmodus",
+"label.isolationmethod": "Isolationsmethode",
+"label.isolationmethods": "Isolationsmethode",
+"label.isolationuri": "Isolations-URI",
+"label.isoname": "Angehängte ISO",
+"label.isos": "ISOs",
+"label.isostate": "ISO State",
+"label.ispasswordenabled": "Passwort aktiviert",
+"label.ispersistent": "Persistent",
+"label.isportable": "überschneidende Zonen",
+"label.ispublic": "Öffentlich",
+"label.isready": "Bereit",
+"label.isredundantrouter": "Redundanter Router",
+"label.isrouting": "Routing",
+"label.isself": "Selbst",
+"label.isshared": "Gemeinsame",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Statische NAT",
+"label.issystem": "Ist System",
+"label.isvolatile": "Vergänglich",
+"label.item.listing": "Eintragsauflistung",
+"label.items": "items",
+"label.japanese.keyboard": "Japanische Tastatur",
+"label.keep": "Behalten",
+"label.keep.colon": "Behalten:",
+"label.key": "Schlüssel",
+"label.keyboard": "Tastatursprache",
+"label.keyboardtype": "Tastaturtyp",
+"label.keypair": "SSH-Schlüsselpaar",
+"label.kubeconfig.cluster": "Kubernetes Cluster Config",
+"label.kubernetes": "Kubernetes",
+"label.kubernetes.cluster": "Kubernetes Cluster",
+"label.kubernetes.cluster.create": "Kubernetes Cluster erstellen",
+"label.kubernetes.cluster.delete": "Kubernetes Cluster löschen",
+"label.kubernetes.cluster.details": "Kubernetes Cluster Details",
+"label.kubernetes.cluster.scale": "Kubernetes Cluster skalieren",
+"label.kubernetes.cluster.start": "Kubernetes Cluster starten",
+"label.kubernetes.cluster.stop": "Kubernetes Cluster stoppen",
+"label.kubernetes.cluster.upgrade": "Kubernetes Cluster Upgraden",
+"label.kubernetes.dashboard": "Kubernetes Dashboard UI",
+"label.kubernetes.isos": "Kubernetes ISOs",
+"label.kubernetes.service": "Kubernetes Service",
+"label.kubernetes.version.add": "Kubernetes Version hinzufügen",
+"label.kubernetes.version.delete": "Kubernetes Version löschen",
+"label.kubernetes.version.details": "Kubernetes Version Details",
+"label.kubernetes.version.update": "Kubernetes Version Updaten",
+"label.kubernetesversionid": "Kubernetes Version",
+"label.kubernetesversionname": "Kubernetes Version",
+"label.kvmnetworklabel": "KVM Datenverkehrs-Bezeichnung",
+"label.l2": "L2",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "Letzte Aktualisierung",
+"label.lastannotated": "Letztes Datum einer Bemerkung",
+"label.lastname": "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.lb.cookie": "LbCookie",
+"label.lb.protocol.http": "HTTP",
+"label.lb.protocol.ssl": "SSL",
+"label.lb.protocol.tcp.proxy": "TCP-Proxy",
+"label.lbdevicededicated": "Dediziert",
+"label.lbdeviceid": "Identifikation",
+"label.lbdevicename": "Typ",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Lastverteilungstyp",
+"label.ldap.configuration": "LDAP-Konfiguration",
+"label.ldap.group.name": "LDAP-Gruppe",
+"label.ldap.port": "LDAP-Port",
+"label.level": "Ebene",
+"label.limit": "Limit",
+"label.limitcpuuse": "CPU Obergrenze",
+"label.limits": "Limits konfigurieren",
+"label.link.domain.to.ldap": "Verbinde Domain mit LDAP",
+"label.linklocalip": "Link-Local IP-Adresse",
+"label.linux": "Linux",
+"label.list.ciscoasa1000v": "ASA 1000v",
+"label.list.ciscovnmc": "Cisco VNMC",
+"label.list.nodes": "Knoten auflisten",
+"label.list.pods": "Pods auflisten",
+"label.list.services": "Liste Services auf",
+"label.load.balancer": "Serverlastverteilung",
+"label.load.balancing.policies": "Verteilungsrichtlinien laden",
+"label.loadbalancerinstance": "Zugewiesene VMs",
+"label.loadbalancerrule": "Lastverteilungsregel",
+"label.loadbalancing": "Lastverteilung",
+"label.loading": "Laden",
+"label.local": "Lokal",
+"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.localstorageenabled": "Ermögliche lokalen Speicher für Benutzer VMs",
+"label.localstorageenabledforsystemvm": "Aktiviere lokaler Speicher für die System-VMs",
+"label.login": "Login",
+"label.login.portal": "Portal Login",
+"label.logout": "Abmelden",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Datenverkehrs-Bezeichnung",
+"label.macaddress": "MAC Adresse",
+"label.macaddresschanges": "Änderung der MAC-Adresse",
+"label.macos": "MacOS",
+"label.make.project.owner": "Mache Benutzerkonto zum Projekteigentümer",
+"label.makeredundant": "Redundant machen",
+"label.manage": "Verwalten",
+"label.manage.resources": "Ressourcen verwalten",
+"label.manage.vpn.user": "VPN-Benutzer verwalten",
+"label.managedstate": "Managed State",
+"label.management": "Verwaltung",
+"label.management.ips": "Verwaltung IP-Adressen",
+"label.management.server": "Verwaltungsserver",
+"label.management.servers": "Management Server",
+"label.managementservers": "Anzahl der Management-Server",
+"label.masternodes": "Master-Knoten",
+"label.max.primary.storage": "Max. primärer (GiB)",
+"label.max.secondary.storage": "Max. sekundärer (GiB)",
+"label.maxcpu": "Max. CPU-Kerne",
+"label.maxcpunumber": "Max. CPU Kerne",
+"label.maxdatavolumeslimit": "Max. Datenvolumen Limit",
+"label.maxerrorretry": "Maximale Fehlerwiederholungen",
+"label.maxguestslimit": "Maximales Limit für Anzahl der Gäste",
+"label.maxhostspercluster": "Max. Hosts pro Cluster",
+"label.maximum": "Maximum",
+"label.maxinstance": "Max Instanzen",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. Speicher (MiB)",
+"label.maxnetwork": "Max. Netzwerke",
+"label.maxprimarystorage": "Max. Primäre Speicher (GiB)",
+"label.maxproject": "Max. Projekte",
+"label.maxpublicip": "Max. öffentliche IPs",
+"label.maxsecondarystorage": "Max. Sekundäre Speicher (GiB)",
+"label.maxsnapshot": "Max. Schnappschüsse",
+"label.maxtemplate": "Max. Vorlagen",
+"label.maxuservm": "Max. Benutzer-VMs",
+"label.maxvolume": "Max. Volumen",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "Sie können jetzt fortfahren",
+"label.mb.memory": "MB Speicher",
+"label.memallocated": "Speicher Belegung",
+"label.memory": "Speicher (in MB)",
+"label.memory.maximum.mb": "Max. Speicher (in MB)",
+"label.memory.total": "Speicher insgesamt",
+"label.memory.used": "Genutzter Speicher",
+"label.memoryallocated": "zugeordneter Speicher",
+"label.memoryallocatedgb": "Zugeteilt",
+"label.memorylimit": "Speicherbegrenzungen (MiB)",
+"label.memorymaxdeviation": "Abweichung",
+"label.memorytotal": "zugeordneter Speicher",
+"label.memorytotalgb": "Gesamt",
+"label.memoryused": "Genutzter Speicher",
+"label.memoryusedgb": "Gebraucht",
+"label.memused": "Genutzter Speicher",
+"label.menu.all.accounts": "Alle Konten",
+"label.menu.all.instances": "Alle Instanzen",
+"label.menu.backup": "Backup",
+"label.menu.backup.offerings": "Backup-Angebote",
+"label.menu.community.isos": "Gemeinschaft ISOs",
+"label.menu.community.templates": "Gemeinschaft Vorlagen",
+"label.menu.destroyed.instances": "Zerstörte Instanzen",
+"label.menu.featured.isos": "Empfohlene ISOs",
+"label.menu.featured.templates": "Empfohlene Vorlagen",
+"label.menu.ipaddresses": "IP-Adressen",
+"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.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.sshkeypair": "SSH-Schlüsselpaar",
+"label.menu.stopped.instances": "Beendete Instanzen",
+"label.menu.storage": "Speicher",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtuelle Appliances",
+"label.menu.virtual.resources": "Virtuelle Ressourcen",
+"label.metrics": "Metriken",
+"label.metrics.cpu.allocated": "CPU Zuteilung",
+"label.metrics.cpu.usage": "CPU Benutzung",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Lesen",
+"label.metrics.disk.usage": "Festplattennutzung",
+"label.metrics.disk.write": "Schreiben",
+"label.metrics.memory.usage": "Speichernutzung",
+"label.metrics.network.read": "Lesen",
+"label.metrics.network.usage": "Netzwerk Nutzung",
+"label.metrics.network.write": "Schreiben",
+"label.metrics.num.cpu.cores": "Cores",
+"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.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": "Migriere ein Speichervolumen zu einem anderen Hauptspeicher",
+"label.migrating": "Migriere",
+"label.min.balance": "Min Abrechnung",
+"label.min.past.hour": "min seit Std. vergangen",
+"label.min_balance": "Min. Balance",
+"label.mincpunumber": "Min. CPU Kerne",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instanzen",
+"label.miniops": "Min IOPS",
+"label.minmaxiops": "Min. IOPS / Max IOPS",
+"label.minmemory": "Min. Speicher (in MB)",
+"label.minute.past.hour": "Minute(n) seit der Stunde vergangen",
+"label.minutes.past.hour": "Minute(n) seit der Stunde vergangen",
+"label.monday": "Montag",
+"label.monitor": "Überwachung",
+"label.monthly": "Monatlich",
+"label.more.access.dashboard.ui": "Mehr über den Zugang zum Dashboard UI",
+"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.optional": "Name (Optional)",
+"label.nat": "BigSwitch BCF NAT aktiviert",
+"label.nat.port.range": "NAT-Portbereich",
+"label.ncc": "NCC",
+"label.ncc.delete": "NCC löschen",
+"label.ncc.details": "NCC Details",
+"label.netmask": "Netzmaske",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler-Details",
+"label.netscaler.mpx": "NetScaler MPX LoadBalancer",
+"label.netscaler.sdx": "NetScaler SDX LoadBalancer",
+"label.netscaler.vpx": "NetScaler VPX LoadBalancer",
+"label.network": "Netzwerk",
+"label.network.acl": "Netzwerk-ACL",
+"label.network.acl.lists": "Netzwerk ACL Listen",
+"label.network.acls": "Netzwerk-ACLs",
+"label.network.addvm": "Netzwerk zur VM hinzufügen",
+"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.label.display.for.blank.value": "Standard-Gateway verwenden",
+"label.network.name": "Netzwerk Name",
+"label.network.offering": "Netzwerkangebot",
+"label.network.offering.access": "Angebote für den Netzwerkzugang",
+"label.network.offering.details": "Netzwerkangebotdetails",
+"label.network.offering.display.text": "Netzwerkangebot-Anzeigetext",
+"label.network.offering.name": "Netzwerkangebotsname",
+"label.network.offerings": "Netzwerkangebote",
+"label.network.service.providers": "Netzwerkdienstanbieter",
+"label.networkcidr": "Netzwerk-CIDR",
+"label.networkdevicetype": "Typ",
+"label.networkdomain": "Netzwerk-Domain",
+"label.networkdomaintext": "Netzwerk-Domain",
+"label.networkid": "Netzwerk",
+"label.networking.and.security": "Netzwerkbetrieb und Sicherheit",
+"label.networkkbsread": "Netzwerk Lesen",
+"label.networkkbswrite": "Netzwerk Schreiben",
+"label.networklimit": "Netzwerkbegrenzungen",
+"label.networkname": "Netzwerk Name",
+"label.networkofferingdisplaytext": "Netzwerkangebot",
+"label.networkofferingid": "Netzwerkangebot",
+"label.networkofferingidtext": "Netzwerkangebotskennung",
+"label.networkofferingname": "Netzwerkangebot",
+"label.networkrate": "Netzwerk-Rate",
+"label.networkread": "Netzwerk Lesen",
+"label.networks": "Netzwerke",
+"label.networktype": "Netzwerk-Typ",
+"label.networkwrite": "Netzwerk Schreiben",
+"label.new": "Neu",
+"label.new.instance.group": "Neue Instanzgruppe",
+"label.new.password": "Neues Passwort",
+"label.new.project": "Neues Projekt",
+"label.new.secondaryip.description": "Neue sekundäre IP-Adresse",
+"label.new.tag": "Neuer Tag",
+"label.new.vm": "Neue VM",
+"label.newdiskoffering": "Neues Angebot",
+"label.newinstance": "Neue Instanz",
+"label.newname": "Neuer Name",
+"label.newsize": "Neue Größe (GB)",
+"label.next": "Weiter",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS-Speicher",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Pfad",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "NIC-Adaptertyp",
+"label.nicira.controller.address": "Controller-Adresse",
+"label.nicira.nvp.details": "Nicira NVP-Details",
+"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.noderootdisksize": "Knoten ROOT Festplattengröße (in GB)",
+"label.nodiskcache": "Kein Festplatten-Cache",
+"label.none": "Kein",
+"label.noselect": "Nein, danke",
+"label.not.found": "Nicht gefunden",
+"label.not.suitable": "Ungeeignet",
+"label.notifications": "Benachrichtigungen",
+"label.num.cpu.cores": "Anzahl an CPU-Kernen",
+"label.number": "#Regel",
+"label.number.of.clusters": "Anzahl der Cluster",
+"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.numberofrouterrequiresupgrade": "Total an virtuellen Routern, welche ein Softwareupgrade benötigen",
+"label.numretries": "Anzahl von Wiederholungen",
+"label.nvpdeviceid": "Identifikation",
+"label.ocfs2": "OCFS2",
+"label.of.month": "des Monats",
+"label.offerha": "HA anbieten",
+"label.offeringtype": "Berechne Angebotstyp",
+"label.ok": "OK",
+"label.open.documentation": "Dokumentation öffnen",
+"label.open.url": "URL im Browser öffnen",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight Controller",
+"label.opendaylight.controllerdetail": "OpenDayight Controller Details",
+"label.opendaylight.controllers": "OpenDaylight Controller",
+"label.operation": "Operation",
+"label.optional": "optional",
+"label.order": "Reihenfolge",
+"label.oscategoryid": "OS Präferenz",
+"label.ostypeid": "OS Typ",
+"label.ostypename": "OS Typ",
+"label.other": "Andere",
+"label.outofbandmanagement": "Out-of-band Verwaltung",
+"label.outofbandmanagement.action.issue": "Eine Out-of-band Verwaltungs-Strom Aktion durchführen",
+"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.enable": "Out-of-band Verwaltung aktivieren",
+"label.overprovisionfactor": "Überprovisionierungsfaktor",
+"label.override.guest.traffic": "Gast-Datenverkehr überschreiben",
+"label.override.public.traffic": "Öffentlichen Datenverkehr überschreiben",
+"label.override.rootdisk.size": "ROOT Festplattengröße überschreiben",
+"label.overrideguesttraffic": "Gast-Datenverkehr überschreiben",
+"label.overridepublictraffic": "Öffentlichen Datenverkehr überschreiben",
+"label.ovf.properties": "OVF Eigenschaften",
+"label.ovm3cluster": "Natives Clustering",
+"label.ovm3networklabel": "OVM3 Datenverkehrs-Bezeichnung",
+"label.ovm3pool": "Natives Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM Datenverkehrs-Bezeichnung",
+"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.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto-Details",
+"label.palo.alto.firewall": "Palo Alto Firewall",
+"label.palp": "Palo Alto-Protokollprofil",
+"label.params": "Parameter",
+"label.parent.domain": "Übergeordnete Domäne",
+"label.parentdomainname": "Elterndomain",
+"label.parentname": "Übergeordnet",
+"label.passive": "Passiv",
+"label.password": "Passwort",
+"label.password.reset.confirm": "Passwort wurde zurückgesetzt auf",
+"label.passwordenabled": "Passwort aktiviert",
+"label.path": "Pfad",
+"label.patp": "Palo Alto Threat Profil",
+"label.pavr": "Virtueller Router",
+"label.payload": "Nutzlast",
+"label.pcidevice": "GPU",
+"label.per.account": "Pro Account",
+"label.per.zone": "Pro Zone",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.perform.fresh.checks": "Neue Überprüfung durchführen",
+"label.performfreshchecks": "Neue Überprüfung durchführen",
+"label.permission": "Berechtigung",
+"label.permissions": "Berechtigungen",
+"label.physical.network": "Physikalisches Netzwerk",
+"label.physical.network.id": "Physikalisches Netzwerkkennung",
+"label.physical.network.name": "Name des physischen Netzwerks",
+"label.physicalnetworkid": "Physikalisches Netzwerk",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS Passwort",
+"label.ping.cifs.username": "PING CIFS Benutzername",
+"label.ping.dir": "PING-Verzeichnis",
+"label.ping.path": "Ping-Pfad",
+"label.ping.storage.ip": "IP des externen Speichers anpingen",
+"label.pkcs.private.certificate": "PKCS#8 privates Zertifikat",
+"label.plannermode": "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.podid": "Pod",
+"label.podname": "Podname",
+"label.pods": "Pod",
+"label.port": "Port",
+"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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Portweiterleitung",
+"label.powerstate": "Betriebszustand",
+"label.preferred": "Bervorzugt",
+"label.presetup": "Voreinstellung",
+"label.prev": "Vor",
+"label.previous": "Vorherige",
+"label.primary": "Primär",
+"label.primary.network": "Hauptnetzwerk",
+"label.primary.storage": "Hauptspeicher",
+"label.primary.storage.allocated": "Zugewiesener Hauptspeicher",
+"label.primary.storage.count": "Hauptspeicher-Pools",
+"label.primary.storage.used": "Genutzter Hauptspeicher",
+"label.primarystoragelimit": "Hauptspeicher-Limits (GiB)",
+"label.primarystoragetotal": "Hauptspeicher",
+"label.private.gateway": "Privater Gateway",
+"label.private.interface": "Privates Interface",
+"label.private.ip.range": "Privater IP-Bereich",
+"label.private.ips": "Private IP-Adressen",
+"label.private.registry": "Private Registrierung",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Privates Interface",
+"label.privateip": "Private IP-Adresse",
+"label.privatekey": "PKCS#8 Privater Schlüssel",
+"label.privatekey.password": "Passwort des privaten Schlüssels",
+"label.privatenetwork": "Privates Netzwerk",
+"label.privateport": "Privater Port",
+"label.profiledn": "Zugehöriges Profil",
+"label.profilename": "Profil",
+"label.project": "Projekt",
+"label.project.dashboard": "Projektübersichtsseite",
+"label.project.ids": "Projekt-IDs",
+"label.project.invitation": "Projekteinladungen",
+"label.project.invite": "Zum Projekt einladen",
+"label.project.name": "Projektname",
+"label.project.view": "Projektansicht",
+"label.projectaccountname": "Projekt Account Name",
+"label.projectid": "Projektkennung",
+"label.projectlimit": "Projekt-Limits",
+"label.projects": "Projekte",
+"label.promiscuousmode": "Gemischter Modus",
+"label.property": "Eigentum",
+"label.protocol": "Protokoll",
+"label.protocol.number": "Protokollnummer",
+"label.protocolnumber": "#Protokoll",
+"label.provider": "Anbieter",
+"label.providername": "Anbieter",
+"label.providers": "Anbieter",
+"label.provisioning": "Provisionierung",
+"label.provisioningtype": "Provisionierungstyp",
+"label.provisioningtype.fat": "Provisionierungstyp FAT",
+"label.provisioningtype.sparse": "Provisionierungstyp Sparse",
+"label.provisioningtype.thin": "Provisionierungstyp Thin",
+"label.public.interface": "Öffentliches Interface",
+"label.public.ip": "Öffentliche IP-Adresse",
+"label.public.ip.addresses": "Öffentliche IP-Adressen",
+"label.public.ips": "Öffentliche IP-Adressen",
+"label.public.lb": "Öffentliche LB",
+"label.public.load.balancer.provider": "Öffentlicher Lastverteileranbieter",
+"label.public.network": "Öffentliches Netzwerk",
+"label.public.traffic": "Öffentlicher Datenverkehr",
+"label.public.zone": "Öffentliche Zone",
+"label.publicinterface": "Öffentliches Interface",
+"label.publicip": "IP-Adresse",
+"label.publickey": "Öffentlicher Schlüssel",
+"label.publicnetwork": "Öffentliches Netzwerk",
+"label.publicport": "Öffentlicher Port",
+"label.purpose": "Zweck",
+"label.pxe.server.type": "PXE Server Type",
+"label.qostype": "QoS-Typ",
+"label.quickview": "Schnellansicht",
+"label.quiescevm": "VM stilllegen",
+"label.quiettime": "Ruhezeit (in Sekunden)",
+"label.quota": "Wert der Quota",
+"label.quota.add.credits": "Guthaben hinzufügen",
+"label.quota.configuration": "Konfiguration der Quota",
+"label.quota.configure": "Konfiguriere eine Quota",
+"label.quota.credits": "Guthaben",
+"label.quota.dates": "Aktualisierung der Daten",
+"label.quota.description": "Beschreibung der Quota",
+"label.quota.email.edit": "E-Mail Template editieren",
+"label.quota.enddate": "Enddatum",
+"label.quota.endquota": "Quota Ende",
+"label.quota.enforce": "Erzwinge eine Quota",
+"label.quota.fullsummary": "Alle Konten",
+"label.quota.remove": "Eine Quota löschen",
+"label.quota.startdate": "Startdatum",
+"label.quota.startquota": "Start Quota",
+"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.tariff": "Tarif",
+"label.quota.tariff.edit": "Tarif bearbeiten",
+"label.quota.tariff.effectivedate": "Anwendungsdatum",
+"label.quota.total": "Gesamtnutzung",
+"label.quota.totalusage": "Gesamte Nutzung",
+"label.quota.type.name": "Nutzungstyp",
+"label.quota.type.unit": "Nutzungseinheit",
+"label.quota.usage": "Verbrauch der Quota",
+"label.quota.value": "Wert der Quota",
+"label.quota_enforce": "Quota erzwingen",
+"label.rados.monitor": "RADOS Überwachung",
+"label.rados.pool": "RADOS Pool",
+"label.rados.secret": "RADOS Passwort",
+"label.rados.user": "RADOS Benutzer",
+"label.ram": "RAM",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx-Benutzer",
+"label.rbdmonitor": "Ceph-Überwachung",
+"label.rbdpool": "Ceph-Pool",
+"label.rbdsecret": "Cephx-Geheimnis",
+"label.read": "Lesen",
+"label.read.io": "Lesen (IO)",
+"label.reason": "Reason",
+"label.reboot": "Neustart",
+"label.receivedbytes": "Empfangene Bytes",
+"label.recent.errors": "Aktuelle Fehler",
+"label.recover.vm": "VM wiederherstellen",
+"label.redundantrouter": "Redundanter Router",
+"label.redundantrouterstate": "Redundanter Status",
+"label.redundantstate": "Redundanter Status",
+"label.redundantvpcrouter": "Redundante VPC",
+"label.reenterpassword": "Passwort erneut eingeben",
+"label.refresh": "Aktualisieren",
+"label.refresh.blades": "Blades aktualisieren",
+"label.region": "Region",
+"label.region.details": "Regiondetails",
+"label.register.template": "Template registrieren",
+"label.reinstall.vm": "VM neu installieren",
+"label.reject": "Ablehnen",
+"label.related": "Verwandt",
+"label.relationaloperator": "Betreiber",
+"label.release.account": "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.releasing.ip": "Freigeben der IP-Adresse",
+"label.remind.later": "Später erinnern",
+"label.remove": "Entfernen",
+"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.management.ip.range": "Management IP-Adressbereich 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.replace.acl": "ACL ersetzen",
+"label.replace.acl.list": "ACL-Liste ersetzen",
+"label.report.bug": "Fehler melden",
+"label.required": "Erforderlich",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Erfordert Aktualisierung",
+"label.reserved.system.gateway": "Reservierter System-Gateway",
+"label.reserved.system.ip": "Reservierte System-IP",
+"label.reserved.system.netmask": "Reservierte System-Netzmaske",
+"label.reservediprange": "Reservierter IP-Bereich",
+"label.reservedsystemendip": "Reservierte System-End-IP",
+"label.reservedsystemgateway": "Reservierter System-Gateway",
+"label.reservedsystemnetmask": "Reservierte System-Netzmaske",
+"label.reservedsystemstartip": "Reservierte System-IP starten",
+"label.reset": "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.reset.vpn.connection": "VPN-Verbindung zurücksetzen",
+"label.resetvm": "VM zurücksetzen",
+"label.resource": "Ressource",
+"label.resource.limit.exceeded": "Ressourcenbegrenzung erreicht",
+"label.resource.limits": "Ressourcenbegrenzungen",
+"label.resource.name": "Ressourcenname",
+"label.resourceid": "Ressourcenkennung",
+"label.resourcename": "Ressourcenname",
+"label.resources": "Ressourcen",
+"label.resourcestate": "Ressourcenstatus",
+"label.response.timeout.in.sec": "Zeitüberschreitung der Antworkt (in Sek.)",
+"label.restart.network": "Netzwerk neu starten",
+"label.restart.vpc": "VPC neu starten",
+"label.restartrequired": "Neustart erforderlich",
+"label.restore": "Wiederherstellen",
+"label.restore.volume.attach": "Volume wiederherstellen und anhängen",
+"label.retry.interval": "Wiederversuchs-Interval",
+"label.review": "Nachprüfung",
+"label.revoke.project.invite": "Einladung widerrufen",
+"label.revokeinvitationconfirm": "Bitte bestätigen Sie, dass Sie die Einladung widerrufen wollen",
+"label.role": "Rolle",
+"label.rolename": "Rolle",
+"label.roles": "Rollen",
+"label.roletype": "Rollentyp",
+"label.root.certificate": "Root-Zertifikat",
+"label.root.disk.offering": "Root-Festplattenangebot",
+"label.root.disk.size": "Root-Festplattengröße",
+"label.rootdiskcontrollertype": "Root-Festplatten-Controller",
+"label.rootdiskcontrollertypekvm": "Root-Festplatten-Controller",
+"label.router.health.check.last.updated": "Zuletzt aktualisiert",
+"label.router.health.check.name": "Namen prüfen",
+"label.router.health.check.success": "Erfolg",
+"label.router.health.checks": "Gesundheitsüberprüfungen",
+"label.router.vm.scaled.up": "Router VM hochskaliert",
+"label.routercount": "Total an virtuellen Routern",
+"label.routerrequiresupgrade": "Aktualisierung ist erforderlich",
+"label.routertype": "Typ",
+"label.routing.host": "Routing Host",
+"label.rule": "Regel",
+"label.rule.number": "Regelnummer",
+"label.rules": "Regeln",
+"label.rules.file": "Datei mit Regeln",
+"label.rules.file.import.description": "Klicken oder ziehen Sie die CSV-Datei mit den Regeln, um diese zu importieren",
+"label.run.proxy.locally": "Proxy lokal ausführen",
+"label.running": "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.disable": "SAML deaktivieren",
+"label.saml.enable": "SAML aktivieren",
+"label.samlenable": "Autorisiere SAML SSO",
+"label.samlentity": "Identitätsanbieter",
+"label.saturday": "Samstag",
+"label.save": "Sichern",
+"label.save.and.continue": "Speichern und fortsetzen",
+"label.save.changes": "Änderungen speichern",
+"label.save.new.rule": "Neue Regel Speichern",
+"label.saving.processing": "Speichern....",
+"label.scale.up.policy": "HOCHSKALIERUNGSRICHTLINIE",
+"label.scaledown.policy": "Herunterskalierungs-Richtlinie",
+"label.scaleup.policy": "Hochskalierungs-Richtlinie",
+"label.schedule": "Zeitplan",
+"label.scheduled.backups": "geplante Backups",
+"label.scheduled.snapshots": "geplante Schnappschüsse",
+"label.scope": "Geltungsbereich",
+"label.search": "Suche",
+"label.secondary.isolated.vlan.type.isolated": "Isoliert",
+"label.secondary.isolated.vlan.type.promiscuous": "Gemischt",
+"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.vm": "Sekundärspeicher-VM",
+"label.secondary.used": "Genutzter Sekundärspeicher",
+"label.secondaryips": "Sekundäre IPs",
+"label.secondarystoragelimit": "Sekundärspeicherbegrenzungen (GiB)",
+"label.secretkey": "Secret Key",
+"label.secured": "Gesichert",
+"label.security.group.name": "Sicherheitsgruppen-Name",
+"label.security.groups": "Sicherheitsgruppen",
+"label.security.groups.enabled": "Sicherheitsgruppe aktiviert",
+"label.securitygroup": "Sicherheitsgruppe",
+"label.securitygroupenabled": "Sicherheitsgruppen aktiviert",
+"label.securitygroups": "Sicherheitsgruppen",
+"label.securitygroupsenabled": "Sicherheitsgruppen aktiviert",
+"label.select": "Auswählen",
+"label.select-view": "Ansicht auswählen",
+"label.select.a.zone": "Zone auswählen",
+"label.select.deployment.infrastructure": "Deployment-Infrastruktur auswählen",
+"label.select.host": "Host 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.projects": "Projekt auswählen",
+"label.select.region": "Region auswählen",
+"label.select.tier": "Ebene auswählen",
+"label.select.vm.for.static.nat": "VM für statisches NAT auswählen",
+"label.select.zones": "Zonen auswählen",
+"label.self": "Meine",
+"label.selfexecutable": "Selbst",
+"label.semanticversion": "Semantische Version",
+"label.sent": "Versendet",
+"label.sentbytes": "Gesendete Bytes",
+"label.server": "Server",
+"label.server.certificate": "Serverzertifikat",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Verteilter Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastischer LB",
+"label.service.lb.inlinemodedropdown": "Modus",
+"label.service.lb.lbisolationdropdown": "LB-Isolation",
+"label.service.lb.netscaler.servicepackages": "Netscaler Service Pakete",
+"label.service.lb.netscaler.servicepackages.description": "Service-Paketbeschreibung",
+"label.service.offering": "Dienstangebot",
+"label.service.offering.details": "Dienstangebotdetails",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundanter Router Kapazität",
+"label.service.state": "Dienststatus",
+"label.service.staticnat.associatepublicip": "Öffentliche IP assoziieren",
+"label.service.staticnat.elasticipcheckbox": "Elastische IP Adresse",
+"label.servicecapabilities": "Dienstfähigkeiten",
+"label.servicelist": "Dienste",
+"label.serviceofferingid": "Berechnungsangebot",
+"label.serviceofferingname": "Berechnungsangebot",
+"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.setting": "Einstellung",
+"label.settings": "Einstellungen",
+"label.setup": "Konfiguration",
+"label.setup.network": "Netzwerk einrichten",
+"label.setup.zone": "Zone einrichten",
+"label.shared": "Gemeinsame",
+"label.sharedexecutable": "Gemeinsame",
+"label.sharedmountpoint": "Geteilter Einhängepunkt",
+"label.sharewith": "Teilen mit",
+"label.show.ingress.rule": "Zeige Regeln, die den Zutritt steuern",
+"label.showing": "Zeigen",
+"label.shrinkok": "Verkleinern OK",
+"label.shutdown.provider": "Herunterfahrungs-Anbieter",
+"label.simplified.chinese.keyboard": "Vereinfachte Chinesische Tastatur",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.site.to.site.vpn.connections": "Site-to-site VPN-Verbindungen",
+"label.size": "Größe",
+"label.sizegb": "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.smbdomain": "SMB-Domäne",
+"label.smbpassword": "SMB-Passwort",
+"label.smbusername": "SMB-Benutzername",
+"label.snapshot": "Schnappschuss",
+"label.snapshot.name": "Schnappschuss Name",
+"label.snapshot.schedule": "Wiederkehrende Schnappschüsse einrichten",
+"label.snapshotlimit": "Schnappschuss Grenzen",
+"label.snapshotmemory": "Schnappschussspeicher",
+"label.snapshots": "Schnappschüsse",
+"label.snmpcommunity": "SNMP Gemeinschaft",
+"label.snmpport": "SNMP-Port",
+"label.sockettimeout": "Socket-Zeitüberschreitung",
+"label.source.based": "Quellbasiert",
+"label.source.nat.supported": "SourceNAT unterstützt",
+"label.sourcecidr": "Quelle CIDR",
+"label.sourceipaddress": "Quell IP-Adresse",
+"label.sourcenat": "Source NAT",
+"label.sourcenatsupported": "Quell NAT unterstützt",
+"label.sourcenattype": "Unterstützter Source-NAT-Typ",
+"label.sourceport": "Port der Quelle",
+"label.specify.vxlan": "VXLAN angeben",
+"label.specifyipranges": "IP-Bereiche angeben",
+"label.specifyvlan": "VLAN angeben",
+"label.sr.name": "SR Name-Bezeichnung",
+"label.srx": "SRX",
+"label.srx.details": "SRX-Details",
+"label.srx.firewall": "Juniper SRX Firewall",
+"label.ssh.key.pair.details": "SSH-Schlüsselpaardetails",
+"label.ssh.key.pairs": "SSH-Schlüsselpaare",
+"label.sshkeypair": "Neues SSH-Schlüsselpaar",
+"label.sshkeypairs": "SSH Schlüsselpaare",
+"label.sslcertificates": "SSL Zertifikate",
+"label.standard.us.keyboard": "Standard-(US)-Tastatur",
+"label.start": "Start",
+"label.start.ip": "Start-IP",
+"label.start.lb.vm": "LB-VM starten",
+"label.start.reserved.system.ip": "Reservierte System-IP starten",
+"label.start.rolling.maintenance": "Starte rollierende Wartung",
+"label.start.rolling.maintenance.payload": "Nutzlast",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "VXLAN starten",
+"label.startdate": "Nach Datum (Start)",
+"label.startip": "Start-IP",
+"label.startipv4": "IPv4 Start-IP",
+"label.startipv6": "IPv6 Start-IP",
+"label.startport": "Startport",
+"label.startquota": "Wert der Quota",
+"label.state": "Status",
+"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.method": "Stickness-Methode",
+"label.sticky.cookie-name": "Cookiename",
+"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": "Gestoppte VMs",
+"label.storage": "Speicher",
+"label.storage.tags": "Datenspeicher-Markierung",
+"label.storage.traffic": "Datenspeicherverkehr",
+"label.storageid": "Hauptspeicher",
+"label.storagemotionenabled": "Speicherbewegung aktiviert",
+"label.storagepolicy": "Speicherkonzept",
+"label.storagepool": "Speicher-Pool",
+"label.storagetags": "Datenspeicher-Markierung",
+"label.storagetype": "Speichertyp",
+"label.strict": "Streng",
+"label.subdomainaccess": "Subdomain-Zugriff",
+"label.submit": "Absenden",
+"label.submitted.by": "[Eingereicht von: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Erfolgreich",
+"label.success": "Erfolg",
+"label.success.set": "Erfolgreich gesetzt",
+"label.success.updated": "Erfolgreich aktualisiert",
+"label.suitability": "Eignung",
+"label.suitable": "Geeignet",
+"label.summary": "Summe",
+"label.sunday": "Sonntag",
+"label.supportedservices": "Unterstützte Dienste",
+"label.supportsha": "Unterstütztes HA",
+"label.supportspublicaccess": "Unterstützt öffentlichen Zugriff",
+"label.supportsregionlevelvpc": "Unterstützt Region Level VPC",
+"label.supportsstrechedl2subnet": "Untersützt Streched L2 Subnet",
+"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.offerings": "Systemangebote",
+"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.vms": "System-VMs",
+"label.system.wide.capacity": "Systemweite Kapazität",
+"label.systemvmtype": "System-VM-Typ",
+"label.tag.key": "Schlagwortschlüssel",
+"label.tag.value": "Schlagwortwert",
+"label.tagged": "Markiert",
+"label.tags": "Markierungen",
+"label.target.iqn": "Ziel-IQN",
+"label.tariffactions": "Aktionen",
+"label.tariffvalue": "Tarif Wert",
+"label.task.completed": "Aufgabe fertiggestellt",
+"label.tcp": "TCP",
+"label.tcp.proxy": "TCP Proxy",
+"label.template": "Vorlage",
+"label.templatebody": "Körper",
+"label.templatedn": "Vorlage auswählen",
+"label.templatefileupload": "Lokale Datei",
+"label.templateid": "Template auswählen",
+"label.templateiso": "Template/ISO",
+"label.templatelimit": "Vorlagenbegrenzungen",
+"label.templatename": "Vorlage",
+"label.templatenames": "Vorlage",
+"label.templates": "Vorlagen",
+"label.templatesubject": "Thema",
+"label.templatetotal": "Vorlage",
+"label.templatetype": "Email Vorlage",
+"label.tftp.dir": "TFTP-Verzeichnis",
+"label.tftpdir": "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.details": "Ebenendetails",
+"label.tiername": "Ebene",
+"label.time": "Zeit",
+"label.time.colon": "Zeit:",
+"label.timeout": "Zeitüberschreitung",
+"label.timeout.in.second ": " Zeitüberschreitung (Sekunden)",
+"label.timezone": "Zeitzone",
+"label.timezone.colon": "Zeitzone:",
+"label.to": "zu",
+"label.token": "Token",
+"label.token.for.dashboard.login": "Der Token für die Dashboard-Anmeldung kann durch folgendes Kommando erhalten werden",
+"label.total": "Gesamt",
+"label.total.hosts": "Gesamtanzahl Hosts",
+"label.total.memory": "Gesamter Speicher",
+"label.total.storage": "Gesamter Speicher",
+"label.total.vms": "Gesamtanzahl VMs",
+"label.totalcpu": "Gesamtanzahl CPU",
+"label.traffic.label": "Datenverkehrsbezeichnung",
+"label.traffic.types": "Datenverkehrstypen",
+"label.traffictype": "Datenverkehrstyp",
+"label.transportzoneuuid": "Transportzone Uuid",
+"label.tuesday": "Dienstag",
+"label.type": "Typ",
+"label.type.id": "Typenkennung",
+"label.ucs": "UCS",
+"label.udp": "UDP",
+"label.uk.keyboard": "UK-Tastatur",
+"label.unavailable": "Nicht verfügbar",
+"label.unhealthy.threshold": "Schwellwert ungesund",
+"label.unique.name.tier": "Ein eindeutiger Name des Netzwerks",
+"label.unit": "Verbrauch der Einheit",
+"label.unknown": "Unbekannt",
+"label.unlimited": "Unbegrenzt",
+"label.untagged": "Unmarkiert",
+"label.update.instance.group": "Update der Instanzgruppe",
+"label.update.project.resources": "Projektressourcen aktualisieren",
+"label.update.ssl": " SSL-Zertifikat",
+"label.update.ssl.cert": " SSL-Zertifikat",
+"label.update.to": "aktualisiert auf",
+"label.update.vmware.datacenter": "VMware-Datacenter aktualisieren",
+"label.updating": "Aktualisierungsvorgang",
+"label.upgrade.router.newer.template": "Router upgraden um neuere Vorlage zu verwenden",
+"label.upload": "Hochladen",
+"label.upload.from.local": "Von lokal hochladen",
+"label.upload.iso.from.local": "Hochladen der ISO von lokal",
+"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.sanity.result": "Usage Sanity Resultat",
+"label.usage.server": "Auslastungsserver",
+"label.usageinterface": "Auslastungsoberfläche",
+"label.usagename": "Art der Auslastung",
+"label.usageunit": "Einheit",
+"label.use.kubectl.access.cluster": "Benutze das <code>kubectl</code> Kommando und die <code>kubeconfig</code> Datei, um das Cluster zu erreichen.",
+"label.use.vm.ip": "VM-IP verwenden:",
+"label.use.vm.ips": "VM-IPs verwenden",
+"label.used": "Genutzt",
+"label.usehttps": "HTTPS verwenden",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Benutzer",
+"label.user.conflict": "Konflikt",
+"label.user.details": "Benutzerdetails",
+"label.user.source": "Quelle",
+"label.user.vm": "Benutzer-VM",
+"label.userdata": "Benutzerdaten",
+"label.userdatal2": "Benutzerdaten",
+"label.username": "Benutzername",
+"label.users": "Benutzer",
+"label.usersource": "Benutzertyp",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "Identifikation",
+"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.vcenterdatacenter": "vCenter-Rechenzentrum",
+"label.vcenterdatastore": "vCenter-Datenspeicher",
+"label.esx.host": "ESX / ESXi-Host",
+"label.vcenterpassword": "vCenter-Passwort",
+"label.vcenterusername": "vCenter-Benutzername",
+"label.vcipaddress": "vCenter-IP-Adresse",
+"label.vcsdeviceid": "Identifikation",
+"label.version": "Version",
+"label.versions": "Versionen",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU-Typ",
+"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.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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM-Kennung",
+"label.virtualmachinename": "VM-Name",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI-Bereich",
+"label.vlan.range.details": "VLAN-Bereichdetails",
+"label.vlan.vni.ranges": "VLAN/VNI-Bereich(e)",
+"label.vlanid": "VLAN/VNI-Kennung",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI-Bereich",
+"label.vm": "VM",
+"label.vm.add": "Instanz hinzufügen",
+"label.vm.destroy": "Zerstören",
+"label.vm.password": "Passwort der VM ist",
+"label.vm.reboot": "Neustart",
+"label.vm.snapshots": "VM-Schnappschüsse",
+"label.vm.start": "Start",
+"label.vm.stop": "Stopp",
+"label.vmdisplayname": "VM-Anzeigename",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS-Datenspeicher",
+"label.vmipaddress": "VM-IP-Adresse",
+"label.vmlimit": "Instanz-Limiten",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "VMs in Ebene",
+"label.vmstate": "VM-Status",
+"label.vmtotal": "Gesamtanzahl VMs",
+"label.vmwaredcid": "VMware-Rechenzentrumskennung",
+"label.vmwaredcname": "VMware-Rechenzentrumsname",
+"label.vmwaredcvcenter": "VMware Rechenzentrum-vCenter",
+"label.vmwarenetworklabel": "VMware Datenverkehrs-Bezeichnung",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC-Geräte",
+"label.volgroup": "Volumengruppe",
+"label.volume": "Volume",
+"label.volume.details": "Volumendetails",
+"label.volume.empty": "Dieser VM sind keine Datenträger zugewiesen",
+"label.volume.ids": "Speicher-IDs",
+"label.volume.migrated": "Volumen migriert",
+"label.volume.volumefileupload.description": "Klicken oder ziehen Sie die Datei in diesen Bereich, um diese hochzuladen",
+"label.volumechecksum": "MD5-Prüfsumme",
+"label.volumechecksum.description": "Nutzen Sie den Hash, den Sie am Beginn des Datenträger-Uploads erstellt haben",
+"label.volumefileupload": "Lokale Datei",
+"label.volumegroup": "Volumengruppe",
+"label.volumeids": "Datenträger, die gelöscht werden sollen",
+"label.volumelimit": "Volumenbegrenzungen",
+"label.volumename": "Volumenname",
+"label.volumes": "Volumina",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC-Kennung",
+"label.vpc.offering.access": "VPC-Zugangsangebot",
+"label.vpc.offering.details": "VPC-Angebotdetails",
+"label.vpc.offerings": "VPC-Angebote",
+"label.vpc.router.details": "VPC-Routerdetails",
+"label.vpc.virtual.router": "VPC Virtueller Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC-Begrenzungen",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC-Angebot",
+"label.vpcofferingid": "VPC-Angebot",
+"label.vpctotal": "Gesamte VPCs",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN-Verbindung",
+"label.vpn.gateway": "VPN-Gateway",
+"label.vpn.users": "VPN-Benutzer",
+"label.vpncustomergateway": "IP-Adresse des entfernten Gateways",
+"label.vpncustomergateway.cidrlist": "Komma-separierte Gast CIDR Liste der entfernten Subnetze",
+"label.vpncustomergateway.esplifetime": "Die phase-2 Lifetime in Sekunden",
+"label.vpncustomergateway.ikelifetime": "Die phase-1 Lifetime in Sekunden",
+"label.vpncustomergateway.secretkey": "Geben Sie den Geheimschlüssel ein",
+"label.vpncustomergatewayid": "VPN Customer Gateway",
+"label.vpncustomergatewayname": "Eindeutiger Name für das VPN Customer Gateway",
+"label.vsmctrlvlanid": "Steuerungs-VLAN-Kennung",
+"label.vsmdeviceid": "Name",
+"label.vsmdevicestate": "Status",
+"label.vsmipaddress": "Nexus 1000v-IP-Adresse",
+"label.vsmpassword": "Nexus 1000v-Passwort",
+"label.vsmpktvlanid": "Paket-VLAN-Kennung",
+"label.vsmstoragevlanid": "Speicher-VLAN-Kennung",
+"label.vsmusername": "Nexus 1000v-Benutzername",
+"label.vsmusername.req": "Nexus 1000v-Benutzername",
+"label.vsphere.managed": "vSphere verwaltet",
+"label.vswitch.name": "vSwitch-Name",
+"label.vswitch.type": "vSwitch-Typ",
+"label.vswitchguestname": "Gast Datenverkehr vSwitch Name",
+"label.vswitchguesttype": "Gast Datenverkehr vSwitch Typ",
+"label.vswitchpublicname": "Öffentlicher Datenverkehr vSwitch Name",
+"label.vswitchpublictype": "Öffentlicher Datenverkehr vSwitch Typ",
+"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.windows": "Fenster",
+"label.write": "Schreiben",
+"label.writeback": "Write-back Festplatten Caching",
+"label.writecachetype": "Schreib-Cache-Typ",
+"label.writeio": "Schreiben (IO)",
+"label.writethrough": "Write-through",
+"label.xennetworklabel": "XenServer Datenverkehrs-Bezeichnung",
+"label.xenservertoolsversion61plus": "Originale XS-Version ist 6.1+",
+"label.yes": "Ja",
+"label.yourinstance": "Ihre Instanz",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone dediziert",
+"label.zone.details": "Zonendetails",
+"label.zone.id": "Zone ID",
+"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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zonenname",
+"label.zones": "Zonen",
+"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.",
+"message.acquire.ip.failed": "Anfordern der IP fehlgeschlagen",
+"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.acquire.ip": "Bitte bestätigen Sie, dass Sie eine neue IP anfordern wollen",
+"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.backup.offering": "Bitte bestätigen Sie, dass Sie dieses Backup löschen wollen",
+"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.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.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.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.vpn.user": "Bitte bestätigen Sie, dass Sie diesen VPN-Benutzer entfernen wollen",
+"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.router.health.checks": "Das Ergebnis der Gesundheitsüberprüfung wird vom Router abgeholt",
+"message.action.router.health.checks.disabled.warning": "Bitte aktivieren Sie die Gesundheitüberprüfung des Routers",
+"message.action.secure.host": "Dies wird den Host-Agenten und den libvirtd Prozess neu starten, nachdem die neuen X509 Zertifikate bestätigt wurden. Bitte bestätigen?",
+"message.action.settings.warning.vm.running": "Bitte stoppen Sie die virtuelle Maschine, um zu den Einstellungen zu gelangen",
+"message.action.settings.warning.vm.started": "Die virtuelle Maschine wurde gestartet. Sie muss gestoppt werden, um zu den Einstellungen zu gelangen.",
+"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.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.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.egress.rule.failed": "Das Hinzufügen einer Ausgangsregel ist fehlgeschlagen",
+"message.add.egress.rule.processing": "Neue Ausgangsregel hinzufügen...",
+"message.add.failed": "Hinzufügen fehlgeschlagen",
+"message.add.firewall": "Eine Firewall zur Zone hinzufügen",
+"message.add.firewall.rule.failed": "Hinzufügen einer neuen Firewall-Regel ist fehlgeschlagen",
+"message.add.firewall.rule.processing": "Hinzufügen einer neuen Firewall-Regel...",
+"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.iprange.processing": "Hinzufügen eines IP-Bereiches...",
+"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.network.acl.failed": "Hinzufügen einer Netzwerk ACL Liste ist fehlgeschlagen",
+"message.add.network.acl.processing": "Hinzufügen einer Netzwerk ACL Liste...",
+"message.add.network.failed": "Hinzufügen des Netzwerks fehlgeschlagen",
+"message.add.network.processing": "Hinzufügen eines Netzwerkes...",
+"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.port.forward.failed": "Hinzufügen einer neuen Port-Weiterleitungsregel ist fehlgeschlagen",
+"message.add.port.forward.processing": "Hinzufügen einer neuen Port-Weiterleitungsregel...",
+"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.private.gateway.failed": "Hinzufügen eines privaten Gateways ist fehlgeschlagen",
+"message.add.private.gateway.processing": "Hinzufügen eines privaten Gateways...",
+"message.add.region": "Bitte geben Sie die benötigten Informationen ein um eine neue Region hinzuzufügen",
+"message.add.resource.description": "Hinzufügen von Infrastrukturressourcen",
+"message.add.resource.hint": "Hinzufügen von Infrastrukturressourcen - Pods, Cluster, primäre/sekundäre Speicher",
+"message.add.secondary.ipaddress.processing": "Hinzufügen einer sekundären IP-Adresse",
+"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.static.route.failed": "Hinzufügen einer statischen Route ist fehlgeschlagen",
+"message.add.static.route.processing": "Hinzufügen einer statischen Route...",
+"message.add.system.service.offering": "Bitte geben Sie die folgenden Daten ein, um ein neues Systemdienstangebot hinzuzufügen.",
+"message.add.tag.failed": "Hinzufügen eines neuen Tags fehlgeschlagen",
+"message.add.tag.for.networkacl": "Füge einen Tag für NetworkACL hinzu",
+"message.add.tag.processing": "Hinzufügen eines neuen Tags...",
+"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.add.vpn.connection.failed": "Hinzufügen einer VPN-Verbindung fehlgeschlagen",
+"message.add.vpn.connection.processing": "Hinzufügen einer VPN-Verbindung...",
+"message.add.vpn.customer.gateway": "Hinzufügen eines VPN Customer Gateways",
+"message.add.vpn.customer.gateway.failed": "Hinzufügen eines VPN Customer Gateways fehlgeschlagen",
+"message.add.vpn.customer.gateway.processing": "Die Erstellung eines VPN Customer Gateways ist in Bearbeitung",
+"message.add.vpn.gateway": "Bitte bestätigen Sie, dass sie ein VPN Gateway hinzufügen wollen.",
+"message.add.vpn.gateway.failed": "Hinzufügen eines VPN Gateways fehlgeschlagen",
+"message.add.vpn.gateway.processing": "Hinzufügen eines VPN Gateways...",
+"message.added.vpc.offering": "VPC-Angebot hinzugefügt",
+"message.adding.host": "Host wird hinzugefügt",
+"message.adding.netscaler.device": "Hinzufügen eines Netscaler Gerätes",
+"message.adding.netscaler.provider": "Hinzufügen eines Netscaler Provider",
+"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.apply.success": "Erfolgreich angewandt",
+"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.assign.vm.failed": "Zuordnung der VM fehlgeschlagen",
+"message.assign.vm.processing": "Zuordnung der VM...",
+"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.backup.attach.restore": "Bitte bestätigen Sie, dass Sie das Backup wiederherstellen und anhängen wollen",
+"message.backup.offering.remove": "Sind Sie sicher, dass Sie die VM aus dem Backup-Angebot entfernen und die Backup Kette löschen wollen?",
+"message.backup.restore": "Bitte bestätigen Sie, dass Sie das VM-Backup wiederherstellen wollen",
+"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.certificate.upload.processing": "Hochladen des Zertifikats in Bearbeitung",
+"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.config.sticky.policy.failed": "Aktualisierung der statischen Regeln fehlgeschlagen",
+"message.config.sticky.policy.processing": "Aktualisierung der statischen Regeln...",
+"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.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.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.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.f5": "Bitte bestätigen Sie, dass Sie F5 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.kubernetes.version": "Bitte bestätigen Sie, dass Sie diese Kubernetes Version löschen wollen",
+"message.confirm.delete.netscaler": "Bitte bestätigen Sie, dass Sie NetScaler löschen möchten",
+"message.confirm.delete.niciranvp": "Bitte bestätigen Sie, dass Sie den Nicira Nvp Controller löschen wollen",
+"message.confirm.delete.pa": "Bitte bestätigen Sie, dass Sie Palo Alto löschen möchten",
+"message.confirm.delete.provider": "Bitte bestätigen Sie, dass Sie diesen Provider löschen wollen",
+"message.confirm.delete.secondary.staging.store": "Bitte bestätigen Sie, dass Sie diesen Sekundär-Staging-Store löschen möchten.",
+"message.confirm.delete.srx": "Bitte bestätigen Sie, dass Sie SRX löschen möchten",
+"message.confirm.delete.ucs.manager": "Bitte bestätigen Sie, dass Sie UCS-Manager löschen möchten",
+"message.confirm.destroy.kubernetes.cluster": "Bitte bestätigen Sie, dass Sie dieses Kubernetes Cluster zerstören wollen",
+"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.event": "Sind Sie sicher, dass Sie dieses Ereignis entfernen möchten?",
+"message.confirm.remove.ip.range": "Bitte bestätigen Sie, dass sie diesen IP Adressbereich löschen 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.kubernetes.cluster": "Bitte bestätigen Sie, dass Sie dieses Kubernetes Cluster starten wollen",
+"message.confirm.start.lb.vm": "Bitte bestätigen Sie, dass Sie die LB VM starten möchten",
+"message.confirm.stop.kubernetes.cluster": "Bitte bestätigen Sie, dass Sie dieses Kubernetes Cluster stoppen wollen",
+"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.compute.offering": "Berechnungsangebot erstellt",
+"message.create.internallb": "Erstelle internen LB",
+"message.create.internallb.failed": "Erstellung des interen LB fehlgeschlagen",
+"message.create.internallb.processing": "Erstellung des internen LB ist in Bearbeitung",
+"message.create.service.offering": "Serviceangebot erstellt",
+"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.create.volume.failed": "Erstellung eines Speichers fehlgeschlagen",
+"message.create.volume.processing": "Erstellung eines Speichers ist in Bearbeitung",
+"message.create.vpc.offering": "VPC-Angebot erstellt",
+"message.create.vpn.customer.gateway.failed": "VPN Customer Gateway Erstellung fehlgeschlagen",
+"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.dedicate.zone": "Dediziere Zone",
+"message.dedicated.zone.released": "Zonen-Dedizierung freigegeben",
+"message.dedicating.cluster": "Dediziere Cluster...",
+"message.dedicating.host": "Dediziere Host...",
+"message.dedicating.pod": "Dediziere Pod...",
+"message.dedicating.zone": "Dediziere Zone...",
+"message.delete.account": "Bitte bestätigen Sie, dass Sie dieses Benutzerkonto löschen möchten.",
+"message.delete.acl.processing": "ACL-Regel wird entfernt...",
+"message.delete.acl.rule": "ACL-Regel entfernen",
+"message.delete.acl.rule.failed": "ACL-Regel entfernen fehlgeschlagen",
+"message.delete.affinity.group": "Bitte bestätigen Sie, dass Sie diese Affinitätsgruppe löschen möchten.",
+"message.delete.backup": "Sind Sie sicher, dass Sie das Backup löschen wollen?",
+"message.delete.failed": "Löschen fehlgeschlagen",
+"message.delete.gateway": "Bitte bestätigen Sie, dass Sie dieses Gateway löschen möchten",
+"message.delete.port.forward.processing": "Port-Weiterleitungsregel wird gelöscht...",
+"message.delete.project": "Sind Sie sicher, dass Sie dieses Projekt löschen möchten?",
+"message.delete.rule.processing": "Regel wird gelöscht...",
+"message.delete.sslcertificate": "Bitte bestätigen Sie, dass Sie dieses Zertifikat löschen wollen",
+"message.delete.static.route.failed": "Löschen der statischen Route fehlgeschlagen",
+"message.delete.static.route.processing": "Statische Route wird gelöscht...",
+"message.delete.tag.failed": "Löschen des Tags fehlgeschlagen",
+"message.delete.tag.for.networkacl": "Tag für NetworkACL löschen",
+"message.delete.tag.processing": "Tag wird gelöscht...",
+"message.delete.user": "Bitte bestätigen Sie, dass Sie diesen Benutzer löschen möchten.",
+"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.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.diagnostics.exitcode": "exitcode: var",
+"message.diagnostics.stderr": "stderr: var",
+"message.diagnostics.stdout": "stdout: var",
+"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.disable.vpn.failed": "VPN deaktivieren fehlgeschlagen",
+"message.disable.vpn.processing": "VPN wird deaktiviert...",
+"message.disabling.network.offering": "Netzwerkangebot wird deaktiviert",
+"message.disabling.vpc.offering": "VPC-Angebot wird deaktiviert",
+"message.disallowed.characters": "Nicht erlaubte Zeichen: <,>",
+"message.disk.offering.created": "Festplattenangebot erstellt:",
+"message.download.diagnostics": "Bitte klicken Sie auf den Link, um die erstellten Diagnosen herunterzuladen::<p><a href=\"#\">00000</a>",
+"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.acl.failed": "Anpassen der ACL Regel fehlgeschlagen",
+"message.edit.acl.processing": "ACL Regel wird angepasst...",
+"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.rule.failed": "Anpassen der Regel fehlgeschlagen",
+"message.edit.rule.processing": "Regel wird aktualisiert...",
+"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.netsacler.provider.failed": "Aktivieren des Netscaler Providers fehlgeschlagen",
+"message.enable.securitygroup.provider.failed": "Aktivieren des Sicherheitsgruppen-Providers fehlgeschlagen",
+"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.enable.vpn.failed": "Aktivierung des VPNs fehlgeschlagen",
+"message.enable.vpn.processing": "VPN wird aktiviert...",
+"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.enabled.vpn.note": "Anmerkung: VPN-Nutzer können nun durch Änderung der Ansicht der Netzwerk-Tabs erreicht werden",
+"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.error.access.key": "Bitte Zugangsschlüssel eingeben",
+"message.error.add.guest.network": "Eines der Felder von IPv4 oder IPv6 muss ausgefüllt sein, wenn ein Gastnetzwerk hinzugefügt werden soll",
+"message.error.add.secondary.ipaddress": "Es ist ein Fehler beim Hinzufügen der sekundären IP-Adresse aufgetreten",
+"message.error.agent.password": "Bitte das Passwort des Agenten eingeben",
+"message.error.agent.username": "Bitte den Benutzernamen des Agenten eingeben",
+"message.error.binaries.iso.url": "Bitte binäre ISO-URL angeben",
+"message.error.bucket": "Bitte Bucket eingeben",
+"message.error.cloudian.console": "Das Single-Sign-On für Cloudian Management Konsole ist fehlgeschlagen. Bitte wenden Sie sich an Ihren Systemadministrator, um Integrationsfehler zu beheben.",
+"message.error.cluster.description": "Bitte die Kubernetes Cluster Beschreibung eingeben",
+"message.error.cluster.name": "Bitte den Clusternamen eingeben",
+"message.error.confirm.password": "Bitte das neue Passwort bestätigen",
+"message.error.current.password": "Bitte das aktuelle Passwort eingeben",
+"message.error.custom.disk.size": "Bitte eine benutzerdefinierte Festplattengröße eingeben",
+"message.error.date": "Bitte das Datum auswählen",
+"message.error.description": "Bitte eine Beschreibung eingeben",
+"message.error.display.text": "Bitte den Anzeige Text eingeben",
+"message.error.domain": "Bitte Ihre Domain eingeben, freilassen für ROOT-Domain",
+"message.error.enable.saml": "Es konnten keine Nutzer-IDs gefunden werden, um SAML Single Sign On zu aktivieren schalten Sie dies bitte manuell an",
+"message.error.endip": "Bitte End-IP eingeben",
+"message.error.gateway": "Bitte Gateway eingeben",
+"message.error.host.name": "Bitte Host-Namen eingeben",
+"message.error.host.password": "Bitte Host-Passwort eingeben",
+"message.error.host.tags": "Bitte Host-Tags eingeben",
+"message.error.host.username": "Bitte Host-Benutzernamen eingeben",
+"message.error.hypervisor.type": "Bitte Hypervisor-Typ auswählen",
+"message.error.input.value": "Bitte Wert eingeben",
+"message.error.internal.dns1": "Bitte internen DNS 1 eingeben",
+"message.error.internal.dns2": "Bitte internen DNS 2 eingeben",
+"message.error.internallb.instance.port": "Bitte spezifizieren Sie einen Instanzport",
+"message.error.internallb.name": "Bitte spezifizieren Sie einen Namen für die interne LB",
+"message.error.internallb.source.port": "Bitte spezifizieren Sie einen Ursprungsport",
+"message.error.invalid.range": "Bitte geben Sie Wert von {min} bis {max} ein",
+"message.error.ipv4.address": "Bitte geben Sie eine gültige IPv4-Adresse ein",
+"message.error.ipv4.dns1": "Bitte geben Sie einen IPv4 DNS 1 ein",
+"message.error.ipv4.dns2": "Bitte geben Sie einen IPv4 DNS 2 ein",
+"message.error.ipv6.address": "Bitte geben Sie eine gültige IPv6-Adresse ein",
+"message.error.ipv6.cidr": "Bitte geben Sie eine IPv6 CIDR ein",
+"message.error.ipv6.dns1": "Bitte geben Sie einen IPv6 DNS 1 ein",
+"message.error.ipv6.dns2": "Bitte geben Sie einen IPv6 DNS 2 ein",
+"message.error.ipv6.gateway": "Bitte geben Sie ein IPv6 Gateway ein",
+"message.error.ipv6.gateway.format": "Bitte geben Sie ein gültiges IPv6 Format für den Gateway ein",
+"message.error.kubecluster.name": "Bitte geben Sie einen Namen für das Kubernetes Cluster ein",
+"message.error.kuberversion": "Bitte geben Sie die Kubernetes Version ein",
+"message.error.limit.value": "Der Wert muss kleiner sein als",
+"message.error.loading.setting": "Während des Ladens der Einstellungen ist ein Fehler aufgetreten",
+"message.error.lun": "Bitte geben Sie die LUN # ein",
+"message.error.name": "Bitte einen Namen eingeben",
+"message.error.netmask": "Bitte eine Netzmaske eingeben",
+"message.error.network.domain": "Bitte eine Netzwerkdomain eingeben",
+"message.error.network.offering": "Bitte ein Netzwerkangebot wählen",
+"message.error.new.password": "Bitte ein neues Passwort eingeben",
+"message.error.nexus1000v.ipaddess": "Bitte Nexus 1000v IP-Adresse eingeben",
+"message.error.nexus1000v.password": "Bitte Nexus 1000v Passwort eingeben",
+"message.error.nexus1000v.username": "Bitte Nexus 1000v Benutzernamen eingeben",
+"message.error.number": "Bitte eine gültige Nummer eingeben",
+"message.error.password": "Geben Sie Ihr Passwort ein",
+"message.error.path": "Bitte Pfad angeben",
+"message.error.provide.setting": "Bitte wählen Sie einen gültigen Schlüssel und Wert für die Einstellung",
+"message.error.rados.monitor": "Bitte RADOS Monitor eingeben",
+"message.error.rados.pool": "Bitte RADOS Pool eingeben",
+"message.error.rados.secret": "Bitte RADOS Passwort eingeben",
+"message.error.rados.user": "Bitte RADOS Benutzer eingeben",
+"message.error.remove.nic": "Es ist ein Fehler aufgetreten",
+"message.error.remove.secondary.ipaddress": "Es ist ein Fehler aufgetreten, während die sekundäre IP-Adresse entfernt wurde",
+"message.error.required.input": "Bitte gültigen Wert eingeben",
+"message.error.retrieve.kubeconfig": "Kubernetes Cluster Config konnte nicht empfangen werden",
+"message.error.s3nfs.path": "Bitte S3 NFS Pfad eingeben",
+"message.error.s3nfs.server": "Bitte S3 NFS Server eingeben",
+"message.error.save.setting": "Es ist ein Fehler beim Speichern dieser Einstellung aufgetreten",
+"message.error.sbdomain": "Bitte eine SMB Domain eingeben",
+"message.error.sbdomain.password": "Bitte ein SMB Domain Passwort eingeben",
+"message.error.sbdomain.username": "Bitte einen SMB Domain Benutzernamen eingeben",
+"message.error.secret.key": "Bitte den geheimen Schlüssel eingeben",
+"message.error.select": "Bitte eine Option auswählen",
+"message.error.select.domain.to.dedicate": "Bitte eine Domain auswählen, um diese zu dedizieren",
+"message.error.select.zone.type": "Bitte eine Zone auswählen",
+"message.error.server": "Bitte einen Server eingeben",
+"message.error.serviceoffering.for.cluster": "Bitte ein Serviceangebot für das Kubernetes Cluster auswählen",
+"message.error.size": "Bitte die Größe in GB eingeben",
+"message.error.size.for.cluster": "Bitte Größe des Kubernetes Clusters eingeben",
+"message.error.smb.password": "Bitte ein SMB Passwort eingeben",
+"message.error.smb.username": "Bitte einen SMB Benutzernamen eingeben",
+"message.error.specify.sticky.name": "Bitte einen eindeutigen Namen eingeben",
+"message.error.sr.namelabel": "Bitte ein SR Namen für das Label eingeben",
+"message.error.startip": "Bitte eine Start-IP eingeben",
+"message.error.storage.tags": "Bitte Speichertags eingeben",
+"message.error.target.iqn": "Bitte ein Ziel IQN eingeben",
+"message.error.time": "Bitte eine Zeitzone auswählen",
+"message.error.traffic.label": "Bitte ein Label für den Datenverkehr eingeben",
+"message.error.try.save.setting": "Es ist ein Fehler beim Speichern dieser Einstellung aufgetreten. Bitte versuchen Sie es später erneut.",
+"message.error.upload.iso.description": "Es kann nur eine ISO gleichzeitig hochgeladen werden",
+"message.error.upload.template": "Hochladen des Templates fehlgeschlagen",
+"message.error.upload.template.description": "Es kann nur ein Template gleichzeitig hochgeladen werden",
+"message.error.url": "Bitte geben Sie die URL ein",
+"message.error.username": "Bitte geben Sie Ihren Benutzernamen ein",
+"message.error.vcenter.datacenter": "Bitte vCenter Datacenter eingeben",
+"message.error.vcenter.datastore": "Bitte vCenter Datastore eingeben",
+"message.error.vcenter.host": "Bitte vCenter Host eingeben",
+"message.error.vcenter.password": "Bitte vCenter Passwort eingeben",
+"message.error.vcenter.username": "Bitte vCenter Benutzernamen eingeben",
+"message.error.version.for.cluster": "Bitte Kubernetes Version für Kubernetes Cluster eingeben",
+"message.error.vlan.range": "Bitte einen gültigen VLAN/VNI-Bereich eingeben",
+"message.error.volume.name": "Bitte einen Namen für den Speicher eingeben",
+"message.error.volumne": "Bitte geben Sie den Speicher ein",
+"message.error.volumne.group": "Bitte wählen Sie die Speichergruppe",
+"message.error.zone": "Bitte wählen Sie eine Zone aus",
+"message.error.zone.combined": "Eine Zone kann mit keiner weiteren Zone kombiniert werden",
+"message.error.zone.for.cluster": "Bitte wählen Sie die Zone für das Kubernetes Cluster",
+"message.error.zone.name": "Bitte geben Sie den Zonen Namen ein",
+"message.error.zone.type": "Bitte den Zonentyp auswählen",
+"message.fail.to.delete": "Löschen fehlgeschlagen",
+"message.failed.to.assign.vms": "Zuordnung der VMs fehlgeschlagen",
+"message.failed.to.remove": "Entfernen fehlgeschlagen",
+"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.guestnetwork.state.allocated": "Die Netzwerkkonfiguration wurde zugewiesen, ist aber noch nicht eingerichtet",
+"message.guestnetwork.state.destroy": "Das Netzwerk wurde gelöscht",
+"message.guestnetwork.state.implemented": "Die Netzwerkkonfiguration ist bereits in Benutzung",
+"message.guestnetwork.state.implementing": "Die Netzwerkkonfiguration wurde bereits implementiert",
+"message.guestnetwork.state.setup": "Die Netzwerkkonfiguration wird eingerichtet",
+"message.guestnetwork.state.shutdown": "Die Netzwerkkonfiguration wurde stillgelegt",
+"message.host.dedicated": "Host dediziert",
+"message.host.dedication.released": "Host-Dedizierung freigegeben",
+"message.info.cloudian.console": "Cloudian Management Konsole sollte ein anderes Fenster öffnen",
+"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.interloadbalance.not.return.elementid": "Fehler: listInternalLoadBalancerElements API gibt die interne LB Element-ID nicht zurück",
+"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.kubeconfig.cluster.not.available": "Die Kubernetes Cluster Kubeconfig ist momentan nicht verfügbar",
+"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.launch.zone.description": "Die Zone ist bereit zum Start; bitte fahren Sie mit dem nächsten Schritt fort",
+"message.launch.zone.hint": "Bitte konfigurieren Sie die Netzwerkkomponenten und den Datenverkehr mit IP-Adressen",
+"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.listnsp.not.return.providerid": "Fehler: listNetworkServiceProviders API gibt die VirtualRouter Provider-ID nicht zurück",
+"message.listview.subselect.multi": "(Strg/Cmd-Klick)",
+"message.load.host.failed": "Laden der Hosts fehlgeschlagen",
+"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.login.failed": "Login fehlgeschlagen",
+"message.migrate.instance.confirm": "Bitte bestätigen Sie den Host auf den Sie die virtuelle Instanz migrieren wollen.",
+"message.migrate.instance.select.host": "Bitte einen Host für die Migration auswählen",
+"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.migrate.volume.failed": "Migration des Speichers fehlgeschlagen",
+"message.migrate.volume.processing": "Migriere Speicher...",
+"message.migrating.failed": "Migration fehlgeschlagen",
+"message.migrating.processing": "Migration in Bearbeitung für",
+"message.migrating.vm.to.host.failed": "Die Migration von VM zum Host ist fehlgeschlagen",
+"message.move.acl.order": "ACL-Regel Reihenfolge verändern",
+"message.move.acl.order.failed": "Verändern der ACL-Regel Reihenfolge fehlgeschlagen",
+"message.move.acl.order.processing": "Ändere ACL-Regel...",
+"message.ncc.delete.confirm": "Bitte bestätigen Sie, dass Sie dieses NCC löschen möchten",
+"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.description": "Einrichtung des Netzwerks und des Datenverkehrs",
+"message.network.hint": "Bitte konfigurieren Sie die Netzwerkkomponenten und public/guest/management Datenverkehr mit IP-Adressen",
+"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.network.removenic": "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.network.secondaryip": "Bitte bestätigen Sie, dass Sie eine neue sekundäre IP für diese NIC erhalten möchten. \n Anmerkung: Sie müssen die erhaltene sekundäre IP manuell in der virtuellen Maschine konfigurieren",
+"message.network.updateip": "Bitte bestätigen Sie, dass Sie die IP Adresse für dieses NIC auf dieser VM ändern möchten.",
+"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.datadisk": "Das Multifestplatten Template hat keinen Datenträger, bitte fahren Sie mit dem nächsten Schritt fort",
+"message.no.description": "Keine Beschreibung eingegeben",
+"message.no.host.available": "Es ist kein Host für eine Migration verfügbar",
+"message.no.label.on.left": "Kein Label auf der linken Seite",
+"message.no.label.on.right": "Kein Label auf der rechten Seite",
+"message.no.more.hosts.available": "Es sind keine weiteren Hosts für die 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.ovf.properties.available": "Die folgenden OVF-Eigenschaften stehen für die Bearbeitung zur Verfügung. Bitte passen Sie die Werte dementsprechend an",
+"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.enter.value": "Bitte geben Sie die Werte ein",
+"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.processing.complete": "Bearbeitung abgeschlossen",
+"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.publicip.state.allocated": "Die IP-Adresse wird bereits verwendet",
+"message.publicip.state.allocating": "Die IP-Adresse wird zu einem anderem Netzwerk übertragen und steht noch nicht für die Benutzung zur Verfügung",
+"message.publicip.state.free": "Die IP-Adresse ist bereit zur Verteilung",
+"message.publicip.state.releasing": "Die IP-Adresse ist nicht verfügbar für andere Netzwerke und steht nicht für die Benutzung zur Verfügung",
+"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.register.failed": "Registrierung fehlgeschlagen",
+"message.register.succeeded": "Registrierung erfolgreich",
+"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.release.ip.failed": "Freigabe der IP-Adresse fehlgeschlagen",
+"message.releasing.dedicated.cluster": "Dediziertes Cluster wird freigegeben...",
+"message.releasing.dedicated.host": "Dedizierter Host wird freigegeben...",
+"message.releasing.dedicated.pod": "Dedizierter Pod wird freigegeben...",
+"message.releasing.dedicated.zone": "Dedizierte Zone wird freigegeben...",
+"message.remove.egress.rule.failed": "Entfernen der Ausgangsregel fehlgeschlagen",
+"message.remove.egress.rule.processing": "Ausgangsregel wird entfernt...",
+"message.remove.failed": "Entfernen fehlgeschlagen",
+"message.remove.firewall.rule.failed": "Entfernen der Firewall-Regel fehlgeschlagen",
+"message.remove.firewall.rule.processing": "Firewall-Regel entfernen...",
+"message.remove.instance.failed": "Entfernen der Instanz fehlgeschlagen",
+"message.remove.instance.processing": "Entferne...",
+"message.remove.iprange.processing": "Entferne IP-Bereich...",
+"message.remove.ldap": "Sind Sie sicher, dass Sie die LDAP-Konfiguration löschen möchten?",
+"message.remove.nic.processing": "Entferne NIC...",
+"message.remove.port.forward.failed": "Entfernen der Port-Weiterleitungsregel fehlgeschlagen",
+"message.remove.region": "Sind Sie sicher, dass Sie diese Region vom Verwaltungsserver entfernen möchten?",
+"message.remove.rule.failed": "Entfernen der Regel fehlgeschlagen",
+"message.remove.secondary.ipaddress.processing": "Entferne sekundäre IP-Adresse...",
+"message.remove.securitygroup.rule.processing": "Lösche Sicherheitsgruppenregel...",
+"message.remove.sticky.policy.failed": "Entfernen der festen Regeln fehlgeschlagen",
+"message.remove.sticky.policy.processing": "Entferne die festen Regeln...",
+"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.request.failed": "Anfrage fehlgeschlagen",
+"message.required.add.least.ip": "Bitte fügen Sie mindestens 1 IP-Bereich hinzu",
+"message.required.traffic.type": "Fehler bei der Konfiguration! Alle erforderlichen Datenverkehrstypen sollten hinzugefügt werden mit mehreren physischen Netzwerken. Pro Netzwerk sollte ein Label vergeben werden.",
+"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.reset.vpn.connection": "Bitte bestätigen Sie, dass Sie die VPN-Verbindung zurücksetzen möchten",
+"message.resize.volume.failed": "Ändern der Speichergröße fehlgeschlagen",
+"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.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.role.update.fail": "Failed updating rule permission",
+"message.scale.processing": "Skalierung wird durchgeführt",
+"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.select.zone.description": "Bitte wählen Sie den Typ der Zone - basic oder advanced",
+"message.select.zone.hint": "Dies ist der Typ der Entwicklungszone, den Sie verwenden wollen. Basic Zone: Stellt ein einzelnes Netzwerk zur Verfügung, jede VM Instanz wird direkt eine IP vom Netzwerk zugewiesen. Gast-Isolation kann durch Layer-3 und Sicherheitsgruppen darstellt (Filterung des Ursprungs der IP-Adressen) und sichergestellt werden. Advanced Zone: Für fortschrittlichere Netzwerkstrukturen. Dieses Netzwerkmodell stellt die höchste Flexibilität für die Gastnetzwerke zur Verfügung und ermöglicht eigene Netzwerkangebote, wie Firewall, VPN, oder Load Balancer Support.",
+"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.setting.updated": "Einstellung aktualisiert:",
+"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.specifiy.tag.key": "Bitte spezifizieren Sie einen Schlüssel für den Tag",
+"message.specifiy.tag.key.value": "Bitte geben Sie einen Ettikettnamen und -wert an",
+"message.specifiy.tag.value": "Bitte spezifizieren Sie einen Wert für den Tag",
+"message.specify.url": "Bitte geben Sie eine URL an",
+"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.success.acquire.ip": "IP erfolgreich erhalten",
+"message.success.add.egress.rule": "Neue Ausgangsregel erfolgreich hinzugefügt",
+"message.success.add.firewall.rule": "Neue Firewall-Regel erfolgreich hinzugefügt",
+"message.success.add.guest.network": "Gastnetzwerk erfolgreich hinzugefügt",
+"message.success.add.iprange": "IP-Bereich erfolgreich hinzugefügt",
+"message.success.add.kuberversion": "Kubernetes Version erfolgreich hinzugefügt",
+"message.success.add.network": "Netzwerk erfolgreich hinzugefügt",
+"message.success.add.network.acl": "Netzwerk ACL Liste erfolgreich hinzugefügt",
+"message.success.add.port.forward": "Neue Port-Weiterleitungsregel erfolgreich hinzugefügt",
+"message.success.add.private.gateway": "Privates Gateway erfolgreich hinzugefügt",
+"message.success.add.rule": "Neue Regel erfolgreich hinzugefügt",
+"message.success.add.secondary.ipaddress": "Sekundäre IP-Adresse erfolgreich hinzugefügt",
+"message.success.add.static.route": "Statische Route erfolgreich hinzugefügt",
+"message.success.add.tag": "Neuer Tag erfolgreich hinzugefügt",
+"message.success.add.vpc.network": "VPC-Network erfolgreich hinzugefügt",
+"message.success.add.vpn.customer.gateway": "VPN Customer Gateway erfolgreich hinzugefügt",
+"message.success.add.vpn.gateway": "VPN-Gateway erfolgreich hinzugefügt",
+"message.success.asign.vm": "VM erfolgreich zugeordnet",
+"message.success.assigned.vms": "VMs erfolgreich zugeordnet",
+"message.success.certificate.upload": "Zertifikat erfolgreich hochgeladen",
+"message.success.change.affinity.group": "Affinitätsgruppen erfolgreich geändert",
+"message.success.change.offering": "Angebot erfolgreich geändert",
+"message.success.change.password": "Passwort für Benutzer erfolgreich geändert",
+"message.success.config.backup.schedule": "VM-Backup-Plan erfolgreich konfiguriert",
+"message.success.config.sticky.policy": "Feste Regeln erfolgreich konfiguriert",
+"message.success.copy.clipboard": "Erfolgreich in das Clipboard kopiert",
+"message.success.create.account": "Account erfolgreich erstellt",
+"message.success.create.internallb": "Interne LB erfolgreich erstellt",
+"message.success.create.isolated.network": "Isoliertes Netzwerk erfolgreich erstellt",
+"message.success.create.keypair": "SSH-Schlüsselpaar erfolgreich erstellt",
+"message.success.create.kubernetes.cluter": "Kubernetes Cluster erfolgreich erstellt",
+"message.success.create.l2.network": "L2 Netzwerk erfolgreich erstellt",
+"message.success.create.volume": "Speicher erfolgreich erstellt",
+"message.success.delete": "Erfolgreich gelöscht",
+"message.success.delete.acl.rule": "ACL-Regel erfolgreich gelöscht",
+"message.success.delete.backup.schedule": "VM-Backup-Plan erfolgreich gelöscht",
+"message.success.delete.snapshot.policy": "Schnappschussplan erfolgreich gelöscht",
+"message.success.delete.static.route": "Statische Route erfolgreich gelöscht",
+"message.success.delete.tag": "Tag erfolgreich gelöscht",
+"message.success.disable.saml.auth": "SAML-Authorisation erfolgreich deaktiviert",
+"message.success.disable.vpn": "VPN erfolgreich deaktiviert",
+"message.success.edit.acl": "ACL-Regel erfolgreich angepasst",
+"message.success.edit.rule": "Regel erfolgreich angepasst",
+"message.success.enable.saml.auth": "SAML-Authorisation erfolgreich aktiviert",
+"message.success.migrate.volume": "Speicher erfolgreich erfolgreich migriert",
+"message.success.migrating": "Migration erfolgreich abgeschlossen für",
+"message.success.move.acl.order": "ACL-Regel erfolgreich bewegt",
+"message.success.recurring.snapshot": "Wiederkehrende Schnappschüsse erfolgreich",
+"message.success.register.iso": "ISO erfolgreich registriert",
+"message.success.register.keypair": "SSH-Schlüsselpaar erfolgreich registriert",
+"message.success.register.template": "Template erfolgreich registriert",
+"message.success.release.ip": "IP erfolgreich freigegeben",
+"message.success.remove.egress.rule": "Ausgangsregel erfolgreich entfernt",
+"message.success.remove.firewall.rule": "Firewall-Regel erfolgreich entfernt",
+"message.success.remove.instance.rule": "Instanz erfolgreich von der Regel entfernt",
+"message.success.remove.ip": "IP erfolgreich entfernt",
+"message.success.remove.iprange": "IP-Bereich erfolgreich entfernt",
+"message.success.remove.nic": "Erfolgreich entfernt",
+"message.success.remove.port.forward": "Port-Weiterleitungsregel erfolgreich entfernt",
+"message.success.remove.rule": "Regel erfolgreich gelöscht",
+"message.success.remove.secondary.ipaddress": "Sekundäre IP-Adresse erfolgreich entfernt",
+"message.success.remove.sticky.policy": "Feste Regel erfolgreich entfernt",
+"message.success.resize.volume": "Speichergröße erfolgreich verändert",
+"message.success.scale.kubernetes": "Kubernetes Cluster erfolgreich skaliert",
+"message.success.update.ipaddress": "IP-Adresse erfolgreich aktualisiert",
+"message.success.update.kubeversion": "Kubernetes auf die unterstützte Version erfolgreich aktualisiert",
+"message.success.upgrade.kubernetes": "Kubernetes Cluster erfolgreich hochgestuft",
+"message.success.upload": "Hochladen erfolgreich",
+"message.success.upload.description": "Diese ISO-Datei wurde hochgeladen. Bitte überprüfen Sie den Status im Templates Menü",
+"message.success.upload.iso.description": "Diese ISO-Datei wurde hochgeladen. Bitte überprüfen Sie den Status in Images > ISOs Menü",
+"message.success.upload.template.description": "Diese ISO-Datei wurde hochgeladen. Bitte überprüfen Sie den Status im Templates Menü",
+"message.success.upload.volume.description": "Dieser Speicher wurde hochgeladen. Bitte überprüfen Sie den Status im Volumes Menü",
+"message.suspend.project": "Sind Sie sicher, dass sie die Ausführung dieses Projektes unterbrechen möchten?",
+"message.switch.to": "Gewechselt zu",
+"message.systems.vms.ready": "System-VMs bereit.",
+"message.template.copy.select.zone": "Bitte wählen Sie eine Zone zum Kopieren des Templates aus",
+"message.template.copying": "Vorlage wird kopiert.",
+"message.template.desc": "Betriebssystem Abbild das zum starten von VMs verwendet werden kann",
+"message.template.iso": "Bitte wählen Sie eine Vorlage oder ISO, um fortzufahren",
+"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.ipaddress.processing": "Aktualisiere IP-Adresse...",
+"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.upload.failed": "Hochladen fehlgeschlagen",
+"message.upload.file.limit": "Es kann nur eine Datei gleichzeitig hochgeladen werden",
+"message.upload.file.processing": "Schließen Sie dieses Fenster nicht. Das Hochladen der Datei ist in Arbeit...",
+"message.upload.iso.failed": "ISO-Upload fehlgeschlagen",
+"message.upload.iso.failed.description": "ISO-Upload fehlgeschlagen",
+"message.upload.template.failed.description": "Template-Upload fehlgeschlagen",
+"message.upload.volume.failed": "Speicher-Upload fehlgeschlagen",
+"message.user.not.permitted.api": "Der Benutzer ist nicht berechtigt, diese API zu nutzen",
+"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.validate.url": "Bitte geben Sie eine gültige URL 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.virtual.router.not.return.elementid": "Fehler: listVirtualRouterElements API gibt die Virtual Router Element ID nicht zurück",
+"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.vm.state.destroyed": "VM ist für das Löschen markiert",
+"message.vm.state.error": "VM hat einen Fehler",
+"message.vm.state.expunging": "VM wird gelöscht",
+"message.vm.state.migrating": "VM wird migriert",
+"message.vm.state.running": "VM läuft",
+"message.vm.state.shutdown": "VM wird heruntergefahren",
+"message.vm.state.starting": "VM wird gestartet",
+"message.vm.state.stopped": "VM ist gestoppt",
+"message.vm.state.stopping": "VM wird gestoppt",
+"message.vm.state.unknown": "VM Status unbekannt",
+"message.vmsnapshot.state.allocated": "Der VM-Schnappschuss ist zugewiesen, jedoch noch nicht erstellt",
+"message.vmsnapshot.state.creating": "Der VM-Schnappschuss wurde erstellt",
+"message.vmsnapshot.state.error": "Der VM-Schnappschuss ist in einem Fehlerzustand und kann nicht wiederhergestellt werden",
+"message.vmsnapshot.state.expunging": "Der VM-Schnappschuss wird gelöscht",
+"message.vmsnapshot.state.ready": "Der VM-Schnappschuss ist bereit zur Nutzung",
+"message.vmsnapshot.state.removed": "Der VM-Schnappschuss ist zerstört und kann nicht wiederhergestellt werden",
+"message.vmsnapshot.state.reverting": "Der VM-Schnappschuss ist zur Wiederherstellung verfügbar",
+"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.volume.root.shrink.disk.size": "Verkleinerung des ROOT-Speichers wird nicht unterstützt",
+"message.volume.state.allocated": "Der Speicher ist reserviert, aber noch erstellt",
+"message.volume.state.attaching": "Der Speicher wird angehangen an ein verfügbares Volume",
+"message.volume.state.copying": "Der Speicher wird kopiert vom Image zum primären Speicher, wenn es ein hochgeladenes Volume ist",
+"message.volume.state.creating": "Der Speicher wurde erstellt",
+"message.volume.state.destroy": "Der Speicher ist zerstört und kann nicht wiederhergestellt werden",
+"message.volume.state.destroying": "Der Speicher wird zerstört und kann nicht wiederhergestellt werden",
+"message.volume.state.expunged": "Der Speicher wurde gelöscht",
+"message.volume.state.expunging": "Der Speicher wird gelöscht",
+"message.volume.state.migrating": "Der Speicher migriert zu einem anderen Speicherpool",
+"message.volume.state.notuploaded": "Der Speichereintrag wurde in der DB erstellt, aber noch nicht hochgeladen",
+"message.volume.state.ready": "Der Speicher ist bereit zur Nutzung",
+"message.volume.state.resizing": "Die Speichergröße wurde verändert",
+"message.volume.state.revertsnapshotting": "Auf diesem Speicher wurde ein Schnappschuss erstellt. Der Speicher wird von diesem Schnappschuss wiederhergestellt",
+"message.volume.state.snapshotting": "Auf diesem Speicher wurde ein Schnappschuss erstellt, der noch nicht auf einen anderen Speicher verteilt wurde",
+"message.volume.state.uploadabandoned": "Das Hochladen des Speichers wurde abgebrochen, weil das Hochladen nicht innerhalb einer bestimmten Zeit initiiert wurde",
+"message.volume.state.uploaded": "Speicher wurde hochgeladen",
+"message.volume.state.uploaderror": "Das Hochladen des Speichers führte zu einigen Fehlern",
+"message.volume.state.uploadinprogress": "Das Hochladen des Speichers ist in Arbeit",
+"message.volume.state.uploadop": "Das Hochladen des Speichers ist in Arbeit und befindet sich in kürze auf dem Sekundärspeicher",
+"message.waiting.for.builtin.templates.to.load": "Warten bis die mitgelieferten Vorlagen geladen sind...",
+"message.xstools61plus.update.failed": "Die Aktuallisierung des Original XS Version ist 6.1+ Feldes ist fehlgeschlagen. Fehlermeldung:",
+"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": "Zonenerstellung abgeschlossen",
+"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.detail.description": "Geben Sie weitere Details zur Zone an",
+"message.zone.detail.hint": "Eine Zone ist die größte Organisationseinheit in CloudStack und wird normalerweise verbunden mit einem einzelnen Datenzentrum. Zonen bieten physische Isolation und Redundanz. Eine Zone besteht aus einem oder mehreren Pods (jeder Pod beinhaltet Hosts und primäre Speichersysteme) und ein sekundäres Speichersystem, das auf alle Pods der Zone aufgeteilt ist.",
+"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.",
+"network.rate": "Netzwerk-Rate",
+"router.health.checks": "Gesundheitsüberprüfung",
+"side.by.side": "Nebeneinander",
+"state.accepted": "Angenommen",
+"state.active": "Aktiv",
+"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.detached": "Losgelöst",
+"state.disabled": "Deaktiviert",
+"state.enabled": "Aktiviert",
+"state.error": "Fehler",
+"state.expunging": "Unwiederbringlich gelöscht",
+"state.migrating": "Migration",
+"state.pending": "Ausstehend",
+"state.running": "Läuft",
+"state.starting": "Startet",
+"state.stopped": "Gestoppt",
+"state.stopping": "Stoppt",
+"state.suspended": "Suspendiert",
+"title.upload.volume": "Volumen hochladen",
+"user.login": "Anmelden",
+"user.logout": "Abmelden"
+}
diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json
new file mode 100644
index 0000000..5b1cc6a
--- /dev/null
+++ b/ui/public/locales/en.json
@@ -0,0 +1,3298 @@
+{
+"alert.service.domainrouter": "Domain router",
+"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.dedicate.cluster.failed": "Failed to dedicate cluster",
+"error.dedicate.host.failed": "Failed to dedicate host",
+"error.dedicate.pod.failed": "Failed to dedicate pod",
+"error.dedicate.zone.failed": "Failed to dedicate zone",
+"error.execute.api.failed": "Failed to execute API",
+"error.fetching.async.job.result": "Error encountered while fetching async job result",
+"error.form.message": "There are erorrs in the form. Please fix them",
+"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.release.dedicate.cluster": "Failed to release dedicated cluster",
+"error.release.dedicate.host": "Failed to release dedicated host",
+"error.release.dedicate.pod": "Failed to release dedicated pod",
+"error.release.dedicate.zone": "Failed to release dedicated zone",
+"error.session.expired": "Your session has expired.",
+"error.unable.to.reach.management.server": "Unable to reach Management Server",
+"error.unable.to.proceed": "Unable to proceed. Please contact your administrator",
+"error.unresolved.internet.name": "Your internet name cannot be resolved.",
+"firewall.close": "Firewall",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Image Directory",
+"inline": "Inline",
+"label.about": "About",
+"label.about.app": "About CloudStack",
+"label.accept": "Accept",
+"label.accept.project.invitation": "Accept project invitation",
+"label.access": "Access",
+"label.accesskey": "Access Key",
+"label.account": "Account",
+"label.account.and.security.group": "Account - Security group",
+"label.account.details": "Account details",
+"label.account.id": "Account ID",
+"label.account.name": "Account Name",
+"label.account.specific": "Account-Specific",
+"label.accounts": "Accounts",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "Network ACL Total",
+"label.acquire.new.ip": "Acquire New IP",
+"label.acquire.new.secondary.ip": "Acquire new secondary IP",
+"label.acquiring.ip": "Acquiring 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.configure.stickiness": "Stickiness",
+"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.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.snapshot.from.vmsnapshot": "Create Snapshot from VM Snapshot",
+"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.account": "Delete account",
+"label.action.delete.account.processing": "Deleting account....",
+"label.action.delete.backup.offering": "Delete Backup Offering",
+"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.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.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.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.iso": "Edit ISO",
+"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.iso.permission": "Update ISO Permissions",
+"label.action.iso.share": "Update ISO Sharing",
+"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.project.add.account": "Add Account to Project",
+"label.action.project.add.user": "Add User to Project",
+"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.remove.vm": "Release VM",
+"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.router.health.checks": "Get health checks result",
+"label.action.run.diagnostics": "Run Diagnostics",
+"label.action.secure.host": "Provision Host Security Keys",
+"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.template.permission": "Update Template Permissions",
+"label.action.template.share": "Update Template Sharing",
+"label.action.unmanage.cluster": "Unmanage Cluster",
+"label.action.unmanage.cluster.processing": "Unmanaging Cluster....",
+"label.action.unmanage.virtualmachine": "Unmanage VM",
+"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.activeviewersessions": "Active Sessions",
+"label.add": "Add",
+"label.add.account": "Add Account",
+"label.add.accounts": "Add accounts",
+"label.add.accounts.to": "Add accounts to",
+"label.add.acl": "Add ACL",
+"label.add.acl.list": "Add 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.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"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.f5.device": "Add F5 device",
+"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.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "Add LDAP account",
+"label.add.ldap.list.users": "List LDAP users",
+"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.gateway": "Add new gateway",
+"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.tier": "Add new tier",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Add Nvp Controller",
+"label.add.note": "Add Note",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "Add Palo Alto device",
+"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.project.role": "Add Project Role",
+"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.ip": "Add Secondary IP",
+"label.add.secondary.storage": "Add Secondary Storage",
+"label.add.security.group": "Add Security Group",
+"label.add.service.offering": "Add Service Offering",
+"label.add.setting": "Add Setting",
+"label.add.srx.device": "Add SRX device",
+"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.traffic": "Add Traffic",
+"label.add.traffic.type": "Add Traffic Type",
+"label.add.ucs.manager": "Add UCS Manager",
+"label.add.user": "Add User",
+"label.add.vlan": "Add VLAN",
+"label.add.vm": "Add VM",
+"label.add.vm.to.tier": "Add VM to tier",
+"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.gateway": "Add VPN Gateway",
+"label.add.vpn.user": "Add VPN user",
+"label.add.vxlan": "Add VXLAN",
+"label.add.zone": "Add Zone",
+"label.addanothernetwork": "Add another network",
+"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.addnewnetworks": "Add new networks",
+"label.address": "Address",
+"label.admin": "Domain Admin",
+"label.admin.accounts": "Admin Accounts",
+"label.advanced": "Advanced",
+"label.advanced.mode": "Advanced Mode",
+"label.advanced.search": "Advanced Search",
+"label.affinity": "Affinity",
+"label.affinity.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "Agent Password",
+"label.agent.username": "Agent Username",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "Agree",
+"label.alert": "Alert",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "Alerts",
+"label.algorithm": "Algorithm",
+"label.all": "All",
+"label.all.zone": "All Zones",
+"label.allocated": "Allocated",
+"label.allocatediops": "IOPS Allocated",
+"label.allocationstate": "Allocation State",
+"label.allow": "Allow",
+"label.allowuserdrivenbackups": "Allow User Driven Backups",
+"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.version": "API Version",
+"label.apikey": "API Key",
+"label.app.cookie": "AppCookie",
+"label.app.name": "CloudStack",
+"label.apply": "Apply",
+"label.archive": "Archive",
+"label.archive.alerts": "Archive alerts",
+"label.archive.events": "Archive events",
+"label.as.default": "as default",
+"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.assigning.vms": "Assigning VMs",
+"label.associatednetwork": "Associated Network",
+"label.associatednetworkid": "Associated Network ID",
+"label.associatednetworkname": "Network Name",
+"label.asyncbackup": "Async Backup",
+"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.availabilityzone": "Availability Zone",
+"label.available": "Available",
+"label.available.public.ips": "Available Public IP Addresses",
+"label.back": "Back",
+"label.backup": "Backups",
+"label.backup.attach.restore": "Restore and Attach Backup Volume",
+"label.backup.offering.assign": "Assign VM to backup offering",
+"label.backup.offering.remove": "Remove VM from backup offering",
+"label.backup.offerings": "Backup Offerings",
+"label.backup.restore": "Restore VM Backup",
+"label.backupofferingid": "Backup Offering",
+"label.backupofferingname": "Backup Offering",
+"label.balance": "Balance",
+"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.baremetalcpu": "CPU (in MHz)",
+"label.baremetalcpucores": "# of CPU Cores",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "Memory (in MB)",
+"label.based.on": "Based on",
+"label.basic": "Basic",
+"label.basic.mode": "Basic Mode",
+"label.basicsetup": "Basic setup",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootable",
+"label.bootintosetup": "Boot into hardware setup",
+"label.bootmode": "Boot Mode",
+"label.boottype": "Boot Type",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "Broadcast URI",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "By Account",
+"label.by.alert.type": "By alert type",
+"label.by.availability": "By Availability",
+"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.bypassvlanoverlapcheck": "Bypass VLAN id/range overlap",
+"label.cachemode": "Write-cache Type",
+"label.cancel": "Cancel",
+"label.capacity": "Capacity",
+"label.capacity.iops": "Capacity IOPS",
+"label.capacitybytes": "Capacity Bytes",
+"label.capacityiops": "IOPS Total",
+"label.category": "Category",
+"label.certchain": "Chain",
+"label.certificate": "Certificate",
+"label.certificate.details": "Certificate Details",
+"label.certificate.upload": "Certificate Uploaded",
+"label.certificate.upload.failed": "Certificate Upload Failed",
+"label.certificate.upload.failed.description": "Failed to update SSL Certificate. Failed to pass certificate validation check",
+"label.certificateid": "Certificate ID",
+"label.change.affinity": "Change Affinity",
+"label.change.ip.addess": "Change IP Address",
+"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.choose.saml.indentity": "Choose SAML identity provider",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR or Account/Security Group",
+"label.cidr.destination.network": "Destination Network CIDR",
+"label.cidr.of.destination.network": "CIDR of destination network",
+"label.cidrlist": "CIDR list",
+"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.cks.cluster.size": "Cluster size (Worker nodes)",
+"label.cleanup": "Clean up",
+"label.clear": "Clear",
+"label.clear.list": "Clear list",
+"label.close": "Close",
+"label.cloud.console": "Cloud Management Console",
+"label.cloud.managed": "Cloud.com Managed",
+"label.cloudian.storage": "Cloudian Storage",
+"label.cluster": "Cluster",
+"label.cluster.name": "Cluster Name",
+"label.cluster.size": "Cluster size",
+"label.clusterid": "Cluster",
+"label.clustername": "Cluster Name",
+"label.clusternamelabel": "Cluster Name",
+"label.clusters": "Clusters",
+"label.clustertype": "Cluster Type",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.comma.separated.list.description": "Enter comma-separated list of commands",
+"label.comments": "Comments",
+"label.community": "Community",
+"label.complete": "Complete",
+"label.compute": "Compute",
+"label.compute.and.storage": "Compute and Storage",
+"label.compute.offering.access": "Compute offering access",
+"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.ovs": "Configure Ovs",
+"label.configure.sticky.policy": "Configure Sticky Policy",
+"label.configure.vpc": "Configure VPC",
+"label.confirmacceptinvitation": "Please confirm you wish to join this project",
+"label.confirmation": "Confirmation",
+"label.confirmdeclineinvitation": "Are you sure you want to decline this project invitation?",
+"label.confirmpassword": "Confirm Password",
+"label.confirmpassword.description": "Please type the same password again",
+"label.congratulations": "Congratulations!",
+"label.connectiontimeout": "Connection Timeout",
+"label.conservemode": "Conserve mode",
+"label.console.proxy": "Console proxy",
+"label.console.proxy.vm": "Console Proxy VM",
+"label.continue": "Continue",
+"label.continue.install": "Continue with installation",
+"label.copied.clipboard": "Copied to clipboard",
+"label.copy": "Copy",
+"label.copy.clipboard": "Copy to clipboard",
+"label.copy.text": "Copy Text",
+"label.copyid": "Copy ID",
+"label.copying.iso": "Copying ISO",
+"label.corrections.saved": "Corrections saved",
+"label.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU Allocated",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "CPU Allocated for VMs",
+"label.cpuallocatedghz": "CPU Allocated",
+"label.cpulimit": "CPU limits",
+"label.cpumaxdeviation": "Deviation",
+"label.cpunumber": "CPU Cores",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (in MHz)",
+"label.cputotal": "Total CPU",
+"label.cputotalghz": "CPU Total",
+"label.cpuused": "CPU Utilized",
+"label.cpuusedghz": "CPU Used",
+"label.create.account": "Create Account",
+"label.create.backup": "Start Backup",
+"label.create.network": "Create New Network",
+"label.create.network.gateway.description": "The gateway of the tier in the super CIDR range and not overlapping the CIDR of any other tier in this VPC.",
+"label.create.network.netmask.description": "Netmask of the tier. For example, with VPC CIDR of 10.0.0.0/16 and network tier CIDR of 10.1.1.0/24, gateway is 10.1.1.1 and netmask is 255.255.255.0",
+"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.project.role": "Create Project Role",
+"label.create.site.vpn.connection": "Create Site-to-Site VPN Connection",
+"label.create.site.vpn.gateway": "Create Site-to-Site VPN Gateway",
+"label.create.snapshot.for.volume": "Created snapshot for volume",
+"label.create.ssh.key.pair": "Create a SSH Key Pair",
+"label.create.template": "Create template",
+"label.create.user": "Create user",
+"label.create.vpn.connection": "Create VPN Connection",
+"label.created": "Created",
+"label.created.by.system": "Created by system",
+"label.createnfscache": "Create NFS secondary staging store",
+"label.creating.iprange": "Creating IP Ranges",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.currency": "Currency",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customconstrained": "Custom Constrained",
+"label.customdisksize": "Custom Disk Size",
+"label.customunconstrained": "Custom Unconstrained",
+"label.daily": "Daily",
+"label.dashboard": "Dashboard",
+"label.dashboard.endpoint": "Dashboard endpoint",
+"label.data.disk": "Data Disk",
+"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.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.use": "Default Use",
+"label.default.view": "Default View",
+"label.defaultnetwork": "Default network",
+"label.delete": "Delete",
+"label.delete.acl.list": "Delete ACL List",
+"label.delete.affinity.group": "Delete Affinity Group",
+"label.delete.alerts": "Delete alerts",
+"label.delete.backup": "Delete Backup",
+"label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
+"label.delete.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.certificate": "Delete certificate",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.confirm": "Delete?",
+"label.delete.dedicated.vlan.range": "Deleted dedicated VLAN/VNI range",
+"label.delete.domain": "Delete Domain",
+"label.delete.events": "Delete events",
+"label.delete.f5": "Delete F5",
+"label.delete.gateway": "Delete gateway",
+"label.delete.instance.group": "Delete Instance Group",
+"label.delete.internal.lb": "Delete Internal LB",
+"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.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "Delete project",
+"label.delete.project.role": "Delete Project Role",
+"label.delete.role": "Delete Role",
+"label.delete.rule": "Delete rule",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.setting": "Delete setting",
+"label.delete.snapshot.policy": "Delete Snapshot Policy",
+"label.delete.srx": "Delete SRX",
+"label.delete.sslcertificate": "Delete SSL Certificate",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"label.delete.volumes": "Data Volumes to be deleted",
+"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.vpn.user": "Delete VPN user",
+"label.deleteconfirm": "Please confirm that you would like to delete this",
+"label.deleteprofile": "Delete Profile",
+"label.deleting": "Deleting",
+"label.deleting.failed": "Deleting Failed",
+"label.deleting.iso": "Deleting ISO",
+"label.deleting.processing": "Deleting....",
+"label.deleting.template": "Deleting template",
+"label.demote.project.owner": "Demote account to Regular role",
+"label.demote.project.owner.user": "Demote user to Regular role",
+"label.deny": "Deny",
+"label.deployasis":"Deploy As-Is",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Description",
+"label.destcidr": "Destination CIDR",
+"label.destination": "Destination",
+"label.destinationphysicalnetworkid": "Destination physical network ID",
+"label.destinationzoneid": "Destination Zone",
+"label.destroy": "Destroy",
+"label.destroy.kubernetes.cluster": "Destroy Kubernetes cluster",
+"label.destroy.router": "Destroy router",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "Detaching Disk",
+"label.details": "Details",
+"label.deviceid": "Device ID",
+"label.devices": "Devices",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "Shared Network IPs",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "Disable Autoscale",
+"label.disable.host": "Disable Host",
+"label.disable.storage": "Disable Storage Pool",
+"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.disconnected": "Last Disconnected",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.access": "Disk offering access",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "Disk Offerings",
+"label.disk.size": "Disk Size",
+"label.disk.volume": "Disk Volume",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopstotal": "Disk IOPS",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "Disk Offering",
+"label.diskofferingdisplaytext": "Disk Offering",
+"label.diskofferingid": "Disk Offering",
+"label.disksize": "Disk Size (in GB)",
+"label.disksizeallocated": "Disk Allocated",
+"label.disksizeallocatedgb": "Allocated",
+"label.disksizetotal": "Disk Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeused": "Disk Size Used",
+"label.disksizeusedgb": "Used",
+"label.display.text": "Display Text",
+"label.displayname": "Display Name",
+"label.displaytext": "Description",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS domain for Guest Networks",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domain",
+"label.domain.details": "Domain details",
+"label.domain.id": "Domain ID",
+"label.domain.name": "Domain Name",
+"label.domain.router": "Domain router",
+"label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
+"label.domainid": "Domain",
+"label.domainname": "Domain",
+"label.domainpath": "Domain",
+"label.domains": "Domains",
+"label.done": "Done",
+"label.double.quotes.are.not.allowed": "Double quotes are not allowed",
+"label.download": "Download",
+"label.download.kubeconfig.cluster": "Download kubeconfig for the cluster <br><br> The <code><b>kubectl</b></code> command-line tool uses kubeconfig files to find the information it needs to choose a cluster and communicate with the API server of a cluster.",
+"label.download.kubectl": "Download <code><b>kubectl</b></code> tool for cluster's Kubernetes version",
+"label.download.kubernetes.cluster.config": "Download Kubernetes cluster config",
+"label.download.progress": "Download Progress",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "Drag to new position",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "Edit",
+"label.edit.acl.list": "Edit ACL List",
+"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.project.role": "Edit Project Role",
+"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.user": "Edit user",
+"label.edit.vpc": "Edit VPC",
+"label.egress": "Egress",
+"label.egress.default.policy": "Egress Default Policy",
+"label.egress.rule": "Egress rule",
+"label.egress.rules": "Egress rules",
+"label.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "Elastic",
+"label.email": "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.storage": "Enable Storage Pool",
+"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": "End",
+"label.end.ip": "End IP",
+"label.end.reserved.system.ip": "End Reserved system IP",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "By date (end)",
+"label.endip": "End IP",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "End Port",
+"label.enter.token": "Enter token",
+"label.error": "Error",
+"label.error.caught": "Error caught",
+"label.error.code": "Error Code",
+"label.error.file.read": "Cannot read file",
+"label.error.file.upload": "File upload failed",
+"label.error.rules.file.import": "Please choose a valid CSV rules file",
+"label.error.setting": "Error setting",
+"label.error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
+"label.error.upper": "ERROR",
+"label.error.volume.upload": "Please choose a file",
+"label.espencryption": "ESP Encryption",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "ESP Lifetime (second)",
+"label.esppolicy": "ESP policy",
+"label.event": "Event",
+"label.event.archived": "Event(s) Archived",
+"label.event.deleted": "Event(s) Deleted",
+"label.event.timeline": "Event Timeline",
+"label.events": "Events",
+"label.every": "Every",
+"label.example": "Example",
+"label.example.plugin": "ExamplePlugin",
+"label.existingnetworks": "Existing networks",
+"label.expunge": "Expunge",
+"label.expunged": "Expunged",
+"label.expunging": "Expunging",
+"label.external.link": "External link",
+"label.externalid": "External Id",
+"label.externalloadbalanceripaddress": "External load balancer IP address",
+"label.extra": "Extra Arguments",
+"label.f5": "F5",
+"label.f5.details": "F5 details",
+"label.f5.ip.loadbalancer": "F5 Big Ip Load Balancer",
+"label.failed": "Failed",
+"label.featured": "Featured",
+"label.fetch.latest": "Fetch latest",
+"label.files": "Alternate Files to Retrieve",
+"label.filter": "Filter",
+"label.filterby": "Filter by",
+"label.fingerprint": "FingerPrint",
+"label.firewall": "Firewall",
+"label.firstname": "First Name",
+"label.firstname.lower": "firstname",
+"label.fix.errors": "Fix errors",
+"label.fixed": "Fixed Offering",
+"label.for": "for",
+"label.forbidden": "Forbidden",
+"label.forced": "Force",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.forgedtransmits": "Forged Transmits",
+"label.format": "Format",
+"label.french.azerty.keyboard": "French AZERTY keyboard",
+"label.friday": "Friday",
+"label.from": "from",
+"label.from.lb": "from LB",
+"label.full": "Full",
+"label.full.path": "Full path",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"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.global.settings": "Global Settings",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "Volume",
+"label.go.back": "Go Back",
+"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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "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.guestcidraddress": "Guest CIDR",
+"label.guestendip": "Guest end IP",
+"label.guestgateway": "Guest Gateway",
+"label.guestipaddress": "Guest IP Address",
+"label.guestiptype": "Guest Type",
+"label.guestnetmask": "Guest Netmask",
+"label.guestnetwork": "Guest Network",
+"label.guestnetworkid": "Network ID",
+"label.guestnetworkname": "Network Name",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Guest start IP",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.guestvmcidr": "CIDR",
+"label.ha": "HA",
+"label.ha.configure": "Configure HA",
+"label.ha.disable": "Disable HA",
+"label.ha.enable": "Enable HA",
+"label.haenable": "HA Enabled",
+"label.hahost": "HA Enabled",
+"label.haprovider": "HA Provider",
+"label.hardware": "Hardware",
+"label.hastate": "HA State",
+"label.header.backup.schedule": "You can set up recurring backup schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
+"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.hideipaddressusage": "Hide IP Address Usage",
+"label.hints": "Hints",
+"label.home": "Home",
+"label.host": "IP Address",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.host.ueficapability": "UEFI Supported",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Hourly",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor capabilities",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor Version",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.i.accept.all.license.agreements": "I accept all license agreement",
+"label.icmp": "ICMP",
+"label.icmpcode": "ICMP Code",
+"label.icmpcode.end.port": "ICMP Code / End Port",
+"label.icmptype": "ICMP Type",
+"label.icmptype.start.port": "ICMP Type / Start Port",
+"label.id": "ID",
+"label.identity.and.access": "Identity and Access",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE Encryption",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE lifetime (second)",
+"label.ikepolicy": "IKE policy",
+"label.images": "Images",
+"label.import.backup.offering": "Import Backup Offering",
+"label.import.offering": "Import Offering",
+"label.import.role": "Import Role",
+"label.in.progress": "in progress",
+"label.in.progress.for": "in progress for",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastructure",
+"label.ingress": "Ingress",
+"label.ingress.rule": "Ingress Rule",
+"label.initiated.by": "Initiated By",
+"label.insideportprofile": "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.addzoneintro.subtitle": "What is a zone?",
+"label.installwizard.addzoneintro.title": "Let's add a zone",
+"label.installwizard.click.launch": "Click the launch button.",
+"label.installwizard.subtitle": "This guide will aid you in setting up your CloudStack™ installation",
+"label.installwizard.title": "Hello and Welcome to CloudStack™",
+"label.instance": "Instance",
+"label.instance.groups": "Instance Groups",
+"label.instance.name": "Instance Name",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "Internal name",
+"label.instanceport": "Instance Port",
+"label.instances": "Instances",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"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.internaldns1": "Internal DNS 1",
+"label.internaldns2": "Internal DNS 2",
+"label.internallb.description": "Brief description of the Internal LB",
+"label.internallb.name.description": "Unique name for Internal LB",
+"label.internallb.sourceip.description": "Brief description of the Internal LB",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "Interval Type",
+"label.introduction.to.cloudstack": "Introduction to CloudStack™",
+"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 Address",
+"label.ip.allocations": "IP Allocations",
+"label.ip.or.fqdn": "IP or FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "IP Ranges",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP Address",
+"label.ipaddress1": "IP Address",
+"label.ipaddress2": "IP Address",
+"label.iplimit": "Public IP Limits",
+"label.ips": "IPs",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.in.progress": "is in progress",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Is Shared",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Custom Disk Size",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "Dedicated",
+"label.isdefault": "Is Default",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "Extractable",
+"label.isfeatured": "Featured",
+"label.isforced": "Force Delete",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.iso.id": "ISO ID",
+"label.iso.name": "ISO name",
+"label.isoid": "ISO",
+"label.isolated": "Isolated",
+"label.isolated.networks": "Isolated networks",
+"label.isolatedpvlanid": "Secondary VLAN ID",
+"label.isolatedpvlantype": "Secondary VLAN Type",
+"label.isolation.method": "Isolation method",
+"label.isolation.mode": "Isolation Mode",
+"label.isolationmethod": "Isolation method",
+"label.isolationmethods": "Isolation method",
+"label.isolationuri": "Isolation URI",
+"label.isoname": "Attached ISO",
+"label.isos": "ISOs",
+"label.isostate": "ISO State",
+"label.ispasswordenabled": "Password Enabled",
+"label.ispersistent": "Persistent ",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Public",
+"label.isready": "Ready",
+"label.isredundantrouter": "Redundant Router",
+"label.isrouting": "Routing",
+"label.isself": "Self",
+"label.isshared": "Shared",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is System",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Item listing",
+"label.items": "items",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Keep",
+"label.keep.colon": "Keep:",
+"label.key": "Key",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "Keyboard type",
+"label.keypair": "SSH Key Pair",
+"label.kubeconfig.cluster": "Kubernetes Cluster Config",
+"label.kubernetes": "Kubernetes",
+"label.kubernetes.cluster": "Kubernetes cluster",
+"label.kubernetes.cluster.create": "Create Kubernetes Cluster",
+"label.kubernetes.cluster.delete": "Delete Kubernetes Cluster",
+"label.kubernetes.cluster.details": "Kubernetes cluster details",
+"label.kubernetes.cluster.scale": "Scale Kubernetes Cluster",
+"label.kubernetes.cluster.start": "Start Kubernetes Cluster",
+"label.kubernetes.cluster.stop": "Stop Kubernetes Cluster",
+"label.kubernetes.cluster.upgrade": "Upgrade of Kubernetes Cluster",
+"label.kubernetes.dashboard": "Kubernetes Dashboard UI",
+"label.kubernetes.isos": "Kubernetes ISOs",
+"label.kubernetes.service": "Kubernetes Service",
+"label.kubernetes.version.add": "Add Kubernetes Version",
+"label.kubernetes.version.delete": "Delete Kubernetes Version",
+"label.kubernetes.version.details": "Kubernetes version details",
+"label.kubernetes.version.update": "Manage Kubernetes Version",
+"label.kubernetesversionid": "Kubernetes version",
+"label.kubernetesversionname": "Kubernetes version",
+"label.kvmnetworklabel": "KVM Traffic Label",
+"label.l2": "L2",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "Last Update",
+"label.lastannotated": "Last annotation date",
+"label.lastname": "Last Name",
+"label.lastname.lower": "lastname",
+"label.latest.events": "Latest events",
+"label.launch": "Launch",
+"label.launch.vm": "Launch Virtual Machine",
+"label.launch.zone": "Launch Zone",
+"label.lb.algorithm.leastconn": "Least connections",
+"label.lb.algorithm.roundrobin": "Round-robin",
+"label.lb.algorithm.source": "Source",
+"label.lb.cookie": "LbCookie",
+"label.lb.protocol.http": "HTTP",
+"label.lb.protocol.ssl": "SSL",
+"label.lb.protocol.tcp.proxy": "TCP-proxy",
+"label.lbdevicededicated": "Dedicated",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "Level",
+"label.license.agreements": "License agreements",
+"label.limit": "Limit",
+"label.limitcpuuse": "CPU Cap",
+"label.limits": "Configure Limits",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.linux": "Linux",
+"label.list.ciscoasa1000v": "ASA 1000v",
+"label.list.ciscovnmc": "Cisco VNMC",
+"label.list.nodes": "List nodes",
+"label.list.pods": "List pods",
+"label.list.services": "List services",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Load balancing policies",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "Load Balancing",
+"label.loading": "Loading",
+"label.local": "Local",
+"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.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "Login",
+"label.login.portal": "Portal Login",
+"label.login.single.signon": "Single Sign-On",
+"label.logout": "Logout",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.macaddress": "MAC Address",
+"label.macaddress.example": "The MAC Address. Example: 01:23:45:67:89:ab",
+"label.macaddresschanges": "MAC Address Changes",
+"label.macos": "MacOS",
+"label.make.project.owner": "Make account project owner",
+"label.make.user.project.owner": "Make user project owner",
+"label.makeredundant": "Make redundant",
+"label.manage": "Manage",
+"label.manage.resources": "Manage Resources",
+"label.manage.vpn.user": "Manage VPN Users",
+"label.managedstate": "Managed State",
+"label.management": "Management",
+"label.management.ips": "Management IP Addresses",
+"label.management.server": "Management Server",
+"label.management.servers": "Management Servers",
+"label.managementservers": "Number of Management Servers",
+"label.masternodes": "Master nodes",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU Cores",
+"label.maxcpunumber": "Max CPU Cores",
+"label.maxdatavolumeslimit": "Max data volumes limit",
+"label.maxerrorretry": "Max Error Retry",
+"label.maxguestslimit": "Max guest limit",
+"label.maxhostspercluster": "Max hosts per cluster",
+"label.maximum": "Maximum",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. Memory (MiB)",
+"label.maxnetwork": "Max. Networks",
+"label.maxprimarystorage": "Max. Primary Storage (GiB)",
+"label.maxproject": "Max. Projects",
+"label.maxpublicip": "Max. Public IPs",
+"label.maxsecondarystorage": "Max. Secondary Storage (GiB)",
+"label.maxsnapshot": "Max. Snapshots",
+"label.maxtemplate": "Max. Templates",
+"label.maxuservm": "Max. User VMs",
+"label.maxvolume": "Max. Volumes",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "You may now continue.",
+"label.mb.memory": "MB Memory",
+"label.memallocated": "Mem Allocation",
+"label.memory": "Memory",
+"label.memory.maximum.mb": "Max Memory (in MB)",
+"label.memory.mb": "Memory (in MB)",
+"label.memory.total": "Memory Total",
+"label.memory.used": "Memory Used",
+"label.memoryallocated": "Memory Allocated",
+"label.memoryallocatedgb": "Memory Allocated",
+"label.memorylimit": "Memory limits (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Memory Allocated",
+"label.memorytotalgb": "Memory Total",
+"label.memoryused": "Used Memory",
+"label.memoryusedgb": "Memory Used",
+"label.memused": "Memory Usage",
+"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.destroyed.instances": "Destroyed Instances",
+"label.menu.featured.isos": "Featured ISOs",
+"label.menu.featured.templates": "Featured Templates",
+"label.menu.ipaddresses": "IP Addresses",
+"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.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.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Stopped Instances",
+"label.menu.storage": "Storage",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtual Appliances",
+"label.menu.virtual.resources": "Virtual Resources",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.data.from.image.store": "Migrate Data from Image store",
+"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.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.migrating": "Migrating",
+"label.migrating.data": "Migrating Data",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.min_balance": "Min Balance",
+"label.mincpunumber": "Min CPU Cores",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minmaxiops": "Min IOPS / Max IOPS",
+"label.minmemory": "Min Memory (in MB)",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "Monday",
+"label.monitor": "Monitor",
+"label.monthly": "Monthly",
+"label.more.access.dashboard.ui": "More about accessing dashboard UI",
+"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.optional": "Name (Optional)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "NAT Port Range",
+"label.ncc": "NCC",
+"label.ncc.delete": "Delete NCC",
+"label.ncc.details": "NCC Details",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.netscaler.mpx": "NetScaler MPX LoadBalancer",
+"label.netscaler.sdx": "NetScaler SDX LoadBalancer",
+"label.netscaler.vpx": "NetScaler VPX LoadBalancer",
+"label.network": "Network",
+"label.network.acl": "Network ACL",
+"label.network.acl.lists": "Network ACL Lists",
+"label.network.acls": "Network ACLs",
+"label.network.addvm": "Add network to VM",
+"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.label.display.for.blank.value": "Use default gateway",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Network Offerings",
+"label.network.service.providers": "Network Service Providers",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network domain",
+"label.networkid": "Network",
+"label.networking.and.security": "Networking and security",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Network limits",
+"label.networkname": "Network Name",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Network Rate (Mb/s)",
+"label.networkread": "Network Read",
+"label.networks": "Networks",
+"label.networkspeed": "Network Speed",
+"label.networktype": "Network Type",
+"label.networkwrite": "Network Write",
+"label.new": "New",
+"label.new.instance.group": "New Instance Group",
+"label.new.password": "New Password",
+"label.new.project": "New Project",
+"label.new.secondaryip.description": "Enter new secondary IP address",
+"label.new.tag": "New Tag",
+"label.new.vm": "New VM",
+"label.newdiskoffering": "New Offering",
+"label.newinstance": "New instance",
+"label.newname": "New Name",
+"label.newsize": "New Size (GB)",
+"label.next": "Next",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Storage",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Path",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "NIC adapter type",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"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.matching.offering": "No matching offering found",
+"label.no.security.groups": "No Available Security Groups",
+"label.noderootdisksize": "Node root disk size (in GB)",
+"label.nodiskcache": "No disk cache",
+"label.none": "None",
+"label.noselect": "No thanks",
+"label.not.found": "Not Found",
+"label.not.suitable": "Not Suitable",
+"label.notifications": "Notifications",
+"label.num.cpu.cores": "# of CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Number of Clusters",
+"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.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "Number of Retries",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of": "of",
+"label.of.month": "of month",
+"label.offerha": "Offer HA",
+"label.offeringtype": "Compute Offering Type",
+"label.ok": "OK",
+"label.open.documentation": "Open Documentation",
+"label.open.url": "Open URL in browser",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight Controller",
+"label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
+"label.opendaylight.controllers": "OpenDaylight Controllers",
+"label.operation": "Operation",
+"label.optional": "Optional",
+"label.order": "Order",
+"label.oscategoryid": "OS Preference",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.overprovisionfactor": "Overprovisioning Factor",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.override.rootdisk.size": "Override Root Disk Size",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovf.properties": "vApp Properties",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 Traffic Label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM Traffic Label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Owned Public IP Addresses",
+"label.owner.account": "Owner Account",
+"label.owner.domain": "Owner Domain",
+"label.owners": "Owners",
+"label.pa": "Palo Alto",
+"label.page": "page",
+"label.palo.alto.details": "Palo Alto details",
+"label.palo.alto.firewall": "Palo Alto Firewall",
+"label.palp": "Palo Alto Log Profile",
+"label.params": "Parameters",
+"label.parent.domain": "Parent Domain",
+"label.parentdomainname": "Parent Domain",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "Password",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "Password Enabled",
+"label.path": "Path",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Virtual Router",
+"label.payload": "Payload",
+"label.pcidevice": "GPU",
+"label.per.account": "Per Account",
+"label.per.zone": "Per Zone",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.perform.fresh.checks": "Perform fresh checks",
+"label.performfreshchecks": "Perform fresh checks",
+"label.permission": "Permission",
+"label.permissions": "permissions",
+"label.physical.network": "Physical Network",
+"label.physical.network.id": "Physical network ID",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "Physical Network",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING storage IP",
+"label.pkcs.private.certificate": "PKCS#8 Private certificate",
+"label.plannermode": "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.podid": "Pod",
+"label.podname": "Pod name",
+"label.pods": "Pods",
+"label.port": "Port",
+"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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.preferred": "Prefered",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "Previous",
+"label.primary": "Primary",
+"label.primary.network": "Primary Network",
+"label.primary.storage": "Primary Storage",
+"label.primary.storage.allocated": "Primary Storage Allocated",
+"label.primary.storage.count": "Primary Storage Pools",
+"label.primary.storage.used": "Primary Storage Used",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "Primary Storage",
+"label.private.gateway": "Private Gateway",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Private IP Range",
+"label.private.ips": "Private IP Addresses",
+"label.private.registry": "Private Registry",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Private IP Address",
+"label.privatekey": "Private Key",
+"label.privatekey.password": "Private Key Password",
+"label.privatenetwork": "Private network",
+"label.privateport": "Private Port",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "Project",
+"label.project.dashboard": "Project dashboard",
+"label.project.ids": "Project IDs",
+"label.project.invitation": "Project Invitations",
+"label.project.invite": "Invite to project",
+"label.project.name": "Project name",
+"label.project.owner": "Project Owner(s)",
+"label.project.role": "Project Role",
+"label.project.role.permissions": "Project Role Permissions",
+"label.project.roles": "Project Roles",
+"label.project.view": "Project View",
+"label.projectaccountname": "Project Account Name",
+"label.projectid": "Project ID",
+"label.projectlimit": "Project Limits",
+"label.projectname": "Project",
+"label.projects": "Projects",
+"label.promiscuousmode": "Promiscuous Mode",
+"label.property": "Property",
+"label.protocol": "Protocol",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Providers",
+"label.provisioning": "Provisioning",
+"label.provisioningtype": "Provisioning Type",
+"label.provisioningtype.fat": "Fat Provisioning",
+"label.provisioningtype.sparse": "Sparse Provisioning",
+"label.provisioningtype.thin": "Thin Provisioning",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Public IP Address",
+"label.public.ip.addresses": "Public IP Addresses",
+"label.public.ips": "Public IP Addresses",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "Public network",
+"label.public.traffic": "Public traffic",
+"label.public.zone": "Public Zone",
+"label.publicinterface": "Public Interface",
+"label.publicip": "IP Address",
+"label.publickey": "Public Key",
+"label.publicnetwork": "Public network",
+"label.publicport": "Public Port",
+"label.purpose": "Purpose",
+"label.pxe.server.type": "Pxe Server Type",
+"label.qostype": "QoS Type",
+"label.quickview": "Quick view",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.email.edit": "Edit Email Template",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "All Accounts",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"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.quota_enforce": "Enforce Quota",
+"label.rados.monitor": "RADOS Monitor",
+"label.rados.pool": "RADOS Pool",
+"label.rados.secret": "RADOS Secret",
+"label.rados.user": "RADOS User",
+"label.ram": "RAM",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.read": "Read",
+"label.read.io": "Read (IO)",
+"label.readonly": "Read-Only",
+"label.reason": "Reason",
+"label.reboot": "Reboot",
+"label.receivedbytes": "Bytes Received",
+"label.recent.errors": "Recent Errors",
+"label.recover.vm": "Recover VM",
+"label.redundantrouter": "Redundant Router",
+"label.redundantrouterstate": "Redundant state",
+"label.redundantstate": "Redundant state",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Refresh",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.register.template": "Register Template",
+"label.reinstall.vm": "Reinstall VM",
+"label.reject": "Reject",
+"label.related": "Related",
+"label.relationaloperator": "Operator",
+"label.release": "Release",
+"label.release.account": "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.releasing.ip": "Releasing IP",
+"label.remind.later": "Remind me later",
+"label.remove": "Remove",
+"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.project.role": "Remove project role",
+"label.remove.project.user": "Remove user 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.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.report.bug": "Report Issue",
+"label.required": "Required",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "Reserved system gateway",
+"label.reserved.system.ip": "Reserved System IP",
+"label.reserved.system.netmask": "Reserved system netmask",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "End Reserved system IP",
+"label.reservedsystemgateway": "Reserved system gateway",
+"label.reservedsystemnetmask": "Reserved system netmask",
+"label.reservedsystemstartip": "Start Reserved system IP",
+"label.reset": "Reset",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "Reset VPN connection",
+"label.resetvm": "Reset VM",
+"label.resource": "Resource",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "Resource Limits",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "Resources",
+"label.resourcestate": "Resource state",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "Restart network",
+"label.restart.vpc": "Restart VPC",
+"label.restartrequired": "Restart required",
+"label.restore": "Restore",
+"label.restore.volume.attach": "Restore Volume and Attach",
+"label.retry.interval": "Retry Interval",
+"label.review": "Review",
+"label.revoke.project.invite": "Revoke invitation",
+"label.revokeinvitationconfirm": "Please confirm that you would like to revoke this invitation?",
+"label.role": "Role",
+"label.rolename": "Role",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Root disk controller",
+"label.rootdiskcontrollertypekvm": "Root disk controller",
+"label.router.health.check.last.updated": "Last updated",
+"label.router.health.check.name": "Check name",
+"label.router.health.check.success": "Success",
+"label.router.health.checks": "Health Checks",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "Type",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "Rules",
+"label.rules.file": "Rules File",
+"label.rules.file.import.description": "Click or drag rule defintions CSV file to import",
+"label.run.proxy.locally": "Run proxy locally",
+"label.running": "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.disable": "SAML Disable",
+"label.saml.enable": "SAML Enable",
+"label.samlenable": "Authorize SAML SSO",
+"label.samlentity": "Identity Provider",
+"label.saturday": "Saturday",
+"label.save": "Save",
+"label.save.and.continue": "Save and continue",
+"label.save.changes": "Save changes",
+"label.save.new.rule": "Save new Rule",
+"label.saving.processing": "Saving....",
+"label.scale.vm": "Scale VM",
+"label.scale.up.policy": "SCALE UP POLICY",
+"label.scaledown.policy": "ScaleDown Policy",
+"label.scaleup.policy": "ScaleUp Policy",
+"label.schedule": "Schedule",
+"label.scheduled.backups": "Scheduled Backups",
+"label.scheduled.snapshots": "Scheduled Snapshots",
+"label.scope": "Scope",
+"label.search": "Search",
+"label.secondary.isolated.vlan.type.isolated": "Isolated",
+"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.vm": "Secondary storage VM",
+"label.secondary.used": "Secondary Storage Used",
+"label.secondaryips": "Secondary IPs",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "Secret Key",
+"label.secured": "Secured",
+"label.security.group.name": "Security Group Name",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Enabled",
+"label.securitygroup": "Security Group",
+"label.securitygroupenabled": "Security Groups Enabled",
+"label.securitygroups": "Security Groups",
+"label.securitygroupsenabled": "Security Groups Enabled",
+"label.select": "Select",
+"label.select-view": "Select view",
+"label.select.a.zone": "Select a zone",
+"label.select.deployment.infrastructure": "Select deployment infrastructure",
+"label.select.host": "Select host",
+"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": "Select Project",
+"label.select.projects": "Select Projects",
+"label.select.region": "Select region",
+"label.select.tier": "Select Tier",
+"label.select.vm.for.static.nat": "Select VM for static NAT",
+"label.select.zones": "Select zones",
+"label.self": "Mine",
+"label.selfexecutable": "Self",
+"label.semanticversion": "Semantic version",
+"label.sent": "Date",
+"label.sentbytes": "Bytes Sent",
+"label.server": "Server",
+"label.server.certificate": "Server certificate",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastic LB",
+"label.service.lb.inlinemodedropdown": "Mode",
+"label.service.lb.lbisolationdropdown": "LB isolation",
+"label.service.lb.netscaler.servicepackages": "Netscaler Service Packages",
+"label.service.lb.netscaler.servicepackages.description": "Service Package Description",
+"label.service.offering": "Service Offering",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundant router capability",
+"label.service.state": "Service State",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "Elastic IP",
+"label.servicecapabilities": "Service Capabilities",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Compute Offering",
+"label.serviceofferingname": "Compute Offering",
+"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.setting": "Setting",
+"label.settings": "Settings",
+"label.setup": "Setup",
+"label.setup.network": "Set up Network",
+"label.setup.zone": "Set up Zone",
+"label.shared": "Shared",
+"label.sharedexecutable": "Shared",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.sharewith": "Share With",
+"label.show.ingress.rule": "Show Ingress Rule",
+"label.showing": "Showing",
+"label.shrinkok": "Shrink OK",
+"label.shutdown.provider": "Shutdown provider",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.s2scustomergatewayid": "Site to Site customer gateway ID",
+"label.s2svpngatewayid": "Site to Site VPN gateway ID",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.site.to.site.vpn.connections": "Site-to-site VPN Connections",
+"label.size": "Size",
+"label.sizegb": "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.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Name",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "Snapshot Limits",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Socket Timeout",
+"label.source.based": "SourceBased",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Source CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenatsupported": "Source NAT Supported",
+"label.sourcenattype": "Supported Source NAT type",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "Specify VXLAN",
+"label.specifyipranges": "Specify IP ranges",
+"label.specifyvlan": "Specify VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.srx.firewall": "Juniper SRX Firewall",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.ssh.port": "SSH Port",
+"label.sshkeypair": "New SSH Key Pair",
+"label.sshkeypairs": "SSH keypairs",
+"label.sslcertificates": "SSL Certificates",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start": "Start",
+"label.start.ip": "Start IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Start Reserved system IP",
+"label.start.rolling.maintenance": "Start Rolling Maintenance",
+"label.start.rolling.maintenance.payload": "Payload",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "By date (start)",
+"label.startip": "Start IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start Port",
+"label.startquota": "Quota Value",
+"label.state": "State",
+"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.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie name",
+"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": "Stopped VMs",
+"label.storage": "Storage",
+"label.storage.tags": "Storage Tags",
+"label.storage.traffic": "Storage Traffic",
+"label.storageid": "Primary Storage",
+"label.storagemotionenabled": "Storage Motion Enabled",
+"label.storagepolicy": "Storage policy",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "Storage Tags",
+"label.storagetype": "Storage Type",
+"label.strict": "Strict",
+"label.subdomainaccess": "Subdomain Access",
+"label.submit": "Submit",
+"label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Succeeded",
+"label.success": "Success",
+"label.success.set": "Successfully set",
+"label.success.updated": "Successfully updated",
+"label.suitability": "Suitability",
+"label.suitable": "Suitable",
+"label.summary": "Summary",
+"label.sunday": "Sunday",
+"label.supportedservices": "Supported Services",
+"label.supportsha": "Supports HA",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"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.offerings": "System Offerings",
+"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.vms": "System VMs",
+"label.system.wide.capacity": "System-wide capacity",
+"label.systemvmtype": "System VM Type",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Target IQN",
+"label.tariffactions": "Actions",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Task completed",
+"label.tcp": "TCP",
+"label.tcp.proxy": "TCP Proxy",
+"label.template": "Select a template",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templateid": "Select a template",
+"label.templateiso": "Template/ISO",
+"label.templatelimit": "Template Limits",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Template",
+"label.templatetype": "Template Type",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "Tier details",
+"label.tiername": "Tier",
+"label.time": "Time",
+"label.time.colon": "Time:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "Timezone",
+"label.timezone.colon": "Timezone:",
+"label.to": "to",
+"label.token": "Token",
+"label.token.for.dashboard.login": "Token for dashboard login can be retrieved using following command",
+"label.total": "Total",
+"label.total.hosts": "Total Hosts",
+"label.total.memory": "Total Memory",
+"label.total.network": "Total Networks",
+"label.total.storage": "Total Storage",
+"label.total.vms": "Total VMs",
+"label.total.volume": "Total Volumes",
+"label.totalcpu": "Total CPU",
+"label.traffic.label": "Traffic label",
+"label.traffic.types": "Traffic Types",
+"label.traffictype": "Traffic Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.try.again": "Try Again",
+"label.tuesday": "Tuesday",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.udp": "UDP",
+"label.uk.keyboard": "UK keyboard",
+"label.unauthorized": "Unauthorized",
+"label.unavailable": "Unavailable",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unique.name.tier": "A unique name of the tier",
+"label.unit": "Usage Unit",
+"label.unknown": "Unknown",
+"label.unlimited": "Unlimited",
+"label.untagged": "Untagged",
+"label.update.instance.group": "Update Instance Group",
+"label.update.physical.network": "Update Physical Network",
+"label.update.project.resources": "Update project resources",
+"label.update.project.role": "Update project role",
+"label.update.ssl": " SSL Certificate",
+"label.update.ssl.cert": " SSL Certificate",
+"label.update.to": "updated to",
+"label.update.traffic.label": "Update Traffic Labels",
+"label.update.vmware.datacenter": "Update VMware Datacenter",
+"label.updating": "Updating",
+"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.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.local.timezone": "Use Local Timezone",
+"label.use.kubectl.access.cluster": "<code><b>kubectl</b></code> and <code><b>kubeconfig</b></code> file to access cluster",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Use VM IPs",
+"label.used": "Used",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "User",
+"label.user.as.admin": "Make User the Project Admin",
+"label.user.conflict": "Conflict",
+"label.user.details": "User details",
+"label.user.source": "source",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "Username",
+"label.users": "Users",
+"label.usersource": "User Type",
+"label.usevpc": "VPC",
+"label.using.cli": "Using CLI",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "Value",
+"label.vcdcname": "vCenter DC name",
+"label.vcenter": "VMware Datacenter 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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "vCenter IP Address",
+"label.vcsdeviceid": "ID",
+"label.version": "Version",
+"label.versions": "Versions",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"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.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.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.virtualmachinedisplayname": "VM name",
+"label.virtualmachineid": "VM ID",
+"label.virtualmachinename": "VM name",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm": "VM",
+"label.vm.add": "Add Instance",
+"label.vm.destroy": "Destroy",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "Reboot",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Start",
+"label.vm.stop": "Stop",
+"label.vmdisplayname": "VM display name",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "VM IP Address",
+"label.vmlimit": "Instance Limits",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "VMs in tier",
+"label.vmstate": "VM State",
+"label.vmtotal": "Total of VMs",
+"label.vmware.storage.policy": "VMWare Storage Policy",
+"label.vmwaredcid": "VMware Datacenter ID",
+"label.vmwaredcname": "VMware Datacenter Name",
+"label.vmwaredcvcenter": "VMware Datacenter vCenter",
+"label.vmwarenetworklabel": "VMware Traffic Label",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "Volume Group",
+"label.volume": "Volume",
+"label.volumeid": "Volume",
+"label.volume.details": "Volume details",
+"label.volume.empty": "No data volumes attached to this VM",
+"label.volume.ids": "Volume ID's",
+"label.volume.migrated": "Volume migrated",
+"label.volume.volumefileupload.description": "Click or drag file to this area to upload",
+"label.volumechecksum": "MD5 checksum",
+"label.volumechecksum.description": "Use the hash that you created at the start of the volume upload procedure",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "Volume Group",
+"label.volumeids": "Volumes to be deleted",
+"label.volumelimit": "Volume Limits",
+"label.volumename": "Volume Name",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.access": "VPC offering access",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpcofferingid": "VPC Offering",
+"label.vpctotal": "Total VPCs",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN Connection",
+"label.vpn.gateway": "VPN Gateway",
+"label.vpn.users": "VPN Users",
+"label.vpncustomergateway": "IP address of the remote gateway",
+"label.vpncustomergateway.cidrlist": "Comma separated guest CIDR list of the remote subnets.",
+"label.vpncustomergateway.esplifetime": "The phase-2 lifetime of the security association in seconds",
+"label.vpncustomergateway.ikelifetime": "phase-1 lifetime of the security association in seconds",
+"label.vpncustomergateway.secretkey": "Enter a secret key value",
+"label.vpncustomergatewayid": "VPN Customer Gateway",
+"label.vpncustomergatewayname": "Unique name for VPN customer gateway",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "Name",
+"label.vsmdevicestate": "State",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vspherestoragepolicy": "vSphere Storage Policy",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"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™?",
+"label.windows": "Windows",
+"label.with.snapshotid": "with snapshot ID",
+"label.write": "Write",
+"label.writeback": "Write-back disk caching",
+"label.writecachetype": "Write-cache Type",
+"label.writeio": "Write (IO)",
+"label.writethrough": "Write-through",
+"label.xennetworklabel": "XenServer Traffic Label",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "Yes",
+"label.yourinstance": "Your instance",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "Zone details",
+"label.zone.id": "Zone ID",
+"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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "Zones",
+"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",
+"message.acquire.ip.failed": "Failed to acquire IP",
+"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.acquire.ip": "Please confirm that you want to acquire new IP",
+"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.create.snapshot.from.vmsnapshot": "Please confirm that you want to create snapshot from VM Snapshot",
+"message.action.delete.backup.offering": "Please confirm that you want to delete this backup offering?",
+"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.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.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.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 the instance.",
+"message.action.destroy.systemvm": "Please confirm that you want to destroy the System VM.",
+"message.action.destroy.volume": "Please confirm that you want to destroy the 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.router.health.checks": "Health checks result will be fetched from router.",
+"message.action.router.health.checks.disabled.warning": "Please enable router health checks.",
+"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.stop.systemvm": "Please confirm that you want to stop this system VM.",
+"message.action.unmanage.cluster": "Please confirm that you want to unmanage the cluster.",
+"message.action.unmanage.virtualmachine": "Please confirm that you want to unmanage the virtual machine.",
+"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.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.egress.rule.failed": "Adding new Egress rule failed",
+"message.add.egress.rule.processing": "Adding new Egress rule...",
+"message.add.failed": "Adding failed",
+"message.add.firewall": "Add a firewall to zone",
+"message.add.firewall.rule.failed": "Adding new Firewall rule failed",
+"message.add.firewall.rule.processing": "Adding new Firewall rule...",
+"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.iprange.processing": "Adding IP Range...",
+"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.network.acl.failed": "Adding Network ACL List failed",
+"message.add.network.acl.processing": "Adding Network ACL List...",
+"message.add.network.failed": "Adding network failed",
+"message.add.network.processing": "Adding network...",
+"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.port.forward.failed": "Adding new Port Forwarding rule failed",
+"message.add.port.forward.processing": "Adding new Port Forwarding rule...",
+"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.private.gateway.failed": "Adding Private Gateway failed",
+"message.add.private.gateway.processing": "Adding Private Gateway...",
+"message.add.region": "Please specify the required information to add a new region.",
+"message.add.resource.description": "Add infrastructure resources",
+"message.add.resource.hint": "Add infrastructure resources - pods, clusters, primary/secondary storages.",
+"message.add.rule.failed": "Failed to add new rule",
+"message.add.rule.processing": "Adding new security-group rule...",
+"message.add.secondary.ipaddress.processing": "Add Secondary IP address...",
+"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.static.route.failed": "Failed to add static route",
+"message.add.static.route.processing": "Adding static route...",
+"message.add.system.service.offering": "Please fill in the following data to add a new system service offering.",
+"message.add.tag.failed": "Failed to add new tag",
+"message.add.tag.for.networkacl": "Add tag for NetworkACL",
+"message.add.tag.processing": "Adding new tag...",
+"message.add.template": "Please enter the following data to create your new template",
+"message.add.user.to.project": "This form is to enable adding specific users of an account to a project.<br>Furthermore, a ProjectRole may be added to the added user/account to allow/disallow API access at project level.<br> We can also specify the role with which the user should be added to a project - Admin/Regular; if not specified, it defaults to 'Regular'",
+"message.add.volume": "Please fill in the following data to add a new volume.",
+"message.add.vpn.connection.failed": "Adding VPN Connection failed",
+"message.add.vpn.connection.processing": "Adding VPN Connection...",
+"message.add.vpn.customer.gateway": "Adding VPN customer gateway",
+"message.add.vpn.customer.gateway.failed": "Failed to Add VPN customer gateway",
+"message.add.vpn.customer.gateway.processing": "Creation of VPN customer gateway is in progress",
+"message.add.vpn.gateway": "Please confirm that you want to add a VPN Gateway",
+"message.add.vpn.gateway.failed": "Adding VPN Gateway failed",
+"message.add.vpn.gateway.processing": "Adding VPN Gateway...",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "Adding host",
+"message.adding.netscaler.device": "Adding Netscaler device",
+"message.adding.netscaler.provider": "Adding Netscaler provider",
+"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.apply.success": "Apply Successfully",
+"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.assign.vm.failed": "Failed to assign VM",
+"message.assign.vm.processing": "Assigning VM...",
+"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.attach.volume.failed": "Failed to attach volume",
+"message.attach.volume.progress": "Attaching volume",
+"message.authorization.failed": "Session expired, authorization verification failed",
+"message.backup.attach.restore": "Please confirm that you want to restore and attach the volume from the backup?",
+"message.backup.create": "Are you sure you want create a VM backup?",
+"message.backup.offering.remove": "Are you sure you want to remove VM from backup offering and delete the backup chain?",
+"message.backup.restore": "Please confirm that you want to restore the vm backup?",
+"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.certificate.upload.processing": "Certificate upload in progress",
+"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.config.sticky.policy.failed": "Failed to configure sticky policy",
+"message.config.sticky.policy.processing": "Updating sticky policy...",
+"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.configure.ovs": "Are you sure you want to configure Ovs?",
+"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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "Please confirm that you would like to delete F5",
+"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.netscaler": "Please confirm that you would like to delete NetScaler",
+"message.confirm.delete.niciranvp": "Please confirm you want to delete Nicira Nvp Controller",
+"message.confirm.delete.pa": "Please confirm that you would like to delete Palo Alto",
+"message.confirm.delete.provider": "Please confirm that you would like to delete this provider?",
+"message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "Please confirm that you would like to delete SRX",
+"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": "All services provided by this virtual router will be interrupted. Please confirm that you want to stop this 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.storage": "Please confirm that you want to disable the storage pool",
+"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.storage": "Please confirm that you want to enable the storage pool",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "Please confirm that you would like to remove this IP range.",
+"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.compute.offering": "Compute offering created",
+"message.create.internallb": "Creating Internal LB",
+"message.create.internallb.failed": "Failed to create Internal LB",
+"message.create.internallb.processing": "Creation of Internal LB is in progress",
+"message.create.service.offering": "Service offering created",
+"message.create.snapshot.from.vmsnapshot.failed": "Failed to create Snapshot from VM Snapshot",
+"message.create.snapshot.from.vmsnapshot.progress": "Snapshot Creation in progress",
+"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.create.volume.failed": "Failed to Create volume",
+"message.create.volume.processing": "Volume creation in progress",
+"message.create.vpc.offering": "VPC offering created",
+"message.create.vpn.customer.gateway.failed": "VPN customer gateway creation failed",
+"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.datacenter.description": "Name of the datacenter on vCenter",
+"message.datastore.description": "Name of the datastore on vCenter",
+"message.data.migration": "Data Migration",
+"message.data.migration.progress": "Data Migration between image stores",
+"message.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"message.dedicating.cluster": "Dedicating Cluster...",
+"message.dedicating.host": "Dedicating Host...",
+"message.dedicating.pod": "Dedicating Pod...",
+"message.dedicating.zone": "Dedicating Zone...",
+"message.delete.account": "Please confirm that you want to delete this account.",
+"message.delete.acl.processing": "Removing ACL rule...",
+"message.delete.acl.rule": "Remove ACL rule",
+"message.delete.acl.rule.failed": "Failed to remove ACL rule",
+"message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
+"message.delete.backup": "Are you sure you want to delete the backup?",
+"message.delete.failed": "Delete fail",
+"message.delete.gateway": "Please confirm you want to delete the gateway",
+"message.delete.port.forward.processing": "Deleting Port Forwarding rule...",
+"message.delete.project": "Are you sure you want to delete this project?",
+"message.delete.rule.processing": "Deleting rule...",
+"message.delete.sslcertificate": "Please confirm that you would like to delete this certificate.",
+"message.delete.static.route.failed": "Failed to delete static route",
+"message.delete.static.route.processing": "Deleting static route...",
+"message.delete.tag.failed": "Failed to delete tag",
+"message.delete.tag.for.networkacl": "Remove tag for NetworkACL",
+"message.delete.tag.processing": "Deleting tag...",
+"message.delete.user": "Please confirm that you would like to delete this user.",
+"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.deleting.vm": "Deleting VM",
+"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.disable.vpn.failed": "Failed to disable VPN",
+"message.disable.vpn.processing": "Disabling VPN...",
+"message.disabling.network.offering": "Disabling network offering",
+"message.disabling.vpc.offering": "Disabling VPC offering",
+"message.disallowed.characters": "Disallowed characters: <,>",
+"message.discovering.feature": "Discovering features, please wait...",
+"message.disk.offering.created": "Disk offering created:",
+"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.acl.failed": "Failed to edit ACL rule",
+"message.edit.acl.processing": "Editing ACL rule...",
+"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.rule.failed": "Failed to edit rule",
+"message.edit.rule.processing": "Updating rule...",
+"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.netsacler.provider.failed": "failed to enable Netscaler provider",
+"message.enable.securitygroup.provider.failed": "failed to enable security group provider",
+"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.enable.vpn.failed": "Failed to enable VPN",
+"message.enable.vpn.processing": "Enabling VPN...",
+"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.error.access.key": "Please enter Access Key",
+"message.error.add.guest.network": "Either IPv4 fields or IPv6 fields need to be filled when adding a guest network",
+"message.error.add.secondary.ipaddress": "There was an error adding the secondary IP Address",
+"message.error.agent.password": "Please enter Agent password",
+"message.error.agent.username": "Please enter Agent username",
+"message.error.binaries.iso.url": "Please enter binaries ISO URL",
+"message.error.bucket": "Please enter Bucket",
+"message.error.cloudian.console": "Single-Sign-On failed for Cloudian Management Console. Please ask your administrator to fix integration issues.",
+"message.error.cluster.description": "Please enter Kubernetes cluster description",
+"message.error.cluster.name": "Please enter cluster name",
+"message.error.confirm.password": "Please confirm new password",
+"message.error.current.password": "Please enter current password",
+"message.error.custom.disk.size": "Please enter custom disk size",
+"message.error.date": "Please select a date",
+"message.error.description": "Please enter description",
+"message.error.discovering.feature": "Exception caught while discoverying features",
+"message.error.display.text": "Please enter display text",
+"message.error.domain": "Enter your domain, leave empty for ROOT domain",
+"message.error.enable.saml": "Unable to find users IDs to enable SAML Single Sign On, kindly enable it manually.",
+"message.error.endip": "Please enter End IP",
+"message.error.gateway": "Please enter Gateway",
+"message.error.host.name": "Please enter host name",
+"message.error.host.password": "Please enter host password",
+"message.error.host.tags": "Please enter host tags",
+"message.error.host.username": "Please enter host username",
+"message.error.hypervisor.type": "Please select hypervisor type",
+"message.error.input.value": "Please enter value",
+"message.error.internal.dns1": "Please enter Internal DNS 1",
+"message.error.internal.dns2": "Please enter Internal DNS 2",
+"message.error.internallb.instance.port": "Please specify a Instance Port",
+"message.error.internallb.name": "Please specify a name for the Internal LB",
+"message.error.internallb.source.port": "Please specify a Source Port",
+"message.error.invalid.range": "Please enter values from {min} to {max}",
+"message.error.ip.range": "Please enter valid range",
+"message.error.ipv4.address": "Please enter a valid IPv4 address",
+"message.error.ipv4.dns1": "Please enter IpV4 DNS 1",
+"message.error.ipv4.dns2": "Please enter IpV4 DNS 2",
+"message.error.ipv6.address": "Please enter a valid IP v6 address.",
+"message.error.ipv6.cidr": "Please enter IpV6 CIDR",
+"message.error.ipv6.dns1": "Please enter IpV6 DNS 1",
+"message.error.ipv6.dns2": "Please enter IpV6 DNS 2",
+"message.error.ipv6.gateway": "Please enter IpV6 Gateway",
+"message.error.ipv6.gateway.format": "Please enter a valid IPv6 Gateway.",
+"message.error.kubecluster.name": "Please enter Kubernetes cluster name",
+"message.error.kuberversion": "Please enter Kubernetes semantic version",
+"message.error.limit.value": "The value must not be less than",
+"message.error.loading.setting": "There was an error loading these settings.",
+"message.error.lun": "Please enter LUN #",
+"message.error.macaddress": "Please enter a valid MAC Address.",
+"message.error.name": "Please enter name",
+"message.error.netmask": "Please enter Netmask",
+"message.error.network.domain": "Please enter Network domain",
+"message.error.network.offering": "Please select network offering",
+"message.error.new.password": "Please enter new password",
+"message.error.nexus1000v.ipaddess": "Please enter Nexus 1000v IP Address",
+"message.error.nexus1000v.password": "Please enter Nexus 1000v Password",
+"message.error.nexus1000v.username": "Please enter Nexus 1000v Username",
+"message.error.number": "Please enter a valid number",
+"message.error.password": "Enter your password",
+"message.error.path": "Please enter Path",
+"message.error.provide.setting": "Must provide a valid key and value for setting",
+"message.error.rados.monitor": "Please enter RADOS Monitor",
+"message.error.rados.pool": "Please enter RADOS Pool",
+"message.error.rados.secret": "Please enter RADOS Secret",
+"message.error.rados.user": "Please enter RADOS User",
+"message.error.remove.nic": "There was an error",
+"message.error.remove.secondary.ipaddress": "There was an error removing the secondary IP Address",
+"message.error.required.input": "Please enter input",
+"message.error.retrieve.kubeconfig": "Unable to retrieve Kubernetes cluster config",
+"message.error.s3nfs.path": "Please enter S3 NFS Path",
+"message.error.s3nfs.server": "Please enter S3 NFS Server",
+"message.error.save.setting": "There was an error saving this setting.",
+"message.error.sbdomain": "Please enter SMB Domain",
+"message.error.sbdomain.password": "Please enter SMB Domain Password",
+"message.error.sbdomain.username": "Please enter SMB Domain Username",
+"message.error.secret.key": "Please enter Secret Key",
+"message.error.select": "Please select option",
+"message.error.select.domain.to.dedicate": "Please select domain to dedicate to",
+"message.error.select.zone.type": "Please select zone type below.",
+"message.error.server": "Please enter server",
+"message.error.serviceoffering.for.cluster": "Please select service offering for Kubernetes cluster",
+"message.error.size": "Please enter size in GB",
+"message.error.size.for.cluster": "Please enter size for Kubernetes cluster",
+"message.error.smb.password": "Please enter SMB Password",
+"message.error.smb.username": "Please enter SMB Username",
+"message.error.specify.sticky.name": "Please specify a sticky name",
+"message.error.sr.namelabel": "Please enter SR Name-Label",
+"message.error.startip": "Please enter Start IP",
+"message.error.storage.tags": "Please enter storage tags",
+"message.error.target.iqn": "Please enter Target IQN",
+"message.error.time": "Please select time",
+"message.error.traffic.label": "Please enter traffic label",
+"message.error.try.save.setting": "There was an error saving this setting. Please try again later.",
+"message.error.upload.iso.description": "Only one ISO can be uploaded at a time",
+"message.error.upload.template": "Template Upload Failed",
+"message.error.upload.template.description": "Only one template can be uploaded at a time",
+"message.error.url": "Please enter URL",
+"message.error.username": "Enter your username",
+"message.error.vcenter.datacenter": "Please enter vCenter Datacenter",
+"message.error.vcenter.datastore": "Please enter vCenter Datastore",
+"message.error.vcenter.host": "Please enter vCenter Host",
+"message.error.vcenter.password": "Please enter vCenter Password",
+"message.error.vcenter.username": "Please enter vCenter Username",
+"message.error.version.for.cluster": "Please select Kubernetes version for Kubernetes cluster",
+"message.error.vlan.range": "Please enter a valid VLAN/VNI range",
+"message.error.volume.name": "Please enter volume name",
+"message.error.volumne": "Please enter Volume",
+"message.error.volumne.group": "Please enter Volume Group",
+"message.error.zone": "Please select a zone",
+"message.error.zone.combined": "All Zones cannot be combined with any other zone",
+"message.error.zone.for.cluster": "Please select zone for Kubernetes cluster",
+"message.error.zone.name": "Please enter zone name",
+"message.error.zone.type": "Please select zone type",
+"message.fail.to.delete": "Failed to delete.",
+"message.failed.to.add": "Failed to add",
+"message.failed.to.assign.vms": "Failed to assign VMs",
+"message.failed.to.remove": "Failed to remove",
+"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.guestnetwork.state.allocated": "Indicates the network configuration is in allocated but not setup",
+"message.guestnetwork.state.destroy": "Indicates that the network is destroyed",
+"message.guestnetwork.state.implemented": "Indicates the network configuration is in use",
+"message.guestnetwork.state.implementing": "Indicates the network configuration is being implemented",
+"message.guestnetwork.state.setup": "Indicates the network configuration is setup",
+"message.guestnetwork.state.shutdown": "Indicates the network configuration is being destroyed",
+"message.host.dedicated": "Host Dedicated",
+"message.host.dedication.released": "Host dedication released",
+"message.info.cloudian.console": "Cloudian Management Console should open in another window",
+"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™; deployment. Clusters are contained within pods, and pods are contained within zones.<br/><br/>CloudStack™; 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™; 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™; 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™; 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™ is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack™ manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack™ to deploy, manage, and configure cloud computing environments.\n\nExtending beyond individual virtual machine images running on commodity hardware, CloudStack™ 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™; 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.interloadbalance.not.return.elementid": "error: listInternalLoadBalancerElements API doesn't return Internal LB Element Id",
+"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.kubeconfig.cluster.not.available": "Kubernetes cluster kubeconfig not available currently",
+"message.kubernetes.cluster.delete": "Please confirm that you want to destroy the cluster",
+"message.kubernetes.cluster.scale": "Please select desired cluster configuration",
+"message.kubernetes.cluster.start": "Please confirm that you want to start the cluster",
+"message.kubernetes.cluster.stop": "Please confirm that you want to stop the cluster",
+"message.kubernetes.cluster.upgrade": "Please select new Kubernetes version",
+"message.kubernetes.version.delete": "Please confirm that you want to delete this Kubernetes version",
+"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.launch.zone.description": "Zone is ready to launch; please proceed to the next step.",
+"message.launch.zone.hint": "Configure network components and traffic including IP addresses.",
+"message.ldap.group.import": "All The users from the given group name will be imported",
+"message.license.agreements.not.accepted": "License agreements not accepted",
+"message.link.domain.to.ldap": "Enable autosync for this domain in LDAP",
+"message.listnsp.not.return.providerid": "error: listNetworkServiceProviders API doesn't return VirtualRouter provider ID",
+"message.listview.subselect.multi": "(Ctrl/Cmd-click)",
+"message.load.host.failed": "Failed to load hosts",
+"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.login.failed": "Login Failed",
+"message.migrate.instance.confirm": "Please confirm the host you wish to migrate the virtual instance to.",
+"message.migrate.instance.select.host": "Please select a host for migration",
+"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.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.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...",
+"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.description": "Setup network and traffic",
+"message.network.error": "Network Error",
+"message.network.error.description": "Unable to reach the management server or a browser extension may be blocking the network request.",
+"message.network.hint": "Configure network components and public/guest/management traffic including IP addresses.",
+"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.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
+"message.network.secondaryip": "Please confirm that you would like to acquire a new secondary IP for this NIC. \n NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"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.datadisk": "The multidisk template has no data disk, please continue to next step.",
+"message.no.description": "No description entered.",
+"message.no.host.available": "No hosts are available for migration",
+"message.no.label.on.left": "No label on the left",
+"message.no.label.on.right": "No label on the right",
+"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.primary.stores": "No primary storage pools available for migration",
+"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.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.ovf.configurations": "OVF configurations available for the selected appliance. Please select the desired value. Incompatible compute offerings will get disbaled.",
+"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.path.description": "NFS: exported path from the server. VMFS: /datacenter name/datastore name. SharedMountPoint: path where primary storage is mounted, such as /mnt/primary",
+"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.enter.value": "Please enter values",
+"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.dedicated": "Pod Dedicated",
+"message.pod.dedication.released": "Pod dedication released",
+"message.portable.ip.delete.confirm": "Please confirm you want to delete Portable IP Range",
+"message.processing.complete": "Processing complete!",
+"message.protocol.description": "For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose NFS, PreSetup (VMFS or iSCSI or FiberChannel or vSAN or vVols) or DatastoreCluster. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or ocfs2.",
+"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.publicip.state.allocated": "The IP address is in used.",
+"message.publicip.state.allocating": "The IP Address is being propagated to other network elements and is not ready for use yet.",
+"message.publicip.state.free": "The IP address is ready to be allocated.",
+"message.publicip.state.releasing": "The IP address is being released for other network elements and is not ready for allocation.",
+"message.question.are.you.sure.you.want.to.add": "Are you sure you want to add",
+"message.read.accept.license.agreements": "Please read and accept the terms for the license agreements.",
+"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.release.ip.failed": "Failed to release IP",
+"message.releasing.dedicated.cluster": "Releasing dedicated cluster...",
+"message.releasing.dedicated.host": "Releasing dedicated host...",
+"message.releasing.dedicated.pod": "Releasing dedicated pod...",
+"message.releasing.dedicated.zone": "Releasing dedicated zone...",
+"message.remove.egress.rule.failed": "Removing Egress rule failed",
+"message.remove.egress.rule.processing": "Deleting Egress rule...",
+"message.remove.failed": "Removing failed",
+"message.remove.firewall.rule.failed": "Removing Firewall rule failed",
+"message.remove.firewall.rule.processing": "Deleting Firewall rule...",
+"message.remove.instance.failed": "Failed to remove instance",
+"message.remove.instance.processing": "Removing...",
+"message.remove.iprange.processing": "Removing IP Range...",
+"message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
+"message.remove.nic.processing": "Removing NIC...",
+"message.remove.port.forward.failed": "Removing Port Forwarding rule failed",
+"message.remove.region": "Are you sure you want to remove this region from this management server?",
+"message.remove.rule.failed": "Failed to delete rule",
+"message.remove.secondary.ipaddress.processing": "Removing Secondary IP address...",
+"message.remove.securitygroup.rule.processing": "Deleting security-group rule...",
+"message.remove.sticky.policy.failed": "Failed to remove sticky policy",
+"message.remove.sticky.policy.processing": "Removing sticky policy...",
+"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.request.failed": "Request Failed",
+"message.required.add.least.ip": "Please add at least 1 IP Range",
+"message.required.traffic.type": "Error in configuration! All required traffic types should be added and with multiple physical networks each network should have a label.",
+"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.reset.vpn.connection": "Please confirm that you want to reset VPN connection",
+"message.resize.volume.failed": "Failed to resize volume",
+"message.resource.not.found": "Resource not found",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.scale.processing": "Scale in progress",
+"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.destination.image.stores": "Please select Image Store(s) to which data is to be migrated 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.migration.policy": "Please select a migration Policy",
+"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.select.zone.description": "Select type of zone basic/advanced",
+"message.select.zone.hint": "This is the type of zone deployement that you want to use. Basic zone: provides 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). 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.server.description": "NFS, iSCSI, or PreSetup: IP address or DNS name of the storage device. VMWare PreSetup: IP address or DNS name of the vCenter server.",
+"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.setting.updated": "Setting Updated:",
+"message.setup.physical.network.during.zone.creation": "When adding a 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. Add or remove one or more traffic types 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>add</strong> other traffic types onto the physical network.",
+"message.setup.successful": "Cloud setup successful!",
+"message.specifiy.tag.key": "Please specify a tag key",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specifiy.tag.value": "Please specify a tag value",
+"message.specify.url": "Please specify URL",
+"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.step.license.agreements.continue": "Please aceept all license agreements to continue",
+"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.success.acquire.ip": "Successfully acquired IP",
+"message.success.add.egress.rule": "Successfully added new Egress rule",
+"message.success.add.firewall.rule": "Successfully added new Firewall rule",
+"message.success.add.guest.network": "Successfully created guest network",
+"message.success.add.iprange": "Successfully added IP Range",
+"message.success.add.kuberversion": "Successfully added Kubernetes version",
+"message.success.add.network": "Successfully added network",
+"message.success.add.network.acl": "Successfully added Network ACL List",
+"message.success.add.port.forward": "Successfully added new Port Forwarding rule",
+"message.success.add.private.gateway": "Successfully added Private Gateway",
+"message.success.add.rule": "Successfully added new rule",
+"message.success.add.secondary.ipaddress": "Successfully added secondary IP Address",
+"message.success.add.static.route": "Successfully added static route",
+"message.success.add.tag": "Successfully added new tag",
+"message.success.add.vpc.network": "Successfully added VPC Network",
+"message.success.add.vpn.customer.gateway": "Successfully added VPN customer gateway",
+"message.success.add.vpn.gateway": "Successfully added VPN Gateway",
+"message.success.asign.vm": "Successfully assigned VM",
+"message.success.assigned.vms": "Successfully assigned VMs",
+"message.success.certificate.upload": "Certificate successfully uploaded",
+"message.success.change.affinity.group": "Successfully changed affinity groups",
+"message.success.change.offering": "Successfully changed offering",
+"message.success.change.password": "Successfully changed password for user",
+"message.success.config.backup.schedule": "Successfully Configure VM backup schedule",
+"message.success.config.sticky.policy": "Successfully configured sticky policy",
+"message.success.copy.clipboard": "Copied Successfully to clipboard",
+"message.success.create.account": "Successfully created account",
+"message.success.create.internallb": "Successfully created Internal LB",
+"message.success.create.isolated.network": "Successfully created isolated network",
+"message.success.create.keypair": "Successfully created SSH key pair",
+"message.success.create.kubernetes.cluter": "Successfully created Kubernetes cluster",
+"message.success.create.l2.network": "Successfully created L2 network",
+"message.success.create.snapshot.from.vmsnapshot": "Successfully created Snapshot from VM snapshot",
+"message.success.create.user": "Successfully created user",
+"message.success.create.volume": "Successfully created volume",
+"message.success.delete": "Delete success",
+"message.success.delete.acl.rule": "Successfully removed ACL rule",
+"message.success.delete.backup.schedule": "Successfully deleted Configure VM backup schedule",
+"message.success.delete.snapshot.policy": "Successfully deleted snapshot policy",
+"message.success.delete.static.route": "Successfully deleted static route",
+"message.success.delete.tag": "Successfully deleted tag",
+"message.success.delete.vm": "Successfully Deleted VM",
+"message.success.disable.saml.auth": "Successfully disabled SAML Authorization",
+"message.success.disable.vpn": "Successfully disabled VPN",
+"message.success.edit.acl": "Successfully edited ACL rule",
+"message.success.edit.rule": "Successfully edited rule",
+"message.success.enable.saml.auth": "Successfully enabled SAML Authorization",
+"message.success.migrate.volume": "Successfully migrated volume",
+"message.success.migrating": "Migration completed successfully for",
+"message.success.move.acl.order": "Successfully moved ACL rule",
+"message.success.recurring.snapshot": "Successfully recurring snapshots",
+"message.success.register.iso": "Successfully registered ISO",
+"message.success.register.keypair": "Successfully registered SSH key pair",
+"message.success.register.template": "Successfully registered template",
+"message.success.release.ip": "Successfully released IP",
+"message.success.remove.egress.rule": "Successfully removed Egress rule",
+"message.success.remove.firewall.rule": "Successfully removed Firewall rule",
+"message.success.remove.instance.rule": "Successfully removed instance from rule",
+"message.success.remove.ip": "Successfully removed IP",
+"message.success.remove.iprange": "Successfully removed IP Range",
+"message.success.remove.nic": "Successfully removed",
+"message.success.remove.port.forward": "Successfully removed Port Forwarding rule",
+"message.success.remove.rule": "Successfully deleted rule",
+"message.success.remove.secondary.ipaddress": "Successfully removed secondary IP Address",
+"message.success.remove.sticky.policy": "Successfully removed sticky policy",
+"message.success.resize.volume": "Successfully resized volume",
+"message.success.scale.kubernetes": "Successfully scaled Kubernetes cluster",
+"message.success.update.ipaddress": "Successfully updated IP Address",
+"message.success.update.kubeversion": "Successfully updated Kubernetes supported version",
+"message.success.update.user": "Successfully updated user",
+"message.success.upgrade.kubernetes": "Successfully upgraded Kubernetes cluster",
+"message.success.upload": "Upload Successfully",
+"message.success.upload.description": "This ISO file has been uploaded. Please check its status at Templates menu",
+"message.success.upload.iso.description": "This ISO file has been uploaded. Please check its status in the Images > ISOs menu",
+"message.success.upload.template.description": "This template file has been uploaded. Please check its status at Templates menu",
+"message.success.upload.volume.description": "This Volume has been uploaded. Please check its status in the Volumes menu",
+"message.suspend.project": "Are you sure you want to suspend this project?",
+"message.sussess.discovering.feature": "Discovered all available features!",
+"message.switch.to": "Switched to",
+"message.systems.vms.ready": "System VMs ready.",
+"message.template.copy.select.zone": "Please select a zone to copy template.",
+"message.template.copying": "Template is being copied.",
+"message.template.desc": "OS image that can be used to boot VMs",
+"message.template.iso": "Please select a template or ISO to continue",
+"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.traffic.type.to.basic.zone": "traffic type to basic zone",
+"message.update.ipaddress.processing": "Updating IP Address...",
+"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.upload.failed": "Upload Failed",
+"message.upload.file.limit": "Only one file can be uploaded at a time",
+"message.upload.file.processing": "Do not close this form, file upload is in progress...",
+"message.upload.iso.failed": "ISO Upload Failed",
+"message.upload.iso.failed.description": "Failed to upload ISO",
+"message.upload.template.failed.description": "Failed to upload Template",
+"message.upload.volume.failed": "Volume Upload Failed",
+"message.user.not.permitted.api": "User is not permitted to use the API",
+"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.validate.url": "Please enter a valid URL.",
+"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.virtual.router.not.return.elementid": "error: listVirtualRouterElements API doesn't return Virtual Router Element Id",
+"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.vm.state.destroyed": "VM is marked for destroy",
+"message.vm.state.error": "VM is in error",
+"message.vm.state.expunging": "VM is being expunged",
+"message.vm.state.migrating": "VM is being migrated",
+"message.vm.state.running": "VM is running",
+"message.vm.state.shutdown": "VM state is shutdown from inside",
+"message.vm.state.starting": "VM is being started",
+"message.vm.state.stopped": "VM is stopped",
+"message.vm.state.stopping": "VM is being stopped",
+"message.vm.state.unknown": "VM state is unknown.",
+"message.vmsnapshot.state.allocated": "The VM snapshot is allocated but has not been created yet",
+"message.vmsnapshot.state.creating": "The VM snapshot is being created",
+"message.vmsnapshot.state.error": "The VM snapshot is in error state, and can't be recovered",
+"message.vmsnapshot.state.expunging": "The VM snapshot is being expunging",
+"message.vmsnapshot.state.ready": "The VM snapshot is ready to be used",
+"message.vmsnapshot.state.removed": "The VM snapshot is destroyed, and can't be recovered",
+"message.vmsnapshot.state.reverting": "The VM snapshot is being used to revert",
+"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.volume.state.allocated": "The volume is allocated but has not been created yet",
+"message.volume.state.attaching": "The volume is attaching to a volume from Ready state.",
+"message.volume.state.copying": "Volume is copying from image store to primary, in case it's an uploaded volume",
+"message.volume.state.creating": "The volume is being created",
+"message.volume.state.destroy": "The volume is destroyed, and can't be recovered",
+"message.volume.state.destroying": "The volume is destroying, and can't be recovered",
+"message.volume.state.expunged": "The volume has been expunged",
+"message.volume.state.expunging": "The volume is being expunging",
+"message.volume.state.migrating": "The volume is migrating to other storage pool",
+"message.volume.state.notuploaded": "The volume entry is just created in DB, not yet uploaded",
+"message.volume.state.ready": "The volume is ready to be used",
+"message.volume.state.resizing": "The volume is being resized",
+"message.volume.state.revertsnapshotting": "There is a snapshot created on this volume, the volume is being reverting from snapshot",
+"message.volume.state.snapshotting": "There is a snapshot created on this volume, not backed up to secondary storage yet",
+"message.volume.state.uploadabandoned": "Volume upload is abandoned since the upload was never initiated within a specificed time",
+"message.volume.state.uploaded": "Volume is uploaded",
+"message.volume.state.uploaderror": "Volume upload encountered some error",
+"message.volume.state.uploadinprogress": "Volume upload is in progress",
+"message.volume.state.uploadop": "The volume upload operation is in progress or in short the volume is on secondary storage",
+"message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
+"message.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"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": "Zone creation complete",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone creation complete. Would you like to enable this zone?",
+"message.zone.detail.description": "Populate zone details",
+"message.zone.detail.hint": "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.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}.",
+"migrate.from": "Migrate From",
+"migrate.to": "Migrate To",
+"migrationPolicy": "Migration Policy",
+"network.rate": "Network Rate",
+"router.health.checks": "Health Check",
+"side.by.side": "Side by Side",
+"state.accepted": "Accepted",
+"state.active": "Active",
+"state.allocating": "Allocating",
+"state.backedup": "Backed Up",
+"state.backingup": "Backing Up",
+"state.completed": "Completed",
+"state.creating": "Creating",
+"state.declined": "Declined",
+"state.destroyed": "Destroyed",
+"state.detached": "Detached",
+"state.disabled": "Disabled",
+"state.enabled": "Enabled",
+"state.error": "Error",
+"state.expired": "Expired",
+"state.expunging": "Expunging",
+"state.migrating": "Migrating",
+"state.pending": "Pending",
+"state.running": "Running",
+"state.starting": "Starting",
+"state.stopped": "Stopped",
+"state.stopping": "Stopping",
+"state.suspended": "Suspended",
+"title.upload.volume": "Upload Volume",
+"user.login": "Login",
+"user.logout": "Logout"
+}
diff --git a/ui/public/locales/es.json b/ui/public/locales/es.json
new file mode 100644
index 0000000..c05967b
--- /dev/null
+++ b/ui/public/locales/es.json
@@ -0,0 +1,2395 @@
+{
+"changed.item.properties": "Cambiadas las propiedades del elemento",
+"confirm.enable.s3": "Por favor, complete la siguiente informaci\u00f3n para habilitar el soporte del Almacenamiento Secundario sobre S3",
+"confirm.enable.swift": "Por favor, complete la siguiente informaci\u00f3n para habilitar el soporte para Swift",
+"error.could.not.change.your.password.because.non.native.user": "Error, no se puede cambiar la contrase\u00f1a 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\u00e1s y corregir los errores.",
+"error.invalid.username.password": "Usuario o contrase\u00f1a invalido",
+"error.login": "Su nombre de usuario / contrase\u00f1a no coinciden con nuestros registros.",
+"error.menu.select": "Imposible ejecutar la acci\u00f3n, ya que no hay elementos seleccionados.",
+"error.mgmt.server.inaccessible": "El Servidor de Gesti\u00f3n es inaccesible. Por favor, int\u00e9ntelo de nuevo m\u00e1s tarde.",
+"error.password.not.match": "Los campos de contrase\u00f1a no coinciden",
+"error.please.specify.physical.network.tags": "Las Ofertas de Red no est\u00e1n disponibles hasta que se especifique los tags para esta red f\u00edsica.",
+"error.session.expired": "Su sesi\u00f3n ha caducado.",
+"error.unable.to.reach.management.server": "No es posible alcanzar al Servidor de Gesti\u00f3n",
+"error.unresolved.internet.name": "El nombre de Internet no se puede resolver.",
+"force.delete.domain.warning": "Advertencia: Elegir esta opci\u00f3n, provocar\u00e1 la eliminaci\u00f3n 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\u00f3n provocar\u00e1 que CloudStack detenga a la fuerza todas las m\u00e1quinas virtuales antes de eliminar este host del cl\u00faster.",
+"force.stop": "Forzar Detener",
+"force.stop.instance.warning": "Advertencia: Forzar la dertenci\u00f3n de esta instancia deber\u00ed\u00ada ser su \u00faltima opci\u00f3n. Puede conducir a la p\u00e9rdida de datos, as\u00ed\u00ad como un comportamiento incoherente del estado de la m\u00e1quina 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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Directorio de Im\u00e1genes",
+"inline": "En l\u00ednea",
+"label.about": "Acerca de",
+"label.about.app": "Acerca de CloudStack",
+"label.accept.project.invitation": "Aceptar invitaci\u00f3n al proyecto",
+"label.accesskey": "Clave de Acceso",
+"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.name": "Nombre de cuenta",
+"label.account.specific": "espec\u00edficas de la cuenta",
+"label.accounts": "Cuentas",
+"label.accounttype": "Tipo de Cuenta",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ID de ACL",
+"label.acl.list.rules": "Lista de Reglas ACL",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL reemplazada",
+"label.aclid": "ACL",
+"label.aclname": "Nombre de ACL",
+"label.acltotal": "ACL Total de la Red",
+"label.acquire.new.ip": "Adquirir nueva IP",
+"label.acquire.new.secondary.ip": "Adquirir nueva IP secundaria",
+"label.action": "Acci\u00f3n",
+"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\u00f1a",
+"label.action.change.service": "Cambiar el Servicio",
+"label.action.change.service.processing": "Cambiando el servicio....",
+"label.action.configure.samlauthorization": "Configurar Autorizaci\u00f3n SAML SSO",
+"label.action.configure.stickiness": "Persistencia",
+"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.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.account": "Eliminar cuenta",
+"label.action.delete.account.processing": "Eliminando cuenta ....",
+"label.action.delete.cluster": "Borrar Cl\u00faster",
+"label.action.delete.cluster.processing": "Borrando Cl\u00faster....",
+"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.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.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\u00edsica",
+"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\u00e1nea",
+"label.action.delete.snapshot.processing": "Eliminando instant\u00e1nea ....",
+"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\u00faster",
+"label.action.disable.cluster.processing": "Deshabilitando Cl\u00faster...",
+"label.action.disable.nexusvswitch": "Deshabilitar Nexus 1000v",
+"label.action.disable.physical.network": "Desactivar la red f\u00edsica",
+"label.action.disable.pod": "Deshabilitar Pod",
+"label.action.disable.pod.processing": "Deshabilitar Pod ....",
+"label.action.disable.static.nat": "Deshabilitar NAT est\u00e1tica",
+"label.action.disable.static.nat.processing": "Deshabilitando NAT est\u00e1tico ....",
+"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.account": "Editar Cuenta",
+"label.action.edit.disk.offering": "Editar Oferta Disco",
+"label.action.edit.domain": "Editar Dominio",
+"label.action.edit.global.setting": "Editar Configuraci\u00f3n Global",
+"label.action.edit.host": "Editar Anfitri\u00f3n",
+"label.action.edit.instance": "Editar Instancia",
+"label.action.edit.iso": "Editar ISO",
+"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\u00edmites 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\u00f3n Zona",
+"label.action.enable.account": "Habilitar cuenta",
+"label.action.enable.account.processing": "Habilitando Cuenta...",
+"label.action.enable.cluster": "Habilitar cl\u00faster",
+"label.action.enable.cluster.processing": "Habilitando cl\u00faster ....",
+"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\u00edsica",
+"label.action.enable.pod": "Habilitar Pod",
+"label.action.enable.pod.processing": "Habilitando Pod ....",
+"label.action.enable.static.nat": "Habilitar NAT est\u00e1tico",
+"label.action.enable.static.nat.processing": "Habilitando NAT est\u00e1tico ....",
+"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\u00faster",
+"label.action.manage.cluster.processing": "Gestionando Cl\u00faster",
+"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.project.add.account": "Agregar Cuenta al Proyecto",
+"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\u00e1neas 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\u00f1a",
+"label.action.reset.password.processing": "Restableciendo Contrase\u00f1a ....",
+"label.action.resize.volume": "Redimensionar Vol\u00famen",
+"label.action.resize.volume.processing": "Redimensionando Vol\u00famen...",
+"label.action.resource.limits": "L\u00edmites de Recursos",
+"label.action.restore.instance": "Restaurar Instancia",
+"label.action.restore.instance.processing": "Restaurando Instancia ....",
+"label.action.revert.snapshot": "Revertir a Instant\u00e1nea",
+"label.action.revert.snapshot.processing": "Volviendo a Instant\u00e1nea...",
+"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": "Detener Instancia",
+"label.action.stop.instance.processing": "Parando Instancia ....",
+"label.action.stop.router": "Detener Router",
+"label.action.stop.router.processing": "Parando Router ....",
+"label.action.stop.systemvm": "Detener MV de Sistema",
+"label.action.stop.systemvm.processing": "Parando MV de Sistema",
+"label.action.take.snapshot": "Tomar Instant\u00e1nea",
+"label.action.take.snapshot.processing": "Tomando Instant\u00e1neas ....",
+"label.action.unmanage.cluster": "Detener gesti\u00f3n Cl\u00faster",
+"label.action.unmanage.cluster.processing": "Parando gesti\u00f3n Cl\u00faster....",
+"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\u00e1nea de MV",
+"label.action.vmsnapshot.delete": "Borrar Instantanea de MV",
+"label.action.vmsnapshot.revert": "Volver a Instant\u00e1nea de MV",
+"label.actions": "Acciones",
+"label.activate.project": "Activar Proyecto",
+"label.activeviewersessions": "Sesiones activas",
+"label.add": "Agregar",
+"label.add.account": "A\u00f1adir Cuenta",
+"label.add.accounts": "Agregar Cuentas",
+"label.add.accounts.to": "Agregar Cuentas a",
+"label.add.acl": "Agregar ACL",
+"label.add.acl.list": "Agregar Lista ACL",
+"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\u00f3n de Rack Baremetal",
+"label.add.bigswitchbcf.device": "Agregar Controlador BigSwitch BCF",
+"label.add.brocadevcs.device": "Agregar Switch Brocade Vcs",
+"label.add.by": "A\u00f1adir por",
+"label.add.by.cidr": "A\u00f1adir Por CIDR",
+"label.add.by.group": "A\u00f1adir Por el Grupo de",
+"label.add.ciscoasa1000v": "Agregar un Recurso CiscoASA1000v",
+"label.add.cluster": "A\u00f1adir Cl\u00faster",
+"label.add.compute.offering": "Agregar oferta de C\u00f3mputo",
+"label.add.direct.iprange": "A\u00f1adir Rango IP Directo",
+"label.add.disk.offering": "A\u00f1adir Oferta Disco",
+"label.add.domain": "Agregar Dominio",
+"label.add.egress.rule": "Agregar Regla de Salida",
+"label.add.f5.device": "Agregar dispositivo F5",
+"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\u00f3n",
+"label.add.ingress.rule": "A\u00f1adir Regla de Entrada",
+"label.add.intermediate.certificate": "Agregar certificado intermedio",
+"label.add.internal.lb": "Agregar LB Interno",
+"label.add.ip.range": "A\u00f1adir Rango IP",
+"label.add.isolated.guest.network": "A\u00f1adir 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\u00f1adir balanceador de carga",
+"label.add.more": "A\u00f1adir m\u00e1s",
+"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\u00f1adir dispositivo de red",
+"label.add.network.offering": "Agregar Oferta de Red",
+"label.add.new.f5": "Agregar un nuevo F5",
+"label.add.new.gateway": "Agregar nuevo gateway",
+"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.tier": "Agregar un nuevo tier",
+"label.add.nfs.secondary.staging.store": "Agregar un Almacenamiento Secundario Temporario NFS",
+"label.add.niciranvp.device": "Agregar Controlador Nvp",
+"label.add.note": "Agregar Nota",
+"label.add.opendaylight.device": "Agregar el Controlador OpenDaylight",
+"label.add.pa.device": "Agregar dispositivo Palo Alto",
+"label.add.physical.network": "Agregar red f\u00edsica",
+"label.add.pod": "A\u00f1adir Pod",
+"label.add.port.forwarding.rule": "Agregar regla encaminamiento puerto",
+"label.add.portable.ip.range": "Agregar un Rango IP Port\u00e1til",
+"label.add.primary.storage": "A\u00f1adir Almacenamiento primario",
+"label.add.private.gateway": "Agregar Gateway Privado",
+"label.add.region": "Agregar Regi\u00f3n",
+"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\u00f1adir almacenamiento secundario",
+"label.add.security.group": "Agregar grupo de seguridad",
+"label.add.service.offering": "A\u00f1adir Oferta de Servicio",
+"label.add.srx.device": "Agregar dispositivo SRX",
+"label.add.static.nat.rule": "Agregar regla NAT est\u00e1tica",
+"label.add.static.route": "Agregar ruta est\u00e1tica",
+"label.add.system.service.offering": "Agregar Oferta de Servicio para MV de Sistema",
+"label.add.template": "A\u00f1adir plantilla",
+"label.add.to.group": "Agregar al grupo",
+"label.add.ucs.manager": "Agregar UCS Manager",
+"label.add.user": "Agregar Usuario",
+"label.add.vlan": "A\u00f1adir VLAN",
+"label.add.vm": "Agregar MV",
+"label.add.vm.to.tier": "Agregar MV al tier",
+"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\u00f1adir 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.gateway": "Agregar Gateway VPN",
+"label.add.vpn.user": "Agregar usuario VPN",
+"label.add.vxlan": "A\u00f1adir VXLAN",
+"label.add.zone": "A\u00f1adir 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\u00faster",
+"label.adding.failed": "No se pudo agregar",
+"label.adding.pod": "Agregar Pod",
+"label.adding.processing": "Agregando ....",
+"label.adding.succeeded": "Agregaci\u00f3n correcta",
+"label.adding.user": "Agregar Usuario",
+"label.adding.zone": "Agregando Zona",
+"label.additional.networks": "Redes adicionales",
+"label.address": "Direcci\u00f3n",
+"label.admin": "Admin",
+"label.admin.accounts": "Cuentas Admin",
+"label.advanced": "Avanzado",
+"label.advanced.mode": "Modo avanzado",
+"label.advanced.search": "B\u00fasqueda Avanzada",
+"label.affinity": "Afinidad",
+"label.affinity.groups": "Grupos de Afinidad",
+"label.affinitygroup": "Grupo de Afinidad",
+"label.agent.password": "Contrase\u00f1a de Agente",
+"label.agent.username": "Nombre de usuario del agente",
+"label.agentport": "Puerto del Agente",
+"label.agentstate": "Estado 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.alerts": "Alertas",
+"label.algorithm": "Algoritmo",
+"label.all": "Todas",
+"label.allocated": "Asignados",
+"label.allocationstate": "Estado de la Asignaci\u00f3n",
+"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.version": "Versi\u00f3n de API",
+"label.apikey": "clave 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.associatednetwork": "Red Asociada",
+"label.associatednetworkid": "ID de red asociados",
+"label.associatednetworkname": "Nombre de red",
+"label.author.email": "e-mail del Autor",
+"label.author.name": "Nombre del Autor",
+"label.autoscale": "Escalado Autom\u00e1tico",
+"label.autoscale.configuration.wizard": "Asistente de configuraci\u00f3n de Escalado Autom\u00e1tico",
+"label.availability": "Disponibilidad",
+"label.availabilityzone": "zonaDeDisponibilidad",
+"label.available": "Disponible",
+"label.available.public.ips": "Direcciones IP p\u00fablicas disponibles",
+"label.back": "Volver",
+"label.backup": "Respaldos",
+"label.backup.attach.restore": "Restaurar y conectar un Volumen de Respaldo",
+"label.backup.offering.assign": "Asignar instancia a una oferta de respaldo",
+"label.backup.offering.remove": "remover instancia de una oferta de respaldo",
+"label.backup.offerings": "Ofertas de Respaldos",
+"label.backup.restore": "Restaurar Respaldo de instancia",
+"label.backupofferingid": "Oferta de Respaldo",
+"label.backupofferingname": "Oferta de Respaldo",
+"label.balance": "Balance",
+"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\u00f3n del Rack Baremetal",
+"label.baremetalcpu": "CPU(MHz)",
+"label.baremetalcpucores": "# cores de CPU",
+"label.baremetalmac": "MAC del Anfitri\u00f3n",
+"label.baremetalmemory": "Memoria(MB)",
+"label.basic": "B\u00e1sica",
+"label.basic.mode": "Modo b\u00e1sico",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "Detalles del Controlador BigSwitch BCF",
+"label.bigswitch.controller.address": "Direcci\u00f3n del Controlador BigSwitch BCF",
+"label.bladeid": "ID de Hoja",
+"label.blades": "Hojas",
+"label.bootable": "Arrancable",
+"label.broadcastdomainrange": "Rango del dominio de Broadcast",
+"label.broadcastdomaintype": "Tipo de dominio de difusi\u00f3n",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Direcci\u00f3n del Switch VCS",
+"label.brocade.vcs.details": "Detalles del Switch VCS Brocade",
+"label.bucket": "Bucket",
+"label.by.account": "Por Cuenta",
+"label.by.alert.type": "Por tipo de alerta",
+"label.by.availability": "Por Disponibilidad",
+"label.by.domain": "Por dominio",
+"label.by.end.date": "Por Fecha de finalizaci\u00f3n",
+"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\u00e1fico",
+"label.by.type": "Por tipo",
+"label.by.type.id": "Por tipo de ID",
+"label.by.zone": "Por Zona",
+"label.cachemode": "Tipo de cache de escritura",
+"label.cancel": "Cancelar",
+"label.capacity": "Capacidad",
+"label.capacity.iops": "Capacidad en IOPS",
+"label.capacitybytes": "Capacidad en Bytes",
+"label.capacityiops": "Total de IOPS",
+"label.certificate": "Certificado",
+"label.change.affinity": "Cambiar Afinidad",
+"label.change.ipaddress": "Cambiar la direcci\u00f3n IP de la NIC",
+"label.change.service.offering": "Cambiar oferta de servicio",
+"label.change.value": "Cambiar valor",
+"label.character": "Car\u00e1cter",
+"label.chassis": "Chasis",
+"label.checksum": "checksum",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR o Cuenta / Grupo de Seguridad",
+"label.cidr.of.destination.network": "CIDR de la red destino",
+"label.cidrlist": "CIDR Origen",
+"label.cisco.nexus1000v.ip.address": "Direcci\u00f3n IP del Nexus 1000v",
+"label.cisco.nexus1000v.password": "Contrase\u00f1a del Nexus 1000v",
+"label.cisco.nexus1000v.username": "Usuario del Nexus 1000v",
+"label.ciscovnmc.resource.details": "Detalle de recursos CiscoVNMC",
+"label.cleanup": "Limpiar",
+"label.clear.list": "Limpiar lista",
+"label.close": "Cerrar",
+"label.cloud.console": "Consola de Gesti\u00f3n Cloud",
+"label.cloud.managed": "Cloud.com Gestionado",
+"label.cluster": "Cl\u00faster",
+"label.cluster.name": "Nombre del Cluster",
+"label.clusterid": "Cl\u00faster",
+"label.clustername": "Cl\u00faster",
+"label.clusternamelabel": "Nombre del Cluster",
+"label.clusters": "Cl\u00fasters",
+"label.clustertype": "Tipo de Cl\u00faster",
+"label.clvm": "CLVM",
+"label.code": "C\u00f3digo",
+"label.comments": "Comentarios",
+"label.community": "Comunidad",
+"label.compute": "C\u00f3mputo",
+"label.compute.and.storage": "C\u00f3mputo y Almacenamiento",
+"label.compute.offerings": "Ofertas de C\u00f3mputo",
+"label.configuration": "Configuraci\u00f3n",
+"label.configure": "Configurar",
+"label.configure.ldap": "Configurar LDAP",
+"label.configure.network.acls": "Configurar ACLs de la Red",
+"label.configure.sticky.policy": "Configurar pol\u00edtica Sticky",
+"label.configure.vpc": "Configurar VPC",
+"label.confirmation": "Confirmaci\u00f3n",
+"label.confirmdeclineinvitation": "\u00bfEst\u00e1 segura que desea rechazar esta invitaci\u00f3n al proyecto?",
+"label.confirmpassword": "Confirmar Contrase\u00f1a",
+"label.congratulations": "\u00a1Felicidades!",
+"label.connectiontimeout": "Timeout Conexi\u00f3n",
+"label.conservemode": "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\u00f3n b\u00e1sica",
+"label.copying.iso": "Copiando ISO",
+"label.corrections.saved": "Correcciones guardadas",
+"label.counterid": "Contador",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU asignada",
+"label.cpu.sockets": "Sockets",
+"label.cpuallocated": "CPU asignada para MVs",
+"label.cpuallocatedghz": "Asignados",
+"label.cpulimit": "L\u00edmites de CPU",
+"label.cpumaxdeviation": "Desviaci\u00f3n",
+"label.cpusockets": "N\u00famero de Sockets de CPU",
+"label.cpuspeed": "CPU(MHz)",
+"label.cputotal": "Total CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilizada",
+"label.create.nfs.secondary.staging.storage": "Crear almac\u00e9n Temporal Secundario NFS",
+"label.create.nfs.secondary.staging.store": "Crear almac\u00e9n 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.create.vpn.connection": "Crear Conexi\u00f3n VPN",
+"label.created": "Creado",
+"label.created.by.system": "Creado por el sistema",
+"label.createnfscache": "Crear almac\u00e9n Temporal Secundario NFS",
+"label.credit": "Cr\u00e9dito",
+"label.crosszones": "Zonas transversales",
+"label.current": "esLaActual",
+"label.currentpassword": "Current Password",
+"label.custom": "A Medida",
+"label.custom.disk.offering": "Oferta de Disco Personalizada",
+"label.customdisksize": "Personal Disk Size",
+"label.daily": "Diario",
+"label.dashboard": "Panel de Control",
+"label.data.disk.offering": "Oferta de Disco de Datos",
+"label.date": "Fecha",
+"label.day": "D\u00eda",
+"label.day.of.month": "D\u00eda del mes",
+"label.day.of.week": "D\u00eda de la semana",
+"label.dc.name": "Nombre del DC",
+"label.decline.invitation": "Declinar invitaci\u00f3n",
+"label.dedicate": "Dedicar",
+"label.dedicate.cluster": "Dedicar el Cluster",
+"label.dedicate.host": "Dedicar Anfitri\u00f3n",
+"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.use": "Uso por defecto",
+"label.default.view": "Vista Por Defecto",
+"label.delete": "Eliminar",
+"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\u00f3n del Rack Baremetal",
+"label.delete.bigswitchbcf": "Remover Controlador BigSwitch BCF",
+"label.delete.brocadevcs": "Remover Switch Brocade Vcs",
+"label.delete.ciscoasa1000v": "Borrar CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Borrar recurso CiscoVNMC",
+"label.delete.events": "Eliminar sucesos",
+"label.delete.f5": "Borrar F5",
+"label.delete.gateway": "Borrar gateway",
+"label.delete.instance.group": "Borrar Grupo de Instancias",
+"label.delete.internal.lb": "Borrar LB Interno",
+"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.portable.ip.range": "Borrar Rango IP Port\u00e1til",
+"label.delete.project": "Eliminar proyecto",
+"label.delete.role": "Borrar Rol",
+"label.delete.secondary.staging.store": "Borrar Almacenamiento Secundario Temporal",
+"label.delete.srx": "Borrar SRX",
+"label.delete.ucs.manager": "Borrar UCS Manager",
+"label.delete.vpn.connection": "Borrar conexi\u00f3n VPN",
+"label.delete.vpn.customer.gateway": "Borrar VPN para Acceso del Cliente",
+"label.delete.vpn.gateway": "eliminar Gateway VPN",
+"label.delete.vpn.user": "Eliminar usuario VPN",
+"label.deleteprofile": "Borrar Perfil",
+"label.deleting.failed": "No se pudo eliminar",
+"label.deleting.processing": "Eliminando...",
+"label.deny": "Denegar",
+"label.deploymentplanner": "Planificador de Despliegue",
+"label.description": "Descripci\u00f3n",
+"label.destinationphysicalnetworkid": "ID de la red f\u00edsica destino",
+"label.destinationzoneid": "Zona de destino",
+"label.destroy": "Destruir",
+"label.destroy.router": "Destruir router",
+"label.destroyvmgraceperiod": "Per\u00edodo de Gracia para Destruir MV",
+"label.detaching.disk": "Extracci\u00f3n del disco",
+"label.details": "Detalles",
+"label.deviceid": "ID de dispositivo",
+"label.devices": "Dispositivos",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "Tipo de servidor DHCP",
+"label.direct.attached.public.ip": "IP P\u00fablica Conectada en forma Directa",
+"label.direct.ips": "IPs de la Red Compartida",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "Deshabilitar Escalado Autom\u00e1tico",
+"label.disable.host": "Deshabitar Anfitri\u00f3n",
+"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.disconnected": "\u00daltima Desconexi\u00f3n",
+"label.disk": "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.offering.details": "Detalles de Oferta de Disco",
+"label.disk.offerings": "Ofertas de Disco",
+"label.disk.size": "tama\u00f1o de disco",
+"label.disk.volume": "volumen de disco",
+"label.diskbytesreadrate": "Tasa Lectura Disco (BPS)",
+"label.diskbyteswriterate": "Tasa Escritura Disco (BPS)",
+"label.diskiopsmax": "IOPS m\u00e1ximas",
+"label.diskiopsmin": "IOPS m\u00ednimas",
+"label.diskiopsreadrate": "Tasa Lectura Disco (IOPS)",
+"label.diskiopswriterate": "Tasa Escritura de Disco (IOPS)",
+"label.diskioread": "Lectura Disco (IO)",
+"label.diskiowrite": "Escritura Disco (IO)",
+"label.diskkbsread": "Lectura Disco (Bytes)",
+"label.diskkbswrite": "Escritura Disco (Bytes)",
+"label.diskoffering": "Oferta de Disco",
+"label.diskofferingdisplaytext": "Oferta de Disco",
+"label.diskofferingid": "Oferta de Disco",
+"label.disksize": "tama\u00f1o de disco (en GB)",
+"label.disksizeallocated": "Disco asignado",
+"label.disksizeallocatedgb": "Asignados",
+"label.disksizetotal": "disco Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Sin asignar",
+"label.disksizeusedgb": "Usado",
+"label.display.text": "Texto a mostrar",
+"label.displayname": "Nombre a Mostrar",
+"label.displaytext": "Descripci\u00f3n",
+"label.distributedvpcrouter": "Router Distribuido VPC",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "Dominio DNS de las Redes Invitado",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Dominio",
+"label.domains": "Dominio",
+"label.domain.details": "Detalles del 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.domainid": "ID de dominio",
+"label.domainname": "Dominio",
+"label.domainpath": "Dominio",
+"label.done": "Listo",
+"label.double.quotes.are.not.allowed": "No se permiten comillas dobles ",
+"label.download.progress": "Progreso de la descarga",
+"label.dpd": "Detecci\u00f3n de Dead Peer",
+"label.drag.new.position": "Arrastrar a una nueva ubicaci\u00f3n",
+"label.driver": "Controlador",
+"label.duration.in.sec": "Duraci\u00f3n (en seg)",
+"label.edit": "Editar",
+"label.edit.acl.list": "Edit ACL List",
+"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\u00f3n",
+"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\u00edtica de salida por defecto",
+"label.egress.rule": "Regla de salida",
+"label.egress.rules": "Reglas de salida",
+"label.egressdefaultpolicy": "Pol\u00edtica de salida por defecto",
+"label.elastic": "El\u00e1stico",
+"label.email": "correo electr\u00f3nico",
+"label.enable.autoscale": "Habilitar Autoescalado",
+"label.enable.host": "Habilitar Anfitri\u00f3n",
+"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.reserved.system.ip": "\u00daltima IP de sistema Reservada",
+"label.end.vlan": "VLAN Final",
+"label.end.vxlan": "VXLAN Final",
+"label.enddate": "Por fecha (finalizaci\u00f3n)",
+"label.endip": "IP Final",
+"label.endipv4": "IP Final IPv4",
+"label.endipv6": "IP Final IPv6",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "Endpoint u Operaci\u00f3n",
+"label.endport": "Puerto final",
+"label.enter.token": "Introduzca token",
+"label.error": "Error",
+"label.error.code": "C\u00f3digo de error",
+"label.error.something.went.wrong.please.correct.the.following": "Algo sali\u00f3 mal, por favor corrija lo siguiente",
+"label.error.upper": "ERROR",
+"label.espencryption": "Encriptaci\u00f3n ESP",
+"label.esphash": "Hash ESP",
+"label.esplifetime": "Tiempo de vida ESP (en segundos)",
+"label.esppolicy": "Pol\u00edtica ESP",
+"label.event": "Evento",
+"label.event.archived": "Evento Archivado",
+"label.event.deleted": "Evento Borrado",
+"label.events": "Eventos",
+"label.every": "Cada",
+"label.example": "Ejemplo",
+"label.example.plugin": "Plugin de ejemplo",
+"label.expunge": "Purgar",
+"label.external.link": "Enlace externo",
+"label.f5": "F5",
+"label.f5.details": "Detalles F5",
+"label.failed": "Error",
+"label.featured": "Destacados",
+"label.fetch.latest": "Obtener \u00faltimo",
+"label.filterby": "Filtrar por",
+"label.fingerprint": "Huella Digital",
+"label.firewall": "Firewall",
+"label.firstname": "Nombre",
+"label.firstname.lower": "nombre",
+"label.forceencap": "Forzar la encapsulaci\u00f3n UDP de los paquetes ESP",
+"label.format": "Formato",
+"label.friday": "Viernes",
+"label.full": "Completo",
+"label.full.path": "Path completo",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Tipo",
+"label.fwdevicestate": "Estado",
+"label.gateway": "puerta de enlace",
+"label.general.alerts": "Alertas Generales",
+"label.generating.url": "Generando URL",
+"label.global.settings": "Configuraci\u00f3n global",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "Configuraci\u00f3n de GloboDNS",
+"label.glustervolume": "Vol\u00famen",
+"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\u00faster",
+"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\u00e1s Balanceo de Carga",
+"label.gslb.delete": "Borrar el GSLB",
+"label.gslb.details": "Detalles del GSLB",
+"label.gslb.lb.details": "Detalles balanceo de carga",
+"label.gslb.lb.remove": "Quitar balanceo de carga de este GSLB",
+"label.gslb.service": "Servicio GSLB",
+"label.gslb.service.private.ip": "IP Privada del Servicio GSLB",
+"label.gslb.service.public.ip": "IP P\u00fablica del Servicio GSLB",
+"label.gslbdomainname": "Nombre de Dominio GSLB",
+"label.gslbprovider": "Servicio GSLB",
+"label.gslbproviderprivateip": "IP Privada del Servicio GSLB",
+"label.gslbproviderpublicip": "IP P\u00fablica del Servicio GSLB",
+"label.gslbservicetype": "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\u00f3n IP de Invitado",
+"label.guest.ip.range": "Rango IP de Invitado",
+"label.guest.netmask": "M\u00e1scara 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\u00e1fico de Invitado",
+"label.guestcidraddress": "CIDR Invitado",
+"label.guestendip": "IP final de Invitado",
+"label.guestgateway": "Gateway de Invitado",
+"label.guestipaddress": "Direcci\u00f3n IP de Invitado",
+"label.guestiptype": "Tipo de Invitado",
+"label.guestnetmask": "M\u00e1scara de red de Invitado",
+"label.guestnetworkid": "ID de red",
+"label.guestnetworkname": "Nombre de red",
+"label.guestosid": "Tipo de Sistema Operativo",
+"label.gueststartip": "IP inicial de Invitado",
+"label.guestvlanrange": "Rango(s) de VLAN",
+"label.haenable": "HA Activado",
+"label.hahost": "HA Activado",
+"label.header.volume.snapshot": "Puedes definir la planificaci\u00f3n de instant\u00e1neas recurrentes seleccionando de entre las opciones inferiores disponibles y aplicando su pol\u00edtica preferente",
+"label.header.volume.take.snapshot": "Por favor, confirme que desea tomar una instant\u00e1nea de este vol\u00famen.",
+"label.health.check": "Health Check",
+"label.health.check.advanced.options": "Opciones Avanzadas:",
+"label.health.check.configurations.options": "Opciones de Configuraci\u00f3n:",
+"label.health.check.interval.in.sec": "Intervalo de chequeo de salud (en seg)",
+"label.health.check.message.desc": "Su balanceador de carga realizar\u00e1 de forma autom\u00e1tica chequeos de salud en sus instancias cloudstack  y solo encaminar\u00e1 el tr\u00e1fico 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\u00f3n",
+"label.host.alerts": "Anfitriones en Estado de Alerta",
+"label.host.name": "nombre de host",
+"label.host.tag": "Etiqueta del Anfitri\u00f3n",
+"label.hostid": "Anfitri\u00f3n",
+"label.hostname": "Anfitri\u00f3n",
+"label.hostnamelabel": "nombre de host",
+"label.hosts": "Anfitriones",
+"label.hosttags": "Etiquetas de Anfitri\u00f3n",
+"label.hourly": "por hora",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Capacidades del Hipervisor",
+"label.hypervisor.type": "Tipo Hypervisor",
+"label.hypervisors": "Hipervisores",
+"label.hypervisorsnapshotreserve": "Reserva de instant\u00e1neas de hipervisores",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Versi\u00f3n del Hipervisor",
+"label.hypervnetworklabel": "Etiqueta de tr\u00e1fico HyperV",
+"label.icmpcode": "C\u00f3digo ICMP",
+"label.icmptype": "Tipo ICMP",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "Encriptaci\u00f3n IKE",
+"label.ikehash": "Hash IKE",
+"label.ikelifetime": "Tiempo de vida IKE (segundos)",
+"label.ikepolicy": "Pol\u00edtica IKE",
+"label.images": "Im\u00e1genes",
+"label.info": "Informaci\u00f3n",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infraestructura",
+"label.ingress.rule": "Regla Entrada",
+"label.initiated.by": "Iniciado por",
+"label.insideportprofile": "Dentro del Perfil de Puerto",
+"label.installwizard.addclusterintro.subtitle": "\u00bfQu\u00e9 es un cluster?",
+"label.installwizard.addclusterintro.title": "Agreguemos un cl\u00faster",
+"label.installwizard.addhostintro.subtitle": "\u00bfQu\u00e9 es un Anfitri\u00f3n?",
+"label.installwizard.addhostintro.title": "Agreguemos un Anfitri\u00f3n",
+"label.installwizard.addpodintro.subtitle": "\u00bfQue es un Pod?",
+"label.installwizard.addpodintro.title": "Agreguemos un Pod",
+"label.installwizard.addprimarystorageintro.subtitle": "\u00bfQu\u00e9 es el almacenamiento primario?",
+"label.installwizard.addprimarystorageintro.title": "Agreguemos almacenamiento primario",
+"label.installwizard.addsecondarystorageintro.subtitle": "Qu\u00e9 es almacenamiento secundario?",
+"label.installwizard.addsecondarystorageintro.title": "Agreguemos almacenamiento secundario",
+"label.installwizard.addzoneintro.subtitle": "\u00bfQu\u00e9 es una zona?",
+"label.installwizard.addzoneintro.title": "Agreguemos una zona",
+"label.installwizard.click.launch": "Click en el bot\u00f3n de lanzar.",
+"label.installwizard.subtitle": "Esta gu\u00eda te ayudar\u00e1 a configurar la instalaci\u00f3n de CloudStack&#848",
+"label.installwizard.title": "Hola y Bienvenido a CloudStack&#8482",
+"label.instance": "Instancia",
+"label.instance.groups": "Grupos de Instancias",
+"label.instance.name": "Nombre de instancia",
+"label.instance.scaled.up": "Instancia escalada a lo requerido en la oferta",
+"label.instancename": "Nombre interno",
+"label.instanceport": "Puerto de Instancia",
+"label.instances": "Instancias",
+"label.instanciate.template.associate.profile.blade": "Instanciar Plantilla y asociar al Perfil al Blade",
+"label.intermediate.certificate": "Certificado intermedio",
+"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.internaldns1": "DNS interno una",
+"label.internaldns2": "DNS interno 2",
+"label.internallbvm": "LbVmInterna",
+"label.interval": "Intervalo de Polling (en seg)",
+"label.intervaltype": "Tipo de intervalo",
+"label.introduction.to.cloudstack": "Introducci\u00f3n a CloudStack&#8482",
+"label.invalid.integer": "Entero no v\u00e1lido",
+"label.invalid.number": "N\u00famero no v\u00e1lido",
+"label.invitations": "Invitaciones",
+"label.invite": "Invitar",
+"label.invite.to": "Invitar a .",
+"label.invited.accounts": "Cuentas de invitado",
+"label.ip": "IP",
+"label.ip.allocations": "Asignaciones IP",
+"label.ip.or.fqdn": "IP o FQDN",
+"label.ip.range": "Rango IP",
+"label.ip.ranges": "Rangos IP",
+"label.ip4dns1": "DNS1 IPv4 ",
+"label.ip4dns2": "DNS2 IPv4",
+"label.ip4gateway": "Puerta de enlace IPv4",
+"label.ip4netmask": "M\u00e1scara IPv4",
+"label.ip6address": "Direcci\u00f3n IP IPv6",
+"label.ip6cidr": "CIDR IPv6",
+"label.ip6dns1": "DNS1 IPv6",
+"label.ip6dns2": "DNS2 IPv6",
+"label.ip6gateway": "Puerta de enlace IPv6",
+"label.ipaddress": "Direcci\u00f3n IP",
+"label.ipaddress1": "Direcci\u00f3n IP",
+"label.ipaddress2": "Direcci\u00f3n IP",
+"label.iplimit": "L\u00edmites IP p\u00fablica",
+"label.ips": "IP",
+"label.ipsecpsk": "Clave precompartida IPsec",
+"label.iptotal": "Direcciones IP totales",
+"label.ipv4.cidr": "CIDR IPv4",
+"label.ipv4.dns1": "DNS1 IPv4 ",
+"label.ipv4.dns2": "DNS2 IPv4",
+"label.ipv6.dns1": "DNS1 IPv6",
+"label.ipv6.dns2": "DNS2 IPv6",
+"label.iqn": "IQN Objetivo",
+"label.is.redundant.router": "redundante",
+"label.is.shared": "es Compartido",
+"label.isadvanced": "Mostrar configuraci\u00f3n avanzada",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Personal Disk Size",
+"label.iscustomizeddiskiops": "IOPS personalizadas",
+"label.iscustomizediops": "IOPS personalizadas",
+"label.isdedicated": "Dedicado",
+"label.isdefault": "Es por defecto",
+"label.isdynamicallyscalable": "Escalable Dinamicamente",
+"label.isextractable": "Descargable",
+"label.isfeatured": "Destacados",
+"label.isforced": "Forzar Borrado",
+"label.ismanaged": "Gestionado",
+"label.iso": "ISO",
+"label.iso.boot": "ISO de arranque",
+"label.isoid": "ISO",
+"label.isolated.networks": "Redes Aisladas",
+"label.isolatedpvlanid": "ID de VLAN Aislada Secundaria",
+"label.isolation.method": "M\u00e9todo de aislamiento",
+"label.isolation.mode": "modo de aislamiento",
+"label.isolationmethod": "M\u00e9todo de aislamiento",
+"label.isolationmethods": "M\u00e9todo de aislamiento",
+"label.isolationuri": "URI de aislamiento",
+"label.isoname": "ISO Conectada",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Habilitado por Contrase\u00f1a",
+"label.ispersistent": "Persistente",
+"label.isportable": "Zonas transversales",
+"label.ispublic": "P\u00fablica",
+"label.isready": "Listo",
+"label.isredundantrouter": "Router Redundante",
+"label.isrouting": "Enrutamiento",
+"label.isshared": "Compartidas",
+"label.issourcenat": "NAT Or\u00edgen",
+"label.isstaticnat": "NAT est\u00e1tica",
+"label.issystem": "es Sistema",
+"label.isvolatile": "Vol\u00e1til",
+"label.item.listing": "Listado de art\u00edculos",
+"label.items": "elementos",
+"label.japanese.keyboard": "Teclado Japones",
+"label.keep": "Mantener",
+"label.keep.colon": "Conservar:",
+"label.key": "Clave",
+"label.keyboard": "Lenguaje del Teclado",
+"label.keyboardtype": "Tipo de teclado",
+"label.keypair": "Par de Claves SSH",
+"label.kvmnetworklabel": "Etiqueta de tr\u00e1fico KVM",
+"label.l2gatewayserviceuuid": "UUID del Servicio Gateway L2",
+"label.l3gatewayserviceuuid": "UUID del Servicio Gateway L3",
+"label.label": "Etiqueta",
+"label.lang.arabic": "\u00c1rabe",
+"label.lang.brportugese": "Portugues de Brasil",
+"label.lang.catalan": "Catal\u00e1n",
+"label.lang.chinese": "Chino (simplificado)",
+"label.lang.dutch": "Holandes",
+"label.lang.english": "Ingl\u00e9s",
+"label.lang.french": "Frances",
+"label.lang.german": "Aleman",
+"label.lang.hungarian": "Hungaro",
+"label.lang.italian": "Italiano",
+"label.lang.japanese": "japon\u00e9s",
+"label.lang.korean": "Coreano",
+"label.lang.norwegian": "Noruego",
+"label.lang.polish": "Polaco",
+"label.lang.russian": "Ruso",
+"label.lang.spanish": "Espa\u00f1ol",
+"label.last.updated": "\u00daltima Modificaci\u00f3n",
+"label.lastname": "Apellido",
+"label.lastname.lower": "apellido",
+"label.latest.events": "\u00daltimos eventos",
+"label.launch": "Lanzar",
+"label.launch.vm": "Lanzar instancia",
+"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.lbdevicededicated": "Dedicado",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Tipo",
+"label.lbdevicestate": "Estado",
+"label.lbtype": "Tipo de Balanceador de Carga",
+"label.ldap.configuration": "Configuraci\u00f3n de LDAP",
+"label.ldap.group.name": "Grupo LDAP",
+"label.ldap.port": "Puerto de LDAP",
+"label.level": "Nivel",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Enlazar Dominio a LDAP",
+"label.linklocalip": "Direcci\u00f3n IP de Enlace Local",
+"label.load.balancer": "Balanceador de carga",
+"label.load.balancing.policies": "Pol\u00edticas de balanceo de carga",
+"label.loadbalancerinstance": "MVs Asignadas",
+"label.loadbalancerrule": "Regla de balanceo de carga",
+"label.loadbalancing": "Balanceo de Carga",
+"label.loading": "Cargando",
+"label.local": "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.localstorageenabled": "Habilitar almacenamiento local para MVs de Usuarios",
+"label.localstorageenabledforsystemvm": "Habilitar almacenamiento local para MVs de Sistema",
+"label.login": "Iniciar sesi\u00f3n",
+"label.login.portal": "Iniciar sesi\u00f3n",
+"label.logout": "Cerrar sesi\u00f3n",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "Etiqueta de tr\u00e1fico LXC",
+"label.make.project.owner": "Convertir la cuenta en propietaria del proyecto",
+"label.makeredundant": "Hacer redundante",
+"label.manage": "Administrar",
+"label.manage.resources": "Administrar los Recursos",
+"label.management": "Gesti\u00f3n",
+"label.management.ips": "Direcci\u00f3n IP de Gesti\u00f3n",
+"label.management.server": "Servidor de Gesti\u00f3n",
+"label.max.primary.storage": "Primario M\u00e1x. (GiB)",
+"label.max.secondary.storage": "Secundario M\u00e1x. (GiB)",
+"label.maxcpu": "CPU cores M\u00e1x.",
+"label.maxerrorretry": "Max Error Reintento ",
+"label.maxguestslimit": "L\u00edmite M\u00e1x. Invitados",
+"label.maximum": "M\u00e1ximo",
+"label.maxinstance": "Instancias M\u00e1x.",
+"label.maxiops": "IOPS m\u00e1ximas",
+"label.maxmemory": "Memoria M\u00e1x. (MiB)",
+"label.maxnetwork": "Redes M\u00e1x.",
+"label.maxpublicip": "IPs p\u00fablicas M\u00e1x.",
+"label.maxsnapshot": "Instant\u00e1neas M\u00e1x.",
+"label.maxtemplate": "Plantillas M\u00e1x.",
+"label.maxuservm": "MVs de usuario M\u00e1x.",
+"label.maxvolume": "Vol\u00famenes Max.",
+"label.maxvpc": "VPCs M\u00e1x.",
+"label.may.continue": "Ahora puede continuar.",
+"label.memallocated": "Asignaci\u00f3n de Memoria",
+"label.memory": "Memoria",
+"label.memory.total": "Total de memoria",
+"label.memory.used": "memoria usada",
+"label.memoryallocated": "Memoria Asignada",
+"label.memoryallocatedgb": "Asignados",
+"label.memorylimit": "L\u00edmites Memoria (MiB)",
+"label.memorymaxdeviation": "Desviaci\u00f3n",
+"label.memorytotal": "Memoria Asignada",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Usado",
+"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.destroyed.instances": "Instancias Destruidas",
+"label.menu.featured.isos": "ISOs destacadas",
+"label.menu.featured.templates": "Plantillas Destacadas",
+"label.menu.ipaddresses": "Direcciones IP",
+"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.physical.resources": "Recursos F\u00edsicos",
+"label.menu.regions": "Regiones",
+"label.menu.running.instances": "Instancias en Ejecuci\u00f3n",
+"label.menu.security.groups": "Grupos de seguridad",
+"label.menu.service.offerings": "Ofertas de Servicios",
+"label.menu.sshkeypair": "Par de Claves SSH",
+"label.menu.stopped.instances": "Instancias Paradas",
+"label.menu.storage": "Almacenamiento",
+"label.menu.system": "Sistema",
+"label.menu.virtual.appliances": "Appliances virtuales",
+"label.menu.virtual.resources": "Recursos Virtuales",
+"label.metrics": "M\u00e9tricas",
+"label.metrics.cpu.allocated": "Asignaci\u00f3n de CPU",
+"label.metrics.cpu.usage": "Uso de CPU",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Lectura",
+"label.metrics.disk.usage": "Uso del Disco",
+"label.metrics.disk.write": "Escritura",
+"label.metrics.memory.usage": "Uso de Memoria",
+"label.metrics.network.read": "Lectura",
+"label.metrics.network.usage": "Uso de Red",
+"label.metrics.network.write": "Escritura",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "Migrar instancia a",
+"label.migrate.instance.to.host": "Migrar instancia a otro anfitri\u00f3n.",
+"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\u00f3n",
+"label.migrate.to.storage": "Migrar a almacenamiento",
+"label.migrate.volume": "Migrar Volumen",
+"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": "Migrar volumen a otro almacenamiento primario",
+"label.min.balance": "Balance M\u00ednimo",
+"label.min.past.hour": "minuto(s) despu\u00e9s de la hora",
+"label.minimum": "M\u00ednimo",
+"label.mininstance": "Instancias M\u00ednimas",
+"label.miniops": "IOPS m\u00ednimas",
+"label.minute.past.hour": "minuto(s) despu\u00e9s de la hora",
+"label.minutes.past.hour": "minuto(s) despu\u00e9s de la hora",
+"label.monday": "lunes",
+"label.monthly": "mensual",
+"label.more.templates": "M\u00e1s 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.optional": "Nombre (Opcional)",
+"label.nat": "BigSwitch BCF con NAT habilitado",
+"label.nat.port.range": "Rango puertos NAT",
+"label.netmask": "m\u00e1scara de red",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "Detalles del NetScaler",
+"label.network": "Red",
+"label.network.acl": "ACL de Red",
+"label.network.acls": "ACLs de Red",
+"label.network.addvm": "Agregar red a MV",
+"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.label.display.for.blank.value": "Usar puerta de enlace por defecto",
+"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.name": "Nombre Oferta de Red",
+"label.network.offerings": "Ofertas de Red",
+"label.network.service.providers": "Proveedores de Servicios de Red",
+"label.networkcidr": "CIDR de Red",
+"label.networkdevicetype": "Tipo",
+"label.networkdomain": "Dominio de Red",
+"label.networkdomaintext": "Dominio de Red",
+"label.networkid": "Red",
+"label.networking.and.security": "Redes y Seguridad",
+"label.networkkbsread": "Lectura Red",
+"label.networkkbswrite": "Escritura Red",
+"label.networklimit": "L\u00edmites de la Red",
+"label.networkname": "Nombre de red",
+"label.networkofferingdisplaytext": "Oferta de Red",
+"label.networkofferingid": "Oferta de Red",
+"label.networkofferingidtext": "ID Oferta de Red",
+"label.networkofferingname": "Oferta de Red",
+"label.networkrate": "Tasa de Red (Mb/s)",
+"label.networkread": "Lectura Red",
+"label.networks": "Redes",
+"label.networktype": "Tipo de red",
+"label.networkwrite": "Escritura Red",
+"label.new": "Nuevo",
+"label.new.instance.group": "Nuevo Grupo de Instancias",
+"label.newinstance": "Nueva Instancia",
+"label.new.password": "Nueva contrase\u00f1a",
+"label.new.project": "Nuevo Proyecto",
+"label.new.tag": "Nueva Etiqueta",
+"label.new.vm": "Nueva MV",
+"label.newdiskoffering": "Nueva Oferta",
+"label.newsize": "Nuevo Tama\u00f1o (GB)",
+"label.next": "Siguiente",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "Almacenamiento NFS",
+"label.nfscachenfsserver": "servidor NFS",
+"label.nfscachepath": "Ruta",
+"label.nfscachezoneid": "Zona",
+"label.nfsserver": "servidor NFS",
+"label.nicadaptertype": "Tipo de adaptador NIC",
+"label.nicira.controller.address": "Direcci\u00f3n de Controladora",
+"label.nicira.nvp.details": "Detalles del NVP Nicira",
+"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\u00f3n 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\u00edculos disponibles",
+"label.no.security.groups": "No hay grupos de seguridad disponibles",
+"label.none": "Ninguno",
+"label.noselect": "No, gracias",
+"label.not.found": "No se ha encontrado",
+"label.notifications": "Notificaciones",
+"label.num.cpu.cores": "# cores de CPU",
+"label.number": "#Regla",
+"label.number.of.clusters": "N\u00famero de Clusters",
+"label.number.of.hosts": "N\u00famero de Anfitriones",
+"label.number.of.pods": "N\u00famero de Pods",
+"label.number.of.system.vms": "N\u00famero de MV's de Sistema",
+"label.number.of.virtual.routers": "N\u00famero de Routers Virtuales",
+"label.number.of.zones": "N\u00famero de Zonas",
+"label.numberofrouterrequiresupgrade": "Virtual Routers totales que requieren actualizaci\u00f3n",
+"label.numretries": "N\u00famero de reintentos",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of": "de",
+"label.of.month": "del mes",
+"label.offerha": "Oferta HA",
+"label.ok": "Aceptar",
+"label.open.documentation": "Abrir Documentaci\u00f3n",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "Controlador OpenDaylight",
+"label.opendaylight.controllerdetail": "Detalles del Controlador OpenDaylight",
+"label.opendaylight.controllers": "Controlador OpenDaylight",
+"label.optional": "Opcional",
+"label.order": "Ordenar",
+"label.oscategoryid": "Preferencia S.O. ",
+"label.ostypeid": "Tipo de Sistema Operativo",
+"label.ostypename": "Tipo de Sistema Operativo",
+"label.other": "Otro",
+"label.outofbandmanagement": "Gesti\u00f3n Fuera de Banda",
+"label.outofbandmanagement.action.issue": "Enviar Acci\u00f3n de Gesti\u00f3n de Alimentac\u00edon Fuera-de-Banda",
+"label.outofbandmanagement.changepassword": "Cambiar la contrase\u00f1a de la gesti\u00f3n Fuera-de-Banda",
+"label.outofbandmanagement.configure": "Configurar Gesti\u00f3n Fuera-de-Banda",
+"label.outofbandmanagement.disable": "Deshabilitar gesti\u00f3n Fuera-de-Banda",
+"label.outofbandmanagement.enable": "Habilitar gesti\u00f3n Fuera-de-Banda",
+"label.override.guest.traffic": "Sobreescribir Tr\u00e1fico Invitado",
+"label.override.public.traffic": "Sobreescribir Tr\u00e1fico P\u00fablico",
+"label.overrideguesttraffic": "Sobreescribir Tr\u00e1fico Invitado",
+"label.overridepublictraffic": "Sobreescribir Tr\u00e1fico P\u00fablico",
+"label.ovm3cluster": "Clustering Nativo",
+"label.ovm3networklabel": "Etiqueta de tr\u00e1fico OVM3",
+"label.ovm3pool": "Pooling Nativo",
+"label.ovm3vip": "IP del VIP Master",
+"label.ovmnetworklabel": "Etiqueta de tr\u00e1fico OVM",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Direcciones IP P\u00fablicas Propias",
+"label.owner.account": "Propietario de la cuenta",
+"label.owner.domain": "Due\u00f1o del Dominio",
+"label.pa": "Palo Alto",
+"label.page": "p\u00e1gina",
+"label.palo.alto.details": "Detalles de Palo Alto",
+"label.palp": "Perfil de Log Palo Alto",
+"label.parent.domain": "Dominio Padre",
+"label.parentname": "Padre",
+"label.passive": "Pasivo",
+"label.password": "Contrase\u00f1a",
+"label.password.reset.confirm": "La Contrase\u00f1a se ha cambiado a",
+"label.passwordenabled": "Habilitado por Contrase\u00f1a",
+"label.path": "Ruta",
+"label.patp": "Perf\u00edl de Amenazas Palo Alto",
+"label.pavr": "Router Virtual",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Autorizaci\u00f3n",
+"label.physical.network": "Red F\u00edsica",
+"label.physical.network.id": "ID de red f\u00edsica",
+"label.physical.network.name": "Nombre de red f\u00edsica",
+"label.physicalnetworkid": "Red F\u00edsica",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS Contrase\u00f1a",
+"label.ping.cifs.username": "PING CIFS nombre de usuario",
+"label.ping.dir": "PING Directorio",
+"label.ping.path": "Camino de Ping",
+"label.ping.storage.ip": "PING almacenamiento IP",
+"label.plannermode": "Modo planificaci\u00f3n",
+"label.please.complete.the.following.fields": "Por favor complete los siguientes campos",
+"label.please.specify.netscaler.info": "Por favor especifique la informaci\u00f3n 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.podid": "Pod",
+"label.podname": "Nombre del Pod",
+"label.pods": "Pod",
+"label.port": "Puerto",
+"label.port.forwarding.policies": "Pol\u00edticas de encaminamiento de puerto",
+"label.port.range": "rango de puertos",
+"label.portable.ip": "IP Port\u00e1til",
+"label.portable.ip.range.details": "Detalles del Rango de IP port\u00e1til",
+"label.portable.ip.ranges": "Rangos de IP port\u00e1tiles",
+"label.portableipaddress": "IPs Port\u00e1tiles",
+"label.portforwarding": "Encaminamiento de puerto",
+"label.powerstate": "Estado de la Alimentaci\u00f3n",
+"label.presetup": "PreConfiguraci\u00f3n",
+"label.prev": "Anterior",
+"label.previous": "Previo",
+"label.primary.network": "Red Primaria",
+"label.primary.storage": "Almacenamiento Primario",
+"label.primary.storage.allocated": "Almacenamiento Primario Asignado",
+"label.primary.storage.count": "Pools de Almacenamiento Primario",
+"label.primary.storage.used": "Almacenamiento Primario Usado",
+"label.primarystoragelimit": "L\u00edmite del Almacenamiento Primario (GiB)",
+"label.primarystoragetotal": "Almacenamiento Primario",
+"label.private.gateway": "Gateway Privado",
+"label.private.interface": "Interfaz privada",
+"label.private.ip.range": "Rango IP privado",
+"label.private.ips": "direcciones IP privadas",
+"label.private.zone": "Zona Privada",
+"label.privateinterface": "Interfaz privada",
+"label.privateip": "direcci\u00f3n IP privada",
+"label.privatekey": "Clave privada PKCS#8",
+"label.privatenetwork": "Red privada",
+"label.privateport": "Puerto privado",
+"label.profiledn": "Perfil Asociado",
+"label.profilename": "Perfil",
+"label.project": "Proyecto",
+"label.project.dashboard": "Tablero del Proyecto",
+"label.project.invite": "Invitar al proyecto",
+"label.project.name": "Nombre del Proyecto",
+"label.project.view": "Vista de Proyecto",
+"label.projectid": "ID proyecto",
+"label.projects": "Proyectos",
+"label.property": "Propiedad",
+"label.protocol": "Protocolo",
+"label.protocol.number": "N\u00famero de Protocolo",
+"label.protocolnumber": "#Protocolo",
+"label.provider": "Proveedor",
+"label.providername": "Proveedor",
+"label.providers": "Proveedores",
+"label.provisioningtype": "Tipo de Aprovisionamiento",
+"label.public.interface": "interfaz p\u00fablica",
+"label.public.ip": "direcci\u00f3n IP p\u00fablica",
+"label.public.ip.addresses": "direcciones IP p\u00fablicas",
+"label.public.ips": "Direcciones IP p\u00fablicas",
+"label.public.lb": "LB P\u00fablico",
+"label.public.load.balancer.provider": "Proveedor de Balanceador de Carga P\u00fablico",
+"label.public.network": "Red P\u00fablica",
+"label.public.traffic": "Tr\u00e1fico p\u00fablico",
+"label.public.zone": "Zona P\u00fablica",
+"label.publicinterface": "interfaz p\u00fablica",
+"label.publicip": "Direcci\u00f3n IP",
+"label.publickey": "Clave P\u00fablica",
+"label.publicnetwork": "Red P\u00fablica",
+"label.publicport": "Puerto P\u00fablico",
+"label.purpose": "Prop\u00f3sito",
+"label.pxe.server.type": "Tipo de servidor PXE",
+"label.qostype": "Tipo de QoS",
+"label.quickview": "Vista R\u00e1pida",
+"label.quiescevm": "Colocar en estado consistente a la MV",
+"label.quiettime": "Tiempo en Silencio (en seg)",
+"label.quota": "Valor de Cuota",
+"label.quota.value": "Valor de Cuota",
+"label.quota.add.credits": "Agregar Cr\u00e9ditos",
+"label.quota.configuration": "Configuraci\u00f3n de cuota",
+"label.quota.configure": "Configurar cuota",
+"label.quota.credits": "Cr\u00e9ditos",
+"label.quota.dates": "Modificar Fechas",
+"label.quota.description": "Descripci\u00f3n de cuota",
+"label.quota.enddate": "Fecha de F\u00edn",
+"label.quota.endquota": "Cuota Final",
+"label.quota.enforce": "Forzar cuota",
+"label.quota.fullsummary": "Todas las cuentas",
+"label.quota.remove": "Eliminar Cuota",
+"label.quota.startdate": "Fecha de Inicio",
+"label.quota.startquota": "Cuota Inicial",
+"label.quota.statement": "Declaraci\u00f3n",
+"label.quota.statement.balance": "Balance de Cuota",
+"label.quota.statement.bydates": "Declaraci\u00f3n",
+"label.quota.statement.quota": "Uso de la Cuota",
+"label.quota.statement.tariff": "Tarifa de la Cuota",
+"label.summary": "Resumen",
+"label.quota.tariff": "Tarifa",
+"label.quota.tariff.edit": "Editar Tarifa",
+"label.quota.tariff.effectivedate": "Fecha Efectiva",
+"label.quota.totalusage": "Uso Total",
+"label.quota.usage": "Consumo de Cuota",
+"label.rbd": "RBD",
+"label.rbdid": "Usuario Cephx",
+"label.rbdmonitor": "Monitor CEPH",
+"label.rbdpool": "Pool CEPH",
+"label.rbdsecret": "Secreto Cephx",
+"label.reason": "Reason",
+"label.reboot": "Reiniciar",
+"label.receivedbytes": "Bytes recibidos",
+"label.recent.errors": "Errores Recientes",
+"label.recover.vm": "Recuperar la MV",
+"label.redundantrouter": "Router Redundante",
+"label.redundantrouterstate": "Estado redundante",
+"label.redundantstate": "Estado redundante",
+"label.redundantvpcrouter": "VPC redundante",
+"label.reenterpassword": "Reintroducir contrase\u00f1a",
+"label.refresh": "Actualizar",
+"label.refresh.blades": "Refrescar Blade",
+"label.region": "Regi\u00f3n",
+"label.region.details": "Detalles de la Regi\u00f3n",
+"label.reinstall.vm": "Reinstalar la MV",
+"label.related": "relacionados",
+"label.relationaloperator": "Operador",
+"label.release.account": "Liberar de la Cuenta",
+"label.release.dedicated.cluster": "Liberar Cluster Dedicado",
+"label.release.dedicated.host": "Liberar Anfitri\u00f3n 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\u00f3n",
+"label.remove.rule": "Quitar Regla",
+"label.remove.ssh.key.pair": "Quitar Par de Claves SSH",
+"label.remove.static.nat.rule": "Quitar Regla NAT est\u00e1tica",
+"label.remove.static.route": "Quitar ruta est\u00e1tica",
+"label.remove.this.physical.network": "Quitar esta red f\u00edsica",
+"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.replace.acl": "Reemplazar ACL",
+"label.replace.acl.list": "Reemplazar Lista ACL",
+"label.report.bug": "Reportar un Error",
+"label.required": "Requerido",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requiere Actualizaci\u00f3n",
+"label.reserved.system.gateway": "Gateway de sistema reservado",
+"label.reserved.system.ip": "IP de Sistema Reservada",
+"label.reserved.system.netmask": "M\u00e1scara de sistema Reservada",
+"label.reservediprange": "Rango IP Reservado",
+"label.reservedsystemendip": "\u00daltima IP de sistema Reservada",
+"label.reservedsystemgateway": "Gateway de sistema reservado",
+"label.reservedsystemnetmask": "M\u00e1scara de sistema Reservada",
+"label.reservedsystemstartip": "IP inicial reservada para el sistema",
+"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.reset.vpn.connection": "Resetear la conexi\u00f3n VPN",
+"label.resetvm": "Resetear MV",
+"label.resource": "Recursos",
+"label.resource.limit.exceeded": "L\u00edmite de Recursos Excedido",
+"label.resource.limits": "L\u00edmites de Recursos",
+"label.resource.name": "Nombre del Recurso",
+"label.resourceid": "ID del Recurso",
+"label.resourcename": "Nombre del Recurso",
+"label.resources": "Recursos",
+"label.resourcestate": "Estado del recurso",
+"label.response.timeout.in.sec": "Timeout de Respuesta (en seg)",
+"label.restart.network": "Reiniciar red",
+"label.restart.vpc": "Reiniciar VPC",
+"label.restartrequired": "Reinicio requerido",
+"label.restore": "Restaurar",
+"label.retry.interval": "Intervalo de Repetici\u00f3n",
+"label.review": "Revisar",
+"label.revoke.project.invite": "Cancelar Invitaci\u00f3n",
+"label.role": "Rol",
+"label.rolename": "Rol",
+"label.roles": "Roles",
+"label.roletype": "Tipo de Rol",
+"label.root.certificate": "Certificado Ra\u00edz",
+"label.root.disk.offering": "Oferta de Disco Root",
+"label.root.disk.size": "Tama\u00f1o del disco Root (GB)",
+"label.rootdiskcontrollertype": "Controladora de disco Root",
+"label.rootdiskcontrollertypekvm": "Controladora de disco Root",
+"label.router.vm.scaled.up": "MV Router Escalada",
+"label.routercount": "Virtual Routers Totales",
+"label.routerrequiresupgrade": "Requerida Actualizaci\u00f3n",
+"label.routertype": "Tipo",
+"label.routing.host": "Servidor de Routeo",
+"label.rule": "Regla",
+"label.rule.number": "N\u00famero de Regla",
+"label.rules": "Reglas",
+"label.running": "MVs corriendo",
+"label.s3.access.key": "Clave de Acceso",
+"label.s3.bucket": "Bucket",
+"label.s3.connection.timeout": "Timeout Conexi\u00f3n",
+"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.samlenable": "Autorizar SAML SSO",
+"label.samlentity": "Proveedor de Identidad",
+"label.saturday": "s\u00e1bado",
+"label.save": "Guardar",
+"label.save.and.continue": "Guardar y continuar",
+"label.save.changes": "Grabar cambios",
+"label.saving.processing": "Guardando ....",
+"label.scale.vm": "Escalar instancia",
+"label.scale.up.policy": "POLITICA DE ESCALADO",
+"label.scaledown.policy": "Pol\u00edtica de Reducci\u00f3n",
+"label.scaleup.policy": "Pol\u00edtica de Escalado",
+"label.scope": "Alcance",
+"label.search": "Buscar",
+"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.vm": "MV de almacenamiento secundario",
+"label.secondary.used": "Almacenamiento Secundario Utilizado",
+"label.secondaryips": "IPs secundarias",
+"label.secondarystoragelimit": "L\u00edmite del Almacenamiento Secundario (GiB)",
+"label.secretkey": "clave secreta",
+"label.security.group.name": "Nombre de grupo de seguridad",
+"label.security.groups": "Grupos de Seguridad",
+"label.security.groups.enabled": "Grupos de Seguridad Habilitados",
+"label.securitygroup": "Grupo de Seguridad",
+"label.securitygroups": "Grupos de seguridad",
+"label.select": "Seleccione",
+"label.select-view": "Seleccione vista",
+"label.select.a.zone": "Seleccione una zona.",
+"label.select.deployment.infrastructure": "Seleccione la infraestructura de despliegue",
+"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\u00f3n",
+"label.select.tier": "Elija Tier",
+"label.select.vm.for.static.nat": "Seleccione MV para NAT est\u00e1tico",
+"label.self": "Mias",
+"label.sent": "Enviados",
+"label.sentbytes": "Bytes enviados",
+"label.server": "Servidor",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Router Distribuido",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "VPC a Nivel de Regi\u00f3n",
+"label.service.lb.elasticlbcheckbox": "LB El\u00e1stico",
+"label.service.lb.inlinemodedropdown": "modo",
+"label.service.lb.lbisolationdropdown": "Aislamiento de LB",
+"label.service.offering": "Oferta de Servicio",
+"label.service.offering.details": "Detalles de la oferta de servicio",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Capacidades del router redundante",
+"label.service.state": "Estado del servicio",
+"label.service.staticnat.associatepublicip": "Asociar IP P\u00fablica",
+"label.service.staticnat.elasticipcheckbox": "IP El\u00e1stica",
+"label.servicecapabilities": "Capacidades del Servicio",
+"label.servicelist": "Servicios",
+"label.serviceofferingid": "Oferta de C\u00f3mputo",
+"label.serviceofferingname": "Oferta de C\u00f3mputo",
+"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\u00f3n",
+"label.setup": "Configuraci\u00f3n",
+"label.setup.network": "Configurar Red",
+"label.setup.zone": "Configurar Zona",
+"label.shared": "Compartidas",
+"label.sharedexecutable": "Compartidas",
+"label.sharedmountpoint": "PuntoMontajeCompartido",
+"label.show.ingress.rule": "Mostrar Regla Entrada",
+"label.showing": "Mostrando",
+"label.shrinkok": "Reducci\u00f3n OK",
+"label.shutdown.provider": "Apagar proveedor",
+"label.simplified.chinese.keyboard": "Teclado Chino Simplificado",
+"label.site.to.site.vpn": "VPN Site-to-site",
+"label.size": "Tama\u00f1o",
+"label.sizegb": "Tama\u00f1o",
+"label.skip.guide": "He utilizado CloudStack anteriormente, saltar esta gu\u00eda",
+"label.smb.domain": "Dominio SMB",
+"label.smb.password": "Contrase\u00f1a SMB",
+"label.smb.username": "Nombre de usuario SMB",
+"label.smbdomain": "Dominio SMB",
+"label.smbpassword": "Contrase\u00f1a SMB",
+"label.smbusername": "Nombre de usuario SMB",
+"label.snapshot": "Instant\u00e1nea",
+"label.snapshot.name": "Nombre Instant\u00e1nea",
+"label.snapshot.schedule": "Configurar Instant\u00e1neas Recurrentes",
+"label.snapshotlimit": "L\u00edmites Instant\u00e1nea",
+"label.snapshotmemory": "Instant\u00e1nea de la memoria",
+"label.snapshots": "Instant\u00e1neas",
+"label.snmpcommunity": "Comunidad SNMP",
+"label.snmpport": "Puerto SNMP",
+"label.sockettimeout": "Timeout Socket",
+"label.source.nat.supported": "SourceNAT Soportado",
+"label.sourcecidr": "CIDR Origen",
+"label.sourceipaddress": "Direcci\u00f3n IP Origen",
+"label.sourcenat": "NAT Or\u00edgen",
+"label.sourcenattype": "Tipo de Source NAT soportado",
+"label.sourceport": "Puerto Origen",
+"label.specify.vxlan": "Especifique VXLAN",
+"label.specifyipranges": "Especificar rangos IP",
+"label.specifyvlan": "Especifique VLAN",
+"label.sr.name": "SR Nombre de etiqueta",
+"label.srx": "SRX",
+"label.srx.details": "Detalles de SRX",
+"label.ssh.key.pair.details": "Detalles del Par de Claves SSH",
+"label.ssh.key.pairs": "Par de Claves SSH",
+"label.sshkeypair": "Nuevo Par de Claves SSH",
+"label.standard.us.keyboard": "Teclado est\u00e1ndar (US)",
+"label.start.ip": "IP inicial",
+"label.start.lb.vm": "Arrancar MV LB",
+"label.start.reserved.system.ip": "IP inicial reservada para el sistema",
+"label.start.vlan": "VLAN Inicial",
+"label.start.vxlan": "VXLAN inicial",
+"label.startdate": "Por fecha (inicio)",
+"label.startip": "IP inicial",
+"label.startipv4": "IP Inicial IPv4",
+"label.startipv6": "IP Inicial IPv6",
+"label.startport": "Puerto inicial",
+"label.startquota": "Valor de Cuota",
+"label.state": "Estado",
+"label.static.nat.enabled": "NAT est\u00e1tica habilitada",
+"label.static.nat.to": "NAT est\u00e1tico para",
+"label.static.nat.vm.details": "Detalles del NAT est\u00e1tico de la MV",
+"label.static.routes": "Rutas Est\u00e1ticas",
+"label.statistics": "Estad\u00edsticas",
+"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\u00f3n <strong> </strong>",
+"label.stickiness.method": "M\u00e9todo de persistencia",
+"label.sticky.cookie-name": "Nombre de Cookie",
+"label.sticky.expire": "Expira",
+"label.sticky.holdtime": "Tiempo de Retenci\u00f3n",
+"label.sticky.indirect": "Indirecto",
+"label.sticky.length": "Longitud",
+"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\u00f1o de tabla",
+"label.stop": "Detener",
+"label.stop.lb.vm": "Detener LB MV",
+"label.stopped": "MVs detenidas",
+"label.storage": "Almacenamiento",
+"label.storage.tags": "Etiquetas de almacenamiento",
+"label.storage.traffic": "Tr\u00e1fico de Almacenamiento",
+"label.storageid": "Almacenamiento Primario",
+"label.storagepool": "Pool de Almacenamiento",
+"label.storagetags": "Etiquetas de almacenamiento",
+"label.storagetype": "Tipo de almacenamiento",
+"label.subdomainaccess": "Acceso al Subdominio",
+"label.submit": "Enviar",
+"label.submitted.by": "[Enviado por: <span id=\"submitted_by\"> </span>]",
+"label.succeeded": "Result\u00f3 con \u00e9xito",
+"label.sunday": "Domingo",
+"label.supportedservices": "Servicios Soportados",
+"label.supportspublicaccess": "Soporta Acceso P\u00fablico",
+"label.supportsregionlevelvpc": "Soporte de VPC a Nivel de Regi\u00f3n",
+"label.supportsstrechedl2subnet": "Soporta Subred Streched L2",
+"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.offerings": "Ofertas de Servicio de VM de Sistema",
+"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.vms": "MVs de Sistema",
+"label.system.wide.capacity": "Capacidad total del sistema",
+"label.systemvmtype": "Tipo de MV de 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.tariffvalue": "Valor Tarifario",
+"label.task.completed": "Tarea finalizada",
+"label.template": "Plantilla",
+"label.templateiso": "Plantilla/ISO",
+"label.templatebody": "Cuerpo",
+"label.templatedn": "Elegir Plantilla",
+"label.templatefileupload": "Archivo local",
+"label.templatelimit": "L\u00edmites Plantilla",
+"label.templatename": "Plantilla",
+"label.templatenames": "Plantilla",
+"label.templates": "Plantillas",
+"label.templatesubject": "Tema",
+"label.templatetotal": "Plantilla",
+"label.templatetype": "Plantilla de E-Mail",
+"label.tftp.dir": "Directorio de TFTP",
+"label.tftpdir": "Directorio ra\u00edz 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.details": "Detalles del Tier",
+"label.tiername": "Tier",
+"label.time": "Tiempo",
+"label.time.colon": "Tiempo:",
+"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.hosts": "Total de Hosts",
+"label.total.memory": "Memoria Total",
+"label.total.storage": "Almacenamiento Total",
+"label.total.vms": "Total MVs",
+"label.totalcpu": "Total CPU",
+"label.traffic.label": "Etiqueta de trafico",
+"label.traffic.types": "Tipos de Tr\u00e1fico",
+"label.traffictype": "Tipo de Tr\u00e1fico",
+"label.transportzoneuuid": "UUID de la Zona de Transporte",
+"label.tuesday": "Martes",
+"label.type": "Tipo",
+"label.type.id": "ID de Tipo",
+"label.ucs": "UCS",
+"label.uk.keyboard": "Teclado UK",
+"label.unavailable": "No disponible",
+"label.unhealthy.threshold": "Fuera del Umbral Saludable",
+"label.unit": "Unidad de Uso",
+"label.unlimited": "Ilimitado",
+"label.untagged": "Sin etiquetar",
+"label.update.instance.group": "Actualizar Grupo de Instancias",
+"label.update.project.resources": "Actualizar recursos del proyecto",
+"label.update.ssl": " Certificado SSL",
+"label.update.ssl.cert": " Certificado SSL",
+"label.updating": "Actualizando",
+"label.upgrade.router.newer.template": "Actualizar Router para usar una Plantilla m\u00e1s 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.sanity.result": "Resultado del Uso Sanitizado",
+"label.usage.server": "Servidor de Uso",
+"label.usageinterface": "Interfaz de uso",
+"label.usagename": "Tipo de Uso",
+"label.usageunit": "Unidad",
+"label.use.vm.ip": "Usar IP MV:",
+"label.use.vm.ips": "Usar las IP de la MV",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Usuario",
+"label.user.details": "Detalles del Usuario",
+"label.user.vm": "MV de Usuario",
+"label.userdata": "DatosUsuario",
+"label.userdatal2": "Datos de Usuario",
+"label.username": "Nombre de usuario",
+"label.users": "Usuarios",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "Valor",
+"label.vcdcname": "nombre DC vCenter",
+"label.vcenter": "vcenter",
+"label.vcenter.cluster": "Cl\u00faster vCenter ",
+"label.vcenter.datacenter": "Centros de datos vCenter ",
+"label.vcenter.datastore": "Almac\u00e9n de datos vCenter",
+"label.vcenter.host": "Anfitri\u00f3n vCenter",
+"label.vcenter.password": "Contrase\u00f1a vCenter",
+"label.vcenter.username": "Nombre de usuario vCenter",
+"label.vcenterdatacenter": "Centros de datos vCenter ",
+"label.vcenterdatastore": "Almac\u00e9n de datos vCenter",
+"label.esx.host": "ESX / ESXi anfitri\u00f3n",
+"label.vcenterpassword": "Contrase\u00f1a vCenter",
+"label.vcenterusername": "Nombre de usuario vCenter",
+"label.vcipaddress": "Direcci\u00f3n IP de vCenter",
+"label.vcsdeviceid": "ID",
+"label.version": "Versi\u00f3n",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "Resoluci\u00f3n M\u00e1x",
+"label.vgpu.max.vgpu.per.gpu": "vGPUs por GPU",
+"label.vgpu.remaining.capacity": "Capacidad remanente",
+"label.vgpu.video.ram": "Video RAM",
+"label.vgputype": "Tipo de vGPU",
+"label.view": "Ver",
+"label.view.all": "Ver todo",
+"label.view.console": "Ver consola",
+"label.view.more": "Ver m\u00e1s",
+"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\u00e1quina virtual",
+"label.virtual.machines": "Maquinas virtuales",
+"label.virtual.network": "Red Virtual",
+"label.virtual.networking": "Red 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\u00faster",
+"label.virtual.routers.group.pod": "Routers Virtuales agrupados por pod",
+"label.virtual.routers.group.zone": "Router Virtuales agrupados por zona",
+"label.virtualmachinedisplayname": "Nombre de la MV",
+"label.virtualmachineid": "ID de MV",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "Rango VLAN/VNI",
+"label.vlan.range.details": "Detalle de  Rango VLAN",
+"label.vlan.vni.ranges": "Rango(s) VLAN/VNI",
+"label.vlanid": "ID de VLAN/VNI",
+"label.vlanname": "VLAN",
+"label.vlanrange": "Rango VLAN/VNI",
+"label.vm.add": "A\u00f1adir Instancia",
+"label.vm.destroy": "Destroy",
+"label.vm.password": "La Contrase\u00f1a de la MV es",
+"label.vm.reboot": "Reiniciar",
+"label.vm.snapshots": "Instant\u00e1neas de MV",
+"label.vm.start": "Inicio",
+"label.vm.stop": "Detener",
+"label.vmdisplayname": "Nombra a mostrar de la MV",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "Almac\u00e9n de datos VMFS",
+"label.vmipaddress": "Direcci\u00f3n IP de la MV",
+"label.vmlimit": "L\u00edmites de Instancia ",
+"label.vmname": "Nombre de la MV",
+"label.vms": "MVs",
+"label.vms.in.tier": "MVs en el tier",
+"label.vmstate": "Estado de la MV",
+"label.vmtotal": "MVs totales",
+"label.vmwaredcid": "ID datacenter VMware",
+"label.vmwaredcname": "Nombre del datacenter VMware",
+"label.vmwaredcvcenter": "vcenter del datacenter VMware",
+"label.vmwarenetworklabel": "Etiqueta de tr\u00e1fico VMware",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "Dispositivo VNMC",
+"label.volgroup": "Group de Vol\u00famen",
+"label.volume": "Vol\u00famen",
+"label.volume.details": "Detalles del Volumen",
+"label.volume.migrated": "Volumen migrado",
+"label.volumechecksum": "suma de verificaci\u00f3n MD5",
+"label.volumefileupload": "Archivo local",
+"label.volumegroup": "Group de Vol\u00famen",
+"label.volumelimit": "L\u00edmites Vol\u00famen",
+"label.volumename": "Nombre de Volumen",
+"label.volumes": "Vol\u00famenes",
+"label.volumetotal": "Vol\u00famen",
+"label.vpc": "VPC",
+"label.vpc.id": "ID VPC",
+"label.vpc.offering.details": "Detalles de las ofertas de VPC",
+"label.vpc.offerings": "Ofertas de VPC",
+"label.vpc.router.details": "Detalles del Router VPC",
+"label.vpc.virtual.router": "Router Virtual VPC",
+"label.vpcid": "VPC",
+"label.vpclimit": "L\u00edmites de VPC",
+"label.vpcname": "VPC",
+"label.vpcoffering": "Oferta de VPC",
+"label.vpn": "VPN",
+"label.vpn.connection": "Conexi\u00f3n VPN",
+"label.vpn.gateway": "Gateway VPN",
+"label.vpncustomergatewayid": "Gateway VPN del Cliente",
+"label.vsmctrlvlanid": "VLAN ID de Control",
+"label.vsmdeviceid": "Nombre",
+"label.vsmdevicestate": "Estado",
+"label.vsmipaddress": "Direcci\u00f3n IP del Nexus 1000v",
+"label.vsmpassword": "Contrase\u00f1a del Nexus 1000v",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "VLAN ID del Almacenamiento",
+"label.vsmusername": "Usuario del Nexus 1000v",
+"label.vsmusername.req": "Usuario del Nexus 1000v",
+"label.vsphere.managed": "vSphere Gestionado",
+"label.vswitch.name": "Nombre del vSwitch",
+"label.vswitch.type": "Tipo de vSwitch",
+"label.vswitchguestname": "Nombre del  vSwitch para Tr\u00e1fico Invitado",
+"label.vswitchguesttype": "Tipo de vSwitch para Tr\u00e1fico Invitado",
+"label.vswitchpublicname": "Nombre de vSwitch para Tr\u00e1fico P\u00fablico",
+"label.vswitchpublictype": "Tipo de vSwitch para Tr\u00e1fico P\u00fablico",
+"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\u00e9rcoles",
+"label.weekly": "Semanal",
+"label.welcome": "Bienvenido",
+"label.welcome.cloud.console": "Bienvenido a la consola de administraci\u00f3n",
+"label.what.is.cloudstack": "Que es CloudStack&#8482?",
+"label.writecachetype": "Tipo de cache de escritura",
+"label.xennetworklabel": "Etiqueta de tr\u00e1fico XenServer",
+"label.xenservertoolsversion61plus": "Versi\u00f3n Original XS es 6.1+",
+"label.yes": "S\u00ed",
+"label.yourinstance": "Tu instancia",
+"label.zone": "Zona",
+"label.zone.dedicated": "Zona Dedicada",
+"label.zone.details": "Detalles de Zona",
+"label.zone.id": "Zona de identificaci\u00f3n",
+"label.zone.step.1.title": "Paso 1: <strong> Seleccione una red </strong>",
+"label.zone.step.2.title": "Paso 2: <strong>A\u00f1adir una zona </strong>",
+"label.zone.step.3.title": "Paso 3: <strong>A\u00f1adir un pod </strong>",
+"label.zone.step.4.title": "Paso 4: <strong>A\u00f1adir un rango IP </strong>",
+"label.zone.type": "Tipo de Zona",
+"label.zone.wide": "Zona para todo el",
+"label.zoneid": "Zona",
+"label.zonename": "Zona",
+"label.zonenamelabel": "Nombre de la Zona",
+"label.zones": "Zona",
+"label.zonewizard.traffictype.guest": "Guest: Tr\u00e1fico entre las m\u00e1quinas virtuales de usuario final",
+"label.zonewizard.traffictype.management": "Management: Tr\u00e1fico entre los recursos internos de CloudStack, incluyendo cualquier componente que se comunique con el Servidor de Gesti\u00f3n, tales como anfitriones y las MVs de Sistema del propio Cloudstack",
+"label.zonewizard.traffictype.public": "Public: Tr\u00e1fico entre internet y las m\u00e1quinas virtuales en el cloud.",
+"label.zonewizard.traffictype.storage": "Almacenamiento: Tr\u00e1fico entre los servidores de almacenamiento primario y secundario, tales como plantillas de MV e instant\u00e1neas",
+"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\u00e1quina 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\u00f3n del mantenimiento del anfitri\u00f3n 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.cluster": "Por favor, confirme que desea eliminar del cl\u00faster",
+"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\u00e1 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\u00e1 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.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.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.physical.network": "Por favor confirme que desea borrar esta red f\u00edsica",
+"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\u00e1nea",
+"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\u00faster.",
+"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\u00edsica",
+"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\u00e1tico.",
+"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\u00faster.",
+"message.action.enable.maintenance": "Su anfitri\u00f3n ha sido preparado para Mantenimiento correctamente. Este proceso puede llevar varios minutos o m\u00e1s dependiendo de cuantas MVs est\u00e1n corriendo actualmente en este anfitri\u00f3n. ",
+"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\u00edsica",
+"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\u00f3n forzada de su anfitri\u00f3n. Este proceso puede tardar hasta varios minutos.",
+"message.action.host.enable.maintenance.mode": "Habilitar el modo mantenimiento causar\u00e1 la migraci\u00f3n en vivo de todas las instancias en ejecuci\u00f3n de este anfitri\u00f3n a otro cualquiera disponible.",
+"message.action.instance.reset.password": "Por favor, confirmar que desea cambiar la contrase\u00f1a de ROOT para esta m\u00e1quina virtual.",
+"message.action.manage.cluster": "Por favor, confirme que desea administrar el Cl\u00faster.",
+"message.action.primarystorage.enable.maintenance.mode": "Advertencia: colocar el almacenamiento principal en modo de mantenimiento har\u00e1 que todas las MV que utilicen vol\u00famenes de \u00e9ste se paren. \u00bfDesea 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\u00e1n 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\u00f3n.",
+"message.action.reset.password.off": "Su instancia no soporta esta caracter\u00edstica actualmente.",
+"message.action.reset.password.warning": "Su instancia debe ser detenida antes de intentar cambiar la contrase\u00f1a 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\u00e1nea.",
+"message.action.settings.warning.vm.running": "Por favor detenga la instancia para acceder a las configuraciones",
+"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\u00e1n interrumpidos. Por favor confirmar que desea apagarlo.",
+"message.action.stop.systemvm": "Por favor, confirme que desea detener esta MV de Sistema. ",
+"message.action.unmanage.cluster": "Por favor, confirme que desea dejar de gestionar el Cl\u00faster.",
+"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\u00e1nea de la MV.",
+"message.action.vmsnapshot.revert": "Revertir instant\u00e1nea de MV",
+"message.activate.project": "Usted esta seguro que quiere activar este proyecto?",
+"message.add.cluster": "A\u00f1adir un Cl\u00faster 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\u00f1adir un Cl\u00faster gestionado de hipervisor para la zona <b> zona <span id=\"zone_name\"> </span> </b>",
+"message.add.disk.offering": "Por favor, especifique los par\u00e1metros 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\u00f1adir 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\u00e1metros siguientes para agregar un nuevo Anfitri\u00f3n.",
+"message.add.ip.range": "A\u00f1adir un rango de IP a la red p\u00fablica en la zona",
+"message.add.ip.range.direct.network": "A\u00f1adir 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\u00f1adir un rango IP al Pod: <b><span id=\"pod_name_label\"> </span> </b> </p> ",
+"message.add.load.balancer": "A\u00f1adir 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\u00f3n necesaria para agregar un nuevo gateway a este VPC.",
+"message.add.pod": "A\u00f1adir 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\u00e1s 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\u00e1fico interno de gesti\u00f3n utilizado por CloudStack's. El rango de IP reservado debe ser \u00fanico para cada zona en el cloud.",
+"message.add.primary": "Por favor, especifique los par\u00e1metros siguientes para agregar un nuevo almacenamiento primario",
+"message.add.primary.storage": "A\u00f1adir 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\u00f3n requerida para agregar una nueva regi\u00f3n.",
+"message.add.secondary.storage": "A\u00f1adir 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.add.vpn.gateway": "Por favor confirme que usted quiere agregar un VPN Gateway",
+"message.added.vpc.offering": "Oferta VPC agregada",
+"message.adding.host": "Agregando un anfitri\u00f3n",
+"message.adding.netscaler.device": "Agregando un dispositivo NetScaler",
+"message.adding.netscaler.provider": "Agregando un proveedor NetScaler",
+"message.additional.networks.desc": "Por favor seleccione red(es) adicional(es) a las cuales estar\u00e1 conectada la instancia virtual.",
+"message.admin.guide.read": "Para MV basadas en VMware, lea por favor el cap\u00edtulo de escalado din\u00e1mico en la gu\u00eda de administraci\u00f3n antes de escalar. \u00bfDesea continuar?",
+"message.advanced.mode.desc": "Seleccione este modelo de red si desea habilitar soporte VLAN. Este modelo de red proporciona la m\u00e1xima flexibilidad al permitir a los administradores proporcionar ofertas personalizadas de la red como el suministro de firewall, VPN, o balanceador de carga, as\u00ed\u00ad como red directa vs virtual. ",
+"message.advanced.security.group": "Elija esta opci\u00f3n si desea utilizar grupos de seguridad para proporcionar aislamiento de MV invitada.",
+"message.advanced.virtual": "Elija esta opci\u00f3n si desea utilizar VLAN de extensi\u00f3n de zona para proporcionar el aislamiento MV invitado.",
+"message.after.enable.s3": "Almacenamiento Secundario sobre S3 configurado. Nota: Cuando salga de esta p\u00e1gina, no podr\u00e1 volver a reconfigurar S3 nuevamente.",
+"message.after.enable.swift": "Swift configurado. Nota: Cuando salga de esta p\u00e1gina, no podr\u00e1 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\u00f1a del usuario al que desea permitir el acceso de VPN.",
+"message.apply.snapshot.policy": "Ha actualizado su pol\u00edtica de instant\u00e1neas 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\u00e1 conectando un volumen de disco a una m\u00e1quina virtual basada en Windows, deber\u00e1 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\u00e1 una direcci\u00f3n IP directamente desde la red y se utilizar\u00e1n grupos de seguridad para proporcionar la seguridad y la segregaci\u00f3n.",
+"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\u00f1a.",
+"message.cluster.dedicated": "Cl\u00faster Dedicado",
+"message.cluster.dedication.released": "Eliminada la Dedicaci\u00f3n del Cl\u00faster ",
+"message.configure.all.traffic.types": "Tiene multiples redes f\u00edsicas, por favor configure las etiquetas para cada tipo de tr\u00e1fico haciendo click en el bot\u00f3n de Editar.",
+"message.configure.firewall.rules.allow.traffic": "Configurar las reglas para permitir Tr\u00e1fico",
+"message.configure.firewall.rules.block.traffic": "Configurar las reglas para bloquear Tr\u00e1fico",
+"message.configure.ldap": "Por favor confirme que desea configurar LDAP.",
+"message.configuring.guest.traffic": "Configurando el tr\u00e1fico de Invitado",
+"message.configuring.physical.networks": "Configurando las redes f\u00edsicas",
+"message.configuring.public.traffic": "Configurando el tr\u00e1fico p\u00fablico",
+"message.configuring.storage.traffic": "Configurando el tr\u00e1fico de almacenamiento",
+"message.confirm.action.force.reconnect": "Por favor confirme que desea forzar la reconexi\u00f3n 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": "\u00bf Est\u00e1 seguro que desea conectar el disco?",
+"message.confirm.create.volume": "\u00bfEst\u00e1 seguro que desea crear un volumen?",
+"message.confirm.current.guest.cidr.unchanged": "\u00bfDesea mantener el CIDR de la red guest actual sin cambios?",
+"message.confirm.dedicate.cluster.domain.account": "\u00bfRealmente desea dedicar este cluster al dominio/cuenta?",
+"message.confirm.dedicate.host.domain.account": "\u00bfDesea dedicar este hosts a un dominio/cuenta?",
+"message.confirm.dedicate.pod.domain.account": "\u00bfDesea dedicar este por a un dominio/cuenta?",
+"message.confirm.dedicate.zone": "\u00bfRealmente quiere dedicar esta zona a un domino/cuenta?",
+"message.confirm.delete.acl.list": "\u00bfEsta seguro que desea borrar esta lista de ACL?",
+"message.confirm.delete.alert": "\u00bfEst\u00e1 seguro que desea borrar esta alerta?",
+"message.confirm.delete.baremetal.rack.configuration": "Por favor confirme que desea borrar la configuraci\u00f3n del Rack Baremetal.",
+"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.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.f5": "Por  favor confirme que quiere eliminar el F5",
+"message.confirm.delete.internal.lb": "Por favor confirme que desea borrar este LB Interno",
+"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.secondary.staging.store": "Por favor confirme que desea borrar el Almacenamiento Secundario Temporal.",
+"message.confirm.delete.srx": "Por favor confirme que desa borrar este SRX",
+"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": "\u00bfEsta 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": "\u00bfEsta 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": "\u00bfEsta 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": "\u00bfEsta 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": "\u00bfQuiere 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": "\u00bf Desea liberar este cl\u00faster dedicado?",
+"message.confirm.release.dedicated.host": "\u00bfDesea liberar este servidor dedicado?",
+"message.confirm.release.dedicated.pod": "\u00bfDesea liberar este pod dedicado?",
+"message.confirm.release.dedicated.zone": "\u00bfDesea liberar esta zona dedicada?",
+"message.confirm.remove.event": "\u00bfEst\u00e1 seguro que desea quitar este evento?",
+"message.confirm.remove.ip.range": "Por favor confirme que desea quitar este rango IP.",
+"message.confirm.remove.load.balancer": "Por favor confirme que desea quitar esta MV del balanceador de carga",
+"message.confirm.remove.network.offering": "\u00bfEsta 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": "\u00bfEsta seguro que desea quitar esta oferta de VPC?",
+"message.confirm.replace.acl.new.one": "\u00bfDesea reemplazar este ACL con uno nuevo?",
+"message.confirm.scale.up.router.vm": "\u00bfDesea escalar la MV utilizada como Router?",
+"message.confirm.scale.up.system.vm": "\u00bfDesea 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": "\u00bfDesea 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\u00f3n antes de crear una plantilla de su volumen de disco: <b> <span id=\"volume_name\"> </span> </b>. Creaci\u00f3n de la plantilla puede oscilar entre varios minutos m\u00e1s, dependiendo del tama\u00f1o del volumen.",
+"message.creating.cluster": "Creando cluster",
+"message.creating.guest.network": "Creando red de invitado",
+"message.creating.physical.networks": "Creando redes f\u00edsicas",
+"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.dedicate.zone": "Dedicando zona",
+"message.dedicated.zone.released": "Dedicaci\u00f3n de zona liberada",
+"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.delete.vpn.connection": "Por favor confirme que usted quiere eliminar la conexi\u00f3n 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.desc.add.new.lb.sticky.rule": "Agregar nueva regla Sticky al LB",
+"message.desc.advanced.zone": "Para topologia de redes m\u00e1s 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 \u00fanica 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\u00e1s clusters; ahora agregaremos el primero. Un cl\u00faster proporciona una forma de agrupar anfitriones. Los anfitriones de un cl\u00faster deben tener id\u00e9ntico hardware, ejecutar el mismo hipervisor, estar en la misma subred y utilizar el mismo almacenamiento compartido. Cada cl\u00faster consiste en uno o m\u00e1s anfitriones y uno o m\u00e1s 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\u00fablica esta definida, CloudStack la registrar\u00e1. Uds puede usarla por medio de la clave privada.<br/><br/>2. Si la clave p\u00fablica no esta definida, CloudStack crear\u00e1 un nuevo Par de Claves SSH. En este caso, por favor copie y grab\u00e9 la clave privada. CloudStack no la almacenar\u00e1.<br/>",
+"message.desc.created.ssh.key.pair": "Par de Claves SSH creadas.",
+"message.desc.host": "Cada cl\u00faster debe contener por lo menos un anfitri\u00f3n (servidor) para que se ejecuten las MVs Invitado en \u00e9ste; agregaremos el primer anfitri\u00f3n ahora. Para que un anfitri\u00f3n funcione en CloudStack, se debe instalar el software del hypervisor, asignarle una IP al host en la red de Gesti\u00f3n y asegurarse de que \u00e9ste conecta correctamente con servidor de gesti\u00f3n de CloudStack.<br/><br/>Indicar el nombre DNS del anfitri\u00f3n o su direcci\u00f3n IP, el nombre del usuario (usualmente root), su contrase\u00f1a y las etiquetas necesarias para catalogar a los anfitriones.",
+"message.desc.primary.storage": "Cada cl\u00faster debe contener uno o m\u00e1s servidores primarios de almacenamiento, y ahora se agregar\u00e1 el primero. El almacenamiento primario contiene los vol\u00famenes de disco para todas las MVs en ejecuci\u00f3n en los anfitriones del cl\u00faster. Utilice cualquier protocolo est\u00e1ndar 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\u00e1 cambiada al realizar esta operaci\u00f3n si la opci\u00f3n de contrase\u00f1a esta habilitada.",
+"message.desc.secondary.storage": "Cada zona debe tener al menos un servidor de NFS secundario, y se agregar\u00e1 el primero ahora. El almacenamiento secundario guarda las plantillas de MV, las im\u00e1genes ISO, y las instantaneas de volumentes. Este server debe estar disponible a todos los hosts de la zona.<br/><br/>Complete con la direcci\u00f3n IP y el PATH exportado",
+"message.desc.zone": "Una zona es la unidad organizacional m\u00e1s grande en CloudStack, y t\u00edpicamente se corresponde con un datacenter en particular. Las Zonas proveen aislamiento f\u00edsico y redundancia. Una zona consiste de uno o m\u00e1s 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": "\u00bf Est\u00e1 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\u00e1quinas virtuales en ejecuci\u00f3n ser\u00e1n apagadas de forma inmediata.",
+"message.disable.snapshot.policy": "Ha desactivado su pol\u00edtica de instant\u00e1neas 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\u00edmites de los recursos siguientes. A \"-1\" indica que no hay l\u00edmite a la cantidad de los recursos de crear.",
+"message.edit.traffic.type": "Por favor indique la etiqueta de tr\u00e1fico que desea asociar con este tipo de tr\u00e1fico.",
+"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\u00f3n IP.",
+"message.enable.vpn.access": "VPN est\u00e1 desactivado actualmente para esta direcci\u00f3n IP. \u00bfQuerr\u00eda hablitar el acceso VPN?",
+"message.enabled.vpn": "Su acceso a la VPN est\u00e1 habilitado y se puede acceder a trav\u00e9s 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\u00e1s de uno",
+"message.enter.token": "Por favor ingrese el token que recibi\u00f3 en la invitaci\u00f3n 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\u00e1fico de red invitado se refiere a la comunicaci\u00f3n entre las m\u00e1quinas virtuales del usuario final. Especifique un rango de VLAN IDs para transportar este tr\u00e1fico para cada red f\u00edsica.",
+"message.guest.traffic.in.basic.zone": "El tr\u00e1fico de las redes invitado es el generado entre las m\u00e1quina virtuales del usuario final. Especifique un rango de direcciones IP para que CloudStack pueda asignar a las MVs Invitado. Asegures\u00e9 que este rango no se solape con el rango IP reservado para el sistema.",
+"message.host.dedicated": "Servidor Dedicado",
+"message.host.dedication.released": "Dedicaci\u00f3n de Servidor liberada",
+"message.installwizard.click.retry": "Haz click en el bot\u00f3n 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\u00e9ntico, ejecutan el mismo hipervisor, est\u00e1n en la misma subred y utilizan el mismo almacenamiento compartido. Las instancias de m\u00e1quinas virtuales (MVs) pueden migrarse en caliente desde un servidor a otro dentro del mismo cluster, sin interrupci\u00f3n del servicio del usuario. Un cluster es la tercera forma organizacional en una instalaci\u00f3n de CloudStack&#8482; . Los cl\u00fasters est\u00e1n contenidos dentro de los pods, los pods estar contenidos en las zonas.<br/><br/>CloudStack&#8482;  permite m\u00faltiple clusters en una instalaci\u00f3n de cloud, pero para realizar una instalaci\u00f3n b\u00e1sica, solo necesitamos uno.",
+"message.installwizard.copy.whatisahost": "Un servidor es una sola computadora. Los Servidores proveen los recursos de \u00f3omputo necesarios para ejecutar las m\u00e1quinas 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\u00eda de Administraci\u00f3n Avanzada). Por ejemplo, un servidor Linux con KVM habilitado, un servidor con Citrix XenServer o un servidor con ESXi. En una instalaci\u00f3n Basica, usaremos un solo servidor ejecutando XenServer o KVM. <br/><br/>El servidor es la m\u00ednima unidad organizacional de CloudStack&#8482; .Los servidores est\u00e1n contenidos dentro de los cl\u00fasters, los cl\u00fasters en los pods, y estos \u00faltimos en las zonas.",
+"message.installwizard.copy.whatisapod": "Un pod representa generalmente un solo rock. Los servidores en el mismo pod estar\u00e1n en la misma subred.<br/><br/>El pod es la segunda agrupaci\u00f3n organizacional dentro de CloudStack&#8482; .Los Pod est\u00e1n contenidos dentro de la zona. Cada zona puede contener uno m\u00e1s pods. En la instalaci\u00f3n B\u00e1sica, solo se necesita tener un pod en la zona.",
+"message.installwizard.copy.whatisazone": "Una zona es la unidad organizacional m\u00e1s grande dentro de una instalaci\u00f3n 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\u00edsico y redundancia. Por ejemplo, cada zona puede tener su propia fuente de alimentaci\u00f3n y uplink de red, ademas de poder estar separadas geogr\u00e1ficamente en grandes distancias (lo cual no es obligatorio).",
+"message.installwizard.copy.whatiscloudstack": "CloudStack&#8482 es una plataforma de software que aglutina recursos c\u00f3mputo para construir Infraestructuras como Servicio (IaaS), tanto de cloud p\u00fablico como privado e h\u00edbrido.\nCloudStack&#8482 gestiona la red, el almacenamiento y los nodos de c\u00f3mputo que conforma la infraestructura de cloud. Se puede usar CloudStack&#8482 para desplegar, gestionar y configurar entornos de computaci\u00f3n en la nube.<br/><br/> Cloudstack&#8482 vam\u00e1s all\u00e1 del manejo individual de m\u00e1quinas virtuales en hardware de prop\u00f3sito general, ya que proporciona una soluci\u00f3n 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\u00edsticas casi id\u00e9nticas.",
+"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\u00famenes de discos de cada MV para todas las MVs en los servidores del cl\u00faster. El almacenamiento primario est\u00e1 t\u00edpicamente alojado cerca de los servidores.",
+"message.installwizard.copy.whatissecondarystorage": "El almacenamiento secundario est\u00e1 asociado a una zona, y almacena lo siguiente: <ul> <li> Plantillas - im\u00e1genes del sistema operativo que se pueden utilizar para arrancar MVs, pueden \u00edncluir informaci\u00f3n de configuraci\u00f3n adicional, como las aplicaciones instaladas </li><li>Im\u00e1genes ISO - im\u00e1genes del Sistema Operativo que pueden ser arrancables o no arrancables </li><li>Instant\u00e1neas de vol\u00famenes de disco  - copias guardadas de datos de MV que se pueden utilizar para la recuperaci\u00f3n 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\u00f3n y no es utilizado por Cloudstack.",
+"message.installwizard.tooltip.addhost.hostname": "El nombre DNS o direcci\u00f3n IP del host",
+"message.installwizard.tooltip.addhost.password": "Este es el password para el nombre de usuario mencionado anteriormente (Desde su Instalaci\u00f3n 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\u00e1ticos.",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "La puerta de enlace para los host en ese pod.",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "La m\u00e1scara en uso en la subred que utilizar\u00e1n 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\u00f3mputo.",
+"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\u00f3n en donde se monta el almacenamiento primario. Por ejemplo, \"/mnt/primary\".",
+"message.installwizard.tooltip.addprimarystorage.server": "(para NFS, iSCSI, o PreSetup) La direcci\u00f3n IP o el nombre DNS del dispositivo de almacenamiento.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "Direcci\u00f3n 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\u00e1n las MVs invitado en la zona. A estos servidores DNS se accede por la red p\u00f1ublica que se a\u00f1ade a posteriori. Las direcciones IP p\u00fablicas de la zona deben tener una ruta al servidor de nombres mencionado aqu\u00ed. ",
+"message.installwizard.tooltip.addzone.dns2": "Estos son los servidores de DNS que utilizar\u00e1n las MVs invitado en la zona. A estos servidores DNS se accede por la red p\u00f1ublica que se a\u00f1ade a posteriori. Las direcciones IP p\u00fablicas de la zona deben tener una ruta al servidor de nombres mencionado aqu\u00ed. ",
+"message.installwizard.tooltip.addzone.internaldns1": "Estos son los servidores de DNS que utilizar\u00e1n 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\u00ed. ",
+"message.installwizard.tooltip.addzone.internaldns2": "Estos son los servidores de DNS que utilizar\u00e1n 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\u00ed. ",
+"message.installwizard.tooltip.addzone.name": "Un nombre para la zona.",
+"message.installwizard.tooltip.configureguesttraffic.description": "Una descripci\u00f3n para su red.",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "El rango de direcciones IP que estar\u00e1 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\u00e1scara de red en uso en la subred que los clientes deben utilizar",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "El rango de direcciones IP que estar\u00e1 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": "\u00bfRealmente 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\u00f3n IP pudo haber cambiado. \u00bfLe gustar\u00eda actualizar el listado? Tenga en cuenta que en este caso el panel de detalles se cerrar\u00e1.",
+"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": "\u00bfDesea lanzar su instancias en tu red privada dedicada?",
+"message.launch.zone": "La Zona esta lista para ser lanzada, por favor prosiga al pr\u00f3ximo paso.",
+"message.ldap.group.import": "Todos los usuarios del nombre de grupo indicado ser\u00e1n 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\u00e1n capaces de gestionar sus recursos cloud. Los recursos existentes podr\u00e1n seguir siendo accedidos. ",
+"message.migrate.instance.confirm": "Por favor, confirme a qu\u00e9 anfitri\u00f3n desea migrar la instancia virtual.",
+"message.migrate.instance.to.host": "Por favor, confirme que desea mover la instancia a otro anfitri\u00f3n.",
+"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\u00e9 anfitri\u00f3n que desea migrar el router:",
+"message.migrate.systemvm.confirm": "Por favor, confirme a qu\u00e9 anfitri\u00f3n 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\u00e1 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\u00f3 la configuraci\u00f3n de acceso remoto por VPN, pero fall\u00f3 su aplicaci\u00f3n. Por favor verifique la conectividad de todos los elementos de red y vuelva a intentarlo.",
+"message.network.removenic": "Por favor, confirme que desea quitar esta NIC, lo que har\u00e1 que tambi\u00e9n se quite la red asociada de la MV.",
+"message.network.updateip": "Por favor confirme que desea cambiar la direcci\u00f3n IP de esta NIC en la MV.",
+"message.new.user": "Especifique lo siguiente para agregar un nuevo usuario a la cuenta",
+"message.no.affinity.groups": "No hay ning\u00fan grupo de afinidad. Por favor continue con el paso siguiente.",
+"message.no.host.available": "No anfitriones disponibles para la Migraci\u00f3n",
+"message.no.network.support": "El hipervisor seleccionado, vSphere, no tiene funciones de red adicionales. Por favor, contin\u00fae 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\u00fae con el paso 5.",
+"message.no.projects": "No tienes ning\u00fan proyecto.<br/>Pro favor crear uno nuevo desde la secci\u00f3n de Proyectos.",
+"message.no.projects.adminonly": "No tienes ning\u00fan proyecto.<br/>Por favor dile a tu administrador que cree uno nuevo.",
+"message.number.clusters": "<h2> <span> # de </span> Cl\u00fasters </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\u00f3n, el anfitri\u00f3n est\u00e1 en modo mantenimiento",
+"message.password.has.been.reset.to": "La Contrase\u00f1a se ha cambiado a",
+"message.password.of.the.vm.has.been.reset.to": "La Contrase\u00f1a 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\u00f3n de proyectos y seleccione la invitaci\u00f3n desde la lista desplegable.",
+"message.please.add.at.lease.one.traffic.range": "Por favor agregue al menos un rango de tr\u00e1fico.",
+"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\u00f3n para su zona.",
+"message.please.select.a.different.public.and.management.network.before.removing": "Por favor elija una red p\u00fablica y de gesti\u00f3in 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\u00f3n de Pod liberada",
+"message.portable.ip.delete.confirm": "Por favor confirme que desea borrar el Rango IP Port\u00e1til",
+"message.project.invite.sent": "Invitaci\u00f3n enviada al usuario, se agregar\u00e1 al proyecto solo cuando acepte la invitaci\u00f3n.",
+"message.public.traffic.in.advanced.zone": "El tr\u00e1fico p\u00fablico se genera cuando las MVs del Cloud acceden a recursos sobre Internet. Para ello se deben asignar direcciones IP p\u00fablicas. Los usuarios pueden usar la interfaz de  CloudStack para adquirir estas IPs e implementar NAT entre su red de Invitados y su red p\u00fablica.<br/><br/> Debe proveer por lo menos un rango de direcciones IP para el tr\u00e1fico de Internet.",
+"message.public.traffic.in.basic.zone": "El tr\u00e1fico p\u00fablico se genera cuando las MVs en el cloud acceden a Internet o proveen servicios a clientes sobre Internet. Para este prop\u00f3sito deben asignarse direcciones IPs p\u00fablicas. Cuando se crea una instancia, se asigna una IP de este conjunto de IPs Publicas ademas de la direcci\u00f3n IP en la red de invitado. Se configurar\u00e1 NAT est\u00e1tico 1-1 de forma autom\u00e1tica entre la IP p\u00fablica y la IP invitado. Los usuarios tambi\u00e9n pueden utilizar la interfaz de CLoudStack para adquirir IPs adicionales para implementar NAT est\u00e1tico entre las instancias y la IP p\u00fablica.",
+"message.question.are.you.sure.you.want.to.add": "Est\u00e1 seguro que quiere agregar",
+"message.read.admin.guide.scaling.up": "Por favor lea la secci\u00f3n de escalado din\u00e1mico en la gu\u00eda de administraci\u00f3n antes de escalar.",
+"message.recover.vm": "Confirme que quiere recuperar esta MV.",
+"message.redirecting.region": "Redirigiendo a la regi\u00f3n...",
+"message.reinstall.vm": "NOTA: Proceda con precauci\u00f3n. Esta acci\u00f3n har\u00e1 que la MV se vuelva a instalar usando la plantilla. Los datos en el disco ra\u00edz se perder\u00e1n. Los vol\u00famenes de datos adicionales no se modificar\u00e1n.",
+"message.remove.ldap": "\u00bfQuiere borrar la configuraci\u00f3n LDAP?",
+"message.remove.region": "\u00bfEsta seguro que desea quitar esta regi\u00f3n del servidor de gesti\u00f3n?",
+"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\u00f3 un Par de Claves SSH",
+"message.reset.password.warning.notpasswordenabled": "La plantilla de esta instancia fue creada sin contrase\u00f1a habilitada",
+"message.reset.password.warning.notstopped": "Su instancia debe ser detenida antes de intentar cambiar la contrase\u00f1a actual.",
+"message.reset.vpn.connection": "Por favor confirme que desea resetear la conexi\u00f3n de la VPN",
+"message.restart.mgmt.server": "Por favor, reinicie el servidor de gesti\u00f3n (s) para que la nueva configuraci\u00f3n surta efecto.",
+"message.restart.mgmt.usage.server": "Por favor reinicie sus servidores de gesti\u00f3n y de uso, para que la nueva configuraci\u00f3n se haga efectiva.",
+"message.restart.network": "Todos los servicios provistos por esta red ser\u00e1n 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\u00f3n: creando un VPC sin redundancia forzara la limpieza. Todas las redes dejaran de estar disponibles por unos minutos</i>.</small></p>",
+"message.restorevm": "\u00bfDesea recuperar la MV?",
+"message.role.ordering.fail": "Reordenaci\u00f3n de permisos de reglas abortada ya que la lista ha cambiado mientras realizaba los cambios. Por favor, intente de nuevo. ",
+"message.role.update.fail": "Failed updating rule permission",
+"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\u00faltiples zonas pueden ayudar a aumentar la disponibilidad del cloud al proveer aislamiento f\u00edsico 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\u00e1s redes f\u00edsicas. Cada red se corresponder\u00e1 con una NIC del hipervisor. Cada red f\u00edsica puede transportar uno o m\u00e1s tipos de tr\u00e1fico, con ciertas restricciones en como ellos se combinan.<br/><br/><strong>Arrastre y suelte uno o m\u00e1s tipos de tr\u00e1fico</strong> sobre cada red f\u00edsica.",
+"message.setup.physical.network.during.zone.creation.basic": "Cuando se esta agregando un zona b\u00e1sica, puedes configurar un red f\u00edsica que se corresponda a una NIC del hipervisor. La red transporta varios tipos de tr\u00e1fico.<br/><br/>Puedes tambi\u00e9n <strong>arrastrar y soltar</strong> otro tipos de tr\u00e1fico en la interfaz f\u00edsica.",
+"message.setup.successful": "La configuraci\u00f3n del cloud finalizo satisfactoriamente.",
+"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.desc": "Por favor seleccione una plantilla para su nueva instancia virtual. Tambi\u00e9n puede escoger  seleccionar una plantilla en blanco en la que instalar una im\u00e1gen 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\u00e1 conectada su instancia virtual",
+"message.storage.traffic": "Tr\u00e1fico entre los recursos internos de CloudStack, incluyendo cualquier componente que se comunique con el servidor de gesti\u00f3n, tales como anfitriones y las Mvs de sistema de CloudStack. Por favor, configure el tr\u00e1fico del almacenamiento aqu\u00ed.",
+"message.suspend.project": "\u00bfEst\u00e1 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.template.iso": "Por favor seleccione una plantilla o ISO para continuar",
+"message.tier.required": "El Tier es obligatorio.",
+"message.tooltip.dns.1": "Nombre del servidor DNS que ser\u00e1 usado por las MVs en la zona. Las direcciones IP p\u00fablicas de la zona deber\u00e1n 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\u00fablicas para esta zona deben tener una ruta a este servidor.",
+"message.tooltip.internal.dns.1": "Nombre del servidor DNS que ser\u00e1 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\u00e1 usado por las MVs internas de sistema de CloudStack en la zona. Las direcciones IP privadas de la zona deber\u00e1n tener una ruta a este servidor.",
+"message.tooltip.network.domain": "Un sufijo DNS que crear\u00e1 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\u00f3n 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\u00f3n. Todas las instancias virtuales con preferencias similares ser\u00e1n asignadas en primer lugar a este anfitri\u00f3n 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\u00ede 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\u00f3n del Certficado SSL.",
+"message.update.ssl.succeeded": "Actualizaci\u00f3n del Certificado SSL exitosa",
+"message.validate.accept": "Por favor ingrese un valor con extensi\u00f3n v\u00e1lida.",
+"message.validate.creditcard": "Por favor ingrese un n\u00famero de tarjeta de cr\u00e9dito v\u00e1lido.",
+"message.validate.date": "Por favor ingrese una fecha v\u00e1lida.",
+"message.validate.date.iso": "Por favor ingrese una fecha (ISO) v\u00e1lida.",
+"message.validate.digits": "Por favor ingrese solo d\u00edgitos.",
+"message.validate.email.address": "Por favor introduzca un email v\u00e1lido.",
+"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\u00e1s largo de 63 caracteres. Solo se permiten letras ASCII tales como  a~z, A~Z, n\u00fameros 0~9, los guiones est\u00e1n permitidos. Deben empezar con una letra y finalizar con una letra o una cifra.",
+"message.validate.invalid.characters": "Se han hallado caracteres no v\u00e1lidos. Por favor, corr\u00edjalos.",
+"message.validate.max": "Por favor ingrese un valor menor o igual que  {0}.",
+"message.validate.maxlength": "Por favor ingrese no m\u00e1s de {0} caracteres.",
+"message.validate.minlength": "Por favor ingrese al menos  {0} caracteres.",
+"message.validate.number": "Por favor ingrese un n\u00famero v\u00e1lido.",
+"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.validate.url": "Por favor ingrese una URL v\u00e1lida.",
+"message.virtual.network.desc": "Una red dedicada virtualizada para su cuenta. El dominio de difusi\u00f3n est\u00e1 contenido dentro de una VLAN y todos los accesos a la red p\u00fablica se encaminan mediante un router virtual.",
+"message.vm.create.template.confirm": "Crear plantilla reiniciar\u00e1 la m\u00e1quina virtual autom\u00e1ticamente.",
+"message.vm.review.launch": "Por favor revise la siguiente informaci\u00f3n 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\u00f3n de la plantilla puede oscilar de varios minutos a m\u00e1s, dependiendo del tama\u00f1o del volumen.",
+"message.waiting.for.builtin.templates.to.load": "Esperando por las plantillas incorporadas para cargar...",
+"message.xstools61plus.update.failed": "La actualizaci\u00f3n fall\u00f3, la versi\u00f3n original de XS es 6.1+. Error:",
+"message.you.must.have.at.least.one.physical.network": "Debes tener por lo menos una red f\u00edsica",
+"message.your.cloudstack.is.ready": "Tu CloudStack esta listo!",
+"message.zone.creation.complete": "Creaci\u00f3n de la zona completada",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Creci\u00f3n de la zona completada.\u00bfDesea 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\u00f3n para agregar una nueva zona",
+"message.zone.step.3.desc": "Por favor ingrese la siguiente informaci\u00f3n para agregar un nuevo pod",
+"message.zonewizard.enable.local.storage": "PRECAUCI\u00d3N: 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\u00e9s de creada. Tambi\u00e9n 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\u00e1metro system.vm.use.local.storage debe ser puesto en true antes de habilitar la zona.<br/><br/><br/>\u00bfDesea continuar?",
+"messgae.validate.min": "Por favor ingrese un valor mayor o igual que {0}.",
+"network.rate": "Tasa de Red",
+"side.by.side": "Juntos",
+"state.accepted": "Aceptado",
+"state.active": "Activo",
+"state.allocating": "Asignando",
+"state.backedup": "Respaldado",
+"state.backingup": "Realizando Backup",
+"state.completed": "Completado",
+"state.creating": "Creando",
+"state.declined": "Declinado",
+"state.destroyed": "Destruidas",
+"state.detached": "Desconectado",
+"state.disabled": "Deshabilitados",
+"state.enabled": "Habilitado",
+"state.error": "Error",
+"state.expunging": "Purgando",
+"state.migrating": "Migrando",
+"state.pending": "Pendiente",
+"state.running": "Ejecutando",
+"state.starting": "Iniciando",
+"state.stopped": "Detenidas",
+"state.stopping": "Parando",
+"state.suspended": "Suspendido",
+"title.upload.volume": "Subir Volumen"
+}
\ No newline at end of file
diff --git a/ui/public/locales/fr_FR.json b/ui/public/locales/fr_FR.json
new file mode 100644
index 0000000..447b864
--- /dev/null
+++ b/ui/public/locales/fr_FR.json
@@ -0,0 +1,2366 @@
+{
+"changed.item.properties": "Propri\u00e9t\u00e9s de l'\u00e9l\u00e9ment modifi\u00e9es",
+"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\u00e9.",
+"error.could.not.enable.zone": "Impossible d'activer la zone",
+"error.installwizard.message": "Une erreur s'est produite ; vous pouvez retourner en arri\u00e8re et corriger les erreurs",
+"error.invalid.username.password": "Identifiant ou mot de passe invalide",
+"error.login": "Votre identifiant / mot de passe ne correspond pas \u00e0 nos enregistrements.",
+"error.menu.select": "\u00c9chec de l'action car il n'y a aucun \u00e9l\u00e9ment s\u00e9lectionn\u00e9.",
+"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\u00e9seau ne sera pas disponible tant que des libell\u00e9s n'auront pas \u00e9t\u00e9 renseign\u00e9s pour ce r\u00e9seau physique.",
+"error.session.expired": "Votre session a expir\u00e9e.",
+"error.unable.to.reach.management.server": "Impossible d'attendre le serveur de gestion",
+"error.unresolved.internet.name": "Votre nom Internet ne peut pas \u00eatre r\u00e9solu.",
+"force.delete.domain.warning": "Attention : Choisir cette option entra\u00eenera la suppression de tous les domaines issus et l'ensemble des comptes associ\u00e9s, ainsi que de leur ressources",
+"force.remove": "Suppression forc\u00e9e",
+"force.remove.host.warning": "Attention : Choisir cette option entra\u00eenera CloudStack \u00e0\u00a0forcer l'arr\u00eat de l'ensemble des machines virtuelles avant d'enlever cet h\u00f4te du cluster",
+"force.stop": "Forcer l'arr\u00eat",
+"force.stop.instance.warning": "Attention : un arr\u00eat forc\u00e9 sur cette instance est la dernier option. Cela peut engendrer des pertes de donn\u00e9es et/ou un comportement inconsistant de votre instance.",
+"hint.no.host.tags": "Aucun libell\u00e9 d'h\u00f4te trouv\u00e9",
+"hint.no.storage.tags": "Aucune libell\u00e9 de stockage trouv\u00e9",
+"hint.type.part.host.tag": "Saisir le cadre d'un libell\u00e9 d'h\u00f4te",
+"hint.type.part.storage.tag": "Saisir le cadre d'un libell\u00e9 de stockage",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "R\u00e9pertoire d'images",
+"inline": "Align\u00e9",
+"label.about": "A propos de",
+"label.about.app": "A propos de CloudStack",
+"label.accept.project.invitation": "Accepter l'invitation au projet",
+"label.accesskey": "Cl\u00e9 d'Acc\u00e8s",
+"label.account": "Compte",
+"label.account.and.security.group": "Compte, groupe de s\u00e9curit\u00e9",
+"label.account.details": "D\u00e9tails compte",
+"label.account.id": "ID de compte",
+"label.account.name": "Nom de compte",
+"label.account.specific": "Sp\u00e9cifique au compte",
+"label.accounts": "Comptes",
+"label.accounttype": "Type Compte",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ID ACL",
+"label.acl.list.rules": "Liste r\u00e8gles ACL",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL remplac\u00e9e",
+"label.aclid": "ACL",
+"label.aclname": "Nom ACL",
+"label.acltotal": "Total R\u00e8gles d'acc\u00e8s r\u00e9seau",
+"label.acquire.new.ip": "Acqu\u00e9rir nouvelle adr. IP",
+"label.acquire.new.secondary.ip": "Acqu\u00e9rir 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.configure.stickiness": "Fid\u00e9lit\u00e9",
+"label.action.copy.iso": "Copier une image ISO",
+"label.action.copy.iso.processing": "Copie ISO...",
+"label.action.copy.template": "Copier mod\u00e8le",
+"label.action.copy.template.processing": "Copie mod\u00e8le...",
+"label.action.create.template.from.vm": "Cr\u00e9er un mod\u00e8le depuis la VM",
+"label.action.create.template.from.volume": "Cr\u00e9er un mod\u00e8le depuis le volume",
+"label.action.create.template.processing": "Cr\u00e9ation du Mod\u00e8le...",
+"label.action.create.vm": "Cr\u00e9er une VM",
+"label.action.create.vm.processing": "Cr\u00e9ation de la VM...",
+"label.action.create.volume": "Cr\u00e9er un Volume",
+"label.action.create.volume.processing": "Cr\u00e9ation du Volume...",
+"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\u00e8gle de pare-feu",
+"label.action.delete.firewall.processing": "Suppression du Pare-feu...",
+"label.action.delete.ingress.rule": "Supprimer la r\u00e8gle d'entr\u00e9e",
+"label.action.delete.ingress.rule.processing": "Suppression de la r\u00e8gle d'entr\u00e9e..",
+"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.load.balancer": "Supprimer la r\u00e8gle de r\u00e9partition de charge",
+"label.action.delete.load.balancer.processing": "Suppression du r\u00e9partiteur de charge...",
+"label.action.delete.network": "Supprimer le r\u00e9seau",
+"label.action.delete.network.processing": "Suppression du r\u00e9seau...",
+"label.action.delete.nexusvswitch": "Supprimer le Nexus 1000v",
+"label.action.delete.nic": "Supprimer carte NIC",
+"label.action.delete.physical.network": "Supprimer le r\u00e9seau 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\u00e9curit\u00e9",
+"label.action.delete.security.group.processing": "Suppression du groupe de s\u00e9curit\u00e9",
+"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\u00e9",
+"label.action.delete.snapshot.processing": "Suppression de l'instantan\u00e9...",
+"label.action.delete.system.service.offering": "Supprimer Offre de Service Syst\u00e8me",
+"label.action.delete.template": "Supprimer le mod\u00e8le",
+"label.action.delete.template.processing": "Suppression du mod\u00e8le...",
+"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\u00e8me",
+"label.action.destroy.systemvm.processing": "Suppression de la VM Syst\u00e8me...",
+"label.action.destroy.volume": "Destroy Volume",
+"label.action.detach.disk": "D\u00e9tacher le disque",
+"label.action.detach.disk.processing": "D\u00e9tachement du disque...",
+"label.action.detach.iso": "D\u00e9tacher l'image ISO",
+"label.action.detach.iso.processing": "D\u00e9tachement de l'image ISO...",
+"label.action.disable.account": "D\u00e9sactiver le compte",
+"label.action.disable.account.processing": "D\u00e9sactivation du compte...",
+"label.action.disable.cluster": "D\u00e9sactiver le cluster",
+"label.action.disable.cluster.processing": "D\u00e9sactivation du cluster...",
+"label.action.disable.nexusvswitch": "D\u00e9sactiver le Nexus 1000v",
+"label.action.disable.physical.network": "D\u00e9sactiver le r\u00e9seau physique",
+"label.action.disable.pod": "D\u00e9sactiver le Pod",
+"label.action.disable.pod.processing": "D\u00e9sactivation du Pod...",
+"label.action.disable.static.nat": "D\u00e9sactiver le NAT Statique",
+"label.action.disable.static.nat.processing": "D\u00e9sactivation du NAT Statique...",
+"label.action.disable.user": "D\u00e9sactiver l'utilisateur",
+"label.action.disable.user.processing": "D\u00e9sactivation de l'utilisateur...",
+"label.action.disable.zone": "D\u00e9sactivation de la zone",
+"label.action.disable.zone.processing": "D\u00e9sactivation de la zone...",
+"label.action.download.iso": "T\u00e9l\u00e9charger une image ISO",
+"label.action.download.template": "T\u00e9l\u00e9charger un mod\u00e8le",
+"label.action.download.volume": "T\u00e9l\u00e9charger un volume",
+"label.action.download.volume.processing": "T\u00e9l\u00e9chargement du volume...",
+"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\u00f4te",
+"label.action.edit.instance": "Modifier l'instance",
+"label.action.edit.iso": "Modifier l'image ISO",
+"label.action.edit.network": "Modifier le r\u00e9seau",
+"label.action.edit.network.offering": "Modifier Offre R\u00e9seau",
+"label.action.edit.network.processing": "Modification du R\u00e9seau...",
+"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\u00e8le",
+"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\u00e9seau 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\u00e9n\u00e9rer les cl\u00e9s",
+"label.action.generate.keys.processing": "G\u00e9n\u00e9ration des cl\u00e9s...",
+"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\u00e9rer 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\u00e8me",
+"label.action.migrate.systemvm.processing": "Migration VM syst\u00e8me en cours ...",
+"label.action.project.add.account": "Ajouter un compte au projet",
+"label.action.reboot.instance": "Red\u00e9marrer l'instance",
+"label.action.reboot.instance.processing": "Red\u00e9marrage de l'instance...",
+"label.action.reboot.router": "Red\u00e9marrer le routeur",
+"label.action.reboot.router.processing": "Red\u00e9marrage du routeur...",
+"label.action.reboot.systemvm": "Red\u00e9marrer VM Syst\u00e8me",
+"label.action.reboot.systemvm.processing": "Red\u00e9marrage de la VM Syst\u00e8me...",
+"label.action.recover.volume": "Recover Volume",
+"label.action.recurring.snapshot": "Instantan\u00e9s r\u00e9currents",
+"label.action.register.iso": "Enregistrer ISO",
+"label.action.register.template": "Enregistrer mod\u00e8le depuis une URL",
+"label.action.release.ip": "Lib\u00e9rer l'adresse IP",
+"label.action.release.ip.processing": "Lib\u00e9ration de l'adresse IP...",
+"label.action.remove.host": "Supprimer l'h\u00f4te",
+"label.action.remove.host.processing": "Suppression de l'h\u00f4te...",
+"label.action.reset.password": "R\u00e9-initialiser le mot de passe",
+"label.action.reset.password.processing": "R\u00e9-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\u00e9tablir Instantan\u00e9",
+"label.action.revert.snapshot.processing": "Retour \u00e0 l'instantan\u00e9...",
+"label.action.start.instance": "D\u00e9marrer l'instance",
+"label.action.start.instance.processing": "D\u00e9marrage de l'instance...",
+"label.action.start.router": "D\u00e9marrer le routeur",
+"label.action.start.router.processing": "D\u00e9marrage du routeur...",
+"label.action.start.systemvm": "D\u00e9marrer la VM syst\u00e8me",
+"label.action.start.systemvm.processing": "D\u00e9marrage de la VM syst\u00e8me...",
+"label.action.stop.instance": "Arr\u00eater l'Instance",
+"label.action.stop.instance.processing": "Arr\u00eat de l'Instance...",
+"label.action.stop.router": "Arr\u00eater le routeur",
+"label.action.stop.router.processing": "Arr\u00eat du routeur...",
+"label.action.stop.systemvm": "Arr\u00eater VM Syst\u00e8me",
+"label.action.stop.systemvm.processing": "Arr\u00eat de la VM syst\u00e8me...",
+"label.action.take.snapshot": "Prendre un instantan\u00e9",
+"label.action.take.snapshot.processing": "Prise de l'instantan\u00e9...",
+"label.action.unmanage.cluster": "Ne plus g\u00e9rer le Cluster",
+"label.action.unmanage.cluster.processing": "Arr\u00eat de la gestion du Cluster",
+"label.action.update.os.preference": "Mettre \u00e0 jour les pr\u00e9f\u00e9rences d'OS",
+"label.action.update.os.preference.processing": "Mise \u00e0 jour des pr\u00e9f\u00e9rences d'OS...",
+"label.action.update.resource.count": "Mettre \u00e0 jour le compteur des ressources",
+"label.action.update.resource.count.processing": "Mise \u00e0 jour du compteur...",
+"label.action.vmsnapshot.create": "Prendre un instantan\u00e9 VM",
+"label.action.vmsnapshot.delete": "Supprimer l'instantan\u00e9 VM",
+"label.action.vmsnapshot.revert": "R\u00e9tablir Instantan\u00e9 VM",
+"label.actions": "Actions",
+"label.activate.project": "Activer projet",
+"label.activeviewersessions": "Sessions actives",
+"label.add": "Ajouter",
+"label.add.account": "Ajouter un compte",
+"label.add.accounts": "Ajouter des comptes",
+"label.add.accounts.to": "Ajouter des comptes sur",
+"label.add.acl": "Ajouter r\u00e8gle ACL",
+"label.add.acl.list": "Ajouter Liste ACL",
+"label.add.affinity.group": "Ajouter nouveau groupe d'affinit\u00e9",
+"label.add.baremetal.dhcp.device": "Ajouter un DHCP Baremetal",
+"label.add.baremetal.rack.configuration": "Ajouter Configuration Rack Baremetal",
+"label.add.bigswitchbcf.device": "Ajouter un contr\u00f4leur BigSwitch BCF",
+"label.add.brocadevcs.device": "Ajouter Switch Brocade Vcs",
+"label.add.by": "Ajout\u00e9 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\u00e8gle sortante",
+"label.add.f5.device": "Ajouter un F5",
+"label.add.firewall": "Ajouter une r\u00e8gle de pare-feu",
+"label.add.globo.dns": "Ajouter GloboDNS",
+"label.add.gslb": "Ajouter GSLB",
+"label.add.guest.network": "Ajouter un r\u00e9seau d'invit\u00e9",
+"label.add.host": "Ajouter un h\u00f4te",
+"label.add.ingress.rule": "Ajouter une r\u00e8gle d'entr\u00e9e",
+"label.add.intermediate.certificate": "Ajouter certificat interm\u00e9diaire",
+"label.add.internal.lb": "Ajouter LB interne",
+"label.add.ip.range": "Ajouter une plage IP",
+"label.add.isolated.guest.network": "Ajouter un r\u00e9seau d'invit\u00e9 isol\u00e9",
+"label.add.isolated.guest.network.with.sourcenat": "Ajouter un r\u00e9seau d'invit\u00e9 isol\u00e9 avec SourceNat",
+"label.add.isolated.network": "Ajouter un r\u00e9seau isol\u00e9",
+"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\u00e9partiteur de charge",
+"label.add.more": "Ajouter plus",
+"label.add.netscaler.device": "Ajouter un Netscaler",
+"label.add.network": "Ajouter un r\u00e9seau",
+"label.add.network.acl": "Ajouter une r\u00e8gle d'acc\u00e8s r\u00e9seau ACL",
+"label.add.network.acl.list": "Ajouter Liste ACL r\u00e9seau",
+"label.add.network.device": "Ajouter un \u00e9quipement r\u00e9seau",
+"label.add.network.offering": "Ajouter Offre R\u00e9seau",
+"label.add.new.f5": "Ajouter un F5",
+"label.add.new.gateway": "Ajouter une nouvelle passerelle",
+"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.tier": "Ajouter un nouveau tiers",
+"label.add.nfs.secondary.staging.store": "Ajouter un Stockage Secondaire Interm\u00e9diaire NFS",
+"label.add.niciranvp.device": "Ajouter un contr\u00f4leur Nvp",
+"label.add.opendaylight.device": "Ajouter contr\u00f4leur OpenDaylight",
+"label.add.pa.device": "Ajouter p\u00e9riph\u00e9rique Palo Alto",
+"label.add.physical.network": "Ajouter un r\u00e9seau physique",
+"label.add.pod": "Ajouter un pod",
+"label.add.port.forwarding.rule": "Ajouter une r\u00e8gle 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\u00e9e",
+"label.add.region": "Ajouter R\u00e9gion",
+"label.add.resources": "Ajouter ressources",
+"label.add.role": "Ajouter R\u00f4le",
+"label.add.route": "Ajouter route",
+"label.add.rule": "Ajouter r\u00e8gle",
+"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\u00e9curit\u00e9",
+"label.add.service.offering": "Ajouter Offre Service",
+"label.add.srx.device": "Ajouter un SRX",
+"label.add.static.nat.rule": "Ajouter une r\u00e8gle de NAT statique",
+"label.add.static.route": "Ajouter une route statique",
+"label.add.system.service.offering": "Ajouter Offre Service Syst\u00e8me",
+"label.add.template": "Ajouter un mod\u00e8le",
+"label.add.to.group": "Ajouter au groupe",
+"label.add.ucs.manager": "Ajouter Gestionnaire UCS",
+"label.add.user": "Ajouter un utilisateur",
+"label.add.vlan": "Ajouter un VLAN",
+"label.add.vm": "Ajouter VM",
+"label.add.vm.to.tier": "Ajouter une machine virtuelle au tiers",
+"label.add.vms": "Ajouter VMs",
+"label.add.vms.to.lb": "Ajouter une/des VM(s) \u00e0 la r\u00e8gle de r\u00e9partition 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.gateway": "Ajouter une passerelle VPN",
+"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\u00e9e",
+"label.added.new.bigswitch.bcf.controller": "Ajout du nouveau contr\u00f4leur BigSwitch BCF",
+"label.added.nicira.nvp.controller": "Ajout d'un nouveau contr\u00f4leur Nicira NVP",
+"label.addes.new.f5": "Ajout d'un nouveau F5",
+"label.adding": "Ajout",
+"label.adding.cluster": "Ajout du Cluster",
+"label.adding.failed": "\u00c9chec de l'ajout",
+"label.adding.pod": "Ajout du Pod",
+"label.adding.processing": "Ajout...",
+"label.adding.succeeded": "Ajout r\u00e9ussi",
+"label.adding.user": "Ajout de l'utilisateur",
+"label.adding.zone": "Ajout de la zone",
+"label.additional.networks": "R\u00e9seaux additionnels",
+"label.address": "Adresse",
+"label.admin": "Administrateur",
+"label.admin.accounts": "Comptes Administrateur",
+"label.advanced": "Avanc\u00e9",
+"label.advanced.mode": "Mode avanc\u00e9",
+"label.advanced.search": "Recherche avanc\u00e9e",
+"label.affinity": "Affinit\u00e9",
+"label.affinity.groups": "Groupes d'Affinit\u00e9",
+"label.affinitygroup": "Groupe d'Affinit\u00e9",
+"label.agent.password": "Mot de passe Agent",
+"label.agent.username": "Identifiant Agent",
+"label.agentport": "Port Agent",
+"label.agentstate": "Statut Agent",
+"label.agree": "Accepter",
+"label.alert": "Alerte",
+"label.alert.archived": "Alerte archiv\u00e9e",
+"label.alert.deleted": "Alerte supprim\u00e9e",
+"label.alert.details": "D\u00e9tails Alerte",
+"label.alerts": "Alertes",
+"label.algorithm": "Algorithme",
+"label.all": "Tous",
+"label.allocated": "Allou\u00e9",
+"label.allocationstate": "\u00c9tat",
+"label.allow": "Autoriser",
+"label.anti.affinity": "Anti-affinit\u00e9",
+"label.anti.affinity.group": "Groupe d'Anti-affinit\u00e9",
+"label.anti.affinity.groups": "Groupes d'Anti-affinit\u00e9",
+"label.api.version": "Version d'API",
+"label.apikey": "Cl\u00e9 d'API",
+"label.app.name": "CloudStack",
+"label.apply": "Appliquer",
+"label.archive": "Archiver",
+"label.archive.alerts": "Archiver alertes",
+"label.archive.events": "Archiver \u00e9v\u00e9nements",
+"label.assign": "Assigner",
+"label.assign.instance.another": "Assigner l'instance \u00e0 un autre compte",
+"label.assign.to.load.balancer": "Assigner l'instance au r\u00e9partiteur de charge",
+"label.assign.vms": "Assigner VMs",
+"label.associatednetwork": "R\u00e9seau associ\u00e9",
+"label.associatednetworkid": "ID du r\u00e9seau associ\u00e9",
+"label.associatednetworkname": "Nom du r\u00e9seau",
+"label.author.email": "Email auteur",
+"label.author.name": "Nom auteur",
+"label.autoscale": "AutoScale",
+"label.autoscale.configuration.wizard": "Assistant de configuration AutoScale",
+"label.availability": "Disponibilit\u00e9",
+"label.availabilityzone": "availabilityZone",
+"label.available": "Disponible",
+"label.available.public.ips": "Adresses IP publiques disponibles",
+"label.back": "Retour",
+"label.balance": "Balance",
+"label.bandwidth": "Bande passante",
+"label.baremetal.dhcp.devices": "\u00c9quipements DHCP Baremetal",
+"label.baremetal.dhcp.provider": "Fournisseur DHCP Baremetal",
+"label.baremetal.pxe.device": "Ajouter un PXE Baremetal",
+"label.baremetal.pxe.devices": "\u00c9quipements PXE Baremetal",
+"label.baremetal.pxe.provider": "Fournisseur PXE Baremetal",
+"label.baremetal.rack.configuration": "Configuration Rack Baremetal",
+"label.baremetalcpu": "CPU (en MHz)",
+"label.baremetalcpucores": "Nombre de c\u0153urs",
+"label.baremetalmac": "Adresse MAC h\u00f4te",
+"label.baremetalmemory": "M\u00e9moire (en MB)",
+"label.basic": "Basique",
+"label.basic.mode": "Mode basique",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "D\u00e9tails BigSwitch BCF",
+"label.bigswitch.controller.address": "Adresse du contr\u00f4leur BigSwitch Vns",
+"label.bladeid": "ID Lame",
+"label.blades": "Lames",
+"label.bootable": "Amor\u00e7able",
+"label.broadcastdomainrange": "Plage du domaine multi-diffusion",
+"label.broadcastdomaintype": "Type de domaine de multi-diffusion",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Adress Vcs Switch",
+"label.brocade.vcs.details": "D\u00e9tails Switch Brocade Vcs",
+"label.bucket": "Seau",
+"label.by.account": "Par compte",
+"label.by.alert.type": "Par type d'alerte",
+"label.by.availability": "Par disponibilit\u00e9",
+"label.by.domain": "Par domaine",
+"label.by.end.date": "Par date de fin",
+"label.by.event.type": "Par type d'\u00e9v\u00e9nement",
+"label.by.level": "Par niveau",
+"label.by.pod": "Par Pod",
+"label.by.role": "Par r\u00f4le",
+"label.by.start.date": "Par date de d\u00e9but",
+"label.by.state": "Par \u00e9tat",
+"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.cachemode": "Type Write-cache",
+"label.cancel": "Annuler",
+"label.capacity": "Capacit\u00e9",
+"label.capacity.iops": "Capacit\u00e9 IOPS",
+"label.capacitybytes": "Capacit\u00e9 Octets",
+"label.capacityiops": "IOPS Total",
+"label.certificate": "Certificat",
+"label.change.affinity": "Changer Affinit\u00e9",
+"label.change.ipaddress": "Changer adresse IP pour NIC",
+"label.change.service.offering": "Modifier Offre Service",
+"label.change.value": "Modifier la valeur",
+"label.character": "Caract\u00e8re",
+"label.chassis": "Ch\u00e2ssis",
+"label.checksum": "checksum",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR ou Compte/Groupe de s\u00e9curit\u00e9",
+"label.cidr.of.destination.network": "CIDR du r\u00e9seau de destination",
+"label.cidrlist": "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\u00e9tails ressource CiscoVNMC",
+"label.cleanup": "Nettoyage",
+"label.clear.list": "Purger la liste",
+"label.close": "Fermer",
+"label.cloud.console": "Console d'Administration du Cloud",
+"label.cloud.managed": "G\u00e9r\u00e9 par Cloud.com",
+"label.cluster": "Cluster",
+"label.cluster.name": "Nom du cluster",
+"label.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Nom du cluster",
+"label.clusters": "Clusters",
+"label.clustertype": "Type de Cluster",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.community": "Communaut\u00e9",
+"label.compute": "Processeur",
+"label.compute.and.storage": "Calcul et Stockage",
+"label.compute.offerings": "Offres de Calcul",
+"label.configuration": "Configuration",
+"label.configure": "Configurer",
+"label.configure.ldap": "Configurer LDAP",
+"label.configure.network.acls": "Configurer les r\u00e8gles d'acc\u00e8s r\u00e9seau ACL",
+"label.configure.sticky.policy": "Configurer Strat\u00e9gie Sticky",
+"label.configure.vpc": "Configurer le VPC",
+"label.confirmation": "Confirmation",
+"label.confirmdeclineinvitation": "Voulez-vous refuser cette invitation au projet ?",
+"label.confirmpassword": "Confirmer le mot de passe",
+"label.congratulations": "F\u00e9licitations !",
+"label.connectiontimeout": "D\u00e9lai d'expiration de connexion",
+"label.conservemode": "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\u00e9es",
+"label.counterid": "Compteur",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU allou\u00e9e",
+"label.cpu.sockets": "Sockets CPU",
+"label.cpuallocated": "CPU allou\u00e9e aux VMs",
+"label.cpuallocatedghz": "Allou\u00e9",
+"label.cpulimit": "Limites CPU",
+"label.cpumaxdeviation": "\u00c9cart",
+"label.cpusockets": "Le nombre de sockets CPU",
+"label.cpuspeed": "CPU (en MHz)",
+"label.cputotal": "Capacit\u00e9 totale en CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU utilis\u00e9e",
+"label.create.nfs.secondary.staging.storage": "Cr\u00e9er le Stockage Secondaire Interm\u00e9diaire NFS",
+"label.create.nfs.secondary.staging.store": "Cr\u00e9er le stockage secondaire interm\u00e9diaire NFS",
+"label.create.project": "Cr\u00e9er un projet",
+"label.create.ssh.key.pair": "Cr\u00e9er une bi-cl\u00e9 SSH",
+"label.create.template": "Cr\u00e9er un mod\u00e8le",
+"label.create.vpn.connection": "Cr\u00e9er une connexion VPN",
+"label.created": "Cr\u00e9\u00e9",
+"label.created.by.system": "Cr\u00e9\u00e9 par le syst\u00e8me",
+"label.createnfscache": "Cr\u00e9er le Stockage Secondaire Interm\u00e9diaire NFS",
+"label.credit": "Cr\u00e9dit",
+"label.crosszones": "Multi Zones",
+"label.current": "estCourant",
+"label.currentpassword": "Current Password",
+"label.custom": "Personnalis\u00e9",
+"label.custom.disk.offering": "Offre de disque personnalis\u00e9e",
+"label.customdisksize": "Personalisable",
+"label.daily": "Quotidien",
+"label.dashboard": "Tableau de bord",
+"label.data.disk.offering": "Offre de disque de donn\u00e9es",
+"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.decline.invitation": "Refuser l'invitation",
+"label.dedicate": "D\u00e9dier",
+"label.dedicate.cluster": "D\u00e9dier Cluster",
+"label.dedicate.host": "D\u00e9dier H\u00f4te",
+"label.dedicate.pod": "D\u00e9dier Pod",
+"label.dedicate.vlan.vni.range": "Plage VLAN/VNI d\u00e9di\u00e9e",
+"label.dedicate.zone": "D\u00e9dier Zone",
+"label.dedicated": "D\u00e9di\u00e9",
+"label.dedicated.vlan.vni.ranges": "Plages VLAN/VNI d\u00e9di\u00e9es",
+"label.default": "Par d\u00e9faut",
+"label.default.use": "Utilisation par d\u00e9faut",
+"label.default.view": "Vue par d\u00e9faut",
+"label.delete": "Supprimer",
+"label.delete.acl.list": "Supprimer Liste ACL",
+"label.delete.affinity.group": "Supprimer le groupe d'affinit\u00e9",
+"label.delete.alerts": "Supprimer alertes",
+"label.delete.baremetal.rack.configuration": "Supprimer Configuration Rack Baremetal",
+"label.delete.bigswitchbcf": "Supprimer contr\u00f4leur BigSwitch BCF",
+"label.delete.brocadevcs": "Supprimer Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Supprimer CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Supprimer ressource CiscoVNMC",
+"label.delete.events": "Supprimer \u00e9v\u00e9nements",
+"label.delete.f5": "Supprimer F5",
+"label.delete.gateway": "Supprimer la passerelle",
+"label.delete.internal.lb": "Supprimer LB interne",
+"label.delete.netscaler": "Supprimer Netscaler",
+"label.delete.niciranvp": "Supprimer un contr\u00f4leur Nvp",
+"label.delete.opendaylight.device": "Supprimer contr\u00f4leur OpenDaylight",
+"label.delete.pa": "Supprimer Palo Alto",
+"label.delete.portable.ip.range": "Supprimer Plage IP portable",
+"label.delete.project": "Supprimer projet",
+"label.delete.role": "Supprimer R\u00f4le",
+"label.delete.secondary.staging.store": "Supprimer Stockage Secondaire Interm\u00e9diaire",
+"label.delete.srx": "Supprimer SRX",
+"label.delete.ucs.manager": "Supprimer Gestionnaire UCS",
+"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.vpn.user": "Supprimer l'utilisateur VPN",
+"label.deleteprofile": "Supprimer Profil",
+"label.deleting.failed": "Suppression \u00e9chou\u00e9e",
+"label.deleting.processing": "Suppression...",
+"label.deny": "Interdire",
+"label.deploymentplanner": "Planning d\u00e9ploiement",
+"label.description": "Description",
+"label.destinationphysicalnetworkid": "Identifiant du r\u00e9seau physique de destination",
+"label.destinationzoneid": "Zone de destination",
+"label.destroy": "D\u00e9truire",
+"label.destroy.router": "Supprimer le routeur",
+"label.destroyvmgraceperiod": "D\u00e9truire P\u00e9riode de gr\u00e2ce VM",
+"label.detaching.disk": "D\u00e9tacher le disque",
+"label.details": "D\u00e9tails",
+"label.deviceid": "ID du p\u00e9riph\u00e9rique",
+"label.devices": "Machines",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "Serveur DHCP",
+"label.direct.attached.public.ip": "IP publique attach\u00e9e directement",
+"label.direct.ips": "Adresses IP du r\u00e9seau partag\u00e9",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "D\u00e9sactiver Autoscale",
+"label.disable.host": "D\u00e9sactiver H\u00f4te",
+"label.disable.network.offering": "D\u00e9sactiver Offre de r\u00e9seau",
+"label.disable.provider": "D\u00e9sactiver ce fournisseur",
+"label.disable.vnmc.provider": "D\u00e9sactiver fournisseur VNMC",
+"label.disable.vpc.offering": "D\u00e9sactiver offre VPC",
+"label.disable.vpn": "D\u00e9sactiver le VPN",
+"label.disabled": "D\u00e9sactiv\u00e9",
+"label.disabling.vpn.access": "D\u00e9sactiver l'acc\u00e8s VPN",
+"label.disassociate.profile.blade": "D\u00e9-associer le Profil de la Lame",
+"label.disbale.vnmc.device": "D\u00e9sactiver VNMC",
+"label.disconnected": "Derni\u00e8re D\u00e9connexion",
+"label.disk": "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.offering.details": "D\u00e9tails offre de disque",
+"label.disk.offerings": "Offres de Disque",
+"label.disk.size": "Capacit\u00e9 disque",
+"label.disk.volume": "Volume disque",
+"label.diskbytesreadrate": "D\u00e9bit lecture disque (BPS)",
+"label.diskbyteswriterate": "D\u00e9bit \u00e9criture disque (BPS)",
+"label.diskiopsmax": "IOPS maximum",
+"label.diskiopsmin": "IOPS minimum",
+"label.diskiopsreadrate": "D\u00e9bit lecture disque (IOPS)",
+"label.diskiopswriterate": "D\u00e9bit \u00e9criture disque (IOPS)",
+"label.diskioread": "Lecture Disque (IO)",
+"label.diskiowrite": "\u00c9criture Disque (IO)",
+"label.diskkbsread": "Lecture Disque (Octets)",
+"label.diskkbswrite": "\u00c9criture Disque (Octets)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Offre de Disque",
+"label.diskofferingid": "Offre de Disque",
+"label.disksize": "Capacit\u00e9 disque (Go)",
+"label.disksizeallocated": "Disque Allou\u00e9",
+"label.disksizeallocatedgb": "Allou\u00e9",
+"label.disksizetotal": "Espace disque total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Non allou\u00e9",
+"label.disksizeusedgb": "Utilis\u00e9",
+"label.display.text": "Texte affich\u00e9",
+"label.displayname": "Nom d'affichage",
+"label.displaytext": "Description",
+"label.distributedvpcrouter": "Routeur VPC Distribu\u00e9",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "Domaine DNS pour les r\u00e9seaux invit\u00e9s",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domaine",
+"label.domains": "Domaine",
+"label.domain.details": "D\u00e9tails 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.domainid": "ID du domaine",
+"label.domainname": "Domaine",
+"label.domainpath": "Domaine",
+"label.done": "Termin\u00e9",
+"label.double.quotes.are.not.allowed": "Les guillemets ne sont pas autoris\u00e9es",
+"label.download.progress": "Progression du t\u00e9l\u00e9chargement",
+"label.dpd": "D\u00e9tection de pair mort",
+"label.drag.new.position": "D\u00e9placer sur une autre position",
+"label.driver": "Pilote",
+"label.duration.in.sec": "Dur\u00e9e (en sec)",
+"label.edit": "Modifier",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "Modifier r\u00e8gle ACL",
+"label.edit.affinity.group": "Modifier le groupe d'affinit\u00e9",
+"label.edit.lb.rule": "Modifier la r\u00e8gle LB",
+"label.edit.network.details": "Modifier les param\u00e8tres r\u00e9seau",
+"label.edit.project.details": "Modifier les d\u00e9tails du projet",
+"label.edit.region": "\u00c9diter R\u00e9gion",
+"label.edit.role": "\u00c9diter R\u00f4le",
+"label.edit.rule": "Modifier r\u00e8gle",
+"label.edit.secondary.ips": "\u00c9diter 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\u00e9faut Egress",
+"label.egress.rule": "R\u00e8gle sortante",
+"label.egress.rules": "R\u00e8gles de sortie",
+"label.egressdefaultpolicy": "Politique Egress par d\u00e9faut",
+"label.elastic": "\u00c9lastique",
+"label.email": "Email",
+"label.enable.autoscale": "Activer Autoscale",
+"label.enable.host": "Activer H\u00f4te",
+"label.enable.network.offering": "Activer Offre de r\u00e9seau",
+"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\u00e8s VPN",
+"label.end.ip": "IP fin plage",
+"label.end.reserved.system.ip": "Adresse IP de fin r\u00e9serv\u00e9e Syst\u00e8me",
+"label.end.vlan": "Fin VLAN",
+"label.end.vxlan": "Fin VXLAN",
+"label.enddate": "Par date (fin)",
+"label.endip": "IP fin plage",
+"label.endipv4": "IP fin IPv4",
+"label.endipv6": "IP fin IPv6",
+"label.endpoint": "Terminaison",
+"label.endpoint.or.operation": "Terminaison ou Op\u00e9ration",
+"label.endport": "Port de fin",
+"label.enter.token": "Entrez le jeton unique",
+"label.error": "Erreur",
+"label.error.code": "Code d'erreur",
+"label.error.something.went.wrong.please.correct.the.following": "Quelque chose s'est mal pass\u00e9e ; veuillez corriger le point suivant",
+"label.error.upper": "ERROR",
+"label.espencryption": "Chiffrement ESP",
+"label.esphash": "Empreinte ESP",
+"label.esplifetime": "Dur\u00e9e de vie ESP (secondes)",
+"label.esppolicy": "Mode ESP",
+"label.event": "\u00c9v\u00e9nement",
+"label.event.archived": "\u00c9v\u00e9nement archiv\u00e9",
+"label.event.deleted": "\u00c9v\u00e9nement supprim\u00e9",
+"label.events": "\u00c9v\u00e9nements",
+"label.every": "Tous",
+"label.example": "Exemple",
+"label.expunge": "Purger",
+"label.external.link": "Lien externe",
+"label.f5": "F5",
+"label.f5.details": "D\u00e9tails F5",
+"label.failed": "\u00c9chou\u00e9",
+"label.featured": "Sponsoris\u00e9",
+"label.fetch.latest": "Rafra\u00eechir",
+"label.filterby": "Filtre",
+"label.fingerprint": "Empreinte",
+"label.firewall": "Pare-feu",
+"label.firstname": "Pr\u00e9nom",
+"label.firstname.lower": "pr\u00e9nom",
+"label.forceencap": "Force l'encapsulation UDP des paquets ESP",
+"label.format": "Format",
+"label.friday": "Vendredi",
+"label.full": "Complet",
+"label.full.path": "Chemin complet",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Statut",
+"label.gateway": "Passerelle",
+"label.general.alerts": "Alertes g\u00e9n\u00e9rales",
+"label.generating.url": "G\u00e9n\u00e9ration de l'URL",
+"label.global.settings": "Param\u00e8tres globaux",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "Configuration GloboDNS",
+"label.glustervolume": "Volume",
+"label.go.step.2": "Aller \u00e0 l'\u00e9tape 2",
+"label.go.step.3": "Aller \u00e0 l'\u00e9tape 3",
+"label.go.step.4": "Aller \u00e0 l'\u00e9tape 4",
+"label.go.step.5": "Aller \u00e0 l'\u00e9tape 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\u00e9partition de charge assign\u00e9e",
+"label.gslb.assigned.lb.more": "Assigner plus de r\u00e9partition de charge",
+"label.gslb.delete": "Supprimer GSLB",
+"label.gslb.details": "D\u00e9tails GSLB",
+"label.gslb.lb.details": "D\u00e9tails r\u00e9partition de charge",
+"label.gslb.lb.remove": "Supprimer r\u00e9partition de charge depuis ce GSLB",
+"label.gslb.service": "Service GSLB",
+"label.gslb.service.private.ip": "IP priv\u00e9e service GSLB",
+"label.gslb.service.public.ip": "IP publique service GSLB",
+"label.gslbdomainname": "Nom de domaine GSLB",
+"label.gslbprovider": "Service GSLB",
+"label.gslbproviderprivateip": "IP priv\u00e9e service GSLB",
+"label.gslbproviderpublicip": "IP publique service GSLB",
+"label.gslbservicetype": "Type service",
+"label.guest": "Invit\u00e9",
+"label.guest.cidr": "CIDR invit\u00e9",
+"label.guest.end.ip": "Adresse IP de fin pour les invit\u00e9s",
+"label.guest.gateway": "Passerelle pour les invit\u00e9s",
+"label.guest.ip": "Adresse IP des invit\u00e9s",
+"label.guest.ip.range": "Plage d'adresses IP des invit\u00e9s",
+"label.guest.netmask": "Masque de r\u00e9seau des invit\u00e9s",
+"label.guest.network.details": "D\u00e9tails r\u00e9seau invit\u00e9",
+"label.guest.networks": "R\u00e9seaux d'invit\u00e9",
+"label.guest.start.ip": "Adresse IP de d\u00e9but pour les invit\u00e9s",
+"label.guest.traffic": "Trafic invit\u00e9",
+"label.guestcidraddress": "CIDR invit\u00e9",
+"label.guestendip": "Adresse IP de fin pour les invit\u00e9s",
+"label.guestgateway": "Passerelle pour les invit\u00e9s",
+"label.guestipaddress": "Adresse IP des invit\u00e9s",
+"label.guestiptype": "Type d'invit\u00e9",
+"label.guestnetmask": "Masque de r\u00e9seau des invit\u00e9s",
+"label.guestnetworkid": "ID r\u00e9seau",
+"label.guestnetworkname": "Nom du r\u00e9seau",
+"label.guestosid": "Type du OS",
+"label.gueststartip": "Adresse IP de d\u00e9but pour les invit\u00e9s",
+"label.guestvlanrange": "Plage(s) VLAN",
+"label.haenable": "Haute disponibilit\u00e9 activ\u00e9e",
+"label.hahost": "Haute disponibilit\u00e9 activ\u00e9e",
+"label.header.volume.snapshot": "Vous pouvez configurer des plannings d'instantan\u00e9s r\u00e9currents en s\u00e9lectionnant les options disponibles ci-dessous et en appliquant votre politique pr\u00e9f\u00e9r\u00e9e.",
+"label.header.volume.take.snapshot": "Confirmer la prise d'un instantan\u00e9 pour ce volume.",
+"label.health.check": "V\u00e9rification statut",
+"label.health.check.advanced.options": "Options avanc\u00e9es :",
+"label.health.check.configurations.options": "Options de configuration :",
+"label.health.check.interval.in.sec": "Fr\u00e9quence de v\u00e9rification d'\u00e9tat (sec)",
+"label.health.check.message.desc": "Votre r\u00e9partiteur de charge va automatiquement effectuer des v\u00e9rifications d'\u00e9tat sur vos instances CloudStack et router seulement le trafic vers les instances ayant pass\u00e9es les v\u00e9rifications avec succ\u00e8s",
+"label.health.check.wizard": "Assistant V\u00e9rification Sant\u00e9",
+"label.healthy.threshold": "Seuil d'\u00e9tat",
+"label.help": "Aide",
+"label.hide.ingress.rule": "Cacher la r\u00e8gle d'entr\u00e9e",
+"label.hints": "Astuces",
+"label.home": "Accueil",
+"label.host": "H\u00f4te",
+"label.host.alerts": "H\u00f4tes en \u00e9tat d'Alerte",
+"label.host.name": "Nom d'h\u00f4te",
+"label.host.tag": "Etiquette h\u00f4te",
+"label.hostid": "H\u00f4te",
+"label.hostname": "H\u00f4te",
+"label.hostnamelabel": "Nom d'h\u00f4te",
+"label.hosts": "H\u00f4tes",
+"label.hosttags": "\u00c9tiquettes d'h\u00f4te",
+"label.hourly": "Chaque heure",
+"label.hypervisor": "Hyperviseur",
+"label.hypervisor.capabilities": "Fonctions hyperviseur",
+"label.hypervisor.type": "Type d'hyperviseur",
+"label.hypervisors": "Hyperviseurs",
+"label.hypervisorsnapshotreserve": "R\u00e9serve d'instantan\u00e9e de l'Hyperviseur",
+"label.hypervisortype": "Hyperviseur",
+"label.hypervisorversion": "Version hyperviseur",
+"label.hypervnetworklabel": "Libell\u00e9 trafic HyperV",
+"label.icmpcode": "Code ICMP",
+"label.icmptype": "Type ICMP",
+"label.id": "ID",
+"label.ikedh": "DH IKE",
+"label.ikeencryption": "Chiffrement IKE",
+"label.ikehash": "Empreinte IKE",
+"label.ikelifetime": "Dur\u00e9e de vie IKE (secondes)",
+"label.ikepolicy": "Mode IKE",
+"label.info": "Information",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastructure",
+"label.ingress.rule": "R\u00e8gle d'entr\u00e9e",
+"label.initiated.by": "Initi\u00e9 par",
+"label.insideportprofile": "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\u00f4te ?",
+"label.installwizard.addhostintro.title": "Ajoutons un h\u00f4te",
+"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.addzoneintro.subtitle": "Qu'est ce qu'une zone ?",
+"label.installwizard.addzoneintro.title": "Ajoutons une zone",
+"label.installwizard.click.launch": "Appuyer sur le bouton d\u00e9marrer.",
+"label.installwizard.subtitle": "Ce tutoriel vous aidera \u00e0 configurer votre installation CloudStack&#8482;",
+"label.installwizard.title": "Bonjour et bienvenue dans CloudStack&#8482;",
+"label.instance": "Instance",
+"label.instance.name": "Nom de l'instance",
+"label.instance.scaled.up": "Instance agrandie",
+"label.instancename": "Nom interne",
+"label.instanceport": "Port Instance",
+"label.instances": "Instances",
+"label.instanciate.template.associate.profile.blade": "Instancier Mod\u00e8le et Profil associ\u00e9 \u00e0 la Lame",
+"label.intermediate.certificate": "Certificat interm\u00e9diaire",
+"label.internal.dns.1": "DNS interne 1",
+"label.internal.dns.2": "DNS interne 2",
+"label.internal.lb": "R\u00e9partiteur interne",
+"label.internal.lb.details": "D\u00e9tails du LB interne",
+"label.internaldns1": "DNS interne 1",
+"label.internaldns2": "DNS interne 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Intervalle d'appel (en sec)",
+"label.intervaltype": "Type d'intervalle",
+"label.introduction.to.cloudstack": "Introduction \u00e0 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\u00e9s",
+"label.ip": "IP",
+"label.ip.allocations": "Allocations de IPs",
+"label.ip.or.fqdn": "IP ou FQDN",
+"label.ip.range": "Plage IP",
+"label.ip.ranges": "Plages IP",
+"label.ip4dns1": "DNS1 IPv4",
+"label.ip4dns2": "DNS2 IPv4",
+"label.ip4gateway": "Passerelle IPv4",
+"label.ip4netmask": "Masque de r\u00e9seau IPv4",
+"label.ip6address": "Adresse IPv6",
+"label.ip6cidr": "CIDR IPv6",
+"label.ip6dns1": "DNS1 IPv6",
+"label.ip6dns2": "DNS2 IPv6",
+"label.ip6gateway": "Passerelle IPv6",
+"label.ipaddress": "Adresse IP",
+"label.ipaddress1": "Adresse IP",
+"label.ipaddress2": "Adresse IP",
+"label.iplimit": "Limite de IPs publiques",
+"label.ips": "Adresse IP",
+"label.ipsecpsk": "Cl\u00e9 partag\u00e9e IPsec",
+"label.iptotal": "Total adresses IP",
+"label.ipv4.cidr": "CIDR IPv4",
+"label.ipv4.dns1": "DNS1 IPv4",
+"label.ipv4.dns2": "DNS2 IPv4",
+"label.ipv6.dns1": "DNS1 IPv6",
+"label.ipv6.dns2": "DNS2 IPv6",
+"label.iqn": "Cible IQN",
+"label.is.redundant.router": "Redondant",
+"label.is.shared": "Est partag\u00e9",
+"label.isadvanced": "Voir param\u00e8tres avanc\u00e9s",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Personalisable",
+"label.iscustomizeddiskiops": "IOPS personnalis\u00e9",
+"label.iscustomizediops": "IOPS personnalis\u00e9",
+"label.isdedicated": "D\u00e9di\u00e9",
+"label.isdefault": "Est par d\u00e9faut",
+"label.isdynamicallyscalable": "Dimensionnement dynamique",
+"label.isextractable": "T\u00e9l\u00e9chargeable",
+"label.isfeatured": "Sponsoris\u00e9",
+"label.isforced": "Forcer la suppression",
+"label.ismanaged": "G\u00e9r\u00e9",
+"label.iso": "ISO",
+"label.iso.boot": "D\u00e9marrage par ISO",
+"label.isoid": "ISO",
+"label.isolated.networks": "R\u00e9seaux isol\u00e9s",
+"label.isolatedpvlanid": "VLAN ID isol\u00e9 secondaire",
+"label.isolation.method": "Isolation",
+"label.isolation.mode": "Mode d'isolation",
+"label.isolationmethod": "Isolation",
+"label.isolationmethods": "Isolation",
+"label.isolationuri": "URI d'isolation",
+"label.isoname": "Image ISO attach\u00e9e",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Mot de passe activ\u00e9",
+"label.ispersistent": "Persistant",
+"label.isportable": "Multi Zones",
+"label.ispublic": "Publique",
+"label.isready": "Pr\u00eat",
+"label.isredundantrouter": "Routeur redondant",
+"label.isrouting": "Routage",
+"label.isshared": "En partage",
+"label.issourcenat": "NAT Source",
+"label.isstaticnat": "NAT Statique",
+"label.issystem": "Est Syst\u00e8me",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Liste des \u00e9l\u00e9ments",
+"label.japanese.keyboard": "Clavier japonais",
+"label.keep": "Conserver",
+"label.keep.colon": "Conserver :",
+"label.key": "Clef",
+"label.keyboard": "Langage clavier",
+"label.keyboardtype": "Type de clavier",
+"label.keypair": "Bi-cl\u00e9 SSH",
+"label.kvmnetworklabel": "Libell\u00e9 trafic KVM",
+"label.l2gatewayserviceuuid": "Uuid du service passerelle L2",
+"label.l3gatewayserviceuuid": "Uuid du service passerelle L3",
+"label.label": "Libell\u00e9",
+"label.lang.arabic": "Arabe",
+"label.lang.brportugese": "Portuguais Br\u00e9sil",
+"label.lang.catalan": "Catalan",
+"label.lang.chinese": "Chinois (simplifi\u00e9)",
+"label.lang.dutch": "N\u00e9erlandais",
+"label.lang.english": "Anglais",
+"label.lang.french": "Fran\u00e7ais",
+"label.lang.german": "Allemand",
+"label.lang.hungarian": "Hongrois",
+"label.lang.italian": "Italien",
+"label.lang.japanese": "Japonais",
+"label.lang.korean": "Cor\u00e9en",
+"label.lang.norwegian": "Norv\u00e9gien",
+"label.lang.polish": "Polonais",
+"label.lang.russian": "Russe",
+"label.lang.spanish": "Espagnol",
+"label.last.updated": "Derni\u00e8re mise \u00e0 jour",
+"label.lastname": "Nom",
+"label.lastname.lower": "nom",
+"label.latest.events": "Derniers \u00e9v\u00e9nements",
+"label.launch": "D\u00e9marrer",
+"label.launch.vm": "D\u00e9marrer VM",
+"label.launch.zone": "D\u00e9marrer la zone",
+"label.lb.algorithm.leastconn": "Le moins de connexions",
+"label.lb.algorithm.roundrobin": "Cyclique",
+"label.lb.algorithm.source": "Origine",
+"label.lbdevicededicated": "D\u00e9di\u00e9",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Statut",
+"label.lbtype": "Type R\u00e9partiteur de charge",
+"label.ldap.configuration": "Configuration LDAP",
+"label.ldap.group.name": "Groupe LDAP",
+"label.ldap.port": "Port LDAP",
+"label.level": "Niveau",
+"label.limitcpuuse": "Limitation CPU",
+"label.link.domain.to.ldap": "Lien Domaine vers LDAP",
+"label.linklocalip": "Adresse IP lien local",
+"label.load.balancer": "R\u00e9partiteur de charge",
+"label.load.balancing.policies": "R\u00e8gles de r\u00e9partition de charge",
+"label.loadbalancerinstance": "VMs Assign\u00e9es",
+"label.loadbalancerrule": "R\u00e8gle de r\u00e9partition de charge",
+"label.loadbalancing": "R\u00e9partition de charge",
+"label.loading": "Chargement en cours",
+"label.local": "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\u00e8mes",
+"label.localstorageenabled": "Activer le stockage local pour les VMs Utilisateurs",
+"label.localstorageenabledforsystemvm": "Activer le stockage local pour les VMs Syst\u00e8mes",
+"label.login": "Connexion",
+"label.logout": "D\u00e9connexion",
+"label.lun": "LUN",
+"label.lun.number": "N\u00b0 LUN",
+"label.lxcnetworklabel": "Libell\u00e9 trafic LXC",
+"label.make.project.owner": "Devenir propri\u00e9taire du projet",
+"label.makeredundant": "Rendre redondant",
+"label.manage": "G\u00e9r\u00e9",
+"label.manage.resources": "G\u00e9rer les ressources",
+"label.management": "Administration",
+"label.management.ips": "Adresses IP de gestion",
+"label.management.server": "Serveur de gestion",
+"label.management.servers": "Serveurs de gestion",
+"label.managementservers": "Nombre de serveurs de gestion",
+"label.max.primary.storage": "Principal max. (Go)",
+"label.max.secondary.storage": "Secondaire max. (Go)",
+"label.maxcpu": "Nombre coeurs CPU max.",
+"label.maxerrorretry": "Nombre d'essai en erreur max.",
+"label.maxguestslimit": "Nombre maximum d'invit\u00e9s",
+"label.maximum": "Maximum",
+"label.maxinstance": "Instance Max.",
+"label.maxiops": "IOPS maximum",
+"label.maxmemory": "M\u00e9moire max. (Mo)",
+"label.maxnetwork": "R\u00e9seaux Max.",
+"label.maxpublicip": "Max. IP publiques",
+"label.maxsnapshot": "Max instantan\u00e9es",
+"label.maxtemplate": "Max. mod\u00e8les",
+"label.maxuservm": "Max. VMs utilisateur",
+"label.maxvolume": "Max. volumes",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "Vous pouvez continuer.",
+"label.memallocated": "Allocation M\u00e9m.",
+"label.memory": "M\u00e9moire (en Mo)",
+"label.memory.total": "M\u00e9moire totale",
+"label.memory.used": "M\u00e9moire utilis\u00e9e",
+"label.memoryallocated": "M\u00e9moire allou\u00e9e",
+"label.memoryallocatedgb": "Allou\u00e9",
+"label.memorylimit": "Limites m\u00e9moire (Mo)",
+"label.memorymaxdeviation": "\u00c9cart",
+"label.memorytotal": "M\u00e9moire allou\u00e9e",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Utilis\u00e9",
+"label.menu.all.accounts": "Tous les comptes",
+"label.menu.all.instances": "Toutes les instances",
+"label.menu.community.isos": "ISO de la communaut\u00e9",
+"label.menu.community.templates": "Mod\u00e8les de la communaut\u00e9",
+"label.menu.destroyed.instances": "Instances d\u00e9truites",
+"label.menu.featured.isos": "ISOs Sponsoris\u00e9es",
+"label.menu.featured.templates": "Mod\u00e8les sponsoris\u00e9s",
+"label.menu.ipaddresses": "Adresses IP",
+"label.menu.my.accounts": "Mes comptes",
+"label.menu.my.instances": "Mes instances",
+"label.menu.my.isos": "Mes ISOs",
+"label.menu.my.templates": "Mes mod\u00e8les",
+"label.menu.physical.resources": "Ressources physiques",
+"label.menu.regions": "R\u00e9gions",
+"label.menu.running.instances": "Instances actives",
+"label.menu.security.groups": "Groupes de s\u00e9curit\u00e9",
+"label.menu.service.offerings": "Offres de Service",
+"label.menu.sshkeypair": "Bi-cl\u00e9 SSH",
+"label.menu.stopped.instances": "Instances Arr\u00eat\u00e9es",
+"label.menu.storage": "Stockage",
+"label.menu.system": "Syst\u00e8me",
+"label.menu.virtual.appliances": "Appliances Virtuelles",
+"label.menu.virtual.resources": "Ressources Virtuelles",
+"label.metrics": "M\u00e9triques",
+"label.metrics.cpu.allocated": "Allocation CPU",
+"label.metrics.cpu.usage": "Util. CPU",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Lecture",
+"label.metrics.disk.usage": "Util. Disque",
+"label.metrics.disk.write": "\u00c9criture",
+"label.metrics.memory.usage": "Util. M\u00e9m.",
+"label.metrics.network.read": "Lecture",
+"label.metrics.network.usage": "Util. R\u00e9seau",
+"label.metrics.network.write": "\u00c9criture",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "Migrer l'instance vers",
+"label.migrate.instance.to.host": "Migration de l'instance sur un autre h\u00f4te",
+"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\u00e8me vers",
+"label.migrate.to.host": "Migrer vers un h\u00f4te",
+"label.migrate.to.storage": "Migrer vers un stockage",
+"label.migrate.volume": "Volume Migr\u00e9",
+"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": "Migration du volume vers un autre stockage primaire",
+"label.min.balance": "Balance Min.",
+"label.min.past.hour": "min ap. l'heure",
+"label.minimum": "Minimum",
+"label.mininstance": "Instances Min.",
+"label.miniops": "IOPS minimum",
+"label.minute.past.hour": "minute(s) apr\u00e8s l'heure",
+"label.minutes.past.hour": "minute(s) apr\u00e8s l'heure",
+"label.monday": "Lundi",
+"label.monthly": "Mensuel",
+"label.more.templates": "Plus de mod\u00e8les",
+"label.move.down.row": "Descendre d'un niveau",
+"label.move.to.bottom": "D\u00e9placer 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\u00e9seau",
+"label.my.templates": "Mes mod\u00e8les",
+"label.na": "N/A",
+"label.name": "Nom",
+"label.name.optional": "Nom (optionnel)",
+"label.nat": "NAT activ\u00e9 BigSwitch BCF",
+"label.nat.port.range": "Plage de port NAT",
+"label.netmask": "Masque de r\u00e9seau",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "D\u00e9tails NetScaler",
+"label.network": "R\u00e9seau",
+"label.network.acl": "R\u00e8gles d'acc\u00e8s r\u00e9seau ACL",
+"label.network.acls": "R\u00e8gles d'acc\u00e8s r\u00e9seau",
+"label.network.addvm": "Ajouter r\u00e9seau \u00e0 la VM",
+"label.network.desc": "Description r\u00e9seau",
+"label.network.details": "D\u00e9tails r\u00e9seau",
+"label.network.device": "\u00c9quipement R\u00e9seau",
+"label.network.device.type": "Type d'\u00e9quipement r\u00e9seau",
+"label.network.domain": "Nom de domaine",
+"label.network.label.display.for.blank.value": "Utiliser la passerelle par d\u00e9faut",
+"label.network.name": "Nom du r\u00e9seau",
+"label.network.offering": "Offre de R\u00e9seau",
+"label.network.offering.details": "D\u00e9tails offre de r\u00e9seau",
+"label.network.offering.display.text": "Texte affich\u00e9 Offre R\u00e9seau",
+"label.network.offering.name": "Nom Offre R\u00e9seau",
+"label.network.offerings": "Offres de R\u00e9seau",
+"label.network.service.providers": "Fournisseurs de service r\u00e9seau",
+"label.networkcidr": "CIDR r\u00e9seau",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Nom de domaine",
+"label.networkdomaintext": "Nom de domaine",
+"label.networkid": "R\u00e9seau",
+"label.networking.and.security": "R\u00e9seau et s\u00e9curit\u00e9",
+"label.networkkbsread": "Lecture r\u00e9seau",
+"label.networkkbswrite": "\u00c9criture r\u00e9seau",
+"label.networklimit": "Limites r\u00e9seau",
+"label.networkname": "Nom du r\u00e9seau",
+"label.networkofferingdisplaytext": "Offre de R\u00e9seau",
+"label.networkofferingid": "Offre de R\u00e9seau",
+"label.networkofferingidtext": "ID Offre R\u00e9seau",
+"label.networkofferingname": "Offre de R\u00e9seau",
+"label.networkrate": "D\u00e9bit R\u00e9seau",
+"label.networkread": "Lecture r\u00e9seau",
+"label.networks": "R\u00e9seaux",
+"label.networktype": "Type de r\u00e9seau",
+"label.networkwrite": "\u00c9criture r\u00e9seau",
+"label.new": "Nouveau",
+"label.new.password": "Nouveau mot de passe",
+"label.new.project": "Nouveau projet",
+"label.new.vm": "Nouvelle VM",
+"label.newdiskoffering": "Nouvelle Offre",
+"label.newsize": "Nouvelle Taille (Go)",
+"label.next": "Suivant",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "Stockage NFS",
+"label.nfscachenfsserver": "Serveur NFS",
+"label.nfscachepath": "Chemin",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "Serveur NFS",
+"label.nicadaptertype": "Type de carte r\u00e9seau",
+"label.nicira.controller.address": "Adresse du contr\u00f4leur",
+"label.nicira.nvp.details": "D\u00e9tails Nicira NVP",
+"label.nics": "Cartes NIC",
+"label.no": "Non",
+"label.no.actions": "Aucune action disponible",
+"label.no.alerts": "Aucune alerte r\u00e9cente",
+"label.no.data": "Aucune donn\u00e9e",
+"label.no.errors": "Aucune erreur r\u00e9cente",
+"label.no.grouping": "(pas de groupement)",
+"label.no.isos": "Aucun ISOs disponible",
+"label.no.items": "Aucun \u00e9l\u00e9ment disponible",
+"label.no.security.groups": "Aucun groupe de s\u00e9curit\u00e9 disponible",
+"label.none": "Aucun",
+"label.noselect": "Non merci",
+"label.not.found": "Introuvable",
+"label.notifications": "Messages",
+"label.num.cpu.cores": "Nombre de c\u0153urs",
+"label.number": "#R\u00e8gle",
+"label.number.of.clusters": "Nombre de clusters",
+"label.number.of.hosts": "Nombre d'H\u00f4tes",
+"label.number.of.pods": "Nombre de Pods",
+"label.number.of.system.vms": "Nombre de VM Syst\u00e8me",
+"label.number.of.virtual.routers": "Nombre de routeurs virtuels",
+"label.number.of.zones": "Nombre de zones",
+"label.numberofrouterrequiresupgrade": "Total des routeurs virtuels avec mise \u00e0 niveau n\u00e9cessaire",
+"label.numretries": "Nombre de tentatives",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "du mois",
+"label.offerha": "Offrir la haute disponibilit\u00e9",
+"label.ok": "OK",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "Contr\u00f4leur OpenDaylight",
+"label.opendaylight.controllerdetail": "D\u00e9tails Contr\u00f4leur OpenDaylight",
+"label.opendaylight.controllers": "Contr\u00f4leurs OpenDaylight",
+"label.optional": "Facultatif",
+"label.order": "Ordre",
+"label.oscategoryid": "Pr\u00e9f\u00e9rence OS",
+"label.ostypeid": "Type du OS",
+"label.ostypename": "Type du OS",
+"label.other": "Autre",
+"label.outofbandmanagement": "Gestion flux administration",
+"label.outofbandmanagement.action.issue": "Probl\u00e8me dans l'allumage via la gestion du flux administration",
+"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\u00e9sactiver la gestion du flux d'administration",
+"label.outofbandmanagement.enable": "Activer la gestion du flux d'administration",
+"label.override.guest.traffic": "Remplacer Trafic-invit\u00e9",
+"label.override.public.traffic": "Remplacer Trafic-public",
+"label.overrideguesttraffic": "Remplacer Trafic-invit\u00e9",
+"label.overridepublictraffic": "Remplacer Trafic-public",
+"label.ovm3cluster": "Cluster natif",
+"label.ovm3networklabel": "Libell\u00e9 trafic OVM3",
+"label.ovm3pool": "Pool natif",
+"label.ovm3vip": "IP Ma\u00eetre Vip",
+"label.ovmnetworklabel": "Libell\u00e9 trafic OVM",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Adresses IP Publiques d\u00e9tenues",
+"label.owner.account": "Propri\u00e9taire",
+"label.owner.domain": "Propri\u00e9taire",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "D\u00e9tails Palo Alto",
+"label.palp": "Profil Journal Palo Alto",
+"label.parent.domain": "Parent du Domaine",
+"label.parentname": "Parent",
+"label.passive": "Passif",
+"label.password": "Mot de passe",
+"label.password.reset.confirm": "Le mot de passe a \u00e9t\u00e9 r\u00e9-initialiser en",
+"label.passwordenabled": "Mot de passe activ\u00e9",
+"label.path": "Chemin",
+"label.patp": "Profil menace Palo Alto",
+"label.pavr": "Routeur Virtuel",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Confidentialit\u00e9 persistante",
+"label.permission": "Autorisation",
+"label.physical.network": "R\u00e9seau physique",
+"label.physical.network.id": "Identifiant du r\u00e9seau physique",
+"label.physical.network.name": "Nom r\u00e9seau physique",
+"label.physicalnetworkid": "R\u00e9seau physique",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "Mot de passe CIFS PING",
+"label.ping.cifs.username": "Identifiant CIFS PING",
+"label.ping.dir": "R\u00e9pertoire PING",
+"label.ping.path": "Chemin Ping",
+"label.ping.storage.ip": "IP stockage PING",
+"label.plannermode": "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\u00e9tails extension",
+"label.plugins": "Extensions",
+"label.pod": "Pod",
+"label.pod.dedicated": "Pod D\u00e9di\u00e9",
+"label.pod.name": "Nom du pod",
+"label.podid": "Pod",
+"label.podname": "Nom du pod",
+"label.pods": "Pods",
+"label.port": "Port",
+"label.port.forwarding.policies": "R\u00e8gles de transfert de port",
+"label.port.range": "Plage de ports",
+"label.portable.ip": "IP Portable",
+"label.portable.ip.range.details": "D\u00e9tails Plages IP portables",
+"label.portable.ip.ranges": "Plages IP portables",
+"label.portableipaddress": "IPs portables",
+"label.portforwarding": "Redirection de port",
+"label.powerstate": "Status Alimentation",
+"label.presetup": "PreSetup",
+"label.prev": "Pr\u00e9c\u00e9dent",
+"label.previous": "Retour",
+"label.primary.network": "R\u00e9seau principal",
+"label.primary.storage": "Stockages primaires",
+"label.primary.storage.allocated": "Stockage primaire allou\u00e9",
+"label.primary.storage.count": "Groupes de stockage primaire",
+"label.primary.storage.used": "Stockage primaire utilis\u00e9",
+"label.primarystoragelimit": "Limites stockage primaire (Go)",
+"label.primarystoragetotal": "Stockages primaires",
+"label.private.gateway": "Passerelle priv\u00e9e",
+"label.private.interface": "Interface priv\u00e9e",
+"label.private.ip.range": "Plage d'adresses IP Priv\u00e9es",
+"label.private.ips": "Adresses IP Priv\u00e9es",
+"label.private.zone": "Zone Priv\u00e9e",
+"label.privateinterface": "Interface priv\u00e9e",
+"label.privateip": "Adresse IP Priv\u00e9e",
+"label.privatekey": "Cl\u00e9 priv\u00e9e PKCS#8",
+"label.privatenetwork": "R\u00e9seau priv\u00e9",
+"label.privateport": "Port priv\u00e9",
+"label.profiledn": "Profil associ\u00e9",
+"label.profilename": "Profil",
+"label.project": "Projet",
+"label.project.dashboard": "Tableau de bord projet",
+"label.project.invite": "Inviter sur le projet",
+"label.project.name": "Nom du projet",
+"label.project.view": "Vue projet",
+"label.projectid": "ID projet",
+"label.projects": "Projets",
+"label.property": "Propri\u00e9t\u00e9",
+"label.protocol": "Protocole",
+"label.protocol.number": "Num\u00e9ro Protocole",
+"label.protocolnumber": "#Protocole",
+"label.provider": "Fournisseur",
+"label.providername": "Fournisseur",
+"label.providers": "Fournisseurs",
+"label.provisioningtype": "Type de provisionnement",
+"label.public.interface": "Interface publique",
+"label.public.ip": "Adresse IP publique",
+"label.public.ip.addresses": "Adresses IP publiques",
+"label.public.ips": "Adresses IP publiques",
+"label.public.lb": "R\u00e9partiteur public",
+"label.public.load.balancer.provider": "Fournisseur r\u00e9partition de charge public",
+"label.public.network": "R\u00e9seau public",
+"label.public.traffic": "Trafic public",
+"label.public.zone": "Zone publique",
+"label.publicinterface": "Interface publique",
+"label.publicip": "Adresse IP",
+"label.publickey": "Cl\u00e9 publique",
+"label.publicnetwork": "R\u00e9seau public",
+"label.publicport": "Port public",
+"label.purpose": "R\u00f4le",
+"label.pxe.server.type": "Serveur PXE",
+"label.qostype": "Type de QoS",
+"label.quickview": "Aper\u00e7u",
+"label.quiescevm": "Mettre en veille VM",
+"label.quiettime": "Quiet Time (en sec)",
+"label.quota": "Valeur Quota",
+"label.quota.value": "Valeur Quota",
+"label.quota.add.credits": "Ajouter Cr\u00e9dits",
+"label.quota.configuration": "Configuration Quota",
+"label.quota.configure": "Configurer Quota",
+"label.quota.credits": "Cr\u00e9dits",
+"label.quota.dates": "Mettre \u00e0 jour Dates",
+"label.quota.description": "Description Quota",
+"label.quota.enddate": "Date fin",
+"label.quota.endquota": "Fin Quota",
+"label.quota.enforce": "Forcer Quota",
+"label.quota.fullsummary": "Tous les comptes",
+"label.quota.remove": "Supprimer Quota",
+"label.quota.startdate": "Date d\u00e9but",
+"label.quota.startquota": "D\u00e9but Quota",
+"label.quota.statement": "Relev\u00e9",
+"label.quota.statement.balance": "Balance Quota",
+"label.quota.statement.bydates": "Relev\u00e9",
+"label.quota.statement.quota": "Utilisation Quota",
+"label.quota.statement.tariff": "Tarif Quota",
+"label.summary": "R\u00e9capitulatif",
+"label.quota.tariff": "Tarif",
+"label.quota.tariff.edit": "Modifier Tarif",
+"label.quota.tariff.effectivedate": "Date d'effet",
+"label.quota.totalusage": "Usage Total",
+"label.quota.usage": "Consommation Quota",
+"label.rbd": "RBD",
+"label.rbdid": "Utilisateur Cephx",
+"label.rbdmonitor": "Superviseur Ceph",
+"label.rbdpool": "Pool Ceph",
+"label.rbdsecret": "Secret Cephx",
+"label.reason": "Reason",
+"label.reboot": "Red\u00e9marrer",
+"label.receivedbytes": "Octets re\u00e7us",
+"label.recent.errors": "Erreurs r\u00e9centes",
+"label.recover.vm": "Restaurer VM",
+"label.redundantrouter": "Routeur redondant",
+"label.redundantrouterstate": "\u00c9tat de la redondance",
+"label.redundantstate": "\u00c9tat de la redondance",
+"label.redundantvpcrouter": "VPC Redondant",
+"label.reenterpassword": "Re-saisir Mot de passe",
+"label.refresh": "Actualiser",
+"label.refresh.blades": "Rafra\u00eechir Lames",
+"label.region": "R\u00e9gion",
+"label.region.details": "D\u00e9tails R\u00e9gion",
+"label.reinstall.vm": "R\u00e9-installer VM",
+"label.related": "Connexes",
+"label.relationaloperator": "Op\u00e9rateur",
+"label.release.account": "Lib\u00e9rer compte",
+"label.release.dedicated.cluster": "Lib\u00e9ration du cluster d\u00e9die",
+"label.release.dedicated.host": "Lib\u00e9ration de l'h\u00f4te d\u00e9di\u00e9",
+"label.release.dedicated.pod": "Lib\u00e9ration du pod d\u00e9di\u00e9",
+"label.release.dedicated.vlan.range": "Lib\u00e9rer plage VLAN d\u00e9di\u00e9e",
+"label.release.dedicated.zone": "Lib\u00e9rer la zone d\u00e9di\u00e9e",
+"label.remind.later": "Rappeler moi plus tard",
+"label.remove.acl": "Supprimer une r\u00e8gle ACL",
+"label.remove.egress.rule": "Supprimer la r\u00e8gle sortante",
+"label.remove.from.load.balancer": "Supprimer l'instance du r\u00e9partiteur de charge",
+"label.remove.ingress.rule": "Supprimer la r\u00e8gle entrante",
+"label.remove.ip.range": "Supprimer la plage IP",
+"label.remove.ldap": "Supprimer LDAP",
+"label.remove.network.offering": "Supprimer Offre de r\u00e9seau",
+"label.remove.pf": "Supprimer la r\u00e8gle de transfert de port",
+"label.remove.project.account": "Supprimer le compte projet",
+"label.remove.region": "Supprimer r\u00e9gion",
+"label.remove.rule": "Supprimer la r\u00e8gle",
+"label.remove.ssh.key.pair": "Supprimer bi-cl\u00e9 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\u00e9seau physique",
+"label.remove.tier": "Supprimer le tiers",
+"label.remove.vm.from.lb": "Supprimer la VM de la r\u00e8gle de r\u00e9partition de charge",
+"label.remove.vm.load.balancer": "Supprimer VM du r\u00e9partiteur 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.replace.acl": "Remplacer ACL",
+"label.replace.acl.list": "Remplacer Liste ACL",
+"label.required": "Requis",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Mise \u00e0 jour n\u00e9cessaire",
+"label.reserved.system.gateway": "Passerelle r\u00e9serv\u00e9e Syst\u00e8me",
+"label.reserved.system.ip": "Adresse IP Syst\u00e8me r\u00e9serv\u00e9e",
+"label.reserved.system.netmask": "Masque de sous-r\u00e9seau r\u00e9serv\u00e9 Syst\u00e8me",
+"label.reservediprange": "Plage IP r\u00e9serv\u00e9e",
+"label.reservedsystemendip": "Adresse IP de fin r\u00e9serv\u00e9e Syst\u00e8me",
+"label.reservedsystemgateway": "Passerelle r\u00e9serv\u00e9e Syst\u00e8me",
+"label.reservedsystemnetmask": "Masque de sous-r\u00e9seau r\u00e9serv\u00e9 Syst\u00e8me",
+"label.reservedsystemstartip": "Adresse IP de d\u00e9but r\u00e9serv\u00e9e Syst\u00e8me",
+"label.reset.ssh.key.pair": "R\u00e9-initialiser bi-cl\u00e9 SSH",
+"label.reset.ssh.key.pair.on.vm": "R\u00e9-initialiser bi-cl\u00e9 sur la VM",
+"label.reset.vpn.connection": "R\u00e9-initialiser la connexion VPN",
+"label.resetvm": "R\u00e9-initialiser VM",
+"label.resource": "Ressource",
+"label.resource.limit.exceeded": "Limite ressource d\u00e9pass\u00e9e",
+"label.resource.limits": "Limite des ressources",
+"label.resource.name": "Nom Ressource",
+"label.resourceid": "ID Ressource",
+"label.resourcename": "Nom Ressource",
+"label.resources": "Ressources",
+"label.resourcestate": "\u00c9tat des ressources",
+"label.response.timeout.in.sec": "D\u00e9lai d'attente de r\u00e9ponse (sec)",
+"label.restart.network": "Red\u00e9marrage du r\u00e9seau",
+"label.restart.vpc": "Red\u00e9marrer le VPC",
+"label.restartrequired": "Red\u00e9marrage n\u00e9cessaire",
+"label.restore": "Restaurer",
+"label.retry.interval": "Interval du nouvel essai",
+"label.review": "Revoir",
+"label.revoke.project.invite": "R\u00e9voquer l'invitation",
+"label.role": "R\u00f4le",
+"label.rolename": "R\u00f4le",
+"label.roles": "R\u00f4les",
+"label.roletype": "Type R\u00f4le",
+"label.root.certificate": "Certificat racine",
+"label.root.disk.offering": "Offre de disque racine",
+"label.root.disk.size": "Taille du disque principal (en Go)",
+"label.rootdiskcontrollertype": "Contr\u00f4leur de disque racine",
+"label.rootdiskcontrollertypekvm": "Contr\u00f4leur de disque racine",
+"label.router.vm.scaled.up": "VM Routeur agrandi",
+"label.routercount": "Total des Routeurs virtuels",
+"label.routerrequiresupgrade": "Une mise \u00e0 jour est n\u00e9cessaire",
+"label.routertype": "Type",
+"label.routing.host": "H\u00f4te de routage",
+"label.rule": "R\u00e8gle",
+"label.rule.number": "Num\u00e9ro r\u00e8gle",
+"label.rules": "R\u00e8gles",
+"label.running": "VMs actives",
+"label.s3.access.key": "Cl\u00e9 d'Acc\u00e8s",
+"label.s3.bucket": "Seau",
+"label.s3.connection.timeout": "D\u00e9lai 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\u00e9 priv\u00e9e",
+"label.s3.socket.timeout": "D\u00e9lai d'expiration de la socket",
+"label.s3.use.https": "Utiliser HTTPS",
+"label.samlenable": "Autoriser SAML SSO",
+"label.samlentity": "Fournisseur d'identit\u00e9",
+"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\u00e9gie ScaleDown",
+"label.scaleup.policy": "Strat\u00e9gie ScaleUp",
+"label.scope": "Port\u00e9e",
+"label.search": "Rechercher",
+"label.secondary.staging.store": "Stockage Secondaire Interm\u00e9diaire",
+"label.secondary.staging.store.details": "D\u00e9tails Stockage Secondaire Interm\u00e9diaire",
+"label.secondary.storage": "Stockages secondaires",
+"label.secondary.storage.count": "Groupes de stockage secondaire",
+"label.secondary.storage.details": "D\u00e9tails Stockage Secondaire",
+"label.secondary.storage.vm": "VM stockage secondaire",
+"label.secondary.used": "Stockage secondaire utilis\u00e9",
+"label.secondaryips": "IPs secondaires",
+"label.secondarystoragelimit": "Limites stockage secondaire (Go)",
+"label.secretkey": "Cl\u00e9 priv\u00e9e",
+"label.security.group.name": "Nom du groupe de s\u00e9curit\u00e9",
+"label.security.groups": "Groupes de s\u00e9curit\u00e9",
+"label.security.groups.enabled": "Groupes de s\u00e9curit\u00e9 Activ\u00e9s",
+"label.securitygroup": "Groupe de s\u00e9curit\u00e9",
+"label.securitygroups": "Groupes de s\u00e9curit\u00e9",
+"label.select": "S\u00e9lectionner",
+"label.select-view": "S\u00e9lectionner la vue",
+"label.select.a.zone": "S\u00e9lectionner une zone",
+"label.select.instance": "S\u00e9lectionner une instance",
+"label.select.instance.to.attach.volume.to": "S\u00e9lectionner l'instance \u00e0 laquelle rattacher ce volume",
+"label.select.iso.or.template": "S\u00e9lectionner un ISO ou un mod\u00e8le",
+"label.select.offering": "S\u00e9lectionner une offre",
+"label.select.project": "S\u00e9lectionner un projet",
+"label.select.region": "S\u00e9lectionner r\u00e9gion",
+"label.select.tier": "S\u00e9lectionner le tiers",
+"label.select.vm.for.static.nat": "S\u00e9lectionner une VM pour le NAT statique",
+"label.self": "Les miennes",
+"label.sent": "Envoy\u00e9",
+"label.sentbytes": "Octets envoy\u00e9s",
+"label.server": "Serveur",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Routeur Distribu\u00e9",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "VPC niveau r\u00e9gion",
+"label.service.lb.elasticlbcheckbox": "R\u00e9partition de charge extensible",
+"label.service.lb.inlinemodedropdown": "Mode",
+"label.service.lb.lbisolationdropdown": "R\u00e9partition de charge isol\u00e9e",
+"label.service.offering": "Offre de Service",
+"label.service.offering.details": "D\u00e9tails offre de service",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Router redondant",
+"label.service.state": "\u00c9tat du service",
+"label.service.staticnat.associatepublicip": "Associer IP Publique",
+"label.service.staticnat.elasticipcheckbox": "IP extensible",
+"label.servicecapabilities": "Fonctions disponibles",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Offre de calcul",
+"label.serviceofferingname": "Offre de calcul",
+"label.session.expired": "Session expir\u00e9e",
+"label.set.default.nic": "D\u00e9finir NIC par d\u00e9faut",
+"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\u00e8tres",
+"label.setup": "Configuration",
+"label.setup.network": "Configurer R\u00e9seau",
+"label.setup.zone": "Configurer Zone",
+"label.shared": "En partage",
+"label.sharedexecutable": "En partage",
+"label.sharedmountpoint": "Point de montage partag\u00e9",
+"label.show.ingress.rule": "Montrer la r\u00e8gle d'entr\u00e9e",
+"label.shrinkok": "R\u00e9duction OK",
+"label.shutdown.provider": "\u00c9teindre ce fournisseur",
+"label.simplified.chinese.keyboard": "Clavier chinois simplifi\u00e9",
+"label.site.to.site.vpn": "VPN Site-\u00e0-Site",
+"label.size": "Capacit\u00e9",
+"label.sizegb": "Capacit\u00e9",
+"label.skip.guide": "J'ai d\u00e9j\u00e0 utilis\u00e9 CloudStack avant, passer ce tutoriel",
+"label.smb.domain": "Domaine SMB",
+"label.smb.password": "Mot de passe SMB",
+"label.smb.username": "Identifiant SMB",
+"label.smbdomain": "Domaine SMB",
+"label.smbpassword": "Mot de passe SMB",
+"label.smbusername": "Identifiant SMB",
+"label.snapshot": "Instantan\u00e9",
+"label.snapshot.name": "Nom Instantan\u00e9",
+"label.snapshot.schedule": "Configurer un instantan\u00e9 r\u00e9current",
+"label.snapshotlimit": "Limites d'instantan\u00e9s",
+"label.snapshotmemory": "M\u00e9more instantan\u00e9",
+"label.snapshots": "Instantan\u00e9s",
+"label.snmpcommunity": "Communaut\u00e9 SNMP",
+"label.snmpport": "Port SNMP",
+"label.sockettimeout": "D\u00e9lai d'expiration de la socket",
+"label.source.nat.supported": "Source NAT support\u00e9",
+"label.sourcecidr": "CIDR Source",
+"label.sourceipaddress": "Adresse IP source",
+"label.sourcenat": "NAT Source",
+"label.sourcenattype": "Type de NAT support\u00e9",
+"label.sourceport": "Port Source",
+"label.specify.vxlan": "Pr\u00e9ciser le VXLAN",
+"label.specifyipranges": "Sp\u00e9cifier des plages IP",
+"label.specifyvlan": "Pr\u00e9ciser le VLAN",
+"label.sr.name": "Nom du point de montage",
+"label.srx": "SRX",
+"label.srx.details": "D\u00e9tails SRX",
+"label.ssh.key.pair.details": "D\u00e9tails bi-cl\u00e9 SSH",
+"label.ssh.key.pairs": "Bi-cl\u00e9s SSH",
+"label.sshkeypair": "Nouvelle bi-cl\u00e9 SSH",
+"label.standard.us.keyboard": "Clavier standard (US)",
+"label.start.ip": "IP d\u00e9but plage",
+"label.start.lb.vm": "D\u00e9marrer LB VM",
+"label.start.reserved.system.ip": "Adresse IP de d\u00e9but r\u00e9serv\u00e9e Syst\u00e8me",
+"label.start.vlan": "D\u00e9but VLAN",
+"label.start.vxlan": "D\u00e9but VXLAN",
+"label.startdate": "Par date (d\u00e9but)",
+"label.startip": "IP d\u00e9but plage",
+"label.startipv4": "IP d\u00e9but IPv4",
+"label.startipv6": "IP d\u00e9but IPv6",
+"label.startport": "Port de d\u00e9but",
+"label.startquota": "Valeur Quota",
+"label.state": "\u00c9tat",
+"label.static.nat.enabled": "NAT statique activ\u00e9",
+"label.static.nat.to": "NAT Statique vers",
+"label.static.nat.vm.details": "D\u00e9tails des NAT statique VM",
+"label.static.routes": "Routes statiques",
+"label.statistics": "Statistiques",
+"label.status": "Statut",
+"label.step.1": "\u00c9tape 1",
+"label.step.1.title": "\u00c9tape 1 : <strong>S\u00e9lectionnez un mod\u00e8le</strong>",
+"label.step.2": "\u00c9tape 2",
+"label.step.2.title": "\u00c9tape 2 : <strong>Offre de Service</strong>",
+"label.step.3": "\u00c9tape 3",
+"label.step.3.title": "\u00c9tape 3 : <strong id=\"step3_label\">S\u00e9lectionnez une offre de service</strong>",
+"label.step.4": "\u00c9tape 4",
+"label.step.4.title": "\u00c9tape 4 : <strong>R\u00e9seau</strong>",
+"label.step.5": "\u00c9tape 5",
+"label.step.5.title": "\u00c9tape 5 : <strong>V\u00e9rification</strong>",
+"label.stickiness.method": "M\u00e9thode de fid\u00e9lit\u00e9",
+"label.sticky.cookie-name": "Nom du cookie",
+"label.sticky.expire": "Expiration",
+"label.sticky.holdtime": "Temps de pause",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "Longueur",
+"label.sticky.name": "Nom de fid\u00e9lit\u00e9",
+"label.sticky.nocache": "Pas de cache",
+"label.sticky.postonly": "Apr\u00e8s seulement",
+"label.sticky.prefix": "Pr\u00e9fixe",
+"label.sticky.request-learn": "Apprendre la requ\u00eate",
+"label.sticky.tablesize": "Dimension tableau",
+"label.stop": "Arr\u00eater",
+"label.stop.lb.vm": "Arr\u00eater LB VM",
+"label.stopped": "VMs arr\u00eat\u00e9es",
+"label.storage": "Stockage",
+"label.storage.tags": "\u00c9tiquettes de stockage",
+"label.storage.traffic": "Trafic stockage",
+"label.storageid": "Stockages primaires",
+"label.storagepool": "Pool de stockage",
+"label.storagetags": "\u00c9tiquettes de stockage",
+"label.storagetype": "Type de stockage",
+"label.subdomainaccess": "Acc\u00e8s sous-domaine",
+"label.submit": "Envoyer",
+"label.submitted.by": "[Soumis par : <span id=\"submitted_by\"></span>]",
+"label.succeeded": "R\u00e9ussi",
+"label.sunday": "Dimanche",
+"label.supportedservices": "Services support\u00e9s",
+"label.supportspublicaccess": "Acc\u00e8s publiques activ\u00e9s",
+"label.supportsregionlevelvpc": "VPC niveau R\u00e9gion support\u00e9",
+"label.supportsstrechedl2subnet": "Sous-r\u00e9seau Streched L2 support\u00e9",
+"label.suspend.project": "Suspendre projet",
+"label.switch.type": "Type commutateur",
+"label.system.capacity": "Capacit\u00e9 syst\u00e8me",
+"label.system.offering": "Offre de Syst\u00e8me",
+"label.system.offering.for.router": "Offre de Syst\u00e8me pour Routeur",
+"label.system.offerings": "Offres de Syst\u00e8me",
+"label.system.service.offering": "Offre de Service Syst\u00e8me",
+"label.system.service.offering.details": "D\u00e9tails offre de service syst\u00e8me",
+"label.system.vm": "VM Syst\u00e8me",
+"label.system.vm.details": "D\u00e9tails VM Syst\u00e8me",
+"label.system.vm.scaled.up": "VM Syst\u00e8me agrandie",
+"label.system.vms": " VMs Syst\u00e8mes",
+"label.system.wide.capacity": "Capacit\u00e9 globale",
+"label.systemvmtype": "Type de VM syst\u00e8me",
+"label.tag.key": "Cl\u00e9 Tag",
+"label.tag.value": "Valeur Tag",
+"label.tagged": "\u00c9tiquet\u00e9",
+"label.tags": "\u00c9tiquette",
+"label.target.iqn": "Cible IQN",
+"label.tariffvalue": "Valeur Tarif",
+"label.task.completed": "T\u00e2che termin\u00e9e",
+"label.template": "Mod\u00e8le",
+"label.templatebody": "Corps de message",
+"label.templatedn": "S\u00e9lectionner Mod\u00e8le",
+"label.templatefileupload": "Fichier local",
+"label.templatelimit": "Limites de mod\u00e8le",
+"label.templatename": "Mod\u00e8le",
+"label.templatenames": "Mod\u00e8le",
+"label.templates": "Mod\u00e8les",
+"label.templatesubject": "Sujet",
+"label.templatetotal": "Mod\u00e8le",
+"label.templatetype": "Mod\u00e8le d'email",
+"label.tftp.dir": "R\u00e9pertoire TFTP",
+"label.tftpdir": "R\u00e9pertoire racine TFTP",
+"label.theme.default": "Th\u00e8me par d\u00e9faut",
+"label.theme.grey": "Personnalis\u00e9 - Gris",
+"label.theme.lightblue": "Personnalis\u00e9 - Bleu clair",
+"label.threshold": "Seuil",
+"label.thursday": "Jeudi",
+"label.tier.details": "D\u00e9tails du tiers",
+"label.tiername": "Tiers",
+"label.time": "Temps",
+"label.time.colon": "Heure :",
+"label.timeout": "D\u00e9lai d'expiration",
+"label.timeout.in.second ": " Timeout (secondes)",
+"label.timezone": "Fuseau horaire",
+"label.timezone.colon": "Fuseau horaire :",
+"label.token": "Jeton unique",
+"label.total.hosts": "Total H\u00f4tes",
+"label.total.memory": "Total m\u00e9moire",
+"label.total.storage": "Total stockage",
+"label.total.vms": "Nombre total de VMs",
+"label.totalcpu": "Capacit\u00e9 totale en CPU",
+"label.traffic.label": "Libell\u00e9 trafic",
+"label.traffic.types": "Types de trafic",
+"label.traffictype": "Type Trafic",
+"label.transportzoneuuid": "Uuid de la Zone Transport",
+"label.tuesday": "Mardi",
+"label.type": "Type",
+"label.type.id": "ID du Type",
+"label.ucs": "UCS",
+"label.uk.keyboard": "Clavier UK",
+"label.unavailable": "Indisponible",
+"label.unhealthy.threshold": "Seuil non tol\u00e9r\u00e9",
+"label.unit": "Unit\u00e9 d'usage",
+"label.unlimited": "Illimit\u00e9",
+"label.untagged": "Non Tagg\u00e9",
+"label.update.project.resources": "Mettre \u00e0 jour les ressources du projet",
+"label.update.ssl": " Certificat SSL",
+"label.update.ssl.cert": " Certificat SSL",
+"label.updating": "Mise \u00e0 jour",
+"label.upgrade.router.newer.template": "Mette \u00e0 jour le routeur pour utiliser le mod\u00e8le le plus r\u00e9cent",
+"label.upload": "T\u00e9l\u00e9verser",
+"label.upload.from.local": "T\u00e9l\u00e9verser depuis Local",
+"label.upload.template.from.local": "T\u00e9l\u00e9verser Mod\u00e8le depuis Local",
+"label.upload.volume": "T\u00e9l\u00e9verser un volume",
+"label.upload.volume.from.local": "T\u00e9l\u00e9verser Volume depuis Local",
+"label.upload.volume.from.url": "T\u00e9l\u00e9verser volume depuis URL",
+"label.url": "URL",
+"label.usage.sanity.result": "R\u00e9sultat de sant\u00e9 Usage",
+"label.usage.server": "Serveur d'Usage",
+"label.usageinterface": "Interface Utilisation",
+"label.usagename": "Type Usage",
+"label.usageunit": "Unit\u00e9",
+"label.use.vm.ip": "Utiliser IP VM :",
+"label.use.vm.ips": "Utiliser IP VMs",
+"label.usehttps": "Utiliser HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Utilisateur",
+"label.user.details": "D\u00e9tails utilisateur",
+"label.user.vm": "Utilisateur VM",
+"label.userdata": "Donn\u00e9es Utilisateur",
+"label.userdatal2": "Donn\u00e9es utilisateur",
+"label.username": "Identifiant",
+"label.users": "Utilisateurs",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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\u00f4te vCenter",
+"label.vcenter.password": "Mot de passe vCenter",
+"label.vcenter.username": "Identifiant vCenter",
+"label.vcenterdatacenter": "Datacenter vCenter",
+"label.vcenterdatastore": "Datastore vCenter",
+"label.esx.host": "H\u00f4te ESX/ESXi",
+"label.vcenterpassword": "Mot de passe vCenter",
+"label.vcenterusername": "Identifiant vCenter",
+"label.vcipaddress": "Adresse IP vCenter",
+"label.vcsdeviceid": "ID",
+"label.version": "Version",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "R\u00e9solution Max.",
+"label.vgpu.max.vgpu.per.gpu": "vGPUs par GPU",
+"label.vgpu.remaining.capacity": "Capacit\u00e9 restante",
+"label.vgpu.video.ram": "M\u00e9moire Vid\u00e9o",
+"label.vgputype": "vGPU type",
+"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\u00e9tails Appliance Virtuelle",
+"label.virtual.appliances": "Appliances Virtuelles",
+"label.virtual.machine": "Machine Virtuelle",
+"label.virtual.machines": "Machines virtuelles",
+"label.virtual.network": "R\u00e9seau virtuel",
+"label.virtual.networking": "Mise en r\u00e9seau virtuelle",
+"label.virtual.routers": "Routeurs virtuels",
+"label.virtual.routers.group.account": "Routeurs virtuels group\u00e9s par compte",
+"label.virtual.routers.group.cluster": "Routeurs virtuels group\u00e9s par cluster",
+"label.virtual.routers.group.pod": "Routeurs virtuels group\u00e9s par pod",
+"label.virtual.routers.group.zone": "Routeurs virtuels group\u00e9s par zone",
+"label.virtualmachinedisplayname": "Nom VM",
+"label.virtualmachineid": "ID VM",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "Plage du VLAN",
+"label.vlan.range.details": "D\u00e9tails plage VLAN",
+"label.vlan.vni.ranges": "Plage(s) VLAN/VNI",
+"label.vlanid": "ID VLAN/VNI",
+"label.vlanname": "VLAN",
+"label.vlanrange": "Plage du VLAN",
+"label.vm.add": "Ajouter une instance",
+"label.vm.destroy": "D\u00e9truire",
+"label.vm.password": "Le mot de passe de cette VM est",
+"label.vm.reboot": "Red\u00e9marrer",
+"label.vm.snapshots": "Instantan\u00e9s VM",
+"label.vm.start": "D\u00e9marrer",
+"label.vm.stop": "Arr\u00eater",
+"label.vmdisplayname": "Nom commun VM",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "Magasin de donn\u00e9es VMFS",
+"label.vmipaddress": "Adresse IP VM",
+"label.vmlimit": "Limites des instances",
+"label.vmname": "Nom VM",
+"label.vms": "VMs",
+"label.vms.in.tier": "Machines virtuelles dans le tiers",
+"label.vmstate": "\u00c9tat VM",
+"label.vmtotal": "Total VMs",
+"label.vmwaredcid": "ID datacenter VMware",
+"label.vmwaredcname": "Nom datacenter VMware",
+"label.vmwaredcvcenter": "vcenter datacenter VMware",
+"label.vmwarenetworklabel": "Libell\u00e9 trafic VMware",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "\u00c9quipement VNMC",
+"label.volgroup": "Groupe de Volume",
+"label.volume": "Volume",
+"label.volume.details": "D\u00e9tails du volume",
+"label.volume.migrated": "Volume migr\u00e9",
+"label.volumechecksum": "Empreinte MD5",
+"label.volumefileupload": "Fichier local",
+"label.volumegroup": "Groupe de Volume",
+"label.volumelimit": "Limites des volumes",
+"label.volumename": "Nom du volume",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "ID VPC",
+"label.vpc.offering.details": "D\u00e9tails offre VPC",
+"label.vpc.offerings": "Offres de VPC",
+"label.vpc.router.details": "D\u00e9tails Routeur VPC",
+"label.vpc.virtual.router": "Routeur virtuel VPC",
+"label.vpcid": "VPC",
+"label.vpclimit": "Limites VPC",
+"label.vpcname": "VPC",
+"label.vpcoffering": "Offre de VPC",
+"label.vpn": "VPN",
+"label.vpn.connection": "Connexion VPN",
+"label.vpn.gateway": "Passerelle VPN",
+"label.vpncustomergatewayid": "Passerelle VPN client",
+"label.vsmctrlvlanid": " ID VLAN Contr\u00f4le",
+"label.vsmdeviceid": "Nom",
+"label.vsmdevicestate": "\u00c9tat",
+"label.vsmipaddress": "Adresse IP Nexus 1000v",
+"label.vsmpassword": "Mot de passe Nexus 1000v",
+"label.vsmpktvlanid": "ID VLAN Paquet",
+"label.vsmstoragevlanid": "VLAN ID Stockage",
+"label.vsmusername": "Identifiant Nexus 1000v",
+"label.vsmusername.req": "Identifiant Nexus 1000v",
+"label.vsphere.managed": "G\u00e9r\u00e9e par vSphere",
+"label.vswitch.name": "Nom vSwitch",
+"label.vswitch.type": "Type vSwitch",
+"label.vswitchguestname": "Nom Trafic Invit\u00e9 vSwitch",
+"label.vswitchguesttype": "Type Trafic Invit\u00e9 vSwitch",
+"label.vswitchpublicname": "Nom Trafic Public vSwitch",
+"label.vswitchpublictype": "Type Trafic Public 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.writecachetype": "Type Write-cache",
+"label.xennetworklabel": "Libell\u00e9 trafic XenServer",
+"label.xenservertoolsversion61plus": "XenServer Tools Version 6.1+",
+"label.yes": "Oui",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone d\u00e9di\u00e9e",
+"label.zone.details": "D\u00e9tails de la zone",
+"label.zone.id": "ID de la zone",
+"label.zone.step.1.title": "\u00c9tape 1 : <strong>S\u00e9lectionnez un r\u00e9seau</strong>",
+"label.zone.step.2.title": "\u00c9tape 2 : <strong>Ajoutez une zone</strong>",
+"label.zone.step.3.title": "\u00c9tape 3 : <strong>Ajoutez un Pod</strong>",
+"label.zone.step.4.title": "\u00c9tape 4 : <strong>Ajoutez une plage d'adresses IP</strong>",
+"label.zone.type": "Type de zone",
+"label.zone.wide": "Transverse \u00e0 la zone",
+"label.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Nom de la zone",
+"label.zones": "Zones",
+"label.zonewizard.traffictype.guest": "Invit\u00e9 : 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\u00f4tes et les machines virtuelles Syst\u00e8mes 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\u00e8les et des instantan\u00e9s de disques",
+"message.acquire.ip.nic": "Confirmez que vous souhaitez acqu\u00e9rir 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\u00e9seau.",
+"message.acquire.new.ip.vpc": "Veuillez confirmer que vous voulez une nouvelle adresse IP pour ce VPC",
+"message.acquire.public.ip": "S\u00e9lectionnez la zone dans laquelle vous voulez acqu\u00e9rir votre nouvelle adresse IP.",
+"message.action.cancel.maintenance": "Votre h\u00f4te a quitt\u00e9 la maintenance. Ce processus peut prendre jusqu'\u00e0 plusieurs minutes.",
+"message.action.cancel.maintenance.mode": "Confirmer l'annulation de cette maintenance.",
+"message.action.change.service.warning.for.instance": "Votre instance doit \u00eatre arr\u00eat\u00e9e avant d'essayer de changer son offre de service.",
+"message.action.change.service.warning.for.router": "Votre routeur doit \u00eatre arr\u00eat\u00e9 avant d'essayer de changer son offre de service.",
+"message.action.delete.cluster": "\u00cates-vous s\u00fbr que vous voulez supprimer ce cluster.",
+"message.action.delete.disk.offering": "Supprimer cette offre de disque ?",
+"message.action.delete.domain": "\u00cates-vous s\u00fbr que vous voulez supprimer ce domaine.",
+"message.action.delete.external.firewall": "Supprimer ce pare-feu externe ? Attention : Si vous pr\u00e9voyez de rajouter le m\u00eame pare-feu externe de nouveau, vous devez r\u00e9-initialiser les donn\u00e9es d'utilisation sur l'appareil.",
+"message.action.delete.external.load.balancer": "Supprimer ce r\u00e9partiteur de charge externe ? Attention : Si vous pensez ajouter le m\u00eame r\u00e9partiteur de charge plus tard, vous devez remettre \u00e0 z\u00e9ro les statistiques d'utilisation de cet \u00e9quipement.",
+"message.action.delete.ingress.rule": "Supprimer cette r\u00e8gle de flux entrant ?",
+"message.action.delete.iso": "Supprimer cet ISO ?",
+"message.action.delete.iso.for.all.zones": "L'ISO est utilis\u00e9 par toutes les zones. S'il vous pla\u00eet confirmer que vous voulez le supprimer de toutes les zones.",
+"message.action.delete.network": "\u00cates-vous s\u00fbr que vous voulez supprimer ce r\u00e9seau.",
+"message.action.delete.nexusvswitch": "Confirmer la suppession de ce Nexus 1000v",
+"message.action.delete.physical.network": "Confirmer la suppression du r\u00e9seau physique",
+"message.action.delete.pod": "Supprimer ce pod ?",
+"message.action.delete.primary.storage": "\u00cates-vous s\u00fbr 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\u00e9curit\u00e9 ?",
+"message.action.delete.service.offering": "Supprimer cette offre de service ?",
+"message.action.delete.snapshot": "Supprimer cet instantan\u00e9 ?",
+"message.action.delete.system.service.offering": "\u00cates-vous s\u00fbr que vous voulez supprimer l'offre syst\u00e8me.",
+"message.action.delete.template": "Supprimer ce mod\u00e8le ?",
+"message.action.delete.template.for.all.zones": "Ce mod\u00e8le est utilis\u00e9 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\u00e8me ?",
+"message.action.destroy.volume": "Please confirm that you want to destroy this volume.",
+"message.action.disable.cluster": "D\u00e9sactiver ce cluster ?",
+"message.action.disable.nexusvswitch": "Confirmer la d\u00e9sactivation de ce Nexus 1000v",
+"message.action.disable.physical.network": "Confirmer l'activation de ce r\u00e9seau physique.",
+"message.action.disable.pod": "D\u00e9sactiver ce pod ?",
+"message.action.disable.static.nat": "D\u00e9sactiver le NAT statique ?",
+"message.action.disable.zone": "D\u00e9sactiver cette zone ?",
+"message.action.download.iso": "Confirmer le t\u00e9l\u00e9chargement de cet ISO",
+"message.action.download.template": "Confirmer le t\u00e9l\u00e9chargement de ce mod\u00e8le",
+"message.action.downloading.template": "T\u00e9l\u00e9chargement mod\u00e8le.",
+"message.action.enable.cluster": "Activer ce cluster ?",
+"message.action.enable.maintenance": "Votre h\u00f4te a \u00e9t\u00e9 mis en mode maintenance avec succ\u00e8s. Ce processus peut durer plusieurs minutes ou plus, suivant le nombre de VMs actives sur cet h\u00f4te.",
+"message.action.enable.nexusvswitch": "Confirmer l'activation de ce Nexus 1000v",
+"message.action.enable.physical.network": "Confirmer l'activation de ce r\u00e9seau 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\u00f4te a \u00e9t\u00e9 forc\u00e9e \u00e0 se reconnecter avec succ\u00e8s. Ce processus peut prendre jusqu'\u00e0 plusieurs minutes.",
+"message.action.host.enable.maintenance.mode": "Activer le mode maintenance va causer la migration \u00e0 chaud de l'ensemble des instances de cet h\u00f4te sur les autres h\u00f4tes disponibles.",
+"message.action.instance.reset.password": "Confirmer le changement du mot de passe ROOT pour cette machine virtuelle.",
+"message.action.manage.cluster": "G\u00e9rer le cluster ?",
+"message.action.primarystorage.enable.maintenance.mode": "Attention : placer ce stockage primaire en mode maintenance va provoquer l'arr\u00eat de l'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez-vous continuer ?",
+"message.action.reboot.instance": "Red\u00e9marrer cette instance ?",
+"message.action.reboot.router": "Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer le r\u00e9-amor\u00e7age de ce routeur.",
+"message.action.reboot.systemvm": "Red\u00e9marrer cette VM Syst\u00e8me ?",
+"message.action.recover.volume": "Please confirm that you would like to recover this volume.",
+"message.action.release.ip": "Lib\u00e9rer cette adresse IP ?",
+"message.action.remove.host": "\u00cates-vous s\u00fbr que vous voulez supprimer cet h\u00f4te.",
+"message.action.reset.password.off": "Votre instance ne supporte pas pour le moment cette fonctionnalit\u00e9.",
+"message.action.reset.password.warning": "Votre instance doit \u00eatre arr\u00eat\u00e9e 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\u00e9tablir ce volume pour cet instantan\u00e9",
+"message.action.start.instance": "D\u00e9marrer cette instance ?",
+"message.action.start.router": "D\u00e9marrer ce routeur ?",
+"message.action.start.systemvm": "Red\u00e9marrer cette VM syst\u00e8me ?",
+"message.action.stop.instance": "Arr\u00eater cette instance ?",
+"message.action.stop.router": "Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer l'arr\u00eat de ce routeur.",
+"message.action.stop.systemvm": "Arr\u00eater cette VM ?",
+"message.action.unmanage.cluster": "Confirmez que vous ne voulez plus g\u00e9rer le cluster",
+"message.action.vmsnapshot.create": "Veuillez confirmer que vous souhaitez prendre un instantan\u00e9 de cette instance. <br>Notez que l'instance sera mise en pause durant la prise de l'instantan\u00e9 puis remise en route une fois termin\u00e9e, si elle fonctionne sur KVM.",
+"message.action.vmsnapshot.delete": "Confirmez que vous souhaitez supprimer cet instantan\u00e9 VM.",
+"message.action.vmsnapshot.revert": "R\u00e9tablir l'instantan\u00e9 VM",
+"message.activate.project": "Voulez-vous activer ce projet ?",
+"message.add.cluster": "Ajouter un cluster d'hyperviseurs g\u00e9r\u00e9 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\u00e9r\u00e9 pour cette zone <b><span id=\"zone_name\"></span></b>",
+"message.add.disk.offering": "Renseignez les param\u00e8tres suivants pour ajouter un offre de service de disques",
+"message.add.domain": "Sp\u00e9cifier le sous domaine que vous souhaitez cr\u00e9er sous ce domaine",
+"message.add.firewall": "Ajouter un pare-feu \u00e0 cette zone",
+"message.add.guest.network": "Confirmer l'ajout du r\u00e9seau invit\u00e9",
+"message.add.host": "Renseignez les param\u00e8tres suivants pour ajouter une h\u00f4te",
+"message.add.ip.range": "Ajouter une plage IP pour le r\u00e9seau publique dans la zone",
+"message.add.ip.range.direct.network": "Ajouter une plage IP au r\u00e9seau 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\u00e9partiteur de charge \u00e0 la zone",
+"message.add.load.balancer.under.ip": "La r\u00e8gle de r\u00e9partition de charge \u00e9t\u00e9 ajout\u00e9e sous l'adresse IP :",
+"message.add.network": "Ajouter un nouveau r\u00e9seau \u00e0 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 \u00e0 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\u00e9 maintenant. Une pod contient les h\u00f4tes et les serveurs de stockage primaire, qui seront ajout\u00e9s dans une \u00e9tape ult\u00e9rieure. Configurer une plage d'adresses IP r\u00e9serv\u00e9es pour le trafic de gestion interne de CloudStack. La plage d'IP r\u00e9serv\u00e9e doit \u00eatre unique pour chaque zone dans le nuage.",
+"message.add.primary": "Renseignez les param\u00e8tres suivants pour ajouter un stockage primaire",
+"message.add.primary.storage": "Ajouter un nouveau stockage primaire \u00e0 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\u00e9gion.",
+"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\u00e9er une nouvelle offre de syst\u00e8me.",
+"message.add.template": "Renseignez les informations suivantes pour cr\u00e9er votre nouveau mod\u00e8le",
+"message.add.volume": "Renseignez les informations suivantes pour ajouter un nouveau volume",
+"message.add.vpn.gateway": "Confirmer l'ajout d'une passerelle VPN",
+"message.added.vpc.offering": "Offre de VPC ajout\u00e9e",
+"message.adding.host": "Ajout un h\u00f4te",
+"message.adding.netscaler.device": "Ajouter un Netscaler",
+"message.adding.netscaler.provider": "Ajouter un fournisseur Netscaler",
+"message.additional.networks.desc": "S\u00e9lectionnez le(s) r\u00e9seau(x) additionnel(s) au(x)quel(s) sera connect\u00e9e votre instance.",
+"message.admin.guide.read": "Pour les VMs VMware, veuillez lire le paragraphe \"dynamic scaling\" dans le guide d'administration avant d'op\u00e9rer un dimensionnement. Voulez-vous continuer ?,",
+"message.advanced.mode.desc": "Choisissez ce mod\u00e8le de r\u00e9seau si vous souhaitez b\u00e9n\u00e9ficier du support des VLANs. Ce mode de r\u00e9seau donne le plus de flexibilit\u00e9 aux administrateurs pour fournir des offres de service r\u00e9seau personnalis\u00e9es comme fournir des pare-feux, VPN, r\u00e9partiteurs de charge ou \u00e9galement activer des r\u00e9seaux virtuels ou directs.",
+"message.advanced.security.group": "Choisissez ceci si vous souhaitez utiliser les groupes de s\u00e9curit\u00e9 pour fournir l'isolation des VMs invit\u00e9es.",
+"message.advanced.virtual": "Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l'isolation des VMs invit\u00e9es.",
+"message.after.enable.s3": "Le stockage secondaire S3 est configur\u00e9. Note : Quand vous quitterez cette page, vous ne pourrez plus re-configurer le support S3.",
+"message.after.enable.swift": "Swift configur\u00e9. Remarque : une fois que vous quitterez cette page, il ne sera plus possible de re-configurer Swift \u00e0 nouveau.",
+"message.alert.state.detected": "\u00c9tat d'alerte d\u00e9tect\u00e9",
+"message.allow.vpn.access": "Entrez un identifiant et un mot de passe pour l'utilisateur que vous souhaitez autoriser \u00e0 utiliser l'acc\u00e8s VPN.",
+"message.apply.snapshot.policy": "Vous avez mis \u00e0 jour votre politique d'instantan\u00e9s avec succ\u00e8s.",
+"message.assign.instance.another": "Veuillez sp\u00e9cifier le type de compte, domaine, nom de compte et r\u00e9seau (optionnel) pour le nouveau compte. <br> Si l'interface par d\u00e9faut de la machine virtuelle est sur un r\u00e9seau partag\u00e9, CloudStack va v\u00e9rifier si le r\u00e9seau peut \u00eatre utilis\u00e9 par le nouveau compte si vous n'avez pas sp\u00e9cifier de r\u00e9seau. <br> Si l'interface par d\u00e9faut de la machine virtuelle est sur un r\u00e9seau isol\u00e9, et que le nouveau compte a plus d'un r\u00e9seau isol\u00e9, vous devez en sp\u00e9cifier un.",
+"message.attach.iso.confirm": "Attacher l'image ISO \u00e0 cette instance ?",
+"message.attach.volume": "Renseignez les donn\u00e9es suivantes pour attacher un nouveau volume. Si vous attachez un volume disque \u00e0 une machine virtuelle sous Windows, vous aurez besoin de red\u00e9marrer l'instance pour voir le nouveau disque.",
+"message.basic.mode.desc": "Choisissez ce mod\u00e8le de r\u00e9seau si vous  <b>*<u>ne voulez pas</u>*</b> activer le support des VLANs. Toutes les instances cr\u00e9\u00e9es avec ce mod\u00e8le de r\u00e9seau se verront assigner une adresse IP et les groupes de s\u00e9curit\u00e9 seront utilis\u00e9s pour fournir l'isolation entre les VMs.",
+"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\u00e9di\u00e9e",
+"message.cluster.dedication.released": "Lib\u00e9ration de cluster d\u00e9di\u00e9",
+"message.configure.all.traffic.types": "Vous avez de multiples r\u00e9seaux physiques ; veuillez configurer les libell\u00e9s pour chaque type de trafic en cliquant sur le bouton Modifier.",
+"message.configure.firewall.rules.allow.traffic": "Configurer les r\u00e8gles autorisant le trafic",
+"message.configure.firewall.rules.block.traffic": "Configurer les r\u00e8gles bloquant le trafic",
+"message.configure.ldap": "Confirmer la configuration LDAP",
+"message.configuring.guest.traffic": "Configuration du r\u00e9seau VM",
+"message.configuring.physical.networks": "Configuration des r\u00e9seaux physiques",
+"message.configuring.public.traffic": "Configuration du r\u00e9seau public",
+"message.configuring.storage.traffic": "Configuration du r\u00e9seau de stockage",
+"message.confirm.action.force.reconnect": "Confirmer la re-connexion forc\u00e9e de cet h\u00f4te.",
+"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 \u00e9v\u00e9nement.",
+"message.confirm.archive.selected.alerts": "Confirmer l'archivage des alertes s\u00e9lectionn\u00e9es",
+"message.confirm.archive.selected.events": "Confirmez l'archivage des \u00e9v\u00e9nements s\u00e9lectionn\u00e9s",
+"message.confirm.attach.disk": "Confirmer le rattachement de ce disque ?",
+"message.confirm.create.volume": "Confirmer la cr\u00e9ation de ce volume ?",
+"message.confirm.current.guest.cidr.unchanged": "Voulez-vous garder l'actuel r\u00e9seau d'invit\u00e9 CIDR inchang\u00e9 ?",
+"message.confirm.dedicate.cluster.domain.account": "D\u00e9dier ce cluster \u00e0 un domaine/compte ?",
+"message.confirm.dedicate.host.domain.account": "D\u00e9dier cet h\u00f4te \u00e0 un domaine/compte ?",
+"message.confirm.dedicate.pod.domain.account": "D\u00e9dier ce pod \u00e0 un domaine/compte ?",
+"message.confirm.dedicate.zone": "\u00cates-vous s\u00fbr de d\u00e9dier cette zone \u00e0 un domaine/compte ?",
+"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.bigswitchbcf": "Confirmer que vous voulez supprimer ce contr\u00f4leur BigSwitch BCF",
+"message.confirm.delete.brocadevcs": "Confirmer la suppression du switch Brocade Vcs",
+"message.confirm.delete.ciscoasa1000v": "Confirmez la suppression du CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Confirmer la suppression de la ressource CiscoVNMC",
+"message.confirm.delete.f5": "Confirmer la suppression du F5",
+"message.confirm.delete.internal.lb": "Confirmer la suppression de ce LB interne.",
+"message.confirm.delete.netscaler": "Confirmer la suppression du Netscaler",
+"message.confirm.delete.pa": "Confirmer la suppression du Palo Alto",
+"message.confirm.delete.secondary.staging.store": "Confirmer que vous voulez supprimer le Stockage Secondaire Interm\u00e9diaire.",
+"message.confirm.delete.srx": "Confirmer la suppression du SRX",
+"message.confirm.delete.ucs.manager": "Confirmez que vous voulez supprimer le gestionnaire UCS",
+"message.confirm.destroy.router": "\u00cates-vous s\u00fbr que vous voulez supprimer ce routeur",
+"message.confirm.disable.host": "Confirmer la d\u00e9s-activation de cet h\u00f4te.",
+"message.confirm.disable.network.offering": "Voulez-vous d\u00e9sactiver cette offre r\u00e9seau ?",
+"message.confirm.disable.provider": "Confirmer la d\u00e9sactivation de ce fournisseur",
+"message.confirm.disable.vnmc.provider": "Confirmer la d\u00e9sactivation du fournisseur VNMC.",
+"message.confirm.disable.vpc.offering": "Voulez-vous d\u00e9sactiver cette offre VPC ?",
+"message.confirm.enable.host": "Confirmer l'activation de cet h\u00f4te.",
+"message.confirm.enable.network.offering": "Voulez-vous activer cette offre r\u00e9seau ?",
+"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 \u00e0 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\u00eechr les lames.",
+"message.confirm.release.dedicate.vlan.range": "Confirmez que vous souhaitez lib\u00e9rer cette plage VLAN d\u00e9di\u00e9e.",
+"message.confirm.release.dedicated.cluster": "Lib\u00e9rer ce cluster d\u00e9di\u00e9 ?",
+"message.confirm.release.dedicated.host": "Lib\u00e9rer cet h\u00f4te d\u00e9di\u00e9e ?",
+"message.confirm.release.dedicated.pod": "Lib\u00e9rer ce pod d\u00e9di\u00e9 ?",
+"message.confirm.release.dedicated.zone": "Lib\u00e9rer cette zone d\u00e9di\u00e9e ?",
+"message.confirm.remove.event": "Voulez-vous supprimer cet \u00e9v\u00e9nement ?",
+"message.confirm.remove.ip.range": "\u00cates-vous s\u00fbr que vous voulez supprimer cette plage d'adresses IP",
+"message.confirm.remove.load.balancer": "Confirmer la suppression de cette VM du r\u00e9partiteur de charge ?",
+"message.confirm.remove.network.offering": "Voulez-vous supprimer cette offre r\u00e9seau ?",
+"message.confirm.remove.selected.alerts": "Confirmer la suppression des alertes s\u00e9lectionn\u00e9es",
+"message.confirm.remove.selected.events": "Confirmez la suppression des \u00e9v\u00e9nements s\u00e9lectionn\u00e9s",
+"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\u00e8me ?",
+"message.confirm.shutdown.provider": "Confirmer l'arr\u00eat de ce fournisseur",
+"message.confirm.start.lb.vm": "Confirmez que vous souhaitez d\u00e9marrer ce LB VM.",
+"message.confirm.stop.lb.vm": "Confirmez que vous souhaitez arr\u00eater ce LB VM.",
+"message.confirm.upgrade.router.newer.template": "Confirmez que vous souhaitez mettre \u00e0 jour le routeur avec un mod\u00e8le plus r\u00e9cent.",
+"message.confirm.upgrade.routers.account.newtemplate": "Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce compte avec un mod\u00e8le plus r\u00e9cent.",
+"message.confirm.upgrade.routers.cluster.newtemplate": "Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce cluster avec un mod\u00e8le plus r\u00e9cent.",
+"message.confirm.upgrade.routers.newtemplate": "Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans cette zone avec un mod\u00e8le plus r\u00e9cent.",
+"message.confirm.upgrade.routers.pod.newtemplate": "Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce pod avec un mod\u00e8le plus r\u00e9cent.",
+"message.copy.iso.confirm": "Copier votre image ISO vers",
+"message.copy.template": "Copier le mod\u00e8le <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\u00e8le ?",
+"message.create.template": "Voulez-vous cr\u00e9er un mod\u00e8le ?",
+"message.create.template.vm": "Cr\u00e9er la VM depuis le mod\u00e8le <b id=\"p_name\"></b>",
+"message.create.template.volume": "Renseignez les informations suivantes avec de cr\u00e9er un mod\u00e8le \u00e0 partir de votre volume de disque:<b><span id=\"volume_name\"></span></b>. La cr\u00e9ation du mod\u00e8le peut prendre plusieurs minutes suivant la taille du volume.",
+"message.creating.cluster": "Cr\u00e9ation du cluster",
+"message.creating.guest.network": "Cr\u00e9ation du r\u00e9seau pour les invit\u00e9s",
+"message.creating.physical.networks": "Cr\u00e9ation des r\u00e9seaux physiques",
+"message.creating.pod": "Cr\u00e9ation d'un pod",
+"message.creating.primary.storage": "Cr\u00e9ation du stockage primaire",
+"message.creating.secondary.storage": "Cr\u00e9ation du stockage secondaire",
+"message.creating.systemvm": "Cr\u00e9ation des VMs Syst\u00e8mes (peut prendre du temps)...",
+"message.creating.zone": "Cr\u00e9ation de la zone",
+"message.dedicate.zone": "Zone d\u00e9di\u00e9e",
+"message.dedicated.zone.released": "Lib\u00e9ration de zone d\u00e9di\u00e9e",
+"message.delete.account": "Supprimer ce compte ?",
+"message.delete.affinity.group": "Confirmer la supression de ce groupe d'affinit\u00e9.",
+"message.delete.gateway": "\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle",
+"message.delete.project": "Voulez-vous supprimer ce projet ?",
+"message.delete.user": "\u00cates-vous s\u00fbr que vous voulez supprimer cet utilisateur.",
+"message.delete.vpn.connection": "\u00cates-vous s\u00fbr que vous voulez supprimer la connexion VPN",
+"message.delete.vpn.customer.gateway": "\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle VPN client",
+"message.delete.vpn.gateway": "\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle VPN",
+"message.desc.add.new.lb.sticky.rule": "Ajouter nouvelle r\u00e8gle LB sticky",
+"message.desc.advanced.zone": "Pour des topologies de r\u00e9seau plus sophistiqu\u00e9es. Ce mod\u00e8le de r\u00e9seau permet plus de flexibilit\u00e9 dans la d\u00e9finition des r\u00e9seaux d'invit\u00e9s et propose des offres personnalis\u00e9es telles que le support de pare-feu, VPN ou d'\u00e9quilibrage de charge.",
+"message.desc.basic.zone": "Fournit un r\u00e9seau unique o\u00f9 chaque instance de machine virtuelle se voit attribuer une adresse IP directement depuis le r\u00e9seau. L'isolation des invit\u00e9s peut \u00eatre assur\u00e9 au niveau de la couche r\u00e9seau-3 tels que les groupes de s\u00e9curit\u00e9 (filtrage d'adresse IP source).",
+"message.desc.cluster": "Chaque pod doit contenir un ou plusieurs clusters, et le premier cluster sera ajout\u00e9 tout de suite. Un cluster est un regroupement pour h\u00f4tes. Les h\u00f4tes d'un cluster ont tous un mat\u00e9riel identique, ex\u00e9cutent le m\u00eame hyperviseur, sont dans le m\u00eame sous-r\u00e9seau, et acc\u00e8dent au m\u00eame stockage partag\u00e9. Chaque cluster comprend une ou plusieurs h\u00f4tes et un ou plusieurs serveurs de stockage primaire.",
+"message.desc.create.ssh.key.pair": "Veuillez remplir les champs suivants pour cr\u00e9er ou enregistrer une bi-cl\u00e9 SSH.<br><br>(1) Si la cl\u00e9 publique est d\u00e9finie, CloudStack va enregistrer cette cl\u00e9. Vous pouvez ensuite l'utiliser avec sa cl\u00e9 priv\u00e9e.<br><br>(2) Si la cl\u00e9 publique n'est pas d\u00e9finie, CloudStack va cr\u00e9er une nouvelle bi-cl\u00e9 SSH. Dans ce cas, veuillez copier et sauvegarder la cl\u00e9 priv\u00e9e. CloudStack ne va pas la conserver.<br>",
+"message.desc.created.ssh.key.pair": "Bi-cl\u00e9 SSH cr\u00e9\u00e9e",
+"message.desc.host": "Chaque cluster doit contenir au moins un h\u00f4te (machine) pour ex\u00e9ctuer des machines virtuelles invit\u00e9es, et le premier h\u00f4te sera ajout\u00e9e maintenant. Pour un h\u00f4te fonctionnant dans CloudStack, vous devez installer un logiciel hyperviseur sur l'h\u00f4te, attribuer une adresse IP \u00e0 l'h\u00f4te, et s'assurer que l'h\u00f4te est connect\u00e9 au serveur d'administration CloudStack.<br/><br/>Indiquer le nom de l'h\u00f4te ou son adresse IP, l'identifiant de connexion (g\u00e9n\u00e9ralement root) et le mot de passe ainsi que toutes les \u00e9tiquettes permettant de classer les h\u00f4tes.",
+"message.desc.primary.storage": "Chaque cluster doit contenir un ou plusieurs serveurs de stockage primaire, et le premier sera ajout\u00e9 tout de suite. Le stockage principal contient les volumes de disque pour les machines virtuelles s'ex\u00e9cutant sur les h\u00f4tes dans le cluster. Utiliser les protocoles standards pris en charge par l'hyperviseur sous-jacent.",
+"message.desc.reset.ssh.key.pair": "Veuillez sp\u00e9cifier une bi-cl\u00e9 SSH que vous souhaitez ajouter \u00e0 cette VM. Noter que le mot de passe root sera chang\u00e9 durant cette op\u00e9ration si l'option mot de passe est activ\u00e9e.",
+"message.desc.secondary.storage": "Chaque zone doit avoir au moins un serveur NFS ou un serveur de stockage secondaire, et sera ajout\u00e9 en premier tout de suite. Le stockage secondaire entrepose les mod\u00e8les de machines virtuelles, les images ISO et les images disques des volumes des machines virtuelles. Ce serveur doit \u00eatre accessible pour toutes les machines h\u00f4tes dans la zone.<br/><br/>Saisir l'adresse IP et le chemin d'export.",
+"message.desc.zone": "Une zone est la plus grande unit\u00e9 organisationnelle dans CloudStack, et correspond typiquement \u00e0 un centre de donn\u00e9es. Les zones fournissent un isolement physique et de la redondance. Une zone est constitu\u00e9e d'un ou plusieurs pods (dont chacun contient les h\u00f4tes et les serveurs de stockage primaire) et un serveur de stockage secondaire qui est partag\u00e9e par tous les pods dans la zone.",
+"message.detach.disk": "Voulez-vous d\u00e9tacher ce disque ?",
+"message.detach.iso.confirm": "D\u00e9tacher l'image ISO de cette instance ?",
+"message.disable.account": "Veuillez confirmer que vous voulez d\u00e9sactiver ce compte. En d\u00e9sactivant le compte, tous les utilisateurs pour ce compte n'auront plus acc\u00e8s \u00e0 leurs ressources sur le cloud. Toutes les machines virtuelles vont \u00eatre arr\u00eat\u00e9es imm\u00e9diatement.",
+"message.disable.snapshot.policy": "Vous avez d\u00e9sactiv\u00e9 votre politique d'instantan\u00e9 avec succ\u00e8s.",
+"message.disable.user": "Confirmer la d\u00e9sactivation de cet utilisateur.",
+"message.disable.vpn": "Voulez-vous d\u00e9sactiver le VPN ?",
+"message.disable.vpn.access": "D\u00e9sactiver l'acc\u00e8s VPN ?",
+"message.disabling.network.offering": "D\u00e9sactivation de l'offre r\u00e9seau",
+"message.disabling.vpc.offering": "D\u00e9sactivation de l'offre VPC",
+"message.disallowed.characters": "Caract\u00e8res non autoris\u00e9s : <,>",
+"message.download.iso": "Cliquer <a href=\"#\">00000</a> pour t\u00e9l\u00e9charger une image ISO",
+"message.download.template": "Cliquer sur <a href=\"#\">00000</a> pour t\u00e9l\u00e9charger le mod\u00e8le",
+"message.download.volume": "Cliquer sur <a href=\"#\">00000</a> pour t\u00e9l\u00e9charger le volume",
+"message.download.volume.confirm": "Veuillez confirmer que vous voulez t\u00e9l\u00e9charger ce volume.",
+"message.edit.account": "Modifier (\"-1\" signifie pas de limite de ressources)",
+"message.edit.confirm": "V\u00e9rifier 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\u00e9ation de ressources.",
+"message.edit.traffic.type": "Sp\u00e9cifier le libell\u00e9 de trafic associ\u00e9 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\u00e8s VPN pour cette adresse IP.",
+"message.enable.vpn.access": "Le VPN est d\u00e9sactiv\u00e9 pour cette adresse IP. Voulez vous activer l'acc\u00e8s VPN ?",
+"message.enabled.vpn": "Votre acc\u00e8s VPN est activ\u00e9 et peut \u00eatre acc\u00e9d\u00e9 par l'IP",
+"message.enabled.vpn.ip.sec": "Votre cl\u00e9 partag\u00e9e IPSec est",
+"message.enabling.network.offering": "Activation de l'offre r\u00e9seau",
+"message.enabling.security.group.provider": "Activation du fournisseur de groupe de s\u00e9curit\u00e9",
+"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\u00e9par\u00e9s par des virgules si plusieurs",
+"message.enter.token": "Entrer le jeton unique re\u00e7u dans le message d'invitation.",
+"message.generate.keys": "Confirmer la g\u00e9n\u00e9ration de nouvelles clefs pour cet utilisateur.",
+"message.gslb.delete.confirm": "Confirmer la suppression de ce GSLB",
+"message.gslb.lb.remove.confirm": "Enlever la r\u00e9partition de charge du GSLB ?",
+"message.guest.traffic.in.advanced.zone": "Le trafic r\u00e9seau d'invit\u00e9 est la communication entre les machines virtuelles utilisateur. Sp\u00e9cifier une plage d'identifiant VLAN pour le trafic des invit\u00e9s pour chaque r\u00e9seau physique.",
+"message.guest.traffic.in.basic.zone": "Le trafic r\u00e9seau d'invit\u00e9 est la communication entre les machines virtuelles utilisateur. Sp\u00e9cifier une plage d'adresses IP que CloudStack peut assigner aux machines virtuelles Invit\u00e9. S'assurer que cette plage n'empi\u00e8te pas sur la plage r\u00e9serv\u00e9e aux adresses IP Syst\u00e8me.",
+"message.host.dedicated": "H\u00f4te d\u00e9di\u00e9e",
+"message.host.dedication.released": "Lib\u00e9ration de l'h\u00f4te d\u00e9di\u00e9",
+"message.installwizard.click.retry": "Appuyer sur le bouton pour essayer \u00e0 nouveau le d\u00e9marrage.",
+"message.installwizard.copy.whatisacluster": "Un cluster permet de grouper les h\u00f4tes. Les h\u00f4tes d'un cluster ont un mat\u00e9riel identique, ex\u00e9cutent le m\u00eame hyperviseur, sont sur le m\u00eame sous-r\u00e9seau, et acc\u00e8dent au m\u00eame stockage partag\u00e9. Les instances de machines virtuelles (VM) peuvent \u00eatre migr\u00e9es \u00e0 chaud d'un h\u00f4te \u00e0 un autre au sein du m\u00eame groupe, sans interrompre les services utilisateur. Un cluster est la trois \u00e8me plus large unit\u00e9 organisationnelle dans un d\u00e9ploiement 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\u00e9ploiement en nuage, mais pour une installation basique, il n'y a qu'un seul cluster.",
+"message.installwizard.copy.whatisahost": "Un h\u00f4te est une machine. Les h\u00f4tes fournissent les ressources informatiques qui ex\u00e9cutent les machines virtuelles invit\u00e9es. Chaque h\u00f4te a un logiciel hyperviseur install\u00e9 pour g\u00e9rer les machines virtuelles invit\u00e9es (sauf pour les h\u00f4tes de type 'bare-metal', qui sont un cas particulier d\u00e9taill\u00e9 dans le Guide d'installation avanc\u00e9e). Par exemple, un serveur Linux avec KVM, un serveur Citrix XenServer, et un serveur ESXi sont des h\u00f4tes. Dans une installation basique, un seul h\u00f4te ex\u00e9cutant XenServer ou KVM est utilis\u00e9.<br/><br/>L'h\u00f4te est la plus petite unit\u00e9 organisation au sein d'un d\u00e9ploiement CloudStack&#8482;. Les h\u00f4tes 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\u00e9sente souvent un seul rack. Les h\u00f4tes dans le m\u00eame pod sont dans le m\u00eame sous-r\u00e9seau.<br/>Un pod est la deuxi\u00e8me plus grande unit\u00e9 organisationnelle au sein d'un d\u00e9ploiement 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\u00e9 organisationnelle au sein d'un d\u00e9ploiement CloudStack&#8482;. Une zone correspond typiquement \u00e0 un centre de donn\u00e9es, mais il est permis d'avoir plusieurs zones dans un centre de donn\u00e9es. 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\u00e9seau, et les zones peuvent \u00eatre tr\u00e8s \u00e9loign\u00e9es g\u00e9ographiquement (m\u00eame 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\u00e9es et hybrides en tant que services (IaaS) dans les nuages. CloudStack&#8482; g\u00e8re le r\u00e9seau, le stockage et les noeuds de calcul qui composent une infrastructure dans les nuages. Utilisez CloudStack&#8482; pour d\u00e9ployer, g\u00e9rer et configurer les environnements d'informatiques dans les nuages.<br/><br/>S'\u00e9tendant au-del\u00e0 des machines virtuelles individuelles fonctionnant sur du mat\u00e9riel standard, CloudStack&#8482; offre une solution d'informatique en nuage cl\u00e9 en main pour fournir des centres de donn\u00e9es virtuels comme service - fournissant tous les composants essentiels pour construire, d\u00e9ployer et g\u00e9rer des applications 'cloud' multi-niveaux et multi-locataire. Les versions libre et Premium sont disponibles, la version Libre offrant des caract\u00e9ristiques presque identiques.",
+"message.installwizard.copy.whatisprimarystorage": "Une infrastructure CloudStack&#8482; utilise deux types de stockage : stockage primaire et stockage secondaire. Les deux peuvent \u00eatre des serveurs iSCSI ou NFS, ou sur disque local.<br/><br/><strong>Le stockage principal</strong> est associ\u00e9 \u00e0 un cluster, et stocke les volumes disques de chaque machine virtuelle pour toutes les VMs s'ex\u00e9cutant sur les h\u00f4tes dans le cluster. Le serveur de stockage primaire est typiquement proche des h\u00f4tes.",
+"message.installwizard.copy.whatissecondarystorage": "Le stockage secondaire est associ\u00e9 \u00e0 une zone, et il stocke les \u00e9l\u00e9ments suivants:<ul><li>Mod\u00e8les - images de syst\u00e8mes d'exploitation qui peuvent \u00eatre utilis\u00e9es pour d\u00e9marrer les machines virtuelles et peuvent inclure des informations de configuration suppl\u00e9mentaires, telles que les applications pr\u00e9-install\u00e9es</li><li>Images ISO - images de syst\u00e8me d'exploitation ou d'installation d'OS qui peuvent \u00eatre amor\u00e7able ou non-amor\u00e7able</li><li>Images de volume disque - capture des donn\u00e9es de machines virtuelles qui peuvent \u00eatre utilis\u00e9es pour la r\u00e9cup\u00e9ration des donn\u00e9es ou cr\u00e9er des mod\u00e8les</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\u00e9 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\u00e9 pr\u00e9c\u00e9demment (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\u00e9seau priv\u00e9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00eame sous-r\u00e9seau que les serveurs h\u00f4tes.",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "Passerelle pour les serveurs dans ce pod",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "Le masque r\u00e9seau que les instances utiliseront sur le r\u00e9seau",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "Ceci est la plage d'adresses IP dans le r\u00e9seau priv\u00e9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00eame sous-r\u00e9seau que les serveurs h\u00f4tes.",
+"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\u00f4te o\u00f9 ce stockage primaire est mont\u00e9. 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\u00e9, situ\u00e9 sur le serveur sp\u00e9cifi\u00e9 pr\u00e9c\u00e9demment",
+"message.installwizard.tooltip.addzone.dns1": "Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici.",
+"message.installwizard.tooltip.addzone.dns2": "Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici.",
+"message.installwizard.tooltip.addzone.internaldns1": "Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici.",
+"message.installwizard.tooltip.addzone.internaldns2": "Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici.",
+"message.installwizard.tooltip.addzone.name": "Nom pour la zone",
+"message.installwizard.tooltip.configureguesttraffic.description": "Description pour ce r\u00e9seau",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "La plage d'adresses IP qui sera disponible en allocation pour les machines invit\u00e9es dans cette zone. Si une carte r\u00e9seau est utilis\u00e9e, ces adresses IP peuvent \u00eatre dans le m\u00eame CIDR que le CIDR du pod.",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "La passerelle que les instances invit\u00e9es doivent utiliser",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "Le masque r\u00e9seau que les instances devrait utiliser sur le r\u00e9seau",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "La plage d'adresses IP qui sera disponible en allocation pour les machines invit\u00e9es dans cette zone. Si une carte r\u00e9seau est utilis\u00e9e, ces adresses IP peuvent \u00eatre dans le m\u00eame CIDR que le CIDR du pod.",
+"message.installwizard.tooltip.configureguesttraffic.name": "Nom pour ce r\u00e9seau",
+"message.instance.scaled.up.confirm": "\u00cates-vous s\u00fbr de vouloir agrandir votre instance ?",
+"message.instancewizard.notemplates": "Vous n'avez pas de image disponible ; Ajouter un mod\u00e8le compatible puis relancer l'assistant de cr\u00e9ation d'instance.",
+"message.ip.address.changed": "Vos adresses IP ont peut \u00eatre chang\u00e9es ; Voulez vous rafra\u00eechir la liste ? Dans ce cas, le panneau de d\u00e9tail se fermera.",
+"message.iso.desc": "Image disque contenant des donn\u00e9es ou un support amor\u00e7able pour OS",
+"message.join.project": "Vous avez rejoint un projet. S\u00e9lectionnez la vue Projet pour le voir.",
+"message.launch.vm.on.private.network": "Souhaitez vous d\u00e9marrer cette instance sur votre propre r\u00e9seau priv\u00e9 ?",
+"message.launch.zone": "La zone est pr\u00eate \u00e0 d\u00e9marrer ; passer \u00e0 l'\u00e9tape suivante.",
+"message.ldap.group.import": "Tous les utilisateurs du groupe indiqu\u00e9 seront import\u00e9s",
+"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\u00e9rer leurs ressources. Les ressources existantes resteront toutefois accessibles.",
+"message.migrate.instance.confirm": "Confirmez l'h\u00f4te vers lequel vous souhaitez migrer cette instance",
+"message.migrate.instance.to.host": "Confirmer la migration de l'instance vers un autre h\u00f4te",
+"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\u00e8me vers :",
+"message.migrate.volume": "Confirmer la migration du volume vers un autre stockage primaire.",
+"message.network.addvm.desc": "Veuillez sp\u00e9cifier le r\u00e9seau que vous souhaitez ajouter \u00e0 cette VM. Une nouvelle interface NIC sera ajout\u00e9e pour ce r\u00e9seau.",
+"message.network.addvmnic": "Confirmer l'ajout d'une nouvelle NIC VM pour ce r\u00e9seau.",
+"message.network.remote.access.vpn.configuration": "La configuration VPN Acc\u00e9s Distant a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9e mais elle n'a pas pu \u00eatre appliqu\u00e9e. Veuillez v\u00e9rifier la connectivit\u00e9 des \u00e9l\u00e9ments r\u00e9seau, et r\u00e9-essayez.",
+"message.network.removenic": "Veuillez confirmer que vous souhaitez supprimer cette carte NIC, ce qui supprimera \u00e9galement le r\u00e9seau associ\u00e9 sur la machine virtuelle.",
+"message.network.updateip": "Confirmer que vous souhaitez changer l'adresse IP pour cette NIC sur la VM.",
+"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\u00e9. Continuer vers la prochaine \u00e9tape.",
+"message.no.host.available": "Aucun h\u00f4te n'est disponible pour la migration",
+"message.no.network.support": "S\u00e9lectionnez l'hyperviseur. vSphere, n'a pas de fonctionnalit\u00e9s suppl\u00e9mentaires pour le r\u00e9seau. Continuez \u00e0 l'\u00e9tape 5.",
+"message.no.network.support.configuration.not.true": "Il n'y a pas de zone avec la fonction groupe de s\u00e9curit\u00e9 active. D\u00e8s lors, pas de fonction r\u00e9seau suppl\u00e9mentaires disponibles. Continuer \u00e0 l'\u00e9tape 5.",
+"message.no.projects": "Vous n'avez pas de projet.<br/>Vous pouvez en cr\u00e9er 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\u00f4tes</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\u00f4te en avertissement est en mode maintenance",
+"message.password.has.been.reset.to": "Le mot de passe a \u00e9t\u00e9 r\u00e9-initialiser en",
+"message.password.of.the.vm.has.been.reset.to": "Le mot de passe de la VM a \u00e9t\u00e9 r\u00e9-initialis\u00e9 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\u00e9lectionner invitation dans la liste d\u00e9roulante.",
+"message.please.add.at.lease.one.traffic.range": "Ajouter au moins une plage r\u00e9seau",
+"message.please.confirm.remove.ssh.key.pair": "Confirmer la suppression de cette bi-cl\u00e9 SSH",
+"message.please.proceed": "Continuer vers la prochaine \u00e9tape.",
+"message.please.select.a.configuration.for.your.zone": "S\u00e9lectionner une configuration pour la zone.",
+"message.please.select.a.different.public.and.management.network.before.removing": "S\u00e9lectionner un r\u00e9seau public et d'administration diff\u00e9rent avant de supprimer",
+"message.please.select.networks": "S\u00e9lectionner les r\u00e9seaux pour votre machine virtuelle.",
+"message.please.select.ssh.key.pair.use.with.this.vm": "Veuillez s\u00e9lectionner la bi-cl\u00e9 SSH que vous souhaitez utiliser avec cette VM :",
+"message.please.wait.while.zone.is.being.created": "Patienter pendant la cr\u00e9ation de la zone, cela peut prendre du temps...",
+"message.pod.dedication.released": "Lib\u00e9ration du pod d\u00e9di\u00e9",
+"message.portable.ip.delete.confirm": "Supprimer la plage IP portable ?",
+"message.project.invite.sent": "Invitation envoy\u00e9e ; les utilisateurs seront ajout\u00e9s apr\u00e8s acceptation de l'invitation",
+"message.public.traffic.in.advanced.zone": "Le trafic public est g\u00e9n\u00e9r\u00e9 lorsque les machines virtuelles dans le nuage acc\u00e8dent \u00e0 Internet. Des adresses IP publiquement accessibles doivent \u00eatre pr\u00e9vues \u00e0 cet effet. Les utilisateurs peuvent utiliser l'interface d'administration de CloudStack pour acqu\u00e9rir ces adresses IP qui impl\u00e9menteront une translation d'adresse NAT entre le r\u00e9seau d'invit\u00e9 et le r\u00e9seau 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\u00e9n\u00e9r\u00e9 lorsque les machines virtuelles dans le nuage acc\u00e8dent \u00e0 Internet ou fournissent des services \u00e0 des utilisateurs sur Internet. Des adresses IP publiquement accessibles doivent \u00eatre pr\u00e9vus \u00e0 cet effet. Quand une instance est cr\u00e9\u00e9e, une adresse IP publique depuis un ensemble d'adresses IP publiques sera allou\u00e9e \u00e0 l'instance, en plus de l'adresse IP de l'invit\u00e9. 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\u00e9. Les utilisateurs peuvent \u00e9galement utiliser l'interface d'administration CloudStack pour acqu\u00e9rir des adresses IP suppl\u00e9mentaires pour ajouter une translation d'adresse statique NAT entre leurs instances et le r\u00e9seau d'adresses IP publiques.",
+"message.question.are.you.sure.you.want.to.add": "\u00cates-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\u00e9rer un dimensionnement dynamique.",
+"message.recover.vm": "Confirmer la restauration de cette VM.",
+"message.redirecting.region": "Redirection vers r\u00e9gion...",
+"message.reinstall.vm": "NOTE: Proc\u00e9dez avec prudence. Cela entra\u00eenera la r\u00e9-installation de la VM \u00e0 partir du mod\u00e8le; les donn\u00e9es sur le disque ROOT seront perdues. Les volumes de donn\u00e9es suppl\u00e9mentaires, le cas \u00e9ch\u00e9ant, ne seront pas touch\u00e9s.",
+"message.remove.ldap": "Voulez-vous supprimer la configuration LDAP ?",
+"message.remove.region": "Voulez-vous supprimer cette r\u00e9gion depuis ce serveur d'administration ?",
+"message.remove.vpc": "Confirmer la suppression du VPC",
+"message.remove.vpn.access": "Supprimer l'acc\u00e8s VPN de cet utilisateur ?",
+"message.removed.ssh.key.pair": "Bi-cl\u00e9 SSH supprim\u00e9e",
+"message.reset.password.warning.notpasswordenabled": "Le mod\u00e8le de cette instance a \u00e9t\u00e9 cr\u00e9\u00e9 sans la gestion de mot de passe",
+"message.reset.password.warning.notstopped": "Votre instance doit \u00eatre arr\u00eat\u00e9e avant de changer son mot de passe",
+"message.reset.vpn.connection": "Confirmer le r\u00e9-initialisation de la connexion VPN",
+"message.restart.mgmt.server": "Red\u00e9marrez votre(vos) serveur(s) de management pour appliquer les nouveaux param\u00e8tres.",
+"message.restart.mgmt.usage.server": "Red\u00e9marrer le ou les serveur(s) de gestion et le ou les serveur(s) de consommation pour que les nouveaux param\u00e8tres soient pris en compte.",
+"message.restart.network": "Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer le red\u00e9marrage de ce routeur.",
+"message.restart.vpc": "Confirmer le red\u00e9marrage du VPC",
+"message.restart.vpc.remark": "Veuillez confirmer que vous voulez red\u00e9marrer le VPC <p><small><i>Note : transformer un VPC non-redondant en VPC redondant va forcer un nettoyage du routeur. Le r\u00e9seau associ\u00e9 ne sera pas disponible durant quelques minutes</i>.</small></p>",
+"message.restorevm": "Voulez-vous restaurer la VM ?",
+"message.role.ordering.fail": "La r\u00e9organisation des r\u00e8gles d'autorisations a \u00e9t\u00e9 abandonn\u00e9e car la liste a chang\u00e9 pendant que vous apportez des modifications. Veuillez r\u00e9essayer.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(Utilisez <strong>Ctrl-clic</strong> pour s\u00e9lectionner les groupes de s\u00e9curit\u00e9 vis\u00e9s)",
+"message.select.a.zone": "Une zone correspond typiquement \u00e0 un seul centre de donn\u00e9es. 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\u00e9lectionner les groupes d'affinit\u00e9 qui appartiendront \u00e0 cette machine virtuelle :",
+"message.select.instance": "S\u00e9lectionner une instance.",
+"message.select.iso": "S\u00e9lectionner un ISO pour votre nouvelle instance virtuelle.",
+"message.select.item": "Merci de s\u00e9lectionner un \u00e9l\u00e9ment.",
+"message.select.security.groups": "Merci de s\u00e9lectionner un(des) groupe(s) de s\u00e9curit\u00e9 pour la nouvelle VM",
+"message.select.template": "S\u00e9lectionner un mod\u00e8le pour votre nouvelle instance virtuelle.",
+"message.select.tier": "Veuillez selectionner un tiers",
+"message.set.default.nic": "Confirmer la mise par d\u00e9faut de cette NIC pour cette VM.",
+"message.set.default.nic.manual": "Veuillez mettre \u00e0 jour manuellement la NIC par d\u00e9faut sur la VM maintenant.",
+"message.setup.physical.network.during.zone.creation": "Lorsque vous ajoutez une zone avanc\u00e9e, vous avez besoin de d\u00e9finir un ou plusieurs r\u00e9seaux physiques. Chaque r\u00e9seau correspond \u00e0 une carte r\u00e9seau sur l'hyperviseur. Chaque r\u00e9seau physique peut supporter un ou plusieurs types de trafic, avec certaines restrictions sur la fa\u00e7on dont ils peuvent \u00eatre combin\u00e9s.<br/><br/><strong>Glisser et d\u00e9poser un ou plusieurs types de trafic</strong> sur chaque r\u00e9seau physique.",
+"message.setup.physical.network.during.zone.creation.basic": "Quand vous ajoutez une zone basique, vous pouvez param\u00e9trer un seul r\u00e9seau physique, correspondant \u00e0 une carte r\u00e9seau sur l'hyperviseur. Ce r\u00e9seau comportera plusieurs types de trafic.<br/><br/>Vous pouvez \u00e9galement <strong>glisser et d\u00e9poser</strong> d'autres types de trafic sur le r\u00e9seau physique.",
+"message.setup.successful": "Installation du Cloud r\u00e9ussie !",
+"message.specifiy.tag.key.value": "Sp\u00e9cifier une cl\u00e9 et valeur de tag",
+"message.specify.url": "Renseigner l'URL",
+"message.step.1.desc": "S\u00e9lectionnez un mod\u00e8le pour votre nouvelle instance virtuelle. Vous pouvez \u00e9galement choisir un mod\u00e8le vierge sur lequel une image ISO pourra \u00eatre install\u00e9e.",
+"message.step.2.continue": "S\u00e9lectionnez une offre de service pour continuer",
+"message.step.3.continue": "S\u00e9lectionnez un offre de service de disque pour continuer",
+"message.step.4.continue": "S\u00e9lectionnez au moins un r\u00e9seau pour continuer",
+"message.step.4.desc": "S\u00e9lectionnez le r\u00e9seau principal auquel votre instance va \u00eatre connect\u00e9.",
+"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\u00f4tes et les machines virtuelles Syst\u00e8mes CloudStack. Veuillez configurer le trafic de stockage ici.",
+"message.suspend.project": "Voulez-vous suspendre ce projet ?",
+"message.systems.vms.ready": "VMs Syst\u00e8mes pr\u00eats.",
+"message.template.copying": "Le mod\u00e8le est copi\u00e9.",
+"message.template.desc": "Image OS pouvant \u00eatre utilis\u00e9e pour d\u00e9marrer une VM",
+"message.template.iso": "S\u00e9lectionnez un mod\u00e8le ou une image ISO pour continuer",
+"message.tier.required": "Le tiers est obligatoire",
+"message.tooltip.dns.1": "Nom d'un serveur DNS utilis\u00e9 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\u00e9 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\u00e8me dans cette zone. Les adresses IP priv\u00e9es 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\u00e8me dans cette zone. Les adresses IP priv\u00e9es des pods doivent avoir une route vers ce serveur.",
+"message.tooltip.network.domain": "Suffixe DNS qui cr\u00e9era un nom de domaine personnalis\u00e9 pour les r\u00e9seau accessible par les VM invit\u00e9es.",
+"message.tooltip.pod.name": "Nom pour ce pod.",
+"message.tooltip.reserved.system.gateway": "La passerelle pour les h\u00f4tes du pod.",
+"message.tooltip.reserved.system.netmask": "Le pr\u00e9fixe r\u00e9seau utilis\u00e9 par le sous-r\u00e9seau du pod. Au format CIDR.",
+"message.tooltip.zone.name": "Nom pour cette zone.",
+"message.update.os.preference": "Choisissez votre OS pr\u00e9f\u00e9r\u00e9 pour cet h\u00f4te. Toutes les instances avec des pr\u00e9f\u00e9rences similaires seront d'abord allou\u00e9es \u00e0 cet h\u00f4te avant d'en choisir un autre.",
+"message.update.resource.count": "Confirmer la mise \u00e0 jour des ressources pour ce compte.",
+"message.update.ssl": "Soumettez un nouveau certificat SSL compatible X.509 qui sera mis \u00e0 jour sur chaque VM console proxy et VM sockage secondaire :",
+"message.update.ssl.failed": "\u00c9chec dans la mise \u00e0 jour du certificat SSL",
+"message.update.ssl.succeeded": "Mise \u00e0 jour r\u00e9ussie des certificats SSL",
+"message.validate.accept": "Veuillez entrer une valeur avec une extension valide.",
+"message.validate.creditcard": "Veuillez entrer un num\u00e9ro de carte de cr\u00e9dit 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\u00eame 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\u00e9passer 63 caract\u00e8res. Seuls les lettres de a \u00e0 z, les chiffres de 0 \u00e0 9 et les tirets sont accept\u00e9s. Le nom doit commencer par une lettre et se terminer par une lettre ou un chiffre.",
+"message.validate.invalid.characters": "Caract\u00e8res invalides trouv\u00e9s ; veuillez corriger.",
+"message.validate.max": "Veuillez entrer une valeur inf\u00e9rieure ou \u00e9gale \u00e0 {0}.",
+"message.validate.maxlength": "Veuillez entrer uniquement {0} caract\u00e8res.",
+"message.validate.minlength": "Veuillez entrer au moins {0} caract\u00e8res.",
+"message.validate.number": "Veuillez entrer un nombre valide.",
+"message.validate.range": "Veuillez entrer une valeur de {0} \u00e0 {1}.",
+"message.validate.range.length": "Veuillez entrer une valeur de {0} \u00e0 {1} caract\u00e8res.",
+"message.validate.url": "Veuillez entrer une URL valide.",
+"message.virtual.network.desc": "Un r\u00e9seau virtuel d\u00e9di\u00e9 pour votre compte. Ce domaine de multi-diffusion est contenu dans un VLAN et l'ensemble des r\u00e9seaux d'acc\u00e8s publique sont rout\u00e9s par un routeur virtuel.",
+"message.vm.create.template.confirm": "Cr\u00e9er un mod\u00e8le va red\u00e9marrer la VM automatiquement",
+"message.vm.review.launch": "Merci de v\u00e9rifier les informations suivantes et de confirmer que votre instance virtuelle est correcte avant de la d\u00e9marrer.",
+"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\u00e9er un mod\u00e8le pour ce disque ? La cr\u00e9ation peut prendre plusieurs minutes, voir plus, selon la taille du volume.",
+"message.waiting.for.builtin.templates.to.load": "Attendre le chargement des mod\u00e8les pr\u00e9-construit...",
+"message.xstools61plus.update.failed": "\u00c9chec de mise \u00e0 jour champ XenServer Tools Version 6.1+. Erreur :",
+"message.you.must.have.at.least.one.physical.network": "Vous devez avoir au moins un r\u00e9seau physique",
+"message.your.cloudstack.is.ready": "Votre CloudStack est pr\u00eat !",
+"message.zone.creation.complete": "Cr\u00e9ation de la zone termin\u00e9e",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Cr\u00e9ation de la zone termin\u00e9e. Voulez-vous l'activer ?",
+"message.zone.no.network.selection": "La zone s\u00e9lectionn\u00e9e ne propose pas le r\u00e9seau choisi",
+"message.zone.step.1.desc": "S\u00e9lectionnez un mod\u00e8le de r\u00e9seau 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\u00e9rations suivantes, selon l'endroit o\u00f9 vous souhaitez lancer vos machines virtuelles Syst\u00e8mes :<br/><br/>1. Si les machines virtuelles Syst\u00e8mes doivent \u00eatre lanc\u00e9es depuis le stockage primaire, ce dernier doit \u00eatre ajout\u00e9 \u00e0 la zone apr\u00e8s la cr\u00e9ation. Vous devez \u00e9galement d\u00e9marrer la zone dans un \u00e9tat d\u00e9sactiv\u00e9.<br/><br/>2. Si les machines virtuelles Syst\u00e8mes doivent \u00eatre lanc\u00e9es depuis le stockage local, le param\u00e8tre system.vm.use.local.storage doit \u00eatre d\u00e9fini \u00e0 'true' avant d'activer la zone.<br/><br/><br/>Voulez-vous continuer ?",
+"messgae.validate.min": "Veuillez entrer une valeur sup\u00e9rieure ou \u00e9gale \u00e0 {0}.",
+"network.rate": "D\u00e9bit R\u00e9seau",
+"side.by.side": "C\u00f4te \u00e0 c\u00f4te",
+"state.accepted": "Accept\u00e9",
+"state.active": "Actif",
+"state.allocating": "Allocation en cours",
+"state.backedup": "Sauvegard\u00e9",
+"state.backingup": "Sauvegarde en cours",
+"state.completed": "Termin\u00e9",
+"state.creating": "Cr\u00e9ation en cours",
+"state.declined": "Refus\u00e9",
+"state.destroyed": "Supprim\u00e9e",
+"state.detached": "D\u00e9tach\u00e9",
+"state.disabled": "D\u00e9sactiv\u00e9",
+"state.enabled": "Actifs",
+"state.error": "Erreur",
+"state.expunging": "Purge en cours",
+"state.migrating": "Migration en cours",
+"state.pending": "En attente",
+"state.running": "D\u00e9marr\u00e9e",
+"state.starting": "D\u00e9marrage en cours",
+"state.stopped": "Arr\u00eat\u00e9e",
+"state.stopping": "Arr\u00eat en cours",
+"state.suspended": "Suspendu",
+"title.upload.volume": "T\u00e9l\u00e9verser Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/hi.json b/ui/public/locales/hi.json
new file mode 100644
index 0000000..129c996
--- /dev/null
+++ b/ui/public/locales/hi.json
@@ -0,0 +1,528 @@
+{
+"label.about": "अबाउट",
+"label.access": "एक्सेस",
+"label.accesskey": "एक्सेस की",
+"label.account": "खाता",
+"label.accounts": "लेखा",
+"label.accounttype": "खाता प्रकार",
+"label.aclid": "ACL",
+"label.aclname": "ACL नाम",
+"label.acltotal": "नेटवर्क ACL कुल",
+"label.actions": "क्रियाएँ",
+"label.add": "जोड़ें",
+"label.addanothernetwork": "कोई अन्य नेटवर्क जोड़ें",
+"label.adding": "जोड़ना",
+"label.addnewnetworks": "नए नेटवर्क जोड़ें",
+"label.address": "पता",
+"label.admin": "डोमेन व्यवस्थापक",
+"label.agentstate": "Agent State",
+"label.agree": "सहमत",
+"label.alert": "अलर्ट",
+"label.alerts": "अलर्ट",
+"label.all": "ऑल",
+"label.allocated": "आवंटित",
+"label.allocatediops": "IOPS आवंटित",
+"label.allocationstate": "आवंटन राज्य",
+"label.allow": "अनुमति दें",
+"label.apikey": "API कुंजी",
+"label.apply": "लागू करें",
+"label.assign": "असाइन करें",
+"label.associatednetwork": "एसोसिएटेड नेटवर्क",
+"label.associatednetworkid": "एसोसिएटेड नेटवर्क आईडी",
+"label.associatednetworkname": "नेटवर्क नाम",
+"label.backupofferingid": "बैकअप ऑफ़रिंग",
+"label.basicsetup": "मूल सेटअप",
+"label.broadcastdomainrange": "ब्रॉडकास्ट डोमेन रेंज",
+"label.broadcastdomaintype": "ब्रॉडकास्ट डोमेन टाइप",
+"label.bypassvlanoverlapcheck": "बाईपास वीएलएएन आईडी / रेंज ओवरलैप",
+"label.cachemode": "लिखें-कैश प्रकार",
+"label.cancel": "रद्द करें",
+"label.capacitybytes": "क्षमता बाइट्स",
+"label.capacityiops": "IOPS कुल",
+"label.checksum": "चेकसम",
+"label.cidr": "गेस्ट नेटवर्क के लिए सुपर CIDR",
+"label.cidrlist": "CIDR सूची",
+"label.cleanup": "क्लीन अप",
+"label.close": "बंद करें",
+"label.cluster": "क्लस्टर",
+"label.clusterid": "क्लस्टर",
+"label.clustername": "क्लस्टर",
+"label.clusters": "label.क्लस्टर्स",
+"label.clustertype": "क्लस्टर प्रकार",
+"label.clvm": "CLVM",
+"label.compute": "कंप्यूट",
+"label.configuration": "कॉन्फ़िगरेशन",
+"label.configure": "कॉन्फ़िगर करें",
+"label.confirmpassword": "पासवर्ड की पुष्टि करें",
+"label.congratulations": "बधाई!",
+"label.connectiontimeout": "कनेक्शन टाइमआउट",
+"label.conservemode": "संरक्षण मोड",
+"label.continue": "जारी रखें",
+"label.cpu": "CPU",
+"label.cpuallocated": "VM के लिए आवंटित CPU",
+"label.cpuallocatedghz": "आवंटित",
+"label.cpulimit": "CPU सीमाएँ",
+"label.cpunumber": "CPU कोर",
+"label.cpusockets": "CPU सॉकेट्स की संख्या",
+"label.cputotal": "कुल CPU",
+"label.cputotalghz": "कुल",
+"label.cpuused": "CPU उपयोग किया गया",
+"label.cpuusedghz": "प्रयुक्त CPU",
+"label.created": "बनाया गया",
+"label.createnfscache": "NFS सेकेंडरी स्टेजिंग स्टोर बनाएँ",
+"label.crosszones": "क्रॉस ज़ोन",
+"label.current": "Current",
+"label.currentpassword": "वर्तमान पासवर्ड",
+"label.customconstrained": "कस्टम संकुचित",
+"label.customdisksize": "कस्टम डिस्क आकार",
+"label.customunconstrained": "कस्टम असंबंधित",
+"label.daily": "डेली",
+"label.dashboard": "डैशबोर्ड",
+"label.date": "दिनांक",
+"label.dedicate": "समर्पित करें",
+"label.dedicated": "समर्पित",
+"label.defaultnetwork": "डिफ़ॉल्ट नेटवर्क",
+"label.delete": "हटाएँ",
+"label.deleteconfirm": "कृपया पुष्टि करें कि आप इस {नाम} को हटाना चाहेंगे",
+"label.deleteprofile": "प्रोफ़ाइल हटाएं",
+"label.deploymentplanner": "परिनियोजन योजनाकार",
+"label.description": "विवरण",
+"label.destcidr": "गंतव्य CIDR",
+"label.destination": "गंतव्य",
+"label.destinationphysicalnetworkid": "गंतव्य भौतिक नेटवर्क ID",
+"label.destinationzoneid": "गंतव्य क्षेत्र",
+"label.destroy": "नष्ट",
+"label.destroyvmgraceperiod": "वीएम ग्रेस अवधि को नष्ट करें",
+"label.details": "विवरण",
+"label.deviceid": "डिवाइस आईडी",
+"label.devices": "डिवाइसेस",
+"label.dhcp": "DHCP",
+"label.directdownload": "डायरेक्ट डाउनलोड",
+"label.disconnected": "लास्ट डिस्कनेक्टेड",
+"label.disk": "डिस्क",
+"label.diskiopsmax": "मैक्स IOPS",
+"label.diskiopsmin": "न्यूनतम IOPS",
+"label.diskiopstotal": "डिस्क IOPS",
+"label.diskoffering": "डिस्क ऑफ़र",
+"label.diskofferingdisplaytext": "डिस्क की पेशकश",
+"label.diskofferingid": "डिस्क की पेशकश",
+"label.disksizeallocated": "डिस्क आवंटित",
+"label.disksizeallocatedgb": "आवंटित",
+"label.disksizetotal": "डिस्क कुल",
+"label.disksizetotalgb": "कुल",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "प्रयुक्त",
+"label.displayname": "प्रदर्शन नाम",
+"label.displaytext": "विवरण",
+"label.distributedvpcrouter": "वितरित VPC रूटर",
+"label.dns": "DNS",
+"label.domain": "डोमेन",
+"label.domains": "डोमेन",
+"label.domainid": "डोमेन आईडी",
+"label.domainname": "डोमेन",
+"label.done": "संपन्न",
+"label.dpd": "डेड पीयर डिटेक्शन",
+"label.driver": "ड्राइवर",
+"label.edit": "संपादित करें",
+"label.egressdefaultpolicy": "डिफॉल्ट ईगरिंग पॉलिसी",
+"label.email": "ईमेल",
+"label.endip": "एंड आईपी",
+"label.endpoint": "समापन बिंदु",
+"label.ports": "एंड पोर्ट",
+"label.error": "त्रुटि",
+"label.esppolicy": "ESP नीति",
+"label.event": "इवेंट",
+"label.events": "इवेंट्स",
+"label.example": "उदाहरण",
+"label.existingnetworks": "मौजूदा नेटवर्क",
+"label.expunge": "Expunge",
+"label.externalid": "बाहरी आईडी",
+"label.externalloadbalanceripaddress": "एक्सटर्नल लोड बैलेंसर आईपी एड्रेस",
+"label.extra": "अतिरिक्त तर्क",
+"label.featured": "फीचर्ड",
+"label.filterby": "फ़िल्टर द्वारा",
+"label.firstname": "पहला नाम",
+"label.fixed": "फिक्स्ड ऑफ़र",
+"label.forceencap": "ESP पैकेट्स का बल UDP इनकैप्सुलेशन",
+"label.forgedtransmits": "जाली प्रसारण",
+"label.format": "प्रारूप",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "टाइप",
+"label.fwdevicestate": "स्थिति",
+"label.gateway": "गेटवे",
+"label.glustervolume": "वॉल्यूम",
+"label.gpu": "GPU",
+"label.group": "समूह",
+"label.gslb": "GSLB",
+"label.gslbdomainname": "GSLB डोमेन नाम",
+"label.gslbprovider": "GSLB सेवा",
+"label.gslbproviderpStreetip": "GSLB सेवा निजी आईपी",
+"label.gslbproviderpublicip": "GSLB सेवा सार्वजनिक IP",
+"label.gslbservicetype": "सेवा प्रकार",
+"label.guest": "अतिथि",
+"label.guestcidraddress": "अतिथि CIDR",
+"label.guestendip": "अतिथि अंत आईपी",
+"label.guestgateway": "गेस्ट गेटवे",
+"label.guestipaddress": "अतिथि IP पता",
+"label.guestiptype": "अतिथि प्रकार",
+"label.guestnetmask": "अतिथि नेटमास्क",
+"label.guestnetwork": "अतिथि नेटवर्क",
+"label.guestnetworkid": "नेटवर्क आईडी",
+"label.guestnetworkname": "नेटवर्क नाम",
+"label.guestosid": "OS टाइप",
+"label.gueststartip": "अतिथि प्रारंभ IP",
+"label.haprovider": "हा प्रोवाइडर",
+"label.hastate": "हा स्टेट",
+"label.help": "सहायता",
+"label.hideipaddressusage": "IP पता उपयोग छिपाएँ",
+"label.hostid": "होस्ट",
+"label.hostname": "होस्ट",
+"label.hostnamelabel": "होस्ट नाम",
+"label.hosttags": "होस्ट टैग",
+"label.hourly": "प्रति घंटा",
+"label.hypervisers": "Hypervisers",
+"label.hypervisersnapshotreserve": "हाइपरवाइज़र स्नैपशॉट रिज़र्व",
+"label.hypervisortype": "हाइपरवाइज़र",
+"label.hypervisorversion": "हाइपरवाइज़र संस्करण",
+"label.hypervnetworklabel": "हाइपर ट्रैफ़िक label",
+"label.icmp": "ICMP",
+"label.icmpcode": "ICMP कोड",
+"label.icmptype": "ICMP प्रकार",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikepolicy": "IKE नीति",
+"label.info": "जानकारी",
+"label.infrastructure": "Infrastructure",
+"label.insideportprofile": "इनसाइड पोर्ट प्रोफाइल",
+"label.instance": "Instance",
+"label.instancename": "आंतरिक नाम",
+"label.instances": "Instances",
+"label.internallbvm": "InternalLbVm",
+"label.intervaltype": "अंतराल प्रकार",
+"label.invitations": "निमंत्रण",
+"label.invite": "आमंत्रित करें",
+"label.ip": "IP एड्रेस",
+"label.ipaddress": "IP एड्रेस",
+"label.iplimit": "सार्वजनिक आईपी सीमाएँ",
+"label.ips": "आईपी",
+"label.ipsecpsk": "IPsec प्रेस्डेड-की",
+"label.iptotal": "IP पते का कुल",
+"label.isadvanced": "उन्नत सेटिंग दिखाएं",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "कस्टम डिस्क आकार",
+"label.iscustomizeddiskiops": "कस्टम IOPS",
+"label.iscustomizediops": "कस्टम IOPS",
+"label.isdedicated": "समर्पित",
+"label.isextractable": "Extractable",
+"label.isolatedpvlanid": "माध्यमिक पृथक वीएलएएन आईडी",
+"label.isolatedpvlantype": "माध्यमिक पृथक वीएलएएन प्रकार",
+"label.isolationmethod": "अलगाव विधि",
+"label.isolationmethods": "अलगाव विधि",
+"label.isolationuri": "अलगाव URI",
+"label.isoname": "संलग्न आईएसओ",
+"label.isostate": "ISO State",
+"label.ispasswordenabled": "पासवर्ड सक्षम",
+"label.isself": "स्व",
+"label.issourcenat": "स्रोत NAT",
+"label.issystem": "सिस्टम है",
+"label.keyboardtype": "कीबोर्ड प्रकार",
+"label.kubernetesversionid": "Kubernetes संस्करण",
+"label.kubernetesversionname": "कुबेरनेट्स संस्करण",
+"label.kvmnetworklabel": "KVM ट्रैफ़िक label",
+"label.label": "label",
+"label.lastannotated": "अंतिम एनोटेशन तिथि",
+"label.lastname": "अंतिम नाम",
+"label.launch": "लॉन्च",
+"label.lbdevicededicated": "समर्पित",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "टाइप",
+"label.lbdevicestate": "स्थिति",
+"label.lbtype": "लोड बैलेंसर टाइप",
+"label.limitcpuuse": "CPU कैप",
+"label.linklocalip": "लिंक स्थानीय आईपी पता",
+"label.loadbalancerinstance": "असाइन किया गया VMs",
+"label.loadbalancerrule": "लोड संतुलन नियम",
+"label.localstorageenabled": "उपयोगकर्ता VM के लिए स्थानीय संग्रहण सक्षम करें",
+"label.localstorageenabledforsystemvm": "सिस्टम VM के लिए स्थानीय संग्रहण सक्षम करें",
+"label.lxcnetworklabel": "LXC ट्रैफ़िक label",
+"label.macaddress": "मैक एड्रेस",
+"label.macaddresschanges": "मैक एड्रेस चेंजेस",
+"label.makeredundant": "अनावश्यक बनाएँ",
+"label.manage": "प्रबंधित करें",
+"label.managedstate": "प्रबंधित राज्य",
+"label.managementservers": "प्रबंधन सर्वर की संख्या",
+"label.maxcpunumber": "मैक्स सीपीयू कोर",
+"label.maxerrorretry": "मैक्स एरर रिट्री",
+"label.maxguestslimit": "अधिकतम अतिथि सीमा",
+"label.maximum": "अधिकतम",
+"label.maxinstance": "मैक्स इंस्टेंस",
+"label.maxiops": "अधिकतम IOPS",
+"label.maxnetwork": "अधिकतम नेटवर्क",
+"label.maxproject": "मैक्स। प्रोजेक्ट्स",
+"label.maxpublicip": "मैक्स। सार्वजनिक आईपी",
+"label.memoryallocated": "मेमोरी आवंटित",
+"label.memoryallocatedgb": "आवंटित",
+"label.memorytotal": "मेमोरी आवंटित",
+"label.memorytotalgb": "कुल",
+"label.memoryused": "यूज्ड मेमोरी",
+"label.memoryusedgb": "प्रयुक्त",
+"label.memused": "मेमोरी उपयोग",
+"label.mincpunumber": "मिन सीपीयू कोरेस",
+"label.mininstance": "न्यूनतम उदाहरण",
+"label.miniops": "न्यूनतम IOPS",
+"label.minmaxiops": "न्यूनतम IOPS / अधिकतम IOPS",
+"label.monitor": "मॉनिटर",
+"label.netmask": "नेटमास्क",
+"label.नेटवर्क": "नेटवर्क",
+"label.networkcidr": "नेटवर्क CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "नेटवर्क डोमेन",
+"label.networkdomaintext": "नेटवर्क डोमेन",
+"label.networkkbsread": "नेटवर्क रीड",
+"label.networkkbswrite": "नेटवर्क लिखें",
+"label.networkname": "नेटवर्क नाम",
+"label.networkofferingdisplaytext": "नेटवर्क की पेशकश",
+"label.networkofferingid": "नेटवर्क ऑफ़रिंग",
+"label.networkofferingidtext": "नेटवर्क ऑफ़रिंग आईडी",
+"label.networkofferingname": "नेटवर्क ऑफ़रिंग",
+"label.networktype": "नेटवर्क प्रकार",
+"label.networkwrite": "नेटवर्क लिखें",
+"label.newdiskoffering": "नई पेशकश",
+"label.newinstance": "नया उदाहरण",
+"label.next": "अगला",
+"label.nfs": "एनएफएस",
+"label.nfscachenfsserver": "NFS सर्वर",
+"label.nfscachepath": "पाथ",
+"label.nfscachezoneid": "ज़ोन",
+"label.nfsserver": "NFS सर्वर",
+"label.nicadcapetype": "NIC एडेप्टर प्रकार",
+"label.no": "नहीं",
+"label.nodiskcache": "नो डिस्क कैश",
+"label.noselect": "नो थैंक्स",
+"label.notifications": "सूचनाएं",
+"label.numberofrouterrequiresupgrad": "वर्चुअल राउटर्स की कुल जिन्हें अपग्रेड की आवश्यकता है",
+"label.numretries": "रिट्रीट की संख्या",
+"label.nvpdeviceid": "ID",
+"label.offerha": "ऑफ़र हा",
+"label.offeringtype": "कंप्यूट ऑफ़र प्रकार",
+"label.ok": "ओके",
+"label.oscategoryid": "OS वरीयता",
+"label.ostypeid": "OS टाइप",
+"label.ostypename": "OS टाइप",
+"label.other": "अन्य",
+"label.outofbandmanagement": "आउट-ऑफ-बैंड प्रबंधन",
+"label.overrideguesttraffic": "ओवरराइड गेस्ट-ट्रैफ़िक",
+"label.overridepuburtraffic": "ओवरराइड पब्लिक-ट्रैफ़िक",
+"label.ovmnetworklabel": "OVM ट्रैफ़िक label",
+"label.ovs": "OVS",
+"label.parentname": "जनक",
+"label.passwordenabled": "पासवर्ड सक्षम",
+"label.path": "पथ",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "परफेक्ट फॉरवर्ड सेक्रेसी",
+"label.performfreshchecks": "ताज़ा जांचें करें",
+"label.permission": "अनुमति",
+"label.physicalnetworkid": "भौतिक नेटवर्क",
+"label.physicalsize": "भौतिक आकार",
+"label.podname": "पोड नाम",
+"label.pods": "पॉड्स",
+"label.port": "पोर्ट",
+"label.portableipaddress": "पोर्टेबल आईपी",
+"label.powerstate": "पावर स्टेट",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.primarystoragetotal": "प्राथमिक संग्रहण",
+"label.privatenetwork": "निजी नेटवर्क",
+"label.profiledn": "एसोसिएटेड प्रोफाइल",
+"label.profilename": "प्रोफ़ाइल",
+"label.project": "प्रोजेक्ट",
+"label.projectid": "प्रोजेक्ट आईडी",
+"label.projects": "प्रोजेक्ट्स",
+"label.promiscuousmode": "प्रमुख विधा",
+"label.providername": "प्रदाता",
+"label.provisioning": "प्रावधान",
+"label.provisioningtype": "प्रावधान प्रकार",
+"label.publicinterface": "पब्लिक इंटरफ़ेस",
+"label.publicip": "IP एड्रेस",
+"label.publickey": "सार्वजनिक कुंजी",
+"label.publicnetwork": "सार्वजनिक नेटवर्क",
+"label.purpose": "उद्देश्य",
+"label.qostype": "QoS प्रकार",
+"label.quickview": "त्वरित दृश्य",
+"label.quiescevm": "Quiesce VM",
+"label.quota": "कोटा मान",
+"label.quota.value": "कोटा मान",
+"label.ram": "RAM",
+"label.rbd": "RBD",
+"label.rbdid": "सेफ यूजर",
+"label.rbdmonitor": "सिफ मॉनिटर",
+"label.rbdsecret": "सेफक्स सीक्रेट",
+"label.reason": "कारण",
+"label.reenterpassword": "पासवर्ड पुनः दर्ज करें",
+"label.refresh": "ताज़ा करें",
+"label.remove": "निकालें",
+"label.removing": "हटाना",
+"label.required": "आवश्यक",
+"label.requireshvm": "HVM",
+"label.requiresupgrad": "अपग्रेड की आवश्यकता है",
+"label.reservediprange": "आरक्षित आईपी श्रेणी",
+"label.reservedsystemnetmask": "आरक्षित सिस्टम नेटमास्क",
+"label.reservedsystemstartip": "आरक्षित सिस्टम IP प्रारंभ करें",
+"label.resetvm": "VM रीसेट करें",
+"label.resource": "संसाधन",
+"label.resourceid": "संसाधन ID",
+"label.resourcename": "संसाधन का नाम",
+"label.resourcestate": "संसाधन स्थिति",
+"label.restartrequired": "पुनरारंभ आवश्यक",
+"label.revokeinvitationconfirm": "कृपया पुष्टि करें कि आप इस निमंत्रण को रद्द करना चाहेंगे?",
+"label.role": "भूमिका",
+"label.roletype": "भूमिका प्रकार",
+"label.rootdiskcontrollertype": "रूट डिस्क नियंत्रक",
+"label.rootdiskcontrollertypekvm": "रूट डिस्क नियंत्रक",
+"label.routercount": "वर्चुअल राउटर्स का कुल",
+"label.routerrequiresupgrad": "अपग्रेड आवश्यक है",
+"label.routertype": "टाइप",
+"label.rule": "नियम",
+"label.rules": "नियम",
+"label.samlenable": "SAML SSO को अधिकृत करें",
+"label.samlentity": "आइडेंटिटी प्रोवाइडर",
+"label.save": "सहेजें",
+"label.schedule": "अनुसूची",
+"label.search": "खोज",
+"label.secondaryips": "सेकेंडरी आईपी",
+"label.secretkey": "सीक्रेट की",
+"label.securitygroup": "सुरक्षा समूह",
+"label.select": "Select",
+"label.server": "Server",
+"label.servicecapabilities": "सेवा क्षमताएं",
+"label.servicelist": "सेवाएँ",
+"label.serviceofferingid": "कंप्यूट ऑफ़र",
+"label.serviceofferingname": "कंप्यूट ऑफ़र",
+"label.sharewith": "शेयर विथ",
+"label.sizegb": "आकार",
+"label.smbdomain": "SMB डोमेन",
+"label.smbpassword": "SMB पासवर्ड",
+"label.smbusername": "SMB उपयोगकर्ता नाम",
+"label.snapshotlimit": "स्नैपशॉट सीमाएँ",
+"label.snapshotmemory": "स्नैपशॉट मेमोरी",
+"label.snapshots": "स्नैपशॉट",
+"label.snmpcommunity": "SNMP समुदाय",
+"label.sockettimeout": "सॉकेट टाइमआउट",
+"label.sourcecidr": "स्रोत CIDR",
+"label.sourceipaddress": "स्रोत IP पता",
+"label.sourcenattype": "समर्थित स्रोत NAT प्रकार",
+"label.specifyipranges": "IP पर्वतमाला निर्दिष्ट करें",
+"label.specifyvlan": "वीएलएएन निर्दिष्ट करें",
+"label.sshkeypair": "न्यू SSH कुंजी जोड़ी",
+"label.sshkeypairs": "SSH keypairs",
+"label.sslcert प्रमाणपत्र": "SSL प्रमाणपत्र",
+"label.startquota": "कोटा मान",
+"label.storagepolicy": "संग्रहण नीति",
+"label.storagetags": "संग्रहण टैग",
+"label.storagetype": "संग्रहण प्रकार",
+"label.subdomainaccess": "उपडोमेन एक्सेस",
+"label.submit": "सबमिट करें",
+"label.supportedservices": "समर्थित सेवाएं",
+"label.supportspublicaccess": "सार्वजनिक पहुँच का समर्थन करता है",
+"label.supportsregionlevelvpc": "क्षेत्र स्तर VPC का समर्थन करता है",
+"label.systemvmtype": "सिस्टम VM प्रकार",
+"label.tagged": "टैग किया हुआ",
+"label.tags": "टैग",
+"label.tariffvalue": "टैरिफ वैल्यू",
+"label.tcp": "TCP",
+"label.template": "एक टेम्पलेट का चयन करें",
+"label.templatebody": "बॉडी",
+"label.templatedn": "टेम्पलेट चुनें",
+"label.templatefileupload": "स्थानीय फ़ाइल",
+"label.templateiso": "टेम्प्लेट / आईएसओ",
+"label.templatelimit": "टेम्पलेट सीमाएँ",
+"label.templatename": "टेम्प्लेट",
+"label.templatenames": "टेम्प्लेट",
+"label.templatesubject": "विषय",
+"label.templatetotal": "टेम्प्लेट",
+"label.templatetype": "ईमेल टेम्प्लेट",
+"label.tftpdir": "Tftp root directory",
+"label.threshold": "थ्रेसहोल्ड",
+"label.thursday": "गुरुवार",
+"label.tiername": "टियर",
+"label.token": "टोकन",
+"label.totalcpu": "कुल CPU",
+"label.traffictype": "ट्रैफ़िक प्रकार",
+"label.transportzoneuuid": "ट्रांसपोर्ट ज़ोन यूआईडी",
+"label.tuesday": "मंगलवार",
+"label.unavailable": "अनुपलब्ध",
+"label.unit": "यूज़ यूनिट",
+"label.unlimited": "अनलिमिटेड",
+"label.untagged": "अनटैग्ड",
+"label.upload": "अपलोड",
+"label.url": "URL",
+"label.usageinterface": "उपयोग इंटरफ़ेस",
+"label.usagename": "उपयोग प्रकार",
+"label.usageunit": "Unit",
+"label.usehttps": "HTTPS का उपयोग करें",
+"label.user": "उपयोगकर्ता",
+"label.userdata": "Userdata",
+"label.username": "उपयोगकर्ता नाम",
+"label.users": "उपयोगकर्ता",
+"label.uuid": "ID",
+"label.vcdcname": "vCenter DC नाम",
+"label.vcenter": "VMware डाटासेंटर vCenter",
+"label.esx.host": "ESX / ESXi होस्ट",
+"label.vcenterpassword": "vCenter पासवर्ड",
+"label.vcipaddress": "vCenter IP पता",
+"label.version": "संस्करण",
+"label.versions": "संस्करण",
+"label.vgpu": "VGPU",
+"label.vgputype": "vGPU प्रकार",
+"label.view": "देखें",
+"label.viewing": "देखना",
+"label.virtualmachinedisplayname": "VM नाम",
+"label.virtualsize": "वर्चुअल साइज़",
+"label.vlanid": "VLAN / VNI ID",
+"label.vlanrange": "वीएलएएन / वीएनआई रेंज",
+"label.vm": "VM",
+"label.vmfs": "VMFS",
+"label.vmipaddress": "VM IP पता",
+"label.vmlimit": "इंस्टेंस लिमिट्स",
+"label.vmname": "VM नाम",
+"label.vms": "VMs",
+"label.vmstate": "VM राज्य",
+"label.vmwarenetworklabel": "VMware ट्रैफिक label",
+"label.vnmc": "VNMC",
+"label.volumechecksum": "MD5 चेकसम",
+"label.volumefileupload": "स्थानीय फ़ाइल",
+"label.volumeids": "हटाए जाने वाले वॉल्यूम",
+"label.volumelimit": "वॉल्यूम सीमाएं",
+"label.volumename": "वॉल्यूम नाम",
+"label.volumetotal": "वॉल्यूम",
+"label.vpc": "VPC",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC सीमाएँ",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC ऑफ़रिंग",
+"label.vpn": "वीपीएन",
+"label.vpncustomergateway": "दूरस्थ गेटवे का IP पता",
+"label.vpncustomergatewayid": "वीपीएन ग्राहक गेटवे",
+"label.vpncustomergatewayname": "वीपीएन ग्राहक गेटवे के लिए अद्वितीय नाम",
+"label.vsmctrlvlanid": "कंट्रोल वीएलएएन आईडी",
+"label.vsmdeviceid": "नाम",
+"label.vsmdevicestate": "State",
+"label.vsmipaddress": "Nexus 1000v IP पता",
+"label.vsmpassword": "Nexus 1000v पासवर्ड",
+"label.vsmpktvlanid": "पैकेट वीएलएएन आईडी",
+"label.vsmstoragevlanid": "संग्रहण VLAN ID",
+"label.vsmusername": "Nexus 1000v उपयोगकर्ता नाम",
+"label.vswitchguestname": "अतिथि ट्रैफ़िक vSwitch नाम",
+"label.vswitchguesttype": "अतिथि ट्रैफ़िक vSwitch प्रकार",
+"label.vswitchpublicname": "पब्लिक ट्रैफ़िक vSwitch नाम",
+"label.vswitchpuburtype": "सार्वजनिक ट्रैफ़िक vSwitch प्रकार",
+"label.writeback": "राइट-बैक डिस्क कैशिंग",
+"label.writecachetype": "लिखें-कैश प्रकार",
+"label.writethrough": "राइट-थ्रू",
+"label.xennetworklabel": "XenServer ट्रैफ़िक label",
+"label.yes": "हाँ",
+"label.yourinstance": "आपका उदाहरण",
+"label.zone": "ज़ोन",
+"label.zoneid": "ज़ोन",
+"label.zonename": "ज़ोन नाम"
+}
diff --git a/ui/public/locales/hu.json b/ui/public/locales/hu.json
new file mode 100644
index 0000000..5a010ff
--- /dev/null
+++ b/ui/public/locales/hu.json
@@ -0,0 +1,2363 @@
+{
+"changed.item.properties": "Az elem tulajdons\u00e1gai megv\u00e1ltoztak",
+"confirm.enable.s3": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az S3 m\u00e1sodlagos t\u00e1r bekapcsol\u00e1s\u00e1hoz!",
+"confirm.enable.swift": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat a Swift t\u00e1mogat\u00e1s bekapcsol\u00e1s\u00e1hoz!",
+"error.could.not.change.your.password.because.non.native.user": "Nem siker\u00fclt megv\u00e1ltoztatni a jelszavadat, mert az LDAP be van kapcsolva.",
+"error.could.not.enable.zone": "A z\u00f3na enged\u00e9lyez\u00e9se sikertelen",
+"error.installwizard.message": "Valami nem siker\u00fclt, visszamehetsz kijav\u00edtani a hib\u00e1kat.",
+"error.invalid.username.password": "\u00c9rv\u00e9nytelen felhaszn\u00e1l\u00f3n\u00e9v vagy jelsz\u00f3",
+"error.login": "A felhaszn\u00e1l\u00f3n\u00e9v/jelsz\u00f3 p\u00e1r nem \u00e9rv\u00e9nyes.",
+"error.menu.select": "A m\u0171velet nem hajthat\u00f3 v\u00e9gre, mert nincsenek kiv\u00e1lasztott elemek.",
+"error.mgmt.server.inaccessible": "A vez\u00e9rl\u0151 szerver nem \u00e9rhet\u0151 el. Pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u0151bb!",
+"error.password.not.match": "A jelszavak nem egyeznek.",
+"error.please.specify.physical.network.tags": "A h\u00e1l\u00f3zati aj\u00e1nlatok nem \u00e9rhet\u0151ek el addig, am\u00edg meg nem adsz c\u00edmk\u00e9ket a fizikai h\u00e1l\u00f3tathoz.",
+"error.session.expired": "A munkamenet lej\u00e1rt.",
+"error.unable.to.reach.management.server": "A vez\u00e9rl\u0151 szerver nem el\u00e9rhet\u0151",
+"error.unresolved.internet.name": "Az internet neved nem oldhat\u00f3 fel.",
+"force.delete.domain.warning": "Figyelmeztet\u00e9s: Ha ezt v\u00e1lasztod, t\u00f6rl\u0151dni fog minden al\u00e1rendelt dom\u00e9n \u00e9s minden kapcsol\u00f3d\u00f3 sz\u00e1mla \u00e9s a hozz\u00e1juk tartoz\u00f3 er\u0151forr\u00e1sok.",
+"force.remove": "Elt\u00e1vol\u00edt\u00e1s kik\u00e9nyszer\u00edt\u00e9se",
+"force.remove.host.warning": "Figyelmeztet\u00e9s: Ha ezt az opci\u00f3t v\u00e1lasztod, a CloudStack minden virtu\u00e1lis g\u00e9pet le\u00e1ll\u00edt miel\u0151tt elt\u00e1vol\u00edtja a kiszolg\u00e1l\u00f3t a f\u00fcrtb\u0151l.",
+"force.stop": "Le\u00e1ll\u00e1s kik\u00e9nyszer\u00edt\u00e9se",
+"force.stop.instance.warning": "Figyelmeztet\u00e9s: A p\u00e9ld\u00e1ny er\u0151szakos le\u00e1ll\u00edt\u00e1sa az utols\u00f3 lehet\u0151s\u00e9g. Ez adatveszt\u00e9shez \u00e9s a virtu\u00e1lis g\u00e9p inkonzisztens viselked\u00e9s\u00e9hez vezethet.",
+"hint.no.host.tags": "Nincsenek kiszolg\u00e1l\u00f3 c\u00edmk\u00e9k",
+"hint.no.storage.tags": "Nincsenek t\u00e1r c\u00edmk\u00e9k",
+"hint.type.part.host.tag": "\u00cdrd be egy kiszolg\u00e1l\u00f3 c\u00edmke r\u00e9sz\u00e9t",
+"hint.type.part.storage.tag": "\u00cdrd be egy t\u00e1r c\u00edmke r\u00e9sz\u00e9t",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Image K\u00f6nyvt\u00e1r",
+"inline": "Inline",
+"label.about": "N\u00e9vjegy",
+"label.about.app": "A CloudStack-r\u0151l",
+"label.accept.project.invitation": "Project-megh\u00edv\u00f3 elfogad\u00e1sa",
+"label.accesskey": "Hozz\u00e1f\u00e9r\u00e9si kulcs",
+"label.account": "Sz\u00e1mla",
+"label.account.and.security.group": "Sz\u00e1mla, biztons\u00e1gi csoport",
+"label.account.details": "Sz\u00e1mla r\u00e9szletei",
+"label.account.id": "Sz\u00e1mla azonos\u00edt\u00f3",
+"label.account.name": "Sz\u00e1mla n\u00e9v",
+"label.account.specific": "Sz\u00e1mla-specifikus",
+"label.accounts": "Sz\u00e1ml\u00e1k",
+"label.accounttype": "Sz\u00e1mla t\u00edpus",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL lehelyettes\u00edtve",
+"label.aclid": "ACL",
+"label.aclname": "ACL n\u00e9v",
+"label.acltotal": "H\u00e1l\u00f3zati ACL \u00f6sszesen",
+"label.acquire.new.ip": "\u00daj IP c\u00edm beszerz\u00e9se",
+"label.acquire.new.secondary.ip": "\u00daj m\u00e1sodlagos IP c\u00edm beszerz\u00e9se",
+"label.action": "M\u0171velet",
+"label.action.attach.disk": "Merevlemez csatlakoztat\u00e1sa",
+"label.action.attach.disk.processing": "Merevlemez csatlakoztat\u00e1sa...",
+"label.action.attach.iso": "ISO csatlakoztat\u00e1sa",
+"label.action.attach.iso.processing": "ISO csatlakoztat\u00e1sa...",
+"label.action.cancel.maintenance.mode": "Karbantart\u00e1si m\u00f3d megszak\u00edt\u00e1sa",
+"label.action.cancel.maintenance.mode.processing": "Karbantart\u00e1si m\u00f3d megszak\u00edt\u00e1sa...",
+"label.action.change.password": "Jelsz\u00f3 csere",
+"label.action.change.service": "Szolg\u00e1ltat\u00e1s v\u00e1ltoztat\u00e1sa",
+"label.action.change.service.processing": "Szolg\u00e1ltat\u00e1s v\u00e1ltoztat\u00e1sa...",
+"label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
+"label.action.configure.stickiness": "Stickiness",
+"label.action.copy.iso": "ISO m\u00e1sol\u00e1sa",
+"label.action.copy.iso.processing": "ISO m\u00e1sol\u00e1sa...",
+"label.action.copy.template": "Sablon m\u00e1sol\u00e1sa",
+"label.action.copy.template.processing": "Sablon m\u00e1sol\u00e1sa...",
+"label.action.create.template.from.vm": "Sablon l\u00e9trehoz\u00e1sa VM-b\u0151l",
+"label.action.create.template.from.volume": "Sablon l\u00e9trehoz\u00e1sa k\u00f6tetb\u0151l",
+"label.action.create.template.processing": "Sablon l\u00e9trehoz\u00e1sa...",
+"label.action.create.vm": "VM l\u00e9trehoz\u00e1sa",
+"label.action.create.vm.processing": "VM l\u00e9trehoz\u00e1sa...",
+"label.action.create.volume": "K\u00f6tet l\u00e9trehoz\u00e1sa",
+"label.action.create.volume.processing": "K\u00f6tet l\u00e9trehoz\u00e1sa....",
+"label.action.delete.account": "Sz\u00e1mla t\u00f6rl\u00e9se",
+"label.action.delete.account.processing": "Sz\u00e1mla t\u00f6rl\u00e9se...",
+"label.action.delete.cluster": "F\u00fcrt t\u00f6rl\u00e9se",
+"label.action.delete.cluster.processing": "F\u00fcrt t\u00f6rl\u00e9se...",
+"label.action.delete.disk.offering": "T\u00e1r aj\u00e1nlat t\u00f6rl\u00e9se",
+"label.action.delete.disk.offering.processing": "T\u00e1r aj\u00e1nlat t\u00f6rl\u00e9se...",
+"label.action.delete.domain": "Dom\u00e9n t\u00f6rl\u00e9se",
+"label.action.delete.domain.processing": "Dom\u00e9n t\u00f6rl\u00e9se...",
+"label.action.delete.firewall": "T\u0171zfal szab\u00e1ly t\u00f6rl\u00e9se",
+"label.action.delete.firewall.processing": "T\u0171zfal t\u00f6rl\u00e9se...",
+"label.action.delete.ingress.rule": "Ingress szab\u00e1ly t\u00f6rl\u00e9se",
+"label.action.delete.ingress.rule.processing": "Ingress szab\u00e1ly t\u00f6rl\u00e9se...",
+"label.action.delete.ip.range": "IP c\u00edmtartom\u00e1ny t\u00f6rl\u00e9se",
+"label.action.delete.ip.range.processing": "IP c\u00edmtartom\u00e1ny t\u00f6rl\u00e9se...",
+"label.action.delete.iso": "ISO t\u00f6rl\u00e9se",
+"label.action.delete.iso.processing": "ISO t\u00f6rl\u00e9se...",
+"label.action.delete.load.balancer": "Terhel\u00e9seloszt\u00f3 szab\u00e1ly t\u00f6rl\u00e9se",
+"label.action.delete.load.balancer.processing": "Terhel\u00e9seloszt\u00f3 t\u00f6rl\u00e9se...",
+"label.action.delete.network": "H\u00e1l\u00f3zat t\u00f6rl\u00e9se",
+"label.action.delete.network.processing": "H\u00e1l\u00f3zat t\u00f6rl\u00e9se...",
+"label.action.delete.nexusvswitch": "Nexus 1000v t\u00f6rl\u00e9se",
+"label.action.delete.nic": "NIC elt\u00e1vol\u00edt\u00e1sa",
+"label.action.delete.physical.network": "Fizikai h\u00e1l\u00f3zat t\u00f6rl\u00e9se",
+"label.action.delete.pod": "Pod t\u00f6rl\u00e9se",
+"label.action.delete.pod.processing": "Pod t\u00f6rl\u00e9se...",
+"label.action.delete.primary.storage": "Els\u0151dleges t\u00e1r t\u00f6rl\u00e9se",
+"label.action.delete.primary.storage.processing": "Els\u0151dleges t\u00e1r t\u00f6rl\u00e9se...",
+"label.action.delete.secondary.storage": "M\u00e1sodlagos t\u00e1r t\u00f6rl\u00e9se",
+"label.action.delete.secondary.storage.processing": "M\u00e1sodlagos t\u00e1r t\u00f6rl\u00e9se...",
+"label.action.delete.security.group": "Biztons\u00e1gi csoport t\u00f6rl\u00e9se",
+"label.action.delete.security.group.processing": "Biztons\u00e1gi csoport t\u00f6rl\u00e9se...",
+"label.action.delete.service.offering": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se",
+"label.action.delete.service.offering.processing": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se...",
+"label.action.delete.snapshot": "Pillanatfelv\u00e9tel t\u00f6rl\u00e9se",
+"label.action.delete.snapshot.processing": "Pillanatfelv\u00e9tel t\u00f6rl\u00e9se...",
+"label.action.delete.system.service.offering": "Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se",
+"label.action.delete.template": "Sablon t\u00f6rl\u00e9se",
+"label.action.delete.template.processing": "Sablon t\u00f6rl\u00e9se...",
+"label.action.delete.user": "Felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se",
+"label.action.delete.user.processing": "Felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se...",
+"label.action.delete.volume": "K\u00f6tet t\u00f6rl\u00e9se",
+"label.action.delete.volume.processing": "K\u00f6tet t\u00f6rl\u00e9se...",
+"label.action.delete.zone": "Z\u00f3na t\u00f6rl\u00e9se",
+"label.action.delete.zone.processing": "Z\u00f3na t\u00f6rl\u00e9se...",
+"label.action.destroy.instance": "P\u00e9ld\u00e1ny elpuszt\u00edt\u00e1sa",
+"label.action.destroy.instance.processing": "P\u00e9ld\u00e1ny elpuszt\u00edt\u00e1sa...",
+"label.action.destroy.systemvm": "Rendszer VM elpuszt\u00edt\u00e1sa",
+"label.action.destroy.systemvm.processing": "Rendszer VM elpuszt\u00edt\u00e1sa...",
+"label.action.destroy.volume": "Destroy Volume",
+"label.action.detach.disk": "Merevlemez lev\u00e1laszt\u00e1sa",
+"label.action.detach.disk.processing": "Merevlemez lev\u00e1laszt\u00e1sa...",
+"label.action.detach.iso": "ISO lev\u00e1laszt\u00e1sa",
+"label.action.detach.iso.processing": "ISO lev\u00e1laszt\u00e1sa...",
+"label.action.disable.account": "Sz\u00e1mla kikapcsol\u00e1sa",
+"label.action.disable.account.processing": "Sz\u00e1mla kikapcsol\u00e1sa...",
+"label.action.disable.cluster": "F\u00fcrt kikapcsol\u00e1sa",
+"label.action.disable.cluster.processing": "F\u00fcrt kikapcsol\u00e1sa...",
+"label.action.disable.nexusvswitch": "Nexus 1000v kikapcsol\u00e1sa",
+"label.action.disable.physical.network": "Fizikikai h\u00e1l\u00f3zat kikapcsol\u00e1sa",
+"label.action.disable.pod": "Pod kikapcsol\u00e1sa",
+"label.action.disable.pod.processing": "Pod kikapcsol\u00e1sa...",
+"label.action.disable.static.nat": "Statikus NAT kikapcsol\u00e1sa",
+"label.action.disable.static.nat.processing": "Statikus NAT kikapcsol\u00e1sa...",
+"label.action.disable.user": "Felhaszn\u00e1l\u00f3 kikapcsol\u00e1sa",
+"label.action.disable.user.processing": "Felhaszn\u00e1l\u00f3 kikapcsol\u00e1sa...",
+"label.action.disable.zone": "Z\u00f3na kikapcsol\u00e1sa",
+"label.action.disable.zone.processing": "Z\u00f3na kikapcsol\u00e1sa...",
+"label.action.download.iso": "ISO let\u00f6lt\u00e9se",
+"label.action.download.template": "Sablon let\u00f6lt\u00e9se",
+"label.action.download.volume": "K\u00f6tet let\u00f6lt\u00e9se",
+"label.action.download.volume.processing": "K\u00f6tet let\u00f6lt\u00e9se...",
+"label.action.edit.account": "Sz\u00e1mla enged\u00e9lyez\u00e9se",
+"label.action.edit.disk.offering": "Merevlemez aj\u00e1nlat szerkeszt\u00e9se",
+"label.action.edit.domain": "Dom\u00e9n szerkeszt\u00e9se",
+"label.action.edit.global.setting": "Glob\u00e1lis be\u00e1ll\u00edt\u00e1s szerkeszt\u00e9se",
+"label.action.edit.host": "Kiszolg\u00e1l\u00f3 szerkeszt\u00e9se",
+"label.action.edit.instance": "P\u00e9ld\u00e1ny szerkeszt\u00e9se",
+"label.action.edit.iso": "ISO szerkeszt\u00e9se",
+"label.action.edit.network": "H\u00e1l\u00f3zat szerkeszt\u00e9se",
+"label.action.edit.network.offering": "H\u00e1l\u00f3zat aj\u00e1nlat szerkeszt\u00e9se",
+"label.action.edit.network.processing": "H\u00e1l\u00f3zat szerkeszt\u00e9se...",
+"label.action.edit.pod": "Pod szerkeszt\u00e9se",
+"label.action.edit.primary.storage": "Els\u0151dleges t\u00e1r szerkeszt\u00e9se",
+"label.action.edit.resource.limits": "Er\u0151forr\u00e1s korl\u00e1tok szerkeszt\u00e9se",
+"label.action.edit.service.offering": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat szerkeszt\u00e9se",
+"label.action.edit.template": "Sablon szerkeszt\u00e9se",
+"label.action.edit.user": "Felhaszn\u00e1l\u00f3 szerkeszt\u00e9se",
+"label.action.edit.zone": "Z\u00f3na szerkeszt\u00e9se",
+"label.action.enable.account": "Sz\u00e1mla enged\u00e9lyez\u00e9se",
+"label.action.enable.account.processing": "Sz\u00e1mla szerkeszt\u00e9se...",
+"label.action.enable.cluster": "F\u00fcrt enged\u00e9lyez\u00e9se",
+"label.action.enable.cluster.processing": "F\u00fcrt enged\u00e9lyez\u00e9se...",
+"label.action.enable.maintenance.mode": "Karbantart\u00e1si \u00fczemm\u00f3d enged\u00e9lyez\u00e9se",
+"label.action.enable.maintenance.mode.processing": "Karbantart\u00e1si \u00fczemm\u00f3d enged\u00e9lyez\u00e9se...",
+"label.action.enable.nexusvswitch": "Nexus 1000v bekapcsol\u00e1sa",
+"label.action.enable.physical.network": "Fizikai h\u00e1l\u00f3zat bekapcsol\u00e1sa",
+"label.action.enable.pod": "Pod bekapcsol\u00e1sa",
+"label.action.enable.pod.processing": "Pod bekapcsol\u00e1sa...",
+"label.action.enable.static.nat": "Statikus NAT bekapcsol\u00e1sa",
+"label.action.enable.static.nat.processing": "Statikus NAT bekapcsol\u00e1sa...",
+"label.action.enable.user": "Felhaszn\u00e1l\u00f3 bekapcsol\u00e1sa",
+"label.action.enable.user.processing": "Felhaszn\u00e1l\u00f3 bekapcsol\u00e1sa...",
+"label.action.enable.zone": "Z\u00f3na bekapcsol\u00e1sa",
+"label.action.enable.zone.processing": "Z\u00f3na bekapcsol\u00e1sa....",
+"label.action.expunge.instance": "P\u00e9ld\u00e1ny t\u00f6rl\u00e9se",
+"label.action.expunge.instance.processing": "P\u00e9ld\u00e1ny t\u00f6rl\u00e9se...",
+"label.action.force.reconnect": "\u00dajracsatlakoz\u00e1s kik\u00e9nyszer\u00edt\u00e9se",
+"label.action.force.reconnect.processing": "\u00dajrakapcsol\u00f3d\u00e1s...",
+"label.action.generate.keys": "Kulcsgener\u00e1l\u00e1s",
+"label.action.generate.keys.processing": "Kulcsgener\u00e1l\u00e1s....",
+"label.action.list.nexusvswitch": "Nexus 1000v lista",
+"label.action.lock.account": "Sz\u00e1mla z\u00e1r\u00e1sa",
+"label.action.lock.account.processing": "Sz\u00e1mla z\u00e1r\u00e1sa...",
+"label.action.manage.cluster": "F\u00fcrt vez\u00e9rl\u00e9se",
+"label.action.manage.cluster.processing": "F\u00fcrt vez\u00e9rl\u00e9se...",
+"label.action.migrate.instance": "P\u00e9ld\u00e1ny k\u00f6lt\u00f6ztet\u00e9se",
+"label.action.migrate.instance.processing": "P\u00e9ld\u00e1ny mozgat\u00e1sa...",
+"label.action.migrate.router": "Router k\u00f6lt\u00f6ztet\u00e9se",
+"label.action.migrate.router.processing": "Router mozgat\u00e1sa...",
+"label.action.migrate.systemvm": "Rendszer VM k\u00f6lt\u00f6ztet\u00e9se",
+"label.action.migrate.systemvm.processing": "Rendszer VM mozgat\u00e1sa...",
+"label.action.project.add.account": "Sz\u00e1mla felv\u00e9tele a projekthez",
+"label.action.reboot.instance": "P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa",
+"label.action.reboot.instance.processing": "P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa",
+"label.action.reboot.router": "Router \u00fajraind\u00edt\u00e1sa",
+"label.action.reboot.router.processing": "Router \u00fajraind\u00edt\u00e1sa...",
+"label.action.reboot.systemvm": "Rendszer VM \u00fajraind\u00edt\u00e1sa",
+"label.action.reboot.systemvm.processing": "Rendszer VM \u00fajraind\u00edt\u00e1sa",
+"label.action.recover.volume": "Recover Volume",
+"label.action.recurring.snapshot": "Ism\u00e9tl\u0151d\u0151 pillanatfelv\u00e9telek",
+"label.action.register.iso": "ISO regisztr\u00e1ci\u00f3ja",
+"label.action.register.template": "Sablon regisztr\u00e1ci\u00f3ja URL-r\u0151l",
+"label.action.release.ip": "IP c\u00edm elenged\u00e9se",
+"label.action.release.ip.processing": "IP c\u00edm elenged\u00e9se",
+"label.action.remove.host": "Kiszolg\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa",
+"label.action.remove.host.processing": "Kiszolg\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa...",
+"label.action.reset.password": "Jelsz\u00f3 \u00fajrabe\u00e1ll\u00edt\u00e1sa",
+"label.action.reset.password.processing": "Jelsz\u00f3 \u00fajrabe\u00e1ll\u00edt\u00e1sa...",
+"label.action.resize.volume": "K\u00f6tet \u00e1tm\u00e9retez\u00e9se",
+"label.action.resize.volume.processing": "K\u00f6tet \u00e1tm\u00e9retez\u00e9se",
+"label.action.resource.limits": "Er\u0151forr\u00e1s korl\u00e1tok",
+"label.action.restore.instance": "P\u00e9ld\u00e1ny helyre\u00e1ll\u00edt\u00e1sa",
+"label.action.restore.instance.processing": "P\u00e9ld\u00e1ny helyre\u00e1ll\u00edt\u00e1sa...",
+"label.action.revert.snapshot": "Vissza\u00e1ll\u00e1s pillanatfelv\u00e9telre",
+"label.action.revert.snapshot.processing": "Vissza\u00e1ll\u00e1s pillanatfelv\u00e9telre...",
+"label.action.start.instance": "P\u00e9ld\u00e1ny ind\u00edt\u00e1sa",
+"label.action.start.instance.processing": "P\u00e9ld\u00e1ny ind\u00edt\u00e1sa...",
+"label.action.start.router": "Router ind\u00edt\u00e1sa",
+"label.action.start.router.processing": "Router le\u00e1ll\u00edt\u00e1sa...",
+"label.action.start.systemvm": "Rendszer VM ind\u00edt\u00e1sa",
+"label.action.start.systemvm.processing": "Rendszer VM ind\u00edt\u00e1sa",
+"label.action.stop.instance": "P\u00e9ld\u00e1ny le\u00e1ll\u00edt\u00e1sa",
+"label.action.stop.instance.processing": "P\u00e9ld\u00e1ny le\u00e1ll\u00edt\u00e1sa...",
+"label.action.stop.router": "Router le\u00e1ll\u00edt\u00e1sa",
+"label.action.stop.router.processing": "Router le\u00e1ll\u00edt\u00e1sa...",
+"label.action.stop.systemvm": "Rendszer VM le\u00e1ll\u00edt\u00e1sa",
+"label.action.stop.systemvm.processing": "Rendszer VM le\u00e1ll\u00edt\u00e1sa...",
+"label.action.take.snapshot": "Pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se",
+"label.action.take.snapshot.processing": "Pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se...",
+"label.action.unmanage.cluster": "F\u00fcrt vez\u00e9rl\u00e9s le\u00e1ll\u00edt\u00e1sa",
+"label.action.unmanage.cluster.processing": "F\u00fcrt vez\u00e9rl\u00e9s le\u00e1ll\u00edt\u00e1sa...",
+"label.action.update.os.preference": "OS preferencia m\u00f3dos\u00edt\u00e1sa",
+"label.action.update.os.preference.processing": "OS preferencia m\u00f3dos\u00edt\u00e1sa...",
+"label.action.update.resource.count": "Er\u0151forr\u00e1s sz\u00e1m m\u00f3dos\u00edt\u00e1sa",
+"label.action.update.resource.count.processing": "Er\u0151forr\u00e1s sz\u00e1m m\u00f3dos\u00edt\u00e1sa...",
+"label.action.vmsnapshot.create": "VM pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se",
+"label.action.vmsnapshot.delete": "VM pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se",
+"label.action.vmsnapshot.revert": "Vissza\u00e1ll\u00e1s VM pillanatfelv\u00e9telre",
+"label.actions": "M\u0171veletek",
+"label.activate.project": "Projekt aktiv\u00e1l\u00e1sa",
+"label.activeviewersessions": "Akt\u00edv munkamenetek",
+"label.add": "Felv\u00e9tel",
+"label.add.account": "Sz\u00e1mla felv\u00e9tele",
+"label.add.accounts": "Sz\u00e1ml\u00e1k felv\u00e9tele",
+"label.add.accounts.to": "Sz\u00e1mla felv\u00e9tele:",
+"label.add.acl": "ACL felv\u00e9tele",
+"label.add.acl.list": "ACL lista felv\u00e9tele",
+"label.add.affinity.group": "\u00daj affin\u00edt\u00e1si csoport felv\u00e9tele",
+"label.add.baremetal.dhcp.device": "Baremetal DHCP eszk\u00f6z felv\u00e9tele",
+"label.add.baremetal.rack.configuration": "Baremetal rack konfigur\u00e1ci\u00f3 felv\u00e9tele",
+"label.add.bigswitchbcf.device": "BigSwitch BCF vez\u00e9rl\u0151 felv\u00e9tele",
+"label.add.brocadevcs.device": "Brocade Vcs Switch felv\u00e9tele",
+"label.add.by": "Add by",
+"label.add.by.cidr": "Add By CIDR",
+"label.add.by.group": "Add By Group",
+"label.add.ciscoasa1000v": "CiscoASA1000v er\u0151forr\u00e1s felv\u00e9tele",
+"label.add.cluster": "F\u00fcrt felv\u00e9tele",
+"label.add.compute.offering": "CPU aj\u00e1nlat felv\u00e9tele",
+"label.add.direct.iprange": "IP tartom\u00e1ny felv\u00e9tele",
+"label.add.disk.offering": "Merevlemez aj\u00e1nlat felv\u00e9tele",
+"label.add.domain": "Dom\u00e9n felv\u00e9tele",
+"label.add.egress.rule": "Kimen\u0151 szab\u00e1ly felv\u00e9tele",
+"label.add.f5.device": "F5 eszk\u00f6z felv\u00e9tele",
+"label.add.firewall": "T\u0171zfal szab\u00e1ly felv\u00e9tele",
+"label.add.globo.dns": "GloboDNS felv\u00e9tele",
+"label.add.gslb": "GSLB felv\u00e9tele",
+"label.add.guest.network": "Vend\u00e9g h\u00e1l\u00f3zat felv\u00e9tele",
+"label.add.host": "Kiszolg\u00e1l\u00f3 felv\u00e9tele",
+"label.add.ingress.rule": "Ingress szab\u00e1ly felv\u00e9tele",
+"label.add.intermediate.certificate": "K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny felv\u00e9tele",
+"label.add.internal.lb": "Bels\u0151 LB felv\u00e9tele",
+"label.add.ip.range": "IP c\u00edmtartom\u00e1ny felv\u00e9tele",
+"label.add.isolated.guest.network": "Izol\u00e1lt vend\u00e9g h\u00e1l\u00f3zat felv\u00e9tele",
+"label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
+"label.add.isolated.network": "Izol\u00e1lt h\u00e1l\u00f3zat felv\u00e9tele",
+"label.add.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "LDAP hozz\u00e1f\u00e9r\u00e9s felv\u00e9tele",
+"label.add.list.name": "ACL lista n\u00e9v",
+"label.add.load.balancer": "Terhel\u00e9seloszt\u00f3 felv\u00e9tele",
+"label.add.more": "Tov\u00e1bbi felv\u00e9tele",
+"label.add.netscaler.device": "Netscaler eszk\u00f6z felv\u00e9tele",
+"label.add.network": "H\u00e1l\u00f3zat felv\u00e9tele",
+"label.add.network.acl": "H\u00e1l\u00f3zati ACL felv\u00e9tele",
+"label.add.network.acl.list": "H\u00e1l\u00f3zati ACL lista felv\u00e9tele",
+"label.add.network.device": "Add Network Device",
+"label.add.network.offering": "H\u00e1l\u00f3zati aj\u00e1nlat felv\u00e9tele",
+"label.add.new.f5": "\u00daj F5 felv\u00e9tele",
+"label.add.new.gateway": "\u00daj \u00e1tj\u00e1r\u00f3 felv\u00e9tele",
+"label.add.new.netscaler": "\u00daj NetScaler felv\u00e9tele",
+"label.add.new.pa": "\u00daj Palo Alto felv\u00e9tele",
+"label.add.new.srx": "\u00daj SRX felv\u00e9tele",
+"label.add.new.tier": "\u00daj r\u00e9teg felv\u00e9tele",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Nvp Controller felv\u00e9tele",
+"label.add.opendaylight.device": "OpenDaylight Controller hozz\u00e1ad\u00e1sa",
+"label.add.pa.device": "Palo Alto eszk\u00f6z felv\u00e9tele",
+"label.add.physical.network": "Fizikai h\u00e1l\u00f3zat felv\u00e9tele",
+"label.add.pod": "Pod felv\u00e9tele",
+"label.add.port.forwarding.rule": "Port tov\u00e1bb\u00edt\u00f3 szab\u00e1ly felv\u00e9tele",
+"label.add.portable.ip.range": "Portolhat\u00f3 IP tartom\u00e1ny felv\u00e9tele",
+"label.add.primary.storage": "Els\u0151dleges t\u00e1r felv\u00e9tele",
+"label.add.private.gateway": "Priv\u00e1t \u00e1tj\u00e1r\u00f3 felv\u00e9tele",
+"label.add.region": "R\u00e9gi\u00f3 felv\u00e9tele",
+"label.add.resources": "Er\u0151forr\u00e1sok felv\u00e9tele",
+"label.add.role": "Add Role",
+"label.add.route": "\u00datvonal felv\u00e9tele",
+"label.add.rule": "Szab\u00e1ly felv\u00e9tele",
+"label.add.rule.desc": "Create a new ACL rule",
+"label.add.secondary.storage": "M\u00e1sodlagos t\u00e1r felv\u00e9tele",
+"label.add.security.group": "Biztons\u00e1gi csoport felv\u00e9tele",
+"label.add.service.offering": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat felv\u00e9tele",
+"label.add.srx.device": "SRX szk\u00f6z felv\u00e9tele",
+"label.add.static.nat.rule": "Statikus NAT szab\u00e1ly felv\u00e9tele",
+"label.add.static.route": "Statikus \u00fatvonal felv\u00e9tele",
+"label.add.system.service.offering": "Add System Service Offering",
+"label.add.template": "Sablon felv\u00e9tele",
+"label.add.to.group": "Felv\u00e9tel a csoportba",
+"label.add.ucs.manager": "UCS Manager felv\u00e9tele",
+"label.add.user": "Felhaszn\u00e1l\u00f3 felv\u00e9tele",
+"label.add.vlan": "VLAN felv\u00e9tele",
+"label.add.vm": "VM felv\u00e9tele",
+"label.add.vm.to.tier": "VM felv\u00e9tele r\u00e9tegbe",
+"label.add.vms": "VM-ek felv\u00e9tele",
+"label.add.vms.to.lb": "VM(ek) felv\u00e9tele a terhel\u00e9seloszt\u00f3 szab\u00e1lyba",
+"label.add.vmware.datacenter": "VMware adatk\u00f6zpont felv\u00e9tele",
+"label.add.vnmc.device": "VNMC eszk\u00f6z felv\u00e9tele",
+"label.add.vnmc.provider": "VNMC szolg\u00e1ltat\u00f3 felv\u00e9tele",
+"label.add.volume": "K\u00f6tet felv\u00e9tele",
+"label.add.vpc": "VPC felv\u00e9tele",
+"label.add.vpc.offering": "VPC aj\u00e1nlat felv\u00e9tele",
+"label.add.vpn.customer.gateway": "VPN \u00fcgyf\u00e9lkapu felv\u00e9tele",
+"label.add.vpn.gateway": "VPN \u00e1tj\u00e1r\u00f3 felv\u00e9tele",
+"label.add.vpn.user": "VPN felhaszn\u00e1l\u00f3 felv\u00e9tele",
+"label.add.vxlan": "VXLAN felv\u00e9tele",
+"label.add.zone": "Z\u00f3na felv\u00e9tele",
+"label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
+"label.added.network.offering": "H\u00e1l\u00f3zat aj\u00e1nlat felv\u00e9ve",
+"label.added.new.bigswitch.bcf.controller": "BigSwitch BCF vez\u00e9rl\u0151 felv\u00e9ve",
+"label.added.nicira.nvp.controller": "Added new Nicira NVP Controller",
+"label.addes.new.f5": "\u00daj F5 felv\u00e9tele",
+"label.adding": "Felv\u00e9tel",
+"label.adding.cluster": "F\u00fcrt felv\u00e9tele",
+"label.adding.failed": "Hiba a felv\u00e9tel sor\u00e1n",
+"label.adding.pod": "Pod felv\u00e9tele",
+"label.adding.processing": "Felv\u00e9tel...",
+"label.adding.succeeded": "Sikeres felv\u00e9tel",
+"label.adding.user": "Felhaszn\u00e1l\u00f3 felv\u00e9tele",
+"label.adding.zone": "Z\u00f3na felv\u00e9tele",
+"label.additional.networks": "Tov\u00e1bbi h\u00e1l\u00f3zatok",
+"label.address": "Address",
+"label.admin": "Adminisztr\u00e1tor",
+"label.admin.accounts": "Adminisztr\u00e1tor hozz\u00e1f\u00e9r\u00e9sek",
+"label.advanced": "Halad\u00f3",
+"label.advanced.mode": "Halad\u00f3 m\u00f3d",
+"label.advanced.search": "Halad\u00f3 keres\u00e9s",
+"label.affinity": "Affin\u00edt\u00e1s",
+"label.affinity.groups": "Affin\u00edt\u00e1si csoportok",
+"label.affinitygroup": "Affin\u00edt\u00e1si csoport",
+"label.agent.password": "\u00dcgyn\u00f6k jelsz\u00f3",
+"label.agent.username": "\u00dcgyn\u00f6k felhaszn\u00e1l\u00f3n\u00e9v",
+"label.agentport": "\u00dcgyn\u00f6k port",
+"label.agentstate": "\u00dcgyn\u00f6k \u00e1llapot",
+"label.agree": "Elfogadom",
+"label.alert": "Riaszt\u00e1s",
+"label.alert.archived": "Riaszt\u00e1s archiv\u00e1lva",
+"label.alert.deleted": "Riaszt\u00e1s t\u00f6r\u00f6lve",
+"label.alert.details": "Riaszt\u00e1s r\u00e9szletei",
+"label.alerts": "Riaszt\u00e1sok",
+"label.algorithm": "Algoritmus",
+"label.all": "Mind",
+"label.allocated": "Lek\u00f6t\u00f6ve",
+"label.allocationstate": "Lefoglal\u00e1s \u00e1llapota",
+"label.allow": "Enged\u00e9lyez",
+"label.anti.affinity": "Anti-affin\u00edt\u00e1s",
+"label.anti.affinity.group": "Anti-affin\u00edt\u00e1s csoport",
+"label.anti.affinity.groups": "Anti-affin\u00edt\u00e1s csoportok",
+"label.api.version": "API verzi\u00f3",
+"label.apikey": "API kulcs",
+"label.app.name": "CloudStack",
+"label.apply": "Alkalmaz",
+"label.archive": "Archive",
+"label.archive.alerts": "Riaszt\u00e1sok archiv\u00e1l\u00e1sa",
+"label.archive.events": "Esem\u00e9nyek archiv\u00e1l\u00e1sa",
+"label.assign": "Hozz\u00e1rendel\u00e9s",
+"label.assign.instance.another": "P\u00e9ld\u00e1ny hozz\u00e1rendel\u00e9se m\u00e1sik sz\u00e1ml\u00e1hoz",
+"label.assign.to.load.balancer": "P\u00e9ld\u00e1ny hozz\u00e1rendel\u00e9se terhel\u00e9seloszt\u00f3hoz",
+"label.assign.vms": "VM-ek hozz\u00e1rendel\u00e9se",
+"label.associatednetwork": "Kapcsolt h\u00e1l\u00f3zat",
+"label.associatednetworkid": "Kapcsolt h\u00e1l\u00f3zat ID",
+"label.associatednetworkname": "H\u00e1l\u00f3zat n\u00e9v",
+"label.author.email": "Szerz\u0151 e-mail",
+"label.author.name": "Szerz\u0151 n\u00e9v",
+"label.autoscale": "AutoScale",
+"label.autoscale.configuration.wizard": "AutoScale konfigur\u00e1ci\u00f3 var\u00e1zsl\u00f3",
+"label.availability": "El\u00e9rhet\u0151s\u00e9g",
+"label.availabilityzone": "El\u00e9rhet\u0151s\u00e9gi z\u00f3na",
+"label.available": "El\u00e9rhet\u0151",
+"label.available.public.ips": "El\u00e9rhet\u0151 publikus PI c\u00edmek",
+"label.back": "Vissza",
+"label.balance": "Balance",
+"label.bandwidth": "S\u00e1vsz\u00e9less\u00e9g",
+"label.baremetal.dhcp.devices": "Baremetal DHCP eszk\u00f6z\u00f6k",
+"label.baremetal.dhcp.provider": "Baremetal DHCP szolg\u00e1ltat\u00f3",
+"label.baremetal.pxe.device": "Baremetal PXE eszk\u00f6z felv\u00e9tele",
+"label.baremetal.pxe.devices": "Baremetal PXE eszk\u00f6z\u00f6k",
+"label.baremetal.pxe.provider": "Baremetal PXE szolg\u00e1ltat\u00f3",
+"label.baremetal.rack.configuration": "Baremetal rack konfigur\u00e1ci\u00f3",
+"label.baremetalcpu": "CPU (MHz)",
+"label.baremetalcpucores": "CPU magok sz\u00e1ma",
+"label.baremetalmac": "Kiszolg\u00e1l\u00f3 MAC",
+"label.baremetalmemory": "Mem\u00f3ria (MB)",
+"label.basic": "Alap",
+"label.basic.mode": "Alap m\u00f3d",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF r\u00e9szletek",
+"label.bigswitch.controller.address": "BigSwitch BCF vez\u00e9rl\u0151 c\u00edm",
+"label.bladeid": "Blade ID",
+"label.blades": "Blade-k",
+"label.bootable": "Ind\u00edthat\u00f3",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch c\u00edm",
+"label.brocade.vcs.details": "Brocade Vcs Switch r\u00e9szletek",
+"label.bucket": "Kos\u00e1r",
+"label.by.account": "By Account",
+"label.by.alert.type": "Riaszt\u00e1s t\u00edpus szerint",
+"label.by.availability": "By Availability",
+"label.by.domain": "By Domain",
+"label.by.end.date": "By End Date",
+"label.by.event.type": "Esem\u00e9ny t\u00edpus 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.cachemode": "Write-cache Type",
+"label.cancel": "Megszak\u00edt\u00e1s",
+"label.capacity": "Kapac\u00edt\u00e1s",
+"label.capacity.iops": "IOPS kapac\u00edt\u00e1s",
+"label.capacitybytes": "Byte kapac\u00edt\u00e1s",
+"label.capacityiops": "IOPS \u00f6sszesen",
+"label.certificate": "Server certificate",
+"label.change.affinity": "Affin\u00edt\u00e1s v\u00e1ltoztat\u00e1sa",
+"label.change.ipaddress": "Change IP address for NIC",
+"label.change.service.offering": "Change service offering",
+"label.change.value": "\u00c9rt\u00e9k v\u00e1ltoztat\u00e1sa",
+"label.character": "Karakter",
+"label.chassis": "H\u00e1z",
+"label.checksum": "ellen\u00f6rz\u0151 \u00f6sszeg",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR vagy sz\u00e1mla/biztons\u00e1gi csoport",
+"label.cidr.of.destination.network": "A c\u00e9l h\u00e1l\u00f3zat CIDR",
+"label.cidrlist": "Forr\u00e1s CIDR",
+"label.cisco.nexus1000v.ip.address": "Nexus 1000v IP c\u00edm",
+"label.cisco.nexus1000v.password": "Nexus 1000v jelsz\u00f3",
+"label.cisco.nexus1000v.username": "Nexus 1000v felhaszn\u00e1l\u00f3n\u00e9v",
+"label.ciscovnmc.resource.details": "CiscoVNMC er\u0151forr\u00e1s r\u00e9szletek",
+"label.cleanup": "Takar\u00edt\u00e1s",
+"label.clear.list": "Lista t\u00f6rl\u00e9se",
+"label.close": "Bez\u00e1r\u00e1s",
+"label.cloud.console": "Cloud Management Console",
+"label.cloud.managed": "Cloud.com Managed",
+"label.cluster": "F\u00fcrt",
+"label.cluster.name": "F\u00fcrt n\u00e9v",
+"label.clusterid": "F\u00fcrt",
+"label.clustername": "F\u00fcrt",
+"label.clusternamelabel": "F\u00fcrt n\u00e9v",
+"label.clusters": "F\u00fcrt",
+"label.clustertype": "F\u00fcrt t\u00edpus",
+"label.clvm": "CLVM",
+"label.code": "K\u00f3d",
+"label.community": "K\u00f6z\u00f6ss\u00e9g",
+"label.compute": "Sz\u00e1m\u00edt\u00e1s",
+"label.compute.and.storage": "Sz\u00e1m\u00edt\u00e1s \u00e9s t\u00e1r",
+"label.compute.offerings": "Sz\u00e1m\u00edt\u00e1si aj\u00e1nlatok",
+"label.configuration": "Konfigur\u00e1ci\u00f3",
+"label.configure": "Konfigur\u00e1ci\u00f3",
+"label.configure.ldap": "LDAP konfigur\u00e1ci\u00f3ja",
+"label.configure.network.acls": "H\u00e1l\u00f3zati ACL-ek konfigur\u00e1ci\u00f3ja",
+"label.configure.sticky.policy": "Configure Sticky Policy",
+"label.configure.vpc": "VPC konfigur\u00e1ci\u00f3ja",
+"label.confirmation": "Meger\u0151s\u00edt\u00e9s",
+"label.confirmdeclineinvitation": "Biztosan el akarod utas\u00edtani ezt a projekt megh\u00edv\u00e1st?",
+"label.confirmpassword": "Jelsz\u00f3 meger\u0151s\u00edt\u00e9s",
+"label.congratulations": "Gratul\u00e1ci\u00f3!",
+"label.connectiontimeout": "Kapcsol\u00f3d\u00e1si id\u0151t\u00fall\u00e9p\u00e9s",
+"label.conservemode": "Conserve mode",
+"label.console.proxy": "Konzol proxy",
+"label.console.proxy.vm": "Konzol Proxy VM",
+"label.continue": "Tov\u00e1bb",
+"label.continue.basic.install": "Folytat\u00e1s alaptelep\u00edt\u00e9ssel",
+"label.copying.iso": "ISO m\u00e1sol\u00e1sa",
+"label.corrections.saved": "Jav\u00edt\u00e1sok mentve",
+"label.counterid": "Sz\u00e1ml\u00e1l\u00f3",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU allok\u00e1lva",
+"label.cpu.sockets": "CPU aljzatok",
+"label.cpuallocated": "CPU lefoglalva a VM-ek r\u00e9sz\u00e9re",
+"label.cpuallocatedghz": "Lek\u00f6t\u00f6ve",
+"label.cpulimit": "CPU korl\u00e1tok",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "CPU-aljzatok sz\u00e1ma",
+"label.cpuspeed": "CPU (MHz)",
+"label.cputotal": "\u00d6sszes CPU",
+"label.cputotalghz": "\u00d6sszes",
+"label.cpuused": "CPU haszn\u00e1lat",
+"label.create.nfs.secondary.staging.storage": "Create NFS Secondary Staging Store",
+"label.create.nfs.secondary.staging.store": "NFS m\u00e1sodlagos t\u00e1r l\u00e9trehoz\u00e1sa",
+"label.create.project": "Projekt l\u00e9trehoz\u00e1sa",
+"label.create.ssh.key.pair": "SSH kulcsp\u00e1r l\u00e9trehoz\u00e1sa",
+"label.create.template": "Sablon l\u00e9trehoz\u00e1sa",
+"label.create.vpn.connection": "VPN kapcsolat l\u00e9trehoz\u00e1sa",
+"label.created": "L\u00e9trehoz\u00e1s d\u00e1tuma",
+"label.created.by.system": "Created by system",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.current": "Jelnlegi",
+"label.currentpassword": "Current Password",
+"label.custom": "Egyedi",
+"label.custom.disk.offering": "Egyedi t\u00e1r aj\u00e1nlat",
+"label.customdisksize": "Egyedi merevlemez m\u00e9ret",
+"label.daily": "Napi",
+"label.dashboard": "M\u0171szert\u00e1bla",
+"label.data.disk.offering": "Adat merevlemez aj\u00e1nlat",
+"label.date": "D\u00e1tum",
+"label.day": "Nap",
+"label.day.of.month": "H\u00f3nap napja",
+"label.day.of.week": "H\u00e9t napja",
+"label.dc.name": "DC n\u00e9v",
+"label.decline.invitation": "Megh\u00edv\u00f3 elutas\u00edt\u00e1sa",
+"label.dedicate": "Dedik\u00e1l\u00e1s",
+"label.dedicate.cluster": "F\u00fcrt dedik\u00e1l\u00e1sa",
+"label.dedicate.host": "Kiszolg\u00e1l\u00f3 dedik\u00e1l\u00e1sa",
+"label.dedicate.pod": "Pod dedik\u00e1l\u00e1sa",
+"label.dedicate.vlan.vni.range": "Dedik\u00e1lt VLAN/VNI tartom\u00e1ny",
+"label.dedicate.zone": "Dedik\u00e1lt z\u00f3na",
+"label.dedicated": "Dedik\u00e1lt",
+"label.dedicated.vlan.vni.ranges": "Dedik\u00e1lt VLAN/VNI tartom\u00e1nyok",
+"label.default": "Alap\u00e9rtelmezett",
+"label.default.use": "Alap\u00e9rtelmezett haszn\u00e1lat",
+"label.default.view": "Alap\u00e9rtelmezett n\u00e9zet",
+"label.delete": "T\u00f6rl\u00e9s",
+"label.delete.acl.list": "ACL lista t\u00f6rl\u00e9se",
+"label.delete.affinity.group": "Affin\u00edt\u00e1si csoport t\u00f6rl\u00e9se",
+"label.delete.alerts": "T\u00f6rl\u00e9s riaszt\u00e1sok",
+"label.delete.baremetal.rack.configuration": "Baremetal rack konfigur\u00e1ci\u00f3 t\u00f6rl\u00e9se",
+"label.delete.bigswitchbcf": "BigSwitch BCF vez\u00e9rl\u0151 elt\u00e1vol\u00edt\u00e1sa",
+"label.delete.brocadevcs": "Brocade Vcs Switch t\u00f6rl\u00e9se",
+"label.delete.ciscoasa1000v": "CiscoASA1000v t\u00f6rl\u00e9se",
+"label.delete.ciscovnmc.resource": "CiscoVNMC er\u0151forr\u00e1s t\u00f6rl\u00e9se",
+"label.delete.events": "T\u00f6rl\u00e9s esem\u00e9nyek",
+"label.delete.f5": "F5 t\u00f6rl\u00e9se",
+"label.delete.gateway": "\u00c1tj\u00e1r\u00f3 t\u00f6rl\u00e9se",
+"label.delete.internal.lb": "Bels\u0151 LB t\u00f6rl\u00e9se",
+"label.delete.netscaler": "NetScaler t\u00f6rl\u00e9se",
+"label.delete.niciranvp": "Nvp vez\u00e9rl\u0151 t\u00f6rl\u00e9se",
+"label.delete.opendaylight.device": "OpenDaylight Controller t\u00f6rl\u00e9se",
+"label.delete.pa": "Palo Alto t\u00f6rl\u00e9se",
+"label.delete.portable.ip.range": "Hordozhat\u00f3 IP tartom\u00e1ny t\u00f6rl\u00e9se",
+"label.delete.project": "Projekt t\u00f6rl\u00e9se",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "SRX t\u00f6rl\u00e9se",
+"label.delete.ucs.manager": "UCS Manager t\u00f6rl\u00e9se",
+"label.delete.vpn.connection": "VPN kapcsolat t\u00f6rl\u00e9se",
+"label.delete.vpn.customer.gateway": "VPN \u00fcgyf\u00e9l kapu t\u00f6rl\u00e9se",
+"label.delete.vpn.gateway": "VPN kapu t\u00f6rl\u00e9se",
+"label.delete.vpn.user": "VPN felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se",
+"label.deleteprofile": "Profil t\u00f6rl\u00e9se",
+"label.deleting.failed": "T\u00f6rl\u00e9s sikertelen",
+"label.deleting.processing": "T\u00f6rl\u00e9s...",
+"label.deny": "Megtilt",
+"label.deploymentplanner": "Felhaszn\u00e1l\u00e1s tervez\u0151",
+"label.description": "Le\u00edr\u00e1s",
+"label.destinationphysicalnetworkid": "C\u00e9l fizikai h\u00e1l\u00f3zat ID",
+"label.destinationzoneid": "C\u00e9l z\u00f3na",
+"label.destroy": "Elpuszt\u00edt",
+"label.destroy.router": "Router elpuszt\u00edt\u00e1sa",
+"label.destroyvmgraceperiod": "VM elpuszt\u00edt\u00e1s t\u00fcrelmi id\u0151",
+"label.detaching.disk": "Merevlemez lev\u00e1laszt\u00e1sa",
+"label.details": "R\u00e9szletek",
+"label.deviceid": "Eszk\u00f6z ID",
+"label.devices": "Eszk\u00f6z\u00f6k",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP kiszolg\u00e1l\u00f3 t\u00edpus",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "Osztott h\u00e1l\u00f3zati IP c\u00edmek",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "Automatikus sk\u00e1l\u00e1z\u00e1s kikapcsol\u00e1sa",
+"label.disable.host": "Kiszolg\u00e1l\u00f3 kikapcsol\u00e1sa",
+"label.disable.network.offering": "H\u00e1l\u00f3zati aj\u00e1nlat kikapcsol\u00e1sa",
+"label.disable.provider": "Szolg\u00e1ltat\u00f3 kikapcsol\u00e1sa",
+"label.disable.vnmc.provider": "VNMC szolg\u00e1ltat\u00f3 kikapcsol\u00e1sa",
+"label.disable.vpc.offering": "VPC aj\u00e1nlat kikapcsol\u00e1sa",
+"label.disable.vpn": "T\u00e1voli VPN hozz\u00e1f\u00e9r\u00e9s kikapcsol\u00e1sa",
+"label.disabled": "Kikapcsolt",
+"label.disabling.vpn.access": "VPN hozz\u00e1f\u00e9r\u00e9s kikapcsol\u00e1sa",
+"label.disassociate.profile.blade": "Profil elv\u00e1laszt\u00e1sa a blade-t\u0151l",
+"label.disbale.vnmc.device": "VNMC eszk\u00f6sz kikapcsol\u00e1sa",
+"label.disconnected": "Utolj\u00e1ra lecsatlakozott",
+"label.disk": "Merevlemez",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Merevlemez aj\u00e1nlat r\u00e9szletei",
+"label.disk.offerings": "Merevlemez aj\u00e1nlatok",
+"label.disk.size": "Merevlemez m\u00e9ret",
+"label.disk.volume": "Merevlemez k\u00f6tet",
+"label.diskbytesreadrate": "Olvas\u00e1si r\u00e1ta (BPS)",
+"label.diskbyteswriterate": "\u00cdr\u00e1si r\u00e1ta (BPS)",
+"label.diskiopsmax": "IOPS maximum",
+"label.diskiopsmin": "IOPS minimum",
+"label.diskiopsreadrate": "Olvas\u00e1si r\u00e1ta (IOPS)",
+"label.diskiopswriterate": "\u00cdr\u00e1si r\u00e1ta (IOPS)",
+"label.diskioread": "Merevlemez \u00edr\u00e1s (IO)",
+"label.diskiowrite": "Merevlemez \u00edr\u00e1s (IO)",
+"label.diskkbsread": "Merevlemez olvas\u00e1s (Byte)",
+"label.diskkbswrite": "Merevlemez \u00edr\u00e1s (byte)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Merevlemez aj\u00e1nlat",
+"label.diskofferingid": "Merevlemez aj\u00e1nlat",
+"label.disksize": "Merevlemez m\u00e9ret (GB)",
+"label.disksizeallocated": "Merevlemez lefoglalva",
+"label.disksizeallocatedgb": "Lek\u00f6t\u00f6ve",
+"label.disksizetotal": "Merevlemez \u00f6sszes",
+"label.disksizetotalgb": "\u00d6sszes",
+"label.disksizeunallocatedgb": "Lefoglalatlan",
+"label.disksizeusedgb": "Haszn\u00e1lt",
+"label.display.text": "Megjelen\u00edtend\u0151 sz\u00f6veg",
+"label.displayname": "Megjelen\u00edtend\u0151 n\u00e9v",
+"label.displaytext": "Le\u00edr\u00e1s",
+"label.distributedvpcrouter": "Elosztott VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "Vend\u00e9g h\u00e1l\u00f3zatok DNS tartom\u00e1nya",
+"label.dns1": "1. DNS",
+"label.dns2": "2. DNS",
+"label.domain": "Dom\u00e9n",
+"label.domain.details": "Domain details",
+"label.domain.name": "Tartom\u00e1ny n\u00e9v",
+"label.domain.router": "Domain router",
+"label.domain.suffix": "DNS dom\u00e9n v\u00e9gz\u0151d\u00e9s (pl. xyz.com)",
+"label.domainid": "Tartom\u00e1ny ID",
+"label.domainname": "Dom\u00e9n",
+"label.domainpath": "Dom\u00e9n",
+"label.done": "K\u00e9sz",
+"label.double.quotes.are.not.allowed": "A kett\u0151s id\u00e9z\u0151jel nem enged\u00e9lyezett",
+"label.download.progress": "Let\u00f6lt\u00e9s folyamat",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "\u00daj helyre h\u00faz\u00e1s",
+"label.driver": "Driver",
+"label.duration.in.sec": "Id\u0151tartam (mp)",
+"label.edit": "Szerkeszt\u00e9s",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "ACL szab\u00e1ly szerkeszt\u00e9se",
+"label.edit.affinity.group": "Affin\u00edt\u00e1si csoport szerkeszt\u00e9se",
+"label.edit.lb.rule": "LB szab\u00e1ly m\u00f3dos\u00edt\u00e1sa",
+"label.edit.network.details": "H\u00e1l\u00f3zat r\u00e9szleteinek szerkeszt\u00e9se",
+"label.edit.project.details": "Projekt r\u00e9szletek szerkeszt\u00e9se",
+"label.edit.region": "R\u00e9gi\u00f3 szerkeszt\u00e9se",
+"label.edit.role": "Edit Role",
+"label.edit.rule": "Szab\u00e1ly m\u00f3dos\u00edt\u00e1sa",
+"label.edit.secondary.ips": "M\u00e1sodlagos IP c\u00edmek m\u00f3dos\u00edt\u00e1sa",
+"label.edit.tags": "Cimk\u00e9k szerkeszt\u00e9se",
+"label.edit.traffic.type": "Forgalom t\u00edpus szerkeszt\u00e9se",
+"label.edit.vpc": "VPC szerkeszt\u00e9se",
+"label.egress.default.policy": "Alap\u00e9rtelmezett egress szab\u00e1lyzat",
+"label.egress.rule": "Egress szab\u00e1ly",
+"label.egress.rules": "Egress szab\u00e1lyok",
+"label.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "Elasztikus",
+"label.email": "Email",
+"label.enable.autoscale": "Automatikus sk\u00e1l\u00e1z\u00e1s bekapcsol\u00e1sa",
+"label.enable.host": "Kiszolg\u00e1l\u00f3 bekapcsol\u00e1sa",
+"label.enable.network.offering": "H\u00e1l\u00f3zati aj\u00e1nlat bekapcsol\u00e1sa",
+"label.enable.provider": "Szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa",
+"label.enable.s3": "S3-alap\u00fa m\u00e1sodlagos t\u00e1r bekapcsol\u00e1sa",
+"label.enable.swift": "Swift enged\u00e9lyez\u00e9se",
+"label.enable.vnmc.device": "VNMC eszk\u00f6z bekapcsol\u00e1sa",
+"label.enable.vnmc.provider": "VNMC szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa",
+"label.enable.vpc.offering": "VPC aj\u00e1nlat bekapcsol\u00e1sa",
+"label.enable.vpn": "Enable Remote Access VPN",
+"label.enabling.vpn": "VPN enged\u00e9lyez\u00e9se",
+"label.enabling.vpn.access": "VPN hozz\u00e1f\u00e9r\u00e9s enged\u00e9lyez\u00e9se",
+"label.end.ip": "Utols\u00f3 IP",
+"label.end.reserved.system.ip": "Utols\u00f3 elk\u00fcl\u00f6n\u00edtett rendszer IP",
+"label.end.vlan": "Utols\u00f3 VLAN",
+"label.end.vxlan": "Utols\u00f3 VXLAN",
+"label.enddate": "D\u00e1tum szerint (v\u00e9g)",
+"label.endip": "Utols\u00f3 IP",
+"label.endipv4": "IPv4 utols\u00f3 IP",
+"label.endipv6": "IPv6 utols\u00f3 IP",
+"label.endpoint": "V\u00e9gpont",
+"label.endpoint.or.operation": "V\u00e9gpont vagy m\u0171velet",
+"label.endport": "Utols\u00f3 Port",
+"label.enter.token": "Add meg a token-t!",
+"label.error": "Hiba",
+"label.error.code": "Hibak\u00f3d",
+"label.error.something.went.wrong.please.correct.the.following": "Valami nem j\u00f3! Jav\u00edtsd a k\u00f6vetkez\u0151ket:",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP titkos\u00edt\u00e1s",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "ESP \u00e9lettartam (mp)",
+"label.esppolicy": "ESP szab\u00e1lyzat",
+"label.event": "Esem\u00e9ny",
+"label.event.archived": "Esem\u00e9ny archiv\u00e1lva",
+"label.event.deleted": "Esem\u00e9ny t\u00f6r\u00f6lve",
+"label.events": "Esem\u00e9nyek",
+"label.every": "Minden",
+"label.example": "P\u00e9lda",
+"label.expunge": "T\u00f6rl\u00e9s",
+"label.external.link": "K\u00fcls\u0151 hivatkoz\u00e1s",
+"label.f5": "F5",
+"label.f5.details": "F5 r\u00e9szletek",
+"label.failed": "Hiba",
+"label.featured": "Kiemelt",
+"label.fetch.latest": "Legfrissebb let\u00f6lt\u00e9se",
+"label.filterby": "Sz\u0171r\u00e9s",
+"label.fingerprint": "\u00dajlenyomat",
+"label.firewall": "T\u0171zfal",
+"label.firstname": "Keresztn\u00e9v",
+"label.firstname.lower": "keresztn\u00e9v",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "Form\u00e1tum",
+"label.friday": "P\u00e9ntek",
+"label.full": "Teljes",
+"label.full.path": "Teljes el\u00e9r\u00e9si \u00fatvonal",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "T\u00edpus",
+"label.fwdevicestate": "\u00c1llapot",
+"label.gateway": "\u00c1tj\u00e1r\u00f3",
+"label.general.alerts": "\u00c1ltal\u00e1nos riaszt\u00e1sok",
+"label.generating.url": "URL gener\u00e1l\u00e1sa",
+"label.global.settings": "Glob\u00e1lis be\u00e1ll\u00edt\u00e1sok",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS konfigur\u00e1ci\u00f3",
+"label.glustervolume": "K\u00f6tet",
+"label.go.step.2": "2. l\u00e9p\u00e9sre",
+"label.go.step.3": "3. l\u00e9p\u00e9sre",
+"label.go.step.4": "4. l\u00e9p\u00e9sre",
+"label.go.step.5": "5. l\u00e9psre",
+"label.gpu": "GPU",
+"label.group": "Csoport",
+"label.group.by.account": "Sz\u00e1ml\u00e1nk\u00e9nt csoportos\u00edtva",
+"label.group.by.cluster": "F\u00fcrt\u00f6nk\u00e9nt csoportos\u00edtva",
+"label.group.by.pod": "Pod-onk\u00e9nt csoportos\u00edtva",
+"label.group.by.zone": "Z\u00f3n\u00e1nk\u00e9nt csoportos\u00edtva",
+"label.group.optional": "Csoport (opcion\u00e1lis)",
+"label.gslb": "GSLB",
+"label.gslb.assigned.lb": "Hozz\u00e1rendelt terhel\u00e9seloszt\u00e1s",
+"label.gslb.assigned.lb.more": "T\u00f6bb terhel\u00e9seloszt\u00e1s hozz\u00e1rendel\u00e9se",
+"label.gslb.delete": "GSLB t\u00f6rl\u00e9se",
+"label.gslb.details": "GSLB r\u00e9szletek",
+"label.gslb.lb.details": "Terhel\u00e9seloszt\u00f3 r\u00e9szletek",
+"label.gslb.lb.remove": "Terhel\u00e9seloszt\u00e1s t\u00f6rl\u00e9se ebb\u0151l a GSLB-b\u0151l",
+"label.gslb.service": "GSLB szolg\u00e1ltat\u00e1s",
+"label.gslb.service.private.ip": "GSLB szolg\u00e1ltat\u00e1s priv\u00e1t IP",
+"label.gslb.service.public.ip": "GSLB szolg\u00e1ltat\u00e1s publikus IP",
+"label.gslbdomainname": "GSLB dom\u00e9n n\u00e9v",
+"label.gslbprovider": "GSLB szolg\u00e1ltat\u00e1s",
+"label.gslbproviderprivateip": "GSLB szolg\u00e1ltat\u00e1s priv\u00e1t IP",
+"label.gslbproviderpublicip": "GSLB szolg\u00e1ltat\u00e1s publikus IP",
+"label.gslbservicetype": "Szolg\u00e1ltat\u00e1s t\u00edpus",
+"label.guest": "Vend\u00e9g",
+"label.guest.cidr": "Vend\u00e9g CIDR",
+"label.guest.end.ip": "Utols\u00f3 veng\u00e9g IP",
+"label.guest.gateway": "Vend\u00e9g \u00e1tj\u00e1r\u00f3",
+"label.guest.ip": "Vend\u00e9g IP c\u00edm",
+"label.guest.ip.range": "Vend\u00e9g IP tartom\u00e1ny",
+"label.guest.netmask": "Vend\u00e9g h\u00e1l\u00f3zati maszk",
+"label.guest.network.details": "Vend\u00e9g h\u00e1l\u00f3zat r\u00e9szletek",
+"label.guest.networks": "Vend\u00e9g h\u00e1l\u00f3zatok",
+"label.guest.start.ip": "Kezd\u0151 vend\u00e9g IP",
+"label.guest.traffic": "Vend\u00e9g forgalom",
+"label.guestcidraddress": "Vend\u00e9g CIDR",
+"label.guestendip": "Utols\u00f3 veng\u00e9g IP",
+"label.guestgateway": "Vend\u00e9g \u00e1tj\u00e1r\u00f3",
+"label.guestipaddress": "Vend\u00e9g IP c\u00edm",
+"label.guestiptype": "Vend\u00e9g t\u00edpus",
+"label.guestnetmask": "Vend\u00e9g h\u00e1l\u00f3zati maszk",
+"label.guestnetworkid": "H\u00e1l\u00f3zat ID",
+"label.guestnetworkname": "H\u00e1l\u00f3zat n\u00e9v",
+"label.guestosid": "OS t\u00edpus",
+"label.gueststartip": "Kezd\u0151 vend\u00e9g IP",
+"label.guestvlanrange": "VLAN tartom\u00e1ny(ok)",
+"label.haenable": "HA bekapcsolva",
+"label.hahost": "HA bekapcsolva",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Er\u0151s\u00edtsd meg, hogy pillanatfelv\u00e9telt k\u00e9rsz err\u0151l a k\u00f6tetr\u0151l!",
+"label.health.check": "Ellen\u0151rz\u00e9s",
+"label.health.check.advanced.options": "Halad\u00f3 be\u00e1ll\u00edt\u00e1sok:",
+"label.health.check.configurations.options": "Beall\u00edt\u00e1sok:",
+"label.health.check.interval.in.sec": "Ellen\u0151rz\u00e9s id\u0151k\u00f6z (mp)",
+"label.health.check.message.desc": "A terhel\u00e9seloszt\u00f3d aut\u00f3matikusan fog elen\u0151rz\u00e9seket v\u00e9grehajtani a cloudstack p\u00e9ld\u00e1nyokon \u00e9s a forgalmat a m\u0171k\u00f6d\u0151 p\u00e9ld\u00e1nyokhoz \u00edr\u00e1ny\u00edtja",
+"label.health.check.wizard": "Health Check Wizard",
+"label.healthy.threshold": "Eg\u00e9szs\u00e9ges k\u00fcsz\u00f6b",
+"label.help": "Seg\u00edts\u00e9g",
+"label.hide.ingress.rule": "Ingress szab\u00e1ly rejt\u00e9se",
+"label.hints": "Tippek",
+"label.home": "Kezd\u0151lap",
+"label.host": "Kiszolg\u00e1l\u00f3",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "Kiszolg\u00e1l\u00f3 n\u00e9v",
+"label.host.tag": "Kiszolg\u00e1l\u00f3 c\u00edmke",
+"label.hostid": "Kiszolg\u00e1l\u00f3",
+"label.hostname": "Kiszolg\u00e1l\u00f3",
+"label.hostnamelabel": "Kiszolg\u00e1l\u00f3 n\u00e9v",
+"label.hosts": "Kiszolg\u00e1l\u00f3k",
+"label.hosttags": "Kiszolg\u00e1l\u00f3 c\u00edmk\u00e9k",
+"label.hourly": "\u00d3r\u00e1nk\u00e9nt",
+"label.hypervisor": "Hipervizor",
+"label.hypervisor.capabilities": "Hipervizor k\u00e9pess\u00e9gek",
+"label.hypervisor.type": "Hipervizor t\u00edpus",
+"label.hypervisors": "Hipervizorok",
+"label.hypervisorsnapshotreserve": "Hipervizor Snapshot Reserve",
+"label.hypervisortype": "Hipervizor",
+"label.hypervisorversion": "Hipervizor verzi\u00f3",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "ICMP k\u00f3d",
+"label.icmptype": "ICMP t\u00edpus",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE titkos\u00edt\u00e1s",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE \u00e9lettartam (mp)",
+"label.ikepolicy": "IKE szab\u00e1lyzat",
+"label.info": "Inf\u00f3",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastrukt\u00fara",
+"label.ingress.rule": "Ingress szab\u00e1ly",
+"label.initiated.by": "Kezdem\u00e9nyez\u0151",
+"label.insideportprofile": "Inside Port Profile",
+"label.installwizard.addclusterintro.subtitle": "Mi a f\u00fcrt?",
+"label.installwizard.addclusterintro.title": "Csin\u00e1ljunk egy f\u00fcrt\u00f6t!",
+"label.installwizard.addhostintro.subtitle": "Mi a kiszolg\u00e1l\u00f3?",
+"label.installwizard.addhostintro.title": "Regisztr\u00e1ljunk egy kiszolg\u00e1l\u00f3t!",
+"label.installwizard.addpodintro.subtitle": "Mi a pod?",
+"label.installwizard.addpodintro.title": "Csin\u00e1ljunk egy pod-ot!",
+"label.installwizard.addprimarystorageintro.subtitle": "Mi az els\u0151dleges t\u00e1r?",
+"label.installwizard.addprimarystorageintro.title": "Hozzuk l\u00e9tre az els\u0151dleges t\u00e1rol\u00f3t!",
+"label.installwizard.addsecondarystorageintro.subtitle": "Mi a m\u00e1sodlagos t\u00e1r?",
+"label.installwizard.addsecondarystorageintro.title": "Hozzuk l\u00e9tre a m\u00e1sodlagos t\u00e1rol\u00f3t!",
+"label.installwizard.addzoneintro.subtitle": "Mi a z\u00f3na?",
+"label.installwizard.addzoneintro.title": "Hozzunk l\u00e9tre egy z\u00f3n\u00e1t!",
+"label.installwizard.click.launch": "Kattints az ind\u00edt\u00e1s gombra!",
+"label.installwizard.subtitle": "Ez a p\u00e1rbesz\u00e9dablak seg\u00edt konfigur\u00e1lni a CloudStack&#8482 rendszered",
+"label.installwizard.title": "\u00dcdv\u00f6z\u00f6l a CloudStack&#8482",
+"label.instance": "P\u00e9ld\u00e1ny",
+"label.instance.name": "P\u00e9ld\u00e1ny n\u00e9v",
+"label.instance.scaled.up": "P\u00e9ld\u00e1ny \u00e1tm\u00e9retezve a k\u00e9rt aj\u00e1nlathoz",
+"label.instancename": "Bels\u0151 n\u00e9v",
+"label.instanceport": "P\u00e9ld\u00e1ny port",
+"label.instances": "P\u00e9ld\u00e1nyok",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny",
+"label.internal.dns.1": "1. bels\u0151 DNS",
+"label.internal.dns.2": "2. bels\u0151 DNS",
+"label.internal.lb": "Bels\u0151 LB",
+"label.internal.lb.details": "Bels\u0151 LB r\u00e9szletek",
+"label.internaldns1": "1. bels\u0151 DNS",
+"label.internaldns2": "2. bels\u0151 DNS",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Lek\u00e9rdez\u00e9s id\u0151k\u00f6ze (mp)",
+"label.intervaltype": "Id\u0151k\u00f6z t\u00edpus",
+"label.introduction.to.cloudstack": "Bemutatkozik a CloudStack&#8482",
+"label.invalid.integer": "\u00c9rv\u00e9nytelen eg\u00e9sz sz\u00e1m",
+"label.invalid.number": "\u00c9rv\u00e9nytelen sz\u00e1m",
+"label.invitations": "Megh\u00edv\u00f3k",
+"label.invite": "Meghiv\u00e1s",
+"label.invite.to": "Megh\u00edv\u00e1s:",
+"label.invited.accounts": "Megh\u00edvottak",
+"label.ip": "IP",
+"label.ip.allocations": "IP c\u00edmfoglal\u00e1sok",
+"label.ip.or.fqdn": "IP vagy FQDN",
+"label.ip.range": "IP tartom\u00e1ny",
+"label.ip.ranges": "IP tartom\u00e1nyok",
+"label.ip4dns1": "IPv4 1. DNS",
+"label.ip4dns2": "IPv4 2. DNS",
+"label.ip4gateway": "IPv4 \u00e1tj\u00e1r\u00f3",
+"label.ip4netmask": "IPv4 h\u00e1l\u00f3zati maszk",
+"label.ip6address": "IPv6 IP c\u00edm",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 1. DNS",
+"label.ip6dns2": "IPv6 2. DNS",
+"label.ip6gateway": "IPv6 \u00e1tj\u00e1r\u00f3",
+"label.ipaddress": "IP c\u00edm",
+"label.ipaddress1": "IP c\u00edm",
+"label.ipaddress2": "IP c\u00edm",
+"label.iplimit": "Publikus IP korl\u00e1tok",
+"label.ips": "IP c\u00edmek",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "IP c\u00edmek \u00f6sszesen",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 1. DNS",
+"label.ipv4.dns2": "IPv4 2. DNS",
+"label.ipv6.dns1": "IPv6 1. DNS",
+"label.ipv6.dns2": "IPv6 2. DNS",
+"label.iqn": "C\u00e9l IQN",
+"label.is.redundant.router": "Redund\u00e1ns",
+"label.is.shared": "Osztott",
+"label.isadvanced": "Halad\u00f3 szint\u0171 be\u00e1ll\u00edt\u00e1sok",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Egyedi merevlemez m\u00e9ret",
+"label.iscustomizeddiskiops": "Egyedi IOPS",
+"label.iscustomizediops": "Egyedi IOPS",
+"label.isdedicated": "Dedik\u00e1lt",
+"label.isdefault": "Alap\u00e9rtelmezett",
+"label.isdynamicallyscalable": "Dinakikusan sk\u00e1l\u00e1zhat\u00f3",
+"label.isextractable": "Kicsomagolhat\u00f3",
+"label.isfeatured": "Kiemelt",
+"label.isforced": "T\u00f6rl\u00e9s kik\u00e9nyszer\u00edt\u00e9se",
+"label.ismanaged": "Vez\u00e9relt",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Izol\u00e1lt h\u00e1l\u00f3zatok",
+"label.isolatedpvlanid": "M\u00e1sodlagos izol\u00e1lt VLAN ID",
+"label.isolation.method": "Izol\u00e1ci\u00f3 m\u00f3dszer",
+"label.isolation.mode": "Izol\u00e1ci\u00f3 m\u00f3d",
+"label.isolationmethod": "Izol\u00e1ci\u00f3 m\u00f3dszer",
+"label.isolationmethods": "Izol\u00e1ci\u00f3 m\u00f3dszer",
+"label.isolationuri": "Izol\u00e1ci\u00f3 URI",
+"label.isoname": "Kapcsolt ISO",
+"label.isos": "ISO-k",
+"label.ispasswordenabled": "Jelsz\u00f3 bekapcsolva",
+"label.ispersistent": "Perzisztens",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Publikus",
+"label.isready": "K\u00e9szen \u00e1ll",
+"label.isredundantrouter": "Redund\u00e1ns router",
+"label.isrouting": "\u00datvonalv\u00e1laszt\u00e1s",
+"label.isshared": "Osztott",
+"label.issourcenat": "Forr\u00e1s NAT",
+"label.isstaticnat": "Statikus NAT",
+"label.issystem": "Rendszer",
+"label.isvolatile": "Ill\u00e9kony",
+"label.item.listing": "Lista",
+"label.japanese.keyboard": "Jap\u00e1n billenty\u0171zet",
+"label.keep": "Megtart\u00e1s",
+"label.keep.colon": "Megtart:",
+"label.key": "Kulcs",
+"label.keyboard": "Billenty\u0171zet kioszt\u00e1s",
+"label.keyboardtype": "Billenty\u0171zet t\u00edpus",
+"label.keypair": "SSH kulcsp\u00e1r",
+"label.kvmnetworklabel": "KVM traffic label",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"label.label": "C\u00edmke",
+"label.lang.arabic": "Arab",
+"label.lang.brportugese": "Brazil-portug\u00e1l",
+"label.lang.catalan": "Katal\u00e1n",
+"label.lang.chinese": "K\u00ednai (egyszer\u0171s\u00edtett)",
+"label.lang.dutch": "Holland (Hollandia)",
+"label.lang.english": "Angol",
+"label.lang.french": "Francia",
+"label.lang.german": "N\u00e9met",
+"label.lang.hungarian": "Magyar",
+"label.lang.italian": "Olasz",
+"label.lang.japanese": "Jap\u00e1n",
+"label.lang.korean": "K\u00f3reai",
+"label.lang.norwegian": "Norv\u00e9g",
+"label.lang.polish": "Lengyel",
+"label.lang.russian": "Orosz",
+"label.lang.spanish": "Spanyol",
+"label.last.updated": "Last Update",
+"label.lastname": "Csal\u00e1dn\u00e9v",
+"label.lastname.lower": "csal\u00e1dn\u00e9v",
+"label.latest.events": "Utols\u00f3 esem\u00e9nyek",
+"label.launch": "Ind\u00edt\u00e1s",
+"label.launch.vm": "VM ind\u00edt\u00e1sa",
+"label.launch.zone": "Z\u00f3na ind\u00edt\u00e1sa",
+"label.lb.algorithm.leastconn": "Legkevesebb kapcsolat",
+"label.lb.algorithm.roundrobin": "K\u00f6rbe forg\u00f3",
+"label.lb.algorithm.source": "Forr\u00e1s",
+"label.lbdevicededicated": "Dedik\u00e1lt",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "T\u00edpus",
+"label.lbdevicestate": "\u00c1llapot",
+"label.lbtype": "Terhel\u00e9seloszt\u00f3 t\u00edpus",
+"label.ldap.configuration": "LDAP konfigur\u00e1ci\u00f3",
+"label.ldap.group.name": "LDAP csoport",
+"label.ldap.port": "LDAP port",
+"label.level": "Szint",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "Terhel\u00e9seloszt\u00f3",
+"label.load.balancing.policies": "Terhel\u00e9seloszt\u00f3 szab\u00e1lyok",
+"label.loadbalancerinstance": "Hozz\u00e1rendelt VM-ek",
+"label.loadbalancerrule": "Terhel\u00e9seloszt\u00f3 szab\u00e1ly",
+"label.loadbalancing": "Terhel\u00e9seloszt\u00e1s",
+"label.loading": "Bet\u00f6lt\u00e9s",
+"label.local": "Helyi",
+"label.local.storage": "Helyi t\u00e1r",
+"label.local.storage.enabled": "Helyi t\u00e1r bekapcsol\u00e1sa felhaszn\u00e1l\u00f3i VM-ek r\u00e9sz\u00e9re",
+"label.local.storage.enabled.system.vms": "Helyi t\u00e1r bekapcsol\u00e1sa a rendszer VM sz\u00e1m\u00e1ra",
+"label.localstorageenabled": "Helyi t\u00e1r bekapcsol\u00e1sa felhaszn\u00e1l\u00f3i VM-ek r\u00e9sz\u00e9re",
+"label.localstorageenabledforsystemvm": "Helyi t\u00e1r bekapcsol\u00e1sa a rendszer VM sz\u00e1m\u00e1ra",
+"label.login": "Bejelentkez\u00e9s",
+"label.logout": "Kijelentkez\u00e9s",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "Sz\u00e1mla projekt-tulajdonoss\u00e1 t\u00e9tele",
+"label.makeredundant": "Redund\u00e1nss\u00e1 t\u00e9tel",
+"label.manage": "Vez\u00e9rl\u00e9s",
+"label.manage.resources": "Er\u0151forr\u00e1sok vez\u00e9rl\u00e9se",
+"label.management": "Vez\u00e9rl\u00e9s",
+"label.management.ips": "Vez\u00e9rl\u0151 IP c\u00edm",
+"label.management.server": "Vez\u00e9rl\u0151 szerver",
+"label.max.primary.storage": "Max. els\u0151dleges (GiB)",
+"label.max.secondary.storage": "Max. m\u00e1sodlagos (GiB)",
+"label.maxcpu": "CPU magok max.",
+"label.maxerrorretry": "\u00dajrapr\u00f3b\u00e1lkoz\u00e1s max.",
+"label.maxguestslimit": "Max guest limit",
+"label.maximum": "Maximum",
+"label.maxinstance": "P\u00e9ld\u00e1nyok maxim\u00e1lis sz\u00e1ma",
+"label.maxiops": "IOPS maximum",
+"label.maxmemory": "Max. mem\u00f3ria (MB)",
+"label.maxnetwork": "Max. h\u00e1l\u00f3zatok",
+"label.maxpublicip": "Publikus IP c\u00edmek max.",
+"label.maxsnapshot": "Pillanatfelv\u00e9telek max.",
+"label.maxtemplate": "Sablonok max.",
+"label.maxuservm": "Felhaszn\u00e1l\u00f3i VMek max.",
+"label.maxvolume": "K\u00f6tetek max.",
+"label.maxvpc": "VPC-k max.",
+"label.may.continue": "Most folytathatod",
+"label.memallocated": "Mem\u00f3ria foglal\u00e1s",
+"label.memory": "Mem\u00f3ria",
+"label.memory.total": "Tejes mem\u00f3ria",
+"label.memory.used": "Haszn\u00e1lt mem\u00f3ria",
+"label.memoryallocated": "Allok\u00e1lt mem\u00f3ria",
+"label.memoryallocatedgb": "Lek\u00f6t\u00f6ve",
+"label.memorylimit": "Mem\u00f3ria korl\u00e1tok (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Allok\u00e1lt mem\u00f3ria",
+"label.memorytotalgb": "\u00d6sszes",
+"label.memoryusedgb": "Haszn\u00e1lt",
+"label.menu.all.accounts": "Minden sz\u00e1mla",
+"label.menu.all.instances": "Minden p\u00e9ld\u00e1ny",
+"label.menu.community.isos": "K\u00f6z\u00f6ss\u00e9gi ISO-k",
+"label.menu.community.templates": "K\u00f6z\u00f6ss\u00e9gi sablonok",
+"label.menu.destroyed.instances": "Elpuszt\u00edtott p\u00e9ld\u00e1nyok",
+"label.menu.featured.isos": "Kiemelt ISO-k",
+"label.menu.featured.templates": "Kiemelt sablonok",
+"label.menu.ipaddresses": "IP c\u00edm",
+"label.menu.my.accounts": "Saj\u00e1t sz\u00e1ml\u00e1k",
+"label.menu.my.instances": "Saj\u00e1t p\u00e9ld\u00e1nyok",
+"label.menu.my.isos": "Saj\u00e1t ISO-k",
+"label.menu.my.templates": "Saj\u00e1t sablonok",
+"label.menu.physical.resources": "Fizikai er\u0151forr\u00e1sok",
+"label.menu.regions": "R\u00e9gi\u00f3k",
+"label.menu.running.instances": "Fut\u00f3 p\u00e9ld\u00e1nyok",
+"label.menu.security.groups": "Biztons\u00e1gi csoportok",
+"label.menu.service.offerings": "Szolg\u00e1ltat\u00e1s aj\u00e1nlatok",
+"label.menu.sshkeypair": "SSH kulcsp\u00e1r",
+"label.menu.stopped.instances": "Le\u00e1ll\u00edtott p\u00e9ld\u00e1nyok",
+"label.menu.storage": "T\u00e1r",
+"label.menu.system": "Rendszer",
+"label.menu.virtual.appliances": "Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9kek",
+"label.menu.virtual.resources": "Virtu\u00e1lis er\u0151forr\u00e1sok",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU foglal\u00e1s",
+"label.metrics.cpu.usage": "CPU haszn\u00e1lat",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Olvas\u00e1s",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "\u00cdr\u00e1s",
+"label.metrics.memory.usage": "Mem\u00f3ria haszn\u00e1lat",
+"label.metrics.network.read": "Olvas\u00e1s",
+"label.metrics.network.usage": "H\u00e1l\u00f3zat haszn\u00e1lat",
+"label.metrics.network.write": "\u00cdr\u00e1s",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "P\u00e9ld\u00e1ny mozgat\u00e1sa:",
+"label.migrate.instance.to.host": "P\u00e9ld\u00e1ny mozgat\u00e1sa m\u00e1sik kiszolg\u00e1l\u00f3ra",
+"label.migrate.instance.to.ps": "P\u00e9ld\u00e1ny mozgat\u00e1sa m\u00e1sik els\u0151dleges t\u00e1rra",
+"label.migrate.lb.vm": "Terhel\u00e9seloszt\u00f3 VM mozgat\u00e1sa",
+"label.migrate.router.to": "Router mozgat\u00e1sa:",
+"label.migrate.systemvm.to": "Rendszer Vm mozgat\u00e1sa:",
+"label.migrate.to.host": "Mozgat\u00e1s kiszolg\u00e1l\u00f3ra",
+"label.migrate.to.storage": "Mozgat\u00e1s t\u00e1rra",
+"label.migrate.volume": "K\u00f6tet mozgat\u00e1sa",
+"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": "K\u00f6tet mozgat\u00e1sa m\u00e1sik els\u0151dleges t\u00e1rra",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "percben",
+"label.minimum": "Minimum",
+"label.mininstance": "P\u00e9ld\u00e1nyok minim\u00e1lis sz\u00e1ma",
+"label.miniops": "IOPS minimum",
+"label.minute.past.hour": "Perc",
+"label.minutes.past.hour": "percben az eg\u00e9sz \u00f3ra ut\u00e1n",
+"label.monday": "H\u00e9tf\u0151",
+"label.monthly": "Havi",
+"label.more.templates": "Tov\u00e1bbi sablonok",
+"label.move.down.row": "Egy sorral lejjebb",
+"label.move.to.bottom": "Alj\u00e1ra",
+"label.move.to.top": "Tetej\u00e9re",
+"label.move.up.row": "Egy sorral feljebb",
+"label.my.account": "Saj\u00e1t sz\u00e1ml\u00e1m",
+"label.my.network": "Saj\u00e1t h\u00e1l\u00f3zat",
+"label.my.templates": "Saj\u00e1t sablonok",
+"label.na": "Nem \u00e9rtelmezett",
+"label.name": "N\u00e9v",
+"label.name.optional": "N\u00e9v (opcion\u00e1lis)",
+"label.nat": "BigSwitch BCF NAT bekapcsolva",
+"label.nat.port.range": "NAT port tartom\u00e1ny",
+"label.netmask": "H\u00e1l\u00f3zati maszk",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler r\u00e9szletek",
+"label.network": "H\u00e1l\u00f3zatok",
+"label.network.acl": "H\u00e1l\u00f3zati ACL",
+"label.network.acls": "H\u00e1l\u00f3zati ACL-ek",
+"label.network.addvm": "H\u00e1l\u00f3zat felv\u00e9tele a VM-hez",
+"label.network.desc": "H\u00e1l\u00f3zat le\u00edr\u00e1s",
+"label.network.details": "H\u00e1l\u00f3zat r\u00e9szletei",
+"label.network.device": "H\u00e1l\u00f3zati eszk\u00f6z",
+"label.network.device.type": "H\u00e1l\u00f3zati eszk\u00f6z t\u00edpus",
+"label.network.domain": "Network Domain",
+"label.network.label.display.for.blank.value": "Alap\u00e9rtelmezett \u00e1tj\u00e1r\u00f3 haszn\u00e1lata",
+"label.network.name": "H\u00e1l\u00f3zat n\u00e9v",
+"label.network.offering": "H\u00e1l\u00f3zat aj\u00e1nlat",
+"label.network.offering.details": "H\u00e1l\u00f3zat aj\u00e1nlat r\u00e9szletei",
+"label.network.offering.display.text": "H\u00e1l\u00f3zat aj\u00e1nlat megjelen\u00edtend\u0151 sz\u00f6veg",
+"label.network.offering.name": "H\u00e1l\u00f3zat aj\u00e1nlat neve",
+"label.network.offerings": "H\u00e1l\u00f3zati aj\u00e1nlatok",
+"label.network.service.providers": "H\u00e1l\u00f3zat szolg\u00e1ltat\u00f3k",
+"label.networkcidr": "H\u00e1l\u00f3zat CIDR",
+"label.networkdevicetype": "T\u00edpus",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network Domain",
+"label.networkid": "H\u00e1l\u00f3zatok",
+"label.networking.and.security": "H\u00e1l\u00f3zat \u00e9s biztons\u00e1g",
+"label.networkkbsread": "H\u00e1l\u00f3zat olvas\u00e1s",
+"label.networkkbswrite": "H\u00e1l\u00f3zat \u00edr\u00e1s",
+"label.networklimit": "H\u00e1l\u00f3zat korl\u00e1tok",
+"label.networkname": "H\u00e1l\u00f3zat n\u00e9v",
+"label.networkofferingdisplaytext": "H\u00e1l\u00f3zat aj\u00e1nlat",
+"label.networkofferingid": "H\u00e1l\u00f3zat aj\u00e1nlat",
+"label.networkofferingidtext": "H\u00e1l\u00f3zat aj\u00e1nlat ID",
+"label.networkofferingname": "H\u00e1l\u00f3zat aj\u00e1nlat",
+"label.networkrate": "H\u00e1l\u00f3zati r\u00e1ta (Mb/mp)",
+"label.networkread": "H\u00e1l\u00f3zat olvas\u00e1s",
+"label.networks": "H\u00e1l\u00f3zatok",
+"label.networktype": "H\u00e1l\u00f3zat t\u00edpus",
+"label.networkwrite": "H\u00e1l\u00f3zat \u00edr\u00e1s",
+"label.new": "\u00daj",
+"label.new.password": "\u00daj jelsz\u00f3",
+"label.new.project": "\u00daj projekt",
+"label.new.vm": "\u00daj VM",
+"label.newdiskoffering": "\u00daj aj\u00e1nlat",
+"label.newsize": "\u00daj m\u00e9ret (GB)",
+"label.next": "K\u00f6vetkez\u0151",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS t\u00e1r",
+"label.nfscachenfsserver": "NFS kiszolg\u00e1l\u00f3",
+"label.nfscachepath": "\u00datvonal",
+"label.nfscachezoneid": "Z\u00f3na",
+"label.nfsserver": "NFS kiszolg\u00e1l\u00f3",
+"label.nicadaptertype": "NIC adapter t\u00edpus",
+"label.nicira.controller.address": "Vez\u00e9rl\u0151 c\u00edm",
+"label.nicira.nvp.details": "Nicira NVP r\u00e9szletek",
+"label.nics": "NIC-ek",
+"label.no": "Nem",
+"label.no.actions": "Nincs el\u00e9rhet\u0151 m\u0171velet",
+"label.no.alerts": "Nem voltak riaszt\u00e1sok a k\u00f6zelm\u00faltban",
+"label.no.data": "Nincs megjelen\u00edtend\u0151 adat",
+"label.no.errors": "Nem voltak hib\u00e1k a k\u00f6zelm\u00faltban",
+"label.no.grouping": "(nincs csoportos\u00edt\u00e1s)",
+"label.no.isos": "Nincsenek el\u00e9rhet\u0151 ISO-k",
+"label.no.items": "Nincsenek el\u00e9rhet\u0151 elemek",
+"label.no.security.groups": "Nincs el\u00e9rhet\u0151 biztons\u00e1gi csoport",
+"label.none": "Nincs",
+"label.noselect": "Nem, k\u00f6szi!",
+"label.not.found": "Nem tal\u00e1lhat\u00f3",
+"label.notifications": "\u00c9rtes\u00edt\u00e9sek",
+"label.num.cpu.cores": "CPU magok sz\u00e1ma",
+"label.number": "#Rule",
+"label.number.of.clusters": "F\u00fcrt\u00f6k sz\u00e1ma",
+"label.number.of.hosts": "Kiszolg\u00e1l\u00f3k sz\u00e1ma",
+"label.number.of.pods": "Pod-ok sz\u00e1ma:",
+"label.number.of.system.vms": "Rendszer VM-ek sz\u00e1ma",
+"label.number.of.virtual.routers": "Virtu\u00e1lis routerek sz\u00e1ma",
+"label.number.of.zones": "Z\u00f3n\u00e1k sz\u00e1ma",
+"label.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "\u00dajrapr\u00f3b\u00e1lkoz\u00e1sok sz\u00e1ma",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "h\u00f3nap",
+"label.offerha": "Offer HA",
+"label.ok": "Rendben",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight vez\u00e9rl\u0151",
+"label.opendaylight.controllerdetail": "OpenDaylight vez\u00e9rl\u0151 r\u00e9szletek",
+"label.opendaylight.controllers": "OpenDaylight vez\u00e9rl\u0151k",
+"label.optional": "Opcion\u00e1lis",
+"label.order": "Sorrend",
+"label.oscategoryid": "OS preferencia",
+"label.ostypeid": "OS t\u00edpus",
+"label.ostypename": "OS t\u00edpus",
+"label.other": "M\u00e1s",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Vend\u00e9g forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa",
+"label.override.public.traffic": "Publikus forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa",
+"label.overrideguesttraffic": "Vend\u00e9g forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa",
+"label.overridepublictraffic": "Publikus forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa",
+"label.ovm3cluster": "Nat\u00edv f\u00fcrt\u00f6z\u00e9s",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Birtokolt publikus IP c\u00edmek",
+"label.owner.account": "Tulajdonos sz\u00e1mla",
+"label.owner.domain": "Owner Domain",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto r\u00e9szletek",
+"label.palp": "Palo Alto log profil",
+"label.parent.domain": "Sz\u00fcl\u0151 dom\u00e9n",
+"label.parentname": "Sz\u00fcl\u0151",
+"label.passive": "Passz\u00edv",
+"label.password": "Jelsz\u00f3",
+"label.password.reset.confirm": "A jelsz\u00f3 \u00fajrabe\u00e1ll\u00edtva:",
+"label.passwordenabled": "Jelsz\u00f3 bekapcsolva",
+"label.path": "\u00datvonal",
+"label.patp": "Palo Alto fenyeget\u00e9s profil",
+"label.pavr": "Virtu\u00e1lis router",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Fizikai h\u00e1l\u00f3zat",
+"label.physical.network.id": "Fizikai h\u00e1l\u00f3zat ID",
+"label.physical.network.name": "A fizikai h\u00e1l\u00f3zat neve",
+"label.physicalnetworkid": "Fizikai h\u00e1l\u00f3zat",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS jelsz\u00f3",
+"label.ping.cifs.username": "PING CIFS felhaszn\u00e1l\u00f3",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping \u00fatvonal",
+"label.ping.storage.ip": "PING t\u00e1r IP",
+"label.plannermode": "Tervez\u0151 m\u00f3d",
+"label.please.complete.the.following.fields": "K\u00e9rlek t\u00f6ltsd ki ki a k\u00f6vetkez\u0151 mez\u0151ket",
+"label.please.specify.netscaler.info": "Please specify Netscaler info",
+"label.please.wait": "K\u00e9rlek v\u00e1rj!",
+"label.plugin.details": "Plugin r\u00e9szletek",
+"label.plugins": "Plugin-ek",
+"label.pod": "Pod",
+"label.pod.dedicated": "Pod dedik\u00e1lva",
+"label.pod.name": "Pod n\u00e9v",
+"label.podid": "Pod",
+"label.podname": "Pod n\u00e9v",
+"label.pods": "Pod-ok",
+"label.port": "Port",
+"label.port.forwarding.policies": "Port forwarding policies",
+"label.port.range": "Port tartom\u00e1ny",
+"label.portable.ip": "Mozgathat\u00f3 IP",
+"label.portable.ip.range.details": "Hordozhat\u00f3 IP tartom\u00e1ny r\u00e9szletek",
+"label.portable.ip.ranges": "Hordozhat\u00f3 IP tartom\u00e1nyok",
+"label.portableipaddress": "Hordozhat\u00f3 IP c\u00edmek",
+"label.portforwarding": "Port tov\u00e1bb\u00edt\u00e1s",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "El\u0151z\u0151",
+"label.previous": "El\u0151z\u0151",
+"label.primary.network": "Els\u0151dleges h\u00e1l\u00f3zat",
+"label.primary.storage": "Els\u0151dleges t\u00e1r",
+"label.primary.storage.allocated": "Els\u0151dleges t\u00e1r elk\u00fcl\u00f6n\u00edtve",
+"label.primary.storage.count": "Primary Storage Pools",
+"label.primary.storage.used": "Haszn\u00e1lt els\u0151dleges t\u00e1r",
+"label.primarystoragelimit": "Els\u0151dleges t\u00e1r korl\u00e1tok (GiB)",
+"label.primarystoragetotal": "Els\u0151dleges t\u00e1r",
+"label.private.gateway": "Priv\u00e1t \u00e1tj\u00e1r\u00f3",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Priv\u00e1t IP tartom\u00e1ny",
+"label.private.ips": "Priv\u00e1t IP c\u00edmek",
+"label.private.zone": "Priv\u00e1t z\u00f3na",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Priv\u00e1t IP c\u00edm",
+"label.privatekey": "PKCS#8 priv\u00e1t kulcs",
+"label.privatenetwork": "Priv\u00e1t h\u00e1l\u00f3zat",
+"label.privateport": "Priv\u00e1t port",
+"label.profiledn": "Kapacsolt profil",
+"label.profilename": "Profil",
+"label.project": "Projekt",
+"label.project.dashboard": "Projekt m\u0171szerfal",
+"label.project.invite": "Megh\u00edv\u00e1s a projektbe",
+"label.project.name": "Projekt n\u00e9v",
+"label.project.view": "Projekt n\u00e9zet",
+"label.projectid": "Projekt ID",
+"label.projects": "Projektek",
+"label.property": "Property",
+"label.protocol": "Protokol",
+"label.protocol.number": "Protokoll sz\u00e1m",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Szolg\u00e1ltat\u00f3",
+"label.providername": "Szolg\u00e1ltat\u00f3",
+"label.providers": "Szolg\u00e1ltat\u00f3k",
+"label.provisioningtype": "L\u00e9trehoz\u00e1s t\u00edpusa",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Publikus IP c\u00edm",
+"label.public.ip.addresses": "Publikus IP c\u00edmek",
+"label.public.ips": "Publikus IP c\u00edmek",
+"label.public.lb": "Publikus LB",
+"label.public.load.balancer.provider": "Publikus terhel\u00e9seloszt\u00f3 szolg\u00e1ltat\u00f3",
+"label.public.network": "Publikus h\u00e1l\u00f3zat",
+"label.public.traffic": "Publikus forgalom",
+"label.public.zone": "Publikus z\u00f3na",
+"label.publicinterface": "Public Interface",
+"label.publicip": "IP c\u00edm",
+"label.publickey": "Publikus kulcs",
+"label.publicnetwork": "Publikus h\u00e1l\u00f3zat",
+"label.publicport": "Publikus port",
+"label.purpose": "Rendeltet\u00e9s",
+"label.pxe.server.type": "Pxe szerver t\u00edpus",
+"label.qostype": "QoS t\u00edpus",
+"label.quickview": "Gyorsn\u00e9zet",
+"label.quiescevm": "VM felf\u00fcggeszt\u00e9se",
+"label.quiettime": "V\u00e1rakoz\u00e1s (mp)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "V\u00e9g d\u00e1tum",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "Minden sz\u00e1mla",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Kezd\u0151 d\u00e1tum",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx felhaszn\u00e1l\u00f3",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "\u00dajraind\u00edt\u00e1s",
+"label.receivedbytes": "Fogadott byte-ok",
+"label.recent.errors": "Legut\u00f3bbi hib\u00e1k",
+"label.recover.vm": "VM helyre\u00e1ll\u00edt\u00e1sa",
+"label.redundantrouter": "Redund\u00e1ns router",
+"label.redundantrouterstate": "Redund\u00e1ns \u00e1llapot",
+"label.redundantstate": "Redund\u00e1ns \u00e1llapot",
+"label.redundantvpcrouter": "Redund\u00e1ns VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Frissit\u00e9s",
+"label.refresh.blades": "Blade-k friss\u00edt\u00e9se",
+"label.region": "R\u00e9gi\u00f3",
+"label.region.details": "R\u00e9gi\u00f3 r\u00e9szletek",
+"label.reinstall.vm": "VM \u00fajratelep\u00edt\u00e9se",
+"label.related": "Kapcsol\u00f3d\u00f3",
+"label.relationaloperator": "Oper\u00e1tor",
+"label.release.account": "Release from Account",
+"label.release.dedicated.cluster": "Dedik\u00e1lt f\u00fcrt elenged\u00e9se",
+"label.release.dedicated.host": "Dedik\u00e1lt kiszolg\u00e1l\u00f3 elenged\u00e9se",
+"label.release.dedicated.pod": "Dedik\u00e1lt pod elenged\u00e9se",
+"label.release.dedicated.vlan.range": "Dedik\u00e1lt VLAN tartom\u00e1ny elenged\u00e9se",
+"label.release.dedicated.zone": "Dedik\u00e1lt z\u00f3na elenged\u00e9se",
+"label.remind.later": "Eml\u00e9keztess k\u00e9s\u0151bb!",
+"label.remove.acl": "ACL elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.egress.rule": "Egress szab\u00e1ly t\u00f6rl\u00e9se",
+"label.remove.from.load.balancer": "P\u00e9ld\u00e1ny elt\u00e1vol\u00edt\u00e1sa terhel\u00e9seloszt\u00f3b\u00f3l",
+"label.remove.ingress.rule": "Ingress szab\u00e1ly t\u00f6rl\u00e9se",
+"label.remove.ip.range": "IP tartom\u00e1ny elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.ldap": "LDAP elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.network.offering": "H\u00e1l\u00f3zati aj\u00e1nlat elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.pf": "Port tov\u00e1bb\u00edt\u00f3 szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.project.account": "Sz\u00e1mla elt\u00e1vol\u00edt\u00e1sa a projektb\u0151l",
+"label.remove.region": "R\u00e9gi\u00f3 elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.rule": "Szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.ssh.key.pair": "SSH kulcsp\u00e1r elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.static.nat.rule": "Statikus NAT szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.static.route": "Remove static route",
+"label.remove.this.physical.network": "A fizikai h\u00e1l\u00f3zat elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.tier": "R\u00e9teg elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.vm.from.lb": "VM elt\u00e1vol\u00edt\u00e1sa terhel\u00e9seloszt\u00f3 szab\u00e1lyb\u00f3l",
+"label.remove.vm.load.balancer": "VM elt\u00e1vol\u00edt\u00e1sa a terhel\u00e9seloszt\u00f3b\u00f3l",
+"label.remove.vmware.datacenter": "VMware adatk\u00f6zpont elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.vpc": "VPC elt\u00e1vol\u00edt\u00e1sa",
+"label.remove.vpc.offering": "VPC aj\u00e1nlat t\u00f6rl\u00e9se",
+"label.removing": "T\u00f6rl\u00e9s",
+"label.removing.user": "Felhaszn\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa",
+"label.replace.acl": "ACL csere",
+"label.replace.acl.list": "ACL lista cser\u00e9je",
+"label.required": "Sz\u00fcks\u00e9ges",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Friss\u00edt\u00e9st ig\u00e9nyel",
+"label.reserved.system.gateway": "Reserved system gateway",
+"label.reserved.system.ip": "Elk\u00fcl\u00f6n\u00edtett rendszer IP",
+"label.reserved.system.netmask": "Elk\u00fcl\u00f6n\u00edtett rendszer h\u00e1l\u00f3zati maszk",
+"label.reservediprange": "Elk\u00fcl\u00f6n\u00edtett IP c\u00edmtartom\u00e1ny",
+"label.reservedsystemendip": "Utols\u00f3 elk\u00fcl\u00f6n\u00edtett rendszer IP",
+"label.reservedsystemgateway": "Reserved system gateway",
+"label.reservedsystemnetmask": "Elk\u00fcl\u00f6n\u00edtett rendszer h\u00e1l\u00f3zati maszk",
+"label.reservedsystemstartip": "Kezd\u0151 elk\u00fcl\u00f6n\u00edtett rendszer IP",
+"label.reset.ssh.key.pair": "SSH kulcsp\u00e1r \u00fajrabe\u00e1ll\u00edt\u00e1sa",
+"label.reset.ssh.key.pair.on.vm": "SSH kulcsp\u00e1r \u00fajrabe\u00e1ll\u00edt\u00e1sa a VM-en",
+"label.reset.vpn.connection": "VPN kapcsolat \u00fajraind\u00edt\u00e1sa",
+"label.resetvm": "VM \u00fajraind\u00edt\u00e1sa",
+"label.resource": "Er\u0151forr\u00e1s",
+"label.resource.limit.exceeded": "Er\u0151forr\u00e1s-korl\u00e1t t\u00fall\u00e9p\u00e9s",
+"label.resource.limits": "Er\u0151forr\u00e1s korl\u00e1tok",
+"label.resource.name": "Er\u0151forr\u00e1s n\u00e9v",
+"label.resourceid": "Er\u0151forr\u00e1s ID",
+"label.resourcename": "Er\u0151forr\u00e1s n\u00e9v",
+"label.resources": "Er\u0151forr\u00e1sok",
+"label.resourcestate": "Er\u0151forr\u00e1s \u00e1llapot",
+"label.response.timeout.in.sec": "V\u00e1lasz id\u0151t\u00fall\u00e9p\u00e9s (mp)",
+"label.restart.network": "H\u00e1l\u00f3zat \u00fajraind\u00edt\u00e1sa",
+"label.restart.vpc": "VPC \u00fajraind\u00edt\u00e1sa",
+"label.restartrequired": "\u00dajraind\u00edt\u00e1s sz\u00fcks\u00e9ges",
+"label.restore": "Helyre\u00e1ll\u00edt\u00e1s",
+"label.retry.interval": "\u00dajraprob\u00e1lkoz\u00e1s id\u0151k\u00f6z",
+"label.review": "Ellen\u0151rz\u00e9s",
+"label.revoke.project.invite": "Megh\u00edv\u00f3 visszavon\u00e1sa",
+"label.role": "Szerep",
+"label.rolename": "Szerep",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "F\u0151tan\u00fas\u00edtv\u00e1ny",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Root disk controller",
+"label.rootdiskcontrollertypekvm": "Root disk controller",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Frissit\u00e9sre van sz\u00fcks\u00e9g",
+"label.routertype": "T\u00edpus",
+"label.routing.host": "Routing kiszolg\u00e1l\u00f3",
+"label.rule": "Rule",
+"label.rule.number": "Szab\u00e1ly sz\u00e1m",
+"label.rules": "Szab\u00e1lyok",
+"label.running": "Fut\u00f3 VM-ek",
+"label.s3.access.key": "Hozz\u00e1f\u00e9r\u00e9si kulcs",
+"label.s3.bucket": "Kos\u00e1r",
+"label.s3.connection.timeout": "Kapcsol\u00f3d\u00e1si id\u0151t\u00fall\u00e9p\u00e9s",
+"label.s3.endpoint": "V\u00e9gpont",
+"label.s3.max.error.retry": "\u00dajrapr\u00f3b\u00e1lkoz\u00e1s max.",
+"label.s3.nfs.path": "S3 NFS \u00fatvonal",
+"label.s3.nfs.server": "S3 NFS kiszolg\u00e1l\u00f3",
+"label.s3.secret.key": "Titkos kulcs",
+"label.s3.socket.timeout": "Kapcsolat id\u0151t\u00fall\u00e9p\u00e9s",
+"label.s3.use.https": "HTTPS haszn\u00e1lata",
+"label.samlenable": "Authorize SAML SSO",
+"label.samlentity": "Identity Provider",
+"label.saturday": "Szombat",
+"label.save": "Ment\u00e9s",
+"label.save.and.continue": "Ment\u00e9s \u00e9s folytat\u00e1s",
+"label.save.changes": "V\u00e1ltoz\u00e1sok ment\u00e9se",
+"label.saving.processing": "Ment\u00e9s...",
+"label.scale.up.policy": "SCALE UP POLICY",
+"label.scaledown.policy": "ScaleDown szab\u00e1lyzat",
+"label.scaleup.policy": "ScaleUp szab\u00e1lyzat",
+"label.scope": "Hat\u00e1ly",
+"label.search": "Keres\u00e9s",
+"label.secondary.staging.store": "Secondary Staging Store",
+"label.secondary.staging.store.details": "Secondary Staging Store details",
+"label.secondary.storage": "M\u00e1sodlagos t\u00e1r",
+"label.secondary.storage.count": "Secondary Storage Pools",
+"label.secondary.storage.details": "M\u00e1sodlagos t\u00e1r r\u00e9szletek",
+"label.secondary.storage.vm": "Secondary storage VM",
+"label.secondary.used": "Haszn\u00e1lt m\u00e1sodlagos t\u00e1r",
+"label.secondaryips": "M\u00e1sodlagos IP c\u00edmek",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "Titkos kulcs",
+"label.security.group.name": "Biztons\u00e1gi csoport n\u00e9v",
+"label.security.groups": "Biztons\u00e1gi csoportok",
+"label.security.groups.enabled": "Biztons\u00e1gi csoportok bekapcsolva",
+"label.securitygroup": "Biztons\u00e1gi csoport",
+"label.securitygroups": "Biztons\u00e1gi csoportok",
+"label.select": "Kiv\u00e1laszt\u00e1s",
+"label.select-view": "N\u00e9zet",
+"label.select.a.zone": "V\u00e1lassz egy z\u00f3n\u00e1t!",
+"label.select.instance": "V\u00e1laszd ki a p\u00e9d\u00e1nyt!",
+"label.select.instance.to.attach.volume.to": "V\u00e1laszd ki a p\u00e9ld\u00e1nyt, amelyikhez a k\u00f6tetet csatlakoztatni szeretn\u00e9d!",
+"label.select.iso.or.template": "V\u00e1lassz ISO-t vagy sablont!",
+"label.select.offering": "V\u00e1lassz aj\u00e1nlatot!",
+"label.select.project": "V\u00e1lassz projektet!",
+"label.select.region": "R\u00e9gi\u00f3 kiv\u00e1laszt\u00e1sa",
+"label.select.tier": "V\u00e1lassz r\u00e9teget!",
+"label.select.vm.for.static.nat": "V\u00e1lassz VM-et a statikus NAT-hoz",
+"label.self": "Saj\u00e1t",
+"label.sent": "Elk\u00fcld\u00f6tt",
+"label.sentbytes": "K\u00fcld\u00f6tt byte-ok",
+"label.server": "Szerver",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Elosztott router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "R\u00e9gi\u00f3 szint\u0171 VPC",
+"label.service.lb.elasticlbcheckbox": "Elasztikus LB",
+"label.service.lb.inlinemodedropdown": "M\u00f3d",
+"label.service.lb.lbisolationdropdown": "Terhel\u00e9seloszt\u00f3 izol\u00e1ci\u00f3",
+"label.service.offering": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat",
+"label.service.offering.details": "Szolg\u00e1ltat\u00e1s aj\u00e1nlat r\u00e9szletei",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redund\u00e1ns router k\u00e9pess\u00e9g",
+"label.service.state": "Szolg\u00e1ltat\u00e1s \u00e1llapot",
+"label.service.staticnat.associatepublicip": "Publikus IP c\u00edm hozz\u00e1rendel\u00e9se",
+"label.service.staticnat.elasticipcheckbox": "Elasztikus IP",
+"label.servicecapabilities": "Szolg\u00e1ltat\u00e1s k\u00e9pess\u00e9gek",
+"label.servicelist": "Szolg\u00e1ltat\u00e1sok",
+"label.serviceofferingid": "CPU aj\u00e1nlat",
+"label.serviceofferingname": "CPU aj\u00e1nlat",
+"label.session.expired": "A munkamenet lej\u00e1rt",
+"label.set.default.nic": "Alap\u00e9rtelmezett NIC be\u00e1ll\u00edt\u00e1sa",
+"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\u00f3na-t\u00edpus be\u00e1ll\u00edt\u00e1sa",
+"label.settings": "Be\u00e1ll\u00edt\u00e1sok",
+"label.setup": "Be\u00e1ll\u00edt\u00e1sok",
+"label.setup.network": "H\u00e1l\u00f3zat be\u00e1ll\u00edt\u00e1sa",
+"label.setup.zone": "Z\u00f3na be\u00e1ll\u00edt\u00e1sa",
+"label.shared": "Osztott",
+"label.sharedexecutable": "Osztott",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Ingress szab\u00e1ly megjelen\u00edt\u00e9se",
+"label.shrinkok": "Cs\u00f6kkent\u00e9s OK",
+"label.shutdown.provider": "Szolg\u00e1ltat\u00f3 le\u00e1ll\u00edt\u00e1sa",
+"label.simplified.chinese.keyboard": "Egyszer\u0171s\u00edtett k\u00ednai billenty\u0171zet",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.size": "M\u00e9ret",
+"label.sizegb": "M\u00e9ret",
+"label.skip.guide": "Haszn\u00e1ltam m\u00e1r a CloudStack-et, kihagyom ezt az \u00fatmutat\u00f3t",
+"label.smb.domain": "SMB dom\u00e9n",
+"label.smb.password": "SMB jelsz\u00f3",
+"label.smb.username": "SMB felhaszn\u00e1l\u00f3n\u00e9v",
+"label.smbdomain": "SMB dom\u00e9n",
+"label.smbpassword": "SMB jelsz\u00f3",
+"label.smbusername": "SMB felhaszn\u00e1l\u00f3n\u00e9v",
+"label.snapshot": "Pillanatfelv\u00e9tel",
+"label.snapshot.name": "Pillanatfelv\u00e9tel n\u00e9v",
+"label.snapshot.schedule": "Ism\u00e9tl\u0151d\u0151 pillanatfelv\u00e9tel be\u00e1ll\u00edt\u00e1sa",
+"label.snapshotlimit": "Pillanatfelv\u00e9tel korl\u00e1tok",
+"label.snapshotmemory": "Pillanatfelv\u00e9tel mem\u00f3ria",
+"label.snapshots": "Pillanatfelv\u00e9telek",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Kapcsolat id\u0151t\u00fall\u00e9p\u00e9s",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Forr\u00e1s CIDR",
+"label.sourceipaddress": "Forr\u00e1s IP c\u00edm",
+"label.sourcenat": "Forr\u00e1s NAT",
+"label.sourcenattype": "T\u00e1mogatott forr\u00e1s NAT t\u00edpus",
+"label.sourceport": "Forr\u00e1s port",
+"label.specify.vxlan": "VXLAN megad\u00e1sa",
+"label.specifyipranges": "Add meg az IP tartom\u00e1nyokat!",
+"label.specifyvlan": "VLAN megad\u00e1sa",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX r\u00e9szletek",
+"label.ssh.key.pair.details": "SSH kucsp\u00e1r r\u00e9szletei",
+"label.ssh.key.pairs": "SSH kulcsp\u00e1rok",
+"label.sshkeypair": "\u00daj SSH kulcsp\u00e1r",
+"label.standard.us.keyboard": "Amerikai (USA) szabv\u00e1nyos billenty\u0171zet",
+"label.start.ip": "Kezd\u0151 IP",
+"label.start.lb.vm": "Terhel\u00e9seloszt\u00f3 VM ind\u00edt\u00e1sa",
+"label.start.reserved.system.ip": "Kezd\u0151 elk\u00fcl\u00f6n\u00edtett rendszer IP",
+"label.start.vlan": "Els\u0151 VLAN",
+"label.start.vxlan": "Els\u0151 VXLAN",
+"label.startdate": "D\u00e1tum szerint (kezd\u0151)",
+"label.startip": "Kezd\u0151 IP",
+"label.startipv4": "IPv4 kezd\u0151 IP",
+"label.startipv6": "IPv6 kezd\u0151 IP",
+"label.startport": "Kezd\u0151 port",
+"label.startquota": "Quota Value",
+"label.state": "\u00c1llapot",
+"label.static.nat.enabled": "Statikus NAT bekapcsolva",
+"label.static.nat.to": "Statikus NAT c\u00e9lpont",
+"label.static.nat.vm.details": "Static NAT VM Details",
+"label.static.routes": "Statikus \u00fatvonalak",
+"label.statistics": "Statisztika",
+"label.status": "\u00c1llapot",
+"label.step.1": "1. l\u00e9p\u00e9s",
+"label.step.1.title": "1. l\u00e9p\u00e9s: <strong>Sablon kiv\u00e1laszt\u00e1sa</strong>",
+"label.step.2": "2. l\u00e9p\u00e9s",
+"label.step.2.title": "2. l\u00e9p\u00e9s: <strong>Szolg\u00e1ltat\u00e1s aj\u00e1nlat</strong>",
+"label.step.3": "3. l\u00e9p\u00e9s",
+"label.step.3.title": "3. l\u00e9p\u00e9s: <strong id=\"step3_label\">Merevlemez aj\u00e1nlat v\u00e1laszt\u00e1sa</strong>",
+"label.step.4": "4. l\u00e9p\u00e9s",
+"label.step.4.title": "4. l\u00e9p\u00e9s: <strong>H\u00e1l\u00f3zat</strong>",
+"label.step.5": "5. l\u00e9p\u00e9s",
+"label.step.5.title": "5. l\u00e9p\u00e9s: <strong>Ellen\u0151rz\u00e9s</strong>",
+"label.stickiness.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie n\u00e9v",
+"label.sticky.expire": "Lej\u00e1rat",
+"label.sticky.holdtime": "Hold time",
+"label.sticky.indirect": "Indirekt",
+"label.sticky.length": "Hossz",
+"label.sticky.name": "Sticky Name",
+"label.sticky.nocache": "Nincs gyors\u00edt\u00f3t\u00e1r",
+"label.sticky.postonly": "Post only",
+"label.sticky.prefix": "El\u0151tag",
+"label.sticky.request-learn": "Request learn",
+"label.sticky.tablesize": "T\u00e1bla m\u00e9ret",
+"label.stop": "\u00c1lj",
+"label.stop.lb.vm": "Terhel\u00e9seloszt\u00f3 VM le\u00e1ll\u00edt\u00e1sa",
+"label.stopped": "Le\u00e1ll\u00edtott VM-ek",
+"label.storage": "T\u00e1r",
+"label.storage.tags": "T\u00e1r c\u00edmk\u00e9k",
+"label.storage.traffic": "T\u00e1r forgalom",
+"label.storageid": "Els\u0151dleges t\u00e1r",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "T\u00e1r c\u00edmk\u00e9k",
+"label.storagetype": "T\u00e1r t\u00edpus",
+"label.subdomainaccess": "Subdomain Access",
+"label.submit": "Elk\u00fcld\u00e9s",
+"label.submitted.by": "[Bek\u00fcld\u0151: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Siker\u00fclt",
+"label.sunday": "Vas\u00e1rnap",
+"label.supportedservices": "T\u00e1mogatott szolg\u00e1ltat\u00e1sok",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "R\u00e9gi\u00f3-szint\u0171 VPC-t t\u00e1mogat",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"label.suspend.project": "Projekt felf\u00fcggeszt\u00e9se",
+"label.switch.type": "Switch t\u00edpus",
+"label.system.capacity": "Rendszer kapac\u00edt\u00e1s",
+"label.system.offering": "Rendszer aj\u00e1nlat",
+"label.system.offering.for.router": "Rendszer aj\u00e1nlat router-re",
+"label.system.offerings": "Rendszer aj\u00e1nlatok",
+"label.system.service.offering": "Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat",
+"label.system.service.offering.details": "Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat r\u00e9szletei",
+"label.system.vm": "Rendszer VM",
+"label.system.vm.details": "Rendszer VM r\u00e9szletek",
+"label.system.vm.scaled.up": "Rendszer VM felm\u00e9retezve",
+"label.system.vms": "Rendszer VM-ek",
+"label.system.wide.capacity": "Rendszer-szint\u0171 kapac\u00edt\u00e1s",
+"label.systemvmtype": "Rendszer VM t\u00edpus",
+"label.tag.key": "C\u00edmke kulcs",
+"label.tag.value": "C\u00edmke \u00e9rt\u00e9k",
+"label.tagged": "Cimk\u00e9zve",
+"label.tags": "Cimk\u00e9k",
+"label.target.iqn": "C\u00e9l IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Feladat v\u00e9grehajtva",
+"label.template": "Sablon",
+"label.templatebody": "Body",
+"label.templatedn": "Sablon kiv\u00e1laszt\u00e1sa",
+"label.templatefileupload": "Helyi file",
+"label.templatelimit": "Sablon korl\u00e1tok",
+"label.templatename": "Sablon",
+"label.templatenames": "Sablon",
+"label.templates": "Sablonok",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Sablon",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP k\u00f6nyvt\u00e1r",
+"label.tftpdir": "Tftp root directory",
+"label.theme.default": "Alap\u00e9rtelmezett t\u00e9ma",
+"label.theme.grey": "Egyedi - sz\u00fcrke",
+"label.theme.lightblue": "Egyedi - vil\u00e1gosk\u00e9k",
+"label.threshold": "K\u00fcsz\u00f6b\u00e9rt\u00e9k",
+"label.thursday": "Cs\u00fct\u00f6rt\u00f6k",
+"label.tier.details": "R\u00e9teg r\u00e9szletei",
+"label.tiername": "R\u00e9teg",
+"label.time": "Id\u0151",
+"label.time.colon": "Id\u0151:",
+"label.timeout": "Id\u0151t\u00fall\u00e9p\u00e9s",
+"label.timeout.in.second ": " Id\u0151t\u00fall\u00e9p\u00e9s (mp)",
+"label.timezone": "Id\u0151z\u00f3na",
+"label.timezone.colon": "Id\u0151z\u00f3na",
+"label.token": "Token",
+"label.total.hosts": "\u00d6sszes kiszolg\u00e1l\u00f3",
+"label.total.memory": "Mem\u00f3ria \u00f6sszesen",
+"label.total.storage": "\u00d6sszes t\u00e1r",
+"label.total.vms": "\u00d6sszes VM",
+"label.totalcpu": "\u00d6sszes CPU",
+"label.traffic.label": "Forgalom c\u00edmke",
+"label.traffic.types": "Forgalom t\u00edpusok",
+"label.traffictype": "Forgalom t\u00edpus",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Kedd",
+"label.type": "T\u00edpus",
+"label.type.id": "T\u00edpus ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK billenty\u0171zet",
+"label.unavailable": "Nem el\u00e9rhet\u0151",
+"label.unhealthy.threshold": "Nem eg\u00e9szs\u00e9ges k\u00fcsz\u00f6b",
+"label.unit": "Usage Unit",
+"label.unlimited": "Korl\u00e1tlan",
+"label.untagged": "Cimk\u00e9zetlen",
+"label.update.project.resources": "Update project resources",
+"label.update.ssl": " SSL tan\u00fastv\u00e1ny",
+"label.update.ssl.cert": " SSL tan\u00fastv\u00e1ny",
+"label.updating": "Updating",
+"label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
+"label.upload": "Felt\u00f6lt\u00e9s",
+"label.upload.from.local": "Felt\u00f6lt\u00e9s",
+"label.upload.template.from.local": "Sablon felt\u00f6lt\u00e9se",
+"label.upload.volume": "K\u00f6tet felt\u00f6lt\u00e9se",
+"label.upload.volume.from.local": "K\u00f6tet felt\u00f6lt\u00e9se",
+"label.upload.volume.from.url": "K\u00f6tet felt\u00f6lt\u00e9se URL-r\u0151l",
+"label.url": "URL",
+"label.usage.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "VM IP c\u00edm haszn\u00e1lata:",
+"label.use.vm.ips": "VM IP c\u00edmek haszn\u00e1lata",
+"label.usehttps": "HTTPS haszn\u00e1lata",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Felhaszn\u00e1l\u00f3",
+"label.user.details": "Felhaszn\u00e1l\u00f3 adatai",
+"label.user.vm": "Felhaszn\u00e1l\u00f3i VM",
+"label.userdata": "Felhaszn\u00e1l\u00f3 adat",
+"label.userdatal2": "Felhaszn\u00e1l\u00f3i adat",
+"label.username": "Felhaszn\u00e1l\u00f3n\u00e9v",
+"label.users": "Felhaszn\u00e1l\u00f3k",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "\u00c9rt\u00e9k",
+"label.vcdcname": "vCenter DC n\u00e9v",
+"label.vcenter": "vcenter",
+"label.vcenter.cluster": "vCenter f\u00fcrt",
+"label.vcenter.datacenter": "vCenter adatk\u00f6zpont",
+"label.vcenter.datastore": "vCenter t\u00e1r",
+"label.vcenter.host": "vCenter kiszolg\u00e1l\u00f3k",
+"label.vcenter.password": "vCenter jelsz\u00f3",
+"label.vcenter.username": "vCenter felhaszn\u00e1l\u00f3n\u00e9v",
+"label.vcenterdatacenter": "vCenter adatk\u00f6zpont",
+"label.vcenterdatastore": "vCenter t\u00e1r",
+"label.esx.host": "ESX/ESXi kiszolg\u00e1l\u00f3",
+"label.vcenterpassword": "vCenter jelsz\u00f3",
+"label.vcenterusername": "vCenter felhaszn\u00e1l\u00f3n\u00e9v",
+"label.vcipaddress": "vCenter IP c\u00edm",
+"label.vcsdeviceid": "ID",
+"label.version": "Verzi\u00f3",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "Max k\u00e9pm\u00e9ret",
+"label.vgpu.max.vgpu.per.gpu": "vGPU-k GPU-nk\u00e9nt",
+"label.vgpu.remaining.capacity": "Megmarad\u00f3 kapac\u00edt\u00e1s",
+"label.vgpu.video.ram": "Video RAM",
+"label.vgputype": "vGPU t\u00edpus",
+"label.view": "N\u00e9zet",
+"label.view.all": "\u00d6sszes megtekint\u00e9se",
+"label.view.console": "Konzol megtekint\u00e9se",
+"label.view.more": "Tov\u00e1bbiak megtekint\u00e9se",
+"label.view.secondary.ips": "M\u00e1sodlagos IP c\u00edmek megtekint\u00e9se",
+"label.viewing": "Megtekint\u00e9s",
+"label.virtual.appliance": "Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9k",
+"label.virtual.appliance.details": "Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9k r\u00e9szletei",
+"label.virtual.appliances": "Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9kek",
+"label.virtual.machine": "Virtu\u00e1lis g\u00e9p",
+"label.virtual.machines": "Virtu\u00e1lis g\u00e9pek",
+"label.virtual.network": "Virtu\u00e1lis h\u00e1l\u00f3zat",
+"label.virtual.networking": "Virtu\u00e1lis h\u00e1l\u00f3zat",
+"label.virtual.routers": "Virtu\u00e1lis routerek",
+"label.virtual.routers.group.account": "Virtu\u00e1lis routerek sz\u00e1ml\u00e1nk\u00e9nt",
+"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\u00e1lis routerek z\u00f3n\u00e1nk\u00e9nt csoportos\u00edtva",
+"label.virtualmachinedisplayname": "VM n\u00e9v",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI tartom\u00e1ny",
+"label.vlan.range.details": "VLAN tartom\u00e1ny r\u00e9szletei",
+"label.vlan.vni.ranges": "VLAN/VNI tartom\u00e1ny(ok)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI tartom\u00e1ny",
+"label.vm.add": "P\u00e9ld\u00e1ny felv\u00e9tele",
+"label.vm.destroy": "Elpuszt\u00edt",
+"label.vm.password": "A VM jelszava",
+"label.vm.reboot": "\u00dajraind\u00edt\u00e1s",
+"label.vm.snapshots": "VM pillanatfelv\u00e9telek",
+"label.vm.start": "Ind\u00edt\u00e1s",
+"label.vm.stop": "\u00c1lj",
+"label.vmdisplayname": "VM megjelen\u00edtend\u0151 n\u00e9v",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS adatt\u00e1r",
+"label.vmipaddress": "VM IP c\u00edm",
+"label.vmlimit": "P\u00e9ld\u00e1ny korl\u00e1tok",
+"label.vmname": "VM n\u00e9v",
+"label.vms": "VM-ek",
+"label.vms.in.tier": "R\u00e9teg VM-ei",
+"label.vmstate": "VM \u00e1llapot",
+"label.vmtotal": "\u00d6sszes VM",
+"label.vmwaredcid": "VMware adatk\u00f6zpont ID",
+"label.vmwaredcname": "VMware adatk\u00f6zpont n\u00e9v",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware traffic label",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC eszk\u00f6z\u00f6k",
+"label.volgroup": "K\u00f6tet csoport",
+"label.volume": "K\u00f6tet",
+"label.volume.details": "K\u00f6tet r\u00e9szletek",
+"label.volume.migrated": "K\u00f6tet \u00e1tk\u00f6lt\u00f6ztetve",
+"label.volumechecksum": "MD5 ellen\u00f6rz\u0151\u00f6sszeg",
+"label.volumefileupload": "Helyi file",
+"label.volumegroup": "K\u00f6tet csoport",
+"label.volumelimit": "K\u00f6teg korl\u00e1tok",
+"label.volumename": "K\u00f6tet n\u00e9v",
+"label.volumes": "K\u00f6tetek",
+"label.volumetotal": "K\u00f6tet",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC aj\u00e1nlat r\u00e9szletei",
+"label.vpc.offerings": "VPC aj\u00e1nlatok",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC virtu\u00e1lis router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC korl\u00e1tok",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC aj\u00e1nlat",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN kapcsolat",
+"label.vpn.gateway": "VPN \u00e1tj\u00e1r\u00f3",
+"label.vpncustomergatewayid": "VPN \u00fcgyf\u00e9lkapu",
+"label.vsmctrlvlanid": "Vez\u00e9rl\u0151 VLAN ID",
+"label.vsmdeviceid": "N\u00e9v",
+"label.vsmdevicestate": "\u00c1llapot",
+"label.vsmipaddress": "Nexus 1000v IP c\u00edm",
+"label.vsmpassword": "Nexus 1000v jelsz\u00f3",
+"label.vsmpktvlanid": "Csomag VLAN ID",
+"label.vsmstoragevlanid": "T\u00e1r VLAN ID",
+"label.vsmusername": "Nexus 1000v felhaszn\u00e1l\u00f3n\u00e9v",
+"label.vsmusername.req": "Nexus 1000v felhaszn\u00e1l\u00f3n\u00e9v",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch n\u00e9v",
+"label.vswitch.type": "vSwitch t\u00edpus",
+"label.vswitchguestname": "Vend\u00e9g forgalom vSwitch n\u00e9v",
+"label.vswitchguesttype": "Vend\u00e9g forgalom vSwitch t\u00edpus",
+"label.vswitchpublicname": "Publikus forgalom vSwitch n\u00e9v",
+"label.vswitchpublictype": "Publikus forgalom vSwitch t\u00edpus",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN tartom\u00e1ny",
+"label.waiting": "V\u00e1rakoz\u00e1s",
+"label.warn": "Figyelmeztet\u00e9s",
+"label.warn.upper": "WARN",
+"label.warning": "Figyelmeztet\u00e9s",
+"label.wednesday": "Szerda",
+"label.weekly": "Heti",
+"label.welcome": "\u00dcdv\u00f6z\u00f6llek!",
+"label.welcome.cloud.console": "\u00dcdv\u00f6z\u00f6l a vez\u00e9rl\u0151konzol!",
+"label.what.is.cloudstack": "Mi a CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer traffic label",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "Igen",
+"label.zone": "Z\u00f3na",
+"label.zone.dedicated": "A z\u00f3na dedik\u00e1lva",
+"label.zone.details": "Z\u00f3na r\u00e9szletei",
+"label.zone.id": "Z\u00f3na ID",
+"label.zone.step.1.title": "1. l\u00e9p\u00e9s: <strong>H\u00e1l\u00f3zat kiv\u00e1laszt\u00e1sa</strong>",
+"label.zone.step.2.title": "2. l\u00e9p\u00e9s: <strong>Z\u00f3na felv\u00e9tele</strong>",
+"label.zone.step.3.title": "3. l\u00e9p\u00e9s: <strong>Pod felv\u00e9tele</strong>",
+"label.zone.step.4.title": "4. l\u00e9p\u00e9s: <strong>IP c\u00edmtartom\u00e1ny felv\u00e9tele</strong>",
+"label.zone.type": "Z\u00f3na t\u00edpus",
+"label.zone.wide": "Eg\u00e9sz z\u00f3n\u00e1ra kiterjed\u0151",
+"label.zoneid": "Z\u00f3na",
+"label.zonename": "Z\u00f3na",
+"label.zonenamelabel": "Z\u00f3na n\u00e9v",
+"label.zones": "Z\u00f3n\u00e1k",
+"label.zonewizard.traffictype.guest": "Vend\u00e9g: forgalom v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt",
+"label.zonewizard.traffictype.management": "Vez\u00e9rl\u00e9s: forgalom a CloudStack felh\u0151 er\u0151forr\u00e1sai k\u00f6z\u00f6tt, bele\u00e9rtve azokat a komponenseket, amelyek a vez\u00e9rl\u0151 szerverrel kommunik\u00e1lnak, mint a kiszolg\u00e1l\u00f3k \u00e9s a rendszer VM-ek",
+"label.zonewizard.traffictype.public": "Publikus: forgalom az internet \u00e9s a felh\u0151 virtu\u00e1lis g\u00e9pei k\u00f6z\u00f6tt",
+"label.zonewizard.traffictype.storage": "T\u00e1r: forgalom az els\u0151dleges \u00e9s m\u00e1sodlagos t\u00e1r szerverek k\u00f6z\u00f6tt, p\u00e9ld\u00e1ul VM sablonok \u00e9s pillanatfelv\u00e9telek",
+"message.acquire.ip.nic": "Er\u0151s\u00edtsd meg, hogy \u00faj m\u00e1sodlagos IP c\u00edmet k\u00e9rsz ehhez a NIC-hez!<br/>Megjegyz\u00e9s: manu\u00e1lisan kell be\u00e1ll\u00edtanod a frissen beszerzett m\u00e1sodlagos IP c\u00edmet a virtu\u00e1lis g\u00e9pben.",
+"message.acquire.new.ip": "Er\u0151s\u00edtsd meg, hogy \u00faj IP c\u00edmet k\u00e9rsz ennek a h\u00e1l\u00f3zatnak!",
+"message.acquire.new.ip.vpc": "Er\u0151s\u00edtsd meg, hogy \u00faj IP c\u00edmet k\u00e9rsz ennek a VPC-nek!",
+"message.acquire.public.ip": "V\u00e1lassz ki egy z\u00f3n\u00e1t, amelyikb\u0151l az \u00faj IP c\u00edmet k\u00e9rni akarod!",
+"message.action.cancel.maintenance": "A kiszolg\u00e1l\u00f3 karbantart\u00e1s\u00e1t sikeresen megszak\u00edtottad. Ez a folyamat t\u00f6bb percet vehet ig\u00e9nybe.",
+"message.action.cancel.maintenance.mode": "Er\u0151s\u00edtsd meg, hogy meg akarod szak\u00edtani ezt a karbantart\u00e1st!",
+"message.action.change.service.warning.for.instance": "A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtani, miel\u0151tt a jelenlegi szolg\u00e1ltat\u00e1si aj\u00e1nlatait megpr\u00f3b\u00e1lod megv\u00e1ltoztatni.",
+"message.action.change.service.warning.for.router": "A routert le kell \u00e1ll\u00edtani miel\u00f6tt a jelenlegi szolg\u00e1ltat\u00e1si aj\u00e1nlatait megpr\u00f3b\u00e1lod megv\u00e1ltoztatni.",
+"message.action.delete.cluster": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a f\u00fcrt\u00f6t!",
+"message.action.delete.disk.offering": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a merevlemez aj\u00e1nlatot!",
+"message.action.delete.domain": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a dom\u00e9nt!",
+"message.action.delete.external.firewall": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00fcls\u0151 t\u0171zfalat! Figyelmeztet\u00e9s: Ha azt tervezed, hogy ugyanazt a k\u00fcls\u0151 t\u0171zfalat regisztr\u00e1lod \u00fajra, az eszk\u00f6z\u00f6n t\u00f6r\u00f6ln\u00f6d kell a haszn\u00e1lati adatokat.",
+"message.action.delete.external.load.balancer": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00fcls\u0151 terhel\u00e9seloszt\u00f3t! Figyelmeztet\u00e9s: Ha azt tervezed, hogy ugyanazt a k\u00fcls\u0151 terhel\u00e9seloszt\u00f3t regisztr\u00e1lod \u00fajra, az eszk\u00f6z\u00f6n t\u00f6r\u00f6ln\u00f6d kell a haszn\u00e1lati adatokat.",
+"message.action.delete.ingress.rule": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az ingress szab\u00e1lyt!",
+"message.action.delete.iso": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az ISO-t!",
+"message.action.delete.iso.for.all.zones": "Az ISO-t minden z\u00f3na haszn\u00e1lja. Er\u0151s\u00edtsd meg, hogy minden z\u00f3n\u00e1b\u00f3l t\u00f6r\u00f6lni akarod!",
+"message.action.delete.network": "Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6r\u00f6lni ezt a h\u00e1l\u00f3zatot!",
+"message.action.delete.nexusvswitch": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a nexus 1000v-t!",
+"message.action.delete.physical.network": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a fizikai h\u00e1l\u00f3zatot!",
+"message.action.delete.pod": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a pod-ot!",
+"message.action.delete.primary.storage": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az els\u0151dleges t\u00e1rat!",
+"message.action.delete.secondary.storage": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a m\u00e1sodlagos t\u00e1rat!",
+"message.action.delete.security.group": "K\u00e9rlek er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a biztons\u00e1gi csoportot!",
+"message.action.delete.service.offering": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a szolg\u00e1ltat\u00e1s aj\u00e1nlatot!",
+"message.action.delete.snapshot": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a pillanatfelv\u00e9telt!",
+"message.action.delete.system.service.offering": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlatot!",
+"message.action.delete.template": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a sablont!",
+"message.action.delete.template.for.all.zones": "Ezt a sablont minden z\u00f3na haszn\u00e1lja. Er\u0151s\u00edtsd meg, hogy minden z\u00f3n\u00e1b\u00f3l t\u00f6r\u00f6lni szeretn\u00e9d!",
+"message.action.delete.volume": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00f6tetet!",
+"message.action.delete.zone": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a z\u00f3n\u00e1t!",
+"message.action.destroy.instance": "Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a p\u00e9ld\u00e1nyt!",
+"message.action.destroy.systemvm": "Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a rendszer VM-et!",
+"message.action.destroy.volume": "Please confirm that you want to destroy this volume.",
+"message.action.disable.cluster": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a f\u00fcrt\u00f6t!",
+"message.action.disable.nexusvswitch": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a nexus 1000v-t!",
+"message.action.disable.physical.network": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a fizikai h\u00e1l\u00f3zatot!",
+"message.action.disable.pod": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a pod-ot!",
+"message.action.disable.static.nat": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a statikus NAT-ot!",
+"message.action.disable.zone": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a z\u00f3n\u00e1t!",
+"message.action.download.iso": "Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt az ISO-t!",
+"message.action.download.template": "Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt a sablont!",
+"message.action.downloading.template": "Sablon let\u00f6lt\u00e9se",
+"message.action.enable.cluster": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a f\u00fcrt\u00f6t!",
+"message.action.enable.maintenance": "A kiszolg\u00e1l\u00f3 sikeresen felk\u00e9sz\u00fclt a karbantart\u00e1sra. Ez a m\u0171velet t\u00f6bb percet is ig\u00e9nybe vehet att\u00f3l f\u00fcgg\u0151en, mennyi VM fut rajta jelenleg.",
+"message.action.enable.nexusvswitch": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a nexus 1000v-t!",
+"message.action.enable.physical.network": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a fizikai h\u00e1l\u00f3zatot.",
+"message.action.enable.pod": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a pod-ot!",
+"message.action.enable.zone": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a z\u00f3n\u00e1t!",
+"message.action.expunge.instance": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a p\u00e9ld\u00e1nyt!",
+"message.action.force.reconnect": "A kiszolg\u00e1l\u00f3 \u00fajrakapcsol\u00f3d\u00e1s\u00e1t siker\u00fclt kik\u00e9nyszer\u00edteni. Ez a folyamat t\u00f6bb percet veet ig\u00e9nybe.",
+"message.action.host.enable.maintenance.mode": "A karbantart\u00e1s elind\u00edt\u00e1sa az \u00f6sszes a kiszolg\u00e1l\u00f3n fut\u00f3 p\u00e9ld\u00e1ny m\u00e1s kiszolg\u00e1l\u00f3ra k\u00f6lt\u00f6ztet\u00e9s\u00e9t ind\u00edtja el.",
+"message.action.instance.reset.password": "Er\u0151s\u00edtsd meg, hogy meg akarod v\u00e1ltoztatni a virtu\u00e1lis g\u00e9p ROOT jelszav\u00e1t!",
+"message.action.manage.cluster": "Er\u0151s\u00edtsd meg, hogy vez\u00e9relni akarod ezt a f\u00fcrt\u00f6t!",
+"message.action.primarystorage.enable.maintenance.mode": "Figyelmeztet\u00e9s: az els\u0151dleges t\u00e1r karbantart\u00e1si m\u00f3dba helyez\u00e9se minden azt haszn\u00e1l\u00f3 VM-et le\u00e1ll\u00edt. Akarod folytatni?",
+"message.action.reboot.instance": "Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani ezt a p\u00e9ld\u00e1nyt!",
+"message.action.reboot.router": "Minden a router \u00e1ltal ny\u00fajtott szolg\u00e1ltat\u00e1s megszakad. Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a routert!",
+"message.action.reboot.systemvm": "Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani ezt a rendszer VM-et!",
+"message.action.recover.volume": "Please confirm that you would like to recover this volume.",
+"message.action.release.ip": "Er\u0151s\u00edtsd meg, hogy el akarod engedni ezt az IP c\u00edmet!",
+"message.action.remove.host": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a kiszolg\u00e1l\u00f3t!",
+"message.action.reset.password.off": "A p\u00e9ld\u00e1ny nem t\u00e1mogatja ezt a lehet\u0151s\u00e9get.",
+"message.action.reset.password.warning": "A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtanod, miel\u00f6tt megpr\u00f3b\u00e1ln\u00e1d lecser\u00e9lni a jelszav\u00e1t.",
+"message.action.restore.instance": "Er\u0151s\u00edtsd meg, hogy helyre akarod \u00e1ll\u00edtani ezt a p\u00e9ld\u00e1nyt!",
+"message.action.revert.snapshot": "Er\u0151s\u00edtsd meg, hogy vissza akarod \u00e1ll\u00edtani a k\u00f6tetet erre a pillanatfelv\u00e9tlere!",
+"message.action.start.instance": "Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a p\u00e9ld\u00e1nyt!",
+"message.action.start.router": "Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a routert!",
+"message.action.start.systemvm": "Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a rendszer VM-et!",
+"message.action.stop.instance": "Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a p\u00e9ld\u00e1nyt!",
+"message.action.stop.router": "Minden ezzel a routerrel kapcsolatos szolg\u00e1ltat\u00e1s megszakad. Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a routert!",
+"message.action.stop.systemvm": "Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a rendszer VM-et!",
+"message.action.unmanage.cluster": "Er\u0151s\u00edtsd meg, hogy megszak\u00edtod a f\u00fcrt vez\u00e9rl\u00e9s\u00e9t!",
+"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\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VM pillanatfelv\u00e9telt!",
+"message.action.vmsnapshot.revert": "Revert VM snapshot",
+"message.activate.project": "Biztosan aktiv\u00e1lni szeretn\u00e9d ezt a projektet?",
+"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\u00f6vetkez\u0151 param\u00e9tereket az \u00faj merevlemez aj\u00e1nlat felv\u00e9tel\u00e9hez",
+"message.add.domain": "Please specify the subdomain you want to create under this domain",
+"message.add.firewall": "T\u0171zfal felv\u00e9tele a z\u00f3n\u00e1ba",
+"message.add.guest.network": "Er\u0151s\u00edtsd meg, hogy vend\u00e9g h\u00e1l\u00f3zatot szeretn\u00e9l felvenni!",
+"message.add.host": "Add meg a k\u00f6vetkez\u0151 adatokat az \u00faj kiszolg\u00e1l\u00f3 felv\u00e9tel\u00e9hez",
+"message.add.ip.range": "IP tartom\u00e1ny felv\u00e9tele a z\u00f3na publikus h\u00e1l\u00f3zat\u00e1hoz",
+"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\u00e1ny felv\u00e9tele a <b><span id=\"pod_name_label\"></span></b> pod-hoz</p>",
+"message.add.load.balancer": "Terhel\u00e9seloszt\u00f3 felv\u00e9tele a z\u00f3n\u00e1ba",
+"message.add.load.balancer.under.ip": "The load balancer rule has been added under IP:",
+"message.add.network": "H\u00e1l\u00f3zat felv\u00e9tele a <b><span id=\"zone_name\"></span></b> z\u00f3n\u00e1ban",
+"message.add.new.gateway.to.vpc": "Please specify the information to add a new gateway to this VPC.",
+"message.add.pod": "\u00daj pod felv\u00e9tele a <b><span id=\"add_pod_zone_name\"></span></b> z\u00f3n\u00e1ban",
+"message.add.pod.during.zone.creation": "Minden z\u00f3n\u00e1nak egy vagy t\u00f6bb pod-ot kell tartalmaznia. Vegy\u00fck fel az els\u0151 pod-ot! A pod tartalmaz kiszolg\u00e1l\u00f3kat \u00e9s els\u0151dleges t\u00e1r szervereket, amelyeket a k\u00f6vetkez\u0151 l\u00e9p\u00e9sekben vesz\u00fcnk majd fel. El\u0151sz\u00f6r \u00e1ll\u00edts be egy elk\u00fcl\u00f6n\u00edtett IP c\u00edmtartom\u00e1nyt a CloudStack bels\u0151 forgalm\u00e1nak. A c\u00edmtartom\u00e1nynak egyedinek kell lennie a felh\u0151ben.",
+"message.add.primary": "Please specify the following parameters to add a new primary storage",
+"message.add.primary.storage": "\u00daj els\u0151dleges t\u00e1r felv\u00e9tele a <b><span id=\"zone_name\"></span></b> z\u00f3n\u00e1ban a <b><span id=\"pod_name\"></span> pod-hoz</b>",
+"message.add.region": "Add meg az inform\u00e1ci\u00f3kat az \u00faj r\u00e9gi\u00f3 felv\u00e9tel\u00e9hez!",
+"message.add.secondary.storage": "\u00daj t\u00e1r felv\u00e9tele a <b><span id=\"zone_name\"></span> z\u00f3n\u00e1hoz</b>",
+"message.add.service.offering": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj sz\u00e1m\u00edt\u00e1si aj\u00e1nlat felv\u00e9tel\u00e9hez",
+"message.add.system.service.offering": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat felv\u00e9tel\u00e9hez",
+"message.add.template": "Add meg a k\u00f6vetkez\u0151 adatokat \u00faj sablon l\u00e9trehoz\u00e1s\u00e1hoz",
+"message.add.volume": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj k\u00f6tet l\u00e9trehoz\u00e1s\u00e1hoz",
+"message.add.vpn.gateway": "Er\u0151s\u00edtsd meg, hogy \u00faj VPN \u00e1tj\u00e1r\u00f3t akarsz felvenni!",
+"message.added.vpc.offering": "VPC aj\u00e1nlat felv\u00e9ve",
+"message.adding.host": "Kiszolg\u00e1l\u00f3 felv\u00e9tele",
+"message.adding.netscaler.device": "Netscaler eszk\u00f6z felv\u00e9tele",
+"message.adding.netscaler.provider": "Netscaler szolg\u00e1ltat\u00f3 felv\u00e9tele",
+"message.additional.networks.desc": "V\u00e1laszd ki a tov\u00e1bbi h\u00e1l\u00f3zatokat, amelyhez a p\u00e9ld\u00e1ny csatlakozni fog!",
+"message.admin.guide.read": "VMware-alap\u00fa VM-ek eset\u00e9ben k\u00e9rlek olvasd el a dinakikus sk\u00e1l\u00e1z\u00e1sr\u00f3l sz\u00f3l\u00f3 fejezetet! Szeretn\u00e9d folytatni?,",
+"message.advanced.mode.desc": "Akkor v\u00e1laszd ezt a h\u00e1l\u00f3zat modellt, ha szeretn\u00e9d haszn\u00e1lni a VLAN t\u00e1mogat\u00e1st. Ez a h\u00e1l\u00f3zat modell biztos\u00edtja a legnagyobb rugalmass\u00e1got \u00e9s lehet\u0151v\u00e9 teszi, hogy a rendszergazd\u00e1k olyan aj\u00e1nlatokat biztos\u00edtsanak, mint a t\u0171zfalak, VPN vagy terhel\u00e9seloszt\u00f3k valamint a direkt \u00e9s virtu\u00e1lis h\u00e1l\u00f3zatok.",
+"message.advanced.security.group": "V\u00e1laszd ezt, ha biztons\u00e1gi csoportokat akarsz haszn\u00e1lni a vend\u00e9g VM izol\u00e1ci\u00f3hoz!",
+"message.advanced.virtual": "V\u00e1laszd ezt, ha z\u00f3na-szint\u0171 VLAN-okat szeretn\u00e9l haszn\u00e1lni a vend\u00e9g VM-ek izol\u00e1ci\u00f3j\u00e1ra!",
+"message.after.enable.s3": "Az S3-alap\u00fa m\u00e1sodlagos t\u00e1r konfigur\u00e1ci\u00f3ja k\u00e9sz. Megjegyz\u00e9s: miut\u00e1n elhagytad ezt az oldalt, nem tudod majd az S3-at ism\u00e9t konfigur\u00e1lni.",
+"message.after.enable.swift": "A Swift konfigur\u00e1ci\u00f3ja k\u00e9sz. Megjegyz\u00e9s: miut\u00e1n elhagytad ezt az oldalt, nem tudod majd \u00fajrakonfigur\u00e1lni a Swift-et!",
+"message.alert.state.detected": "Alert state detected",
+"message.allow.vpn.access": "Add meg a VPN felhaszn\u00e1l\u00f3 nev\u00e9t \u00e9s jelszav\u00e1t",
+"message.apply.snapshot.policy": "Sikeresen m\u00f3dos\u00edtottad a jelenlegi pillanatfelv\u00e9tel szab\u00e1lyzatodat!",
+"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\u0151s\u00edtsd meg, hogy az ISO-t ehhez a virtu\u00e1lis g\u00e9phez akarod csatolni!",
+"message.attach.volume": "T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat a k\u00f6tet csatlakoztat\u00e1s\u00e1hoz! Ha Windows-alap\u00fa virtu\u00e1lis g\u00e9phez csatlakoztatsz merevlemezt, akkor \u00fajra kell ind\u00edtanod a p\u00e9ld\u00e1nyt ahhoz, hogy l\u00e1sd a merevlemezt.",
+"message.basic.mode.desc": "Akkor v\u00e1laszd ezt a h\u00e1l\u00f3zati modellt, ha <b>*<u>nem</u>*</b> akarsz VLAN t\u00e1mogat\u00e1st bekapcsolni.  Ezen a h\u00e1l\u00f3zaton minden p\u00e9ld\u00e1ny k\u00f6zvetlen\u00fcl a h\u00e1l\u00f3zatt\u00f3l kap IP c\u00edmet \u00e9s a biztons\u00e1gi csoportok szolg\u00e1ltatnak biztons\u00e1got \u00e9s szegreg\u00e1ci\u00f3t.",
+"message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
+"message.change.password": "V\u00e1ltoztass jelsz\u00f3t!",
+"message.cluster.dedicated": "F\u00fcrt dedik\u00e1lva",
+"message.cluster.dedication.released": "F\u00fcrt dedik\u00e1l\u00e1s elengedve",
+"message.configure.all.traffic.types": "T\u00f6bb fizikai h\u00e1l\u00f3zatod van. Kattints a 'Szerkeszt\u00e9s' gombra \u00e9s \u00e1ll\u00edts be c\u00edmk\u00e9ket minden egyes forgalom t\u00edpushoz!",
+"message.configure.firewall.rules.allow.traffic": "Hat\u00e1rozz meg szab\u00e1lyokat forgalom enged\u00e9lyez\u00e9s\u00e9hez",
+"message.configure.firewall.rules.block.traffic": "Hat\u00e1rozz meg szab\u00e1lyokat forgalom sz\u0171r\u00e9s\u00e9hez",
+"message.configure.ldap": "Er\u0151s\u00edtsd meg, hogy szeretn\u00e9l LDAP-t konfigur\u00e1lni!",
+"message.configuring.guest.traffic": "Vend\u00e9g forgalom konfigur\u00e1l\u00e1sa",
+"message.configuring.physical.networks": "Fizikai h\u00e1l\u00f3zatok konfigur\u00e1l\u00e1sa",
+"message.configuring.public.traffic": "Publikus forgalom konfigur\u00e1l\u00e1sa",
+"message.configuring.storage.traffic": "T\u00e1r forgalom konfigur\u00e1l\u00e1sa",
+"message.confirm.action.force.reconnect": "Er\u0151s\u00edtsd meg, hogy \u00fajrakapcsol\u00f3dni akarsz a kiszolg\u00e1l\u00f3hoz!",
+"message.confirm.add.vnmc.provider": "Er\u0151s\u00edtsd meg, hogy fel szeretn\u00e9d venni a VNMC szolg\u00e1ltat\u00f3t.",
+"message.confirm.archive.alert": "Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni akarod ezt a riaszt\u00e1st!",
+"message.confirm.archive.event": "Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni szeretn\u00e9d az esem\u00e9nyt!",
+"message.confirm.archive.selected.alerts": "Er\u0151s\u00edtsd meg, hogy le akarod archiv\u00e1lni a kiv\u00e1lasztott riaszt\u00e1sokat!",
+"message.confirm.archive.selected.events": "Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni szeretn\u00e9d a kiv\u00e1lasztott esem\u00e9nyeket!",
+"message.confirm.attach.disk": "Biztosan csatolni szeretn\u00e9d a merevlemezt?",
+"message.confirm.create.volume": "Biztosan szeretn\u00e9l k\u00f6tetet l\u00e9trehozni?",
+"message.confirm.current.guest.cidr.unchanged": "V\u00e1ltozatlanul akarod hagyni a vend\u00e9g h\u00e1l\u00f3zat CIDR-j\u00e9t?",
+"message.confirm.dedicate.cluster.domain.account": "T\u00e9nyleg dedik\u00e1lni akarod  ezt a f\u00fcrt\u00f6t egy dom\u00e9nnek/sz\u00e1ml\u00e1nak?",
+"message.confirm.dedicate.host.domain.account": "T\u00e9nyleg dedik\u00e1lni akarod ezt a kiszolg\u00e1l\u00f3t egy dom\u00e9nnek vagy sz\u00e1ml\u00e1nak?",
+"message.confirm.dedicate.pod.domain.account": "T\u00e9nyleg dedik\u00e1lni szeretn\u00e9d ezt a pod-ot egy dom\u00e9nnek/sz\u00e1ml\u00e1nak?",
+"message.confirm.dedicate.zone": "Biztosan dedik\u00e1lni akarod ezt a z\u00f3n\u00e1t egy dom\u00e9nhoz/sz\u00e1ml\u00e1hoz?",
+"message.confirm.delete.acl.list": "Biztosan t\u00f6r\u00f6lni akarod ezt a ACL list\u00e1t?",
+"message.confirm.delete.alert": "Biztosan t\u00f6r\u00f6lni akarod ezt a riaszt\u00e1st?",
+"message.confirm.delete.baremetal.rack.configuration": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a Baremetal rack konfigur\u00e1ci\u00f3t!",
+"message.confirm.delete.bigswitchbcf": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a BigSwitch BCF vez\u00e9rl\u0151t!",
+"message.confirm.delete.brocadevcs": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a Brocade Vcs Switch-et",
+"message.confirm.delete.ciscoasa1000v": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a CiscoASA1000v-t",
+"message.confirm.delete.ciscovnmc.resource": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a CiscoVNMC er\u0151forr\u00e1st!",
+"message.confirm.delete.f5": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d az F5-\u00f6t",
+"message.confirm.delete.internal.lb": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a bels\u0151 LB-t!",
+"message.confirm.delete.netscaler": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a NetScaler-t",
+"message.confirm.delete.pa": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a Palo Alto-t",
+"message.confirm.delete.secondary.staging.store": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a m\u00e1sodlagos t\u00e1rat!",
+"message.confirm.delete.srx": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a SRX-et",
+"message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
+"message.confirm.destroy.router": "Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a routert",
+"message.confirm.disable.host": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a kiszolg\u00e1l\u00f3t",
+"message.confirm.disable.network.offering": "Biztos vagy abban, hogy ki akarod kapcsolni ezt a h\u00e1l\u00f3zat aj\u00e1nlatot?",
+"message.confirm.disable.provider": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a szolg\u00e1ltat\u00f3t",
+"message.confirm.disable.vnmc.provider": "Er\u0151s\u00edtsd meg, hogy ki szeretn\u00e9d kapcsolni a VNMC szolg\u00e1ltat\u00f3t!",
+"message.confirm.disable.vpc.offering": "Biztos vagy abban, hogy ki akarod kapcsolni ezt a VPC aj\u00e1nlatot?",
+"message.confirm.enable.host": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni a kiszolg\u00e1l\u00f3t",
+"message.confirm.enable.network.offering": "Biztos vagy abban, hogy be akarod kapcsolni ezt a h\u00e1l\u00f3zati aj\u00e1nlatot?",
+"message.confirm.enable.provider": "Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni ezt a szolg\u00e1ltat\u00f3t",
+"message.confirm.enable.vnmc.provider": "Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni a VNMC szolg\u00e1ltat\u00f3t!",
+"message.confirm.enable.vpc.offering": "Biztos vagy abban, hogy be akarod kapcsolni ezt a VPC aj\u00e1nlatot?",
+"message.confirm.force.update": "Do you want to make a force update?",
+"message.confirm.join.project": "Er\u0151s\u00edtsd meg, hogy csatlakozni szeretn\u00e9l a projekthez",
+"message.confirm.migrate.volume": "El akarod k\u00f6lt\u00f6ztetni ezt a k\u00f6tetet?",
+"message.confirm.refresh.blades": "Please confirm that you want to refresh blades.",
+"message.confirm.release.dedicate.vlan.range": "Er\u0151s\u00edtsd meg, hogy elengeded a dedik\u00e1lt VLAN tartom\u00e1nyt!",
+"message.confirm.release.dedicated.cluster": "El akarod engedni ezt a dedik\u00e1lt f\u00fcrt\u00f6t?",
+"message.confirm.release.dedicated.host": "El akarod engedni ezt a dedik\u00e1lt kiszolg\u00e1l\u00f3t?",
+"message.confirm.release.dedicated.pod": "El akarod engedni ezt a dedik\u00e1lt pod-ot?",
+"message.confirm.release.dedicated.zone": "El akarod engedni ezt a dedik\u00e1lt z\u00f3n\u00e1t?",
+"message.confirm.remove.event": "Biztosan t\u00f6r\u00f6lni szeretn\u00e9d ezt az esem\u00e9nyt?",
+"message.confirm.remove.ip.range": "Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani ezt az IP tartom\u00e1nyt",
+"message.confirm.remove.load.balancer": "Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a VM-et a terhel\u00e9seloszt\u00f3r\u00f3l!",
+"message.confirm.remove.network.offering": "Biztos vagy abban, hogy t\u00f6r\u00f6lni akarod ezt a h\u00e1l\u00f3zati aj\u00e1nlatot?",
+"message.confirm.remove.selected.alerts": "Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a kiv\u00e1lasztott riaszt\u00e1sokat!",
+"message.confirm.remove.selected.events": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a kiv\u00e1lasztott esem\u00e9nyeket",
+"message.confirm.remove.vmware.datacenter": "Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a VMware adatk\u00f6zpontot!",
+"message.confirm.remove.vpc.offering": "Biztos vagy abban, hogy t\u00f6r\u00f6lni akarod ezt a VPC aj\u00e1nlatot?",
+"message.confirm.replace.acl.new.one": "Le akarod cser\u00e9lni ez ACL list\u00e1t egy \u00fajjal?",
+"message.confirm.scale.up.router.vm": "Biztosan fel akarod m\u00e9retezni a router VM-et?",
+"message.confirm.scale.up.system.vm": "Biztosan fel akarod m\u00e9retezni a rendszer VM-et?",
+"message.confirm.shutdown.provider": "Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a szolg\u00e1ltat\u00f3t",
+"message.confirm.start.lb.vm": "Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani az LB VM-et!",
+"message.confirm.stop.lb.vm": "Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani az LB VM-et!",
+"message.confirm.upgrade.router.newer.template": "Er\u0151s\u00edtsd meg, hogy a routert \u00faj sablonnal akarod friss\u00edteni!",
+"message.confirm.upgrade.routers.account.newtemplate": "Er\u0151s\u00edtsd meg, hogy minden a sz\u00e1mla minden router\u00e9t friss\u00edteni akarod az \u00faj sablonnal!",
+"message.confirm.upgrade.routers.cluster.newtemplate": "Er\u0151s\u00edtsd meg, hogy minden a f\u00fcrt minden router\u00e9t friss\u00edteni akarod az \u00faj sablonnal!",
+"message.confirm.upgrade.routers.newtemplate": "Er\u0151s\u00edtsd meg, hogy a z\u00f3na minden router\u00e9t friss\u00edteni akarod \u00faj sablonnal!",
+"message.confirm.upgrade.routers.pod.newtemplate": "Er\u0151s\u00edtsd meg, hogy a pod minden router\u00e9t friss\u00edteni akarod \u00faj sablonnal!",
+"message.copy.iso.confirm": "Er\u0151s\u00edtsd meg, hogy az ISO-t m\u00e1solni akarod:",
+"message.copy.template": "A <b id=\"copy_template_name_text\">XXX</b> sablon m\u00e1sol\u00e1sa a <b id=\"copy_template_source_zone_text\"></b> z\u00f3n\u00e1b\u00f3l a",
+"message.copy.template.confirm": "Biztos vagy benne, hogy le akarod m\u00e1solni a sablont?",
+"message.create.template": "Biztosan szeretn\u00e9l sablont l\u00e9trehozni?",
+"message.create.template.vm": "VM l\u00e9rehoz\u00e1sa <b id=\"p_name\"></b> sablonb\u00f3l",
+"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\u00fcrt l\u00e9trehoz\u00e1sa",
+"message.creating.guest.network": "Vend\u00e9g h\u00e1l\u00f3zat l\u00e9trehoz\u00e1sa",
+"message.creating.physical.networks": "Fizikai h\u00e1l\u00f3zat l\u00e9trehoz\u00e1sa",
+"message.creating.pod": "Pod l\u00e9trehoz\u00e1sa",
+"message.creating.primary.storage": "Els\u0151dleges t\u00e1r l\u00e9trehoz\u00e1sa",
+"message.creating.secondary.storage": "M\u00e1sodlagos t\u00e1r l\u00e9trehoz\u00e1sa",
+"message.creating.systemvm": "A rendszer VM-ek l\u00e9trehoz\u00e1sa folyamatban (ez eltarthat egy darabig)",
+"message.creating.zone": "Z\u00f3na l\u00e9trehoz\u00e1sa",
+"message.dedicate.zone": "Z\u00f3na dedik\u00e1l\u00e1sa",
+"message.dedicated.zone.released": "Z\u00f3na elengedve",
+"message.delete.account": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a sz\u00e1ml\u00e1t!",
+"message.delete.affinity.group": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt az affin\u00edt\u00e1s csoportot",
+"message.delete.gateway": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az \u00e1tj\u00e1r\u00f3t",
+"message.delete.project": "Biztosan t\u00f6r\u00f6lni akarod ezt a projektet?",
+"message.delete.user": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a felhaszn\u00e1l\u00f3t!",
+"message.delete.vpn.connection": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a VPN kapcsolatot",
+"message.delete.vpn.customer.gateway": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VPN \u00fcgyf\u00e9lkaput!",
+"message.delete.vpn.gateway": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VPN \u00e1tj\u00e1r\u00f3t!",
+"message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
+"message.desc.advanced.zone": "\u00d6sszetettebb h\u00e1l\u00f3zati topol\u00f3gi\u00e1khoz. Ez a h\u00e1l\u00f3zat modell biztos\u00edtja a legnagyobb rugalmass\u00e1got a vend\u00e9g h\u00e1l\u00f3zatok fel\u00e9p\u00edt\u00e9s\u00e9ben \u00e9s olyan h\u00e1l\u00f3zati aj\u00e1nlatokat tesz lehet\u0151v\u00e9, mint a t\u0171zfalak, VPN vagy terhel\u00e9seloszt\u00f3k.",
+"message.desc.basic.zone": "Adj meg egy h\u00e1l\u00f3zatot, amelyen minden egyes VM p\u00e9ld\u00e1ny k\u00f6zvetlen\u00fcl a h\u00e1l\u00f3zatt\u00f3l kap IP c\u00edmet. A vend\u00e9g rendszerek izol\u00e1ci\u00f3j\u00e1t 3. r\u00e9teg-b\u00e9li megold\u00e1sokkal, mint p\u00e9ld\u00e1ul biztons\u00e1gi csoportokkal (IP c\u00edm filterez\u00e9s) oldhat\u00f3 meg.",
+"message.desc.cluster": "Minden pod-nak tartalmaznia kell egy vagy t\u00f6bb f\u00fcrt\u00f6t \u00e9s most l\u00e9trehozzuk az els\u0151 f\u00fcrt\u00f6t. A f\u00fcrt csoportos\u00edtja a kiszolg\u00e1l\u00f3kat. Egy f\u00fcrtben tal\u00e1lhat\u00f3 kiszolg\u00e1l\u00f3k ugyanolyan hardverrel rendelkeznek, ugyanolyan hipervizort futtatnak \u00e9s ugyanahhoz az els\u0151dleges t\u00e1rol\u00f3hoz f\u00e9rnek hozz\u00e1. Minden f\u00fcrt egy vagy t\u00f6bb kiszolg\u00e1l\u00f3t \u00e9s els\u0151dleges t\u00e1r szervert tartalmaz.",
+"message.desc.create.ssh.key.pair": "Add meg a k\u00f6vetkez\u0151 adatokat az ssh kulcs bejegyz\u00e9s\u00e9hez!<br><br> (1) Ha publikus kulcsot adsz meg, a CloudStack elt\u00e1rolja \u00e9s a priv\u00e1t kulcsoddal haszn\u00e1lhatod. <br><br> (2) Ha nem adsz meg publikus kulcsot, a CloudStack k\u00e9sz\u00edt neked egyet. M\u00e1sold le \u00e9s mentsd el a priv\u00e1t kulcsot, a CloudStack nem tartja meg.<br>",
+"message.desc.created.ssh.key.pair": "Az SSH kulcsp\u00e1r l\u00e9trej\u00f6tt.",
+"message.desc.host": "Minden f\u00fcrtnek legal\u00e1bb egy kiszolg\u00e1l\u00f3t kell tartalmaznia, amelyen a VM-ek futhatnak. Most vegy\u00fck fel az els\u0151 kiszolg\u00e1l\u00f3t! Hogy a kiszolg\u00e1l\u00f3 m\u0171k\u00f6dhessen, hipervizor szoftvert kell r\u00e1 telep\u00edteni, IP c\u00edmet rendelni hozz\u00e1 \u00e9s biztos\u00edtani a kapcsolatot a CloudStack vez\u00e9rl\u0151 szerverrel. <br/><br/> Add meg a kiszolg\u00e1l\u00f3 DNS vagy IP c\u00edm\u00e9t, a felhaszn\u00e1l\u00f3 nev\u00e9t (\u00e1ltal\u00e1ban root) \u00e9s jelszav\u00e1t, valamint a kiszolg\u00e1l\u00f3 kategoriz\u00e1l\u00e1s\u00e1ra szolg\u00e1l\u00f3 c\u00edmk\u00e9ket.",
+"message.desc.primary.storage": "Minden f\u00fcrt tartalmaz egy vagy t\u00f6bb els\u0151dleges t\u00e1r szervert  \u00e9s most l\u00e9trehozzuk az els\u0151t. Az els\u0151dleges t\u00e1r tartalmazza a f\u00fcrt kiszolg\u00e1l\u00f3in fut\u00f3 \u00f6sszes VM virtu\u00e1lis merevlemezeit.",
+"message.desc.reset.ssh.key.pair": "Adj meg egy ssh kulcsp\u00e1rt, amelyet fel szeretn\u00e9l venni ehhez a VM-hez! A root jelsz\u00f3 megv\u00e1ltozik, ha a jelsz\u00f3 enged\u00e9lyezett.",
+"message.desc.secondary.storage": "Minden z\u00f3n\u00e1nak rendelkeznie kell legal\u00e1bb egy NFS vagy m\u00e1sodlagos t\u00e1r szervert \u00e9s most l\u00e9trehozzuk az els\u0151t. A m\u00e1sodlagos t\u00e1r t\u00e1rolja a VM sablonok, ISO f\u00e1jlok \u00e9s pillanatfelv\u00e9telek adatait. Ennek a szervernek minden kiszolg\u00e1l\u00f3 sz\u00e1m\u00e1ra hozz\u00e1f\u00e9rhet\u0151nek kell lennie.<br/><br/> Add meg az IP c\u00edmet \u00e9s az \u00fatvonalat!",
+"message.desc.zone": "A z\u00f3na a CloudStack legnagyobb egys\u00e9ge \u00e9s \u00e1ltal\u00e1ban egy adatk\u00f6zpontnak felel meg. A z\u00f3n\u00e1k fizikai izol\u00e1ci\u00f3t adnak. Egy z\u00f3na egy vagy t\u00f6bb pod-b\u00f3l \u00e1ll (amelyek kiszolg\u00e1l\u00f3kat \u00e9s els\u0151dleges t\u00e1rol\u00f3kat tartalmaznak) \u00e9s egy m\u00e1sodlagos t\u00e1rb\u00f3l, amelyet az \u00f6sszes pod haszn\u00e1l.",
+"message.detach.disk": "Biztosan la akarod v\u00e1lasztani a merevlemezt?",
+"message.detach.iso.confirm": "Er\u0151s\u00edtsd meg, hogy le akarod v\u00e1lasztani az ISO-t a virtu\u00e1lis g\u00e9pr\u0151l!",
+"message.disable.account": "Er\u0151s\u00edtsd meg, hogy ki szeretn\u00e9d kapcsolni ezt a sz\u00e1ml\u00e1t. A sz\u00e1mla kikapcsol\u00e1s\u00e1val a sz\u00e1mla felhaszn\u00e1l\u00f3inak hozz\u00e1f\u00e9r\u00e9se az er\u0151forr\u00e1sokhoz megsz\u00fcnik. Minden fut\u00f3 virtu\u00e1lis g\u00e9p azonnal le lesz \u00e1ll\u00edtva.",
+"message.disable.snapshot.policy": "Sikeresen kikapcsoltad a jelenlegi pillanatfelv\u00e9tel szab\u00e1lyt.",
+"message.disable.user": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a felhaszn\u00e1l\u00f3t!",
+"message.disable.vpn": "Biztosan ki akarod kapcsolni a VPN-t?",
+"message.disable.vpn.access": "Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a t\u00e1voli VPN hozz\u00e1f\u00e9r\u00e9st!",
+"message.disabling.network.offering": "H\u00e1l\u00f3zat aj\u00e1nlat kikapcsol\u00e1sa",
+"message.disabling.vpc.offering": "VPC aj\u00e1nlat kikapcsol\u00e1sa",
+"message.disallowed.characters": "Nem enged\u00e9lyezett karakterek: <,>",
+"message.download.iso": "Az ISO let\u00f6lt\u00e9s\u00e9hez kattints <a href=\"#\">00000</a>",
+"message.download.template": "A sablon let\u00f6lt\u00e9s\u00e9hez kattints <a href=\"#\">00000</a>",
+"message.download.volume": "A k\u00f6tet let\u00f6lt\u00e9s\u00e9hez kattints href=\"#\">00000</a>",
+"message.download.volume.confirm": "Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt a k\u00f6tetet!",
+"message.edit.account": "Szerkeszt\u00e9s (\"-1\" jelzi az er\u0151forr\u00e1s haszn\u00e1lat\u00e1nak korl\u00e1tlans\u00e1g\u00e1t)",
+"message.edit.confirm": "K\u00e9rlek er\u0151s\u00edtsd meg a v\u00e1ltoztat\u00e1sokat miel\u00f6tt elmented!",
+"message.edit.limits": "Hat\u00e1rozz meg korl\u00e1tokat a k\u00f6vetkez\u0151 er\u0151forr\u00e1sokhoz! A \"-1\" jelzi a korl\u00e1tlanan felhaszn\u00e1l\u00e1st.",
+"message.edit.traffic.type": "Please specify the traffic label you want associated with this traffic type.",
+"message.enable.account": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a sz\u00e1ml\u00e1t!",
+"message.enable.user": "Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a felhaszn\u00e1l\u00f3t!",
+"message.enable.vpn": "Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni a t\u00e1voli hozz\u00e1f\u00e9r\u00e9s\u0171 VPN-t ehhez az IP c\u00edmhez!",
+"message.enable.vpn.access": "A VPN jelenleg ki van kapcsolva erre az IP c\u00edmre. Szeretn\u00e9d bekapcsolni a VPN hozz\u00e1f\u00e9r\u00e9st?",
+"message.enabled.vpn": "A t\u00e1voli hozz\u00e1f\u00e9r\u00e9s\u0171 VPN jelenleg be van kapcsolva \u00e9s hozz\u00e1f\u00e9rhet\u0151 az IP c\u00edmmel",
+"message.enabled.vpn.ip.sec": "Your IPSec pre-shared key is",
+"message.enabling.network.offering": "H\u00e1l\u00f3zat aj\u00e1nlat bekapcsol\u00e1sa",
+"message.enabling.security.group.provider": "Biztons\u00e1gi csoport szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa",
+"message.enabling.vpc.offering": "VPC aj\u00e1nlat bekapcsol\u00e1sa",
+"message.enabling.zone": "Z\u00f3na bekapcsol\u00e1sa",
+"message.enabling.zone.dots": "Z\u00f3na enged\u00e9lyez\u00e9se...",
+"message.enter.seperated.list.multiple.cidrs": "Add meg a CIDR list\u00e1t vessz\u0151kkel elv\u00e1laszva, ha egyn\u00e9l t\u00f6b van!",
+"message.enter.token": "Add meg a token-t, amit a megh\u00edv\u00f3ban kapt\u00e1l!",
+"message.generate.keys": "Er\u0151s\u00edtsd meg, hogy \u00faj kulcsokat szeretn\u00e9l gener\u00e1lni a felhaszn\u00e1l\u00f3nak!",
+"message.gslb.delete.confirm": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni 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\u00e9g h\u00e1l\u00f3zat forgalom kommunik\u00e1ci\u00f3 v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt. Hat\u00e1rozz meg egy VLAN ID tartom\u00e1nyt a vend\u00e9g h\u00e1l\u00f3zatok forgalm\u00e1nak minden fizikai h\u00e1l\u00f3zathoz!",
+"message.guest.traffic.in.basic.zone": "A vend\u00e9g h\u00e1l\u00f3zat forgalma kommunik\u00f3ci\u00f3 v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt. Hat\u00e1rozz meg egy IP c\u00edmtartom\u00e1nyt, amelyb\u0151l a CloudStack a virtu\u00e1lis g\u00e9pekhez rendelhet c\u00edmet. Gy\u0151z\u0151dj meg r\u00f3la, hogy ez a tartom\u00e1ny nincs \u00e1tfed\u00e9sben az elk\u00fcl\u00f6n\u00edtett rendszer IP tartom\u00e1nnyal!",
+"message.host.dedicated": "Dedik\u00e1lt kiszolg\u00e1l\u00f3",
+"message.host.dedication.released": "Kiszolg\u00e1l\u00f3 elengedve",
+"message.installwizard.click.retry": "Kattints az ind\u00edt\u00e1s gombra az ism\u00e9tl\u00e9shez.",
+"message.installwizard.copy.whatisacluster": "A f\u00fcrt kiszolg\u00e1l\u00f3k csoportja. A f\u00fcrt kiszolg\u00e1l\u00f3i egyforma hardverrel rendelkeznek, ugyanazt a hi\u0151erv\u00edzort haszn\u00e1lj\u00e1k, ugyanazon az alh\u00e1l\u00f3zaton tal\u00e1lhat\u00f3ak \u00e9s hozz\u00e1f\u00e9rnek ugyanahhoz az osztott t\u00e1rhoz. A virtu\u00e1lis g\u00e9pek egy f\u00fcrt\u00f6n bel\u00fcl \u00e1tk\u00f6lt\u00f6ztethet\u0151 m\u00e1sik kiszolg\u00e1l\u00f3ra ann\u00e9lk\u00fcl, hogy annak m\u0171k\u00f6d\u00e9s\u00e9t megszak\u00edtan\u00e1nk. A f\u00fcrt a CloudStack&#8482; harmadik legnagyobb egys\u00e9ge. A f\u00fcrt\u00f6k pod-okba, a pod-ok z\u00f3n\u00e1kba rendez\u0151dnek. <br/><br/>A CloudStack&#8482; lehet\u0151v\u00e9 teszi, hogy t\u00f6bb f\u00fcrt\u00f6t haszn\u00e1lj, de egy alap telep\u00edt\u00e9sben csak egy f\u00fcrtre van sz\u00fcks\u00e9g.",
+"message.installwizard.copy.whatisahost": "A kiszolg\u00e1l\u00f3 egy sz\u00e1m\u00edt\u00f3g\u00e9p. A kiszolg\u00e1l\u00f3k biztos\u00edtj\u00e1k a sz\u00e1m\u00edt\u00e1si er\u0151forr\u00e1sokat, amelyeket a virtu\u00e1lis g\u00e9pek felhaszn\u00e1lnak. Minden kiszolg\u00e1l\u00f3 rendelkezik hipervizor szoftverrel, amely a vend\u00e9g VM-eket futtatja (kiv\u00e9tel a bare-metal kiszolg\u00e1l\u00f3k). P\u00e9ld\u00e1ul egy Linux KVM szerver, Citrix XenServer vagy egy ESXi szerver. Az alaptelep\u00edt\u00e9sben csak egy KVM-et vagy XenServer-t futtat\u00f3 kiszolg\u00e1l\u00f3t haszn\u00e1lunk.<br/><br/>A kiszolg\u00e1l\u00f3 a CloudStack&#8482; telep\u00edt\u00e9s legkissebb egys\u00e9ge. A kiszolg\u00e1l\u00f3k f\u00fcrt\u00f6kbe, a f\u00fcrt\u00f6k pod-okba, a pod-ok z\u00f3n\u00e1kba rendez\u0151dnek.",
+"message.installwizard.copy.whatisapod": "A pod-ra gyakran egy rack-szekr\u00e9nyt jelent. Az egy pod-ban tal\u00e1lhat\u00f3 kiszolg\u00e1l\u00f3k egy alh\u00e1l\u00f3zaton vannak.<br/><br/>A pod a CloudStack&#8482; telep\u00edt\u00e9s m\u00e1sodik legnagyobb egys\u00e9ge. A pod-ok z\u00f3n\u00e1kat alkotnak. Minden z\u00f3na tartalmazhat egy vagy t\u00f6bb pod-ot. Az alaptelep\u00edt\u00e9sben csak egy pod-ra van sz\u00fcks\u00e9g\u00fcnk.",
+"message.installwizard.copy.whatisazone": "A z\u00f3na a CloudStack&#8482; telep\u00edt\u00e9s legnagyobb egys\u00e9ge. Egy z\u00f3na \u00e1ltal\u00e1ban egy adatk\u00f6zpontnak felel meg, b\u00e1r megengedhet\u0151 egy adatk\u00f6zponton bel\u00fcl t\u00f6bb z\u00f3na l\u00e9trehoz\u00e1sa. Az er\u0151forr\u00e1sok z\u00f3n\u00e1kra val\u00f3 oszt\u00e1s\u00e1nak c\u00e9lja a redundancia \u00e9s a fizikai izol\u00e1ci\u00f3. P\u00e9ld\u00e1ul minden z\u00f3n\u00e1nak lehet saj\u00e1t \u00e1ramell\u00e1t\u00e1sa \u00e9s h\u00e1l\u00f3zati kapcsolata, valamint a z\u00f3n\u00e1k f\u00f6ldrajzilag egym\u00e1st\u00f3l t\u00e1vol helyezkedhetnek el (b\u00e1r ez nem felt\u00e9tlen\u00fcl sz\u00fcks\u00e9ges).",
+"message.installwizard.copy.whatiscloudstack": "A CloudStack&#8482 egy szoftver, amely sz\u00e1m\u00edt\u00e1si er\u0151forr\u00e1sokat fel\u00fcgyel \u00e9s alkalmas publikus, priv\u00e1t, vagy hibrid infrastrukt\u00fara szolg\u00e1ltat\u00e1s (IaaS) felh\u0151k \u00e9p\u00edt\u00e9s\u00e9re. A CloudStack&#8482 ir\u00e1ny\u00edtja a h\u00e1l\u00f3zatokat, az adatt\u00e1rol\u00f3kat \u00e9s kiszolg\u00e1l\u00f3kat, amelyek a felh\u0151 infrastrukt\u00far\u00e1t alkotj\u00e1k.<br/><br/> A k\u00fcl\u00f6n\u00e1ll\u00f3 virtu\u00e1lis g\u00e9peken t\u00fal a CloudStack&#8482 teljes felh\u0151 insfrastrukt\u00far\u00e1t szolg\u00e1ltat. Ny\u00edlt forr\u00e1sk\u00f3d\u00fa \u00e9s pr\u00e9mium verzi\u00f3k egyar\u00e1nt el\u00e9rhet\u0151ek, a ny\u00edlt forr\u00e1sk\u00f3d\u00fa verzi\u00f3k k\u00f6zel azonos k\u00e9pess\u00e9gekkel rendelkeznek.",
+"message.installwizard.copy.whatisprimarystorage": "A CloudStack&#8482; infrastrukt\u00fara k\u00e9t f\u00e9le afatt\u00e1rol\u00f3t haszn\u00e1l: els\u0151dleges \u00e9s m\u00e1sodlagos t\u00e1rat. Mindkett\u0151 lehet ezek k\u00f6z\u00fcl iSCIS, NFS vagy helyi merevlemez.<br/><br/>Az <strong>els\u0151dleges t\u00e1r</strong> egy f\u00fcrth\u00f6z kapcsol\u00f3dik \u00e9s a f\u00fcrt\u00f6n fut\u00f3 virtu\u00e1lis g\u00e9pek virtu\u00e1lis merevlemezeit t\u00e1rolja. Az els\u0151dleges t\u00e1r tipikusan a kiszolg\u00e1l\u00f3khoz k\u00f6zel tal\u00e1lhat\u00f3.",
+"message.installwizard.copy.whatissecondarystorage": "A m\u00e1sodlagos t\u00e1r egyz\u00f3n\u00e1hoz tartozik \u00e9s a k\u00f6vetkez\u0151ket tartalmazza:<ul><li>Sablonok - Telep\u00edtett oper\u00e1ci\u00f3s rendszerek, amelyek a VM-ek l\u00e9trehoz\u00e1s\u00e1ra haszn\u00e1lhat\u00f3 \u00e9s tartalmazhat egy\u00e9b konfigur\u00e1ci\u00f3s inform\u00e1ci\u00f3kat, mint pl telep\u00edtett alkalmaz\u00e1sok.</li><li>ISO f\u00e1jlok - 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\u0151d most \u00e9p\u00fcl...",
+"message.installwizard.tooltip.addcluster.name": "A f\u00fcrt neve. Ez tetsz\u0151leges \u00e1ltalad v\u00e1lasztott sz\u00f6veg lehet.",
+"message.installwizard.tooltip.addhost.hostname": "A kiszolg\u00e1l\u00f3 IP c\u00edme vagy DNS neve.",
+"message.installwizard.tooltip.addhost.password": "A fenti felhaszn\u00e1l\u00f3 jelszava.",
+"message.installwizard.tooltip.addhost.username": "\u00c1ltal\u00e1ban 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": "\u00c1tj\u00e1r\u00f3 a pod kiszolg\u00e1l\u00f3inak.",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "A h\u00e1l\u00f3zati maszk, amit a vend\u00e9g oper\u00e1ci\u00f3s rendszerek haszn\u00e1lnak 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\u00e1r eszk\u00f6z neve.",
+"message.installwizard.tooltip.addprimarystorage.path": "(NFS eset\u00e9ben) 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\u00e9ben) A t\u00e1reszk\u00f6z IP vagy DNS c\u00edme.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "A m\u00e1sodlagos t\u00e1rat kiszolg\u00e1l\u00f3 NFS szerver IP c\u00edme",
+"message.installwizard.tooltip.addsecondarystorage.path": "A fenti szerveren kiexport\u00e1lt \u00fatvonal",
+"message.installwizard.tooltip.addzone.dns1": "Ezeket a DNS szervereket a z\u00f3na vend\u00e9g VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket publikus h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni, amelyet k\u00e9s\u0151bb veszel fel. A z\u00f3na publikus IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez.",
+"message.installwizard.tooltip.addzone.dns2": "Ezeket a DNS szervereket a z\u00f3na vend\u00e9g VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket publikus h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni, amelyet k\u00e9s\u0151bb veszel fel. A z\u00f3na publikus IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez.",
+"message.installwizard.tooltip.addzone.internaldns1": "Ezeket a DNS szervereket a z\u00f3na rendszer VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket priv\u00e1t h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni. A z\u00f3na priv\u00e1t IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez.",
+"message.installwizard.tooltip.addzone.internaldns2": "Ezeket a DNS szervereket a z\u00f3na rendszer VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket priv\u00e1t h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni. A z\u00f3na priv\u00e1t IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez.",
+"message.installwizard.tooltip.addzone.name": "A z\u00f3na neve",
+"message.installwizard.tooltip.configureguesttraffic.description": "A h\u00e1l\u00f3zat le\u00edr\u00e1sa",
+"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\u00e1l\u00f3zati \u00e1tj\u00e1r\u00f3, amelyet a vend\u00e9g rendszerek haszn\u00e1lhatnak",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "A veng\u00e9g rendszerek h\u00e1l\u00f3zat\u00e1nak 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\u00e1l\u00f3zat neve",
+"message.instance.scaled.up.confirm": "T\u00e9nyleg nagyobbra akarod m\u00e9retezni a p\u00e9ld\u00e1nyt?",
+"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\u00edmid megv\u00e1ltzhattak, szeretn\u00e9d friss\u00edteni a list\u00e1t? Ebben az esetben a r\u00e9szletek f\u00fcl be fog z\u00e1rulni.",
+"message.iso.desc": "A merevlemez k\u00e9p, amely az ind\u00edthat\u00f3 oper\u00e1ci\u00f3s rendszert tartalmazza",
+"message.join.project": "Csatlakozt\u00e1l egy projekthez. V\u00e1lts a projekt n\u00e9zetre!",
+"message.launch.vm.on.private.network": "Szeretn\u00e9d a saj\u00e1t dedik\u00e1lt h\u00e1l\u00f3zatodon ind\u00edtani a p\u00e9ld\u00e1nyt?",
+"message.launch.zone": "A z\u00f3na k\u00e9szen \u00e1ll az ind\u00edt\u00e1sra, folytasd a k\u00f6vetkez\u0151 l\u00e9p\u00e9ssel",
+"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\u00e1s)",
+"message.lock.account": "Er\u0151s\u00edtsd meg, hogy z\u00e1rolni akarod ezt a sz\u00e1ml\u00e1t. A sz\u00e1mla z\u00e1rol\u00e1s\u00e1val a sz\u00e1mla felhaszn\u00e1l\u00f3i nem lesznek k\u00e9pesek a felh\u0151 er\u0151forr\u00e1saikat vez\u00e9relni. A l\u00e9tez\u0151 er\u0151forr\u00e1sok tov\u00e1bbra is hozz\u00e1f\u00e9rhet\u0151ek lesznek.",
+"message.migrate.instance.confirm": "Er\u0151s\u00edtsd meg a kiszolg\u00e1l\u00f3 v\u00e1laszt\u00e1st, ahova a virtu\u00e1lis g\u00e9pet mozgatn\u00e1d!",
+"message.migrate.instance.to.host": "Er\u0151s\u00edtsd meg, hogy m\u00e1sik kiszolg\u00e1l\u00f3ra akarod mozgatni a p\u00e9ld\u00e1nyt!",
+"message.migrate.instance.to.ps": "Er\u0151s\u00edtsd meg, hogy a p\u00e9ld\u00e1nyt m\u00e1sik els\u0151dleges t\u00e1rra szeretn\u00e9d mozgatni!",
+"message.migrate.router.confirm": "Er\u0151s\u00edtsd meg, hogy a routert mozgatni szeretn\u00e9d a k\u00f6vetkez\u0151 c\u00e9lpontra:",
+"message.migrate.systemvm.confirm": "Er\u0151s\u00edtsd meg, hogy a rendszer VM-et a k\u00f6vetkez\u0151 c\u00e9lpontra szeretn\u00e9d mozgatni:",
+"message.migrate.volume": "Er\u0151s\u00edtsd meg, hogy m\u00e1sik els\u0151dleges t\u00e1rra akarod mozgatni a k\u00f6tetet",
+"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\u0151s\u00edtsd meg, hogy szeretn\u00e9l egy \u00faj VM NIC-et ehhez a h\u00e1l\u00f3zathoz!",
+"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.network.removenic": "Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a NIC-t! A hozz\u00e1 kapcsolt h\u00e1l\u00f3zat is t\u00f6rl\u0151dik a VM-b\u0151l.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "A k\u00f6vetkez\u0151ket adja meg \u00faj sz\u00e1mla l\u00e9trehoz\u00e1s\u00e1hoz",
+"message.no.affinity.groups": "Nincsenek affin\u00edt\u00e1si csoportaid. K\u00e9rlek folytasd a k\u00f6vetkez\u0151 l\u00e9p\u00e9ssel!",
+"message.no.host.available": "Nincs el\u00e9rhet\u0151 kiszolg\u00e1l\u00f3 az \u00e1tk\u00f6lt\u00f6ztet\u00e9shez",
+"message.no.network.support": "A kiv\u00e1lasztott hipervizor, a vSphere nem t\u00e1mogat semmilyen tov\u00e1bbi h\u00e1l\u00f3zat be\u00e1ll\u00edt\u00e1st.  Folytasd az 5. l\u00e9p\u00e9ssel!",
+"message.no.network.support.configuration.not.true": "Nincs olyan z\u00f3n\u00e1d, amelyben a biztons\u00e1gi csoportok be lenne kapcsolva, \u00edgy a tov\u00e1bbi h\u00e1l\u00f3zati lehet\u0151s\u00e9gek nem \u00e9rhet\u0151ek el. Folytasd az 5. l\u00e9p\u00e9ssel!",
+"message.no.projects": "Nincsenek projekteid.<br/>A Projektek szekci\u00f3ban tudsz \u00fajat csin\u00e1lni.",
+"message.no.projects.adminonly": "Nincsenek projekteid.<br/>K\u00e9rd meg az adminisztr\u00e1tort, hogy hozzon l\u00e9tre neked egyet!",
+"message.number.clusters": "<h2>F\u00fcrt\u00f6k <span>sz\u00e1ma</span></h2>",
+"message.number.hosts": "<h2>Kiszolg\u00e1l\u00f3k <span>sz\u00e1ma</span></h2>",
+"message.number.pods": "<h2>Pods-ok <span>sz\u00e1ma</span></h2>",
+"message.number.storage": "<h2>Els\u0151dleges t\u00e1r k\u00f6tetek<span>sz\u00e1ma</span></h2>",
+"message.number.zones": "<h2>Z\u00f3n\u00e1k <span>sz\u00e1ma</span></h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"message.password.has.been.reset.to": "A jelsz\u00f3 \u00fajrabe\u00e1ll\u00edtva:",
+"message.password.of.the.vm.has.been.reset.to": "A VM jelszava \u00fajrabe\u00e1ll\u00edtva:",
+"message.pending.projects.1": "Projekt megh\u00edv\u00f3k v\u00e1rnak r\u00e1d:",
+"message.pending.projects.2": "A megtekint\u00e9shez menj a projektek szekci\u00f3hoz \u00e9s v\u00e1laszd a megh\u00edv\u00f3kat a leg\u00f6rd\u00fcl\u0151 men\u00fcb\u0151l!",
+"message.please.add.at.lease.one.traffic.range": "Adj meg legal\u00e1bb egy forgalom tartom\u00e1nyt!",
+"message.please.confirm.remove.ssh.key.pair": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az SSH kulcsp\u00e1rt!",
+"message.please.proceed": "Menj tov\u00e1bb a k\u00f6vetkez\u0151 l\u00e9p\u00e9shez!",
+"message.please.select.a.configuration.for.your.zone": "V\u00e1lassz konfigur\u00e1ci\u00f3t a z\u00f3n\u00e1dnak!",
+"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\u00e1lassz h\u00e1l\u00f3zatokat a virtu\u00e1lis g\u00e9pedhez!",
+"message.please.select.ssh.key.pair.use.with.this.vm": "V\u00e1lassz ki egy SSH kulcsp\u00e1rt, amelyet ezzel a VM-mel haszn\u00e1lni szeretn\u00e9l!",
+"message.please.wait.while.zone.is.being.created": "K\u00e9rlek v\u00e1rj, am\u00edg a z\u00f3n\u00e1d l\u00e9trej\u00f6n. Ez eltarthat egy ideig...",
+"message.pod.dedication.released": "Pod dedik\u00e1ci\u00f3 elengedve",
+"message.portable.ip.delete.confirm": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a hordozhat\u00f3 IP tartom\u00e1nyt!",
+"message.project.invite.sent": "Megh\u00edv\u00f3 elk\u00fcldve a felhaszn\u00e1l\u00f3nak. A felhaszn\u00e1l\u00f3 akkor ker\u00fcl a projektbe, amikor elfogadja a megh\u00edv\u00f3t.",
+"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\u0151 virtu\u00e1lis g\u00e9pei hozz\u00e1f\u00e9rnek az internethez vagy az interneten szolg\u00e1ltat\u00e1sokat biztos\u00edtanak. Publikusan el\u00e9rhet\u0151 IP c\u00edmeket kell erre a c\u00e9lra elk\u00fcl\u00f6n\u00edteni. Amikor l\u00e9trej\u00f6n egy p\u00e9ld\u00e1ny, ezekb\u0151l a publikus IP c\u00edmekb\u0151l kap egyet a p\u00e9ld\u00e1ny a vend\u00e9g IP c\u00edmen k\u00edv\u00fcl. Statikus 1-1 NAT lesz be\u00e1ll\u0167va a publikus \u00e9s a vend\u00e9g IP c\u00edmek k\u00f6z\u00f6tt. V\u00e9gfelhaszn\u00e1l\u00f3k haszn\u00e1lhatj\u00e1k a CloudStack fel\u00fcletet is \u00faj IP c\u00edmek beszerz\u00e9s\u00e9hez \u00e9s statikus NAT be\u00e1ll\u00edt\u00e1s\u00e1hoz.",
+"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\u00e1torok \u00fatmutat\u00f3j\u00e1ban a dinamikus m\u00e9retez\u00e9sre vonatkoz\u00f3 r\u00e9szt miel\u0151tt folytatod!",
+"message.recover.vm": "Er\u0151s\u00edtsd meg, hogy helyre akarod \u00e1ll\u00edtani a VM-et.",
+"message.redirecting.region": "\u00c1tir\u00e1ny\u00edt\u00e1s r\u00e9gi\u00f3ba...",
+"message.reinstall.vm": "Figyelmeztet\u00e9s: \u00d3vatosan! Ha folytatod, a VM \u00fajra lesz telep\u00edtve a sablon alapj\u00e1n, a f\u0151 lemez\u00e9n tal\u00e1lhat\u00f3 adat elveszik. Amennyiben vannak tov\u00e1bbi merevlemezek, azok \u00e9rintetlenek maradnak.",
+"message.remove.ldap": "Biztosan t\u00f6r\u00f6lni akarod az LDAP konfigur\u00e1ci\u00f3t?",
+"message.remove.region": "Biztosan t\u00f6r\u00f6lni akarod ezt a r\u00e9gi\u00f3t err\u0151l a vez\u00e9rl\u0151 szerverr\u0151l?",
+"message.remove.vpc": "Er\u0151s\u00edtsd meg, hoy el akarod t\u00e1vol\u00edtani ezt a VPC-t!",
+"message.remove.vpn.access": "Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 VPN hozz\u00e1f\u00e9r\u00e9s\u00e9t!",
+"message.removed.ssh.key.pair": "SSH kulcsp\u00e1r elt\u00e1vol\u00edtva",
+"message.reset.password.warning.notpasswordenabled": "A p\u00e9ld\u00e1ny sablonja jelsz\u00f3 bekapcsol\u00e1sa n\u00e9lk\u00fcl lett l\u00e9trehozva",
+"message.reset.password.warning.notstopped": "A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtanod, miel\u0151tt megpr\u00f3b\u00e1ln\u00e1l jelsz\u00f3t be\u00e1ll\u00edtani.",
+"message.reset.vpn.connection": "Er\u0151s\u00edtsd meg, hogy alaphelyzetbe akarod \u00e1ll\u00edtani a VPN kapcsolatot!",
+"message.restart.mgmt.server": "Ind\u00edtsd \u00fajra a vez\u00e9rl\u0151 szervert (szervereket) ahhoz, hogy az \u00faj be\u00e1ll\u00edt\u00e1s hat\u00e1lyba l\u00e9pjen!",
+"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\u00e1ltat\u00e1s, amit a h\u00e1l\u00f3zat biztos\u00edt. Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a h\u00e1l\u00f3zatot!",
+"message.restart.vpc": "Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a VPC-t!",
+"message.restart.vpc.remark": "Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a VPC-t! <p><small><i>Megjegyz\u00e9s: egy nem redund\u00e1ns VPC redund\u00e1nss\u00e1 t\u00e9tele takar\u00edt\u00e1st tesz sz\u00fcks\u00e9gess\u00e9. A h\u00e1l\u00f3zatok nem lesznek el\u00e9rhet\u0151ek egy p\u00e1r percig.</i>.</small></p>",
+"message.restorevm": "Helyre akarod \u00e1ll\u00edtani a VM-et?",
+"message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(A <strong>Ctrl-kattint\u00e1s</strong> haszn\u00e1lat\u00e1val tudod az \u00f6sszes alkalmazhat\u00f3 biztons\u00e1gi csoportot kiv\u00e1lasztani)",
+"message.select.a.zone": "Egy z\u00f3na tipikusan egy adatk\u00f6zpontnak felel meg. T\u00f6bb z\u00f3na seg\u00edthet a felh\u0151t megb\u00edzhat\u00f3bb\u00e1 tenni fizikai izol\u00e1ci\u00f3val \u00e9s redundanci\u00e1val.",
+"message.select.affinity.groups": "V\u00e1lasszd ki azokat az affinit\u00e1si csoportokat, amelyekhez a VM tartozzon:",
+"message.select.instance": "V\u00e1lassz egy p\u00e9ld\u00e1nyt!",
+"message.select.iso": "V\u00e1lassz egy ISO-t az \u00faj virtu\u00e1lis p\u00e9ld\u00e1nynak!",
+"message.select.item": "V\u00e1lassz egy elemet!",
+"message.select.security.groups": "V\u00e1lassz biztons\u00e1gi csoportokat az \u00faj VM-hez!",
+"message.select.template": "V\u00e1lassz egy sablont az \u00faj virtu\u00e1lis p\u00e9ld\u00e1nynak!",
+"message.select.tier": "V\u00e1lassz egy r\u00e9teget!",
+"message.set.default.nic": "Er\u0151s\u00edtsd meg, hogy alap\u00e9rtelmezett\u00e9 szeretn\u00e9d tenni ezt a NIC-et a VM-ben!",
+"message.set.default.nic.manual": "Most manu\u00e1lisan m\u00f3dos\u00edtsd apal\u00e9rtelmezett NIC-et a VM-ben!",
+"message.setup.physical.network.during.zone.creation": "Halad\u00f3 z\u00f3na l\u00e9trehoz\u00e1sakor egy vagy t\u00f6bb fizikai h\u00e1l\u00f3zatot kell konfigur\u00e1lnod. Minden h\u00e1l\u00f3zat egy h\u00e1l\u00f3zati k\u00e1rty\u00e1nak felel meg a hiperv\u00edzoron. Minden fizikai h\u00e1l\u00f3zat egy vagy t\u00f6bb t\u00edpus\u00fa forgalmat bonyol\u00edthat, bizonyos megk\u00f6t\u00e9sekkel arra, hogy azokat hogyan lehet kombin\u00e1lni. <br/><br/><strong>H\u00fazz egy vagy t\u00f6bb forgalom t\u00edpust</strong> minden fizikai h\u00e1l\u00f3zatra.",
+"message.setup.physical.network.during.zone.creation.basic": "Alap z\u00f3na l\u00e9trehoz\u00e1sakor egy fizikai h\u00e1l\u00f3zatot hozhatsz l\u00e9tre amely hiperv\u00edzor h\u00e1l\u00f3zati k\u00e1rty\u00e1j\u00e1nak felel meg.<br/><br/>M\u00e1s forgalom-t\u00edpusokat is <strong>r\u00e1h\u00fazhatsz</strong> a fizikai h\u00e1l\u00f3zatra.",
+"message.setup.successful": "A felh\u0151 be\u00e1ll\u00edt\u00e1sa sikeres!",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "K\u00e9rlek adj meg egy URL-t!",
+"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\u00e1lassz egy aj\u00e1nlatot a folytat\u00e1shoz!",
+"message.step.3.continue": "V\u00e1lassz egy merevlemez aj\u00e1nlatot a folytat\u00e1shoz!",
+"message.step.4.continue": "V\u00e1lassz legal\u00e1bb egy h\u00e1l\u00f3zatot a folytat\u00e1shoz!",
+"message.step.4.desc": "Please select the primary network that your virtual instance will be connected to.",
+"message.storage.traffic": "Forgalom a CloudStack felh\u0151 er\u0151forr\u00e1sai k\u00f6z\u00f6tt, bele\u00e9rtve azokat a komponenseket, amelyek a vez\u00e9rl\u0151 szerverrel kommunik\u00e1lnak, mint a kiszolg\u00e1l\u00f3k \u00e9s a rendszer VM-ek. \u00c1ll\u00edtsd be a t\u00e1r forgalmat itt!",
+"message.suspend.project": "Biztosan fel akarod f\u00fcggeszteni ezt a projektet?",
+"message.systems.vms.ready": "A rendszer VM-ek elk\u00e9sz\u00fcltek.",
+"message.template.copying": "A sablon m\u00e1sol\u00e1s alatt \u00e1ll.",
+"message.template.desc": "Oper\u00e1ci\u00f3s rendszer k\u00e9p, amelyet a virtu\u00e1lis g\u00e9pek el tudnak ind\u00edtani",
+"message.template.iso": "V\u00e1lassz egy sablont vagy ISO-t a folytat\u00e1shoz",
+"message.tier.required": "A r\u00e9teg k\u00f6telez\u0151.",
+"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\u00f3na bels\u0151 rendszer VM-einek kiszolg\u00e1l\u00e1s\u00e1ra. A pod-ok priv\u00e1t IP c\u00edmeinek sz\u00fcks\u00e9ge van egy \u00fatvonalhoz ehhez a c\u00edmhez.",
+"message.tooltip.internal.dns.2": "Egy DNS szerver neve, a z\u00f3na bels\u0151 rendszer VM-einek kiszolg\u00e1l\u00e1s\u00e1ra. A pod-ok priv\u00e1t IP c\u00edmeinek sz\u00fcks\u00e9ge van egy \u00fatvonalhoz ehhez a c\u00edmhez.",
+"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\u00e9v a pod-nak",
+"message.tooltip.reserved.system.gateway": "Az \u00e1tj\u00e1r\u00f3 a pod kiszolg\u00e1l\u00f3i sz\u00e1m\u00e1ra",
+"message.tooltip.reserved.system.netmask": "The network prefix that defines the pod subnet. Uses CIDR notation.",
+"message.tooltip.zone.name": "N\u00e9v a z\u00f3n\u00e1nak.",
+"message.update.os.preference": "Hat\u00e1rozz meg egy OS preferenci\u00e1t a kiszolg\u00e1l\u00f3hoz. Minden p\u00e9ld\u00e1ny, aminek hasonl\u00f3 preferenci\u00e1i vannak el\u0151sz\u00f6r ezen a kiszolg\u00e1l\u00f3n indul el.",
+"message.update.resource.count": "Er\u0151s\u00edtsd meg, hogy m\u00f3dos\u00edtani akarod a sz\u00e1mla er\u0151forr\u00e1sainak sz\u00e1m\u00e1t!",
+"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\u00fclt az SSL tan\u00fas\u00edtv\u00e1nyt m\u00f3dos\u00edtani",
+"message.update.ssl.succeeded": "Az SSL tan\u00fas\u00edtv\u00e1nyok m\u00f3dos\u00edt\u00e1sa sikeres",
+"message.validate.accept": "Please enter a value with a valid extension.",
+"message.validate.creditcard": "Adj meg egy \u00e9rv\u00e9nyes bankk\u00e1rtyasz\u00e1mot!",
+"message.validate.date": "Adj meg egy \u00e9rv\u00e9nyes d\u00e1tumot!",
+"message.validate.date.iso": "Adj meg egy \u00e9rv\u00e9nyes (ISO) d\u00e1tumot!",
+"message.validate.digits": "Csak sz\u00e1mjegyeket \u00edrj!",
+"message.validate.email.address": "Adj meg egy \u00e9rv\u00e9nyes e-mail c\u00edmet!",
+"message.validate.equalto": "\u00cdrd be ugyanazt az \u00e9rt\u00e9ket \u00fajra!",
+"message.validate.fieldrequired": "Ez a mez\u0151 k\u00f6telez\u0151.",
+"message.validate.fixfield": "Jav\u00edtsd ki ez a mez\u0151t!",
+"message.validate.instance.name": "A p\u00e9ld\u00e1ny neve nem lehet hosszabb 63 karaktern\u00e9l. Csak ASCII karakterek a-z \u00e9s A-Z, sz\u00e1mok 0-9 \u00e9s k\u00f6t\u0151jelek enged\u00e9lyezettek. Bet\u0171vel kell kezd\u0151dnie \u00e9s bet\u0171vel vagy sz\u00e1mmal kell v\u00e9gz\u0151dnie[",
+"message.validate.invalid.characters": "\u00c9rv\u00e9nytelen karakter; k\u00e9rlek jav\u00edtsd!",
+"message.validate.max": "Adj meg egy \u00e9rt\u00e9ket, ami legfeljebb {0}!",
+"message.validate.maxlength": "Legfeljebb {0} karaktert adj meg!",
+"message.validate.minlength": "Legal\u00e1bb {0} karaktert adj meg!",
+"message.validate.number": "Adj meg egy \u00e9rv\u00e9nyes sz\u00e1mot!",
+"message.validate.range": "Adj meg egy \u00e9rt\u00e9ket {0} \u00e9s {1} k\u00f6z\u00f6tt!",
+"message.validate.range.length": "Adj meg egy {0} \u00e9s {1} k\u00f6z\u00f6tti hossz\u00fas\u00e1g\u00fa \u00e9rt\u00e9ket!",
+"message.validate.url": "Adj meg egy \u00e9rv\u00e9nyes URL-t!",
+"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\u00e9trehoz\u00e1sa automatikusan \u00fajraind\u00edtja 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\u00e9rhet\u0151 a szolg\u00e1ltat\u00f3 list\u00e1r\u00f3l.",
+"message.vnmc.not.available.list": "VNMC nem el\u00e9rhet\u0151 a szolg\u00e1ltat\u00f3 list\u00e1r\u00f3l.",
+"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\u00e1rakoz\u00e1s a be\u00e9p\u00edtett sablonk bet\u00f6lt\u00e9s\u00e9re...",
+"message.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"message.you.must.have.at.least.one.physical.network": "Sz\u00fcks\u00e9ged van legal\u00e1bb egy fizikai h\u00e1l\u00f3zatra.",
+"message.your.cloudstack.is.ready": "A CloudStack k\u00e9szen \u00e1ll!",
+"message.zone.creation.complete": "A z\u00f3na l\u00e9trehoz\u00e1sa befejez\u0151d\u00f6tt",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "A z\u00f3na l\u00e9trehoz\u00e1sa befejez\u0151d\u00f6tt. Szeretn\u00e9d bekapcsolni a z\u00f3n\u00e1t?",
+"message.zone.no.network.selection": "A kiv\u00e1lasztott z\u00f3n\u00e1ban nem v\u00e1laszthat\u00f3 ki h\u00e1l\u00f3zat.",
+"message.zone.step.1.desc": "V\u00e1lassz h\u00e1l\u00f3zat modellt a z\u00f3n\u00e1dnak!",
+"message.zone.step.2.desc": "Add meg a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az \u00faj z\u00f3n\u00e1hoz",
+"message.zone.step.3.desc": "Add meg a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az \u00faj pod-hoz",
+"message.zonewizard.enable.local.storage": "Figyelmeztet\u00e9s: Ha bekapcsolod a helyi t\u00e1rat ebben a z\u00f3n\u00e1ban, akkor a k\u00f6vetkez\u0151t kell tenned att\u00f3l f\u00fcgg\u0151en, hogy hol szeretn\u00e9d elind\u00edtani a rendszer VM-eket: <br/><br/>1. Ha a rendszer VM-eknek osztott els\u0151dleges t\u00e1ron kell futnia, akkor egy elosztott t\u00e1rat kell l\u00e9trehoznod a z\u00f3na l\u00e9trej\u00f6tte ut\u00e1n. A z\u00f3n\u00e1t kikapcsolt \u00e1llapotban kell elind\u00edtanod.<br/><br/>2. Ha a rendszer VM-eknek helyi els\u0151dleges t\u00e1ron kell futni, akkor a system.vm.use.local.storage \u00e9rt\u00e9k\u00e9t true-ra kell \u00e1ll\u00edtani miel\u00f6tt a z\u00f3n\u00e1t bekapcsolod.<br/><br/><br/>Szeretn\u00e9d folytatni?",
+"messgae.validate.min": "Adj meg egy \u00e9rt\u00e9ket, ami legal\u00e1bb {0}!",
+"network.rate": "H\u00e1l\u00f3zati r\u00e1ta",
+"side.by.side": "Egym\u00e1s mellett",
+"state.accepted": "Elfogadva",
+"state.active": "Akt\u00edv",
+"state.allocating": "Lek\u00f6t\u00e9s folyamatban",
+"state.backedup": "Lementve",
+"state.backingup": "Ment\u00e9s folyamatban",
+"state.completed": "K\u00e9sz",
+"state.creating": "K\u00e9sz\u00fcl",
+"state.declined": "Elromlott",
+"state.destroyed": "T\u00f6r\u00f6lt",
+"state.detached": "Lecsatolt",
+"state.disabled": "Kikapcsolt",
+"state.enabled": "Enged\u00e9lyezett",
+"state.error": "Hiba",
+"state.expunging": "T\u00f6rl\u00e9s alatt",
+"state.migrating": "\u00c1thelyez\u00e9s alatt",
+"state.pending": "F\u00fcgg",
+"state.running": "Fut",
+"state.starting": "Indul",
+"state.stopped": "Le\u00e1ll\u00edtva",
+"state.stopping": "Le\u00e1ll\u00e1s folyamatban",
+"state.suspended": "Felf\u00fcggesztett",
+"title.upload.volume": "K\u00f6tet felt\u00f6lt\u00e9se"
+}
\ No newline at end of file
diff --git a/ui/public/locales/it_IT.json b/ui/public/locales/it_IT.json
new file mode 100644
index 0000000..9a6be06
--- /dev/null
+++ b/ui/public/locales/it_IT.json
@@ -0,0 +1,2364 @@
+{
+"changed.item.properties": "Elementi delle propriet\u00e0 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 \u00e8 possibile cambiare la tua password perch\u00e8 LDAP \u00e8 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\u00f9 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 \u00e8 scaduta.",
+"error.unable.to.reach.management.server": "Impossibile raggiungere il Management Server",
+"error.unresolved.internet.name": "Il tuo nome internet non pu\u00f2 essere risolto.",
+"force.delete.domain.warning": "Attenzione: La scelta di questa opzione provocher\u00e0 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\u00e0 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'\u00e8 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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Directory Immagine",
+"inline": "Inline",
+"label.about": "About",
+"label.about.app": "About CloudStack",
+"label.accept.project.invitation": "Accettare un invito ad un progetto",
+"label.accesskey": "Access Key",
+"label.account": "Account",
+"label.account.and.security.group": "Account, Security group",
+"label.account.details": "Account details",
+"label.account.id": "ID dell'Account",
+"label.account.name": "Nome Account",
+"label.account.specific": "Specifico dell'Account",
+"label.accounts": "Utenti",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "Totale ACL di rete",
+"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.configure.stickiness": "Stickiness",
+"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.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.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.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.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.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.iso": "Modifica immagine ISO",
+"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.project.add.account": "Aggiungere account al progetto",
+"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.activeviewersessions": "Sessioni Attive",
+"label.add": "Add",
+"label.add.account": "Aggiungi un Account",
+"label.add.accounts": "Aggiungere utenti",
+"label.add.accounts.to": "Aggiungere utenti a",
+"label.add.acl": "Aggiungere ACL",
+"label.add.acl.list": "Add ACL List",
+"label.add.affinity.group": "Aggiungere un nuovo gruppo di affinit\u00e0",
+"label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
+"label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
+"label.add.bigswitchbcf.device": "Aggiungere Controller BigSwitch BCF",
+"label.add.brocadevcs.device": "Aggiungere Switch Brocade Vcs",
+"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.f5.device": "Aggiungere device F5",
+"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.gateway": "Aggiungere un nuovo gateway",
+"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.tier": "Aggiungere un nuovo livello",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"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.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.srx.device": "Aggiungere device SRX",
+"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.vlan": "Aggiungere una VLAN",
+"label.add.vm": "Aggiungere VM",
+"label.add.vm.to.tier": "Aggiungere una VM al livello",
+"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.gateway": "Aggiungere un Gateway VPN",
+"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.address": "Address",
+"label.admin": "Amministratore",
+"label.admin.accounts": "Account Amministrativi",
+"label.advanced": "Avanzato",
+"label.advanced.mode": "Modalit\u00e0 Avanzata",
+"label.advanced.search": "Ricerca Avanzata",
+"label.affinity": "Affinit\u00e0",
+"label.affinity.groups": "Gruppi di Affinit\u00e0",
+"label.affinitygroup": "Gruppo di Affinit\u00e0",
+"label.agent.password": "Password per l'Agent",
+"label.agent.username": "Username per l'Agent",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "Agree",
+"label.alert": "Allarme",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "Alerts",
+"label.algorithm": "Algoritmo",
+"label.all": "All",
+"label.allocated": "Allocato",
+"label.allocationstate": "Allocation State",
+"label.allow": "Allow",
+"label.anti.affinity": "Anti-affinit\u00e0",
+"label.anti.affinity.group": "Anti-affinity Group",
+"label.anti.affinity.groups": "Anti-affinity Groups",
+"label.api.version": "Versione API",
+"label.apikey": "Chiave 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.associatednetwork": "Rete Associata",
+"label.associatednetworkid": "Associated Network ID",
+"label.associatednetworkname": "Network Name",
+"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.availabilityzone": "availabilityZone",
+"label.available": "Disponibile",
+"label.available.public.ips": "Indirizzi IP Pubblici Disponibili",
+"label.back": "Indietro",
+"label.balance": "Balance",
+"label.bandwidth": "Capacit\u00e0 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.baremetalcpu": "CPU (in MHz)",
+"label.baremetalcpucores": "# of CPU Cores",
+"label.baremetalmac": "MAC del sistema host",
+"label.baremetalmemory": "Memoria (in MB)",
+"label.basic": "Basic",
+"label.basic.mode": "Modalit\u00e0 Base",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "Indirizzo Controller BigSwitch BCF",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Avviabile",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "By Account",
+"label.by.alert.type": "Per tipo di allarme",
+"label.by.availability": "By Availability",
+"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.cachemode": "Write-cache Type",
+"label.cancel": "Annulla",
+"label.capacity": "Capacit\u00e0",
+"label.capacity.iops": "Capacit\u00e0 IOPS",
+"label.capacitybytes": "Capacit\u00e0 Byte",
+"label.capacityiops": "IOPS Totali",
+"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.of.destination.network": "Valore CIDR della rete di destinazione",
+"label.cidrlist": "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.cleanup": "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.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Nome del Cluster",
+"label.clusters": "Cluster",
+"label.clustertype": "Tipo di Cluster",
+"label.clvm": "CLVM",
+"label.code": "Codice",
+"label.community": "Community",
+"label.compute": "Computazionale",
+"label.compute.and.storage": "Computazione e Storage",
+"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.confirmation": "Conferma",
+"label.confirmdeclineinvitation": "Si \u00e8 sicuri di voler declinare l'invito a questo progetto?",
+"label.confirmpassword": "Confermare la password",
+"label.congratulations": "Congratulazioni!",
+"label.connectiontimeout": "Tempo di scadenza connessione",
+"label.conservemode": "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.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU Allocate",
+"label.cpu.sockets": "CPU Socket",
+"label.cpuallocated": "CPU Allocate per VM",
+"label.cpuallocatedghz": "Allocato",
+"label.cpulimit": "Limiti CPU",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (in MHz)",
+"label.cputotal": "CPU Totali",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilizzata",
+"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.create.vpn.connection": "Creare una Connessione VPN",
+"label.created": "Creato",
+"label.created.by.system": "Creato dal sistema",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "Dimensione Disco Personalizzata",
+"label.daily": "Quotidiano",
+"label.dashboard": "Dashboard",
+"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.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.use": "Default Use",
+"label.default.view": "Vista di default",
+"label.delete": "Cancellare",
+"label.delete.acl.list": "Delete ACL List",
+"label.delete.affinity.group": "Cancellare Gruppo di Affinit\u00e0",
+"label.delete.alerts": "Cancella allarmi",
+"label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
+"label.delete.bigswitchbcf": "Rimuovere Controller BigSwitch BCF",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "Cancella eventi",
+"label.delete.f5": "Rimozione F5",
+"label.delete.gateway": "Rimuovere il gateway",
+"label.delete.internal.lb": "Delete Internal LB",
+"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.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "Cancellare progetto",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "Rimozione SRX",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"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.vpn.user": "Cancellare utente VPN",
+"label.deleteprofile": "Delete Profile",
+"label.deleting.failed": "Cancellazione Fallita",
+"label.deleting.processing": "Cancellazione in corso...",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Descrizione",
+"label.destinationphysicalnetworkid": "ID della rete fisica di destinazione",
+"label.destinationzoneid": "Zona di destinazione",
+"label.destroy": "Distruggere",
+"label.destroy.router": "Distruggere il router",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "Scollegamento Disco",
+"label.details": "Dettagli",
+"label.deviceid": "ID Dispositivo",
+"label.devices": "Device",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "Tipo di DHCP Server",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "Indirizzi IP di Rete condivisi",
+"label.directdownload": "Direct Download",
+"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.disconnected": "Last Disconnected",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "Disk Offerings",
+"label.disk.size": "Disk Size",
+"label.disk.volume": "Disk Volume",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Offerta Disco",
+"label.diskofferingid": "Offerta Disco",
+"label.disksize": "Disk Size (in GB)",
+"label.disksizeallocated": "Disk Allocated",
+"label.disksizeallocatedgb": "Allocato",
+"label.disksizetotal": "Disk Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "Used",
+"label.display.text": "Display Text",
+"label.displayname": "Display Name",
+"label.displaytext": "Descrizione",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "Dominio DNS per Reti Guest",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Dominio",
+"label.domains": "Dominio",
+"label.domain.details": "Domain details",
+"label.domain.name": "Nome del Dominio",
+"label.domain.router": "Router di Dominio",
+"label.domain.suffix": "Suffisso DNS (es. xyz.com)",
+"label.domainid": "ID del Dominio",
+"label.domainname": "Dominio",
+"label.domainpath": "Dominio",
+"label.done": "Fatto",
+"label.double.quotes.are.not.allowed": "Doppi apici non consentiti",
+"label.download.progress": "Avanzamento del Download",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "Trascina nella nuova posizione",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "Modifica",
+"label.edit.acl.list": "Edit ACL List",
+"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.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "Elastic",
+"label.email": "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.reserved.system.ip": "Indirizzo IP finale riservato di sistema",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "Per data (fino a)",
+"label.endip": "Indirizzo IP finale",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "Dispositivo",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "End Port",
+"label.enter.token": "Inserire il token",
+"label.error": "Errore",
+"label.error.code": "Error Code",
+"label.error.something.went.wrong.please.correct.the.following": "E' stato rilevato un errore; si prega di correggere quanto indicato di seguito",
+"label.error.upper": "ERROR",
+"label.espencryption": "Encryption di ESP",
+"label.esphash": "Hash di ESP",
+"label.esplifetime": "ESP Lifetime (second)",
+"label.esppolicy": "Policy di ESP",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "Events",
+"label.every": "Every",
+"label.example": "Esempio",
+"label.expunge": "Expunge",
+"label.external.link": "Link Esterno",
+"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.firstname": "Nome",
+"label.firstname.lower": "firstname",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "Formato",
+"label.friday": "Venerd\u00ec",
+"label.full": "Completo",
+"label.full.path": "Path completo",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "General Alerts",
+"label.generating.url": "Generating URL",
+"label.global.settings": "Global Settings",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "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.guestcidraddress": "Guest CIDR",
+"label.guestendip": "Indirizzo IP guest finale",
+"label.guestgateway": "Guest Gateway",
+"label.guestipaddress": "Guest IP Address",
+"label.guestiptype": "Tipo di Guest",
+"label.guestnetmask": "Guest Netmask",
+"label.guestnetworkid": "Network ID",
+"label.guestnetworkname": "Network Name",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Indirizzo IP guest iniziale",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "HA Enabled",
+"label.hahost": "HA Enabled",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
+"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.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Hourly",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Funzionalit\u00e0 del Hypervisor",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisor",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Versione hypervisor",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "Codice ICMP",
+"label.icmptype": "Tipo ICMP",
+"label.id": "ID",
+"label.ikedh": "DH di IKE",
+"label.ikeencryption": "Encryption di IKE",
+"label.ikehash": "Hash di IKE",
+"label.ikelifetime": "IKE lifetime (second)",
+"label.ikepolicy": "Policy di IKE",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastruttura",
+"label.ingress.rule": "Ingress Rule",
+"label.initiated.by": "Initiated By",
+"label.insideportprofile": "Inside Port Profile",
+"label.installwizard.addclusterintro.subtitle": "Che cosa \u00e8 un cluster?",
+"label.installwizard.addclusterintro.title": "Let&rsquo;s aggiungere un cluster",
+"label.installwizard.addhostintro.subtitle": "Che cosa \u00e8 un host?",
+"label.installwizard.addhostintro.title": "Let&rsquo;s aggiungere un host",
+"label.installwizard.addpodintro.subtitle": "Che cosa \u00e8 un pod?",
+"label.installwizard.addpodintro.title": "Let&rsquo;s aggiungere un pod",
+"label.installwizard.addprimarystorageintro.subtitle": "Che cosa \u00e8 un primary storage?",
+"label.installwizard.addprimarystorageintro.title": "Let&rsquo;s aggiungere primary storage",
+"label.installwizard.addsecondarystorageintro.subtitle": "Che cosa \u00e8 un secondary storage?",
+"label.installwizard.addsecondarystorageintro.title": "Let&rsquo;s aggiungere secondary storage",
+"label.installwizard.addzoneintro.subtitle": "Che cosa \u00e8 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\u00e0 di configurazione di una installazione CloudStack&#8482",
+"label.installwizard.title": "Ciao e Benvenuti nel mondo di CloudStack&#8482",
+"label.instance": "Istanza",
+"label.instance.name": "Nome dell'Istanza",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "Nome Interno",
+"label.instanceport": "Instance Port",
+"label.instances": "Istanze",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"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.internaldns1": "DNS 1 Interno",
+"label.internaldns2": "DNS2 Interno",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "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.allocations": "IP Allocations",
+"label.ip.or.fqdn": "IP o FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "Intervalli di indirizzi IP",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "Indirizzo IP",
+"label.ipaddress1": "Indirizzo IP",
+"label.ipaddress2": "Indirizzo IP",
+"label.iplimit": "Public IP Limits",
+"label.ips": "Indirizzi IP",
+"label.ipsecpsk": "Preshared-Key di IPsec",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "E' Condiviso",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Dimensione Disco Personalizzata",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "Dedicato",
+"label.isdefault": "E' Default",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "Estraibile",
+"label.isfeatured": "Featured",
+"label.isforced": "Forza la Cancellazione",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Reti isolate",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "Metodo di isolamento",
+"label.isolation.mode": "Modalit\u00e0 di Isolamento",
+"label.isolationmethod": "Metodo di isolamento",
+"label.isolationmethods": "Metodo di isolamento",
+"label.isolationuri": "URI di isolamento",
+"label.isoname": "ISO Collegata",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Password Enabled",
+"label.ispersistent": "Persistent ",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Public",
+"label.isready": "Pronto",
+"label.isredundantrouter": "Redundant Router",
+"label.isrouting": "Routing",
+"label.isshared": "Shared",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is System",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Item listing",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Keep",
+"label.keep.colon": "Keep:",
+"label.key": "Key",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "Tipo di tastiera",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "Etichetta del traffico via KVM",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "Last Update",
+"label.lastname": "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.lbdevicededicated": "Dedicato",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "Configurazione LDAP",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "Porta LDAP",
+"label.level": "Livello",
+"label.limitcpuuse": "Limite CPU",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Politiche di Bilanciamento di Carico",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "Bilanciamento di Carico",
+"label.loading": "Loading",
+"label.local": "Local",
+"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.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "Login",
+"label.logout": "Logout",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "Make account project owner",
+"label.makeredundant": "Rendi ridondante",
+"label.manage": "Manage",
+"label.manage.resources": "Gestione Risorse",
+"label.management": "Gestione",
+"label.management.ips": "Indirizzo IP di Management",
+"label.management.server": "Management Server",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "Numero massimo di tentativi a seguito di errore",
+"label.maxguestslimit": "Limite max di guest",
+"label.maximum": "Maximum",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. memory (MiB)",
+"label.maxnetwork": "Numero Max di reti",
+"label.maxpublicip": "Numero max di indirizzi IP pubblici",
+"label.maxsnapshot": "Numero max di snapshot",
+"label.maxtemplate": "Numero max di template",
+"label.maxuservm": "Numero max di VM utente",
+"label.maxvolume": "Numero max di volumi",
+"label.maxvpc": "Numero max di VPC",
+"label.may.continue": "E' ora possibile continuare.",
+"label.memallocated": "Mem Allocation",
+"label.memory": "Memory",
+"label.memory.total": "Memory Total",
+"label.memory.used": "Memory Used",
+"label.memoryallocated": "Memory Allocated",
+"label.memoryallocatedgb": "Allocato",
+"label.memorylimit": "Memory limits (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Memory Allocated",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Used",
+"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.destroyed.instances": "Destroyed Instances",
+"label.menu.featured.isos": "Featured ISOs",
+"label.menu.featured.templates": "Featured Templates",
+"label.menu.ipaddresses": "IP Addresses",
+"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.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.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Stopped Instances",
+"label.menu.storage": "Storage",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtual Appliances",
+"label.menu.virtual.resources": "Virtual Resources",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"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.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": "Migrare un volume verso un altro primary storage",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "Monday",
+"label.monthly": "Monthly",
+"label.more.templates": "More Templates",
+"label.move.down.row": "Sposta gi\u00f9 di una riga",
+"label.move.to.bottom": "Sposta gi\u00f9 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.optional": "Name (Optional)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "Intervallo di porte NAT",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "Network",
+"label.network.acl": "ACL di rete",
+"label.network.acls": "ACL di rete",
+"label.network.addvm": "Add network to VM",
+"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.label.display.for.blank.value": "Utilizzare il default gateway",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Network Offerings",
+"label.network.service.providers": "Service Provider di Rete",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network Domain",
+"label.networkid": "Network",
+"label.networking.and.security": "Networking e sicurezza",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Network limits",
+"label.networkname": "Network Name",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Network Rate (Mb/s)",
+"label.networkread": "Network Read",
+"label.networks": "Reti",
+"label.networktype": "Network Type",
+"label.networkwrite": "Network Write",
+"label.new": "Nuovo",
+"label.new.password": "New Password",
+"label.new.project": "Nuovo Progetto",
+"label.new.vm": "Nuova VM",
+"label.newdiskoffering": "New Offering",
+"label.newsize": "New Size (GB)",
+"label.next": "Next",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Storage",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Path",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "Tipo di scheda NIC",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"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.none": "None",
+"label.noselect": "No grazie",
+"label.not.found": "Not Found",
+"label.notifications": "Notifiche",
+"label.num.cpu.cores": "# of CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Numero di Cluster",
+"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.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "Number of Retries",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "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.optional": "Optional",
+"label.order": "Ordine",
+"label.oscategoryid": "OS Preference",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Owned Public IP Addresses",
+"label.owner.account": "Owner Account",
+"label.owner.domain": "Owner Domain",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "Parent Domain",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "Password",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "Password Enabled",
+"label.path": "Path",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Virtual Router",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Segretezza di Forward perfetta",
+"label.permission": "Permission",
+"label.physical.network": "Physical Network",
+"label.physical.network.id": "ID della rete fisica",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "Physical Network",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING storage IP",
+"label.plannermode": "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.podid": "Pod",
+"label.podname": "Nome del Pod",
+"label.pods": "Pod",
+"label.port": "Porta",
+"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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "Precedente",
+"label.primary.network": "Primary Network",
+"label.primary.storage": "Storage Primario",
+"label.primary.storage.allocated": "Primary Storage Allocated",
+"label.primary.storage.count": "Pool del Primary Storage",
+"label.primary.storage.used": "Primary Storage Used",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "Storage Primario",
+"label.private.gateway": "Gateway Privato",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Private IP Range",
+"label.private.ips": "Private IP Addresses",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Private IP Address",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Rete privata",
+"label.privateport": "Private Port",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "Project",
+"label.project.dashboard": "Dashboard di progetto",
+"label.project.invite": "Invitare ad un progetto",
+"label.project.name": "Nome del progetto",
+"label.project.view": "Vista Progetto",
+"label.projectid": "Project ID",
+"label.projects": "Progetti",
+"label.property": "Property",
+"label.protocol": "Protocol",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Fornitori",
+"label.provisioningtype": "Tipo di Provisioning",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Public IP Address",
+"label.public.ip.addresses": "Public IP Addresses",
+"label.public.ips": "Public IP Addresses",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "Rete pubblica",
+"label.public.traffic": "Public traffic",
+"label.public.zone": "Public Zone",
+"label.publicinterface": "Public Interface",
+"label.publicip": "Indirizzo IP",
+"label.publickey": "Public Key",
+"label.publicnetwork": "Rete pubblica",
+"label.publicport": "Public Port",
+"label.purpose": "Scopo",
+"label.pxe.server.type": "Pxe Server Type",
+"label.qostype": "QoS Type",
+"label.quickview": "Panoramica rapida",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "All Accounts",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "Reboot",
+"label.receivedbytes": "Byte Ricevuti",
+"label.recent.errors": "Recent Errors",
+"label.recover.vm": "Recupera la VM",
+"label.redundantrouter": "Redundant Router",
+"label.redundantrouterstate": "Redundant state",
+"label.redundantstate": "Redundant state",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Refresh",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.reinstall.vm": "Reinstalla la VM",
+"label.related": "Related",
+"label.relationaloperator": "Operator",
+"label.release.account": "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.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "Required",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "Gateway di sistema riservato",
+"label.reserved.system.ip": "Reserved System IP",
+"label.reserved.system.netmask": "Netmask di sistema riservata",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "Indirizzo IP finale riservato di sistema",
+"label.reservedsystemgateway": "Gateway di sistema riservato",
+"label.reservedsystemnetmask": "Netmask di sistema riservata",
+"label.reservedsystemstartip": "Indirizzo IP iniziale riservato di sistema",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "Reset della connessione VPN",
+"label.resetvm": "Reset VM",
+"label.resource": "Resource",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "Resource Limits",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "Resources",
+"label.resourcestate": "Stato della risorsa",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "Riavviare il servizio di rete",
+"label.restart.vpc": "Riavviare VPC",
+"label.restartrequired": "E' necessario un riavvio",
+"label.restore": "Restore",
+"label.retry.interval": "Retry Interval",
+"label.review": "Riesaminare",
+"label.revoke.project.invite": "Revocare un invit",
+"label.role": "Role",
+"label.rolename": "Role",
+"label.roles": "Ruoli",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Controller del disco root",
+"label.rootdiskcontrollertypekvm": "Controller del disco root",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "Type",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "Regole",
+"label.running": "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.samlenable": "Authorize SAML SSO",
+"label.samlentity": "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.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.vm": "VM di Secondary Storage",
+"label.secondary.used": "Secondary Storage Used",
+"label.secondaryips": "IP Secondari",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "Secret Key",
+"label.security.group.name": "Security Group Name",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Enabled",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Security Groups",
+"label.select": "Selezionare",
+"label.select-view": "Selezionare la vista",
+"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.tier": "Selezionare il Livello",
+"label.select.vm.for.static.nat": "Selezionare una VM per il NAT statico",
+"label.self": "Mine",
+"label.sent": "Sent",
+"label.sentbytes": "Byte Inviati",
+"label.server": "Server",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastic LB",
+"label.service.lb.inlinemodedropdown": "Modalit\u00e0",
+"label.service.lb.lbisolationdropdown": "Isolamento di LB",
+"label.service.offering": "Service Offering",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Capacit\u00e0 di ridondanza del router",
+"label.service.state": "Stato del Servizio",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "Elastic IP",
+"label.servicecapabilities": "Capacit\u00e0 di Servizio",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Offerta computazionale",
+"label.serviceofferingname": "Offerta computazionale",
+"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.sharedexecutable": "Shared",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Show Ingress Rule",
+"label.shrinkok": "Shrink OK",
+"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.sizegb": "Size",
+"label.skip.guide": "Se si ha familiarit\u00e0 con CloudStack per utilizzi precedenti, si pu\u00f2 saltare questa guida",
+"label.smb.domain": "Dominio SMB",
+"label.smb.password": "Password SMB",
+"label.smb.username": "Username SMB",
+"label.smbdomain": "Dominio SMB",
+"label.smbpassword": "Password SMB",
+"label.smbusername": "Username SMB",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Name",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "Snapshot Limits",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Tempo di scadenza del Socket",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Source CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Tipo di Source NAT supportato",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "Specify VXLAN",
+"label.specifyipranges": "Specificare intervallo di indirizzi IP",
+"label.specifyvlan": "Specify VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "Indirizzo IP iniziale",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Indirizzo IP iniziale riservato di sistema",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "Per data (da)",
+"label.startip": "Indirizzo IP iniziale",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start Port",
+"label.startquota": "Quota Value",
+"label.state": "State",
+"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.method": "Stickiness method",
+"label.sticky.cookie-name": "Nome del cookie",
+"label.sticky.expire": "Scadenza",
+"label.sticky.holdtime": "Hold time",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "Lunghezza",
+"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": "Stopped VMs",
+"label.storage": "Storage",
+"label.storage.tags": "Storage Tags",
+"label.storage.traffic": "Traffico della rete Storage",
+"label.storageid": "Storage Primario",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "Storage Tags",
+"label.storagetype": "Storage Type",
+"label.subdomainaccess": "Subdomain Access",
+"label.submit": "Submit",
+"label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Succeeded",
+"label.sunday": "Sunday",
+"label.supportedservices": "Servizi Supportati",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"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.offerings": "Offerte di Sistema",
+"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.vms": "System VMs",
+"label.system.wide.capacity": "Capacit\u00e0 del Sistema",
+"label.systemvmtype": "System VM Type",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Target IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Attivit\u00e0 completata",
+"label.template": "Template",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "Template Limits",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Template",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Template",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "Dettagli del livello",
+"label.tiername": "Livello",
+"label.time": "Time",
+"label.time.colon": "Time:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "Timezone",
+"label.timezone.colon": "Timezone:",
+"label.token": "Token",
+"label.total.hosts": "Host Totali",
+"label.total.memory": "Memoria Totale",
+"label.total.storage": "Storage Totale",
+"label.total.vms": "Total VMs",
+"label.totalcpu": "CPU Totali",
+"label.traffic.label": "Etichetta del traffico",
+"label.traffic.types": "Tipi di Traffico",
+"label.traffictype": "Traffic Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Tuesday",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "Unavailable",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"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.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.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Usa Indirizzo IP della VM",
+"label.usehttps": "Utilizzare HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "User",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "Username",
+"label.users": "Users",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "Indirizzo IP del vCenter",
+"label.vcsdeviceid": "ID",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"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.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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm.add": "Add Instance",
+"label.vm.destroy": "Destroy",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "Reboot",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Start",
+"label.vm.stop": "Stop",
+"label.vmdisplayname": "Nome visualizzato della VM",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "Indirizzo IP della VM",
+"label.vmlimit": "Limiti dell'Istanza",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "VM nei livelli",
+"label.vmstate": "Stato VM",
+"label.vmtotal": "Total of VMs",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "Etichetta del traffico via VMware",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "Volume Group",
+"label.volume": "Volume",
+"label.volume.details": "Volume details",
+"label.volume.migrated": "Volume migrated",
+"label.volumechecksum": "Checksum MD5",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "Volume Group",
+"label.volumelimit": "Volume Limits",
+"label.volumename": "Volume Name",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "ID del VPC",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpn": "VPN",
+"label.vpn.connection": "Connessione VPN",
+"label.vpn.gateway": "Gateway VPN",
+"label.vpncustomergatewayid": "Gateway VPN del Cliente",
+"label.vsmctrlvlanid": "VLAN ID di Controllo",
+"label.vsmdeviceid": "Name",
+"label.vsmdevicestate": "State",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "VLAN ID del Pacchetto",
+"label.vsmstoragevlanid": "VLAN ID di Storage",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"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 \u00e8 CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "Etichetta del traffico via XenServer",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "S\u00ec",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "Dettagli della Zona",
+"label.zone.id": "Zone ID",
+"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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "Zone",
+"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",
+"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.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.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.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.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.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 \u00e8 sicuri di voler attivare questo progetto?",
+"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 \u00e8 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.add.vpn.gateway": "Si prega di confermare di voler aggiungere un Gateway VPN",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "Aggiunta host",
+"message.adding.netscaler.device": "Aggiunta di dispositivo Netscaler",
+"message.adding.netscaler.provider": "Aggiunta di un provider Netscaler",
+"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 \u00e8 configurato. NOTA: Una volta chiusa questa pagina, non sar\u00e0 pi\u00f9 possibile ri-configurare S3.",
+"message.after.enable.swift": "Configurazione Swift completata. NOTA: Una volta che questa pagina viene chiusa, non sar\u00e0 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.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\u00f9 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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "Si prega di confermare di voler rimuovere F5",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"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.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "Si prega di confermare di voler rimuovere SRX",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "Si prega di confermare di voler rimuovere questo intervallo di indirizzi IP.",
+"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 \u00e8 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.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"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 \u00e8 sicuri di voler cancellare questo progetto?",
+"message.delete.user": "Si prega di confermare di voler cancellare questo utente.",
+"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.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
+"message.desc.advanced.zone": "Per topologie di rete pi\u00f9 sofisticate. Queto modello di rete fornisce la maggior flessibilit\u00e0 nel definire reti guest e offrendo funzionalit\u00e0 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\u00e0 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 \u00e8 l'unit\u00e0 organizzativa pi\u00f9 grandi in CloudStack, e corrisponde tipicamente ad un datacenter singolo. Le zono offrono isolamento fisico e ridondanza. Una zona \u00e8 costituita da uno o pi\u00f9 pod (ognuno dei quali contiene pi\u00f9 host e server di storage primario) ed un server di storage secondario condiviso da tutti i pod appartenenti alla zona.",
+"message.detach.disk": "Si \u00e8 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 \u00e8 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\u00f2 essere utilizzato ad esempio per identificare un singolo rack. Gli host appartenenti al pod sono nella stessa subnet.<br/><br/>Un pod \u00e8 il secondo componente organizzativo pi\u00f9 grande in una installazione CloudStack&#8482;. I pod sono contenuti in zone. Ogni zona pu\u00f2 contenere uno o pi\u00f9 pod; in una Installazione di Base, si configura un solo pod nella zona.",
+"message.installwizard.copy.whatisazone": "Una zona \u00e8 il componente organizzativo pi\u00f9 grande in una installazione CloudStack&#8482;. Una zona corrisponde solitamente ad un singolo datacenter, sebbene sia consentito avere pi\u00f9 zone in un datacenter. Il beneficio di organizzare l'infrastruttura in zone deriva dalla possibilit\u00e0 di creare isolamento e ridondanza. Per esempio, ogni zona pu\u00f2 avere la propria configurazione di alimentazione elettrica e collegamenti di rete, e le zone possono essere anche separate geograficamente (anche se non \u00e8 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 \u00e8 associato ad una zona, ed \u00e8 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\u00f2 essere assegnato utilizzando testo a scelta e non \u00e8 utilizzato da CloudStack.",
+"message.installwizard.tooltip.addhost.hostname": "Il nome DNS o l'indirizzo IP del sistema host.",
+"message.installwizard.tooltip.addhost.password": "Questa \u00e8 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 \u00e8 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 \u00e8 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 \u00e8 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 \u00e8 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\u00e0 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\u00e0 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\u00e0 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 \u00e8 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.network.removenic": "Prego conferma che si vuole rimuovere questa NIC, questo rimuover\u00e0 anche le reti associate dalla VM.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "Specify the following to add a new user to the account",
+"message.no.affinity.groups": "Non \u00e8 presente alcun gruppo di affinit\u00e0. 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.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\u00f2 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 \u00e8 stato spedito all'utente; l'utente sar\u00e0 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\u00e0 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.password.warning.notpasswordenabled": "L'immagine template di questa instanza \u00e8 stata creata senza l'abilitazione della password",
+"message.reset.password.warning.notstopped": "L'instanza deve essere arrestata prima di poter modificare la password",
+"message.reset.vpn.connection": "Si prega di confermare di voler effettuare il reset della connessione VPN",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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\u00e0 creando isolamento fisico e ridondanza.",
+"message.select.affinity.groups": "Prego selezionare un gruppo di affinit\u00e0 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\u00f2 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\u00e0 <strong>drag and drop</strong>.",
+"message.setup.successful": "L'installazione del cloud \u00e8 completata con successo!",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "Si prega di specificare la URL",
+"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 \u00e8 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.template.iso": "Please select a template or ISO to continue",
+"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\u00e0 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.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\u00f2 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.validate.url": "Please enter a valid URL.",
+"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.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"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": "Creazione zona completata",
+"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}.",
+"network.rate": "Network Rate",
+"side.by.side": "Side by Side",
+"state.accepted": "Accettato",
+"state.active": "Attivo",
+"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.detached": "Detached",
+"state.disabled": "Disabilitato",
+"state.enabled": "Abilitato",
+"state.error": "Errore",
+"state.expunging": "Expunging",
+"state.migrating": "Migrazione in corso",
+"state.pending": "Pending",
+"state.running": "In esecuzione",
+"state.starting": "Avvio in corso",
+"state.stopped": "Arrestato",
+"state.stopping": "Arresto in corso",
+"state.suspended": "Sospeso",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/ja_JP.json b/ui/public/locales/ja_JP.json
new file mode 100644
index 0000000..5b64375
--- /dev/null
+++ b/ui/public/locales/ja_JP.json
@@ -0,0 +1,2367 @@
+{
+"changed.item.properties": "\u9805\u76ee\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5909\u66f4",
+"confirm.enable.s3": "S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"confirm.enable.swift": "Swift \u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"error.could.not.change.your.password.because.non.native.user": "\u30a8\u30e9\u30fc\u3002LDAP \u304c\u6709\u52b9\u306a\u305f\u3081\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002",
+"error.could.not.enable.zone": "\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
+"error.installwizard.message": "\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u623b\u3063\u3066\u30a8\u30e9\u30fc\u3092\u4fee\u6b63\u3067\u304d\u307e\u3059\u3002",
+"error.invalid.username.password": "\u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002",
+"error.login": "\u30e6\u30fc\u30b6\u30fc\u540d/\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u8a18\u9332\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002",
+"error.menu.select": "\u9805\u76ee\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u64cd\u4f5c\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002",
+"error.mgmt.server.inaccessible": "\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3002\u5f8c\u3067\u518d\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"error.password.not.match": "\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093",
+"error.please.specify.physical.network.tags": "\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30bf\u30b0\u3092\u6307\u5b9a\u3057\u306a\u3051\u308c\u3070\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002",
+"error.session.expired": "\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f\u3002",
+"error.unable.to.reach.management.server": "\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093",
+"error.unresolved.internet.name": "\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u540d\u3092\u89e3\u6c7a\u3067\u304d\u307e\u305b\u3093\u3002",
+"force.delete.domain.warning": "\u8b66\u544a: \u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u3059\u3079\u3066\u306e\u5b50\u30c9\u30e1\u30a4\u30f3\u304a\u3088\u3073\u95a2\u9023\u3059\u308b\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3068\u305d\u306e\u30ea\u30bd\u30fc\u30b9\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002",
+"force.remove": "\u5f37\u5236\u7684\u306b\u89e3\u9664\u3059\u308b",
+"force.remove.host.warning": "\u8b66\u544a: \u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u304c\u5f37\u5236\u7684\u306b\u505c\u6b62\u3055\u308c\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u304b\u3089\u3053\u306e\u30db\u30b9\u30c8\u304c\u5f37\u5236\u7684\u306b\u89e3\u9664\u3055\u308c\u307e\u3059\u3002",
+"force.stop": "\u5f37\u5236\u7684\u306b\u505c\u6b62\u3059\u308b",
+"force.stop.instance.warning": "\u8b66\u544a: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5f37\u5236\u505c\u6b62\u306f\u3001\u6700\u7d42\u624b\u6bb5\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30c7\u30fc\u30bf\u3092\u640d\u5931\u3059\u308b\u3060\u3051\u3067\u306a\u304f\u3001\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u52d5\u4f5c\u304c\u4e00\u8cab\u3057\u306a\u304f\u306a\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"hint.no.host.tags": "\u30db\u30b9\u30c8\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
+"hint.no.storage.tags": "\u30b9\u30c8\u30ec\u30fc\u30b8\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
+"hint.type.part.host.tag": "\u30db\u30b9\u30c8\u30bf\u30b0\u306e\u7a2e\u985e",
+"hint.type.part.storage.tag": "\u30b9\u30c8\u30ec\u30fc\u30b8\u30bf\u30b0\u306e\u7a2e\u985e",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "\u753b\u50cf\u30c7\u30a3\u30ec\u30af\u30c8\u30ea",
+"inline": "\u76f4\u5217",
+"label.about": "\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831",
+"label.about.app": "CloudStack \u306b\u3064\u3044\u3066",
+"label.accept.project.invitation": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85\u306e\u627f\u8afe",
+"label.accesskey": "\u30a2\u30af\u30bb\u30b9 \u30ad\u30fc",
+"label.account": "\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.account.and.security.group": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.account.details": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8a73\u7d30",
+"label.account.id": "\u30a2\u30ab\u30a6\u30f3\u30c8 ID",
+"label.account.name": "\u30a2\u30ab\u30a6\u30f3\u30c8\u540d",
+"label.account.specific": "\u30a2\u30ab\u30a6\u30f3\u30c8\u56fa\u6709",
+"label.accounts": "\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.accounttype": "\u30a2\u30ab\u30a6\u30f3\u30c8\u30bf\u30a4\u30d7",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL \u30eb\u30fc\u30eb\u306e\u30ea\u30b9\u30c8",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL \u304c\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3057\u305f",
+"label.aclid": "ACL",
+"label.aclname": "ACL \u540d",
+"label.acltotal": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u5408\u8a08",
+"label.acquire.new.ip": "\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97",
+"label.acquire.new.secondary.ip": "\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97",
+"label.action": "\u64cd\u4f5c",
+"label.action.attach.disk": "\u30c7\u30a3\u30b9\u30af\u306e\u30a2\u30bf\u30c3\u30c1",
+"label.action.attach.disk.processing": "\u30c7\u30a3\u30b9\u30af\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...",
+"label.action.attach.iso": "ISO \u306e\u30a2\u30bf\u30c3\u30c1",
+"label.action.attach.iso.processing": "ISO \u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...",
+"label.action.cancel.maintenance.mode": "\u4fdd\u5b88\u30e2\u30fc\u30c9\u306e\u30ad\u30e3\u30f3\u30bb\u30eb",
+"label.action.cancel.maintenance.mode.processing": "\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3044\u307e\u3059...",
+"label.action.change.password": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4",
+"label.action.change.service": "\u30b5\u30fc\u30d3\u30b9\u306e\u5909\u66f4",
+"label.action.change.service.processing": "\u30b5\u30fc\u30d3\u30b9\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059...",
+"label.action.configure.samlauthorization": "SAML SSO \u8a8d\u8a3c\u3092\u8a2d\u5b9a\u3059\u308b",
+"label.action.configure.stickiness": "\u6301\u7d9a\u6027",
+"label.action.copy.iso": "ISO \u306e\u30b3\u30d4\u30fc",
+"label.action.copy.iso.processing": "ISO \u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059....",
+"label.action.copy.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30b3\u30d4\u30fc",
+"label.action.copy.template.processing": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059....",
+"label.action.create.template.from.vm": "VM \u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u4f5c\u6210",
+"label.action.create.template.from.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u4f5c\u6210",
+"label.action.create.template.processing": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059...",
+"label.action.create.vm": "VM \u306e\u4f5c\u6210",
+"label.action.create.vm.processing": "VM \u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059...",
+"label.action.create.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u4f5c\u6210",
+"label.action.create.volume.processing": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u524a\u9664",
+"label.action.delete.account.processing": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u524a\u9664",
+"label.action.delete.cluster.processing": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.disk.offering": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664",
+"label.action.delete.disk.offering.processing": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.domain": "\u30c9\u30e1\u30a4\u30f3\u306e\u524a\u9664",
+"label.action.delete.domain.processing": "\u30c9\u30e1\u30a4\u30f3\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.firewall": "\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u898f\u5247\u306e\u524a\u9664",
+"label.action.delete.firewall.processing": "\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.ingress.rule": "\u53d7\u4fe1\u898f\u5247\u306e\u524a\u9664",
+"label.action.delete.ingress.rule.processing": "\u53d7\u4fe1\u898f\u5247\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.ip.range": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664",
+"label.action.delete.ip.range.processing": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.iso": "ISO \u306e\u524a\u9664",
+"label.action.delete.iso.processing": "ISO \u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u306e\u524a\u9664",
+"label.action.delete.load.balancer.processing": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u524a\u9664",
+"label.action.delete.network.processing": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.nexusvswitch": "Nexus 1000V \u306e\u524a\u9664",
+"label.action.delete.nic": "NIC \u306e\u524a\u9664",
+"label.action.delete.physical.network": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u524a\u9664",
+"label.action.delete.pod": "\u30dd\u30c3\u30c9\u306e\u524a\u9664",
+"label.action.delete.pod.processing": "\u30dd\u30c3\u30c9\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.primary.storage": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u524a\u9664",
+"label.action.delete.primary.storage.processing": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.secondary.storage": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u524a\u9664",
+"label.action.delete.secondary.storage.processing": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.security.group": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664",
+"label.action.delete.security.group.processing": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.service.offering": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664",
+"label.action.delete.service.offering.processing": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.snapshot": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u524a\u9664",
+"label.action.delete.snapshot.processing": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.system.service.offering": "\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664",
+"label.action.delete.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u524a\u9664",
+"label.action.delete.template.processing": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.user": "\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664",
+"label.action.delete.user.processing": "\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u524a\u9664",
+"label.action.delete.volume.processing": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.delete.zone": "\u30be\u30fc\u30f3\u306e\u524a\u9664",
+"label.action.delete.zone.processing": "\u30be\u30fc\u30f3\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.destroy.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4",
+"label.action.destroy.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7834\u68c4\u3057\u3066\u3044\u307e\u3059...",
+"label.action.destroy.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u7834\u68c4",
+"label.action.destroy.systemvm.processing": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u7834\u68c4\u3057\u3066\u3044\u307e\u3059...",
+"label.action.destroy.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u7834\u68c4",
+"label.action.detach.disk": "\u30c7\u30a3\u30b9\u30af\u306e\u30c7\u30bf\u30c3\u30c1",
+"label.action.detach.disk.processing": "\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...",
+"label.action.detach.iso": "ISO \u306e\u30c7\u30bf\u30c3\u30c1",
+"label.action.detach.iso.processing": "ISO \u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u7121\u52b9\u5316",
+"label.action.disable.account.processing": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7121\u52b9\u5316",
+"label.action.disable.cluster.processing": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.nexusvswitch": "Nexus 1000V \u306e\u7121\u52b9\u5316",
+"label.action.disable.physical.network": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7121\u52b9\u5316",
+"label.action.disable.pod": "\u30dd\u30c3\u30c9\u306e\u7121\u52b9\u5316",
+"label.action.disable.pod.processing": "\u30dd\u30c3\u30c9\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.static.nat": "\u9759\u7684 NAT \u306e\u7121\u52b9\u5316",
+"label.action.disable.static.nat.processing": "\u9759\u7684 NAT \u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.user": "\u30e6\u30fc\u30b6\u30fc\u306e\u7121\u52b9\u5316",
+"label.action.disable.user.processing": "\u30e6\u30fc\u30b6\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.disable.zone": "\u30be\u30fc\u30f3\u306e\u7121\u52b9\u5316",
+"label.action.disable.zone.processing": "\u30be\u30fc\u30f3\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.download.iso": "ISO \u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
+"label.action.download.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
+"label.action.download.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9",
+"label.action.download.volume.processing": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059...",
+"label.action.edit.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u7de8\u96c6",
+"label.action.edit.disk.offering": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6",
+"label.action.edit.domain": "\u30c9\u30e1\u30a4\u30f3\u306e\u7de8\u96c6",
+"label.action.edit.global.setting": "\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a\u306e\u7de8\u96c6",
+"label.action.edit.host": "\u30db\u30b9\u30c8\u306e\u7de8\u96c6",
+"label.action.edit.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7de8\u96c6",
+"label.action.edit.iso": "ISO \u306e\u7de8\u96c6",
+"label.action.edit.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7de8\u96c6",
+"label.action.edit.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6",
+"label.action.edit.network.processing": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u7de8\u96c6\u3057\u3066\u3044\u307e\u3059...",
+"label.action.edit.pod": "\u30dd\u30c3\u30c9\u306e\u7de8\u96c6",
+"label.action.edit.primary.storage": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7de8\u96c6",
+"label.action.edit.resource.limits": "\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u7de8\u96c6",
+"label.action.edit.service.offering": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6",
+"label.action.edit.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7de8\u96c6",
+"label.action.edit.user": "\u30e6\u30fc\u30b6\u30fc\u306e\u7de8\u96c6",
+"label.action.edit.zone": "\u30be\u30fc\u30f3\u306e\u7de8\u96c6",
+"label.action.enable.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u6709\u52b9\u5316",
+"label.action.enable.account.processing": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u6709\u52b9\u5316",
+"label.action.enable.cluster.processing": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.maintenance.mode": "\u4fdd\u5b88\u30e2\u30fc\u30c9\u306e\u6709\u52b9\u5316",
+"label.action.enable.maintenance.mode.processing": "\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.nexusvswitch": "Nexus 1000V \u306e\u6709\u52b9\u5316",
+"label.action.enable.physical.network": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u6709\u52b9\u5316",
+"label.action.enable.pod": "\u30dd\u30c3\u30c9\u306e\u6709\u52b9\u5316",
+"label.action.enable.pod.processing": "\u30dd\u30c3\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.static.nat": "\u9759\u7684 NAT \u306e\u6709\u52b9\u5316",
+"label.action.enable.static.nat.processing": "\u9759\u7684 NAT \u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.user": "\u30e6\u30fc\u30b6\u30fc\u306e\u6709\u52b9\u5316",
+"label.action.enable.user.processing": "\u30e6\u30fc\u30b6\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.enable.zone": "\u30be\u30fc\u30f3\u306e\u6709\u52b9\u5316",
+"label.action.enable.zone.processing": "\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.expunge.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u62b9\u6d88",
+"label.action.expunge.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3044\u307e\u3059...",
+"label.action.force.reconnect": "\u5f37\u5236\u518d\u63a5\u7d9a",
+"label.action.force.reconnect.processing": "\u518d\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059...",
+"label.action.generate.keys": "\u30ad\u30fc\u306e\u751f\u6210",
+"label.action.generate.keys.processing": "\u30ad\u30fc\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059...",
+"label.action.list.nexusvswitch": "Nexus 1000V \u306e\u4e00\u89a7\u8868\u793a",
+"label.action.lock.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ed\u30c3\u30af",
+"label.action.lock.account.processing": "\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3066\u3044\u307e\u3059...",
+"label.action.manage.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7ba1\u7406\u5bfe\u8c61\u5316",
+"label.action.manage.cluster.processing": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.migrate.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c",
+"label.action.migrate.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059...",
+"label.action.migrate.router": "\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c",
+"label.action.migrate.router.processing": "\u30eb\u30fc\u30bf\u30fc\u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059...",
+"label.action.migrate.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c",
+"label.action.migrate.systemvm.processing": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059...",
+"label.action.project.add.account": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0",
+"label.action.reboot.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u518d\u8d77\u52d5",
+"label.action.reboot.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.reboot.router": "\u30eb\u30fc\u30bf\u30fc\u306e\u518d\u8d77\u52d5",
+"label.action.reboot.router.processing": "\u30eb\u30fc\u30bf\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.reboot.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u518d\u8d77\u52d5",
+"label.action.reboot.systemvm.processing": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.recover.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u5fa9\u5143",
+"label.action.recurring.snapshot": "\u5b9a\u671f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8",
+"label.action.register.iso": "ISO \u306e\u767b\u9332",
+"label.action.register.template": "URL \u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u767b\u9332",
+"label.action.release.ip": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u89e3\u653e",
+"label.action.release.ip.processing": "IP \u30a2\u30c9\u30ec\u30b9\u3092\u89e3\u653e\u3057\u3066\u3044\u307e\u3059...",
+"label.action.remove.host": "\u30db\u30b9\u30c8\u306e\u524a\u9664",
+"label.action.remove.host.processing": "\u30db\u30b9\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.action.reset.password": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30ea\u30bb\u30c3\u30c8",
+"label.action.reset.password.processing": "\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u3044\u307e\u3059...",
+"label.action.resize.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306e\u5909\u66f4",
+"label.action.resize.volume.processing": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b5\u30a4\u30ba\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059...",
+"label.action.resource.limits": "\u30ea\u30bd\u30fc\u30b9\u5236\u9650",
+"label.action.restore.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5fa9\u5143",
+"label.action.restore.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5fa9\u5143\u3057\u3066\u3044\u307e\u3059...",
+"label.action.revert.snapshot": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059",
+"label.action.revert.snapshot.processing": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.start.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5",
+"label.action.start.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.start.router": "\u30eb\u30fc\u30bf\u30fc\u306e\u8d77\u52d5",
+"label.action.start.router.processing": "\u30eb\u30fc\u30bf\u30fc\u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.start.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8d77\u52d5",
+"label.action.start.systemvm.processing": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059...",
+"label.action.stop.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u505c\u6b62",
+"label.action.stop.instance.processing": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059...",
+"label.action.stop.router": "\u30eb\u30fc\u30bf\u30fc\u306e\u505c\u6b62",
+"label.action.stop.router.processing": "\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059...",
+"label.action.stop.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u505c\u6b62",
+"label.action.stop.systemvm.processing": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059...",
+"label.action.take.snapshot": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210",
+"label.action.take.snapshot.processing": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059....",
+"label.action.unmanage.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u975e\u7ba1\u7406\u5bfe\u8c61\u5316",
+"label.action.unmanage.cluster.processing": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3044\u307e\u3059...",
+"label.action.update.os.preference": "OS \u57fa\u672c\u8a2d\u5b9a\u306e\u66f4\u65b0",
+"label.action.update.os.preference.processing": "OS \u57fa\u672c\u8a2d\u5b9a\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059...",
+"label.action.update.resource.count": "\u30ea\u30bd\u30fc\u30b9\u6570\u306e\u66f4\u65b0",
+"label.action.update.resource.count.processing": "\u30ea\u30bd\u30fc\u30b9\u6570\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059...",
+"label.action.vmsnapshot.create": "VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210",
+"label.action.vmsnapshot.delete": "VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u524a\u9664",
+"label.action.vmsnapshot.revert": "VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059",
+"label.actions": "\u64cd\u4f5c",
+"label.activate.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u5316",
+"label.activeviewersessions": "\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30bb\u30c3\u30b7\u30e7\u30f3",
+"label.add": "\u8ffd\u52a0",
+"label.add.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0",
+"label.add.accounts": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0",
+"label.add.accounts.to": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0\u5148:",
+"label.add.acl": "ACL \u306e\u8ffd\u52a0",
+"label.add.acl.list": "ACL \u4e00\u89a7\u306e\u8ffd\u52a0",
+"label.add.affinity.group": "\u65b0\u3057\u3044\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0",
+"label.add.baremetal.dhcp.device": "\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.baremetal.rack.configuration": "\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u306e\u8ffd\u52a0",
+"label.add.bigswitchbcf.device": "BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u8ffd\u52a0",
+"label.add.brocadevcs.device": "Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u8ffd\u52a0",
+"label.add.by": "\u8ffd\u52a0\u5358\u4f4d",
+"label.add.by.cidr": "CIDR \u3067\u8ffd\u52a0",
+"label.add.by.group": "\u30b0\u30eb\u30fc\u30d7\u3067\u8ffd\u52a0",
+"label.add.ciscoasa1000v": "Cisco ASA 1000V \u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0",
+"label.add.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u8ffd\u52a0",
+"label.add.compute.offering": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.direct.iprange": "\u76f4\u63a5 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0",
+"label.add.disk.offering": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.domain": "\u30c9\u30e1\u30a4\u30f3\u306e\u8ffd\u52a0",
+"label.add.egress.rule": "\u9001\u4fe1\u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.f5.device": "F5 \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.firewall": "\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.globo.dns": "GloboDNS \u306e\u8ffd\u52a0",
+"label.add.gslb": "GSLB \u306e\u8ffd\u52a0",
+"label.add.guest.network": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.add.host": "\u30db\u30b9\u30c8\u306e\u8ffd\u52a0",
+"label.add.ingress.rule": "\u53d7\u4fe1\u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.intermediate.certificate": "\u4e2d\u9593\u8a3c\u660e\u66f8\u306e\u8ffd\u52a0",
+"label.add.internal.lb": "\u5185\u90e8 LB \u306e\u8ffd\u52a0",
+"label.add.ip.range": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0",
+"label.add.isolated.guest.network": "\u5206\u96e2\u30b2\u30b9\u30c8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.add.isolated.guest.network.with.sourcenat": "\u5206\u96e2\u30b2\u30b9\u30c8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af(\u9001\u4fe1\u5143NAT)\u306e\u8ffd\u52a0",
+"label.add.isolated.network": "\u5206\u96e2\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.add.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "LDAP \u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0",
+"label.add.list.name": "ACL \u4e00\u89a7\u540d",
+"label.add.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u8ffd\u52a0",
+"label.add.more": "\u305d\u306e\u307b\u304b\u306e\u9805\u76ee\u306e\u8ffd\u52a0",
+"label.add.netscaler.device": "NetScaler \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.add.network.acl": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u306e\u8ffd\u52a0",
+"label.add.network.acl.list": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u4e00\u89a7\u306e\u8ffd\u52a0",
+"label.add.network.device": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.new.f5": "\u65b0\u3057\u3044 F5 \u306e\u8ffd\u52a0",
+"label.add.new.gateway": "\u65b0\u3057\u3044\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0",
+"label.add.new.netscaler": "\u65b0\u3057\u3044 NetScaler \u306e\u8ffd\u52a0",
+"label.add.new.pa": "\u65b0\u3057\u3044 Palo Alto \u306e\u8ffd\u52a0",
+"label.add.new.srx": "\u65b0\u3057\u3044 SRX \u306e\u8ffd\u52a0",
+"label.add.new.tier": "\u65b0\u3057\u3044\u968e\u5c64\u306e\u8ffd\u52a0",
+"label.add.nfs.secondary.staging.store": "NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u8ffd\u52a0",
+"label.add.niciranvp.device": "NVP Controller \u306e\u8ffd\u52a0",
+"label.add.opendaylight.device": "OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8ffd\u52a0",
+"label.add.pa.device": "Palo Alto \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.physical.network": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.add.pod": "\u30dd\u30c3\u30c9\u306e\u8ffd\u52a0",
+"label.add.port.forwarding.rule": "\u30dd\u30fc\u30c8\u8ee2\u9001\u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.portable.ip.range": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0",
+"label.add.primary.storage": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8ffd\u52a0",
+"label.add.private.gateway": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0",
+"label.add.region": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8ffd\u52a0",
+"label.add.resources": "\u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0",
+"label.add.role": "Add Role",
+"label.add.route": "\u30eb\u30fc\u30c8\u306e\u8ffd\u52a0",
+"label.add.rule": "\u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.rule.desc": "Create a new ACL rule",
+"label.add.secondary.storage": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8ffd\u52a0",
+"label.add.security.group": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0",
+"label.add.service.offering": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.srx.device": "SRX \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.static.nat.rule": "\u9759\u7684 NAT \u898f\u5247\u306e\u8ffd\u52a0",
+"label.add.static.route": "\u9759\u7684\u30eb\u30fc\u30c8\u306e\u8ffd\u52a0",
+"label.add.system.service.offering": "\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u8ffd\u52a0",
+"label.add.to.group": "\u8ffd\u52a0\u5148\u30b0\u30eb\u30fc\u30d7",
+"label.add.ucs.manager": "UCS Manager \u306e\u8ffd\u52a0",
+"label.add.user": "\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0",
+"label.add.vlan": "VLAN \u306e\u8ffd\u52a0",
+"label.add.vm": "VM \u306e\u8ffd\u52a0",
+"label.add.vm.to.tier": "\u968e\u5c64\u3078\u306e VM \u306e\u8ffd\u52a0",
+"label.add.vms": "VM \u306e\u8ffd\u52a0",
+"label.add.vms.to.lb": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u3078\u306e VM \u306e\u8ffd\u52a0",
+"label.add.vmware.datacenter": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e\u8ffd\u52a0",
+"label.add.vnmc.device": "VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.add.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u8ffd\u52a0",
+"label.add.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u8ffd\u52a0",
+"label.add.vpc": "VPC \u306e\u8ffd\u52a0",
+"label.add.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0",
+"label.add.vpn.customer.gateway": "VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0",
+"label.add.vpn.gateway": "VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0",
+"label.add.vpn.user": "VPN \u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0",
+"label.add.vxlan": "VXLAN \u306e\u8ffd\u52a0",
+"label.add.zone": "\u30be\u30fc\u30f3\u306e\u8ffd\u52a0",
+"label.added.brocade.vcs.switch": "\u65b0\u3057\u3044 Brocade VCS \u30b9\u30a4\u30c3\u30c1\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.added.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.added.new.bigswitch.bcf.controller": "\u65b0\u3057\u3044 BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.added.nicira.nvp.controller": "\u65b0\u3057\u3044 Nicira NVP Controller \u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.addes.new.f5": "\u65b0\u3057\u3044 F5 \u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.adding": "\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"label.adding.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"label.adding.failed": "\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
+"label.adding.pod": "\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"label.adding.processing": "\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059...",
+"label.adding.succeeded": "\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"label.adding.user": "\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"label.adding.zone": "\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"label.additional.networks": "\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.address": "Address",
+"label.admin": "\u7ba1\u7406\u8005",
+"label.admin.accounts": "\u7ba1\u7406\u8005\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.advanced": "\u62e1\u5f35",
+"label.advanced.mode": "\u62e1\u5f35\u30e2\u30fc\u30c9",
+"label.advanced.search": "\u9ad8\u5ea6\u306a\u691c\u7d22",
+"label.affinity": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3",
+"label.affinity.groups": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.affinitygroup": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.agent.password": "\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8 \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.agent.username": "\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8 \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.agentport": "\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30dd\u30fc\u30c8",
+"label.agentstate": "\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u72b6\u614b",
+"label.agree": "\u540c\u610f\u3059\u308b",
+"label.alert": "\u30a2\u30e9\u30fc\u30c8",
+"label.alert.archived": "\u30a2\u30e9\u30fc\u30c8\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u3055\u308c\u307e\u3057\u305f",
+"label.alert.deleted": "\u30a2\u30e9\u30fc\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f",
+"label.alert.details": "\u30a2\u30e9\u30fc\u30c8\u306e\u8a73\u7d30",
+"label.alerts": "\u30a2\u30e9\u30fc\u30c8",
+"label.algorithm": "\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0",
+"label.all": "\u3059\u3079\u3066",
+"label.allocated": "\u5272\u308a\u5f53\u3066\u6e08\u307f",
+"label.allocationstate": "\u5272\u308a\u5f53\u3066\u72b6\u614b",
+"label.allow": "\u8a31\u53ef",
+"label.anti.affinity": "\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3",
+"label.anti.affinity.group": "\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.anti.affinity.groups": "\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.api.version": "API \u30d0\u30fc\u30b8\u30e7\u30f3",
+"label.apikey": "API \u30ad\u30fc",
+"label.app.name": "CloudStack",
+"label.apply": "\u9069\u7528",
+"label.archive": "\u30a2\u30fc\u30ab\u30a4\u30d6",
+"label.archive.alerts": "\u30a2\u30e9\u30fc\u30c8\u306e\u30a2\u30fc\u30ab\u30a4\u30d6",
+"label.archive.events": "\u30a4\u30d9\u30f3\u30c8\u306e\u30a2\u30fc\u30ab\u30a4\u30d6",
+"label.assign": "\u5272\u308a\u5f53\u3066",
+"label.assign.instance.another": "\u307b\u304b\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5272\u308a\u5f53\u3066",
+"label.assign.to.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5272\u308a\u5f53\u3066\u3066\u3044\u307e\u3059",
+"label.assign.vms": "\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u5272\u308a\u5f53\u3066",
+"label.associatednetwork": "\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.associatednetworkid": "\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID",
+"label.associatednetworkname": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d",
+"label.author.email": "\u4f5c\u6210\u8005\u306e\u96fb\u5b50\u30e1\u30fc\u30eb",
+"label.author.name": "\u4f5c\u6210\u8005\u306e\u540d\u524d",
+"label.autoscale": "\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a",
+"label.autoscale.configuration.wizard": "\u30aa\u30fc\u30c8\u30b9\u30b1\u30fc\u30eb\u8a2d\u5b9a\u30a6\u30a3\u30b6\u30fc\u30c9",
+"label.availability": "\u53ef\u7528\u6027",
+"label.availabilityzone": "\u30a2\u30d9\u30a4\u30e9\u30d3\u30ea\u30c6\u30a3\u30be\u30fc\u30f3",
+"label.available": "\u4f7f\u7528\u53ef\u80fd",
+"label.available.public.ips": "\u4f7f\u7528\u3067\u304d\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.back": "\u623b\u308b",
+"label.balance": "Balance",
+"label.bandwidth": "\u5e2f\u57df\u5e45",
+"label.baremetal.dhcp.devices": "\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30c7\u30d0\u30a4\u30b9",
+"label.baremetal.dhcp.provider": "\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.baremetal.pxe.device": "\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0",
+"label.baremetal.pxe.devices": "\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30c7\u30d0\u30a4\u30b9",
+"label.baremetal.pxe.provider": "\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.baremetal.rack.configuration": "\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a",
+"label.baremetalcpu": "CPU (MHz)",
+"label.baremetalcpucores": "CPU \u30b3\u30a2\u6570",
+"label.baremetalmac": "\u30db\u30b9\u30c8\u306e MAC",
+"label.baremetalmemory": "\u30e1\u30e2\u30ea (MB)",
+"label.basic": "\u57fa\u672c",
+"label.basic.mode": "\u57fa\u672c\u30e2\u30fc\u30c9",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF \u306e\u8a73\u7d30",
+"label.bigswitch.controller.address": "BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u30a2\u30c9\u30ec\u30b9",
+"label.bladeid": "\u30d6\u30ec\u30fc\u30c9 ID",
+"label.blades": "\u30d6\u30ec\u30fc\u30c9",
+"label.bootable": "\u8d77\u52d5\u53ef\u80fd",
+"label.broadcastdomainrange": "\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7bc4\u56f2",
+"label.broadcastdomaintype": "\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7a2e\u985e",
+"label.broadcasturi": "\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 URI",
+"label.brocade.vcs.address": "VCS \u30b9\u30a4\u30c3\u30c1 \u30a2\u30c9\u30ec\u30b9",
+"label.brocade.vcs.details": "Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u8a73\u7d30",
+"label.bucket": "\u30d0\u30b1\u30c3\u30c8",
+"label.by.account": "\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.by.alert.type": "\u30a2\u30e9\u30fc\u30c8\u306e\u7a2e\u985e",
+"label.by.availability": "\u53ef\u7528\u6027",
+"label.by.domain": "\u30c9\u30e1\u30a4\u30f3",
+"label.by.end.date": "\u7d42\u4e86\u65e5",
+"label.by.event.type": "\u30a4\u30d9\u30f3\u30c8\u306e\u7a2e\u985e",
+"label.by.level": "\u30ec\u30d9\u30eb",
+"label.by.pod": "\u30dd\u30c3\u30c9",
+"label.by.role": "\u5f79\u5272",
+"label.by.start.date": "\u958b\u59cb\u65e5",
+"label.by.state": "\u72b6\u614b",
+"label.by.traffic.type": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e",
+"label.by.type": "\u7a2e\u985e",
+"label.by.type.id": "\u7a2e\u985e ID",
+"label.by.zone": "\u30be\u30fc\u30f3",
+"label.cachemode": "\u66f8\u304d\u8fbc\u307f\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u7a2e\u985e",
+"label.cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb",
+"label.capacity": "\u51e6\u7406\u80fd\u529b",
+"label.capacity.iops": "\u51e6\u7406\u80fd\u529b (IOPS)",
+"label.capacitybytes": "\u51e6\u7406\u80fd\u529b (\u30d0\u30a4\u30c8)",
+"label.capacityiops": "IOPS \u5408\u8a08",
+"label.certificate": "\u30b5\u30fc\u30d0\u30fc\u8a3c\u660e\u66f8",
+"label.change.affinity": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3\u306e\u5909\u66f4",
+"label.change.ipaddress": "NIC \u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u5909\u66f4",
+"label.change.service.offering": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u5909\u66f4",
+"label.change.value": "\u5024\u306e\u5909\u66f4",
+"label.character": "\u6587\u5b57",
+"label.chassis": "\u30b7\u30e3\u30fc\u30b7",
+"label.checksum": "\u30c1\u30a7\u30c3\u30af\u30b5\u30e0",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR \u307e\u305f\u306f\u30a2\u30ab\u30a6\u30f3\u30c8/\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.cidr.of.destination.network": "\u5b9b\u5148\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e CIDR",
+"label.cidrlist": "\u9001\u4fe1\u5143 CIDR",
+"label.cisco.nexus1000v.ip.address": "Nexus 1000V \u306e IP \u30a2\u30c9\u30ec\u30b9",
+"label.cisco.nexus1000v.password": "Nexus 1000V \u306e\u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.cisco.nexus1000v.username": "Nexus 1000V \u306e\u30e6\u30fc\u30b6\u30fc\u540d",
+"label.ciscovnmc.resource.details": "Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u306e\u8a73\u7d30",
+"label.cleanup": "\u30af\u30ea\u30fc\u30f3 \u30a2\u30c3\u30d7\u3059\u308b",
+"label.clear.list": "\u4e00\u89a7\u306e\u6d88\u53bb",
+"label.close": "\u9589\u3058\u308b",
+"label.cloud.console": "\u30af\u30e9\u30a6\u30c9\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb",
+"label.cloud.managed": "Cloud.com \u306b\u3088\u308b\u7ba1\u7406",
+"label.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc",
+"label.cluster.name": "\u30af\u30e9\u30b9\u30bf\u30fc\u540d",
+"label.clusterid": "\u30af\u30e9\u30b9\u30bf\u30fc",
+"label.clustername": "\u30af\u30e9\u30b9\u30bf\u30fc",
+"label.clusternamelabel": "\u30af\u30e9\u30b9\u30bf\u30fc\u540d",
+"label.clusters": "\u30af\u30e9\u30b9\u30bf\u30fc",
+"label.clustertype": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7a2e\u985e",
+"label.clvm": "CLVM",
+"label.code": "\u30b3\u30fc\u30c9",
+"label.community": "\u30b3\u30df\u30e5\u30cb\u30c6\u30a3",
+"label.compute": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0",
+"label.compute.and.storage": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.compute.offerings": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.configuration": "\u69cb\u6210",
+"label.configure": "\u69cb\u6210",
+"label.configure.ldap": "LDAP \u306e\u69cb\u6210",
+"label.configure.network.acls": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u306e\u69cb\u6210",
+"label.configure.sticky.policy": "\u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a",
+"label.configure.vpc": "VPC \u306e\u69cb\u6210",
+"label.confirmation": "\u78ba\u8a8d",
+"label.confirmdeclineinvitation": "\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85\u3092\u8f9e\u9000\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"label.confirmpassword": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u78ba\u8a8d\u5165\u529b",
+"label.congratulations": "\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306f\u3053\u308c\u3067\u5b8c\u4e86\u3067\u3059\u3002",
+"label.connectiontimeout": "\u63a5\u7d9a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8",
+"label.conservemode": "\u7bc0\u7d04\u30e2\u30fc\u30c9",
+"label.console.proxy": "\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7",
+"label.console.proxy.vm": "\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM",
+"label.continue": "\u7d9a\u884c",
+"label.continue.basic.install": "\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u7d9a\u884c\u3059\u308b",
+"label.copying.iso": "ISO \u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059",
+"label.corrections.saved": "\u63a5\u7d9a\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f",
+"label.counterid": "\u30ab\u30a6\u30f3\u30bf\u30fc",
+"label.cpu": "CPU",
+"label.cpu.allocated": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e CPU",
+"label.cpu.sockets": "CPU \u30bd\u30b1\u30c3\u30c8",
+"label.cpuallocated": "VM \u306b\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e CPU",
+"label.cpuallocatedghz": "\u5272\u308a\u5f53\u3066\u6e08\u307f",
+"label.cpulimit": "CPU \u5236\u9650",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "CPU \u30bd\u30b1\u30c3\u30c8\u6570",
+"label.cpuspeed": "CPU (MHz)",
+"label.cputotal": "CPU \u5408\u8a08",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU \u4f7f\u7528\u7387",
+"label.create.nfs.secondary.staging.storage": "NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3059\u308b",
+"label.create.nfs.secondary.staging.store": "NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3059\u308b",
+"label.create.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210",
+"label.create.ssh.key.pair": "SSH \u306e\u30ad\u30fc\u30da\u30a2\u3092\u4f5c\u6210",
+"label.create.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210",
+"label.create.vpn.connection": "VPN \u63a5\u7d9a\u306e\u4f5c\u6210",
+"label.created": "\u4f5c\u6210\u65e5\u6642",
+"label.created.by.system": "\u30b7\u30b9\u30c6\u30e0\u4f5c\u6210",
+"label.createnfscache": "NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3059\u308b",
+"label.credit": "Credit",
+"label.crosszones": "\u30af\u30ed\u30b9 \u30be\u30fc\u30f3",
+"label.current": "\u4f7f\u7528\u4e2d",
+"label.currentpassword": "Current Password",
+"label.custom": "\u30ab\u30b9\u30bf\u30e0",
+"label.custom.disk.offering": "\u30ab\u30b9\u30bf\u30e0\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.customdisksize": "\u30ab\u30b9\u30bf\u30e0 \u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba",
+"label.daily": "\u6bce\u65e5",
+"label.dashboard": "\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9",
+"label.data.disk.offering": "\u30c7\u30fc\u30bf \u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.date": "\u65e5\u6642",
+"label.day": "\u65e5",
+"label.day.of.month": "\u6bce\u6708\u6307\u5b9a\u65e5",
+"label.day.of.week": "\u6bce\u9031\u6307\u5b9a\u65e5",
+"label.dc.name": "DC \u540d",
+"label.decline.invitation": "\u62db\u5f85\u306e\u8f9e\u9000",
+"label.dedicate": "\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicate.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicate.host": "\u30db\u30b9\u30c8\u3092\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicate.pod": "\u30dd\u30c3\u30c9\u3092\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicate.vlan.vni.range": "VLAN/VNI \u306e\u7bc4\u56f2\u3092\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicate.zone": "\u30be\u30fc\u30f3\u3092\u5c02\u7528\u306b\u8a2d\u5b9a",
+"label.dedicated": "\u5c02\u7528",
+"label.dedicated.vlan.vni.ranges": "\u5c02\u7528 VLAN/VNI \u306e\u7bc4\u56f2",
+"label.default": "\u30c7\u30d5\u30a9\u30eb\u30c8",
+"label.default.use": "\u30c7\u30d5\u30a9\u30eb\u30c8\u4f7f\u7528",
+"label.default.view": "\u30c7\u30d5\u30a9\u30eb\u30c8 \u30d3\u30e5\u30fc",
+"label.delete": "\u524a\u9664",
+"label.delete.acl.list": "ACL \u4e00\u89a7\u306e\u524a\u9664",
+"label.delete.affinity.group": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664",
+"label.delete.alerts": "\u30a2\u30e9\u30fc\u30c8\u306e\u524a\u9664",
+"label.delete.baremetal.rack.configuration": "\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u306e\u524a\u9664",
+"label.delete.bigswitchbcf": "BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u524a\u9664",
+"label.delete.brocadevcs": "Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u524a\u9664",
+"label.delete.ciscoasa1000v": "Cisco ASA 1000V \u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664",
+"label.delete.ciscovnmc.resource": "Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664",
+"label.delete.events": "\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664",
+"label.delete.f5": "F5 \u306e\u524a\u9664",
+"label.delete.gateway": "\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664",
+"label.delete.internal.lb": "\u5185\u90e8 LB \u306e\u524a\u9664",
+"label.delete.netscaler": "NetScaler \u306e\u524a\u9664",
+"label.delete.niciranvp": "NVP Controller \u306e\u524a\u9664",
+"label.delete.opendaylight.device": "OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u524a\u9664",
+"label.delete.pa": "Palo Alto \u306e\u524a\u9664",
+"label.delete.portable.ip.range": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664",
+"label.delete.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u524a\u9664",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u524a\u9664",
+"label.delete.srx": "SRX \u306e\u524a\u9664",
+"label.delete.ucs.manager": "UCS Manager \u306e\u524a\u9664",
+"label.delete.vpn.connection": "VPN \u63a5\u7d9a\u306e\u524a\u9664",
+"label.delete.vpn.customer.gateway": "VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664",
+"label.delete.vpn.gateway": "VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664",
+"label.delete.vpn.user": "VPN \u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664",
+"label.deleteprofile": "\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u524a\u9664",
+"label.deleting.failed": "\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
+"label.deleting.processing": "\u524a\u9664\u3057\u3066\u3044\u307e\u3059...",
+"label.deny": "\u62d2\u5426",
+"label.deploymentplanner": "\u5c55\u958b\u30d7\u30e9\u30f3\u30ca\u30fc",
+"label.description": "\u8aac\u660e",
+"label.destinationphysicalnetworkid": "\u30d6\u30ea\u30c3\u30b8\u5148\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID",
+"label.destinationzoneid": "\u30b3\u30d4\u30fc\u5148\u30be\u30fc\u30f3",
+"label.destroy": "\u7834\u68c4",
+"label.destroy.router": "\u30eb\u30fc\u30bf\u30fc\u306e\u7834\u68c4",
+"label.destroyvmgraceperiod": "VM \u7834\u68c4\u306e\u7336\u4e88\u671f\u9593",
+"label.detaching.disk": "\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059",
+"label.details": "\u8a73\u7d30",
+"label.deviceid": "\u30c7\u30d0\u30a4\u30b9 ID",
+"label.devices": "\u30c7\u30d0\u30a4\u30b9",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP \u30b5\u30fc\u30d0\u30fc\u306e\u7a2e\u985e",
+"label.direct.attached.public.ip": "\u76f4\u63a5\u30a2\u30bf\u30c3\u30c1\u3055\u308c\u3066\u3044\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.direct.ips": "\u5171\u6709\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e IP \u30a2\u30c9\u30ec\u30b9",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a\u306e\u7121\u52b9\u5316",
+"label.disable.host": "\u30db\u30b9\u30c8\u306e\u7121\u52b9\u5316",
+"label.disable.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7121\u52b9\u5316",
+"label.disable.provider": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u7121\u52b9\u5316",
+"label.disable.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u7121\u52b9\u5316",
+"label.disable.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7121\u52b9\u5316",
+"label.disable.vpn": "\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u306e\u7121\u52b9\u5316",
+"label.disabled": "\u7121\u52b9",
+"label.disabling.vpn.access": "VPN \u30a2\u30af\u30bb\u30b9\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"label.disassociate.profile.blade": "\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3068\u30d6\u30ec\u30fc\u30c9\u306e\u95a2\u9023\u4ed8\u3051\u306e\u89e3\u9664",
+"label.disbale.vnmc.device": "VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u7121\u52b9\u5316",
+"label.disconnected": "\u6700\u7d42\u5207\u65ad\u65e5\u6642",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30",
+"label.disk.offerings": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.disk.size": "\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba",
+"label.disk.volume": "\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0",
+"label.diskbytesreadrate": "\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (BPS)",
+"label.diskbyteswriterate": "\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (BPS)",
+"label.diskiopsmax": "\u6700\u5927 IOPS",
+"label.diskiopsmin": "\u6700\u5c0f IOPS",
+"label.diskiopsreadrate": "\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (IOPS)",
+"label.diskiopswriterate": "\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (IOPS)",
+"label.diskioread": "\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (IO)",
+"label.diskiowrite": "\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f (IO)",
+"label.diskkbsread": "\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (\u30d0\u30a4\u30c8)",
+"label.diskkbswrite": "\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f (\u30d0\u30a4\u30c8)",
+"label.diskoffering": "\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.diskofferingdisplaytext": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.diskofferingid": "\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.disksize": "\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba (GB)",
+"label.disksizeallocated": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30c7\u30a3\u30b9\u30af",
+"label.disksizeallocatedgb": "\u5272\u308a\u5f53\u3066\u6e08\u307f",
+"label.disksizetotal": "\u30c7\u30a3\u30b9\u30af\u5408\u8a08",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "\u4f7f\u7528\u4e2d",
+"label.display.text": "\u8868\u793a\u30c6\u30ad\u30b9\u30c8",
+"label.displayname": "\u8868\u793a\u540d",
+"label.displaytext": "\u8aac\u660e",
+"label.distributedvpcrouter": "\u5206\u6563 VPC \u30eb\u30fc\u30bf\u30fc",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e DNS \u30c9\u30e1\u30a4\u30f3",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "\u30c9\u30e1\u30a4\u30f3",
+"label.domain.details": "\u30c9\u30e1\u30a4\u30f3\u306e\u8a73\u7d30",
+"label.domain.name": "\u30c9\u30e1\u30a4\u30f3\u540d",
+"label.domain.router": "\u30c9\u30e1\u30a4\u30f3 \u30eb\u30fc\u30bf\u30fc",
+"label.domain.suffix": "DNS \u30c9\u30e1\u30a4\u30f3 \u30b5\u30d5\u30a3\u30c3\u30af\u30b9 (\u4f8b: xyz.com)",
+"label.domainid": "\u30c9\u30e1\u30a4\u30f3 ID",
+"label.domainname": "\u30c9\u30e1\u30a4\u30f3",
+"label.domainpath": "\u30c9\u30e1\u30a4\u30f3",
+"label.done": "\u5b8c\u4e86",
+"label.double.quotes.are.not.allowed": "\u4e8c\u91cd\u5f15\u7528\u7b26\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093",
+"label.download.progress": "\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u9032\u6357\u72b6\u6cc1",
+"label.dpd": "\u505c\u6b62\u30d4\u30a2\u3092\u691c\u51fa\u3059\u308b",
+"label.drag.new.position": "\u65b0\u3057\u3044\u4f4d\u7f6e\u306b\u30c9\u30e9\u30c3\u30b0",
+"label.driver": "Driver",
+"label.duration.in.sec": "\u6301\u7d9a\u6642\u9593(\u79d2)",
+"label.edit": "\u7de8\u96c6",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "ACL \u898f\u5247\u306e\u7de8\u96c6",
+"label.edit.affinity.group": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u7de8\u96c6",
+"label.edit.lb.rule": "LB \u898f\u5247\u306e\u7de8\u96c6",
+"label.edit.network.details": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30\u306e\u7de8\u96c6",
+"label.edit.project.details": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8a73\u7d30\u306e\u7de8\u96c6",
+"label.edit.region": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u7de8\u96c6",
+"label.edit.role": "Edit Role",
+"label.edit.rule": "\u30eb\u30fc\u30eb\u306e\u7de8\u96c6",
+"label.edit.secondary.ips": "\u30bb\u30ab\u30f3\u30c0\u30ea IP \u306e\u7de8\u96c6",
+"label.edit.tags": "\u30bf\u30b0\u306e\u7de8\u96c6",
+"label.edit.traffic.type": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u306e\u7de8\u96c6",
+"label.edit.vpc": "VPC \u306e\u7de8\u96c6",
+"label.egress.default.policy": "\u9001\u4fe1\u306e\u30c7\u30d5\u30a9\u30eb\u30c8 \u30dd\u30ea\u30b7\u30fc",
+"label.egress.rule": "\u9001\u4fe1\u898f\u5247",
+"label.egress.rules": "\u9001\u4fe1\u898f\u5247",
+"label.egressdefaultpolicy": "\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u9001\u4fe1\u30dd\u30ea\u30b7\u30fc",
+"label.elastic": "\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af",
+"label.email": "\u96fb\u5b50\u30e1\u30fc\u30eb",
+"label.enable.autoscale": "\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a\u306e\u6709\u52b9\u5316",
+"label.enable.host": "\u30db\u30b9\u30c8\u306e\u6709\u52b9\u5316",
+"label.enable.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u6709\u52b9\u5316",
+"label.enable.provider": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u6709\u52b9\u5316",
+"label.enable.s3": "S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u6709\u52b9\u5316",
+"label.enable.swift": "Swift \u306e\u6709\u52b9\u5316",
+"label.enable.vnmc.device": "VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u6709\u52b9\u5316",
+"label.enable.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u6709\u52b9\u5316",
+"label.enable.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u6709\u52b9\u5316",
+"label.enable.vpn": "\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u306e\u6709\u52b9\u5316",
+"label.enabling.vpn": "VPN \u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"label.enabling.vpn.access": "VPN \u30a2\u30af\u30bb\u30b9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"label.end.ip": "\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.end.reserved.system.ip": "\u4e88\u7d04\u6e08\u307f\u7d42\u4e86\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9",
+"label.end.vlan": "\u7d42\u4e86 VLAN",
+"label.end.vxlan": "\u7d42\u4e86 VXLAN",
+"label.enddate": "\u65e5\u4ed8 (\u7d42\u4e86)",
+"label.endip": "\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.endipv4": "IPv4 \u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.endipv6": "IPv6 \u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.endpoint": "\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8",
+"label.endpoint.or.operation": "\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u307e\u305f\u306f\u64cd\u4f5c",
+"label.endport": "\u7d42\u4e86\u30dd\u30fc\u30c8",
+"label.enter.token": "\u30c8\u30fc\u30af\u30f3\u306e\u5165\u529b",
+"label.error": "\u30a8\u30e9\u30fc",
+"label.error.code": "\u30a8\u30e9\u30fc \u30b3\u30fc\u30c9",
+"label.error.something.went.wrong.please.correct.the.following": "\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u6b21\u306e\u5185\u5bb9\u3092\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044",
+"label.error.upper": "\u30a8\u30e9\u30fc",
+"label.espencryption": "ESP \u6697\u53f7\u5316",
+"label.esphash": "ESP \u30cf\u30c3\u30b7\u30e5",
+"label.esplifetime": "ESP \u6709\u52b9\u671f\u9593 (\u79d2)",
+"label.esppolicy": "ESP \u30dd\u30ea\u30b7\u30fc",
+"label.event": "\u30a4\u30d9\u30f3\u30c8",
+"label.event.archived": "\u30a4\u30d9\u30f3\u30c8\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u3055\u308c\u307e\u3057\u305f",
+"label.event.deleted": "\u30a4\u30d9\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f",
+"label.events": "\u30a4\u30d9\u30f3\u30c8",
+"label.every": "\u6bce",
+"label.example": "\u4f8b",
+"label.expunge": "\u62b9\u6d88",
+"label.external.link": "\u5916\u90e8\u30ea\u30f3\u30af",
+"label.f5": "F5",
+"label.f5.details": "F5 \u306e\u8a73\u7d30",
+"label.failed": "\u5931\u6557",
+"label.featured": "\u304a\u3059\u3059\u3081",
+"label.fetch.latest": "\u6700\u65b0\u60c5\u5831\u306e\u53d6\u5f97",
+"label.filterby": "\u30d5\u30a3\u30eb\u30bf\u30fc",
+"label.fingerprint": "\u30d5\u30a3\u30f3\u30ac\u30fc\u30d7\u30ea\u30f3\u30c8",
+"label.firewall": "\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb",
+"label.firstname": "\u540d",
+"label.firstname.lower": "\u540d",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "\u5f62\u5f0f",
+"label.friday": "\u91d1\u66dc\u65e5",
+"label.full": "\u5b8c\u5168",
+"label.full.path": "\u30d5\u30eb \u30d1\u30b9",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "\u7a2e\u985e",
+"label.fwdevicestate": "\u72b6\u6cc1",
+"label.gateway": "\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.general.alerts": "\u4e00\u822c\u30a2\u30e9\u30fc\u30c8",
+"label.generating.url": "URL \u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059",
+"label.global.settings": "\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS \u306e\u8a2d\u5b9a",
+"label.glustervolume": "\u30dc\u30ea\u30e5\u30fc\u30e0",
+"label.go.step.2": "\u624b\u9806 2 \u306b\u9032\u3080",
+"label.go.step.3": "\u624b\u9806 3 \u306b\u9032\u3080",
+"label.go.step.4": "\u624b\u9806 4 \u306b\u9032\u3080",
+"label.go.step.5": "\u624b\u9806 5 \u306b\u9032\u3080",
+"label.gpu": "GPU",
+"label.group": "\u30b0\u30eb\u30fc\u30d7",
+"label.group.by.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u5225\u30b0\u30eb\u30fc\u30d7",
+"label.group.by.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u5225\u30b0\u30eb\u30fc\u30d7",
+"label.group.by.pod": "\u30dd\u30c3\u30c9\u5225\u30b0\u30eb\u30fc\u30d7",
+"label.group.by.zone": "\u30be\u30fc\u30f3\u5225\u30b0\u30eb\u30fc\u30d7",
+"label.group.optional": "\u30b0\u30eb\u30fc\u30d7 (\u30aa\u30d7\u30b7\u30e7\u30f3)",
+"label.gslb": "GSLB",
+"label.gslb.assigned.lb": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u8ca0\u8377\u5206\u6563",
+"label.gslb.assigned.lb.more": "\u8ca0\u8377\u5206\u6563\u306e\u8ffd\u52a0\u5272\u308a\u5f53\u3066",
+"label.gslb.delete": "GSLB \u306e\u524a\u9664",
+"label.gslb.details": "GSLB \u306e\u8a73\u7d30",
+"label.gslb.lb.details": "\u8ca0\u8377\u5206\u6563\u306e\u8a73\u7d30",
+"label.gslb.lb.remove": "\u3053\u306e GSLB \u304b\u3089\u8ca0\u8377\u5206\u6563\u3092\u524a\u9664",
+"label.gslb.service": "GSLB \u30b5\u30fc\u30d3\u30b9",
+"label.gslb.service.private.ip": "GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.gslb.service.public.ip": "GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.gslbdomainname": "GSLB \u30c9\u30e1\u30a4\u30f3\u540d",
+"label.gslbprovider": "GSLB \u30b5\u30fc\u30d3\u30b9",
+"label.gslbproviderprivateip": "GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.gslbproviderpublicip": "GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.gslbservicetype": "\u30b5\u30fc\u30d3\u30b9\u306e\u7a2e\u985e",
+"label.guest": "\u30b2\u30b9\u30c8",
+"label.guest.cidr": "\u30b2\u30b9\u30c8 CIDR",
+"label.guest.end.ip": "\u30b2\u30b9\u30c8\u306e\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.guest.gateway": "\u30b2\u30b9\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.guest.ip": "\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.guest.ip.range": "\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.guest.netmask": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.guest.network.details": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30",
+"label.guest.networks": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.guest.start.ip": "\u30b2\u30b9\u30c8\u306e\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.guest.traffic": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af",
+"label.guestcidraddress": "\u30b2\u30b9\u30c8 CIDR",
+"label.guestendip": "\u30b2\u30b9\u30c8\u306e\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9",
+"label.guestgateway": "\u30b2\u30b9\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.guestipaddress": "\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.guestiptype": "\u30b2\u30b9\u30c8\u306e\u7a2e\u985e",
+"label.guestnetmask": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.guestnetworkid": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID",
+"label.guestnetworkname": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d",
+"label.guestosid": "OS \u306e\u7a2e\u985e",
+"label.gueststartip": "\u30b2\u30b9\u30c8\u306e\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.guestvlanrange": "VLAN \u306e\u7bc4\u56f2",
+"label.haenable": "\u9ad8\u53ef\u7528\u6027\u6709\u52b9",
+"label.hahost": "\u9ad8\u53ef\u7528\u6027\u6709\u52b9",
+"label.header.volume.snapshot": "\u4ee5\u4e0b\u306e\u5229\u7528\u53ef\u80fd\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u30dd\u30ea\u30b7\u30fc\u53c2\u7167\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u306b\u3088\u308b\u9023\u7d9a\u3057\u305f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059",
+"label.header.volume.take.snapshot": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"label.health.check": "\u30d8\u30eb\u30b9 \u30c1\u30a7\u30c3\u30af",
+"label.health.check.advanced.options": "\u62e1\u5f35\u30aa\u30d7\u30b7\u30e7\u30f3:",
+"label.health.check.configurations.options": "\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3:",
+"label.health.check.interval.in.sec": "\u30d8\u30eb\u30b9 \u30c1\u30a7\u30c3\u30af\u9593\u9694 (\u79d2)",
+"label.health.check.message.desc": "\u30ed\u30fc\u30c9\u30d0\u30e9\u30f3\u30b5\u30fc\u306f\u81ea\u52d5\u7684\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3044\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3078\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u304c\u3055\u308c\u307e\u305b\u3093",
+"label.health.check.wizard": "\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af \u30a6\u30a3\u30b6\u30fc\u30c9",
+"label.healthy.threshold": "\u6b63\u5e38\u3057\u304d\u3044\u5024",
+"label.help": "\u30d8\u30eb\u30d7",
+"label.hide.ingress.rule": "\u53d7\u4fe1\u898f\u5247\u3092\u96a0\u3059",
+"label.hints": "\u30d2\u30f3\u30c8",
+"label.home": "\u30db\u30fc\u30e0",
+"label.host": "\u30db\u30b9\u30c8",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "\u30db\u30b9\u30c8\u540d",
+"label.host.tag": "\u30db\u30b9\u30c8\u30bf\u30b0",
+"label.hostid": "\u30db\u30b9\u30c8",
+"label.hostname": "\u30db\u30b9\u30c8",
+"label.hostnamelabel": "\u30db\u30b9\u30c8\u540d",
+"label.hosts": "\u30db\u30b9\u30c8",
+"label.hosttags": "\u30db\u30b9\u30c8 \u30bf\u30b0",
+"label.hourly": "\u6bce\u6642",
+"label.hypervisor": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc",
+"label.hypervisor.capabilities": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u6a5f\u80fd",
+"label.hypervisor.type": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u7a2e\u985e",
+"label.hypervisors": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc",
+"label.hypervisorsnapshotreserve": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u4e88\u7d04",
+"label.hypervisortype": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc",
+"label.hypervisorversion": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u30d0\u30fc\u30b8\u30e7\u30f3",
+"label.hypervnetworklabel": "Hyper-V \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.icmpcode": "ICMP \u30b3\u30fc\u30c9",
+"label.icmptype": "ICMP \u306e\u7a2e\u985e",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE \u6697\u53f7\u5316",
+"label.ikehash": "IKE \u30cf\u30c3\u30b7\u30e5",
+"label.ikelifetime": "IKE \u6709\u52b9\u671f\u9593 (\u79d2)",
+"label.ikepolicy": "IKE \u30dd\u30ea\u30b7\u30fc",
+"label.info": "\u60c5\u5831",
+"label.info.upper": "\u60c5\u5831",
+"label.infrastructure": "\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3",
+"label.ingress.rule": "\u53d7\u4fe1\u898f\u5247",
+"label.initiated.by": "\u958b\u59cb\u30e6\u30fc\u30b6\u30fc",
+"label.insideportprofile": "\u5185\u90e8\u30dd\u30fc\u30c8 \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb",
+"label.installwizard.addclusterintro.subtitle": "\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u3064\u3044\u3066",
+"label.installwizard.addclusterintro.title": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.addhostintro.subtitle": "\u30db\u30b9\u30c8\u306b\u3064\u3044\u3066",
+"label.installwizard.addhostintro.title": "\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.addpodintro.subtitle": "\u30dd\u30c3\u30c9\u306b\u3064\u3044\u3066",
+"label.installwizard.addpodintro.title": "\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.addprimarystorageintro.subtitle": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3064\u3044\u3066",
+"label.installwizard.addprimarystorageintro.title": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.addsecondarystorageintro.subtitle": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3064\u3044\u3066",
+"label.installwizard.addsecondarystorageintro.title": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.addzoneintro.subtitle": "\u30be\u30fc\u30f3\u306b\u3064\u3044\u3066",
+"label.installwizard.addzoneintro.title": "\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046",
+"label.installwizard.click.launch": "[\u8d77\u52d5] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"label.installwizard.subtitle": "\u3053\u306e\u30ac\u30a4\u30c9 \u30c4\u30a2\u30fc\u306f CloudStack&#8482; \u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306b\u5f79\u7acb\u3061\u307e\u3059",
+"label.installwizard.title": "CloudStack&#8482; \u3078\u3088\u3046\u3053\u305d",
+"label.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.instance.name": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u540d",
+"label.instance.scaled.up": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u305f\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306b\u30b9\u30b1\u30fc\u30eb\u3059\u308b",
+"label.instancename": "\u5185\u90e8\u540d",
+"label.instanceport": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 \u30dd\u30fc\u30c8",
+"label.instances": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.instanciate.template.associate.profile.blade": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\u304a\u3088\u3073\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3068\u30d6\u30ec\u30fc\u30c9\u306e\u95a2\u9023\u4ed8\u3051",
+"label.intermediate.certificate": "\u4e2d\u9593\u8a3c\u660e\u66f8",
+"label.internal.dns.1": "\u5185\u90e8 DNS 1",
+"label.internal.dns.2": "\u5185\u90e8 DNS 2",
+"label.internal.lb": "\u5185\u90e8 LB",
+"label.internal.lb.details": "\u5185\u90e8 LB \u306e\u8a73\u7d30",
+"label.internaldns1": "\u5185\u90e8 DNS 1",
+"label.internaldns2": "\u5185\u90e8 DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "\u30dd\u30fc\u30ea\u30f3\u30b0\u9593\u9694 (\u79d2)",
+"label.intervaltype": "\u9593\u9694\u306e\u7a2e\u985e",
+"label.introduction.to.cloudstack": "CloudStack&#8482; \u306e\u7d39\u4ecb",
+"label.invalid.integer": "\u7121\u52b9\u306a\u6574\u6570",
+"label.invalid.number": "\u7121\u52b9\u306a\u6570",
+"label.invitations": "\u62db\u5f85\u72b6",
+"label.invite": "\u62db\u5f85",
+"label.invite.to": "\u62db\u5f85\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8:",
+"label.invited.accounts": "\u62db\u5f85\u6e08\u307f\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.ip": "IP",
+"label.ip.allocations": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u5272\u308a\u5f53\u3066",
+"label.ip.or.fqdn": "IP \u30a2\u30c9\u30ec\u30b9\u307e\u305f\u306f FQDN",
+"label.ip.range": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.ip.ranges": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.ip4netmask": "IPv4 \u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.ip6address": "IPv6 IP \u30a2\u30c9\u30ec\u30b9",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS 1",
+"label.ip6dns2": "IPv6 DNS 2",
+"label.ip6gateway": "IPv6 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.ipaddress": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.ipaddress1": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.ipaddress2": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.iplimit": "\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u5236\u9650",
+"label.ips": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.ipsecpsk": "IPsec \u4e8b\u524d\u5171\u6709\u30ad\u30fc",
+"label.iptotal": "\u5168 IP \u30a2\u30c9\u30ec\u30b9\u6570",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS 1",
+"label.ipv6.dns2": "IPv6 DNS 2",
+"label.iqn": "\u30bf\u30fc\u30b2\u30c3\u30c8 IQN",
+"label.is.redundant.router": "\u5197\u9577",
+"label.is.shared": "\u5171\u6709",
+"label.isadvanced": "\u8a73\u7d30\u8a2d\u5b9a\u306e\u8868\u793a",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "\u30ab\u30b9\u30bf\u30e0 \u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba",
+"label.iscustomizeddiskiops": "\u30ab\u30b9\u30bf\u30e0 IOPS",
+"label.iscustomizediops": "\u30ab\u30b9\u30bf\u30e0 IOPS",
+"label.isdedicated": "\u5c02\u7528",
+"label.isdefault": "\u30c7\u30d5\u30a9\u30eb\u30c8",
+"label.isdynamicallyscalable": "\u52d5\u7684\u306b\u30b5\u30a4\u30ba\u8a2d\u5b9a\u3059\u308b",
+"label.isextractable": "\u62bd\u51fa\u53ef\u80fd",
+"label.isfeatured": "\u304a\u3059\u3059\u3081",
+"label.isforced": "\u5f37\u5236\u7684\u306b\u524a\u9664\u3059\u308b",
+"label.ismanaged": "\u7ba1\u7406\u5bfe\u8c61",
+"label.iso": "ISO",
+"label.iso.boot": "ISO \u8d77\u52d5",
+"label.isoid": "ISO",
+"label.isolated.networks": "\u5206\u96e2\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.isolatedpvlanid": "\u5206\u96e2\u3055\u308c\u305f\u30bb\u30ab\u30f3\u30c0\u30ea VLAN ID",
+"label.isolation.method": "\u5206\u96e2\u65b9\u6cd5",
+"label.isolation.mode": "\u5206\u96e2\u30e2\u30fc\u30c9",
+"label.isolationmethod": "\u5206\u96e2\u65b9\u6cd5",
+"label.isolationmethods": "\u5206\u96e2\u65b9\u6cd5",
+"label.isolationuri": "\u5206\u96e2 URI",
+"label.isoname": "\u30a2\u30bf\u30c3\u30c1\u3055\u308c\u305f ISO",
+"label.isos": "ISO",
+"label.ispasswordenabled": "\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u6709\u52b9",
+"label.ispersistent": "\u6c38\u7d9a",
+"label.isportable": "\u30af\u30ed\u30b9 \u30be\u30fc\u30f3",
+"label.ispublic": "\u30d1\u30d6\u30ea\u30c3\u30af",
+"label.isready": "\u6e96\u5099\u5b8c\u4e86",
+"label.isredundantrouter": "\u5197\u9577\u30eb\u30fc\u30bf\u30fc",
+"label.isrouting": "\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0",
+"label.isshared": "\u5171\u6709",
+"label.issourcenat": "\u9001\u4fe1\u5143 NAT",
+"label.isstaticnat": "\u9759\u7684 NAT",
+"label.issystem": "\u30b7\u30b9\u30c6\u30e0",
+"label.isvolatile": "\u63ee\u767a\u6027",
+"label.item.listing": "\u9805\u76ee\u4e00\u89a7",
+"label.japanese.keyboard": "\u65e5\u672c\u8a9e\u30ad\u30fc\u30dc\u30fc\u30c9",
+"label.keep": "\u4fdd\u6301",
+"label.keep.colon": "\u4fdd\u6301:",
+"label.key": "\u30ad\u30fc",
+"label.keyboard": "\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u8a00\u8a9e",
+"label.keyboardtype": "\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u7a2e\u985e",
+"label.keypair": "SSH \u30ad\u30fc\u30da\u30a2",
+"label.kvmnetworklabel": "KVM \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 \u30b5\u30fc\u30d3\u30b9\u306e UUID",
+"label.label": "\u30e9\u30d9\u30eb",
+"label.lang.arabic": "\u30a2\u30e9\u30d3\u30a2\u8a9e",
+"label.lang.brportugese": "\u30dd\u30eb\u30c8\u30ac\u30eb\u8a9e (\u30d6\u30e9\u30b8\u30eb)",
+"label.lang.catalan": "\u30ab\u30bf\u30eb\u30cb\u30a2\u8a9e",
+"label.lang.chinese": "\u7c21\u4f53\u5b57\u4e2d\u56fd\u8a9e",
+"label.lang.dutch": "\u30aa\u30e9\u30f3\u30c0\u8a9e (\u30aa\u30e9\u30f3\u30c0)",
+"label.lang.english": "\u82f1\u8a9e",
+"label.lang.french": "\u30d5\u30e9\u30f3\u30b9\u8a9e",
+"label.lang.german": "\u30c9\u30a4\u30c4\u8a9e",
+"label.lang.hungarian": "\u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e",
+"label.lang.italian": "\u30a4\u30bf\u30ea\u30a2\u8a9e",
+"label.lang.japanese": "\u65e5\u672c\u8a9e",
+"label.lang.korean": "\u97d3\u56fd\u8a9e",
+"label.lang.norwegian": "\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e",
+"label.lang.polish": "\u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e",
+"label.lang.russian": "\u30ed\u30b7\u30a2\u8a9e",
+"label.lang.spanish": "\u30b9\u30da\u30a4\u30f3\u8a9e",
+"label.last.updated": "Last Update",
+"label.lastname": "\u59d3",
+"label.lastname.lower": "\u59d3",
+"label.latest.events": "\u6700\u65b0\u30a4\u30d9\u30f3\u30c8",
+"label.launch": "\u8d77\u52d5",
+"label.launch.vm": "VM \u306e\u8d77\u52d5",
+"label.launch.zone": "\u30be\u30fc\u30f3\u306e\u8d77\u52d5",
+"label.lb.algorithm.leastconn": "\u6700\u5c0f\u63a5\u7d9a",
+"label.lb.algorithm.roundrobin": "\u30e9\u30a6\u30f3\u30c9\u30ed\u30d3\u30f3",
+"label.lb.algorithm.source": "\u9001\u4fe1\u5143",
+"label.lbdevicededicated": "\u5c02\u7528",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "\u7a2e\u985e",
+"label.lbdevicestate": "\u72b6\u6cc1",
+"label.lbtype": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u7a2e\u985e",
+"label.ldap.configuration": "LDAP \u69cb\u6210",
+"label.ldap.group.name": "LDAP \u30b0\u30eb\u30fc\u30d7",
+"label.ldap.port": "LDAP \u30dd\u30fc\u30c8",
+"label.level": "\u30ec\u30d9\u30eb",
+"label.limitcpuuse": "CPU \u30ad\u30e3\u30c3\u30d7",
+"label.link.domain.to.ldap": "\u30c9\u30e1\u30a4\u30f3\u3092 LDAP \u306b\u30ea\u30f3\u30af\u3059\u308b",
+"label.linklocalip": "\u30ea\u30f3\u30af \u30ed\u30fc\u30ab\u30eb IP \u30a2\u30c9\u30ec\u30b9",
+"label.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc",
+"label.load.balancing.policies": "\u8ca0\u8377\u5206\u6563\u30dd\u30ea\u30b7\u30fc",
+"label.loadbalancerinstance": "\u5272\u308a\u5f53\u3066\u6e08\u307f VM",
+"label.loadbalancerrule": "\u8ca0\u8377\u5206\u6563\u898f\u5247",
+"label.loadbalancing": "\u8ca0\u8377\u5206\u6563",
+"label.loading": "\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059",
+"label.local": "\u30ed\u30fc\u30ab\u30eb",
+"label.local.storage": "\u30ed\u30fc\u30ab\u30eb \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.local.storage.enabled": "\u30e6\u30fc\u30b6\u30fc VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b",
+"label.local.storage.enabled.system.vms": "\u30b7\u30b9\u30c6\u30e0 VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b",
+"label.localstorageenabled": "\u30e6\u30fc\u30b6\u30fc VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b",
+"label.localstorageenabledforsystemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b",
+"label.login": "\u30ed\u30b0\u30aa\u30f3",
+"label.logout": "\u30ed\u30b0\u30aa\u30d5",
+"label.lun": "LUN",
+"label.lun.number": "LUN \u756a\u53f7",
+"label.lxcnetworklabel": "LXC \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.make.project.owner": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u6240\u6709\u8005\u5316",
+"label.makeredundant": "\u5197\u9577\u5316\u69cb\u6210\u3092\u3068\u308b",
+"label.manage": "\u7ba1\u7406",
+"label.manage.resources": "\u30ea\u30bd\u30fc\u30b9\u306e\u7ba1\u7406",
+"label.management": "\u7ba1\u7406",
+"label.management.ips": "\u7ba1\u7406 IP \u30a2\u30c9\u30ec\u30b9",
+"label.management.server": "\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc",
+"label.max.primary.storage": "\u6700\u5927\u30d7\u30e9\u30a4\u30de\u30ea (GiB)",
+"label.max.secondary.storage": "\u6700\u5927\u30bb\u30ab\u30f3\u30c0\u30ea (GiB)",
+"label.maxcpu": "\u6700\u5927 CPU \u30b3\u30a2\u6570",
+"label.maxerrorretry": "\u6700\u5927\u30a8\u30e9\u30fc\u518d\u8a66\u884c\u6570",
+"label.maxguestslimit": "\u6700\u5927\u30b2\u30b9\u30c8\u5236\u9650",
+"label.maximum": "\u6700\u5927",
+"label.maxinstance": "\u6700\u5927\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u6570",
+"label.maxiops": "\u6700\u5927 IOPS",
+"label.maxmemory": "\u6700\u5927\u30e1\u30e2\u30ea (MiB)",
+"label.maxnetwork": "\u6700\u5927\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6570",
+"label.maxpublicip": "\u6700\u5927\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u6570",
+"label.maxsnapshot": "\u6700\u5927\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u6570",
+"label.maxtemplate": "\u6700\u5927\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6570",
+"label.maxuservm": "\u6700\u5927\u30e6\u30fc\u30b6\u30fc VM \u6570",
+"label.maxvolume": "\u6700\u5927\u30dc\u30ea\u30e5\u30fc\u30e0\u6570",
+"label.maxvpc": "\u6700\u5927 VPC \u6570",
+"label.may.continue": "\u7d9a\u884c\u3067\u304d\u307e\u3059\u3002",
+"label.memallocated": "Mem Allocation",
+"label.memory": "\u30e1\u30e2\u30ea",
+"label.memory.total": "\u30e1\u30e2\u30ea\u5408\u8a08",
+"label.memory.used": "\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf",
+"label.memoryallocated": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30e1\u30e2\u30ea",
+"label.memoryallocatedgb": "\u5272\u308a\u5f53\u3066\u6e08\u307f",
+"label.memorylimit": "\u30e1\u30e2\u30ea\u5236\u9650 (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30e1\u30e2\u30ea",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "\u4f7f\u7528\u4e2d",
+"label.menu.all.accounts": "\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.menu.all.instances": "\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.menu.community.isos": "\u30b3\u30df\u30e5\u30cb\u30c6\u30a3 ISO",
+"label.menu.community.templates": "\u30b3\u30df\u30e5\u30cb\u30c6\u30a3 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.menu.destroyed.instances": "\u7834\u68c4\u3055\u308c\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.menu.featured.isos": "\u304a\u3059\u3059\u3081\u306e ISO",
+"label.menu.featured.templates": "\u304a\u3059\u3059\u3081\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.menu.ipaddresses": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.menu.my.accounts": "\u30de\u30a4 \u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.menu.my.instances": "\u30de\u30a4 \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.menu.my.isos": "\u30de\u30a4 ISO",
+"label.menu.my.templates": "\u30de\u30a4 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.menu.physical.resources": "\u7269\u7406\u30ea\u30bd\u30fc\u30b9",
+"label.menu.regions": "\u30ea\u30fc\u30b8\u30e7\u30f3",
+"label.menu.running.instances": "\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.menu.security.groups": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.menu.service.offerings": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.menu.sshkeypair": "SSH \u30ad\u30fc\u30da\u30a2",
+"label.menu.stopped.instances": "\u505c\u6b62\u3055\u308c\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
+"label.menu.storage": "\u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.menu.system": "\u30b7\u30b9\u30c6\u30e0",
+"label.menu.virtual.appliances": "\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9",
+"label.menu.virtual.resources": "\u4eee\u60f3\u30ea\u30bd\u30fc\u30b9",
+"label.metrics": "\u30e1\u30c8\u30ea\u30c3\u30af\u30b9",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c\u5148:",
+"label.migrate.instance.to.host": "\u5225\u306e\u30db\u30b9\u30c8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c",
+"label.migrate.instance.to.ps": "\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c",
+"label.migrate.lb.vm": "LB VM \u306e\u79fb\u884c",
+"label.migrate.router.to": "\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c\u5148:",
+"label.migrate.systemvm.to": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c\u5148:",
+"label.migrate.to.host": "\u30db\u30b9\u30c8\u3078\u79fb\u884c",
+"label.migrate.to.storage": "\u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u79fb\u884c",
+"label.migrate.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u79fb\u884c",
+"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": "\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u79fb\u884c",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "\u5206(\u6bce\u6642)",
+"label.minimum": "\u6700\u5c0f",
+"label.mininstance": "\u6700\u5c0f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u6570",
+"label.miniops": "\u6700\u5c0f IOPS",
+"label.minute.past.hour": "\u5206(\u6bce\u6642)",
+"label.minutes.past.hour": "\u5206(\u6bce\u6642)",
+"label.monday": "\u6708\u66dc\u65e5",
+"label.monthly": "\u6bce\u6708",
+"label.more.templates": "\u305d\u306e\u307b\u304b\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.move.down.row": "1 \u884c\u4e0b\u306b\u79fb\u52d5",
+"label.move.to.bottom": "\u6700\u4e0b\u4f4d\u306b\u79fb\u52d5",
+"label.move.to.top": "\u6700\u4e0a\u4f4d\u306b\u79fb\u52d5",
+"label.move.up.row": "1 \u884c\u4e0a\u306b\u79fb\u52d5",
+"label.my.account": "\u30de\u30a4 \u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.my.network": "\u30de\u30a4 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.my.templates": "\u30de\u30a4 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.na": "\u5229\u7528\u4e0d\u53ef",
+"label.name": "\u540d\u524d",
+"label.name.optional": "\u540d\u524d (\u30aa\u30d7\u30b7\u30e7\u30f3)",
+"label.nat": "BigSwitch BCF \u306e NAT \u3092\u6709\u52b9\u5316\u3057\u307e\u3057\u305f",
+"label.nat.port.range": "NAT \u30dd\u30fc\u30c8\u306e\u7bc4\u56f2",
+"label.netmask": "\u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler \u306e\u8a73\u7d30",
+"label.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.network.acl": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL",
+"label.network.acls": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL",
+"label.network.addvm": "VM \u3078\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0",
+"label.network.desc": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8aac\u660e",
+"label.network.details": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30",
+"label.network.device": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9",
+"label.network.device.type": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9\u306e\u7a2e\u985e",
+"label.network.domain": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3",
+"label.network.label.display.for.blank.value": "\u30c7\u30d5\u30a9\u30eb\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u4f7f\u7528",
+"label.network.name": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d",
+"label.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.network.offering.details": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30",
+"label.network.offering.display.text": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u8868\u793a\u30c6\u30ad\u30b9\u30c8",
+"label.network.offering.name": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u540d",
+"label.network.offerings": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.network.service.providers": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30b5\u30fc\u30d3\u30b9 \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.networkcidr": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af CIDR",
+"label.networkdevicetype": "\u7a2e\u985e",
+"label.networkdomain": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3",
+"label.networkdomaintext": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3",
+"label.networkid": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.networking.and.security": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3",
+"label.networkkbsread": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8aad\u307f\u53d6\u308a",
+"label.networkkbswrite": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u66f8\u304d\u8fbc\u307f",
+"label.networklimit": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5236\u9650",
+"label.networkname": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d",
+"label.networkofferingdisplaytext": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.networkofferingid": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.networkofferingidtext": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 ID",
+"label.networkofferingname": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.networkrate": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901f\u5ea6 (MB/\u79d2)",
+"label.networkread": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8aad\u307f\u53d6\u308a",
+"label.networks": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.networktype": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7a2e\u985e",
+"label.networkwrite": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u66f8\u304d\u8fbc\u307f",
+"label.new": "\u65b0\u898f",
+"label.new.password": "\u65b0\u3057\u3044\u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.new.project": "\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8",
+"label.new.vm": "\u65b0\u3057\u3044 VM",
+"label.newdiskoffering": "\u65b0\u3057\u3044\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.newsize": "\u65b0\u3057\u3044\u30b5\u30a4\u30ba(GB)",
+"label.next": "\u6b21\u3078",
+"label.nexusvswitch": "Nexus 1000V",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.nfscachenfsserver": "NFS \u30b5\u30fc\u30d0\u30fc",
+"label.nfscachepath": "\u30d1\u30b9",
+"label.nfscachezoneid": "\u30be\u30fc\u30f3",
+"label.nfsserver": "NFS \u30b5\u30fc\u30d0\u30fc",
+"label.nicadaptertype": "NIC \u30a2\u30c0\u30d7\u30bf\u30fc\u306e\u7a2e\u985e",
+"label.nicira.controller.address": "\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc \u30a2\u30c9\u30ec\u30b9",
+"label.nicira.nvp.details": "Nicira NVP \u306e\u8a73\u7d30",
+"label.nics": "NIC",
+"label.no": "\u3044\u3044\u3048",
+"label.no.actions": "\u5b9f\u884c\u3067\u304d\u308b\u64cd\u4f5c\u306f\u3042\u308a\u307e\u305b\u3093",
+"label.no.alerts": "\u6700\u8fd1\u306e\u30a2\u30e9\u30fc\u30c8\u306f\u3042\u308a\u307e\u305b\u3093",
+"label.no.data": "\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093",
+"label.no.errors": "\u6700\u8fd1\u306e\u30a8\u30e9\u30fc\u306f\u3042\u308a\u307e\u305b\u3093",
+"label.no.grouping": "(\u30b0\u30eb\u30fc\u30d7\u306a\u3057)",
+"label.no.isos": "\u4f7f\u7528\u3067\u304d\u308b ISO \u306f\u3042\u308a\u307e\u305b\u3093",
+"label.no.items": "\u4f7f\u7528\u3067\u304d\u308b\u9805\u76ee\u306f\u3042\u308a\u307e\u305b\u3093",
+"label.no.security.groups": "\u4f7f\u7528\u3067\u304d\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306f\u3042\u308a\u307e\u305b\u3093",
+"label.none": "\u306a\u3057",
+"label.noselect": "\u8a2d\u5b9a\u3057\u306a\u3044",
+"label.not.found": "\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
+"label.notifications": "\u901a\u77e5",
+"label.num.cpu.cores": "CPU \u30b3\u30a2\u6570",
+"label.number": "#Rule",
+"label.number.of.clusters": "\u30af\u30e9\u30b9\u30bf\u30fc\u6570",
+"label.number.of.hosts": "\u30db\u30b9\u30c8\u6570",
+"label.number.of.pods": "\u30dd\u30c3\u30c9\u6570",
+"label.number.of.system.vms": "\u30b7\u30b9\u30c6\u30e0 VM \u6570",
+"label.number.of.virtual.routers": "\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u6570",
+"label.number.of.zones": "\u30be\u30fc\u30f3\u6570",
+"label.numberofrouterrequiresupgrade": "\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981\u306a\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u5408\u8a08",
+"label.numretries": "\u518d\u8a66\u884c\u56de\u6570",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "\u6708\u6bce",
+"label.offerha": "\u9ad8\u53ef\u7528\u6027\u3092\u63d0\u4f9b\u3059\u308b",
+"label.ok": "OK",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc",
+"label.opendaylight.controllerdetail": "OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8a73\u7d30",
+"label.opendaylight.controllers": "OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc",
+"label.optional": "\u30aa\u30d7\u30b7\u30e7\u30f3",
+"label.order": "\u9806\u5e8f",
+"label.oscategoryid": "OS \u57fa\u672c\u8a2d\u5b9a",
+"label.ostypeid": "OS \u306e\u7a2e\u985e",
+"label.ostypename": "OS \u306e\u7a2e\u985e",
+"label.other": "\u305d\u306e\u307b\u304b",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b",
+"label.override.public.traffic": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b",
+"label.overrideguesttraffic": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b",
+"label.overridepublictraffic": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b",
+"label.ovm3cluster": "\u30cd\u30a4\u30c6\u30a3\u30d6\u30af\u30e9\u30b9\u30bf\u30fc",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "\u30cd\u30a4\u30c6\u30a3\u30d6\u30d7\u30fc\u30eb",
+"label.ovm3vip": "\u30de\u30b9\u30bf\u30fc VIP IP",
+"label.ovmnetworklabel": "OVM \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.ovs": "OVS",
+"label.owned.public.ips": "\u6240\u6709\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.owner.account": "\u6240\u6709\u8005\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.owner.domain": "\u6240\u6709\u8005\u30c9\u30e1\u30a4\u30f3",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto \u306e\u8a73\u7d30",
+"label.palp": "Palo Alto \u30ed\u30b0 \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb",
+"label.parent.domain": "\u89aa\u30c9\u30e1\u30a4\u30f3",
+"label.parentname": "\u89aa",
+"label.passive": "\u30d1\u30c3\u30b7\u30d6",
+"label.password": "\u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.password.reset.confirm": "\u6b21\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f:",
+"label.passwordenabled": "\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u6709\u52b9",
+"label.path": "\u30d1\u30b9",
+"label.patp": "Palo Alto \u8105\u5a01\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb",
+"label.pavr": "\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.physical.network.id": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID",
+"label.physical.network.name": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d",
+"label.physicalnetworkid": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.ping.cifs.username": "PING CIFS \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.ping.dir": "PING \u30c7\u30a3\u30ec\u30af\u30c8\u30ea",
+"label.ping.path": "Ping \u30d1\u30b9",
+"label.ping.storage.ip": "PING \u5bfe\u8c61\u306e\u30b9\u30c8\u30ec\u30fc\u30b8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.plannermode": "\u30d7\u30e9\u30f3\u30ca\u30fc \u30e2\u30fc\u30c9",
+"label.please.complete.the.following.fields": "\u4e0b\u8a18\u9805\u76ee\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044",
+"label.please.specify.netscaler.info": "NetScaler \u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044",
+"label.please.wait": "\u304a\u5f85\u3061\u304f\u3060\u3055\u3044",
+"label.plugin.details": "\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8a73\u7d30",
+"label.plugins": "\u30d7\u30e9\u30b0\u30a4\u30f3",
+"label.pod": "\u30dd\u30c3\u30c9",
+"label.pod.dedicated": "\u30dd\u30c3\u30c9\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f",
+"label.pod.name": "\u30dd\u30c3\u30c9\u540d",
+"label.podid": "\u30dd\u30c3\u30c9",
+"label.podname": "\u30dd\u30c3\u30c9\u540d",
+"label.pods": "\u30dd\u30c3\u30c9",
+"label.port": "\u30dd\u30fc\u30c8",
+"label.port.forwarding.policies": "\u30dd\u30fc\u30c8\u8ee2\u9001\u30dd\u30ea\u30b7\u30fc",
+"label.port.range": "\u30dd\u30fc\u30c8\u306e\u7bc4\u56f2",
+"label.portable.ip": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9",
+"label.portable.ip.range.details": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8a73\u7d30",
+"label.portable.ip.ranges": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.portableipaddress": "\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9",
+"label.portforwarding": "\u30dd\u30fc\u30c8\u8ee2\u9001",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "\u623b\u308b",
+"label.previous": "\u623b\u308b",
+"label.primary.network": "\u30d7\u30e9\u30a4\u30de\u30ea \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.primary.storage": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.primary.storage.allocated": "\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.primary.storage.count": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb",
+"label.primary.storage.used": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u4f7f\u7528\u91cf",
+"label.primarystoragelimit": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u5236\u9650 (GiB)",
+"label.primarystoragetotal": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.private.gateway": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.private.interface": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9",
+"label.private.ip.range": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.private.ips": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.private.zone": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30be\u30fc\u30f3",
+"label.privateinterface": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9",
+"label.privateip": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9",
+"label.privatekey": "PKCS#8 \u79d8\u5bc6\u30ad\u30fc",
+"label.privatenetwork": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.privateport": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30dd\u30fc\u30c8",
+"label.profiledn": "\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb",
+"label.profilename": "\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb",
+"label.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8",
+"label.project.dashboard": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9",
+"label.project.invite": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85",
+"label.project.name": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d",
+"label.project.view": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d3\u30e5\u30fc",
+"label.projectid": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 ID",
+"label.projects": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8",
+"label.property": "Property",
+"label.protocol": "\u30d7\u30ed\u30c8\u30b3\u30eb",
+"label.protocol.number": "\u30d7\u30ed\u30c8\u30b3\u30eb\u756a\u53f7",
+"label.protocolnumber": "#Protocol",
+"label.provider": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.providername": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.providers": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.provisioningtype": "\u30d7\u30ed\u30d3\u30b8\u30e7\u30cb\u30f3\u30b0\u306e\u7a2e\u985e",
+"label.public.interface": "\u30d1\u30d6\u30ea\u30c3\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9",
+"label.public.ip": "\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.public.ip.addresses": "\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.public.ips": "\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.public.lb": "\u30d1\u30d6\u30ea\u30c3\u30af LB",
+"label.public.load.balancer.provider": "\u30d1\u30d6\u30ea\u30c3\u30af \u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.public.network": "\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.public.traffic": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af",
+"label.public.zone": "\u30d1\u30d6\u30ea\u30c3\u30af \u30be\u30fc\u30f3",
+"label.publicinterface": "\u30d1\u30d6\u30ea\u30c3\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9",
+"label.publicip": "IP \u30a2\u30c9\u30ec\u30b9",
+"label.publickey": "\u516c\u958b\u9375",
+"label.publicnetwork": "\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.publicport": "\u30d1\u30d6\u30ea\u30c3\u30af \u30dd\u30fc\u30c8",
+"label.purpose": "\u76ee\u7684",
+"label.pxe.server.type": "PXE \u30b5\u30fc\u30d0\u30fc\u306e\u7a2e\u985e",
+"label.qostype": "QoS \u306e\u7a2e\u985e",
+"label.quickview": "\u30af\u30a4\u30c3\u30af\u30d3\u30e5\u30fc",
+"label.quiescevm": "VM \u3092\u4f11\u6b62\u3059\u308b",
+"label.quiettime": "\u5f85\u3061\u6642\u9593 (\u79d2)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx \u30e6\u30fc\u30b6\u30fc",
+"label.rbdmonitor": "Ceph \u30e2\u30cb\u30bf\u30fc",
+"label.rbdpool": "Ceph \u30d7\u30fc\u30eb",
+"label.rbdsecret": "Cephx \u30b7\u30fc\u30af\u30ec\u30c3\u30c8",
+"label.reason": "Reason",
+"label.reboot": "\u518d\u8d77\u52d5",
+"label.receivedbytes": "\u53d7\u4fe1\u30d0\u30a4\u30c8",
+"label.recent.errors": "\u6700\u8fd1\u306e\u30a8\u30e9\u30fc",
+"label.recover.vm": "VM \u306e\u5fa9\u5143",
+"label.redundantrouter": "\u5197\u9577\u30eb\u30fc\u30bf\u30fc",
+"label.redundantrouterstate": "\u5197\u9577\u72b6\u614b",
+"label.redundantstate": "\u5197\u9577\u72b6\u614b",
+"label.redundantvpcrouter": "\u5197\u9577 VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "\u66f4\u65b0",
+"label.refresh.blades": "\u30d6\u30ec\u30fc\u30c9\u306e\u66f4\u65b0",
+"label.region": "\u30ea\u30fc\u30b8\u30e7\u30f3",
+"label.region.details": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8a73\u7d30",
+"label.reinstall.vm": "VM \u306e\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb",
+"label.related": "\u95a2\u9023",
+"label.relationaloperator": "\u6f14\u7b97\u5b50",
+"label.release.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u304b\u3089\u89e3\u653e",
+"label.release.dedicated.cluster": "\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u89e3\u653e",
+"label.release.dedicated.host": "\u5c02\u7528\u30db\u30b9\u30c8\u306e\u89e3\u653e",
+"label.release.dedicated.pod": "\u5c02\u7528\u30dd\u30c3\u30c9\u306e\u89e3\u653e",
+"label.release.dedicated.vlan.range": "\u5c02\u7528 VLAN \u306e\u7bc4\u56f2\u306e\u89e3\u653e",
+"label.release.dedicated.zone": "\u5c02\u7528\u30be\u30fc\u30f3\u306e\u89e3\u653e",
+"label.remind.later": "\u30a2\u30e9\u30fc\u30e0\u3092\u8868\u793a\u3059\u308b",
+"label.remove.acl": "ACL \u306e\u524a\u9664",
+"label.remove.egress.rule": "\u9001\u4fe1\u898f\u5247\u306e\u524a\u9664",
+"label.remove.from.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059",
+"label.remove.ingress.rule": "\u53d7\u4fe1\u898f\u5247\u306e\u524a\u9664",
+"label.remove.ip.range": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664",
+"label.remove.ldap": "LDAP \u306e\u524a\u9664",
+"label.remove.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664",
+"label.remove.pf": "\u30dd\u30fc\u30c8\u8ee2\u9001\u898f\u5247\u306e\u524a\u9664",
+"label.remove.project.account": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304b\u3089\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u524a\u9664",
+"label.remove.region": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u524a\u9664",
+"label.remove.rule": "\u898f\u5247\u306e\u524a\u9664",
+"label.remove.ssh.key.pair": "SSH \u30ad\u30fc\u30da\u30a2\u306e\u524a\u9664",
+"label.remove.static.nat.rule": "\u9759\u7684 NAT \u898f\u5247\u306e\u524a\u9664",
+"label.remove.static.route": "\u9759\u7684\u30eb\u30fc\u30c8\u306e\u524a\u9664",
+"label.remove.this.physical.network": "\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3059\u308b",
+"label.remove.tier": "\u968e\u5c64\u306e\u524a\u9664",
+"label.remove.vm.from.lb": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u304b\u3089\u306e VM \u306e\u524a\u9664",
+"label.remove.vm.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089\u306e VM \u306e\u524a\u9664",
+"label.remove.vmware.datacenter": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e\u524a\u9664",
+"label.remove.vpc": "VPC \u306e\u524a\u9664",
+"label.remove.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664",
+"label.removing": "\u524a\u9664\u3057\u3066\u3044\u307e\u3059",
+"label.removing.user": "\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059",
+"label.replace.acl": "ACL \u306e\u7f6e\u304d\u63db\u3048",
+"label.replace.acl.list": "ACL \u4e00\u89a7\u306e\u7f6e\u304d\u63db\u3048",
+"label.required": "\u5fc5\u9808\u3067\u3059",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981",
+"label.reserved.system.gateway": "\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.reserved.system.ip": "\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9",
+"label.reserved.system.netmask": "\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.reservediprange": "\u4e88\u7d04\u6e08\u307f IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2",
+"label.reservedsystemendip": "\u4e88\u7d04\u6e08\u307f\u7d42\u4e86\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9",
+"label.reservedsystemgateway": "\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.reservedsystemnetmask": "\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30cd\u30c3\u30c8\u30de\u30b9\u30af",
+"label.reservedsystemstartip": "\u4e88\u7d04\u6e08\u307f\u958b\u59cb\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9",
+"label.reset.ssh.key.pair": "SSH \u30ad\u30fc\u30da\u30a2\u306e\u30ea\u30bb\u30c3\u30c8",
+"label.reset.ssh.key.pair.on.vm": "VM \u4e0a\u306e SSH \u30ad\u30fc\u30da\u30a2\u3092\u30ea\u30bb\u30c3\u30c8",
+"label.reset.vpn.connection": "VPN \u63a5\u7d9a\u306e\u30ea\u30bb\u30c3\u30c8",
+"label.resetvm": "VM \u306e\u30ea\u30bb\u30c3\u30c8",
+"label.resource": "\u30ea\u30bd\u30fc\u30b9",
+"label.resource.limit.exceeded": "\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u3092\u8d85\u904e\u3057\u307e\u3057\u305f",
+"label.resource.limits": "\u30ea\u30bd\u30fc\u30b9\u5236\u9650",
+"label.resource.name": "\u30ea\u30bd\u30fc\u30b9\u540d",
+"label.resourceid": "\u30ea\u30bd\u30fc\u30b9 ID",
+"label.resourcename": "\u30ea\u30bd\u30fc\u30b9\u540d",
+"label.resources": "\u30ea\u30bd\u30fc\u30b9",
+"label.resourcestate": "\u30ea\u30bd\u30fc\u30b9\u306e\u72b6\u614b",
+"label.response.timeout.in.sec": "\u5fdc\u7b54\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 (\u79d2)",
+"label.restart.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u518d\u8d77\u52d5",
+"label.restart.vpc": "VPC \u306e\u518d\u8d77\u52d5",
+"label.restartrequired": "\u518d\u8d77\u52d5\u304c\u5fc5\u8981",
+"label.restore": "\u5fa9\u5143",
+"label.retry.interval": "\u518d\u8a66\u884c\u9593\u9694",
+"label.review": "\u78ba\u8a8d",
+"label.revoke.project.invite": "\u62db\u5f85\u306e\u53d6\u308a\u6d88\u3057",
+"label.role": "\u5f79\u5272",
+"label.rolename": "\u5f79\u5272",
+"label.roles": "\u30ed\u30fc\u30eb",
+"label.roletype": "Role Type",
+"label.root.certificate": "\u30eb\u30fc\u30c8\u8a3c\u660e\u66f8",
+"label.root.disk.offering": "\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc",
+"label.rootdiskcontrollertypekvm": "\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc",
+"label.router.vm.scaled.up": "\u30eb\u30fc\u30bf\u30fc VM \u306e\u30b5\u30a4\u30ba\u304c\u62e1\u5927\u3055\u308c\u307e\u3057\u305f",
+"label.routercount": "\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u5408\u8a08",
+"label.routerrequiresupgrade": "\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059",
+"label.routertype": "\u7a2e\u985e",
+"label.routing.host": "\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0 \u30db\u30b9\u30c8",
+"label.rule": "Rule",
+"label.rule.number": "\u898f\u5247\u756a\u53f7",
+"label.rules": "\u898f\u5247",
+"label.running": "\u5b9f\u884c\u4e2d\u306e VM",
+"label.s3.access.key": "\u30a2\u30af\u30bb\u30b9 \u30ad\u30fc",
+"label.s3.bucket": "\u30d0\u30b1\u30c3\u30c8",
+"label.s3.connection.timeout": "\u63a5\u7d9a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8",
+"label.s3.endpoint": "\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8",
+"label.s3.max.error.retry": "\u6700\u5927\u30a8\u30e9\u30fc\u518d\u8a66\u884c\u6570",
+"label.s3.nfs.path": "S3 NFS \u30d1\u30b9",
+"label.s3.nfs.server": "S3 NFS \u30b5\u30fc\u30d0\u30fc",
+"label.s3.secret.key": "\u79d8\u5bc6\u30ad\u30fc",
+"label.s3.socket.timeout": "\u30bd\u30b1\u30c3\u30c8 \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8",
+"label.s3.use.https": "HTTPS \u3092\u4f7f\u7528\u3059\u308b",
+"label.samlenable": "SAML SSO \u8a8d\u8a3c",
+"label.samlentity": "\u8a8d\u8a3c\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc",
+"label.saturday": "\u571f\u66dc\u65e5",
+"label.save": "\u4fdd\u5b58",
+"label.save.and.continue": "\u4fdd\u5b58\u3057\u3066\u7d9a\u884c",
+"label.save.changes": "\u5909\u66f4\u3092\u4fdd\u5b58\u3059\u308b",
+"label.saving.processing": "\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059...",
+"label.scale.up.policy": "\u30b5\u30a4\u30ba\u62e1\u5927\u30dd\u30ea\u30b7\u30fc",
+"label.scaledown.policy": "\u30b9\u30b1\u30fc\u30eb\u30c0\u30a6\u30f3 \u30dd\u30ea\u30b7\u30fc",
+"label.scaleup.policy": "\u30b9\u30b1\u30fc\u30eb\u30a2\u30c3\u30d7 \u30dd\u30ea\u30b7\u30fc",
+"label.scope": "\u30b9\u30b3\u30fc\u30d7",
+"label.search": "\u691c\u7d22",
+"label.secondary.staging.store": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2",
+"label.secondary.staging.store.details": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u8a73\u7d30",
+"label.secondary.storage": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.secondary.storage.count": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb",
+"label.secondary.storage.details": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8a73\u7d30",
+"label.secondary.storage.vm": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM",
+"label.secondary.used": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u4f7f\u7528\u91cf",
+"label.secondaryips": "\u30bb\u30ab\u30f3\u30c0\u30ea IP",
+"label.secondarystoragelimit": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u5236\u9650 (GiB)",
+"label.secretkey": "\u79d8\u5bc6\u30ad\u30fc",
+"label.security.group.name": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u540d",
+"label.security.groups": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.security.groups.enabled": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u6709\u52b9",
+"label.securitygroup": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.securitygroups": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7",
+"label.select": "\u9078\u629e",
+"label.select-view": "\u30d3\u30e5\u30fc\u306e\u9078\u629e",
+"label.select.a.zone": "\u30be\u30fc\u30f3\u306e\u9078\u629e",
+"label.select.host": "\u30db\u30b9\u30c8\u306e\u9078\u629e",
+"label.select.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u9078\u629e",
+"label.select.instance.to.attach.volume.to": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"label.select.iso.or.template": "ISO \u307e\u305f\u306f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e",
+"label.select.offering": "\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u9078\u629e",
+"label.select.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u9078\u629e",
+"label.select.region": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e",
+"label.select.tier": "\u968e\u5c64\u306e\u9078\u629e",
+"label.select.vm.for.static.nat": "\u9759\u7684 NAT \u7528 VM \u306e\u9078\u629e",
+"label.self": "\u81ea\u5206\u306e\u3082\u306e",
+"label.sent": "\u9001\u4fe1\u6e08\u307f",
+"label.sentbytes": "\u9001\u4fe1\u30d0\u30a4\u30c8",
+"label.server": "\u30b5\u30fc\u30d0\u30fc",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "\u5206\u6563\u30eb\u30fc\u30bf\u30fc",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "\u30ea\u30fc\u30b8\u30e7\u30f3\u30ec\u30d9\u30eb\u306e VPC",
+"label.service.lb.elasticlbcheckbox": "\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af LB",
+"label.service.lb.inlinemodedropdown": "\u30e2\u30fc\u30c9",
+"label.service.lb.lbisolationdropdown": "LB \u5206\u96e2",
+"label.service.offering": "\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.service.offering.details": "\u30b5\u30fc\u30d3\u30b9\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "\u5197\u9577\u30eb\u30fc\u30bf\u30fc\u6a5f\u80fd",
+"label.service.state": "\u30b5\u30fc\u30d3\u30b9\u306e\u72b6\u614b",
+"label.service.staticnat.associatepublicip": "\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u95a2\u9023\u4ed8\u3051",
+"label.service.staticnat.elasticipcheckbox": "\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9",
+"label.servicecapabilities": "\u30b5\u30fc\u30d3\u30b9\u306e\u6a5f\u80fd",
+"label.servicelist": "\u30b5\u30fc\u30d3\u30b9",
+"label.serviceofferingid": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.serviceofferingname": "\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.session.expired": "\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f",
+"label.set.default.nic": "\u30c7\u30d5\u30a9\u30eb\u30c8 NIC \u306e\u8a2d\u5b9a",
+"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": "\u30be\u30fc\u30f3\u306e\u7a2e\u985e\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7",
+"label.settings": "\u8a2d\u5b9a",
+"label.setup": "\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7",
+"label.setup.network": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8a2d\u5b9a\u3059\u308b",
+"label.setup.zone": "\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3059\u308b",
+"label.shared": "\u5171\u6709",
+"label.sharedexecutable": "\u5171\u6709",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "\u53d7\u4fe1\u898f\u5247\u306e\u8868\u793a",
+"label.shrinkok": "\u7e2e\u5c0f\u53ef\u80fd\u306b\u3059\u308b",
+"label.shutdown.provider": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3",
+"label.simplified.chinese.keyboard": "\u7c21\u6613\u4e2d\u56fd\u8a9e\u30ad\u30fc\u30dc\u30fc\u30c9",
+"label.site.to.site.vpn": "\u30b5\u30a4\u30c8\u9593 VPN",
+"label.size": "\u30b5\u30a4\u30ba",
+"label.sizegb": "\u30b5\u30a4\u30ba",
+"label.skip.guide": "CloudStack \u3092\u4f7f\u7528\u3057\u305f\u3053\u3068\u304c\u3042\u308b\u306e\u3067\u3001\u3053\u306e\u30ac\u30a4\u30c9\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b",
+"label.smb.domain": "SMB \u30c9\u30e1\u30a4\u30f3",
+"label.smb.password": "SMB \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.smb.username": "SMB \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.smbdomain": "SMB \u30c9\u30e1\u30a4\u30f3",
+"label.smbpassword": "SMB \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.smbusername": "SMB \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.snapshot": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8",
+"label.snapshot.name": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u540d",
+"label.snapshot.schedule": "\u9023\u7d9a\u3057\u305f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u8a2d\u5b9a\u3059\u308b",
+"label.snapshotlimit": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u5236\u9650",
+"label.snapshotmemory": "\u30e1\u30e2\u30ea\u3082\u542b\u3081\u308b",
+"label.snapshots": "\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8",
+"label.snmpcommunity": "SNMP \u30b3\u30df\u30e5\u30cb\u30c6\u30a3",
+"label.snmpport": "SNMP \u30dd\u30fc\u30c8",
+"label.sockettimeout": "\u30bd\u30b1\u30c3\u30c8 \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8",
+"label.source.nat.supported": "\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u9001\u4fe1\u5143 NAT",
+"label.sourcecidr": "\u9001\u4fe1\u5143 CIDR",
+"label.sourceipaddress": "\u9001\u4fe1\u5143 IP \u30a2\u30c9\u30ec\u30b9",
+"label.sourcenat": "\u9001\u4fe1\u5143 NAT",
+"label.sourcenattype": "\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u9001\u4fe1\u5143 NAT \u306e\u7a2e\u985e",
+"label.sourceport": "\u9001\u4fe1\u5143\u30dd\u30fc\u30c8",
+"label.specify.vxlan": "VXLAN \u3092\u6307\u5b9a\u3059\u308b",
+"label.specifyipranges": "IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u6307\u5b9a",
+"label.specifyvlan": "VLAN \u3092\u6307\u5b9a\u3059\u308b",
+"label.sr.name": "SR \u540d\u30e9\u30d9\u30eb",
+"label.srx": "SRX",
+"label.srx.details": "SRX \u306e\u8a73\u7d30",
+"label.ssh.key.pair.details": "SSH \u30ad\u30fc\u30da\u30a2\u306e\u8a73\u7d30",
+"label.ssh.key.pairs": "SSH \u30ad\u30fc\u30da\u30a2",
+"label.sshkeypair": "\u65b0\u3057\u3044 SSH \u30ad\u30fc\u30da\u30a2",
+"label.standard.us.keyboard": "\u6a19\u6e96(US) \u30ad\u30fc\u30dc\u30fc\u30c9",
+"label.start.ip": "\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.start.lb.vm": "LB VM \u306e\u8d77\u52d5",
+"label.start.reserved.system.ip": "\u4e88\u7d04\u6e08\u307f\u958b\u59cb\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9",
+"label.start.vlan": "\u958b\u59cb VLAN",
+"label.start.vxlan": "\u958b\u59cb VXLAN",
+"label.startdate": "\u65e5\u4ed8 (\u958b\u59cb)",
+"label.startip": "\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.startipv4": "IPv4 \u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.startipv6": "IPv6 \u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9",
+"label.startport": "\u958b\u59cb\u30dd\u30fc\u30c8",
+"label.startquota": "Quota Value",
+"label.state": "\u72b6\u614b",
+"label.static.nat.enabled": "\u9759\u7684 NAT \u6709\u52b9",
+"label.static.nat.to": "\u9759\u7684 NAT \u306e\u8a2d\u5b9a\u5148:",
+"label.static.nat.vm.details": "\u9759\u7684 NAT VM \u306e\u8a73\u7d30",
+"label.static.routes": "\u9759\u7684\u30eb\u30fc\u30c8",
+"label.statistics": "\u7d71\u8a08",
+"label.status": "\u72b6\u6cc1",
+"label.step.1": "\u624b\u9806 1",
+"label.step.1.title": "\u624b\u9806 1: <strong>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e</strong>",
+"label.step.2": "\u624b\u9806 2",
+"label.step.2.title": "\u624b\u9806 2: <strong>\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0</strong>",
+"label.step.3": "\u624b\u9806 3",
+"label.step.3.title": "\u624b\u9806 3: <strong id=\"step3_label\">\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u9078\u629e</strong>",
+"label.step.4": "\u624b\u9806 4",
+"label.step.4.title": "\u624b\u9806 4: <strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af</strong>",
+"label.step.5": "\u624b\u9806 5",
+"label.step.5.title": "\u624b\u9806 5: <strong>\u78ba\u8a8d</strong>",
+"label.stickiness.method": "\u6301\u7d9a\u6027\u65b9\u6cd5",
+"label.sticky.cookie-name": "Cookie \u540d",
+"label.sticky.expire": "\u5931\u52b9",
+"label.sticky.holdtime": "\u4fdd\u6301\u6642\u9593",
+"label.sticky.indirect": "\u9593\u63a5",
+"label.sticky.length": "\u9577\u3055",
+"label.sticky.name": "\u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u540d",
+"label.sticky.nocache": "\u30ad\u30e3\u30c3\u30b7\u30e5\u306a\u3057",
+"label.sticky.postonly": "\u30dd\u30b9\u30c8\u306e\u307f",
+"label.sticky.prefix": "\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9",
+"label.sticky.request-learn": "\u30e9\u30fc\u30cb\u30f3\u30b0\u306e\u8981\u6c42",
+"label.sticky.tablesize": "\u30c6\u30fc\u30d6\u30eb \u30b5\u30a4\u30ba",
+"label.stop": "\u505c\u6b62",
+"label.stop.lb.vm": "LB VM \u306e\u505c\u6b62",
+"label.stopped": "\u505c\u6b62\u4e2d\u306e VM",
+"label.storage": "\u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.storage.tags": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30bf\u30b0",
+"label.storage.traffic": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af",
+"label.storageid": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8",
+"label.storagepool": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb",
+"label.storagetags": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30bf\u30b0",
+"label.storagetype": "\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7a2e\u985e",
+"label.subdomainaccess": "\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3 \u30a2\u30af\u30bb\u30b9",
+"label.submit": "\u9001\u4fe1",
+"label.submitted.by": "[\u9001\u4fe1\u30e6\u30fc\u30b6\u30fc: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "\u6210\u529f",
+"label.suitability": "\u9069\u5408",
+"label.sunday": "\u65e5\u66dc\u65e5",
+"label.supportedservices": "\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u30b5\u30fc\u30d3\u30b9",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "\u30ea\u30fc\u30b8\u30e7\u30f3\u30ec\u30d9\u30eb\u306e VPC \u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b",
+"label.supportsstrechedl2subnet": "\u30b9\u30c8\u30ec\u30c3\u30c1 L2 \u30b5\u30d6\u30cd\u30c3\u30c8\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b",
+"label.suspend.project": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4e00\u6642\u505c\u6b62",
+"label.switch.type": "\u30b9\u30a4\u30c3\u30c1\u306e\u7a2e\u985e",
+"label.system.capacity": "\u30b7\u30b9\u30c6\u30e0\u306e\u51e6\u7406\u80fd\u529b",
+"label.system.offering": "\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.system.offering.for.router": "\u30eb\u30fc\u30bf\u30fc\u7528\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.system.offerings": "\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.system.service.offering": "\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.system.service.offering.details": "\u30b7\u30b9\u30c6\u30e0\u30b5\u30fc\u30d3\u30b9\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30",
+"label.system.vm": "\u30b7\u30b9\u30c6\u30e0 VM",
+"label.system.vm.details": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8a73\u7d30",
+"label.system.vm.scaled.up": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30b5\u30a4\u30ba\u304c\u62e1\u5927\u3055\u308c\u307e\u3057\u305f",
+"label.system.vms": "\u30b7\u30b9\u30c6\u30e0 VM",
+"label.system.wide.capacity": "\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u306e\u51e6\u7406\u80fd\u529b",
+"label.systemvmtype": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u7a2e\u985e",
+"label.tag.key": "\u30bf\u30b0 \u30ad\u30fc",
+"label.tag.value": "\u30bf\u30b0\u5024",
+"label.tagged": "\u30bf\u30b0\u3042\u308a",
+"label.tags": "\u30bf\u30b0",
+"label.target.iqn": "\u30bf\u30fc\u30b2\u30c3\u30c8 IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "\u30bf\u30b9\u30af\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f",
+"label.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.templatebody": "Body",
+"label.templatedn": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e",
+"label.templatefileupload": "\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb",
+"label.templatelimit": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5236\u9650",
+"label.templatename": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.templatenames": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.templates": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.templatesubject": "Subject",
+"label.templatetotal": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP \u30c7\u30a3\u30ec\u30af\u30c8\u30ea",
+"label.tftpdir": "TFTP \u30eb\u30fc\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea",
+"label.theme.default": "\u30c7\u30d5\u30a9\u30eb\u30c8 \u30c6\u30fc\u30de",
+"label.theme.grey": "\u30ab\u30b9\u30bf\u30e0 - \u30b0\u30ec\u30fc",
+"label.theme.lightblue": "\u30ab\u30b9\u30bf\u30e0 - \u30e9\u30a4\u30c8 \u30d6\u30eb\u30fc",
+"label.threshold": "\u3057\u304d\u3044\u5024",
+"label.thursday": "\u6728\u66dc\u65e5",
+"label.tier.details": "\u968e\u5c64\u306e\u8a73\u7d30",
+"label.tiername": "\u968e\u5c64",
+"label.time": "\u6642\u9593",
+"label.time.colon": "\u6642\u9593:",
+"label.timeout": "\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8",
+"label.timeout.in.second ": " \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5024(\u79d2)",
+"label.timezone": "\u30bf\u30a4\u30e0\u30be\u30fc\u30f3",
+"label.timezone.colon": "\u30bf\u30a4\u30e0\u30be\u30fc\u30f3:",
+"label.token": "\u30c8\u30fc\u30af\u30f3",
+"label.total.hosts": "\u30db\u30b9\u30c8\u5408\u8a08",
+"label.total.memory": "\u30e1\u30e2\u30ea\u5408\u8a08",
+"label.total.storage": "\u30b9\u30c8\u30ec\u30fc\u30b8\u5408\u8a08",
+"label.total.vms": "VM \u5408\u8a08",
+"label.totalcpu": "CPU \u5408\u8a08",
+"label.traffic.label": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.traffic.types": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e",
+"label.traffictype": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e",
+"label.transportzoneuuid": "\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8 \u30be\u30fc\u30f3\u306e UUID",
+"label.tuesday": "\u706b\u66dc\u65e5",
+"label.type": "\u7a2e\u985e",
+"label.type.id": "\u7a2e\u985e ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK \u30ad\u30fc\u30dc\u30fc\u30c9",
+"label.unavailable": "\u4f7f\u7528\u4e0d\u80fd",
+"label.unhealthy.threshold": "\u7570\u5e38\u3057\u304d\u3044\u5024",
+"label.unit": "Usage Unit",
+"label.unlimited": "\u7121\u5236\u9650",
+"label.untagged": "\u30bf\u30b0\u306a\u3057",
+"label.update.project.resources": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0",
+"label.update.ssl": " SSL \u8a3c\u660e\u66f8",
+"label.update.ssl.cert": " SSL \u8a3c\u660e\u66f8",
+"label.updating": "\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059",
+"label.upgrade.router.newer.template": "\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3059\u308b",
+"label.upload": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.upload.from.local": "\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.upload.template.from.local": "\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.upload.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.upload.volume.from.local": "\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.upload.volume.from.url": "URL \u304b\u3089\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9",
+"label.url": "URL",
+"label.usage.sanity.result": "\u4f7f\u7528\u72b6\u6cc1\u30b5\u30cb\u30c6\u30a3\u7d50\u679c",
+"label.usage.server": "\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30b5\u30fc\u30d0\u30fc",
+"label.usageinterface": "\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "\u6b21\u306e VM IP \u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528:",
+"label.use.vm.ips": "\u6b21\u306e VM IP \u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528",
+"label.usehttps": "HTTPS \u3092\u4f7f\u7528\u3059\u308b",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "\u30e6\u30fc\u30b6\u30fc",
+"label.user.details": "\u30e6\u30fc\u30b6\u30fc\u306e\u8a73\u7d30",
+"label.user.vm": "\u30e6\u30fc\u30b6\u30fc VM",
+"label.userdata": "\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf",
+"label.userdatal2": "\u30e6\u30fc\u30b6\u30fc \u30c7\u30fc\u30bf",
+"label.username": "\u30e6\u30fc\u30b6\u30fc\u540d",
+"label.users": "\u30e6\u30fc\u30b6\u30fc",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "\u5024",
+"label.vcdcname": "vCenter DC \u540d",
+"label.vcenter": "vCenter",
+"label.vcenter.cluster": "vCenter \u30af\u30e9\u30b9\u30bf\u30fc",
+"label.vcenter.datacenter": "vCenter \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc",
+"label.vcenter.datastore": "vCenter \u30c7\u30fc\u30bf\u30b9\u30c8\u30a2",
+"label.vcenter.host": "vCenter \u30db\u30b9\u30c8",
+"label.vcenter.password": "vCenter \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.vcenter.username": "vCenter \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.vcenterdatacenter": "vCenter \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc",
+"label.vcenterdatastore": "vCenter \u30c7\u30fc\u30bf\u30b9\u30c8\u30a2",
+"label.esx.host": "ESX/ESXi \u30db\u30b9\u30c8",
+"label.vcenterpassword": "vCenter \u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.vcenterusername": "vCenter \u30e6\u30fc\u30b6\u30fc\u540d",
+"label.vcipaddress": "vCenter IP \u30a2\u30c9\u30ec\u30b9",
+"label.vcsdeviceid": "ID",
+"label.version": "\u30d0\u30fc\u30b8\u30e7\u30f3",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "\u6700\u5927\u89e3\u50cf\u5ea6",
+"label.vgpu.max.vgpu.per.gpu": "GPU \u3042\u305f\u308a\u306e vGPU \u6570",
+"label.vgpu.remaining.capacity": "\u6b8b\u5b58\u51e6\u7406\u80fd\u529b",
+"label.vgpu.video.ram": "\u30d3\u30c7\u30aa RAM",
+"label.vgputype": "vGPU \u306e\u7a2e\u985e",
+"label.view": "\u8868\u793a -",
+"label.view.all": "\u3059\u3079\u3066\u8868\u793a",
+"label.view.console": "\u30b3\u30f3\u30bd\u30fc\u30eb\u306e\u8868\u793a",
+"label.view.more": "\u8a73\u7d30\u8868\u793a",
+"label.view.secondary.ips": "\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u8868\u793a",
+"label.viewing": "\u8868\u793a\u9805\u76ee:",
+"label.virtual.appliance": "\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9",
+"label.virtual.appliance.details": "\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9\u306e\u8a73\u7d30",
+"label.virtual.appliances": "\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9",
+"label.virtual.machine": "\u4eee\u60f3\u30de\u30b7\u30f3",
+"label.virtual.machines": "\u4eee\u60f3\u30de\u30b7\u30f3",
+"label.virtual.network": "\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.virtual.networking": "\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af",
+"label.virtual.routers": "\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc",
+"label.virtual.routers.group.account": "\u30a2\u30ab\u30a6\u30f3\u30c8\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7",
+"label.virtual.routers.group.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7",
+"label.virtual.routers.group.pod": "\u30dd\u30c3\u30c9\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7",
+"label.virtual.routers.group.zone": "\u30be\u30fc\u30f3\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7",
+"label.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "VLAN/VNI \u306e\u7bc4\u56f2",
+"label.vlan.range.details": "VLAN \u306e\u7bc4\u56f2\u306e\u8a73\u7d30",
+"label.vlan.vni.ranges": "VLAN/VNI \u306e\u7bc4\u56f2",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI \u306e\u7bc4\u56f2",
+"label.vm.add": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8ffd\u52a0",
+"label.vm.destroy": "\u7834\u68c4",
+"label.vm.password": "VM \u306e\u30d1\u30b9\u30ef\u30fc\u30c9:",
+"label.vm.reboot": "\u518d\u8d77\u52d5",
+"label.vm.snapshots": "VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8",
+"label.vm.start": "\u8d77\u52d5",
+"label.vm.stop": "\u505c\u6b62",
+"label.vmdisplayname": "VM \u8868\u793a\u540d",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS \u30c7\u30fc\u30bf\u30b9\u30c8\u30a2",
+"label.vmipaddress": "VM IP \u30a2\u30c9\u30ec\u30b9",
+"label.vmlimit": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5236\u9650",
+"label.vmname": "VM Name",
+"label.vms": "VM",
+"label.vms.in.tier": "\u968e\u5c64\u5185\u306e VM",
+"label.vmstate": "VM \u306e\u72b6\u614b",
+"label.vmtotal": "VM \u5408\u8a08",
+"label.vmwaredcid": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc ID",
+"label.vmwaredcname": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u540d",
+"label.vmwaredcvcenter": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e vCenter",
+"label.vmwarenetworklabel": "VMware \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC \u30c7\u30d0\u30a4\u30b9",
+"label.volgroup": "\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b0\u30eb\u30fc\u30d7",
+"label.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0",
+"label.volume.details": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u8a73\u7d30",
+"label.volume.migrated": "\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u79fb\u884c\u3055\u308c\u307e\u3057\u305f",
+"label.volumechecksum": "MD5 \u30c1\u30a7\u30c3\u30af\u30b5\u30e0",
+"label.volumefileupload": "\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb",
+"label.volumegroup": "\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b0\u30eb\u30fc\u30d7",
+"label.volumelimit": "\u30dc\u30ea\u30e5\u30fc\u30e0\u5236\u9650",
+"label.volumename": "\u30dc\u30ea\u30e5\u30fc\u30e0\u540d",
+"label.volumes": "\u30dc\u30ea\u30e5\u30fc\u30e0",
+"label.volumetotal": "\u30dc\u30ea\u30e5\u30fc\u30e0",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30",
+"label.vpc.offerings": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.vpc.router.details": "VPC \u30eb\u30fc\u30bf\u30fc\u306e\u8a73\u7d30",
+"label.vpc.virtual.router": "VPC \u4eee\u60f3\u30eb\u30fc\u30bf\u30fc",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC \u5236\u9650",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN \u63a5\u7d9a",
+"label.vpn.gateway": "VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.vpncustomergatewayid": "VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4",
+"label.vsmctrlvlanid": "\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb VLAN ID",
+"label.vsmdeviceid": "\u540d\u524d",
+"label.vsmdevicestate": "\u72b6\u614b",
+"label.vsmipaddress": "Nexus 1000V \u306e IP \u30a2\u30c9\u30ec\u30b9",
+"label.vsmpassword": "Nexus 1000V \u306e\u30d1\u30b9\u30ef\u30fc\u30c9",
+"label.vsmpktvlanid": "\u30d1\u30b1\u30c3\u30c8 VLAN ID",
+"label.vsmstoragevlanid": "\u30b9\u30c8\u30ec\u30fc\u30b8 VLAN ID",
+"label.vsmusername": "Nexus 1000V \u306e\u30e6\u30fc\u30b6\u30fc\u540d",
+"label.vsmusername.req": "Nexus 1000V \u306e\u30e6\u30fc\u30b6\u30fc\u540d",
+"label.vsphere.managed": "vSphere \u306b\u3088\u308b\u7ba1\u7406",
+"label.vswitch.name": "vSwitch \u540d",
+"label.vswitch.type": "vSwitch \u306e\u7a2e\u985e",
+"label.vswitchguestname": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u540d",
+"label.vswitchguesttype": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u306e\u7a2e\u985e",
+"label.vswitchpublicname": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u540d",
+"label.vswitchpublictype": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u306e\u7a2e\u985e",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN \u306e\u7bc4\u56f2",
+"label.waiting": "\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059",
+"label.warn": "\u8b66\u544a",
+"label.warn.upper": "\u8b66\u544a",
+"label.warning": "\u6ce8\u610f",
+"label.wednesday": "\u6c34\u66dc\u65e5",
+"label.weekly": "\u6bce\u9031",
+"label.welcome": "\u3088\u3046\u3053\u305d",
+"label.welcome.cloud.console": "\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb\u3078\u3088\u3046\u3053\u305d",
+"label.what.is.cloudstack": "CloudStack&#8482; \u306b\u3064\u3044\u3066",
+"label.writecachetype": "\u66f8\u304d\u8fbc\u307f\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u7a2e\u985e",
+"label.xennetworklabel": "XenServer \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb",
+"label.xenservertoolsversion61plus": "\u5143\u306e XS \u30d0\u30fc\u30b8\u30e7\u30f3\u306f 6.1 \u4ee5\u964d",
+"label.yes": "\u306f\u3044",
+"label.zone": "\u30be\u30fc\u30f3",
+"label.zone.dedicated": "\u5c02\u7528\u30be\u30fc\u30f3",
+"label.zone.details": "\u30be\u30fc\u30f3\u306e\u8a73\u7d30",
+"label.zone.id": "\u30be\u30fc\u30f3 ID",
+"label.zone.step.1.title": "\u624b\u9806 1: <strong>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u9078\u629e</strong>",
+"label.zone.step.2.title": "\u624b\u9806 2: <strong>\u30be\u30fc\u30f3\u306e\u8ffd\u52a0</strong>",
+"label.zone.step.3.title": "\u624b\u9806 3: <strong>\u30dd\u30c3\u30c9\u306e\u8ffd\u52a0</strong>",
+"label.zone.step.4.title": "\u624b\u9806 4: <strong>IP \u30a2\u30c9\u30ec\u30b9\u7bc4\u56f2\u306e\u8ffd\u52a0</strong>",
+"label.zone.type": "\u30be\u30fc\u30f3\u306e\u7a2e\u985e",
+"label.zone.wide": "\u30be\u30fc\u30f3\u5168\u4f53",
+"label.zoneid": "\u30be\u30fc\u30f3",
+"label.zonename": "\u30be\u30fc\u30f3",
+"label.zonenamelabel": "\u30be\u30fc\u30f3\u540d",
+"label.zones": "\u30be\u30fc\u30f3",
+"label.zonewizard.traffictype.guest": "\u30b2\u30b9\u30c8: \u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002",
+"label.zonewizard.traffictype.management": "\u7ba1\u7406: \u30db\u30b9\u30c8\u3084 CloudStack \u30b7\u30b9\u30c6\u30e0 VM  \u306a\u3069\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3059\u308b CloudStack \u306e\u5185\u90e8\u30ea\u30bd\u30fc\u30b9\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002",
+"label.zonewizard.traffictype.public": "\u30d1\u30d6\u30ea\u30c3\u30af: \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3068\u30af\u30e9\u30a6\u30c9\u5185\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002",
+"label.zonewizard.traffictype.storage": "\u30b9\u30c8\u30ec\u30fc\u30b8: VM \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3084\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306a\u3069\u3001\u30d7\u30e9\u30a4\u30de\u30ea\u304a\u3088\u3073\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002",
+"message.acquire.ip.nic": "\u3053\u306e NIC \u306e\u305f\u3081\u306b\u65b0\u3057\u3044\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?<br/>\u6ce8: \u65b0\u3057\u304f\u53d6\u5f97\u3057\u305f\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306f\u4eee\u60f3\u30de\u30b7\u30f3\u5185\u3067\u624b\u52d5\u3067\u69cb\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.acquire.new.ip": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.acquire.new.ip.vpc": "\u3053\u306e VPC \u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.acquire.public.ip": "\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3059\u308b\u30be\u30fc\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.action.cancel.maintenance": "\u30db\u30b9\u30c8\u306e\u4fdd\u5b88\u306f\u6b63\u5e38\u306b\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.cancel.maintenance.mode": "\u3053\u306e\u4fdd\u5b88\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.change.service.warning.for.instance": "\u73fe\u5728\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.change.service.warning.for.router": "\u73fe\u5728\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.delete.cluster": "\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.disk.offering": "\u3053\u306e\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.domain": "\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.external.firewall": "\u3053\u306e\u5916\u90e8\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u8b66\u544a: \u540c\u3058\u5916\u90e8\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u518d\u5ea6\u8ffd\u52a0\u3059\u308b\u4e88\u5b9a\u3067\u3042\u308b\u5834\u5408\u306f\u3001\u30c7\u30d0\u30a4\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u30c7\u30fc\u30bf\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.delete.external.load.balancer": "\u3053\u306e\u5916\u90e8\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u8b66\u544a: \u540c\u3058\u5916\u90e8\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u518d\u5ea6\u8ffd\u52a0\u3059\u308b\u4e88\u5b9a\u3067\u3042\u308b\u5834\u5408\u306f\u3001\u30c7\u30d0\u30a4\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u30c7\u30fc\u30bf\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.delete.ingress.rule": "\u3053\u306e\u53d7\u4fe1\u898f\u5247\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.iso": "\u3053\u306e ISO \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.iso.for.all.zones": "\u305d\u306e ISO \u306f\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u304b\u3089\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.network": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.nexusvswitch": "\u3053\u306e Nexus 1000V \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.physical.network": "\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.pod": "\u3053\u306e\u30dd\u30c3\u30c9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.primary.storage": "\u3053\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.secondary.storage": "\u3053\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.security.group": "\u3053\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.service.offering": "\u3053\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.snapshot": "\u3053\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.system.service.offering": "\u3053\u306e\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.template": "\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.template.for.all.zones": "\u305d\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u304b\u3089\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.volume": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.delete.zone": "\u3053\u306e\u30be\u30fc\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.destroy.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.destroy.systemvm": "\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.destroy.volume": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.cluster": "\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.nexusvswitch": "\u3053\u306e Nexus 1000V \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.physical.network": "\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.pod": "\u3053\u306e\u30dd\u30c3\u30c9\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.static.nat": "\u9759\u7684 NAT \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.disable.zone": "\u3053\u306e\u30be\u30fc\u30f3\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.download.iso": "\u3053\u306e ISO \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.download.template": "\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.downloading.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059\u3002",
+"message.action.enable.cluster": "\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.enable.maintenance": "\u30db\u30b9\u30c8\u3092\u4fdd\u5b88\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u3053\u306e\u30db\u30b9\u30c8\u4e0a\u306e VM \u6570\u306b\u3088\u3063\u3066\u306f\u3001\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.enable.nexusvswitch": "\u3053\u306e Nexus 1000V \u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.enable.physical.network": "\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.enable.pod": "\u3053\u306e\u30dd\u30c3\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.enable.zone": "\u3053\u306e\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.expunge.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.force.reconnect": "\u30db\u30b9\u30c8\u306f\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.host.enable.maintenance.mode": "\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u3001\u3053\u306e\u30db\u30b9\u30c8\u3067\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u307b\u304b\u306e\u4f7f\u7528\u3067\u304d\u308b\u30db\u30b9\u30c8\u306b\u30e9\u30a4\u30d6 \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3055\u308c\u307e\u3059\u3002",
+"message.action.instance.reset.password": "\u3053\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30eb\u30fc\u30c8 \u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.manage.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.primarystorage.enable.maintenance.mode": "\u8b66\u544a: \u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4fdd\u5b88\u30e2\u30fc\u30c9\u306b\u3059\u308b\u3068\u3001\u305d\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u4e0a\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f7f\u7528\u3059\u308b\u3059\u3079\u3066\u306e VM \u304c\u505c\u6b62\u3057\u307e\u3059\u3002\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.reboot.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.reboot.router": "\u3053\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.reboot.systemvm": "\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.recover.volume": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.release.ip": "\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.remove.host": "\u3053\u306e\u30db\u30b9\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.reset.password.off": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u73fe\u5728\u3053\u306e\u6a5f\u80fd\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002",
+"message.action.reset.password.warning": "\u73fe\u5728\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.action.restore.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.revert.snapshot": "\u6240\u6709\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u3053\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.start.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.start.router": "\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.start.systemvm": "\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.stop.instance": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.stop.router": "\u3053\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.stop.systemvm": "\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.unmanage.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"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": "\u3053\u306e VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.action.vmsnapshot.revert": "VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u5143\u306b\u623b\u3059",
+"message.activate.project": "\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.add.cluster": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306e\u30dd\u30c3\u30c9 <b><span id=\"pod_name\"></span></b> \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.cluster.zone": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.disk.offering": "\u65b0\u3057\u3044\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.domain": "\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u306b\u4f5c\u6210\u3059\u308b\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.firewall": "\u30be\u30fc\u30f3\u306b\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.guest.network": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.add.host": "\u65b0\u3057\u3044\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.ip.range": "\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.ip.range.direct.network": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306e\u76f4\u63a5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af <b><span id=\"directnetwork_name\"></span></b> \u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.ip.range.to.pod": "<p>\u30dd\u30c3\u30c9 <b><span id=\"pod_name_label\"></span></b> \u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059</p>",
+"message.add.load.balancer": "\u30be\u30fc\u30f3\u306b\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.load.balancer.under.ip": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u304c\u6b21\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3057\u3066\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f:",
+"message.add.network": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306b\u65b0\u3057\u3044\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.new.gateway.to.vpc": "\u3053\u306e VPC \u306b\u65b0\u3057\u3044\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.pod": "\u30be\u30fc\u30f3 <b><span id=\"add_pod_zone_name\"></span></b> \u306b\u65b0\u3057\u3044\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.pod.during.zone.creation": "\u5404\u30be\u30fc\u30f3\u306b\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306f\u30db\u30b9\u30c8\u3068\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u304c\u3001\u3053\u308c\u3089\u306f\u5f8c\u306e\u624b\u9806\u3067\u8ffd\u52a0\u3057\u307e\u3059\u3002\u6700\u521d\u306b\u3001CloudStack \u306e\u5185\u90e8\u7ba1\u7406\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u305f\u3081\u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u4e88\u7d04\u3057\u307e\u3059\u3002IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306f\u3001\u30af\u30e9\u30a6\u30c9\u5185\u306e\u5404\u30be\u30fc\u30f3\u3067\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b\u4e88\u7d04\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.add.primary": "\u65b0\u3057\u3044\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.primary.storage": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306e\u30dd\u30c3\u30c9 <b><span id=\"pod_name\"></span></b> \u306b\u65b0\u3057\u3044\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.region": "\u65b0\u3057\u3044\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.secondary.storage": "\u30be\u30fc\u30f3 <b><span id=\"zone_name\"></span></b> \u306b\u65b0\u3057\u3044\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3059",
+"message.add.service.offering": "\u65b0\u3057\u3044\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.system.service.offering": "\u65b0\u3057\u3044\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.template": "\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.volume": "\u65b0\u3057\u3044\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.add.vpn.gateway": "VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.added.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f",
+"message.adding.host": "\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"message.adding.netscaler.device": "NetScaler \u30c7\u30d0\u30a4\u30b9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"message.adding.netscaler.provider": "NetScaler \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059",
+"message.additional.networks.desc": "\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u63a5\u7d9a\u3059\u308b\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.admin.guide.read": "VMware \u30d9\u30fc\u30b9\u306e VM \u306b\u3064\u3044\u3066\u306f\u3001\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u524d\u306b\u7ba1\u7406\u8005\u30ac\u30a4\u30c9\u306e\u52d5\u7684\u306a\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u304a\u8aad\u307f\u304f\u3060\u3055\u3044\u3002\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?,",
+"message.advanced.mode.desc": "VLAN \u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30e2\u30c7\u30eb\u3067\u306f\u6700\u3082\u67d4\u8edf\u306b\u30ab\u30b9\u30bf\u30e0 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u63d0\u4f9b\u3067\u304d\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3001VPN\u3001\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u30b5\u30dd\u30fc\u30c8\u306e\u307b\u304b\u306b\u3001\u76f4\u63a5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3082\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002",
+"message.advanced.security.group": "\u30b2\u30b9\u30c8 VM \u3092\u5206\u96e2\u3059\u308b\u305f\u3081\u306b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.advanced.virtual": "\u30b2\u30b9\u30c8 VM \u3092\u5206\u96e2\u3059\u308b\u305f\u3081\u306b\u30be\u30fc\u30f3\u5168\u4f53\u306e VLAN \u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.after.enable.s3": "S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u304c\u69cb\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u6ce8: \u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001S3 \u3092\u518d\u69cb\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002",
+"message.after.enable.swift": "Swift \u304c\u69cb\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u6ce8: \u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001Swift \u3092\u518d\u69cb\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002",
+"message.alert.state.detected": "\u30a2\u30e9\u30fc\u30c8\u72b6\u614b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f",
+"message.allow.vpn.access": "VPN \u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.apply.snapshot.policy": "\u73fe\u5728\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 \u30dd\u30ea\u30b7\u30fc\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f\u3002",
+"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": "\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b ISO \u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.attach.volume": "\u65b0\u3057\u3044\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002Windows \u30d9\u30fc\u30b9\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306b\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u5834\u5408\u306f\u3001\u30a2\u30bf\u30c3\u30c1\u3057\u305f\u30c7\u30a3\u30b9\u30af\u3092\u8a8d\u8b58\u3059\u308b\u305f\u3081\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.basic.mode.desc": "VLAN \u30b5\u30dd\u30fc\u30c8\u304c<b><u>\u4e0d\u8981\u3067\u3042\u308b</u></b>\u5834\u5408\u306f\u3001\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3067\u4f5c\u6210\u3055\u308c\u308b\u3059\u3079\u3066\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304b\u3089\u76f4\u63a5 IP \u30a2\u30c9\u30ec\u30b9\u304c\u5272\u308a\u5f53\u3066\u3089\u308c\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3057\u3066\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u5206\u96e2\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002",
+"message.change.offering.confirm": "\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.change.password": "\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.cluster.dedicated": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f",
+"message.cluster.dedication.released": "\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f",
+"message.configure.all.traffic.types": "\u8907\u6570\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u3042\u308a\u307e\u3059\u3002[\u7de8\u96c6] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3054\u3068\u306b\u30e9\u30d9\u30eb\u3092\u69cb\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.configure.firewall.rules.allow.traffic": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u8a31\u53ef\u3059\u308b\u3088\u3046\u30eb\u30fc\u30eb\u3092\u8a2d\u5b9a\u3059\u308b",
+"message.configure.firewall.rules.block.traffic": "\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30d6\u30ed\u30c3\u30af\u3059\u308b\u3088\u3046\u30eb\u30fc\u30eb\u3092\u8a2d\u5b9a\u3059\u308b",
+"message.configure.ldap": "LDAP \u3092\u69cb\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.configuring.guest.traffic": "\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.configuring.physical.networks": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.configuring.public.traffic": "\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.configuring.storage.traffic": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.confirm.action.force.reconnect": "\u3053\u306e\u30db\u30b9\u30c8\u3092\u5f37\u5236\u518d\u63a5\u7d9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.add.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.archive.alert": "\u3053\u306e\u30a2\u30e9\u30fc\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.archive.event": "\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.archive.selected.alerts": "\u9078\u629e\u3057\u305f\u30a2\u30e9\u30fc\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.archive.selected.events": "\u9078\u629e\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.attach.disk": "\u30c7\u30a3\u30b9\u30af\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.create.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.current.guest.cidr.unchanged": "\u73fe\u5728\u306e\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e CIDR \u3092\u5909\u66f4\u305b\u305a\u306b\u7dad\u6301\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.dedicate.cluster.domain.account": "\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.dedicate.host.domain.account": "\u3053\u306e\u30db\u30b9\u30c8\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.dedicate.pod.domain.account": "\u3053\u306e\u30dd\u30c3\u30c9\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.dedicate.zone": "\u3053\u306e\u30be\u30fc\u30f3\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.acl.list": "\u3053\u306e ACL \u4e00\u89a7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.alert": "\u3053\u306e\u30a2\u30e9\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.baremetal.rack.configuration": "\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.bigswitchbcf": "\u3053\u306e BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.brocadevcs": "Brocade VCS \u30b9\u30a4\u30c3\u30c1\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.ciscoasa1000v": "Cisco ASA 1000V \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.ciscovnmc.resource": "Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.f5": "F5 \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.internal.lb": "\u5185\u90e8 LB \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.netscaler": "NetScaler \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.pa": "Palo Alto \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.secondary.staging.store": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.srx": "SRX \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.delete.ucs.manager": "UCS Manager \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.destroy.router": "\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.disable.host": "\u30db\u30b9\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.disable.network.offering": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.disable.provider": "\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.disable.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.disable.vpc.offering": "\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.enable.host": "\u30db\u30b9\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.enable.network.offering": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.enable.provider": "\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.enable.vnmc.provider": "VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.enable.vpc.offering": "\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.force.update": "Do you want to make a force update?",
+"message.confirm.join.project": "\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u53c2\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.migrate.volume": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.refresh.blades": "\u30d6\u30ec\u30fc\u30c9\u3092\u66f4\u65b0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.release.dedicate.vlan.range": "\u5c02\u7528 VLAN \u306e\u7bc4\u56f2\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.release.dedicated.cluster": "\u3053\u306e\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.release.dedicated.host": "\u3053\u306e\u5c02\u7528\u30db\u30b9\u30c8\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.release.dedicated.pod": "\u3053\u306e\u5c02\u7528\u30dd\u30c3\u30c9\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.release.dedicated.zone": "\u3053\u306e\u5c02\u7528\u30be\u30fc\u30f3\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.event": "\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.ip.range": "\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.load.balancer": "\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089 VM \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.network.offering": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.selected.alerts": "\u9078\u629e\u3057\u305f\u30a2\u30e9\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.selected.events": "\u9078\u629e\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.vmware.datacenter": "VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.remove.vpc.offering": "\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.replace.acl.new.one": "ACL \u3092\u65b0\u3057\u3044\u3082\u306e\u3068\u7f6e\u304d\u63db\u3048\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.scale.up.router.vm": "\u30eb\u30fc\u30bf\u30fc VM \u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.scale.up.system.vm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.shutdown.provider": "\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.start.lb.vm": "LB VM \u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.stop.lb.vm": "LB VM \u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.upgrade.router.newer.template": "\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.upgrade.routers.account.newtemplate": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.upgrade.routers.cluster.newtemplate": "\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.upgrade.routers.newtemplate": "\u3053\u306e\u30be\u30fc\u30f3\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.confirm.upgrade.routers.pod.newtemplate": "\u3053\u306e\u30dd\u30c3\u30c9\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.copy.iso.confirm": "ISO \u3092\u6b21\u306e\u5834\u6240\u306b\u30b3\u30d4\u30fc\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.copy.template": "\u30be\u30fc\u30f3 <b id=\"copy_template_source_zone_text\"></b> \u304b\u3089\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 <b id=\"copy_template_name_text\">XXX</b> \u3092\u6b21\u306e\u5834\u6240\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059:",
+"message.copy.template.confirm": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.create.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.create.template.vm": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 <b id=\"p_name\"></b> \u304b\u3089 VM \u3092\u4f5c\u6210\u3057\u307e\u3059",
+"message.create.template.volume": "\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0 <b><span id=\"volume_name\"></span></b> \u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u524d\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306b\u3088\u3063\u3066\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.creating.cluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.guest.network": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.physical.networks": "\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.pod": "\u30dd\u30c3\u30c9\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.primary.storage": "\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.secondary.storage": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.creating.systemvm": "\u30b7\u30b9\u30c6\u30e0 VM \u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 (\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044)",
+"message.creating.zone": "\u30be\u30fc\u30f3\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059",
+"message.dedicate.zone": "\u30be\u30fc\u30f3\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059",
+"message.dedicated.zone.released": "\u5c02\u7528\u30be\u30fc\u30f3\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f",
+"message.delete.account": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.affinity.group": "\u3053\u306e\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.gateway": "\u3053\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.project": "\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.user": "\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.vpn.connection": "VPN \u63a5\u7d9a\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.vpn.customer.gateway": "\u3053\u306e VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.delete.vpn.gateway": "\u3053\u306e VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.desc.add.new.lb.sticky.rule": "\u65b0\u3057\u3044 LB \u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u30eb\u30fc\u30eb\u3092\u8ffd\u52a0",
+"message.desc.advanced.zone": "\u3088\u308a\u6d17\u7df4\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6280\u8853\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u3088\u308a\u67d4\u8edf\u306b\u30b2\u30b9\u30c8\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u5b9a\u7fa9\u3057\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3001VPN\u3001\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u30b5\u30dd\u30fc\u30c8\u306e\u3088\u3046\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u63d0\u4f9b\u3067\u304d\u307e\u3059\u3002",
+"message.desc.basic.zone": "\u5404 VM \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b IP \u30a2\u30c9\u30ec\u30b9\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304b\u3089\u76f4\u63a5\u5272\u308a\u5f53\u3066\u3089\u308c\u308b\u3001\u5358\u4e00\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 (\u9001\u4fe1\u5143 IP \u30a2\u30c9\u30ec\u30b9\u306e\u30d5\u30a3\u30eb\u30bf\u30fc) \u306e\u3088\u3046\u306a\u30ec\u30a4\u30e4\u30fc 3 \u30ec\u30d9\u30eb\u306e\u65b9\u6cd5\u3067\u30b2\u30b9\u30c8\u3092\u5206\u96e2\u3067\u304d\u307e\u3059\u3002",
+"message.desc.cluster": "\u5404\u30dd\u30c3\u30c9\u306b\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30db\u30b9\u30c8\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b\u65b9\u6cd5\u3067\u3059\u30021 \u3064\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u306f\u3059\u3079\u3066\u540c\u4e00\u306e\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u304b\u3089\u69cb\u6210\u3055\u308c\u3001\u540c\u3058\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u5b9f\u884c\u3057\u3001\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u306b\u3042\u308a\u3001\u540c\u3058\u5171\u6709\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30db\u30b9\u30c8\u3068 1 \u3064\u4ee5\u4e0a\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u3002",
+"message.desc.create.ssh.key.pair": "SSH \u30ad\u30fc\u30da\u30a2\u306e\u751f\u6210\u304a\u3088\u3073\u767b\u9332\u306e\u305f\u3081\u306b\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044<br><br>(1) \u516c\u958b\u9375\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001CloudStack \u3067\u306f\u305d\u306e\u516c\u958b\u9375\u3092\u767b\u9332\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30ad\u30fc\u3092\u4f7f\u3063\u3066\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059<br><br>(2) \u516c\u958b\u9375\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3001CloudStack \u3067\u306f\u65b0\u3057\u3044 SSH \u30ad\u30fc\u30da\u30a2 \u3092\u751f\u6210\u3057\u307e\u3059\u3001\u305d\u306e\u6642 CloudStack \u3067\u306f\u79d8\u5bc6\u9375\u3092\u4fdd\u6301\u3057\u306a\u3044\u305f\u3081\u30e6\u30fc\u30b6\u30fc\u3067\u30b3\u30d4\u30fc\u304a\u3088\u3073\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044<br>",
+"message.desc.created.ssh.key.pair": "\u4f5c\u6210\u3055\u308c\u305f SSH \u30ad\u30fc\u30da\u30a2",
+"message.desc.host": "\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001\u30b2\u30b9\u30c8 VM \u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u30db\u30b9\u30c8 (\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc) \u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002CloudStack \u3067\u30db\u30b9\u30c8\u3092\u6a5f\u80fd\u3055\u305b\u308b\u306b\u306f\u3001\u30db\u30b9\u30c8\u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066 IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u3001\u30db\u30b9\u30c8\u304c CloudStack \u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<br/><br/>\u30db\u30b9\u30c8\u306e DNS \u540d\u307e\u305f\u306f IP \u30a2\u30c9\u30ec\u30b9\u3001\u30e6\u30fc\u30b6\u30fc\u540d (\u901a\u5e38\u306f root) \u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u304a\u3088\u3073\u30db\u30b9\u30c8\u306e\u5206\u985e\u306b\u4f7f\u7528\u3059\u308b\u30e9\u30d9\u30eb\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.desc.primary.storage": "\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30b5\u30fc\u30d0\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u4e0a\u3067\u52d5\u4f5c\u3059\u308b\u3059\u3079\u3066\u306e VM \u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u57fa\u790e\u3068\u306a\u308b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u3001\u6a19\u6e96\u306b\u6e96\u62e0\u3057\u305f\u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.desc.reset.ssh.key.pair": "\u3053\u306e VM \u306b\u8ffd\u52a0\u3059\u308b SSH \u30ad\u30fc\u30da\u30a2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u308b\u5834\u5408 root \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5909\u66f4\u3055\u308c\u308b\u70b9\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.desc.secondary.storage": "\u5404\u30be\u30fc\u30f3\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001NFS \u3064\u307e\u308a\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30b5\u30fc\u30d0\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f VM \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3001ISO \u30a4\u30e1\u30fc\u30b8\u3001\u304a\u3088\u3073VM \u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306f\u30be\u30fc\u30f3\u5185\u306e\u3059\u3079\u3066\u306e\u30db\u30b9\u30c8\u3067\u4f7f\u7528\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br/><br/>IP \u30a2\u30c9\u30ec\u30b9\u3068\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.desc.zone": "\u30be\u30fc\u30f3\u306f CloudStack \u74b0\u5883\u5185\u306e\u6700\u5927\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3001\u901a\u5e38\u3001\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306b\u3088\u3063\u3066\u7269\u7406\u7684\u306a\u5206\u96e2\u3068\u5197\u9577\u6027\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u30be\u30fc\u30f3\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9 (\u5404\u30dd\u30c3\u30c9\u306f\u30db\u30b9\u30c8\u3068\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059) \u3068\u3001\u30be\u30fc\u30f3\u5185\u306e\u3059\u3079\u3066\u306e\u30dd\u30c3\u30c9\u3067\u5171\u6709\u3055\u308c\u308b\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u3002",
+"message.detach.disk": "\u3053\u306e\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.detach.iso.confirm": "\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304b\u3089 ISO \u30d5\u30a1\u30a4\u30eb\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.disable.account": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30af\u30e9\u30a6\u30c9 \u30ea\u30bd\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u304c\u4eca\u3059\u3050\u306b\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3\u3055\u308c\u307e\u3059\u3002",
+"message.disable.snapshot.policy": "\u73fe\u5728\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 \u30dd\u30ea\u30b7\u30fc\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f\u3002",
+"message.disable.user": "\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.disable.vpn": "VPN \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.disable.vpn.access": "\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.disabling.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.disabling.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.disallowed.characters": "\u8a31\u53ef\u3055\u308c\u306a\u3044\u6587\u5b57: <,>",
+"message.download.iso": "ISO \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f <a href=\"#\">00000</a> \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059",
+"message.download.template": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f <a href=\"#\">00000</a> \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059",
+"message.download.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f <a href=\"#\">00000</a> \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059",
+"message.download.volume.confirm": "\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.edit.account": "\u7de8\u96c6 (\u300c-1\u300d\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306e\u91cf\u306b\u5236\u9650\u304c\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u307e\u3059)",
+"message.edit.confirm": "\u4fdd\u5b58\u3059\u308b\u524d\u306b\u5909\u66f4\u5185\u5bb9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.edit.limits": "\u6b21\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u5236\u9650\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u300c-1\u300d\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306b\u5236\u9650\u304c\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002",
+"message.edit.traffic.type": "\u3053\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u306b\u95a2\u9023\u4ed8\u3051\u308b\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.enable.account": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.enable.user": "\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.enable.vpn": "\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3059\u308b\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.enable.vpn.access": "\u73fe\u5728\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3059\u308b VPN \u306f\u7121\u52b9\u3067\u3059\u3002VPN \u30a2\u30af\u30bb\u30b9\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.enabled.vpn": "\u73fe\u5728\u3001\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u6b21\u306e IP \u30a2\u30c9\u30ec\u30b9\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002",
+"message.enabled.vpn.ip.sec": "IPSec \u4e8b\u524d\u5171\u6709\u30ad\u30fc:",
+"message.enabling.network.offering": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.enabling.security.group.provider": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.enabling.vpc.offering": "VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.enabling.zone": "\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059",
+"message.enabling.zone.dots": "\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...",
+"message.enter.seperated.list.multiple.cidrs": "CIDR \u304c\u8907\u6570\u3042\u308b\u5834\u5408\u306f\u3001\u30b3\u30f3\u30de\u533a\u5207\u308a\u306e\u4e00\u89a7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.enter.token": "\u96fb\u5b50\u30e1\u30fc\u30eb\u306e\u62db\u5f85\u72b6\u306b\u8a18\u8f09\u3055\u308c\u3066\u3044\u308b\u30c8\u30fc\u30af\u30f3\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.generate.keys": "\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u65b0\u3057\u3044\u30ad\u30fc\u3092\u751f\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.gslb.delete.confirm": "\u3053\u306e GSLB \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.gslb.lb.remove.confirm": "GSLB \u304b\u3089\u8ca0\u8377\u5206\u6563\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.guest.traffic.in.advanced.zone": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u3001\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u9593\u306e\u901a\u4fe1\u3067\u3059\u3002\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u901a\u4fe1\u3059\u308b\u305f\u3081\u306e VLAN ID \u306e\u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.guest.traffic.in.basic.zone": "\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u3001\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u9593\u306e\u901a\u4fe1\u3067\u3059\u3002CloudStack \u3067\u30b2\u30b9\u30c8 VM \u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u7bc4\u56f2\u304c\u4e88\u7d04\u6e08\u307f\u306e\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3068\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.host.dedicated": "\u30db\u30b9\u30c8\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f",
+"message.host.dedication.released": "\u5c02\u7528\u30db\u30b9\u30c8\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f",
+"message.installwizard.click.retry": "\u8d77\u52d5\u3092\u518d\u8a66\u884c\u3059\u308b\u306b\u306f\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.installwizard.copy.whatisacluster": "\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30db\u30b9\u30c8\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b\u65b9\u6cd5\u3067\u3059\u30021 \u3064\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u306f\u3059\u3079\u3066\u540c\u4e00\u306e\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u304b\u3089\u69cb\u6210\u3055\u308c\u3001\u540c\u3058\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u5b9f\u884c\u3057\u3001\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u306b\u3042\u308a\u3001\u540c\u3058\u5171\u6709\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u540c\u3058\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u9593\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u4e2d\u65ad\u305b\u305a\u306b\u3001\u4eee\u60f3\u30de\u30b7\u30f3 \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u30e9\u30a4\u30d6 \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f CloudStack&#8482; \u74b0\u5883\u5185\u306e 3 \u756a\u76ee\u306b\u5927\u304d\u306a\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30dd\u30c3\u30c9\u306b\u542b\u307e\u308c\u3001\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002 <br/><br/>CloudStack&#8482; \u3067\u306f 1 \u3064\u306e\u30af\u30e9\u30a6\u30c9\u74b0\u5883\u306b\u8907\u6570\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u304c\u3001\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306f 1 \u3064\u3067\u3059\u3002",
+"message.installwizard.copy.whatisahost": "\u30db\u30b9\u30c8\u306f\u5358\u4e00\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3067\u3001\u30b2\u30b9\u30c8\u4eee\u60f3\u30de\u30b7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ea\u30bd\u30fc\u30b9\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30d9\u30a2 \u30e1\u30bf\u30eb \u30db\u30b9\u30c8\u3092\u9664\u3044\u3066\u3001\u5404\u30db\u30b9\u30c8\u306b\u306f\u30b2\u30b9\u30c8\u4eee\u60f3\u30de\u30b7\u30f3\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u30d9\u30a2 \u30e1\u30bf\u30eb \u30db\u30b9\u30c8\u306b\u3064\u3044\u3066\u306f\u3001\u300e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30ac\u30a4\u30c9\u4e0a\u7d1a\u7de8\u300f\u3067\u7279\u6b8a\u4f8b\u3068\u3057\u3066\u8aac\u660e\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001KVM \u304c\u6709\u52b9\u306a Linux \u30b5\u30fc\u30d0\u30fc\u3001Citrix XenServer \u304c\u52d5\u4f5c\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u3001\u304a\u3088\u3073 ESXi \u30b5\u30fc\u30d0\u30fc\u304c\u30db\u30b9\u30c8\u3067\u3059\u3002\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u3001XenServer \u307e\u305f\u306f KVM \u3092\u5b9f\u884c\u3059\u308b\u5358\u4e00\u306e\u30db\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<br/><br/>\u30db\u30b9\u30c8\u306f CloudStack&#8482; \u74b0\u5883\u5185\u306e\u6700\u5c0f\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30db\u30b9\u30c8\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u542b\u307e\u308c\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30dd\u30c3\u30c9\u306b\u542b\u307e\u308c\u3001\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002",
+"message.installwizard.copy.whatisapod": "\u901a\u5e38\u30011 \u3064\u306e\u30dd\u30c3\u30c9\u306f\u5358\u4e00\u306e\u30e9\u30c3\u30af\u3092\u8868\u3057\u307e\u3059\u3002\u540c\u3058\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306f\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u306b\u542b\u307e\u308c\u307e\u3059\u3002 <br/><br/>\u30dd\u30c3\u30c9\u306f CloudStack&#8482; \u74b0\u5883\u5185\u306e 2 \u756a\u76ee\u306b\u5927\u304d\u306a\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002\u5404\u30be\u30fc\u30f3\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9\u3092\u542b\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u3001\u30be\u30fc\u30f3\u5185\u306e\u30dd\u30c3\u30c9\u306f 1 \u3064\u3067\u3059\u3002",
+"message.installwizard.copy.whatisazone": "\u30be\u30fc\u30f3\u306f CloudStack&#8482; \u74b0\u5883\u5185\u306e\u6700\u5927\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u30021 \u3064\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u5185\u306b\u8907\u6570\u306e\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u304c\u3001\u901a\u5e38\u3001\u30be\u30fc\u30f3\u306f\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u30be\u30fc\u30f3\u306b\u7d44\u7e54\u5316\u3059\u308b\u3068\u3001\u30be\u30fc\u30f3\u3092\u7269\u7406\u7684\u306b\u5206\u96e2\u3057\u3066\u5197\u9577\u5316\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u5404\u30be\u30fc\u30f3\u306b\u96fb\u6e90\u3068\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a2\u30c3\u30d7\u30ea\u30f3\u30af\u3092\u914d\u5099\u3057\u307e\u3059\u3002\u5fc5\u9808\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u304c\u3001\u30be\u30fc\u30f3\u306f\u9060\u9694\u5730\u306b\u5206\u6563\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002",
+"message.installwizard.copy.whatiscloudstack": "CloudStack&#8482; \u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ea\u30bd\u30fc\u30b9\u3092\u30d7\u30fc\u30eb\u3059\u308b\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2 \u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3001\u30d1\u30d6\u30ea\u30c3\u30af\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u3001\u304a\u3088\u3073\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u306e Infrastructure as a Service (IaaS) \u30af\u30e9\u30a6\u30c9\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002CloudStack&#8482; \u3092\u4f7f\u7528\u3057\u3066\u3001\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u69cb\u6210\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30b9\u30c8\u30ec\u30fc\u30b8\u3001\u304a\u3088\u3073\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ce\u30fc\u30c9\u3092\u7ba1\u7406\u3057\u3001\u30af\u30e9\u30a6\u30c9 \u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u74b0\u5883\u3092\u5c55\u958b\u3001\u7ba1\u7406\u3001\u304a\u3088\u3073\u69cb\u6210\u3057\u307e\u3059\u3002<br/><br/>CloudStack&#8482; \u306f\u30b3\u30e2\u30c7\u30a3\u30c6\u30a3\u5316\u3057\u305f\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u4e0a\u3067\u52d5\u4f5c\u3059\u308b\u500b\u5225\u306e\u4eee\u60f3\u30de\u30b7\u30f3 \u30a4\u30e1\u30fc\u30b8\u3092\u8d85\u3048\u3066\u62e1\u5f35\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u7c21\u5358\u306a\u8a2d\u5b9a\u3067\u52d5\u4f5c\u3059\u308b\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u306e\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2 \u30b9\u30bf\u30c3\u30af\u306b\u3088\u3063\u3066\u3001\u4eee\u60f3\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u3064\u307e\u308a\u591a\u5c64\u578b\u306e\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 \u30af\u30e9\u30a6\u30c9 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30b5\u30fc\u30d3\u30b9\u3068\u3057\u3066\u69cb\u7bc9\u3057\u3001\u5c55\u958b\u3057\u3001\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b\u4e0d\u53ef\u6b20\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u3059\u3079\u3066\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u30d7\u30ec\u30df\u30a2\u30e0 \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4e21\u65b9\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u304c\u3001\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u3082\u307b\u3068\u3093\u3069\u306e\u6a5f\u80fd\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002",
+"message.installwizard.copy.whatisprimarystorage": "CloudStack&#8482; \u306e\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3067\u306f\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e 2 \u7a2e\u985e\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u3069\u3061\u3089\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3082\u3001iSCSI\u3001NFS \u30b5\u30fc\u30d0\u30fc\u3001\u307e\u305f\u306f\u30ed\u30fc\u30ab\u30eb \u30c7\u30a3\u30b9\u30af\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002<br/><br/><strong>\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8</strong>\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3001\u305d\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u3067\u52d5\u4f5c\u3059\u308b\u3059\u3079\u3066\u306e VM \u306e\u5404\u30b2\u30b9\u30c8 VM \u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u901a\u5e38\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u306f\u30db\u30b9\u30c8\u306e\u8fd1\u304f\u306b\u8a2d\u7f6e\u3057\u307e\u3059\u3002",
+"message.installwizard.copy.whatissecondarystorage": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f\u30be\u30fc\u30f3\u3068\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3001\u6b21\u306e\u9805\u76ee\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002<ul><li>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 - VM \u306e\u8d77\u52d5\u306b\u4f7f\u7528\u3067\u304d\u308b OS \u30a4\u30e1\u30fc\u30b8\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306a\u3069\u8ffd\u52a0\u306e\u69cb\u6210\u3092\u542b\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002</li><li>ISO \u30a4\u30e1\u30fc\u30b8 - \u8d77\u52d5\u53ef\u80fd\u307e\u305f\u306f\u8d77\u52d5\u4e0d\u53ef\u306e OS \u30a4\u30e1\u30fc\u30b8\u3067\u3059\u3002</li><li>\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 - VM \u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\u30b3\u30d4\u30fc\u3067\u3059\u3002\u30c7\u30fc\u30bf\u306e\u5fa9\u5143\u307e\u305f\u306f\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002</ul>",
+"message.installwizard.now.building": "\u30af\u30e9\u30a6\u30c9\u3092\u69cb\u7bc9\u3057\u3066\u3044\u307e\u3059...",
+"message.installwizard.tooltip.addcluster.name": "\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u540d\u524d\u3067\u3059\u3002CloudStack \u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u306a\u3044\u3001\u4efb\u610f\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002",
+"message.installwizard.tooltip.addhost.hostname": "\u30db\u30b9\u30c8\u306e DNS \u540d\u307e\u305f\u306f IP \u30a2\u30c9\u30ec\u30b9\u3067\u3059\u3002",
+"message.installwizard.tooltip.addhost.password": "XenServer \u5074\u3067\u6307\u5b9a\u3057\u305f\u3001\u4e0a\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u306b\u5bfe\u3059\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002",
+"message.installwizard.tooltip.addhost.username": "\u901a\u5e38\u306f root \u3067\u3059\u3002",
+"message.installwizard.tooltip.addpod.name": "\u30dd\u30c3\u30c9\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemendip": "\u3053\u308c\u306f\u3001\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM \u304a\u3088\u3073\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM \u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b CloudStack \u3067\u4f7f\u7528\u3059\u308b\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30b5\u30fc\u30d0\u30fc\u3068\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u304b\u3089\u5272\u308a\u5f53\u3066\u307e\u3059\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "\u3053\u306e\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u3067\u4f7f\u7528\u3055\u308c\u308b\u30cd\u30c3\u30c8\u30de\u30b9\u30af\u3067\u3059\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "\u3053\u308c\u306f\u3001\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM \u304a\u3088\u3073\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM \u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b CloudStack \u3067\u4f7f\u7528\u3059\u308b\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30b5\u30fc\u30d0\u30fc\u3068\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u304b\u3089\u5272\u308a\u5f53\u3066\u307e\u3059\u3002",
+"message.installwizard.tooltip.addprimarystorage.name": "\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c7\u30d0\u30a4\u30b9\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.installwizard.tooltip.addprimarystorage.path": "(NFS \u306e\u5834\u5408) \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3067\u3059\u3002(SharedMountPoint \u306e\u5834\u5408) \u30d1\u30b9\u3067\u3059\u3002KVM \u3067\u306f\u3053\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u304c\u30de\u30a6\u30f3\u30c8\u3055\u308c\u308b\u5404\u30db\u30b9\u30c8\u4e0a\u306e\u30d1\u30b9\u3067\u3059\u3002\u305f\u3068\u3048\u3070\u3001/mnt/primary \u3067\u3059\u3002",
+"message.installwizard.tooltip.addprimarystorage.server": "(NFS\u3001iSCSI\u3001\u307e\u305f\u306f PreSetup \u306e\u5834\u5408) \u30b9\u30c8\u30ec\u30fc\u30b8 \u30c7\u30d0\u30a4\u30b9\u306e IP \u30a2\u30c9\u30ec\u30b9\u307e\u305f\u306f DNS \u540d\u3067\u3059\u3002",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u30db\u30b9\u30c8\u3059\u308b NFS \u30b5\u30fc\u30d0\u30fc\u306e IP \u30a2\u30c9\u30ec\u30b9\u3067\u3059\u3002",
+"message.installwizard.tooltip.addsecondarystorage.path": "\u4e0a\u306b\u6307\u5b9a\u3057\u305f\u30b5\u30fc\u30d0\u30fc\u306b\u5b58\u5728\u3059\u308b\u3001\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3067\u3059\u3002",
+"message.installwizard.tooltip.addzone.dns1": "\u30be\u30fc\u30f3\u5185\u306e\u30b2\u30b9\u30c8 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306b\u306f\u3001\u5f8c\u3067\u8ffd\u52a0\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.addzone.dns2": "\u30be\u30fc\u30f3\u5185\u306e\u30b2\u30b9\u30c8 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306b\u306f\u3001\u5f8c\u3067\u8ffd\u52a0\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.addzone.internaldns1": "\u30be\u30fc\u30f3\u5185\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4ecb\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3055\u308c\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.addzone.internaldns2": "\u30be\u30fc\u30f3\u5185\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4ecb\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3055\u308c\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.addzone.name": "\u30be\u30fc\u30f3\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.description": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8aac\u660e\u3067\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "\u3053\u306e\u30be\u30fc\u30f3\u306e\u30b2\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u304c\u3067\u304d\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u4f7f\u7528\u3059\u308b NIC \u304c 1 \u3064\u306e\u5834\u5408\u306f\u3001\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30dd\u30c3\u30c9\u306e CIDR \u3068\u540c\u3058 CIDR \u306b\u542b\u307e\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u3067\u4f7f\u7528\u3055\u308c\u308b\u30cd\u30c3\u30c8\u30de\u30b9\u30af\u3067\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "\u3053\u306e\u30be\u30fc\u30f3\u306e\u30b2\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u304c\u3067\u304d\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u4f7f\u7528\u3059\u308b NIC \u304c 1 \u3064\u306e\u5834\u5408\u306f\u3001\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30dd\u30c3\u30c9\u306e CIDR \u3068\u540c\u3058 CIDR \u306b\u542b\u307e\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.installwizard.tooltip.configureguesttraffic.name": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.instance.scaled.up.confirm": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.instancewizard.notemplates": "\u4f7f\u7528\u53ef\u80fd\u306a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4e92\u63db\u6027\u306e\u3042\u308b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 \u30a6\u30a3\u30b6\u30fc\u30c9\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.ip.address.changed": "\u304a\u4f7f\u3044\u306e IP \u30a2\u30c9\u30ec\u30b9\u304c\u5909\u66f4\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u4e00\u89a7\u3092\u66f4\u65b0\u3057\u307e\u3059\u304b? \u305d\u306e\u5834\u5408\u306f\u3001\u8a73\u7d30\u30da\u30a4\u30f3\u304c\u9589\u3058\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.iso.desc": "\u30c7\u30fc\u30bf\u307e\u305f\u306f OS \u8d77\u52d5\u53ef\u80fd\u30e1\u30c7\u30a3\u30a2\u3092\u542b\u3080\u30c7\u30a3\u30b9\u30af \u30a4\u30e1\u30fc\u30b8",
+"message.join.project": "\u3053\u308c\u3067\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u53c2\u7167\u3059\u308b\u306b\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d3\u30e5\u30fc\u306b\u5207\u308a\u66ff\u3048\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.launch.vm.on.private.network": "\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u306a\u5c02\u7528\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u307e\u3059\u304b?",
+"message.launch.zone": "\u30be\u30fc\u30f3\u3092\u8d77\u52d5\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002",
+"message.ldap.group.import": "All The users from the given group name will be imported",
+"message.link.domain.to.ldap": "\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u3068 LDAP \u306e\u81ea\u52d5\u540c\u671f\u3092\u6709\u52b9\u5316\u3059\u308b",
+"message.listview.subselect.multi": "(Ctrl/Cmd \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30af\u30ea\u30c3\u30af)",
+"message.lock.account": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30af\u30e9\u30a6\u30c9 \u30ea\u30bd\u30fc\u30b9\u3092\u7ba1\u7406\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u305d\u306e\u5f8c\u3082\u65e2\u5b58\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u306f\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002",
+"message.migrate.instance.confirm": "\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.migrate.instance.select.host": "\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u884c\u3046\u30db\u30b9\u30c8\u3092\u9078\u629e\u3002",
+"message.migrate.instance.to.host": "\u5225\u306e\u30db\u30b9\u30c8\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.migrate.instance.to.ps": "\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.migrate.router.confirm": "\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.migrate.systemvm.confirm": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.migrate.volume": "\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.network.addvm.desc": "\u3053\u306e VM \u3092\u8ffd\u52a0\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u305f\u3081\u306e\u65b0\u3057\u3044 NIC \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002",
+"message.network.addvmnic": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u65b0\u3057\u3044 VM NIC \u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.network.remote.access.vpn.configuration": "\u30ea\u30e2\u30fc\u30c8\u30a2\u30af\u30bb\u30b9 VPN \u306e\u8a2d\u5b9a\u306f\u751f\u6210\u3055\u308c\u307e\u3057\u305f\u304c\u9069\u7528\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u63a5\u7d9a\u6027\u3092\u78ba\u8a8d\u3057\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.network.removenic": "\u3053\u306e NIC \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3082 VM \u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306b\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.no.affinity.groups": "\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002",
+"message.no.host.available": "\u79fb\u884c\u306b\u4f7f\u7528\u3067\u304d\u308b\u30db\u30b9\u30c8\u306f\u3042\u308a\u307e\u305b\u3093",
+"message.no.more.hosts.available": "\u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u53ef\u80fd\u306a\u30db\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002",
+"message.no.network.support": "\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3068\u3057\u3066 vSphere \u3092\u9078\u629e\u3057\u307e\u3057\u305f\u304c\u3001\u3053\u306e\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306b\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u80fd\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u624b\u9806 5. \u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002",
+"message.no.network.support.configuration.not.true": "\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u304c\u6709\u52b9\u306a\u30be\u30fc\u30f3\u304c\u7121\u3044\u305f\u3081\u3001\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u80fd\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u624b\u9806 5. \u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002",
+"message.no.projects": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002<br/>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30bb\u30af\u30b7\u30e7\u30f3\u304b\u3089\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.no.projects.adminonly": "\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002<br/>\u7ba1\u7406\u8005\u306b\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u3092\u4f9d\u983c\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.number.clusters": "<h2>\u30af\u30e9\u30b9\u30bf\u30fc<span>\u6570</span></h2>",
+"message.number.hosts": "<h2>\u30db\u30b9\u30c8<span>\u6570</span></h2>",
+"message.number.pods": "<h2>\u30dd\u30c3\u30c9<span>\u6570</span></h2>",
+"message.number.storage": "<h2>\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30dc\u30ea\u30e5\u30fc\u30e0<span>\u6570</span></h2>",
+"message.number.zones": "<h2>\u30be\u30fc\u30f3<span>\u6570</span></h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"message.password.has.been.reset.to": "\u6b21\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f:",
+"message.password.of.the.vm.has.been.reset.to": "VM \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u6b21\u306e\u3088\u3046\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f:",
+"message.pending.projects.1": "\u4fdd\u7559\u4e2d\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u62db\u5f85\u72b6\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.pending.projects.2": "\u8868\u793a\u3059\u308b\u306b\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30bb\u30af\u30b7\u30e7\u30f3\u306b\u79fb\u52d5\u3057\u3066\u3001\u4e00\u89a7\u304b\u3089\u62db\u5f85\u72b6\u3092\u9078\u629e\u3057\u307e\u3059\u3002",
+"message.please.add.at.lease.one.traffic.range": "\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.please.confirm.remove.ssh.key.pair": "\u3053\u306e SSH \u30ad\u30fc\u30da\u30a2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.please.proceed": "\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002",
+"message.please.select.a.configuration.for.your.zone": "\u30be\u30fc\u30f3\u306e\u69cb\u6210\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.please.select.a.different.public.and.management.network.before.removing": "\u524a\u9664\u306e\u524d\u306b\u7570\u306a\u308b\u30d1\u30d6\u30ea\u30c3\u30af\u304a\u3088\u3073\u7ba1\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.please.select.networks": "\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.please.select.ssh.key.pair.use.with.this.vm": "\u3053\u306e VM \u306b\u4f7f\u7528\u3059\u308b SSH \u30ad\u30fc\u30da\u30a2\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.please.wait.while.zone.is.being.created": "\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u308b\u307e\u3067\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...",
+"message.pod.dedication.released": "\u5c02\u7528\u30dd\u30c3\u30c9\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f",
+"message.portable.ip.delete.confirm": "\u3053\u306e\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.project.invite.sent": "\u30e6\u30fc\u30b6\u30fc\u306b\u62db\u5f85\u72b6\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002\u30e6\u30fc\u30b6\u30fc\u304c\u62db\u5f85\u3092\u627f\u8afe\u3059\u308b\u3068\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002",
+"message.public.traffic.in.advanced.zone": "\u30af\u30e9\u30a6\u30c9\u5185\u306e VM \u304c\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u305f\u3081\u306b\u3001\u4e00\u822c\u306b\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306f CloudStack \u306e\u30e6\u30fc\u30b6\u30fc \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3001\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u9593\u306b NAT \u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br/><br/>\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u305f\u3081\u306b\u3001\u5c11\u306a\u304f\u3068\u3082 1 \u3064 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.public.traffic.in.basic.zone": "\u30af\u30e9\u30a6\u30c9\u5185\u306e VM \u304c\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u304b\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u7d4c\u7531\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u30b5\u30fc\u30d3\u30b9\u3092\u63d0\u4f9b\u3059\u308b\u3068\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u305f\u3081\u306b\u3001\u4e00\u822c\u306b\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3068\u3001\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u307b\u304b\u306b\u3053\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u304b\u3089\u30a2\u30c9\u30ec\u30b9\u304c 1 \u3064\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u3068\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u9593\u306b\u3001\u9759\u7684\u306a 1 \u5bfe 1 \u306e NAT \u304c\u81ea\u52d5\u7684\u306b\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306f CloudStack \u306e\u30e6\u30fc\u30b6\u30fc \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4f7f\u7528\u3057\u3066\u8ffd\u52a0\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3068\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u9593\u306b\u9759\u7684 NAT \u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002",
+"message.question.are.you.sure.you.want.to.add": "\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.read.admin.guide.scaling.up": "\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3059\u308b\u524d\u306b\u7ba1\u7406\u8005\u30ac\u30a4\u30c9\u306e\u52d5\u7684\u306a\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u304a\u8aad\u307f\u304f\u3060\u3055\u3044\u3002",
+"message.recover.vm": "\u3053\u306e VM \u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.redirecting.region": "\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3057\u3066\u3044\u307e\u3059...",
+"message.reinstall.vm": "\u6ce8: \u6ce8\u610f\u3057\u3066\u7d9a\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u306b\u3088\u308a VM \u304c\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304b\u3089\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af\u4e0a\u306e\u30c7\u30fc\u30bf\u306f\u5931\u308f\u308c\u307e\u3059\u3002\u8ffd\u52a0\u306e\u30c7\u30fc\u30bf \u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u305d\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306b\u5f71\u97ff\u306f\u3042\u308a\u307e\u305b\u3093\u3002",
+"message.remove.ldap": "LDAP \u69cb\u6210\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.remove.region": "\u3053\u306e\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u3053\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.remove.vpc": "VPC \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.remove.vpn.access": "\u6b21\u306e\u30e6\u30fc\u30b6\u30fc\u304b\u3089 VPN \u30a2\u30af\u30bb\u30b9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.removed.ssh.key.pair": "\u524a\u9664\u3055\u308c\u305f SSH \u30ad\u30fc\u30da\u30a2",
+"message.reset.password.warning.notpasswordenabled": "\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u3092\u6709\u52b9\u306b\u305b\u305a\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002",
+"message.reset.password.warning.notstopped": "\u73fe\u5728\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.reset.vpn.connection": "VPN \u63a5\u7d9a\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.restart.mgmt.server": "\u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.restart.mgmt.usage.server": "\u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30b5\u30fc\u30d0\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.restart.network": "\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.restart.vpc": "VPC \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.restart.vpc.remark": "VPC \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? <p><small><i>\u6ce8\u610f: \u975e\u5197\u9577 VPC \u306e\u5197\u9577\u5316\u306f\u5f37\u5236\u7684\u306b\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3059.  \u307e\u305f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u6570\u5206\u9593\u5229\u7528\u51fa\u6765\u306a\u304f\u306a\u308a\u307e\u3059</i>.</small></p>",
+"message.restorevm": "VM \u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(\u8a72\u5f53\u3059\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u3059\u3079\u3066\u9078\u629e\u3059\u308b\u306b\u306f\u3001<strong>Ctrl \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30af\u30ea\u30c3\u30af</strong>\u3057\u3066\u304f\u3060\u3055\u3044)",
+"message.select.a.zone": "\u30be\u30fc\u30f3\u306f\u901a\u5e38\u3001\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u8907\u6570\u306e\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3057\u3001\u7269\u7406\u7684\u306b\u5206\u96e2\u3057\u3066\u5197\u9577\u6027\u3092\u6301\u305f\u305b\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30af\u30e9\u30a6\u30c9\u306e\u4fe1\u983c\u6027\u3092\u9ad8\u3081\u307e\u3059\u3002",
+"message.select.affinity.groups": "\u3053\u306e VM \u3092\u8ffd\u52a0\u3059\u308b\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.instance": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.iso": "\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e ISO \u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.item": "\u9805\u76ee\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.security.groups": "\u65b0\u3057\u3044\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.template": "\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.select.tier": "\u968e\u5c64\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.set.default.nic": "\u3053\u306e NIC \u3092\u3053\u306e VM \u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.set.default.nic.manual": "\u4eca\u3059\u3050\u306b\u3053\u306e VM \u306e\u30c7\u30d5\u30a9\u30eb\u30c8 NIC \u3092\u624b\u52d5\u3067\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.setup.physical.network.during.zone.creation": "\u62e1\u5f35\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u3068\u304d\u306f\u30011 \u3064\u4ee5\u4e0a\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5404\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u4e0a\u306e 1 \u3064\u306e NIC \u306b\u5bfe\u5fdc\u3057\u307e\u3059\u3002\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u306f\u3001\u7d44\u307f\u5408\u308f\u305b\u306b\u5236\u9650\u304c\u3042\u308a\u307e\u3059\u304c\u30011 \u3064\u4ee5\u4e0a\u306e\u7a2e\u985e\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u901a\u4fe1\u3067\u304d\u307e\u3059\u3002<br/><br/>\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u5bfe\u3057\u3066<strong>\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3092\u30c9\u30e9\u30c3\u30b0 \u30a2\u30f3\u30c9 \u30c9\u30ed\u30c3\u30d7</strong>\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.setup.physical.network.during.zone.creation.basic": "\u57fa\u672c\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u3068\u304d\u306f\u3001\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u4e0a\u306e NIC \u306b\u5bfe\u5fdc\u3059\u308b 1 \u3064\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3067\u304d\u307e\u3059\u3002\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u3044\u304f\u3064\u304b\u306e\u7a2e\u985e\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u4f1d\u9001\u3057\u307e\u3059\u3002<br/><br/>\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u307b\u304b\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3092<strong>\u30c9\u30e9\u30c3\u30b0 \u30a2\u30f3\u30c9 \u30c9\u30ed\u30c3\u30d7</strong>\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002",
+"message.setup.successful": "\u30af\u30e9\u30a6\u30c9\u304c\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3057\u305f\u3002",
+"message.specifiy.tag.key.value": "\u30bf\u30b0 \u30ad\u30fc\u304a\u3088\u3073\u5024\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.specify.url": "URL \u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.step.1.desc": "\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u7528\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002ISO \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u308b\u7a7a\u767d\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002",
+"message.step.2.continue": "\u7d9a\u884c\u3059\u308b\u306b\u306f\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.step.3.continue": "\u7d9a\u884c\u3059\u308b\u306b\u306f\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.step.4.continue": "\u7d9a\u884c\u3059\u308b\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.step.4.desc": "\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u63a5\u7d9a\u3059\u308b\u30d7\u30e9\u30a4\u30de\u30ea \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.storage.traffic": "\u30db\u30b9\u30c8\u3084 CloudStack \u30b7\u30b9\u30c6\u30e0 VM  \u306a\u3069\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3059\u308b CloudStack \u306e\u5185\u90e8\u30ea\u30bd\u30fc\u30b9\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002\u3053\u3053\u3067\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.suspend.project": "\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4e00\u6642\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.systems.vms.ready": "\u30b7\u30b9\u30c6\u30e0 VM \u306e\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002",
+"message.template.copying": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059\u3002",
+"message.template.desc": "VM \u306e\u8d77\u52d5\u306b\u4f7f\u7528\u3067\u304d\u308b OS \u30a4\u30e1\u30fc\u30b8",
+"message.template.iso": "\u7d9a\u884c\u3059\u308b\u306b\u306f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u307e\u305f\u306f ISO \u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044",
+"message.tier.required": "\u968e\u5c64\u306f\u5fc5\u9808\u3067\u3059",
+"message.tooltip.dns.1": "\u30be\u30fc\u30f3\u5185\u306e VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.tooltip.dns.2": "\u30be\u30fc\u30f3\u5185\u306e VM \u3067\u4f7f\u7528\u3059\u308b 2 \u756a\u76ee\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.tooltip.internal.dns.1": "\u30be\u30fc\u30f3\u5185\u306e CloudStack \u5185\u90e8\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.tooltip.internal.dns.2": "\u30be\u30fc\u30f3\u5185\u306e CloudStack \u5185\u90e8\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.tooltip.network.domain": "DNS \u30b5\u30d5\u30a3\u30c3\u30af\u30b9\u3067\u3059\u3002\u3053\u306e\u30b5\u30d5\u30a3\u30c3\u30af\u30b9\u304b\u3089\u30b2\u30b9\u30c8 VM \u3067\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30ab\u30b9\u30bf\u30e0 \u30c9\u30e1\u30a4\u30f3\u540d\u304c\u4f5c\u6210\u3055\u308c\u307e\u3059\u3002",
+"message.tooltip.pod.name": "\u3053\u306e\u30dd\u30c3\u30c9\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.tooltip.reserved.system.gateway": "\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002",
+"message.tooltip.reserved.system.netmask": "\u30dd\u30c3\u30c9\u306e\u30b5\u30d6\u30cd\u30c3\u30c8\u3092\u5b9a\u7fa9\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3067\u3059\u3002CIDR \u8868\u8a18\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002",
+"message.tooltip.zone.name": "\u30be\u30fc\u30f3\u306e\u540d\u524d\u3067\u3059\u3002",
+"message.update.os.preference": "\u3053\u306e\u30db\u30b9\u30c8\u306e OS \u57fa\u672c\u8a2d\u5b9a\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u540c\u69d8\u306e\u57fa\u672c\u8a2d\u5b9a\u3092\u6301\u3064\u3059\u3079\u3066\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u3001\u5225\u306e\u30db\u30b9\u30c8\u3092\u9078\u629e\u3059\u308b\u524d\u306b\u307e\u305a\u3053\u306e\u30db\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002",
+"message.update.resource.count": "\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9\u6570\u3092\u66f4\u65b0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.update.ssl": "\u5404\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7\u304a\u3088\u3073\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u66f4\u65b0\u3059\u308b\u3001X.509 \u6e96\u62e0\u306e\u65b0\u3057\u3044 SSL \u8a3c\u660e\u66f8\u3092\u9001\u4fe1\u3057\u3066\u304f\u3060\u3055\u3044:",
+"message.update.ssl.failed": "SSL \u8a3c\u660e\u66f8\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002",
+"message.update.ssl.succeeded": "SSL \u8a3c\u660e\u66f8\u306e\u66f4\u65b0\u306b\u6210\u529f\u3057\u307e\u3057\u305f",
+"message.validate.accept": "\u6709\u52b9\u306a\u62e1\u5f35\u5b50\u3092\u6301\u3064\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.creditcard": "\u30af\u30ec\u30b8\u30c3\u30c8 \u30ab\u30fc\u30c9\u756a\u53f7\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.date": "\u65e5\u4ed8\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.date.iso": "\u65e5\u4ed8\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 (ISO)\u3002",
+"message.validate.digits": "\u6570\u5b57\u306e\u307f\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.email.address": "\u30e1\u30fc\u30eb \u30a2\u30c9\u30ec\u30b9\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.equalto": "\u540c\u3058\u5024\u3092\u518d\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.fieldrequired": "\u3053\u308c\u306f\u5fc5\u9808\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3067\u3059\u3002",
+"message.validate.fixfield": "\u3053\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.instance.name": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u540d\u306f 63 \u6587\u5b57\u4ee5\u5185\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002ASCII \u6587\u5b57\u306e a\uff5ez\u3001A\uff5eZ\u3001\u6570\u5b57\u306e 0\uff5e9\u3001\u304a\u3088\u3073\u30cf\u30a4\u30d5\u30f3\u306e\u307f\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u6587\u5b57\u3067\u59cb\u307e\u308a\u3001\u6587\u5b57\u307e\u305f\u306f\u6570\u5b57\u3067\u7d42\u308f\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.validate.invalid.characters": "\u7121\u52b9\u306a\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u4fee\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.max": "{0} \u4ee5\u4e0b\u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.maxlength": "{0} \u6587\u5b57\u4ee5\u4e0b\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.minlength": "{0} \u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.number": "\u6570\u5024\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.range": "{0} \uff5e {1} \u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.range.length": "{0} \uff5e {1} \u6587\u5b57\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.validate.url": "URL \u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.virtual.network.desc": "\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u5c02\u7528\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u3059\u3002\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306f VLAN \u5185\u306b\u914d\u7f6e\u3055\u308c\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306f\u3059\u3079\u3066\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u306b\u3088\u3063\u3066\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3055\u308c\u307e\u3059\u3002",
+"message.vm.create.template.confirm": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3068 VM \u304c\u81ea\u52d5\u7684\u306b\u518d\u8d77\u52d5\u3055\u308c\u307e\u3059\u3002",
+"message.vm.review.launch": "\u6b21\u306e\u60c5\u5831\u3092\u53c2\u7167\u3057\u3066\u3001\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6b63\u3057\u304f\u8a2d\u5b9a\u3057\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.vnmc.available.list": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u4e00\u89a7\u3067 VNMC \u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002",
+"message.vnmc.not.available.list": "\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u4e00\u89a7\u3067 VNMC \u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002",
+"message.volume.create.template.confirm": "\u3053\u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306b\u3088\u3063\u3066\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002",
+"message.waiting.for.builtin.templates.to.load": "\u7d44\u307f\u8fbc\u307f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ed\u30fc\u30c9\u3092\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059...",
+"message.xstools61plus.update.failed": "[\u5143\u306e XS \u30d0\u30fc\u30b8\u30e7\u30f3\u306f 6.1 \u4ee5\u964d] \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30a8\u30e9\u30fc:",
+"message.you.must.have.at.least.one.physical.network": "\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u5fc5\u8981\u3067\u3059",
+"message.your.cloudstack.is.ready": "CloudStack \u306e\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f!",
+"message.zone.creation.complete": "\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u3053\u306e\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"message.zone.no.network.selection": "\u9078\u629e\u3057\u305f\u30be\u30fc\u30f3\u3067\u306f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002",
+"message.zone.step.1.desc": "\u30be\u30fc\u30f3\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.zone.step.2.desc": "\u65b0\u3057\u3044\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.zone.step.3.desc": "\u65b0\u3057\u3044\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"message.zonewizard.enable.local.storage": "\u8b66\u544a: \u3053\u306e\u30be\u30fc\u30f3\u306e\u30ed\u30fc\u30ab\u30eb \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8d77\u52d5\u5834\u6240\u306b\u5fdc\u3058\u3066\u6b21\u306e\u64cd\u4f5c\u304c\u5fc5\u8981\u3067\u3059\u3002<br/><br/>1. \u30b7\u30b9\u30c6\u30e0 VM \u3092\u5171\u6709\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3067\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u5171\u6709\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u305f\u5f8c\u3067\u30be\u30fc\u30f3\u306b\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30be\u30fc\u30f3\u3092\u7121\u52b9\u72b6\u614b\u304b\u3089\u958b\u59cb\u3059\u308b\u5fc5\u8981\u3082\u3042\u308a\u307e\u3059\u3002<br/><br/>2. \u30b7\u30b9\u30c6\u30e0 VM \u3092\u30ed\u30fc\u30ab\u30eb \u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3067\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3059\u308b\u524d\u306b system.vm.use.local.storage \u3092 true \u306b\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br/><br/><br/>\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?",
+"messgae.validate.min": "{0} \u4ee5\u4e0a\u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002",
+"network.rate": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901f\u5ea6",
+"side.by.side": "\u4e26\u5217",
+"state.accepted": "\u627f\u8afe\u6e08\u307f",
+"state.active": "\u30a2\u30af\u30c6\u30a3\u30d6",
+"state.allocating": "\u5272\u308a\u5f53\u3066\u4e2d",
+"state.backedup": "\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6e08\u307f",
+"state.backingup": "\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d",
+"state.completed": "\u5b8c\u4e86",
+"state.creating": "\u4f5c\u6210\u4e2d",
+"state.declined": "\u8f9e\u9000",
+"state.destroyed": "\u7834\u68c4\u6e08\u307f",
+"state.detached": "\u30c7\u30bf\u30c3\u30c1\u6e08\u307f",
+"state.disabled": "\u7121\u52b9",
+"state.enabled": "\u6709\u52b9",
+"state.error": "\u30a8\u30e9\u30fc",
+"state.expunging": "\u62b9\u6d88\u4e2d",
+"state.migrating": "\u79fb\u884c\u4e2d",
+"state.pending": "\u4fdd\u7559",
+"state.running": "\u5b9f\u884c\u4e2d",
+"state.starting": "\u958b\u59cb\u4e2d",
+"state.stopped": "\u505c\u6b62\u6e08\u307f",
+"state.stopping": "\u505c\u6b62\u3057\u3066\u3044\u307e\u3059",
+"state.suspended": "\u4e00\u6642\u505c\u6b62",
+"title.upload.volume": "\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9"
+}
\ No newline at end of file
diff --git a/ui/public/locales/ko_KR.json b/ui/public/locales/ko_KR.json
new file mode 100644
index 0000000..e9654cc
--- /dev/null
+++ b/ui/public/locales/ko_KR.json
@@ -0,0 +1,2363 @@
+{
+"changed.item.properties": "\ud56d\ubaa9 \uc18d\uc131 \ubcc0\uacbd",
+"confirm.enable.s3": "S3 \uae30\ubc18 2\ucc28 \uc800\uc7a5\uc18c \uc9c0\uc6d0\uc744 \ud558\ub824\uba74 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"confirm.enable.swift": "Swift \uae30\uc220 \uc9c0\uc6d0\ub97c \uc0ac\uc6a9 \ud558\ub824\uba74 \ub2e4\uc74c \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"error.could.not.change.your.password.because.non.native.user": "LDAP \uae30\ub2a5\uc774 \ud65c\uc131\ud654 \ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud328\uc2a4\uc6cc\ub4dc \ubcc0\uacbd\uc744 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4.",
+"error.could.not.enable.zone": "Zone\uc744 \uc0ac\uc6a9 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"error.installwizard.message": "\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc624\ub958\ub97c \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"error.invalid.username.password": "\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uba85 \ub610\ub294 \uc554\ud638",
+"error.login": "\uc0ac\uc6a9\uc790\uba85/\uc554\ud638\uac00 \uae30\ub85d\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.",
+"error.menu.select": "\ud56d\ubaa9\uc774 \uc120\ud0dd\ub418\uc5b4 \uc788\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc791\uc5c5\uc744 \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"error.mgmt.server.inaccessible": "\uad00\ub9ac \uc11c\ubc84\uc5d0 \uc811\uadfc \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc5d0 \uc7ac\uc2e4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"error.password.not.match": "\uc554\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c",
+"error.please.specify.physical.network.tags": "\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \ud0dc\uadf8\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74, \ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc740 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"error.session.expired": "\uc138\uc158 \uc720\ud6a8\uae30\uac04\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.",
+"error.unable.to.reach.management.server": "\uad00\ub9ac \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"error.unresolved.internet.name": "\uc778\ud130\ub137 \uc8fc\uc18c\ub97c \uc54c\uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"force.delete.domain.warning": "\uacbd\uace0:\uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74, \ubaa8\ub4e0 \ub0b4\ubd80 \ub3c4\uba54\uc778 \ubc0f \uad00\ub828\ud558\ub294 \ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4\uc640 \uadf8 \uc790\uc6d0\uc774 \uc0ad\uc81c\ub429\ub2c8\ub2e4.",
+"force.remove": "\uac15\uc81c \ud574\uc81c",
+"force.remove.host.warning": "\uacbd\uace0:\uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74, \uc2e4\ud589\uc911 \ubaa8\ub4e0 \uac00\uc0c1 \uba38\uc2e0\uc774 \uac15\uc81c\uc801\uc73c\ub85c \uc815\uc9c0\ub418\uc5b4 \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \ud638\uc2a4\ud2b8\uac00 \uac15\uc81c\uc801\uc73c\ub85c \ud574\uc81c\ub429\ub2c8\ub2e4.",
+"force.stop": "\uac15\uc81c \uc815\uc9c0",
+"force.stop.instance.warning": "\uacbd\uace0: \uc778\uc2a4\ud134\uc2a4 \uac15\uc81c \uc815\uc9c0\ub294 \ucd5c\uc885 \uc218\ub2e8\uc73c\ub85c \ud574 \uc8fc\uc2ed\uc2dc\uc624. \ub370\uc774\ud130\uac00 \uc190\uc2e4\ub420 \ubfd0\ub9cc \uc544\ub2c8\ub77c \uac00\uc0c1 \uba38\uc2e0 \ub3d9\uc791\uc774 \uc77c\uad00\ud558\uc9c0 \uc54a\uac8c \ub420 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "\uc774\ubbf8\uc9c0 \ub514\ub809\ud1a0\ub9ac",
+"inline": "\uc9c1\ub82c",
+"label.about": "\uc18c\uac1c",
+"label.about.app": "CloudStack \uc18c\uac1c",
+"label.accept.project.invitation": "\ud504\ub85c\uc81d\ud2b8 \ucd08\ub300 \uc2b9\uc778",
+"label.accesskey": "Access Key",
+"label.account": "\uacc4\uc815 \uc815\ubcf4",
+"label.account.and.security.group": "\uacc4\uc815 \uc815\ubcf4, \ubcf4\uc548 \uadf8\ub8f9",
+"label.account.details": "Account details",
+"label.account.id": "\uacc4\uc815 \uc815\ubcf4 ID",
+"label.account.name": "\uacc4\uc815 \uc815\ubcf4\uba85",
+"label.account.specific": "\uacc4\uc815 \uc815\ubcf4 \uace0\uc720",
+"label.accounts": "\uacc4\uc815 \uc815\ubcf4",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \ud569\uacc4",
+"label.acquire.new.ip": "\uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c \ucde8\ub4dd",
+"label.acquire.new.secondary.ip": "\uc0c8\ub85c\uc6b4 \ub450\ubc88\uc9f8 IP \uc8fc\uc18c \ucde8\ub4dd",
+"label.action": "Action",
+"label.action.attach.disk": "\ub514\uc2a4\ud06c \uc5f0\uacb0",
+"label.action.attach.disk.processing": "\ub514\uc2a4\ud06c\ub97c \uc5f0\uacb0\ud558\ub294 \uc911...",
+"label.action.attach.iso": "ISO \uc5f0\uacb0",
+"label.action.attach.iso.processing": "ISO\ub97c \uc5f0\uacb0\ud558\ub294 \uc911...",
+"label.action.cancel.maintenance.mode": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc \ucde8\uc18c",
+"label.action.cancel.maintenance.mode.processing": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \ucde8\uc18c\ud558\ub294 \uc911...",
+"label.action.change.password": "\uc554\ud638 \ubcc0\uacbd",
+"label.action.change.service": "\uc11c\ube44\uc2a4 \ubcc0\uacbd",
+"label.action.change.service.processing": "\uc11c\ube44\uc2a4\ub97c \ubcc0\uacbd\ud558\ub294 \uc911...",
+"label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
+"label.action.configure.stickiness": "\uc9c0\uc18d\uc131",
+"label.action.copy.iso": "ISO \ubcf5\uc0ac",
+"label.action.copy.iso.processing": "Copying ISO....",
+"label.action.copy.template": "\ud15c\ud50c\ub9bf \ubcf5\uc0ac",
+"label.action.copy.template.processing": "Copying Template....",
+"label.action.create.template.from.vm": "VM\uc5d0\uc11c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30",
+"label.action.create.template.from.volume": "\ubcfc\ub968\uc5d0\uc11c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30",
+"label.action.create.template.processing": "\ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4dc\ub294 \uc911...",
+"label.action.create.vm": "VM \ub9cc\ub4e4\uae30",
+"label.action.create.vm.processing": "VM\ub97c \ub9cc\ub4dc\ub294 \uc911...",
+"label.action.create.volume": "\ubcfc\ub968 \ub9cc\ub4e4\uae30",
+"label.action.create.volume.processing": "\ubcfc\ub968\uc744 \ub9cc\ub4dc\ub294 \uc911...",
+"label.action.delete.account": "\uacc4\uc815 \uc815\ubcf4 \uc0ad\uc81c",
+"label.action.delete.account.processing": "\uacc4\uc815 \uc815\ubcf4\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.cluster": "\ud074\ub7ec\uc2a4\ud130 \uc0ad\uc81c",
+"label.action.delete.cluster.processing": "\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.disk.offering": "\ub514\uc2a4\ud06c \uc81c\uacf5 \uc0ad\uc81c",
+"label.action.delete.disk.offering.processing": "\ub514\uc2a4\ud06c \uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.domain": "\ub3c4\uba54\uc778 \uc0ad\uc81c",
+"label.action.delete.domain.processing": "\ub3c4\uba54\uc778\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.firewall": "\ubc29\ud654\ubcbd(fire wall) \uaddc\uce59 \uc0ad\uc81c",
+"label.action.delete.firewall.processing": "\ubc29\ud654\ubcbd(fire wall)\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.ingress.rule": "\uc218\uc2e0 \uaddc\uce59 \uc0ad\uc81c",
+"label.action.delete.ingress.rule.processing": "\uc218\uc2e0 \uaddc\uce59\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.ip.range": "IP \uc8fc\uc18c \ubc94\uc704 \uc0ad\uc81c",
+"label.action.delete.ip.range.processing": "IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.iso": "ISO \uc0ad\uc81c",
+"label.action.delete.iso.processing": "ISO\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.load.balancer": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59 \uc0ad\uc81c",
+"label.action.delete.load.balancer.processing": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.network": "\ub124\ud2b8\uc6cc\ud06c \uc0ad\uc81c",
+"label.action.delete.network.processing": "\ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.nexusvswitch": "Nexus 1000V \uc0ad\uc81c",
+"label.action.delete.nic": "Remove NIC",
+"label.action.delete.physical.network": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ad\uc81c",
+"label.action.delete.pod": "Pod \uc0ad\uc81c",
+"label.action.delete.pod.processing": "Pod\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.primary.storage": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ad\uc81c",
+"label.action.delete.primary.storage.processing": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.secondary.storage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ad\uc81c",
+"label.action.delete.secondary.storage.processing": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.security.group": "\ubcf4\uc548 \uadf8\ub8f9 \uc0ad\uc81c",
+"label.action.delete.security.group.processing": "\ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.service.offering": "\uc11c\ube44\uc2a4\uc81c\uacf5 \uc0ad\uc81c",
+"label.action.delete.service.offering.processing": "\uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.snapshot": "\uc2a4\ub0c5\uc0f7 \uc0ad\uc81c",
+"label.action.delete.snapshot.processing": "\uc2a4\ub0c5\uc0f7\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.system.service.offering": "\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5 \uc0ad\uc81c",
+"label.action.delete.template": "\ud15c\ud50c\ub9bf \uc0ad\uc81c",
+"label.action.delete.template.processing": "\ud15c\ud50c\ub9bf\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.user": "\uc0ac\uc6a9\uc790 \uc0ad\uc81c",
+"label.action.delete.user.processing": "\uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.volume": "\ubcfc\ub968 \uc0ad\uc81c",
+"label.action.delete.volume.processing": "\ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.delete.zone": "Zone \uc0ad\uc81c",
+"label.action.delete.zone.processing": "Zone\uc744 \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.destroy.instance": "\uc778\uc2a4\ud134\uc2a4 \ud30c\uae30",
+"label.action.destroy.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \ud30c\uae30\ud558\ub294 \uc911...",
+"label.action.destroy.systemvm": "\uc2dc\uc2a4\ud15c VM \ud30c\uae30",
+"label.action.destroy.systemvm.processing": "\uc2dc\uc2a4\ud15c VM\ub97c \ud30c\uae30\ud558\ub294 \uc911...",
+"label.action.destroy.volume": "Destroy Volume",
+"label.action.detach.disk": "\ub514\uc2a4\ud06c \ubd84\ub9ac",
+"label.action.detach.disk.processing": "\ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac \ud558\ub294 \uc911...",
+"label.action.detach.iso": "ISO \ubd84\ub9ac",
+"label.action.detach.iso.processing": "ISO\ub97c \ubd84\ub9ac \ud558\ub294 \uc911...",
+"label.action.disable.account": "\uacc4\uc815 \uc815\ubcf4 \uc911\uc9c0",
+"label.action.disable.account.processing": "\uacc4\uc815 \uc815\ubcf4\ub97c \uc911\uc9c0\ud558\ub294 \uc911...",
+"label.action.disable.cluster": "\ud074\ub7ec\uc2a4\ud130 \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.cluster.processing": "\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911...",
+"label.action.disable.nexusvswitch": "Nexus 1000V \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.physical.network": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.pod": "Pod \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.pod.processing": "Pod\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911...",
+"label.action.disable.static.nat": "\uc815\uc801 NAT \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.static.nat.processing": "\uc815\uc801 NAT\ub97c \uc911\uc9c0\ud558\ub294 \uc911...",
+"label.action.disable.user": "\uc0ac\uc6a9\uc790 \uc911\uc9c0",
+"label.action.disable.user.processing": "\uc0ac\uc6a9\uc790\ub97c \uc911\uc9c0\ud558\ub294 \uc911...",
+"label.action.disable.zone": "Zone \uc0ac\uc6a9 \uc548 \ud568",
+"label.action.disable.zone.processing": "Zone\uc744 \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911...",
+"label.action.download.iso": "ISO \ub2e4\uc6b4\ub85c\ub4dc",
+"label.action.download.template": "\ud15c\ud50c\ub9bf \ub2e4\uc6b4\ub85c\ub4dc",
+"label.action.download.volume": "\ubcfc\ub968 \ub2e4\uc6b4\ub85c\ub4dc",
+"label.action.download.volume.processing": "\ubcfc\ub968\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub294 \uc911...",
+"label.action.edit.account": "\uacc4\uc815 \uc815\ubcf4 \ud3b8\uc9d1",
+"label.action.edit.disk.offering": "\ub514\uc2a4\ud06c \uc81c\uacf5 \ud3b8\uc9d1",
+"label.action.edit.domain": "\ub3c4\uba54\uc778 \ud3b8\uc9d1",
+"label.action.edit.global.setting": "\uae00\ub85c\ubc8c \uc124\uc815 \ud3b8\uc9d1",
+"label.action.edit.host": "\ud638\uc2a4\ud2b8 \ud3b8\uc9d1",
+"label.action.edit.instance": "\uc778\uc2a4\ud134\uc2a4 \ud3b8\uc9d1",
+"label.action.edit.iso": "ISO \ud3b8\uc9d1",
+"label.action.edit.network": "\ub124\ud2b8\uc6cc\ud06c \ud3b8\uc9d1",
+"label.action.edit.network.offering": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ud3b8\uc9d1",
+"label.action.edit.network.processing": "\ub124\ud2b8\uc6cc\ud06c\ub97c \ud3b8\uc9d1\ud558\ub294 \uc911...",
+"label.action.edit.pod": "Pod \ud3b8\uc9d1",
+"label.action.edit.primary.storage": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ud3b8\uc9d1",
+"label.action.edit.resource.limits": "\uc790\uc6d0 \uc81c\ud55c \ud3b8\uc9d1",
+"label.action.edit.service.offering": "\uc11c\ube44\uc2a4 \uc81c\uacf5 \ud3b8\uc9d1",
+"label.action.edit.template": "\ud15c\ud50c\ub9bf \ud3b8\uc9d1",
+"label.action.edit.user": "\uc0ac\uc6a9\uc790 \ud3b8\uc9d1",
+"label.action.edit.zone": "Zone \ud3b8\uc9d1",
+"label.action.enable.account": "\uacc4\uc815 \uc815\ubcf4 \uc0ac\uc6a9\ud568",
+"label.action.enable.account.processing": "\uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.cluster": "\ud074\ub7ec\uc2a4\ud130 \uc0ac\uc6a9\ud568",
+"label.action.enable.cluster.processing": "\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.maintenance.mode": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc \uc0ac\uc6a9\ud568",
+"label.action.enable.maintenance.mode.processing": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.nexusvswitch": "Nexus 1000V \uc0ac\uc6a9\ud568",
+"label.action.enable.physical.network": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ud568",
+"label.action.enable.pod": "Pod \uc0ac\uc6a9\ud568",
+"label.action.enable.pod.processing": "Pod\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.static.nat": "\uc815\uc801 NAT \uc0ac\uc6a9\ud568",
+"label.action.enable.static.nat.processing": "\uc815\uc801 NAT\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.user": "\uc0ac\uc6a9\uc790 \uc0ac\uc6a9\ud568",
+"label.action.enable.user.processing": "\uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.enable.zone": "Zone \uc0ac\uc6a9\ud568",
+"label.action.enable.zone.processing": "Zone\uc744 \uc0ac\uc6a9 \uc124\uc815 \uc911...",
+"label.action.expunge.instance": "Expunge Instance",
+"label.action.expunge.instance.processing": "Expunging Instance....",
+"label.action.force.reconnect": "\uac15\uc81c\uc7ac\uc811\uc18d",
+"label.action.force.reconnect.processing": "\uc7ac\uc811\uc18d\ud558\ub294 \uc911...",
+"label.action.generate.keys": "\ud0a4 \uc0dd\uc131",
+"label.action.generate.keys.processing": "\ud0a4\ub97c \uc0dd\uc131\ud558\ub294 \uc911...",
+"label.action.list.nexusvswitch": "Nexus 1000V \ubaa9\ub85d \ud45c\uc2dc",
+"label.action.lock.account": "\uacc4\uc815 \uc815\ubcf4 \uc7a0\uae08",
+"label.action.lock.account.processing": "\uacc4\uc815 \uc815\ubcf4\ub97c \uc7a0\uadf8\ub294 \uc911...",
+"label.action.manage.cluster": "\ud074\ub7ec\uc2a4\ud130 \uad00\ub9ac \ub3d9\uc791",
+"label.action.manage.cluster.processing": "\ud074\ub7ec\uc2a4\ud130\ub97c \uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\ub294 \uc911...",
+"label.action.migrate.instance": "\uc778\uc2a4\ud134\uc2a4 \uc774\uc804",
+"label.action.migrate.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\ub294 \uc911...",
+"label.action.migrate.router": "\ub77c\uc6b0\ud130 \uc774\uc804",
+"label.action.migrate.router.processing": "\ub77c\uc6b0\ud130\ub97c \uc774\uc804\ud558\ub294 \uc911...",
+"label.action.migrate.systemvm": "\uc2dc\uc2a4\ud15c VM \uc774\uc804",
+"label.action.migrate.systemvm.processing": "\uc2dc\uc2a4\ud15c VM\ub97c \uc774\uc804\ud558\ub294 \uc911",
+"label.action.project.add.account": "\uacc4\uc815 \uc815\ubcf4 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd94\uac00",
+"label.action.reboot.instance": "\uc778\uc2a4\ud134\uc2a4 \uc7ac\uc2dc\uc791",
+"label.action.reboot.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.reboot.router": "\ub77c\uc6b0\ud130 \uc7ac\uc2dc\uc791",
+"label.action.reboot.router.processing": "\ub77c\uc6b0\ud130\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.reboot.systemvm": "\uc2dc\uc2a4\ud15c VM \uc7ac\uc2dc\uc791",
+"label.action.reboot.systemvm.processing": "\uc2dc\uc2a4\ud15c VM\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.recover.volume": "Recover Volume",
+"label.action.recurring.snapshot": "\uc815\uae30 \uc2a4\ub0c5\uc0f7",
+"label.action.register.iso": "ISO \ub4f1\ub85d",
+"label.action.register.template": "Register Template from URL",
+"label.action.release.ip": "IP \uc8fc\uc18c \ud574\uc81c",
+"label.action.release.ip.processing": "IP \uc8fc\uc18c\ub97c \ud574\uc81c\ud558\ub294 \uc911...",
+"label.action.remove.host": "\ud638\uc2a4\ud2b8 \uc0ad\uc81c",
+"label.action.remove.host.processing": "\ud638\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.action.reset.password": "\uc554\ud638 \uc7ac\uc124\uc815",
+"label.action.reset.password.processing": "\uc554\ud638\ub97c \uc7ac\uc124\uc815 \ud558\ub294 \uc911...",
+"label.action.resize.volume": "\ubcfc\ub968 \ud06c\uae30 \ubcc0\uacbd",
+"label.action.resize.volume.processing": "\ubcfc\ub968 \ud06c\uae30 \ubcc0\uacbd \uc911...",
+"label.action.resource.limits": "\uc790\uc6d0 \uc81c\ud55c",
+"label.action.restore.instance": "\uc778\uc2a4\ud134\uc2a4 \ubcf5\uc6d0",
+"label.action.restore.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \ubcf5\uc6d0\ud558\ub294 \uc911...",
+"label.action.revert.snapshot": "Revert to Snapshot",
+"label.action.revert.snapshot.processing": "Reverting to Snapshot...",
+"label.action.start.instance": "\uc778\uc2a4\ud134\uc2a4 \uc2dc\uc791",
+"label.action.start.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.start.router": "\ub77c\uc6b0\ud130 \uc2dc\uc791",
+"label.action.start.router.processing": "\ub77c\uc6b0\ud130\ub97c \uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.start.systemvm": "\uc2dc\uc2a4\ud15c VM \uc2dc\uc791",
+"label.action.start.systemvm.processing": "\uc2dc\uc2a4\ud15c VM\ub97c \uc2dc\uc791\ud558\ub294 \uc911...",
+"label.action.stop.instance": "\uc778\uc2a4\ud134\uc2a4 \uc815\uc9c0",
+"label.action.stop.instance.processing": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud558\ub294 \uc911...",
+"label.action.stop.router": "\ub77c\uc6b0\ud130 \uc815\uc9c0",
+"label.action.stop.router.processing": "\ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud558\ub294 \uc911...",
+"label.action.stop.systemvm": "\uc2dc\uc2a4\ud15c VM \uc815\uc9c0",
+"label.action.stop.systemvm.processing": "\uc2dc\uc2a4\ud15c VM\ub97c \uc815\uc9c0\ud558\ub294 \uc911...",
+"label.action.take.snapshot": "\uc2a4\ub0c5\uc0f7 \ub9cc\ub4e4\uae30",
+"label.action.take.snapshot.processing": "\uc2a4\ub0c5\uc0f7\uc744 \ub9cc\ub4dc\ub294 \uc911....",
+"label.action.unmanage.cluster": "\ud074\ub7ec\uc2a4\ud130 \ube44\uad00\ub9ac \ub3d9\uc791",
+"label.action.unmanage.cluster.processing": "\ud074\ub7ec\uc2a4\ud130\ub97c \ube44\uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\ub294 \uc911...",
+"label.action.update.os.preference": "OS \uae30\ubcf8 \uc124\uc815 \uc5c5\ub370\uc774\ud2b8",
+"label.action.update.os.preference.processing": "OS \uae30\ubcf8 \uc124\uc815\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uc911...",
+"label.action.update.resource.count": "\uc790\uc6d0 \uc218 \uc5c5\ub370\uc774\ud2b8",
+"label.action.update.resource.count.processing": "\uc790\uc6d0 \uc218\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uc911...",
+"label.action.vmsnapshot.create": "VM \uc2a4",
+"label.action.vmsnapshot.delete": "VM",
+"label.action.vmsnapshot.revert": "VM \uc2a4\ub0c5\uc0f7",
+"label.actions": "\uc791\uc5c5",
+"label.activate.project": "\ud504\ub85c\uc81d\ud2b8 \ud65c\uc131\ud654",
+"label.activeviewersessions": "\ud65c\uc131 \uc138\uc158",
+"label.add": "\ucd94\uac00",
+"label.add.account": "\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00",
+"label.add.accounts": "\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00",
+"label.add.accounts.to": "\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00:",
+"label.add.acl": "\uad8c\ud55c \uad00\ub9ac(ACL) \ucd94\uac00",
+"label.add.acl.list": "Add 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.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"label.add.by": "\ucd94\uac00 \ub2e8\uc704",
+"label.add.by.cidr": "CIDR \ub85c \ucd94\uac00",
+"label.add.by.group": "\uadf8\ub8f9\uc5d0\uc11c \ucd94\uac00",
+"label.add.ciscoasa1000v": "Add CiscoASA1000v Resource",
+"label.add.cluster": "\ud074\ub7ec\uc2a4\ud130 \ucd94\uac00",
+"label.add.compute.offering": "\ucef4\ud4e8\ud305 \uc790\uc6d0 \ucd94\uac00",
+"label.add.direct.iprange": "\uc9c1\uc811 IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00",
+"label.add.disk.offering": "\ub514\uc2a4\ud06c \uc81c\uacf5 \ucd94\uac00",
+"label.add.domain": "\ub3c4\uba54\uc778 \ucd94\uac00",
+"label.add.egress.rule": "\uc804\uc1a1 \uaddc\uce59 \ucd94\uac00",
+"label.add.f5.device": "F5 \uae30\uae30 \ucd94\uac00",
+"label.add.firewall": "\ubc29\ud654\ubcbd(fire wall) \uaddc\uce59 \ucd94\uac00",
+"label.add.globo.dns": "Add GloboDNS",
+"label.add.gslb": "Add GSLB",
+"label.add.guest.network": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ucd94\uac00",
+"label.add.host": "\ud638\uc2a4\ud2b8 \ucd94\uac00",
+"label.add.ingress.rule": "\uc218\uc2e0 \uaddc\uce59 \ucd94\uac00",
+"label.add.intermediate.certificate": "Add intermediate certificate",
+"label.add.internal.lb": "Add Internal LB",
+"label.add.ip.range": "IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00",
+"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": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \ucd94\uac00",
+"label.add.more": "\ub2e4\ub978 \ud56d\ubaa9 \ucd94\uac00",
+"label.add.netscaler.device": "Netscaler \uae30\uae30 \ucd94\uac00",
+"label.add.network": "\ub124\ud2b8\uc6cc\ud06c \ucd94\uac00",
+"label.add.network.acl": "\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \ucd94\uac00",
+"label.add.network.acl.list": "Add Network ACL List",
+"label.add.network.device": "\ub124\ud2b8\uc6cc\ud06c \uae30\uae30 \ucd94\uac00",
+"label.add.network.offering": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ucd94\uac00",
+"label.add.new.f5": "\uc0c8\ub85c\uc6b4 F5 \ucd94\uac00",
+"label.add.new.gateway": "\uc0c8 \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00\ud558\uae30",
+"label.add.new.netscaler": "\uc0c8\ub85c\uc6b4 NetScaler \ucd94\uac00",
+"label.add.new.pa": "Add new Palo Alto",
+"label.add.new.srx": "\uc0c8\ub85c\uc6b4 SRX \ucd94\uac00",
+"label.add.new.tier": "\uc0c8 \uacc4\uce35 \ucd94\uac00",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Nvp \ucf58\ud2b8\ub864\ub7ec",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "Add Palo Alto device",
+"label.add.physical.network": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \ucd94\uac00",
+"label.add.pod": "Pod \ucd94\uac00",
+"label.add.port.forwarding.rule": "\ud3ec\ud1a0 \uc804\uc1a1 \uaddc\uce59\uc758 \ucd94\uac00",
+"label.add.portable.ip.range": "Add Portable IP Range",
+"label.add.primary.storage": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00",
+"label.add.private.gateway": "Add Private Gateway",
+"label.add.region": "\uc9c0\uc5ed",
+"label.add.resources": "\uc790\uc6d0 \ucd94\uac00",
+"label.add.role": "Add Role",
+"label.add.route": "\ub77c\uc6b0\ud2b8 \ucd94\uac00",
+"label.add.rule": "\uaddc\uce59 \ucd94\uac00",
+"label.add.rule.desc": "Create a new ACL rule",
+"label.add.secondary.storage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00",
+"label.add.security.group": "\ubcf4\uc548 \uadf8\ub8f9 \ucd94\uac00",
+"label.add.service.offering": "\uc11c\ube44\uc2a4\uc81c\uacf5 \ucd94\uac00",
+"label.add.srx.device": "SRX \uae30\uae30 \ucd94\uac00",
+"label.add.static.nat.rule": "\uc815\uc801 NAT \uaddc\uce59 \ucd94\uac00",
+"label.add.static.route": "\uc815\uc801 \ub77c\uc6b0\ud2b8 \ucd94\uac00",
+"label.add.system.service.offering": "\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5 \ucd94\uac00",
+"label.add.template": "\ud15c\ud50c\ub9bf \ucd94\uac00",
+"label.add.to.group": "\uadf8\ub8f9\uc5d0 \ucd94\uac00",
+"label.add.ucs.manager": "Add UCS Manager",
+"label.add.user": "\uc0ac\uc6a9\uc790 \ucd94\uac00",
+"label.add.vlan": "VLAN \ucd94\uac00",
+"label.add.vm": "VM \ucd94\uac00",
+"label.add.vm.to.tier": "\uacc4\uce35\uc5d0 VM \ucd94\uac00",
+"label.add.vms": "VM \ucd94\uac00",
+"label.add.vms.to.lb": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc5d0 VM \ucd94\uac00",
+"label.add.vmware.datacenter": "Add VMware datacenter",
+"label.add.vnmc.device": "Add VNMC device",
+"label.add.vnmc.provider": "Add VNMC provider",
+"label.add.volume": "\ubcfc\ub968 \ucd94\uac00",
+"label.add.vpc": "VPC \ucd94\uac00",
+"label.add.vpc.offering": "Add VPC Offering",
+"label.add.vpn.customer.gateway": "VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00",
+"label.add.vpn.gateway": "VPN \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00",
+"label.add.vpn.user": "VPN \uc0ac\uc6a9\uc790 \ucd94\uac00",
+"label.add.vxlan": "VXLAN \ucd94\uac00",
+"label.add.zone": "Zone \ucd94\uac00",
+"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": "\uc815\ubcf4 \ucd94\uac00",
+"label.adding.cluster": "\ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\uc911...",
+"label.adding.failed": "\ucd94\uac00\ud560 \uc218 \uc5c6\uc74c",
+"label.adding.pod": "Pod\ub97c \ucd94\uac00 \uac00\ub2a5",
+"label.adding.processing": "\ucd94\uac00\ud558\ub294 \uc911...",
+"label.adding.succeeded": "\ucd94\uac00 \uc644\ub8cc",
+"label.adding.user": "\uc0ac\uc6a9\uc790 \ucd94\uac00",
+"label.adding.zone": "Zone \ucd94\uac00",
+"label.additional.networks": "\ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c",
+"label.address": "Address",
+"label.admin": "\uad00\ub9ac\uc790",
+"label.admin.accounts": "\uad00\ub9ac\uc790 \uacc4\uc815 \uc815\ubcf4",
+"label.advanced": "\ud655\uc7a5",
+"label.advanced.mode": "\ud655\uc7a5 \ubaa8\ub4dc",
+"label.advanced.search": "\uace0\ub3c4 \uac80\uc0c9",
+"label.affinity": "Affinity",
+"label.affinity.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "\uc5d0\uc774\uc804\ud2b8 \uc554\ud638",
+"label.agent.username": "\uc5d0\uc774\uc804\ud2b8 \uc0ac\uc6a9\uc790\uba85",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "\ub3d9\uc758",
+"label.alert": "\uc54c\ub9bc \uccb4\uc81c",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "\uc54c\ub9bc \uccb4\uacc4",
+"label.algorithm": "\uc54c\uace0\ub9ac\uc998",
+"label.all": "\ubaa8\ub450",
+"label.allocated": "\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc",
+"label.allocationstate": "\ud560\ub2f9 \uc0c1\ud0dc",
+"label.allow": "Allow",
+"label.anti.affinity": "Anti-affinity",
+"label.anti.affinity.group": "Anti-affinity Group",
+"label.anti.affinity.groups": "Anti-affinity Groups",
+"label.api.version": "API Version",
+"label.apikey": "API \ud0a4",
+"label.app.name": "CloudStack",
+"label.apply": "\uc801\uc6a9",
+"label.archive": "Archive",
+"label.archive.alerts": "\uc54c\ub9bc",
+"label.archive.events": "\uc774\ubca4\ud2b8",
+"label.assign": "\ud560\ub2f9",
+"label.assign.instance.another": "Assign Instance to Another Account",
+"label.assign.to.load.balancer": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \ud560\ub2f9",
+"label.assign.vms": "Assign VMs",
+"label.associatednetwork": "\uad00\ub828 \ub124\ud2b8\uc6cc\ud06c",
+"label.associatednetworkid": "\uad00\ub828 \ub124\ud2b8\uc6cc\ud06c ID",
+"label.associatednetworkname": "\ub124\ud2b8\uc6cc\ud06c\uba85",
+"label.author.email": "\uc81c\uc791\uc790",
+"label.author.name": "Author name",
+"label.autoscale": "AutoScale",
+"label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
+"label.availability": "\uac00\uc6a9\uc131",
+"label.availabilityzone": "availabilityZone",
+"label.available": "\uc0ac\uc6a9 \uac00\ub2a5",
+"label.available.public.ips": "\uc0ac\uc6a9 \uac00\ub2a5 \uacf5\uac1c IP \uc8fc\uc18c",
+"label.back": "\ub4a4\ub85c",
+"label.balance": "Balance",
+"label.bandwidth": "\ub300\uc5ed\ud3ed",
+"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.baremetalcpu": "CPU (MHz)",
+"label.baremetalcpucores": "CPU \ucf54\uc5b4\uc218",
+"label.baremetalmac": "\ud638\uc2a4\ud2b8 MAC",
+"label.baremetalmemory": "\uba54\ubaa8\ub9ac (MB)",
+"label.basic": "\uae30\ubcf8",
+"label.basic.mode": "\uae30\ubcf8 \ubaa8\ub4dc",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "\ubd80\ud305 \uac00\ub2a5",
+"label.broadcastdomainrange": "\ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778 \ubc94\uc704",
+"label.broadcastdomaintype": "\ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778 \uc885\ub958",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "\uacc4\uc815 \uc815\ubcf4",
+"label.by.alert.type": "\uc54c\ub9bc",
+"label.by.availability": "\uac00\uc6a9\uc131",
+"label.by.domain": "\ub3c4\uba54\uc778",
+"label.by.end.date": "\uc885\ub8cc\uc77c",
+"label.by.event.type": "\uc774\ubca4\ud2b8",
+"label.by.level": "\ub808\ubca8",
+"label.by.pod": "Pod",
+"label.by.role": "\uc5ed\ud560",
+"label.by.start.date": "\uc2dc\uc791\uc77c",
+"label.by.state": "\uc0c1\ud0dc",
+"label.by.traffic.type": "\ud2b8\ub798\ud53d \uc885\ub958",
+"label.by.type": "\uc885\ub958",
+"label.by.type.id": "\uc885\ub958 ID",
+"label.by.zone": "Zone",
+"label.cachemode": "Write-cache Type",
+"label.cancel": "\ucde8\uc18c",
+"label.capacity": "\ucc98\ub9ac \ub2a5\ub825",
+"label.capacity.iops": "Capacity IOPS",
+"label.capacitybytes": "Capacity Bytes",
+"label.capacityiops": "IOPS Total",
+"label.certificate": "\uc778\uc99d\uc11c",
+"label.change.affinity": "Change Affinity",
+"label.change.ipaddress": "Change IP address for NIC",
+"label.change.service.offering": "\uc11c\ube44\uc2a4 \uc81c\uacf5 \ubcc0\uacbd",
+"label.change.value": "\uac12 \ubcc0\uacbd",
+"label.character": "\ubb38\uc790",
+"label.chassis": "Chassis",
+"label.checksum": "checksum",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR \ub610\ub294 \uacc4\uc815 \uc815\ubcf4/\ubcf4\uc548 \uadf8\ub8f9",
+"label.cidr.of.destination.network": "\ub300\uc0c1 \ub124\ud2b8\uc6cc\ud06c CIDR",
+"label.cidrlist": "\uc804\uc1a1\uc6d0 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.cleanup": "\uc0ad\uc81c\ud558\uae30",
+"label.clear.list": "\ubaa9\ub85d \uc0ad\uc81c",
+"label.close": "\ub2eb\uae30",
+"label.cloud.console": "\ud074\ub77c\uc6b0\ub4dc \uad00\ub9ac \ucf58\uc194",
+"label.cloud.managed": "Cloud.com \uad00\ub9ac",
+"label.cluster": "\ud074\ub7ec\uc2a4\ud130",
+"label.cluster.name": "\ud074\ub7ec\uc2a4\ud130\uba85",
+"label.clusterid": "\ud074\ub7ec\uc2a4\ud130",
+"label.clustername": "\ud074\ub7ec\uc2a4\ud130",
+"label.clusternamelabel": "\ud074\ub7ec\uc2a4\ud130\uba85",
+"label.clusters": "\ud074\ub7ec\uc2a4\ud130",
+"label.clustertype": "\ud074\ub7ec\uc2a4\ud130 \uc885\ub958",
+"label.clvm": "CLVM",
+"label.code": "\ucf54\ub4dc",
+"label.community": "\ucee4\ubba4\ub2c8\ud2f0",
+"label.compute": "\ucef4\ud4e8\ud305",
+"label.compute.and.storage": "\ucef4\ud4e8\ud305\uacfc \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.compute.offerings": "Compute Offerings",
+"label.configuration": "\uad6c\uc131",
+"label.configure": "\uad6c\uc131",
+"label.configure.ldap": "Configure LDAP",
+"label.configure.network.acls": "\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \uad6c\uc131",
+"label.configure.sticky.policy": "Configure Sticky Policy",
+"label.configure.vpc": "VPC \uad6c\uc131",
+"label.confirmation": "\ud655\uc778",
+"label.confirmdeclineinvitation": "\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd08\ub300\ub97c \uac70\uc808\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"label.confirmpassword": "\uc554\ud638 \ud655\uc778 \uc785\ub825",
+"label.congratulations": "\uc124\uc815\uc774 \uace7 \uc644\ub8cc\uc785\ub2c8\ub2e4.",
+"label.connectiontimeout": "Connection Timeout",
+"label.conservemode": "\uc808\uc57d \ubaa8\ub4dc",
+"label.console.proxy": "\ucf58\uc194 \ud504\ub85d\uc2dc",
+"label.console.proxy.vm": "Console Proxy VM",
+"label.continue": "\uc2e4\ud589",
+"label.continue.basic.install": "\uae30\ubcf8 \uc124\uce58 \uc2e4\ud589",
+"label.copying.iso": "Copying ISO",
+"label.corrections.saved": "\uc811\uc18d \uc815\ubcf4 \uc800\uc7a5",
+"label.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "\ud560\ub2f9 \uc644\ub8cc CPU",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "VM\uc5d0 \ud560\ub2f9 \uc644\ub8cc CPU",
+"label.cpuallocatedghz": "\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc",
+"label.cpulimit": "CPU limits",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (MHz)",
+"label.cputotal": "CPU \ud569\uacc4",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU \uc0ac\uc6a9\uc728",
+"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": "\ud504\ub85c\uc81d\ud2b8 \ub9cc\ub4e4\uae30",
+"label.create.ssh.key.pair": "Create a SSH Key Pair",
+"label.create.template": "\ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30",
+"label.create.vpn.connection": "VPN \uc811\uc18d \ub9cc\ub4e4\uae30",
+"label.created": "\uc77c\uc2dc \ub9cc\ub4e4\uae30",
+"label.created.by.system": "\uc2dc\uc2a4\ud15c \ub9cc\ub4e4\uae30",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "\ud06c\ub85c\uc2a4 \uc874",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "\ub9de\ucda4 \ub514\uc2a4\ud06c \ud06c\uae30",
+"label.daily": "\ub9e4\uc77c",
+"label.dashboard": "\ub300\uc2dc \ubcf4\ub4dc",
+"label.data.disk.offering": "\ub370\uc774\ud0c0 \ub514\uc2a4\ud06c \uc81c\uacf5",
+"label.date": "\ub0a0\uc9dc",
+"label.day": "Day",
+"label.day.of.month": "\ub9e4\uc6d4 \uc9c0\uc815\uc77c",
+"label.day.of.week": "\ub9e4\uc8fc \uc9c0\uc815\uc77c",
+"label.dc.name": "DC Name",
+"label.decline.invitation": "\ucd08\ub300 \uac70\uc808",
+"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": "\uc804\uc6a9",
+"label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
+"label.default": "\uae30\ubcf8",
+"label.default.use": "\uae30\ubcf8 \uc0ac\uc6a9",
+"label.default.view": "\uae30\ubcf8 \ubcf4\uae30",
+"label.delete": "\uc0ad\uc81c",
+"label.delete.acl.list": "Delete ACL List",
+"label.delete.affinity.group": "Delete Affinity Group",
+"label.delete.alerts": "\uc54c\ub9bc",
+"label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
+"label.delete.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "\uc774\ubca4\ud2b8",
+"label.delete.f5": "F5 \uc0ad\uc81c",
+"label.delete.gateway": "\uac8c\uc774\ud2b8\uc6e8\uc774 \uc0ad\uc81c",
+"label.delete.internal.lb": "Delete Internal LB",
+"label.delete.netscaler": "NetScaler \uc0ad\uc81c",
+"label.delete.niciranvp": "Remove Nvp Controller",
+"label.delete.opendaylight.device": "Delete OpenDaylight Controller",
+"label.delete.pa": "Delete Palo Alto",
+"label.delete.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "\ud504\ub85c\uc81d\ud2b8 \uc0ad\uc81c",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "SRX \uc0ad\uc81c",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"label.delete.vpn.connection": "VPN \uc811\uc18d \uc0ad\uc81c",
+"label.delete.vpn.customer.gateway": "VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 \uc0ad\uc81c",
+"label.delete.vpn.gateway": "VPN \uac8c\uc774\ud2b8\uc6e8\uc774\uc0ad\uc81c",
+"label.delete.vpn.user": "VPN \uc0ac\uc6a9\uc790 \uc0ad\uc81c",
+"label.deleteprofile": "Delete Profile",
+"label.deleting.failed": "\uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c",
+"label.deleting.processing": "\uc0ad\uc81c\ud558\ub294 \uc911...",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "\uc124\uba85",
+"label.destinationphysicalnetworkid": "\ubaa9\uc801 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c ID",
+"label.destinationzoneid": "\ubcf5\uc0ac\ud560 Zone",
+"label.destroy": "\ud30c\uae30",
+"label.destroy.router": "\ub77c\uc6b0\ud130 \ud30c\uae30",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "\ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac\ud568",
+"label.details": "\uc0c1\uc138",
+"label.deviceid": "\uae30\uae30 ID",
+"label.devices": "\uae30\uae30",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP \uc11c\ubc84 \uc885\ub958",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "\uc9c1\uc811 IP \uc8fc\uc18c",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "Disable Autoscale",
+"label.disable.host": "Disable Host",
+"label.disable.network.offering": "Disable network offering",
+"label.disable.provider": "\uc81c\uacf5\uc790 \uc0ac\uc6a9 \uc548 \ud568",
+"label.disable.vnmc.provider": "Disable VNMC provider",
+"label.disable.vpc.offering": "Disable VPC offering",
+"label.disable.vpn": "VPN \uc0ac\uc6a9 \uc548 \ud568",
+"label.disabled": "\uc0ac\uc6a9 \uc548\ud568",
+"label.disabling.vpn.access": "VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911",
+"label.disassociate.profile.blade": "Disassociate Profile from Blade",
+"label.disbale.vnmc.device": "Disable VNMC device",
+"label.disconnected": "\ub9c8\uc9c0\ub9c9 \uc885\ub8cc \uc2dc\uc810",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "\ub514\uc2a4\ud06c\uc81c\uacf5",
+"label.disk.size": "\ub514\uc2a4\ud06c \ud06c\uae30",
+"label.disk.volume": "\ub514\uc2a4\ud06c \ubcfc\ub968",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "\ub514\uc2a4\ud06c \uc81c\uacf5",
+"label.diskofferingid": "\ub514\uc2a4\ud06c \uc81c\uacf5",
+"label.disksize": "\ub514\uc2a4\ud06c \ud06c\uae30(GB \ub2e8\uc704)",
+"label.disksizeallocated": "\ud560\ub2f9 \uc644\ub8cc \ub514\uc2a4\ud06c",
+"label.disksizeallocatedgb": "\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc",
+"label.disksizetotal": "\ub514\uc2a4\ud06c \ud569\uacc4",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "\uc0ac\uc6a9 \uc911",
+"label.display.text": "\ud45c\uc2dc \ud14d\uc2a4\ud2b8",
+"label.displayname": "Display Name",
+"label.displaytext": "\uc124\uba85",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c DNS \ub3c4\uba54\uc778",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "\ub3c4\uba54\uc778",
+"label.domain.details": "Domain details",
+"label.domain.name": "\ub3c4\uba54\uc778\uba85",
+"label.domain.router": "\ub3c4\uba54\uc778 \ub77c\uc6b0\ud130",
+"label.domain.suffix": "DNS \ub3c4\uba54\uc778 (\uc608: xyz.com)",
+"label.domainid": "\ub3c4\uba54\uc778 ID",
+"label.domainname": "\ub3c4\uba54\uc778",
+"label.domainpath": "\ub3c4\uba54\uc778",
+"label.done": "\uc644\ub8cc",
+"label.double.quotes.are.not.allowed": "\ud070 \ub530\uc634\ud45c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c",
+"label.download.progress": "\ub2e4\uc6b4\ub85c\ub4dc \uc9c4\ud589 \uc0ac\ud56d",
+"label.dpd": "\uc815\uc9c0 \ud53c\uc5b4 \uac10\uc9c0",
+"label.drag.new.position": "\uc0c8\ub85c\uc6b4 \uc704\uce58\uc5d0 \ub04c\uc5b4\uc624\uae30",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "\ud3b8\uc9d1",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "Edit ACL rule",
+"label.edit.affinity.group": "Edit Affinity Group",
+"label.edit.lb.rule": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59 \ud3b8\uc9d1",
+"label.edit.network.details": "\ub124\ud2b8\uc6cc\ud06c \uc0c1\uc138\ud55c \ud3b8\uc9d1",
+"label.edit.project.details": "\ud504\ub85c\uc81d\ud2b8 \uc0c1\uc138 \ud3b8\uc9d1",
+"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": "\ud0dc\uadf8 \ud3b8\uc9d1",
+"label.edit.traffic.type": "\ud2b8\ub798\ud53d \uc885\ub958 \ud3b8\uc9d1",
+"label.edit.vpc": "VPC \ud3b8\uc9d1",
+"label.egress.default.policy": "Egress \uae30\ubcf8",
+"label.egress.rule": "\uc804\uc1a1 \uaddc\uce59",
+"label.egress.rules": "Egress rules",
+"label.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "\uc624\ub958 \uc2a4\ud2f1",
+"label.email": "\uc804\uc790 \uba54\uc77c",
+"label.enable.autoscale": "Enable Autoscale",
+"label.enable.host": "Enable Host",
+"label.enable.network.offering": "Enable network offering",
+"label.enable.provider": "\uc81c\uacf5\uc790 \uc0ac\uc6a9\ud568",
+"label.enable.s3": "Enable S3-backed Secondary Storage",
+"label.enable.swift": "Swift \uc0ac\uc6a9\ud568",
+"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 \uc0ac\uc6a9\ud568",
+"label.enabling.vpn": "VPN\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc74c",
+"label.enabling.vpn.access": "VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc74c",
+"label.end.ip": "\uc885\ub8cc IP \uc8fc\uc18c",
+"label.end.reserved.system.ip": "\uc608\uc57d\ub41c \uc885\ub8cc \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "\ub0a0\uc9dc(\uc885\ub8cc\uc77c)",
+"label.endip": "\uc885\ub8cc IP \uc8fc\uc18c",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "\uc5d4\ub4dc \ud3ec\uc778\ud2b8 \ub610\ub294 \uc791\uc5c5",
+"label.endport": "\uc885\ub8cc \ud3ec\ud1a0",
+"label.enter.token": "\ud1a0\ud070 \uc785\ub825",
+"label.error": "\uc624\ub958",
+"label.error.code": "\uc624\ub958 \ucf54\ub4dc",
+"label.error.something.went.wrong.please.correct.the.following": "\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub0b4\uc6a9\uc744 \uc218\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP \uc554\ud638\ud654",
+"label.esphash": "ESP \ud574\uc2dc",
+"label.esplifetime": "ESP \uc720\ud6a8\uae30\uac04(\ucd08)",
+"label.esppolicy": "ESP \uc815\ucc45",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "\uc774\ubca4\ud2b8",
+"label.every": "Every",
+"label.example": "\uc608",
+"label.expunge": "Expunge",
+"label.external.link": "External link",
+"label.f5": "F5",
+"label.f5.details": "F5 details",
+"label.failed": "\uc2e4\ud328",
+"label.featured": "\ucd94\ucc9c",
+"label.fetch.latest": "\ucd5c\uc2e0 \uc815\ubcf4 \ucde8\ub4dd",
+"label.filterby": "\ud544\ud130",
+"label.fingerprint": "FingerPrint",
+"label.firewall": "\ubc29\ud654\ubcbd(fire wall)",
+"label.firstname": "\uc774\ub984",
+"label.firstname.lower": "firstname",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "\ud615\uc2dd",
+"label.friday": "\uae08\uc694\uc77c",
+"label.full": "\uc804\uccb4",
+"label.full.path": "\uc804\uccb4 \uacbd\ub85c",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "\uc885\ub958",
+"label.fwdevicestate": "\uc0c1\ud0dc",
+"label.gateway": "\uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.general.alerts": "\uc77c\ubc18 \uc54c\ub9bc \uccb4\uc81c",
+"label.generating.url": "URL\ub97c \uc0dd\uc131\ud558\uace0 \uc788\uc74c",
+"label.global.settings": "\uae00\ub85c\ubc8c \uc124\uc815",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "\ubcfc\ub968",
+"label.go.step.2": "\ub2e8\uacc4 2\uc73c\ub85c",
+"label.go.step.3": "\ub2e8\uacc4 3\uc73c\ub85c",
+"label.go.step.4": "\ub2e8\uacc4 4\uc73c\ub85c",
+"label.go.step.5": "\ub2e8\uacc4 5\uc73c\ub85c",
+"label.gpu": "GPU",
+"label.group": "\uadf8\ub8f9",
+"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": "\uadf8\ub8f9(\uc635\uc158)",
+"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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "Service Type",
+"label.guest": "\uac8c\uc2a4\ud2b8",
+"label.guest.cidr": "\uac8c\uc2a4\ud2b8 CIDR",
+"label.guest.end.ip": "\uac8c\uc2a4\ud2b8 \uc885\ub8cc IP \uc8fc\uc18c",
+"label.guest.gateway": "\uac8c\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.guest.ip": "\uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c",
+"label.guest.ip.range": "\uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \ubc94\uc704",
+"label.guest.netmask": "\uac8c\uc2a4\ud2b8 \ub137 \ub9c8\uc2a4\ud06c",
+"label.guest.network.details": "Guest network details",
+"label.guest.networks": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c",
+"label.guest.start.ip": "\uac8c\uc2a4\ud2b8 \uc2dc\uc791 IP \uc8fc\uc18c",
+"label.guest.traffic": "\uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d",
+"label.guestcidraddress": "\uac8c\uc2a4\ud2b8 CIDR",
+"label.guestendip": "\uac8c\uc2a4\ud2b8 \uc885\ub8cc IP \uc8fc\uc18c",
+"label.guestgateway": "\uac8c\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.guestipaddress": "\uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c",
+"label.guestiptype": "\uac8c\uc2a4\ud2b8 \uc885\ub958",
+"label.guestnetmask": "\uac8c\uc2a4\ud2b8 \ub137 \ub9c8\uc2a4\ud06c",
+"label.guestnetworkid": "\ub124\ud2b8\uc6cc\ud06c ID",
+"label.guestnetworkname": "\ub124\ud2b8\uc6cc\ud06c\uba85",
+"label.guestosid": "OS \uc885\ub958",
+"label.gueststartip": "\uac8c\uc2a4\ud2b8 \uc2dc\uc791 IP \uc8fc\uc18c",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "\uace0\uac00\uc6a9\uc131 \uc0ac\uc6a9\ud568",
+"label.hahost": "\uace0\uac00\uc6a9\uc131 \uc0ac\uc6a9\ud568",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "\ud604\uc7ac \ubcfc\ub968 \uc2a4\ub0c5\uc0f7\uc744 \ub9cc\ub4dc\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ub3c4\uc6c0\ub9d0",
+"label.hide.ingress.rule": "\uc218\uc2e0 \uaddc\uce59\uc744 \uc228\uae30\uae30",
+"label.hints": "\uc815\ubcf4",
+"label.home": "Home",
+"label.host": "\ud638\uc2a4\ud2b8",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "\ud638\uc2a4\ud2b8\uba85",
+"label.host.tag": "Host Tag",
+"label.hostid": "\ud638\uc2a4\ud2b8",
+"label.hostname": "\ud638\uc2a4\ud2b8",
+"label.hostnamelabel": "\ud638\uc2a4\ud2b8\uba85",
+"label.hosts": "\ud638\uc2a4\ud2b8",
+"label.hosttags": "\ud638\uc2a4\ud2b8 \ud0dc\uadf8",
+"label.hourly": "\ub9e4\uc2dc\uac04",
+"label.hypervisor": "\ud558\uc774\ud37c \ubc14\uc774\uc800",
+"label.hypervisor.capabilities": "\ud558\uc774\ud37c \ubc14\uc774\uc800 \uae30\ub2a5",
+"label.hypervisor.type": "\ud558\uc774\ud37c \ubc14\uc774\uc800 \uc885\ub958",
+"label.hypervisors": "\ud558\uc774\ud37c\ubc14\uc774\uc800",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "\ud558\uc774\ud37c \ubc14\uc774\uc800",
+"label.hypervisorversion": "\ud558\uc774\ud37c \ubc14\uc774\uc800 \ubc84\uc804",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "ICMP \ucf54\ub4dc",
+"label.icmptype": "ICMP \uc885\ub958",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE \uc554\ud638\ud654",
+"label.ikehash": "IKE \ud574\uc2dc",
+"label.ikelifetime": "IKE \uc720\ud6a8\uae30\uac04(\ucd08)",
+"label.ikepolicy": "IKE \uc815\ucc45",
+"label.info": "\uc815\ubcf4",
+"label.info.upper": "INFO",
+"label.infrastructure": "\uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0",
+"label.ingress.rule": "\uc218\uc2e0 \uaddc\uce59",
+"label.initiated.by": "\uc2dc\uc791 \uc0ac\uc6a9\uc790",
+"label.insideportprofile": "Inside Port Profile",
+"label.installwizard.addclusterintro.subtitle": "\ud074\ub7ec\uc2a4\ud130 \ub300\ud55c \uc815\ubcf4",
+"label.installwizard.addclusterintro.title": "\ud074\ub7ec\uc2a4\ud130 \ucd94\uac00",
+"label.installwizard.addhostintro.subtitle": "\ud638\uc2a4\ud2b8\uc5d0 \ub300\ud574",
+"label.installwizard.addhostintro.title": "\ud638\uc2a4\ud2b8 \ucd94\uac00",
+"label.installwizard.addpodintro.subtitle": "Pod\uc5d0 \ub300\ud55c \uc815\ubcf4",
+"label.installwizard.addpodintro.title": "Pod \ucd94\uac00",
+"label.installwizard.addprimarystorageintro.subtitle": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ub300\ud574",
+"label.installwizard.addprimarystorageintro.title": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00",
+"label.installwizard.addsecondarystorageintro.subtitle": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ub300\ud574",
+"label.installwizard.addsecondarystorageintro.title": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00",
+"label.installwizard.addzoneintro.subtitle": "Zone\uc5d0 \ub300\ud55c \uc815\ubcf4",
+"label.installwizard.addzoneintro.title": "Zone \ucd94\uac00",
+"label.installwizard.click.launch": "[\uc2dc\uc791]\uc744 \ud074\ub9ad\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"label.installwizard.subtitle": "\ud604\uc7ac \uac00\uc774\ub4dc \ud22c\uc5b4\ub294 CloudStack\u2122 \ud658\uacbd \uc124\uc815\uc5d0 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4",
+"label.installwizard.title": "CloudStack\u2122 \ub9c8\ubc95\uc0ac",
+"label.instance": "\uc778\uc2a4\ud134\uc2a4",
+"label.instance.name": "\uc778\uc2a4\ud134\uc2a4\uba85",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "\ub0b4\ubd80\uba85",
+"label.instanceport": "Instance Port",
+"label.instances": "\uc778\uc2a4\ud134\uc2a4",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"label.internal.dns.1": "\ub0b4\ubd80 DNS 1",
+"label.internal.dns.2": "\ub0b4\ubd80 DNS 2",
+"label.internal.lb": "Internal LB",
+"label.internal.lb.details": "Internal LB details",
+"label.internaldns1": "\ub0b4\ubd80 DNS 1",
+"label.internaldns2": "\ub0b4\ubd80 DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "\uac04\uaca9 \uc885\ub958",
+"label.introduction.to.cloudstack": "CloudStack\u2122 \uc18c\uac1c",
+"label.invalid.integer": "\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc815\uc218\uac12",
+"label.invalid.number": "\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc22b\uc790\uac12",
+"label.invitations": "\ucd08\ub300\uc7a5",
+"label.invite": "\ucd08\ub300",
+"label.invite.to": "\ucd08\ub300 \ud504\ub85c\uc81d\ud2b8:",
+"label.invited.accounts": "\ucd08\ub300\uac00 \ub05d\ub09c \uacc4\uc815 \uc815\ubcf4",
+"label.ip": "IP",
+"label.ip.allocations": "IP \uc8fc\uc18c \ud560\ub2f9",
+"label.ip.or.fqdn": "IP \uc8fc\uc18c \ub610\ub294 FQDN",
+"label.ip.range": "IP \uc8fc\uc18c \ubc94\uc704",
+"label.ip.ranges": "IP \uc8fc\uc18c \ubc94\uc704",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP \uc8fc\uc18c",
+"label.ipaddress1": "IP \uc8fc\uc18c",
+"label.ipaddress2": "IP \uc8fc\uc18c",
+"label.iplimit": "\uacf5\uac1c IP \uc8fc\uc18c \uc81c\ud55c",
+"label.ips": "IP",
+"label.ipsecpsk": "IPsec \uc0ac\uc804 \uacf5\uc720 \ud0a4",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "\ud0c0\uac9f IQN",
+"label.is.redundant.router": "\uc911\ubcf5",
+"label.is.shared": "\uacf5\uc720",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "\ub9de\ucda4 \ub514\uc2a4\ud06c \ud06c\uae30",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "\uc804\uc6a9",
+"label.isdefault": "\uae30\ubcf8",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "\ucd94\ucd9c \uac00\ub2a5",
+"label.isfeatured": "\ucd94\ucc9c",
+"label.isforced": "\uac15\uc81c \uc0ad\uc81c",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO \uc2dc\uc791",
+"label.isoid": "ISO",
+"label.isolated.networks": "\ubd84\ub9ac \ub124\ud2b8\uc6cc\ud06c",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "\ubd84\ub9ac \ubc29\ubc95",
+"label.isolation.mode": "\ubd84\ub9ac \ubaa8\ub4dc",
+"label.isolationmethod": "\ubd84\ub9ac \ubc29\ubc95",
+"label.isolationmethods": "\ubd84\ub9ac \ubc29\ubc95",
+"label.isolationuri": "Isolation URI",
+"label.isoname": "\uc5f0\uacb0 ISO",
+"label.isos": "ISO",
+"label.ispasswordenabled": "\uc554\ud638 \uad00\ub9ac \uc0ac\uc6a9",
+"label.ispersistent": "Persistent ",
+"label.isportable": "\ud06c\ub85c\uc2a4 \uc874",
+"label.ispublic": "\uacf5\uac1c",
+"label.isready": "\uc900\ube44 \uc644\ub8cc",
+"label.isredundantrouter": "\uc911\ubcf5 \ub77c\uc6b0\ud130",
+"label.isrouting": "\ub77c\uc6b0\ud305",
+"label.isshared": "\uacf5\uc720",
+"label.issourcenat": "\uc804\uc1a1\uc6d0 NAT",
+"label.isstaticnat": "\uc815\uc801 NAT",
+"label.issystem": "\uc2dc\uc2a4\ud15c",
+"label.isvolatile": "Volatile",
+"label.item.listing": "\ud56d\ubaa9 \ubaa9\ub85d",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "\uc720\uc9c0",
+"label.keep.colon": "Keep:",
+"label.key": "\ud0a4",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "\ud0a4\ubcf4\ub4dc \uc885\ub958",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "KVM \ud2b8\ub798\ud53d \ub77c\ubca8",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"label.label": "\ub77c\ubca8",
+"label.lang.arabic": "Arabic",
+"label.lang.brportugese": "Brazilian Portugese",
+"label.lang.catalan": "Catalan",
+"label.lang.chinese": "\uc911\uad6d\uc5b4(\uac04\uccb4)",
+"label.lang.dutch": "Dutch (Netherlands)",
+"label.lang.english": "\uc601\uc5b4",
+"label.lang.french": "French",
+"label.lang.german": "German",
+"label.lang.hungarian": "Hungarian",
+"label.lang.italian": "Italian",
+"label.lang.japanese": "\uc77c\ubcf8\uc5b4",
+"label.lang.korean": "\ud55c\uad6d\uc5b4",
+"label.lang.norwegian": "Norwegian",
+"label.lang.polish": "Polish",
+"label.lang.russian": "Russian",
+"label.lang.spanish": "\uc2a4\ud398\uc778\uc5b4",
+"label.last.updated": "Last Update",
+"label.lastname": "\uc131",
+"label.lastname.lower": "lastname",
+"label.latest.events": "\ucd5c\uc2e0 \uc774\ubca4\ud2b8",
+"label.launch": "\uc2dc\uc791",
+"label.launch.vm": "VM \uc2dc\uc791",
+"label.launch.zone": "Zone \uc2dc\uc791",
+"label.lb.algorithm.leastconn": "\ucd5c\uc18c \uc811\uc18d",
+"label.lb.algorithm.roundrobin": "\ub77c\uc6b4\ub4dc \ub85c\ube48",
+"label.lb.algorithm.source": "\uc2dc\uc791 \uc704\uce58",
+"label.lbdevicededicated": "\uc804\uc6a9",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "\uc885\ub958",
+"label.lbdevicestate": "\uc0c1\ud0dc",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "\ub808\ubca8",
+"label.limitcpuuse": "CPU \uc81c\ud55c",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58",
+"label.load.balancing.policies": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc815\ucc45",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720",
+"label.loading": "\ub85c\ub4dc \ud558\ub294 \uc911",
+"label.local": "\ub85c\uceec",
+"label.local.storage": "\ub85c\uceec \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.local.storage.enabled": "Enable local storage for User VMs",
+"label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
+"label.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "\ub85c\uadf8\uc778",
+"label.logout": "\ub85c\uadf8\uc544\uc6c3",
+"label.lun": "LUN",
+"label.lun.number": "LUN \ubc88\ud638",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "\uacc4\uc815 \uc815\ubcf4 \ud504\ub85c\uc81d\ud2b8 \uc18c\uc720\uc790",
+"label.makeredundant": "Make redundant",
+"label.manage": "\uad00\ub9ac",
+"label.manage.resources": "\uc790\uc6d0 \uad00\ub9ac",
+"label.management": "\uad00\ub9ac",
+"label.management.ips": "\uad00\ub9ac IP \uc8fc\uc18c",
+"label.management.server": "Management Server",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "Max Error Retry",
+"label.maxguestslimit": "\ucd5c\ub300 \uac8c\uc2a4\ud2b8 \uc81c\ud55c",
+"label.maximum": "\ucd5c\ub300",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. memory (MiB)",
+"label.maxnetwork": "\ucd5c\ub300 \ub124\ud2b8\uc6cc\ud06c\uc218",
+"label.maxpublicip": "\ucd5c\ub300 \uacf5\uac1c IP \uc8fc\uc18c\uc218",
+"label.maxsnapshot": "\ucd5c\ub300 \uc2a4\ub0c5\uc0f7\uc218",
+"label.maxtemplate": "\ucd5c\ub300 \ud15c\ud50c\ub9bf\uc218",
+"label.maxuservm": "\ucd5c\ub300 \uc0ac\uc6a9\uc790 VM\uc218",
+"label.maxvolume": "\ucd5c\ub300 \ubcfc\ub968\uc218",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "\uc2e4\ud589 \ud560 \uc218 \uc788\uc74c",
+"label.memallocated": "Mem Allocation",
+"label.memory": "\uba54\ubaa8\ub9ac",
+"label.memory.total": "\uba54\ubaa8\ub9ac \ud569\uacc4",
+"label.memory.used": "\uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9",
+"label.memoryallocated": "\ud560\ub2f9\uc644\ub8cc \uba54\ubaa8\ub9ac",
+"label.memoryallocatedgb": "\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc",
+"label.memorylimit": "Memory limits (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "\ud560\ub2f9\uc644\ub8cc \uba54\ubaa8\ub9ac",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "\uc0ac\uc6a9 \uc911",
+"label.menu.all.accounts": "\ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4",
+"label.menu.all.instances": "\ubaa8\ub4e0 \uc778\uc2a4\ud134\uc2a4",
+"label.menu.community.isos": "\ucee4\ubba4\ub2c8\ud2f0 ISO",
+"label.menu.community.templates": "\ucee4\ubba4\ub2c8\ud2f0 \ud15c\ud50c\ub9bf",
+"label.menu.destroyed.instances": "\ud30c\uae30\ub41c \uc778\uc2a4\ud134\uc2a4",
+"label.menu.featured.isos": "\ucd94\ucc9c ISO",
+"label.menu.featured.templates": "\ucd94\ucc9c \ud15c\ud50c\ub9bf",
+"label.menu.ipaddresses": "IP \uc8fc\uc18c",
+"label.menu.my.accounts": "\ub098\uc758 \uacc4\uc815 \uc815\ubcf4",
+"label.menu.my.instances": "\ub098\uc758 \uc778\uc2a4\ud134\uc2a4",
+"label.menu.my.isos": "\ub098\uc758 ISO",
+"label.menu.my.templates": "\ub098\uc758 \ud15c\ud50c\ub9bf",
+"label.menu.physical.resources": "\ubb3c\ub9ac \uc790\uc6d0",
+"label.menu.regions": "Regions",
+"label.menu.running.instances": "\uc2e4\ud589 \uc911 \uc778\uc2a4\ud134\uc2a4",
+"label.menu.security.groups": "\ubcf4\uc548 \uadf8\ub8f9",
+"label.menu.service.offerings": "\uc11c\ube44\uc2a4\uc81c\uacf5",
+"label.menu.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "\uc815\uc9c0\ub41c \uc778\uc2a4\ud134\uc2a4",
+"label.menu.storage": "\uc2a4\ud1a0\ub9ac\uc9c0",
+"label.menu.system": "\uc2dc\uc2a4\ud15c",
+"label.menu.virtual.appliances": "\uac00\uc0c1 \uc544\ud504\ub77c\uc774\uc548\uc2a4",
+"label.menu.virtual.resources": "\uac00\uc0c1 \uc790\uc6d0",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "\uc778\uc2a4\ud134\uc2a4 \uc774\uc804 \uc704\uce58:",
+"label.migrate.instance.to.host": "\ub2e4\ub978 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc778\uc2a4\ud134\uc2a4 \uc774\uc804",
+"label.migrate.instance.to.ps": "\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc778\uc2a4\ud134\uc2a4 \uc774\uc804",
+"label.migrate.lb.vm": "Migrate LB VM",
+"label.migrate.router.to": "\ub77c\uc6b0\ud130 \uc774\uc804 \uc704\uce58:",
+"label.migrate.systemvm.to": "\uc2dc\uc2a4\ud15c VM \uc774\uc804 \uc704\uce58:",
+"label.migrate.to.host": "Migrate to host",
+"label.migrate.to.storage": "Migrate to storage",
+"label.migrate.volume": "Migrate Volume",
+"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": "\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ubcfc\ub968 \uc774\uc804",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "\ucd5c\uc18c",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "\uc6d4\uc694\uc77c",
+"label.monthly": "\ub9e4\uc6d4",
+"label.more.templates": "\ub2e4\ub978 \ud15c\ud50c\ub9bf",
+"label.move.down.row": "\uc544\ub798\ub85c \uc774\ub3d9",
+"label.move.to.bottom": "\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc774\ub3d9",
+"label.move.to.top": "\ucc98\uc74c\uc73c\ub85c \uc774\ub3d9",
+"label.move.up.row": "\uc704\ub85c \uc774\ub3d9",
+"label.my.account": "\ub098\uc758 \uacc4\uc815 \uc815\ubcf4",
+"label.my.network": "\ub0b4 \ub124\ud2b8\uc6cc\ud06c",
+"label.my.templates": "\ub098\uc758 \ud15c\ud50c\ub9bf",
+"label.na": "N/A",
+"label.name": "\uc774\ub984",
+"label.name.optional": "\uc774\ub984(\uc635\uc158)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "NAT \ud3ec\ud1a0 \ubc94\uc704",
+"label.netmask": "\ub137 \ub9c8\uc2a4\ud06c",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "\ub124\ud2b8\uc6cc\ud06c",
+"label.network.acl": "\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL)",
+"label.network.acls": "\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL)",
+"label.network.addvm": "Add network to VM",
+"label.network.desc": "\ub124\ud2b8\uc6cc\ud06c \uc124\uba85",
+"label.network.details": "Network Details",
+"label.network.device": "\ub124\ud2b8\uc6cc\ud06c \uae30\uae30",
+"label.network.device.type": "\ub124\ud2b8\uc6cc\ud06c \uae30\uae30 \uc885\ub958",
+"label.network.domain": "\ub124\ud2b8\uc6cc\ud06c \ub3c4\uba54\uc778",
+"label.network.label.display.for.blank.value": "\uae30\ubcf8 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ac\uc6a9",
+"label.network.name": "\ub124\ud2b8\uc6cc\ud06c\uba85",
+"label.network.offering": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5",
+"label.network.offering.details": "Network offering details",
+"label.network.offering.display.text": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ud45c\uc2dc \ud14d\uc2a4\ud2b8",
+"label.network.offering.name": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uba85",
+"label.network.offerings": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5",
+"label.network.service.providers": "\ub124\ud2b8\uc6cc\ud06c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc790",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "\uc885\ub958",
+"label.networkdomain": "\ub124\ud2b8\uc6cc\ud06c \ub3c4\uba54\uc778",
+"label.networkdomaintext": "\ub124\ud2b8\uc6cc\ud06c \ub3c4\uba54\uc778",
+"label.networkid": "\ub124\ud2b8\uc6cc\ud06c",
+"label.networking.and.security": "\ub124\ud2b8\uc6cc\ud06c\uc640 \ubcf4\uc548",
+"label.networkkbsread": "\ub124\ud2b8\uc6cc\ud06c \uc77d\uae30",
+"label.networkkbswrite": "\ub124\ud2b8\uc6cc\ud06c \uae30\uc785",
+"label.networklimit": "Network limits",
+"label.networkname": "\ub124\ud2b8\uc6cc\ud06c\uba85",
+"label.networkofferingdisplaytext": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5",
+"label.networkofferingid": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5",
+"label.networkofferingidtext": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 ID",
+"label.networkofferingname": "\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5",
+"label.networkrate": "\ub124\ud2b8\uc6cc\ud06c \uc18d\ub3c4",
+"label.networkread": "\ub124\ud2b8\uc6cc\ud06c \uc77d\uae30",
+"label.networks": "\ub124\ud2b8\uc6cc\ud06c",
+"label.networktype": "\ub124\ud2b8\uc6cc\ud06c \uc885\ub958",
+"label.networkwrite": "\ub124\ud2b8\uc6cc\ud06c \uae30\uc785",
+"label.new": "\uc2e0\uaddc",
+"label.new.password": "\uc0c8\ub85c\uc6b4 \uc554\ud638",
+"label.new.project": "\uc0c8 \ud504\ub85c\uc81d\ud2b8",
+"label.new.vm": "\uc0c8 VM",
+"label.newdiskoffering": "\uc0c8\ub85c \uc81c\uacf5",
+"label.newsize": "New Size (GB)",
+"label.next": "\ub2e4\uc74c",
+"label.nexusvswitch": "Nexus 1000V",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.nfscachenfsserver": "NFS \uc11c\ubc84",
+"label.nfscachepath": "\uacbd\ub85c",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS \uc11c\ubc84",
+"label.nicadaptertype": "NIC \uc544\ub2f5\ud130 \uc885\ub958",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"label.nics": "NIC",
+"label.no": "\uc544\ub2c8\uc624",
+"label.no.actions": "\uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uc791\uc5c5 \uc5c6\uc74c",
+"label.no.alerts": "\ucd5c\uadfc \uc54c\ub9bc \uccb4\uacc4 \uc5c6\uc74c",
+"label.no.data": "\ud45c\uc2dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc74c",
+"label.no.errors": "\ucd5c\uadfc \uc624\ub958\ub294 \uc5c6\uc74c",
+"label.no.grouping": "(no grouping)",
+"label.no.isos": "\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 ISO \uc5c6\uc74c",
+"label.no.items": "\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud56d\ubaa9 \uc5c6\uc74c",
+"label.no.security.groups": "\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubcf4\uc548 \uadf8\ub8f9 \uc5c6\uc74c",
+"label.none": "\uc5c6\uc74c",
+"label.noselect": "\uc124\uc815 \uc548\ud568",
+"label.not.found": "\uac80\uc0c9 \uacb0\uacfc \uc5c6\uc74c",
+"label.notifications": "\uc54c\ub9bc",
+"label.num.cpu.cores": "CPU \ucf54\uc5b4\uc218",
+"label.number": "#Rule",
+"label.number.of.clusters": "\ud074\ub7ec\uc2a4\ud130\uc218",
+"label.number.of.hosts": "\ud638\uc2a4\ud2b8\uc218",
+"label.number.of.pods": "Pod\uc218",
+"label.number.of.system.vms": "\uc2dc\uc2a4\ud15c VM \uc218",
+"label.number.of.virtual.routers": "\uac00\uc0c1 \ub77c\uc6b0\ud130\uc218",
+"label.number.of.zones": "Zone\uc218",
+"label.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "\uc7ac\uc2dc\ud589 \ud68c\uc218",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "\uace0\uac00\uc6a9\uc131 \uc81c\uacf5",
+"label.ok": "\ud655\uc778",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight Controller",
+"label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
+"label.opendaylight.controllers": "OpenDaylight Controllers",
+"label.optional": "\uc635\uc158",
+"label.order": "\uc21c\uc11c",
+"label.oscategoryid": "OS \uae30\ubcf8 \uc124\uc815",
+"label.ostypeid": "OS \uc885\ub958",
+"label.ostypename": "OS \uc885\ub958",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "\uc18c\uc720 \uacf5\uac1c IP \uc8fc\uc18c",
+"label.owner.account": "\uc18c\uc720\uc790 \uacc4\uc815 \uc815\ubcf4",
+"label.owner.domain": "\uc18c\uc720\uc790 \ub3c4\uba54\uc778",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "\ubd80\ubaa8 \ub3c4\uba54\uc778",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "\uc554\ud638",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "\uc554\ud638 \uad00\ub9ac \uc0ac\uc6a9",
+"label.path": "\uacbd\ub85c",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "\uac00\uc0c1 \ub77c\uc6b0\ud130",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c",
+"label.physical.network.id": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c ID",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS \uc554\ud638",
+"label.ping.cifs.username": "PING CIFS \uc0ac\uc6a9\uc790\uba85",
+"label.ping.dir": "PING \ub514\ub809\ud1a0\ub9ac",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING \ub300\uc0c1 \uc2a4\ud1a0\ub9ac\uc9c0 IP \uc8fc\uc18c",
+"label.plannermode": "Planner mode",
+"label.please.complete.the.following.fields": "Please complete the following fields",
+"label.please.specify.netscaler.info": "Netscaler \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624",
+"label.please.wait": "\uae30\ub2e4\ub824 \uc8fc\uc2ed\uc2dc\uc624...",
+"label.plugin.details": "Plugin details",
+"label.plugins": "Plugins",
+"label.pod": "Pod",
+"label.pod.dedicated": "Pod Dedicated",
+"label.pod.name": "Pod\uba85",
+"label.podid": "Pod",
+"label.podname": "Pod\uba85",
+"label.pods": "Pod",
+"label.port": "Port",
+"label.port.forwarding.policies": "\ud3ec\ud1a0 \uc804\uc1a1 \uc815\ucc45",
+"label.port.range": "\ud3ec\ud1a0 \ubc94\uc704",
+"label.portable.ip": "Portable IP",
+"label.portable.ip.range.details": "Portable IP Range details",
+"label.portable.ip.ranges": "Portable IP Ranges",
+"label.portableipaddress": "Portable IPs",
+"label.portforwarding": "\ud3ec\ud1a0 \uc804\uc1a1",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "\ub4a4\ub85c",
+"label.previous": "\ub4a4\ub85c",
+"label.primary.network": "\uae30\ubcf8 \ub124\ud2b8\uc6cc\ud06c",
+"label.primary.storage": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.primary.storage.allocated": "\ud560\ub2f9 \uc644\ub8cc \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.primary.storage.count": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uadf8\ub8f9",
+"label.primary.storage.used": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ac\uc6a9\ub7c9",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.private.gateway": "\uc0ac\uc124 \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.private.interface": "\uc0ac\uc124 \uc778\ud130\ud398\uc774\uc2a4",
+"label.private.ip.range": "\uc0ac\uc124 IP \uc8fc\uc18c \ubc94\uc704",
+"label.private.ips": "\uc0ac\uc124 IP \uc8fc\uc18c",
+"label.private.zone": "\uc0ac\uc124 Zone",
+"label.privateinterface": "\uc0ac\uc124 \uc778\ud130\ud398\uc774\uc2a4",
+"label.privateip": "\uc0ac\uc124 IP \uc8fc\uc18c",
+"label.privatekey": "PKC#8 \ube44\ubc00 \ud0a4",
+"label.privatenetwork": "\uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c",
+"label.privateport": "\uc0ac\uc124 \ud3ec\ud2b8",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "\ud504\ub85c\uc81d\ud2b8",
+"label.project.dashboard": "\ud504\ub85c\uc81d\ud2b8 \ub300\uc2dc \ubcf4\ub4dc",
+"label.project.invite": "\ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd08\ub300",
+"label.project.name": "\ud504\ub85c\uc81d\ud2b8\uba85",
+"label.project.view": "\ud504\ub85c\uc81d\ud2b8 \ubcf4\uae30",
+"label.projectid": "\ud504\ub85c\uc81d\ud2b8 ID",
+"label.projects": "\ud504\ub85c\uc81d\ud2b8",
+"label.property": "Property",
+"label.protocol": "\ud504\ub85c\ud1a0\ucf5c",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "\uc81c\uacf5\uc790",
+"label.provisioningtype": "Provisioning Type",
+"label.public.interface": "\uacf5\uac1c \uc778\ud130\ud398\uc774\uc2a4",
+"label.public.ip": "\uacf5\uac1c IP \uc8fc\uc18c",
+"label.public.ip.addresses": "\uacf5\uac1c IP \uc8fc\uc18c",
+"label.public.ips": "\uacf5\uac1c IP \uc8fc\uc18c",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "\uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c",
+"label.public.traffic": "\uacf5\uac1c \ud2b8\ub798\ud53d",
+"label.public.zone": "\uacf5\uac1c Zone",
+"label.publicinterface": "\uacf5\uac1c \uc778\ud130\ud398\uc774\uc2a4",
+"label.publicip": "IP \uc8fc\uc18c",
+"label.publickey": "Public Key",
+"label.publicnetwork": "\uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c",
+"label.publicport": "\uacf5\uac1c \ud3ec\ud2b8",
+"label.purpose": "\ubaa9\uc801",
+"label.pxe.server.type": "PXE \uc11c\ubc84 \uc885\ub958",
+"label.qostype": "QoS Type",
+"label.quickview": "Quickview",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "\ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "\uc7ac\uc2dc\uc791",
+"label.receivedbytes": "\uc218\uc2e0 \ubc14\uc774\ud2b8",
+"label.recent.errors": "\ucd5c\uadfc \uc624\ub958",
+"label.recover.vm": "VM \ubcf5\uad6c",
+"label.redundantrouter": "\uc911\ubcf5 \ub77c\uc6b0\ud130",
+"label.redundantrouterstate": "\uc911\ubcf5 \uc0c1\ud0dc",
+"label.redundantstate": "\uc911\ubcf5 \uc0c1\ud0dc",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "\uc5c5\ub370\uc774\ud2b8",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.reinstall.vm": "VM \uc7ac\uc124\uce58",
+"label.related": "\uad00\ub828",
+"label.relationaloperator": "Operator",
+"label.release.account": "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": "\uc54c\ub9bc \ud45c\uc2dc",
+"label.remove.acl": "\uad8c\ud55c \uad00\ub9ac(ACL) \uc0ad\uc81c",
+"label.remove.egress.rule": "\uc804\uc1a1 \uaddc\uce59 \uc0ad\uc81c",
+"label.remove.from.load.balancer": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\uc5d0\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0ad\uc81c\ud558\ub294 \uc911",
+"label.remove.ingress.rule": "\uc218\uc2e0 \uaddc\uce59 \uc0ad\uc81c",
+"label.remove.ip.range": "IP \uc8fc\uc18c \ubc94\uc704 \uc0ad\uc81c",
+"label.remove.ldap": "Remove LDAP",
+"label.remove.network.offering": "Remove network offering",
+"label.remove.pf": "\ud3ec\ud1a0 \uc804\uc1a1 \uaddc\uce59 \uc0ad\uc81c",
+"label.remove.project.account": "\ud504\ub85c\uc81d\ud2b8 \uacc4\uc815 \uc815\ubcf4 \uc0ad\uc81c",
+"label.remove.region": "Remove Region",
+"label.remove.rule": "\uaddc\uce59 \uc0ad\uc81c",
+"label.remove.ssh.key.pair": "Remove SSH Key Pair",
+"label.remove.static.nat.rule": "\uc815\uc801 NAT \uaddc\uce59 \uc0ad\uc81c",
+"label.remove.static.route": "\uc815\uc801 \ub77c\uc6b0\ud2b8 \uc0ad\uc81c",
+"label.remove.this.physical.network": "Remove this physical network",
+"label.remove.tier": "\uacc4\uce35 \uc0ad\uc81c",
+"label.remove.vm.from.lb": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc5d0 VM \uc0ad\uc81c",
+"label.remove.vm.load.balancer": "Remove VM from load balancer",
+"label.remove.vmware.datacenter": "Remove VMware datacenter",
+"label.remove.vpc": "VPC \uc0ad\uc81c",
+"label.remove.vpc.offering": "Remove VPC offering",
+"label.removing": "\uc0ad\uc81c\ud558\ub294 \uc911",
+"label.removing.user": "\uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\ub294 \uc911",
+"label.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "\ud544\uc218 \uc0ac\ud56d",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.reserved.system.ip": "\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c",
+"label.reserved.system.netmask": "\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \ub137 \ub9c8\uc2a4\ud06c",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "\uc608\uc57d\ub41c \uc885\ub8cc \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c",
+"label.reservedsystemgateway": "\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.reservedsystemnetmask": "\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \ub137 \ub9c8\uc2a4\ud06c",
+"label.reservedsystemstartip": "\uc608\uc57d\ub41c \uc2dc\uc791 \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "VPN \uc811\uc18d \uc7ac\uc124\uc815",
+"label.resetvm": "Reset VM",
+"label.resource": "\uc790\uc6d0",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "\uc790\uc6d0 \uc81c\ud55c",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "\uc790\uc6d0",
+"label.resourcestate": "\uc790\uc6d0 \uc0c1\ud0dc",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "\ub124\ud2b8\uc6cc\ud06c \uc7ac\uc2dc\uc791",
+"label.restart.vpc": "VPC \uc7ac\uc2dc\uc791",
+"label.restartrequired": "\uc7ac\uc2dc\uc791 \ud544\uc694",
+"label.restore": "Restore",
+"label.retry.interval": "Retry Interval",
+"label.review": "\ud655\uc778",
+"label.revoke.project.invite": "\ucd08\ub300 \ucde8\uc18c",
+"label.role": "\uc5ed\ud560",
+"label.rolename": "\uc5ed\ud560",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "\ub8e8\ud2b8 \ub514\uc2a4\ud06c\uc81c\uacf5",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "\ub8e8\ud2b8 \ub514\uc2a4\ud06c \ucf58\ud2b8\ub864\ub7ec",
+"label.rootdiskcontrollertypekvm": "\ub8e8\ud2b8 \ub514\uc2a4\ud06c \ucf58\ud2b8\ub864\ub7ec",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "\uc885\ub958",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "\uaddc\uce59",
+"label.running": "\uc2e4\ud589\uc911 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": "\ube44\ubc00 \ud0a4",
+"label.s3.socket.timeout": "Socket Timeout",
+"label.s3.use.https": "Use HTTPS",
+"label.samlenable": "Authorize SAML SSO",
+"label.samlentity": "Identity Provider",
+"label.saturday": "\ud1a0\uc694\uc77c",
+"label.save": "\uc800\uc7a5",
+"label.save.and.continue": "\uc800\uc7a5\ud558\uae30",
+"label.save.changes": "Save changes",
+"label.saving.processing": "\uc800\uc7a5\ud558\ub294 \uc911...",
+"label.scale.up.policy": "SCALE UP POLICY",
+"label.scaledown.policy": "ScaleDown Policy",
+"label.scaleup.policy": "ScaleUp Policy",
+"label.scope": "\ubc94\uc704",
+"label.search": "\uac80\uc0c9",
+"label.secondary.staging.store": "Secondary Staging Store",
+"label.secondary.staging.store.details": "Secondary Staging Store details",
+"label.secondary.storage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.secondary.storage.count": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uadf8\ub8f9",
+"label.secondary.storage.details": "Secondary storage details",
+"label.secondary.storage.vm": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM",
+"label.secondary.used": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ac\uc6a9\ub7c9",
+"label.secondaryips": "Secondary IPs",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "\ube44\ubc00 \ud0a4",
+"label.security.group.name": "\ubcf4\uc548 \uadf8\ub8f9\uba85",
+"label.security.groups": "\ubcf4\uc548 \uadf8\ub8f9",
+"label.security.groups.enabled": "\ubcf4\uc548 \uadf8\ub8f9 \uc720\ud6a8",
+"label.securitygroup": "\ubcf4\uc548 \uadf8\ub8f9",
+"label.securitygroups": "\ubcf4\uc548 \uadf8\ub8f9",
+"label.select": "\uc120\ud0dd",
+"label.select-view": "\ud45c\uc2dc \ubc29\ubc95 \uc120\ud0dd",
+"label.select.a.zone": "Zone \uc120\ud0dd",
+"label.select.instance": "\uc778\uc2a4\ud134\uc2a4 \uc120\ud0dd",
+"label.select.instance.to.attach.volume.to": "\ubcfc\ub968\uc744 \uc5f0\uacb0\ud558\ub294 \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624",
+"label.select.iso.or.template": "ISO \ub610\ub294 \ud15c\ud50c\ub9bf \uc120\ud0dd",
+"label.select.offering": "\uc81c\uacf5 \uc120\ud0dd",
+"label.select.project": "\ud504\ub85c\uc81d\ud2b8 \uc120\ud0dd",
+"label.select.region": "Select region",
+"label.select.tier": "\uacc4\uce35 \uc120\ud0dd",
+"label.select.vm.for.static.nat": "\uc815\uc801 NAT\uc6a9 VM \uc120\ud0dd",
+"label.self": "\ub0b4 \uc815\ubcf4\ub9cc",
+"label.sent": "\uc804\uc1a1\ub41c \uc0c1\ud0dc",
+"label.sentbytes": "\uc804\uc1a1 \ubc14\uc774\ud2b8",
+"label.server": "\uc11c\ubc84",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "\ud0c4\ub825\uc801 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720",
+"label.service.lb.inlinemodedropdown": "\ubaa8\ub4dc",
+"label.service.lb.lbisolationdropdown": "\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \ubd84\ub9ac",
+"label.service.offering": "\uc11c\ube44\uc2a4\uc81c\uacf5",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "\uc911\ubcf5 \ub77c\uc6b0\ud130 \uae30\ub2a5",
+"label.service.state": "\uc11c\ube44\uc2a4",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "\ud0c4\ub825\uc801 IP \uc8fc\uc18c",
+"label.servicecapabilities": "\uc11c\ube44\uc2a4 \uae30\ub2a5",
+"label.servicelist": "Services",
+"label.serviceofferingid": "\ucef4\ud4e8\ud305 \uc790\uc6d0 \uc81c\uacf5",
+"label.serviceofferingname": "\ucef4\ud4e8\ud305 \uc790\uc6d0 \uc81c\uacf5",
+"label.session.expired": "\uc138\uc158 \uc720\ud6a8\uae30\uac04\uc774 \ub04a\uc5b4\uc9d0",
+"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 \uc885\ub958 \uc124\uc815",
+"label.settings": "Settings",
+"label.setup": "\uc124\uc815",
+"label.setup.network": "Set up Network",
+"label.setup.zone": "Set up Zone",
+"label.shared": "\uacf5\uc720",
+"label.sharedexecutable": "\uacf5\uc720",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "\uc218\uc2e0 \uaddc\uce59 \ud45c\uc2dc",
+"label.shrinkok": "\ubcc0\uacbd \uc644\ub8cc",
+"label.shutdown.provider": "\uc81c\uacf5\uc790 \uc885\ub8cc",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.site.to.site.vpn": "\uc0ac\uc774\ud2b8\uac04 \uc0ac\uc124\ub124\ud2b8\uc6cc\ud06c(VPN)",
+"label.size": "\ud06c\uae30",
+"label.sizegb": "\ud06c\uae30",
+"label.skip.guide": "CloudStack \uc0ac\uc6a9 \uac00\uc774\ub4dc \uac74\ub108\ub6f0\uae30",
+"label.smb.domain": "SMB Domain",
+"label.smb.password": "SMB Password",
+"label.smb.username": "SMB Username",
+"label.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "\uc2a4\ub0c5\uc0f7",
+"label.snapshot.name": "\uc2a4\ub0c5\uc0f7 \uc774\ub984",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "\uc2a4\ub0c5\uc0f7 \uc81c\ud55c",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "\uc2a4\ub0c5\uc0f7",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Socket Timeout",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "\uc804\uc1a1\uc6d0 CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "\uc804\uc1a1\uc6d0 NAT",
+"label.sourcenattype": "\uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \uc804\uc1a1 NAT \uc885\ub958",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "VXLAN \uc9c0\uc815",
+"label.specifyipranges": "IP \uc8fc\uc18c \ubc94\uc704 \uc9c0\uc815",
+"label.specifyvlan": "VLAN \uc9c0\uc815",
+"label.sr.name": "SR \uba85 \ub77c\ubca8",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "\uc2dc\uc791 IP \uc8fc\uc18c",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "\uc608\uc57d\ub41c \uc2dc\uc791 \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "\ub0a0\uc9dc(\uc2dc\uc791\uc77c)",
+"label.startip": "\uc2dc\uc791 IP \uc8fc\uc18c",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "\uc2dc\uc791 \ud3ec\ud1a0",
+"label.startquota": "Quota Value",
+"label.state": "\uc0c1\ud0dc",
+"label.static.nat.enabled": "\uc815\uc801 NAT \uc720\ud6a8",
+"label.static.nat.to": "\uc815\uc801 NAT \uc124\uc815 \uc704\uce58:",
+"label.static.nat.vm.details": "\uc815\uc801 NAT VM \uc0c1\uc138 \uc815\ubcf4",
+"label.static.routes": "Static Routes",
+"label.statistics": "\ud1b5\uacc4",
+"label.status": "\uc0c1\ud0dc",
+"label.step.1": "\ub2e8\uacc4 1",
+"label.step.1.title": "\ub2e8\uacc4 1. <strong>\ud15c\ud50c\ub9bf \uc120\ud0dd</strong>",
+"label.step.2": "\ub2e8\uacc4 2",
+"label.step.2.title": "\ub2e8\uacc4 2. <strong>\uc11c\ube44\uc2a4 \uc81c\uacf5</strong>",
+"label.step.3": "\ub2e8\uacc4 3",
+"label.step.3.title": "\ub2e8\uacc4 3. <strong id=\"step3_label\">\ub514\uc2a4\ud06c \uc81c\uacf5 \uc120\ud0dd</strong>",
+"label.step.4": "\ub2e8\uacc4 4",
+"label.step.4.title": "\ub2e8\uacc4 4. <strong>\ub124\ud2b8\uc6cc\ud06c</strong>",
+"label.step.5": "\ub2e8\uacc4 5",
+"label.step.5.title": "\ub2e8\uacc4 5. <strong>\ucd5c\uc885 \ud655\uc778</strong>",
+"label.stickiness.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie \uba85",
+"label.sticky.expire": "\ub9cc\ub8cc\uc2dc\uac04",
+"label.sticky.holdtime": "\ubcf4\uad00 \uc720\uc9c0 \uc2dc\uac04",
+"label.sticky.indirect": "\uac04\uc811",
+"label.sticky.length": "\uae38\uc774",
+"label.sticky.name": "Sticky Name",
+"label.sticky.nocache": "\uce90\uc2dc \uc5c6\uc74c",
+"label.sticky.postonly": "\ud3ec\uc2a4\ud2b8\ub9cc",
+"label.sticky.prefix": "\ud504\ub808\ud53d\uc2a4",
+"label.sticky.request-learn": "\ub7ec\ub2dd \uc694\uad6c",
+"label.sticky.tablesize": "\ud14c\uc774\ube14 \ud06c\uae30",
+"label.stop": "\uc815\uc9c0",
+"label.stop.lb.vm": "Stop LB VM",
+"label.stopped": "\uc815\uc9c0 \uc911 VM",
+"label.storage": "\uc2a4\ud1a0\ub9ac\uc9c0",
+"label.storage.tags": "\uc2a4\ud1a0\ub9ac\uc9c0 \ud0dc\uadf8",
+"label.storage.traffic": "\uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d",
+"label.storageid": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "\uc2a4\ud1a0\ub9ac\uc9c0 \ud0dc\uadf8",
+"label.storagetype": "\uc2a4\ud1a0\ub9ac\uc9c0 \uc885\ub958",
+"label.subdomainaccess": "\uc11c\ube0c \ub3c4\uba54\uc778 \uc811\uadfc",
+"label.submit": "\ubcf4\ub0b4\uae30",
+"label.submitted.by": "[\uc0ac\uc6a9\uc790: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "\uc644\ub8cc",
+"label.sunday": "\uc77c\uc694\uc77c",
+"label.supportedservices": "\uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \uc11c\ube44\uc2a4",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"label.suspend.project": "\ud504\ub85c\uc81d\ud2b8 \uc77c\uc2dc\uc815\uc9c0",
+"label.switch.type": "\ud615\uc2dd",
+"label.system.capacity": "\uc2dc\uc2a4\ud15c \ucc98\ub9ac \ub2a5\ub825",
+"label.system.offering": "\uc2dc\uc2a4\ud15c \uc81c\uacf5",
+"label.system.offering.for.router": "System Offering for Router",
+"label.system.offerings": "\uc2dc\uc2a4\ud15c \uc81c\uacf5",
+"label.system.service.offering": "\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5",
+"label.system.service.offering.details": "System service offering details",
+"label.system.vm": "\uc2dc\uc2a4\ud15c VM",
+"label.system.vm.details": "System VM details",
+"label.system.vm.scaled.up": "System VM Scaled Up",
+"label.system.vms": "\uc2dc\uc2a4\ud15c VM",
+"label.system.wide.capacity": "\uc2dc\uc2a4\ud15c \uc804\uccb4 \ucc98\ub9ac \ub2a5\ub825",
+"label.systemvmtype": "\uc2dc\uc2a4\ud15c VM \uc885\ub958",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "\ud0dc\uadf8",
+"label.tags": "\ud0dc\uadf8",
+"label.target.iqn": "\ud0c0\uac9f IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "\uc791\uc5c5 \uc644\ub8cc",
+"label.template": "\ud15c\ud50c\ub9bf",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "\ud15c\ud50c\ub9bf \uc81c\ud55c",
+"label.templatename": "\ud15c\ud50c\ub9bf",
+"label.templatenames": "\ud15c\ud50c\ub9bf",
+"label.templates": "\ud15c\ud50c\ub9bf",
+"label.templatesubject": "Subject",
+"label.templatetotal": "\ud15c\ud50c\ub9bf",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP \ub514\ub809\ud1a0\ub9ac",
+"label.tftpdir": "Tftp root directory",
+"label.theme.default": "\uae30\ubcf8 \ud14c\ub9c8",
+"label.theme.grey": "\ub9de\ucda4- \ud68c\uc0c9\uc870",
+"label.theme.lightblue": "\ub9de\ucda4 - \ub77c\uc774\ud2b8 \ube14\ub8e8",
+"label.threshold": "Threshold",
+"label.thursday": "\ubaa9\uc694\uc77c",
+"label.tier.details": "\uacc4\uce35 \uc0c1\uc138 \uc7a5\ubc84",
+"label.tiername": "\uacc4\uce35",
+"label.time": "\uc2dc\uac01",
+"label.time.colon": "Time:",
+"label.timeout": "\uc2dc\uac04 \ucd08\uacfc",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "\uc2dc\uac04\ub300",
+"label.timezone.colon": "Timezone:",
+"label.token": "\ud1a0\ud070",
+"label.total.hosts": "\ud638\uc2a4\ud2b8 \ud569\uacc4",
+"label.total.memory": "\uba54\ubaa8\ub9ac \ud569\uacc4",
+"label.total.storage": "\uc2a4\ud1a0\ub9ac\uc9c0 \ud569\uacc4",
+"label.total.vms": "VM \ud569\uacc4",
+"label.totalcpu": "CPU \ud569\uacc4",
+"label.traffic.label": "\ud2b8\ub798\ud53d \ub77c\ubca8",
+"label.traffic.types": "\ud2b8\ub798\ud53d \uc885\ub958",
+"label.traffictype": "\ud2b8\ub798\ud53d \uc885\ub958",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "\ud654\uc694\uc77c",
+"label.type": "\uc885\ub958",
+"label.type.id": "\uc885\ub958 ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "\uc0ac\uc6a9 \ubd88\uac00",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"label.unlimited": "\ubb34\uc81c\ud55c",
+"label.untagged": "\ud0dc\uadf8 \uc5c6\uc74c",
+"label.update.project.resources": "\ud504\ub85c\uc81d\ud2b8 \uc790\uc6d0 \uc5c5\ub370\uc774\ud2b8",
+"label.update.ssl": " SSL \uc778\uc99d\uc11c \uc5c5\ub370\uc774\ud2b8",
+"label.update.ssl.cert": " SSL \uc778\uc99d\uc11c \uc5c5\ub370\uc774\ud2b8",
+"label.updating": "\uc5c5\ub370\uc774\ud2b8\ud558\uace0 \uc788\ub294 \uc911",
+"label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
+"label.upload": "\uc5c5\ub85c\ub4dc",
+"label.upload.from.local": "Upload from Local",
+"label.upload.template.from.local": "Upload Template from Local",
+"label.upload.volume": "\ubcfc\ub968\uc758 \uc5c5\ub85c\ub4dc",
+"label.upload.volume.from.local": "Upload Volume from Local",
+"label.upload.volume.from.url": "Upload volume from URL",
+"label.url": "URL",
+"label.usage.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "\uc0ac\uc6a9 \uc0c1\ud669 \uce21\uc815 \uc778\ud130\ud398\uc774\uc2a4",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Use VM IPs",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "\uc0ac\uc6a9\uc790",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "\uc0ac\uc6a9\uc790\uba85",
+"label.users": "\uc0ac\uc6a9\uc790",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "\uac12",
+"label.vcdcname": "vCenter DC \uba85",
+"label.vcenter": "vcenter",
+"label.vcenter.cluster": "vCenter \ud074\ub7ec\uc2a4\ud130",
+"label.vcenter.datacenter": "vCenter \ub370\uc774\ud130 \uc13c\ud130",
+"label.vcenter.datastore": "vCenter \ub370\uc774\ud130 \uc2a4\ud1a0\uc5b4",
+"label.vcenter.host": "vCenter \ud638\uc2a4\ud2b8",
+"label.vcenter.password": "vCenter \uc554\ud638",
+"label.vcenter.username": "vCenter \uc0ac\uc6a9\uc790\uba85",
+"label.vcenterdatacenter": "vCenter \ub370\uc774\ud130 \uc13c\ud130",
+"label.vcenterdatastore": "vCenter \ub370\uc774\ud130 \uc2a4\ud1a0\uc5b4",
+"label.esx.host": "ESX/ESXi \ud638\uc2a4\ud2b8",
+"label.vcenterpassword": "vCenter \uc554\ud638",
+"label.vcenterusername": "vCenter \uc0ac\uc6a9\uc790\uba85",
+"label.vcipaddress": "vCenter IP \uc8fc\uc18c",
+"label.vcsdeviceid": "ID",
+"label.version": "\ubc84\uc804",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"label.view": "\ud45c\uc2dc -",
+"label.view.all": "\ubaa8\ub450 \ud45c\uc2dc",
+"label.view.console": "\ucf58\uc194 \ud45c\uc2dc",
+"label.view.more": "\uc0c1\uc138 \ud45c\uc2dc",
+"label.view.secondary.ips": "View secondary IPs",
+"label.viewing": "\ud45c\uc2dc \ud56d\ubaa9:",
+"label.virtual.appliance": "\uac00\uc0c1 \uc5b4\ud50c\ub77c\uc774\uc5b8\uc2a4",
+"label.virtual.appliance.details": "Virtual applicance details",
+"label.virtual.appliances": "\uac00\uc0c1 \uc5b4\ud50c\ub77c\uc774\uc5b8\uc2a4",
+"label.virtual.machine": "Virtual Machine",
+"label.virtual.machines": "Virtual Machines",
+"label.virtual.network": "\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c",
+"label.virtual.networking": "Virtual Networking",
+"label.virtual.routers": "\uac00\uc0c1 \ub77c\uc6b0\ud130",
+"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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c(VLAN)",
+"label.vlan.range": "VLAN \ubc94\uc704",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN ID",
+"label.vlanname": "\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c(VLAN)",
+"label.vlanrange": "VLAN \ubc94\uc704",
+"label.vm.add": "\uc778\uc2a4\ud134\uc2a4 \ucd94\uac00",
+"label.vm.destroy": "\ud30c\uae30",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "\uc7ac\uc2dc\uc791",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "\uc2dc\uc791",
+"label.vm.stop": "\uc815\uc9c0",
+"label.vmdisplayname": "VM \ud45c\uc2dc\uba85",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS \ub370\uc774\ud130 \uc2a4\ud1a0\uc5b4",
+"label.vmipaddress": "VM IP Address",
+"label.vmlimit": "\uc778\uc2a4\ud134\uc2a4 \uc81c\ud55c",
+"label.vmname": "VM Name",
+"label.vms": "VM",
+"label.vms.in.tier": "\uacc4\uce35 \ub0b4\ubd80 \uac00\uc0c1\uba38\uc2e0",
+"label.vmstate": "VM \uc0c1\ud0dc",
+"label.vmtotal": "VM \ud569\uacc4",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware \ud2b8\ub798\ud53d \ub77c\ubca8",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "\ubcfc\ub968 \uadf8\ub8f9",
+"label.volume": "\ubcfc\ub968",
+"label.volume.details": "Volume details",
+"label.volume.migrated": "Volume migrated",
+"label.volumechecksum": "MD5 \uccb4\ud06c\uc12c",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "\ubcfc\ub968 \uadf8\ub8f9",
+"label.volumelimit": "\ubcfc\ub968 \uc81c\ud55c",
+"label.volumename": "\ubcfc\ub968\uba85",
+"label.volumes": "\ubcfc\ub968",
+"label.volumetotal": "\ubcfc\ub968",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpn": "\uac00\uc0c1 \uc0ac\uc124\ub9dd(VPN)",
+"label.vpn.connection": "VPN \uc811\uc18d",
+"label.vpn.gateway": "VPN \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.vpncustomergatewayid": "VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774",
+"label.vsmctrlvlanid": "\uc81c\uc5b4 VLAN ID",
+"label.vsmdeviceid": "\uc774\ub984",
+"label.vsmdevicestate": "\uc0c1\ud0dc",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "\ud328\ud0b7 VLAN ID",
+"label.vsmstoragevlanid": "\uc2a4\ud1a0\ub9ac\uc9c0 VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere \uad00\ub9ac",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN \ubc94\uc704",
+"label.waiting": "\ub300\uae30\ud558\ub294 \uc911",
+"label.warn": "\uacbd\uace0",
+"label.warn.upper": "WARN",
+"label.warning": "Warning",
+"label.wednesday": "\uc218\uc694\uc77c",
+"label.weekly": "\ub9e4\uc8fc",
+"label.welcome": "\uc5b4\uc11c \uc624\uc2ed\uc2dc\uc624",
+"label.welcome.cloud.console": "\uad00\ub9ac \ucf58\uc194\uc5d0 \uc624\uc2e0\uac83\uc744 \ud658\uc601\ud569\ub2c8\ub2e4!",
+"label.what.is.cloudstack": "CloudStack\u2122 \uc815\ubcf4",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer \ud2b8\ub798\ud53d \ub77c\ubca8",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "\uc608",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "Zone \uc0c1\uc138",
+"label.zone.id": "Zone ID",
+"label.zone.step.1.title": "\ub2e8\uacc4 1. <strong>\ub124\ud2b8\uc6cc\ud06c \uc120\ud0dd</strong>",
+"label.zone.step.2.title": "\ub2e8\uacc4 2. <strong>Zone \ucd94\uac00</strong>",
+"label.zone.step.3.title": "\ub2e8\uacc4 3. <strong>Pod \ucd94\uac00</strong>",
+"label.zone.step.4.title": "\ub2e8\uacc4 4. <strong>IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00</strong>",
+"label.zone.type": "Zone \uc885\ub958",
+"label.zone.wide": "Zone \uc804\uccb4",
+"label.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "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",
+"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": "\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\uac00 \uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.acquire.new.ip.vpc": "Please confirm that you would like to acquire a new IP for this VPC.",
+"message.acquire.public.ip": "\uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\ub294 Zone\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.action.cancel.maintenance": "\ud638\uc2a4\ud2b8 \uc720\uc9c0 \ubcf4\uc218\ub294 \uc815\uc0c1\uc801\uc73c\ub85c \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucc98\ub9ac\uc5d0\ub294 \uba87 \ubd84 \uc815\ub3c4 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.action.cancel.maintenance.mode": "\ud604\uc7ac \uc720\uc9c0 \ubcf4\uc218\ub97c \ucde8\uc18c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.change.service.warning.for.instance": "\ud604\uc7ac \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.action.change.service.warning.for.router": "\ud604\uc7ac \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.action.delete.cluster": "\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.disk.offering": "\ud604\uc7ac \ub514\uc2a4\ud06c\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.domain": "\ud604\uc7ac \ub3c4\uba54\uc778\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.external.firewall": "\ud604\uc7ac \uc678\ubd80 \ubc29\ud654\ubcbd(fire wall)\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uacbd\uace0: \uac19\uc740 \uc678\ubd80 \ubc29\ud654\ubcbd(fire wall)\ub97c \ub2e4\uc2dc \ucd94\uac00\ud560 \uacbd\uc6b0\ub294 \uae30\uae30 \uc0ac\uc6a9 \uc0c1\ud669 \ub370\uc774\ud130\ub97c \uc7ac\uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.action.delete.external.load.balancer": "\ud604\uc7ac \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uacbd\uace0: \uac19\uc740 \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \ub2e4\uc2dc \ucd94\uac00\ud560 \uacbd\uc6b0\ub294 \uae30\uae30 \uc0ac\uc6a9 \uc0c1\ud669 \ub370\uc774\ud130\ub97c \uc7ac\uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.action.delete.ingress.rule": "\ud604\uc7ac \uc218\uc2e0 \uaddc\uce59\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.iso": "\ud604\uc7ac ISO\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.iso.for.all.zones": "\uc774 ISO\ub294 \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.network": "\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.nexusvswitch": "\ud604\uc7ac Nexus 1000V\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.physical.network": "\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.pod": "\ud604\uc7ac Pod\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.primary.storage": "\ud604\uc7ac \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.secondary.storage": "\ud604\uc7ac 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.security.group": "\ud604\uc7ac \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.service.offering": "\ud604\uc7ac \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.snapshot": "\ud604\uc7ac \uc2a4\ub0c5\uc0f7\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.system.service.offering": "\ud604\uc7ac \uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.template": "\ud604\uc7ac \ud15c\ud50c\ub9bf\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.template.for.all.zones": "\uadf8 \ud15c\ud50c\ub9bf\uc740 \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ac\uc6a9\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.volume": "\ud604\uc7ac \ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.delete.zone": "\ud604\uc7ac Zone\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.destroy.instance": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.destroy.systemvm": "\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.destroy.volume": "Please confirm that you want to destroy this volume.",
+"message.action.disable.cluster": "\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.disable.nexusvswitch": "\ud604\uc7ac Nexus 1000V\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.disable.physical.network": "\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.disable.pod": "\ud604\uc7ac Pod\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.disable.static.nat": "\uc815\uc801 NAT\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.disable.zone": "\ud604\uc7ac Zone\uc744 \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.download.iso": "\ud604\uc7ac ISO\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.download.template": "\ud604\uc7ac \ud15c\ud50c\ub9bf\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.downloading.template": "Downloading template.",
+"message.action.enable.cluster": "\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.enable.maintenance": "\ud638\uc2a4\ud2b8\ub97c \uc720\uc9c0 \ubcf4\uc218\ud560 \uc900\ube44\ub97c \ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \ud638\uc2a4\ud2b8\uc0c1 VM \uc218\uc5d0 \ub530\ub77c\uc11c \ucc98\ub9ac\uc5d0 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.action.enable.nexusvswitch": "\ud604\uc7ac Nexus 1000V\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.enable.physical.network": "\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.enable.pod": "\ud604\uc7ac Pod\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.enable.zone": "\ud604\uc7ac Zone\uc744 \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
+"message.action.force.reconnect": "\ud638\uc2a4\ud2b8\ub294 \uac15\uc81c\uc801\uc73c\ub85c \uc7ac\uc811\uc18d\ud588\uc2b5\ub2c8\ub2e4. \uc774 \ucc98\ub9ac\uc5d0\ub294 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4",
+"message.action.host.enable.maintenance.mode": "\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9 \ud558\uba74, \uc774 \ud638\uc2a4\ud2b8\ub85c \uc2e4\ud589 \uc911\uc778 \ubaa8\ub4e0 \uc778\uc2a4\ud134\uc2a4\ub97c \ub2e4\ub978 \uc0ac\uc6a9\uac00\ub2a5 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc2e4\uc2dc\uac04 \uc774\uc804\ub429\ub2c8\ub2e4.",
+"message.action.instance.reset.password": "\ud604\uc7ac \uac00\uc0c1 \uba38\uc2e0 \ub8e8\ud2b8 \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.manage.cluster": "\ud074\ub7ec\uc2a4\ud130\ub97c \uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.primarystorage.enable.maintenance.mode": "\uacbd\uace0: \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub85c \ud558\uba74  \uadf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc0c1 \ubcfc\ub968\uc744 \uc0ac\uc6a9\ud558\ub294 \ubaa8\ub4e0 VM\uac00 \uc815\uc9c0\ud569\ub2c8\ub2e4. \uc2e4\ud589\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.reboot.instance": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.reboot.router": "\ud604\uc7ac \uac00\uc0c1 \ub77c\uc6b0\ud130\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub77c\uc6b0\ud130\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.reboot.systemvm": "\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.recover.volume": "Please confirm that you would like to recover this volume.",
+"message.action.release.ip": "\ud604\uc7ac IP \uc8fc\uc18c\ub97c \ud574\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.remove.host": "\ud604\uc7ac \ud638\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.reset.password.off": "\uc778\uc2a4\ud134\uc2a4\ub294 \ud604\uc7ac \uae30\ub2a5\uc744 \uc9c0\uc6d0 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.",
+"message.action.reset.password.warning": "\ud604\uc7ac \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.action.restore.instance": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \ubcf5\uc6d0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.revert.snapshot": "Please confirm that you want to revert the owning volume to this snapshot.",
+"message.action.start.instance": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.start.router": "\ud604\uc7ac \ub77c\uc6b0\ud130\ub97c \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.start.systemvm": "\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.stop.instance": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.stop.router": "\ud604\uc7ac \uac00\uc0c1 \ub77c\uc6b0\ud130\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.stop.systemvm": "\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.action.unmanage.cluster": "\ud074\ub7ec\uc2a4\ud130\ub97c \ube44\uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \ud65c\uc131\ud654 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.add.cluster": "Zone <b><span id=\"zone_name\"></span></b> Pod <b><span id=\"pod_name\"></span></b>\uc5d0 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c \uad00\ub9ac\ub418\ub294 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.cluster.zone": "Zone <b><span id=\"zone_name\"></span></b>\uc5d0 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c \uad00\ub9ac\ub418\ub294 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.disk.offering": "\uc0c8\ub85c\uc6b4 \ub514\uc2a4\ud06c \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \ub2e4\uc74c \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.domain": "\ud604\uc7ac \ub3c4\uba54\uc778\uc5d0 \ub9cc\ub4e4\uace0\uc790 \ud558\ub294 \uc11c\ube0c \ub3c4\uba54\uc778\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.firewall": "Zone\uc5d0 \ubc29\ud654\ubcbd(fire wall)\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.guest.network": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.add.host": "\uc0c8\ub85c\uc6b4 \ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.ip.range": "Zone \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c\uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.ip.range.direct.network": "Zone <b><span id=\"zone_name\"></span></b> \uc9c1\uc811 \ub124\ud2b8\uc6cc\ud06c <b><span id=\"directnetwork_name\"></span></b>\uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4",
+"message.add.ip.range.to.pod": "<p>Pod <b><span id=\"pod_name_label\"></span></b>\uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.</p>",
+"message.add.load.balancer": "Zone\uc5d0 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.load.balancer.under.ip": "\ub2e4\uc74c IP \uc8fc\uc18c\uc5d0 \ub300\ud574\uc11c \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc744  \ucd94\uac00\ud569\ub2c8\ub2e4:",
+"message.add.network": "Zone <b><span id=\"zone_name\"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.new.gateway.to.vpc": "\ud604\uc7ac VPC\uc5d0 \uc0c8\ub85c\uc6b4 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud55c \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.pod": "Zone <b><span id=\"add_pod_zone_name\"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"message.add.pod.during.zone.creation": "\uac01 Zone\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 Pod\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ud569\ub2c8\ub2e4\ub9cc  \uc774\ub294 \ub2e4\uc74c \uc21c\uc11c\ub85c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub9e8 \ucc98\uc74c CloudStack \ub0b4\ubd80 \uad00\ub9ac \ud2b8\ub798\ud53d\uc744 \uc704\ud574\uc11c IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc608\uc57d\ud569\ub2c8\ub2e4. IP \uc8fc\uc18c \ubc94\uc704\ub294 \ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 \uac01 Zone\uc5d0\uc11c \uc911\ubcf5 \ud558\uc9c0 \uc54a\uac8c \uc608\uc57d\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.add.primary": "\uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.primary.storage": "Zone <b><span id=\"zone_name\"></span></b> Pod <b><span id=\"pod_name\"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.",
+"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>\uc5d0 \uc0c8\ub85c\uc6b4 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4",
+"message.add.service.offering": "\uc0c8\ub85c\uc6b4 \ucef4\ud4e8\ud305 \uc790\uc6d0 \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574\uc11c, \ub2e4\uc74c \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.system.service.offering": "\uc0c8\ub85c\uc6b4 \uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \ub2e4\uc74c \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.template": "\uc0c8\ub85c\uc6b4 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.volume": "\uc0c8\ub85c\uc6b4 \ubcfc\ub968\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.add.vpn.gateway": "VPN \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "\ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4",
+"message.adding.netscaler.device": "Netscaler \uae30\uae30\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4",
+"message.adding.netscaler.provider": "Netscaler \uc81c\uacf5\uc790\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.additional.networks.desc": "\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uac00 \uc811\uc18d\ud558\ub294 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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 \uae30\uc220 \uc9c0\uc6d0\ub97c \uc0ac\uc6a9 \ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ubaa8\ub378\uc5d0\uc11c\ub294 \uac00\uc7a5 \uc720\uc5f0\ud558\uac8c \uce74\uc2a4\ud0d0\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc5b4 \ubc29\ud654\ubcbd(fire wall), VPN, \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \uae30\uc220 \uc9c0\uc6d0 \uc678\uc5d0, \uc9c1\uc811 \ub124\ud2b8\uc6cc\ud06c\uc640 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c\ub3c4 \uc0ac\uc6a9 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.advanced.security.group": "\uac8c\uc2a4\ud2b8 VM\ub97c \ubd84\ub9ac\ud558\uae30 \uc704\ud574\uc11c \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.advanced.virtual": "\uac8c\uc2a4\ud2b8 VM\ub97c \ubd84\ub9ac\ud558\uae30 \uc704\ud574\uc11c \uc874 \uc804\uccb4 VLAN\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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\uac00 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc8fc\uc758:\uc774 \ud398\uc774\uc9c0\ub97c \ub2eb\uc73c\uba74 Swift\ub97c \uc7ac\uad6c\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"message.alert.state.detected": "\uacbd\uacc4\uccb4\uc81c \uc0c1\ud0dc\uac00 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
+"message.allow.vpn.access": "VPN \uc811\uadfc\ub97c \ud5c8\uac00\ud558\ub294 \uc0ac\uc6a9\uc790 \uc0ac\uc6a9\uc790\uba85\uacfc \uc554\ud638\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.apply.snapshot.policy": "\ud604\uc7ac \uc2a4\ub0c5\uc0f7 \uc815\ucc45\ub97c \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4.",
+"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": "\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0 ISO \ud30c\uc77c\uc744 \uc5f0\uacb0 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.attach.volume": "\uc0c8\ub85c\uc6b4 \ubcfc\ub968\uc744 \uc5f0\uacb0 \ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.Windows \ubca0\uc774\uc2a4 \uac00\uc0c1 \uba38\uc2e0\uc5d0 \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \uc5f0\uacb0 \ud558\ub294 \uacbd\uc6b0\ub294 \uc5f0\uacb0 \ud55c \ub514\uc2a4\ud06c\ub97c \uc778\uc2dd\ud558\uae30 \uc704\ud574\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.basic.mode.desc": "VLAN \uae30\uc220 \uc9c0\uc6d0\uac00<b><u>\ubd88\ud544\uc694\ud55c</u></b>\uacbd\uc6b0\ub294 \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\ub85c \ub9cc\ub4e4\uae30\ub418\ub294 \ubaa8\ub4e0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc9c1\uc811 IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \uc218 \uc788\uc5b4 \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ac\uc6a9\ud574 \ubcf4\uc548\uc640 \ubd84\ub9ac\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4.",
+"message.change.offering.confirm": "\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.change.password": "\uc554\ud638\ub97c \ubcc0\uacbd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.cluster.dedicated": "Cluster Dedicated",
+"message.cluster.dedication.released": "Cluster dedication released",
+"message.configure.all.traffic.types": "\ubcf5\uc218\uc758 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uac00 \uc788\uc2b5\ub2c8\ub2e4. [\ud3b8\uc9d1]\uc744 \ud074\ub9ad\ud574 \ud2b8\ub798\ud53d\uc758 \uc885\ub958 \ub9c8\ub2e4 \ub77c\ubca8\uc744 \uad6c\uc131\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4",
+"message.configuring.physical.networks": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4",
+"message.configuring.public.traffic": "\uacf5\uac1c \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4",
+"message.configuring.storage.traffic": "\uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4",
+"message.confirm.action.force.reconnect": "\ud604\uc7ac \ud638\uc2a4\ud2b8\ub97c \uac15\uc81c \uc7ac\uc811\uc18d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "F5\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"message.confirm.delete.netscaler": "NetScaler\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.confirm.delete.pa": "Please confirm that you would like to delete Palo Alto",
+"message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "SRX\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
+"message.confirm.destroy.router": "\ud604\uc7ac \ub77c\uc6b0\ud130\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "\ud604\uc7ac IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc885\ub8cc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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\ub97c \ub2e4\uc74c \uc7a5\uc18c\uc5d0 \ubcf5\uc0ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.copy.template": "\uc874 <b id=\"copy_template_source_zone_text\"></b> \uc73c\uc5d0\uc11c \ud15c\ud50c\ub9bf <b id=\"copy_template_name_text\">XXX</b>\ub97c \ub2e4\uc74c \uc7a5\uc18c\uc5d0 \ubcf5\uc0ac\ud569\ub2c8\ub2e4:",
+"message.copy.template.confirm": "Are you sure you want to copy template?",
+"message.create.template": "\ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.create.template.vm": "\ud15c\ud50c\ub9bf <b id=\"p_name\"></b> \uc73c\uc5d0\uc11c VM\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.create.template.volume": "\ub514\uc2a4\ud06c \ubcfc\ub968 <b><span id=\"volume_name\"></span></b> \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uae30 \uc804\uc5d0, \ub2e4\uc74c \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\ubcfc\ub968 \ud06c\uae30\uc5d0 \ub530\ub77c\uc11c\ub294 \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0\ub294 \uba87\ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.creating.cluster": "\ud074\ub7ec\uc2a4\ud130\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.creating.guest.network": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\ub97c \ub9cc\ub4ed\ub2c8\ub2e4.",
+"message.creating.physical.networks": "\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.creating.pod": "Pod\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.creating.primary.storage": "\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.creating.secondary.storage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.creating.systemvm": "Creating system VMs (this may take a while)",
+"message.creating.zone": "Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"message.delete.account": "\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
+"message.delete.gateway": "\ud604\uc7ac \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.project": "\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.user": "\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.vpn.connection": "VPN \uc811\uc18d\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.vpn.customer.gateway": "\ud604\uc7ac VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.delete.vpn.gateway": "\ud604\uc7ac VPN \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
+"message.desc.advanced.zone": "\ubcf4\ub2e4 \uc138\ub828\ub41c \ub124\ud2b8\uc6cc\ud06c \uae30\uc220\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud558\uba74, \ubcf4\ub2e4 \uc720\uc5f0\ud558\uac8c \uac8c\uc2a4\ud2b8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc815\ud558\uace0 \ubc29\ud654\ubcbd(fire wall), VPN, \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \uae30\uc220 \uc9c0\uc6d0\uc640 \uac19\uc740 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ud55c \ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.desc.basic.zone": "\uac01 VM \uc778\uc2a4\ud134\uc2a4\uc5d0 IP \uc8fc\uc18c\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc9c1\uc811 \ud560\ub2f9\ud560 \uc218 \uc788\ub294 \ub2e8\uc77c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf4\uc548 \uadf8\ub8f9 (\uc804\uc1a1\uc6d0 IP \uc8fc\uc18c \ud544\ud130)\uacfc \uac19\uc740 \uce35 \uc138 \uac00\uc9c0 \ub808\ubca8 \ubc29\ubc95\uc73c\ub85c \uac8c\uc2a4\ud2b8\ub97c \ubd84\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.desc.cluster": "\uac01 Pod\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 \ud074\ub7ec\uc2a4\ud130\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \ucd5c\ucd08 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 \ud638\uc2a4\ud2b8\ub97c \uadf8\ub8f9\ud654 \ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ud55c \ud074\ub7ec\uc2a4\ud130 \ub0b4\ubd80 \ud638\uc2a4\ud2b8\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud55c \ud558\ub4dc\uc6e8\uc5b4\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4 \uac19\uc740 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc2e4\ud589\ud558\uace0 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0 \uc788\uc5b4 \uac19\uc740 \uacf5\uc720 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc811\uadfc \ud569\ub2c8\ub2e4. \uac01 \ud074\ub7ec\uc2a4\ud130\ub294 \ud55c \uac1c \uc774\uc0c1 \ud638\uc2a4\ud2b8\uc640 \ud55c \uac1c \uc774\uc0c1 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ub429\ub2c8\ub2e4.",
+"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": "\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uac8c\uc2a4\ud2b8 VM\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \ud638\uc2a4\ud2b8 (\ucef4\ud4e8\ud130)\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. CloudStack\uc73c\ub85c \ud638\uc2a4\ud2b8\ub97c \ub3d9\uc791\ud558\ub824\uba74 \ud638\uc2a4\ud2b8\uc5d0\uac8c \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc124\uce58\ud558\uace0 IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud574 \ud638\uc2a4\ud2b8\uac00 CloudStack \uad00\ub9ac \uc11c\ubc84\uc5d0 \uc811\uc18d\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4. <br/><br/>\ud638\uc2a4\ud2b8 DNS \uba85 \ub610\ub294 IP \uc8fc\uc18c, \uc0ac\uc6a9\uc790\uba85(\uc6d0\ub798 root)\uacfc \uc554\ud638 \ubc0f \ud638\uc2a4\ud2b8 \ubd84\ub958\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ub77c\ubca8\uc744 \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.desc.primary.storage": "\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 \ud074\ub7ec\uc2a4\ud130 \ub0b4 \ubd80 \ud638\uc2a4\ud2b8\uc0c1\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ubaa8\ub4e0 VM \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ud37c \ubc14\uc774\uc800\uc5d0\uc11c \uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \ud45c\uc900\uc5d0 \uc900\uac70\ud55c \ud504\ub85c\ud1a0\ucf5c\uc744 \uc0ac\uc6a9\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\uac01 Zone\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 NFS \uc989 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 VM \ud15c\ud50c\ub9bf, ISO \uc774\ubbf8\uc9c0 \ubc0f VM \ub514\uc2a4\ud06c \ubcfc\ub968 \uc2a4\ub0c5\uc0f7\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc774 \uc11c\ubc84\ub294 Zone\ub0b4 \ubaa8\ub4e0 \ud638\uc2a4\ud2b8\uc5d0\uc11c  \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. <br/><br/>IP \uc8fc\uc18c\uc640 \ub0b4\ubcf4\ub0b4\ub0bc \uacbd\ub85c\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.desc.zone": "Zone\uc740 CloudStack \ud658\uacbd\ub0b4 \ucd5c\ub300 \uc870\uc9c1 \ub2e8\uc704\ub85c \uc6d0\ub798 \ub2e8\uc77c \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4. Zone\uc5d0 \ud574\uc11c \ubb3c\ub9ac\uc801\uc778 \ubd84\ub9ac\uc640 \uc911\ubcf5\uc131\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Zone\uc740 \ud55c \uac1c \uc774\uc0c1 Pod( \uac01 Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131)\uc640 Zone\ub0b4 \ubaa8\ub4e0 Pod\ub85c \uacf5\uc720\ub418\ub294 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.",
+"message.detach.disk": "\ud604\uc7ac \ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.detach.iso.confirm": "\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0\uc11c ISO \ud30c\uc77c\uc744 \ubd84\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.disable.account": "\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?\uc774 \uacc4\uc815 \uc815\ubcf4 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\uac00 \ud074\ub77c\uc6b0\ub4dc \uc790\uc6d0\uc5d0 \uc811\uadfc \ud560 \uc218 \uc5c6\uac8c \ub429\ub2c8\ub2e4. \uc2e4\ud589\uc911 \ubaa8\ub4e0 \uac00\uc0c1 \uba38\uc2e0\uc740 \uae08\ubc29\uc5d0 \uc885\ub8cc \ub429\ub2c8\ub2e4.",
+"message.disable.snapshot.policy": "\ud604\uc7ac \uc2a4\ub0c5\uc0f7 \uc815\ucc45\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4.",
+"message.disable.user": "\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.disable.vpn": "VPN\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.disable.vpn.access": "VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.disabling.network.offering": "Disabling network offering",
+"message.disabling.vpc.offering": "Disabling VPC offering",
+"message.disallowed.characters": "Disallowed characters: <,>",
+"message.download.iso": "ISO\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 <a href=\"#\">00000</a>\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.",
+"message.download.template": "\ud15c\ud50c\ub9bf\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 <a href=\"#\">00000</a>\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.",
+"message.download.volume": "\ubcfc\ub968\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 <a href=\"#\">00000</a>\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.",
+"message.download.volume.confirm": "Please confirm that you want to download this volume.",
+"message.edit.account": "\ud3b8\uc9d1 (\"-1\"\ub294 \uc790\uc6d0 \ub9cc\ub4e4\uae30 \uc22b\uc790\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub294 \uac12\uc785\ub2c8\ub2e4.)",
+"message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
+"message.edit.limits": "\ub2e4\uc74c \uc790\uc6d0\uc5d0 \uc81c\ud55c\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\u300c-1\u300d\uc740 \uc790\uc6d0 \ub9cc\ub4e4\uae30\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub2e4\ub294 \uc758\ubbf8\uc785\ub2c8\ub2e4.",
+"message.edit.traffic.type": "\ud604\uc7ac \ud2b8\ub798\ud53d\uc758 \uc885\ub958\uc5d0 \uad00\ub828 \ud2b8\ub798\ud53d \ub77c\ubca8\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.enable.account": "\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.enable.user": "\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.enable.vpn": "\ud604\uc7ac IP \uc8fc\uc18c\uc5d0 \ub300\ud55c VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.enable.vpn.access": "\ud604\uc7ac\uc774 IP \uc8fc\uc18c\uc5d0 \ub300\ud55c VPN\ub294 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740\uc785\ub2c8\ub2e4. VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.enabled.vpn": "\ud604\uc7ac VPN \uc811\uadfc \uc0ac\uc6a9 \uc124\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c IP \uc8fc\uc18c \uacbd\uc720\ub85c \uc811\uadfc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.enabled.vpn.ip.sec": "IPSec \uc0ac\uc804 \uacf5\uc720 \ud0a4:",
+"message.enabling.network.offering": "Enabling network offering",
+"message.enabling.security.group.provider": "\ubcf4\uc548 \uadf8\ub8f9 \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.enabling.vpc.offering": "Enabling VPC offering",
+"message.enabling.zone": "Zone\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4",
+"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": "\uc804\uc790 \uba54\uc77c \ucd08\ub300\uc7a5\uc5d0 \uc124\uba85\ub418\uc5b4 \uc788\ub294 \ud1a0\ud070\uc744 \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.generate.keys": "\ud604\uc7ac \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 \ud0a4\ub97c \uc0dd\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ud2b8\ub798\ud53d\uc740 \ucd5c\uc885 \uc0ac\uc6a9\uc790 \uac00\uc0c1 \uba38\uc2e0\uac04 \ud1b5\uc2e0\uc785\ub2c8\ub2e4. \uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d\uc744 \ud1b5\uc2e0\ud558\uae30 \uc704\ud55c VLAN ID \ubc94\uc704\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.guest.traffic.in.basic.zone": "\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ud2b8\ub798\ud53d\uc740 \ucd5c\uc885 \uc0ac\uc6a9\uc790\uc758 \uac00\uc0c1 \uba38\uc2e0\uac04 \ud1b5\uc2e0\uc785\ub2c8\ub2e4. CloudStack\uc5d0 \uac8c\uc2a4\ud2b8 VM\uc5d0 \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ubc94\uc704\uac00 \uc608\uc57d \ub05d\ub09c \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c \ubc94\uc704\uc640 \uc911\ubcf5 \ud558\uc9c0 \uc54a\uac8c \uc8fc\uc758\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.host.dedicated": "Host Dedicated",
+"message.host.dedication.released": "Host dedication released",
+"message.installwizard.click.retry": "\uc2dc\uc791\uc744 \uc7ac\uc2dc\ud589\ud558\ub824\uba74 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.installwizard.copy.whatisacluster": "\ud074\ub7ec\uc2a4\ud130\ub294 \ud638\uc2a4\ud2b8\ub97c \uadf8\ub8f9\ud654 \ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ud55c \uac00\uc9c0 \ud074\ub7ec\uc2a4\ud130\ub0b4 \ud638\uc2a4\ud2b8\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud55c \ud558\ub4dc\uc6e8\uc5b4\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4 \uac19\uc740 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc2e4\ud589\ud558\uace0 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0 \uc788\uc5b4\uc11c \uac19\uc740 \uacf5\uc720 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc811\uadfc \ud569\ub2c8\ub2e4. \uac19\uc740 \ud074\ub7ec\uc2a4\ud130\ub0b4\uc758 \ud638\uc2a4\ud2b8 \uc0ac\uc774\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc11c\ube44\uc2a4\ub97c \uc911\ub2e8\ud558\uc9c0 \uc54a\uace0 \uac00\uc0c1 \uba38\uc2e0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc2e4\uc2dc\uac04 \uc774\uc804 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \uc138 \ubc88\uc9f8\ub85c \ud070 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 Pod\uc5d0 \ud3ec\ud568\ub418\uc5b4 Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4. <br/><br/>CloudStack\u2122 \uc5d0\uc11c\ub294 \ud55c \uac00\uc9c0 \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0 \ubcf5\uc218 \ud074\ub7ec\uc2a4\ud130\ub97c \uc124\uc815\ud560 \uc218 \uc788\uc73c\ub098 \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 \ud074\ub7ec\uc2a4\ud130\ub294 \ud55c \uac1c\uc785\ub2c8\ub2e4.",
+"message.installwizard.copy.whatisahost": "\ud638\uc2a4\ud2b8\ub294 \ub2e8\uc77c \ucef4\ud4e8\ud130\ub85c \uc190\ub2d8 \uac00\uc0c1 \uba38\uc2e0\uc744 \uc2e4\ud589\ud558\ub294 \ucef4\ud4e8\ud305 \uc790\uc6d0\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubca0\uc5b4 \uba54\ud0c8 \ud638\uc2a4\ud2b8\ub97c \uc81c\uc678\ud558\uace0, \uac01 \ud638\uc2a4\ud2b8\ub294 \uac8c\uc2a4\ud2b8 \uac00\uc0c1 \uba38\uc2e0\uc744 \uad00\ub9ac\ud558\uae30 \uc704\ud55c \ud558\uc774\ud37c \ubc14\uc774\uc800 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \ubca0\uc5b4 \uba54\ud0c8 \ud638\uc2a4\ud2b8\uc5d0 \ub300\ud574\uc11c\ub294 \uc124\uce58 \uac00\uc774\ub4dc \uace0\uae09\ud3b8 \ud2b9\uc218 \uc0ac\ub840\ub85c\uc11c \uc124\uba85\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, KVM\uc740 \uc720\ud6a8\ud55c Linux \uc11c\ubc84, Citrix XenServer\uac00 \ub3d9\uc791\ud558\ub294 \uc11c\ubc84 \ubc0f ESXi \uc11c\ubc84\uac00 \ud638\uc2a4\ud2b8\uc785\ub2c8\ub2e4. \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 XenServer \ub610\ub294 KVM\ub97c \uc2e4\ud589\ud558\ub294 \ub2e8\uc77c \ud638\uc2a4\ud2b8\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. <br/><br/>\ud638\uc2a4\ud2b8\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \ucd5c\uc18c\uc758 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud638\uc2a4\ud2b8\ub294 \ud074\ub7ec\uc2a4\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4 \ud074\ub7ec\uc2a4\ud130\ub294 Pod\uc5d0 \ud3ec\ud568\ub418\uc5b4 Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4.",
+"message.installwizard.copy.whatisapod": "\uc6d0\ub798 \ud55c \uac00\uc9c0 Pod\ub294 \ub2e8\uc77c \uc7a0\uae08\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uac19\uc740 Pod\ub0b4 \ud638\uc2a4\ud2b8\ub294 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4. <br/><br/>Pod\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \ub450 \ubc88\uc9f8\ub85c \ud070 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uac01 Zone\uc740 \ud55c \uac1c \uc774\uc0c1\uc758 Pod\ub97c \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 Zone\ub0b4 Pod\ub294 \ud55c \uac1c\uc785\ub2c8\ub2e4.",
+"message.installwizard.copy.whatisazone": "Zone\uc740 CloudStack\u2122 \ud658\uacbd\ub0b4 \ucd5c\ub300 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud55c \uac00\uc9c0 \ub370\uc774\ud130 \uc13c\ud130\ub0b4\uc5d0 \ubcf5\uc218 Zone\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc73c\ub098 \uc6d0\ub798 Zone\uc740 \ub2e8\uc77c\uc758 \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud560\ub2f9\ud569\ub2c8\ub2e4. \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\ub97c Zone\uc5d0 \uc870\uc9c1\ud654\ud558\uba74, Zone\uc744 \ubb3c\ub9ac\uc801\uc6b0\ub85c \ubd84\ub9ac\ud574 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uac01 Zone\uc5d0 \uc804\uc6d0\uacfc \ub124\ud2b8\uc6cc\ud06c \uc5c5\ub9c1\ud06c\ub97c \ubc30\uce58\ud569\ub2c8\ub2e4. \ud544\uc218\uac00 \uc544\ub2c8\uc9c0\ub9cc \uc6d0\uaca9\uc9c0\uc5d0 \ubd84\uc0b0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.installwizard.copy.whatiscloudstack": "CloudStack\u2122\ub294 \ucef4\ud4e8\ud305 \uc790\uc6d0\uc744 \ud3ec\ud568\ud558\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ud50c\ub7ab\uc6f9 \uc591\uc2dd\uc5d0\uc11c \uacf5\uac1c, \uc0ac\uc124, \ubc0f \ud558\uc774\ube0c\ub9ac\ub4dc\uc758 Infrastructure as a Service (IaaS) \ud074\ub77c\uc6b0\ub4dc\ub97c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. CloudStack\u2122\ub97c \uc0ac\uc6a9\ud558\uace0, \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\ub97c \uad6c\uc131\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c, \uc2a4\ud1a0\ub9ac\uc9c0 \ubc0f \ucef4\ud4e8\ud305 \ub178\ub4dc\ub97c \uad00\ub9ac\ud558\uace0 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ud658\uacbd\uc744 \uc124\uc815, \uad00\ub9ac \ubc0f \uad6c\uc131\ud569\ub2c8\ub2e4. <br/><br/>CloudStack\u2122\uc740 \ud558\ub4dc\uc6e8\uc5b4\uc0c1\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \uac1c\ubcc4 \uac00\uc0c1 \uba38\uc2e0 \uc774\ubbf8\uc9c0\ub97c \ub118\uc5b4 \ud655\uc7a5\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac04\ub2e8\ud55c \uc124\uc815\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc2a4\ud0dd\uc5d0 \uc758\ud574 \uac00\uc0c1 \ub370\uc774\ud130 \uc13c\ud130 \uc989 \uc5ec\ub7ec \uce35\ud615 \uba40\ud2f0 \uc138\uc785\uc790 \ud074\ub77c\uc6b0\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc11c\ube44\uc2a4\ub85c\uc11c \uad6c\ucd95\ud558\uace0 \uc124\uc815\ud558\uace0 \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c \ubd88\uac00\uacb0\ud55c \ud56d\ubaa9\uc744 \ubaa8\ub450 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc624\ud508 \uc18c\uc2a4 \ubc84\uc804\uacfc \ud504\ub9ac\ubbf8\uc5c4 \ubc84\uc804 \uc591\ucabd \ubaa8\ub450\uc5d0 \uc81c\uacf5\ud558\uba70 \uc624\ud508 \uc18c\uc2a4 \ubc84\uc804\uc5d0\uc11c\ub3c4 \ub300\ubd80\ubd84 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.installwizard.copy.whatisprimarystorage": "CloudStack\u2122 \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\uc5d0\uc11c\ub294 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc640 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ub450 \uc885\ub958\uc758 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc591\ucabd \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0\uc11c iSCSI, NFS \uc11c\ubc84, \ub610\ub294 \ub85c\uceec \ub514\uc2a4\ud06c\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <br/><br/><strong>\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0</strong>\ub294 \ud074\ub7ec\uc2a4\ud130\uc5d0 \uad00\ub828\ub418\uc5b4\uadf8 \ud074\ub7ec\uc2a4\ud130\ub0b4\uc758 \ud638\uc2a4\ud2b8\ub85c \ub3d9\uc791\ud558\ub294 \ubaa8\ub4e0 VM \uc911 \uac01 \uac8c\uc2a4\ud2b8 VM\uc758 \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc6d0\ub798, \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\ub294 \ud638\uc2a4\ud2b8 \uadfc\ucc98\uc5d0 \uc124\uce58\ud569\ub2c8\ub2e4.",
+"message.installwizard.copy.whatissecondarystorage": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 Zone\uacfc \uad00\ub828\ub3e4 \uc544\ub798\uc758 \ud56d\ubaa9\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. <ul><li>\ud15c\ud50c\ub9bf - VM \uc2dc\uc791 \uc2dc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 OS \uc774\ubbf8\uc9c0\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc124\uce58 \ub4f1 \ucd94\uac00 \uad6c\uc131\uc744 \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. </li><li>ISO \uc774\ubbf8\uc9c0 - \ubc14\ub85c \uc2dc\uc791 \uac00\ub2a5 \ub610\ub294 \uc2dc\uc791 \ubd88\uac00\uc758 OS \uc774\ubbf8\uc9c0\uc785\ub2c8\ub2e4. </li><li>\ub514\uc2a4\ud06c \ubcfc\ub968 \uc2a4\ub0c5\uc0f7 - VM \ub370\uc774\ud130 \uc800\uc7a5 \ubcf5\uc0ac\ubcf8\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\uc758 \ubcf5\uc6d0 \ub610\ub294 \uc0c8\ub85c\uc6b4 \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. </ul>",
+"message.installwizard.now.building": "\ud074\ub77c\uc6b0\ub4dc\ub97c \uad6c\ucd95\ud558\uace0 \uc788\ub294 \uc911...",
+"message.installwizard.tooltip.addcluster.name": "\ud074\ub7ec\uc2a4\ud130 \uc774\ub984\uc785\ub2c8\ub2e4. CloudStack\uc5d0\uc11c \uc608\uc57d\ud558\uc9c0 \uc54a\uc740 \uc784\uc758 \ud14d\uc2a4\ud2b8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addhost.hostname": "\ud638\uc2a4\ud2b8 DNS \uba85 \ub610\ub294 IP \uc8fc\uc18c\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addhost.password": "XenServer \uce21\uc5d0\uc11c \uc9c0\uc815\ud55c \uc704\uc758 \uc0ac\uc6a9\uc790\uba85\uc5d0 \ub300\ud55c \uc554\ud638\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addhost.username": "\uc6d0\ub798 root \uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addpod.name": "Pod \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addpod.reservedsystemendip": "\uc774\uac83\uc740 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM \ubc0f \ucf58\uc194 \ud504\ub85d\uc2dc VM\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c CloudStack\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c\ub0b4 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 \ucef4\ud4e8\ud305 \uc11c\ubc84\uc640 \uac19\uc740 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ud560\ub2f9\ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "\ud604\uc7ac Pod\ub0b4 \ud638\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "\uac8c\uc2a4\ud2b8\uac00 \uc0ac\uc6a9\ud558\ub294 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0\uc11c \uc9c0\uc815\ud55c \ub137 \ub9c8\uc2a4\ud06c\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "\uc774\uac83\uc740 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM \ubc0f \ucf58\uc194 \ud504\ub85d\uc2dc VM\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c CloudStack\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c\ub0b4\uc758 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 \ucef4\ud4e8\ud305 \uc11c\ubc84\uc640 \uac19\uc740 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ud560\ub2f9\ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addprimarystorage.name": "\uc2a4\ud1a0\ub9ac\uc9c0 \uae30\uae30\uc758 \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addprimarystorage.path": "(NFS\uc758 \uacbd\uc6b0) \uc11c\ubc84\uc5d0\uc11c \ub0b4\ubcf4\ub0b4\uae30 \uacbd\ub85c\uc785\ub2c8\ub2e4. (SharedMountPoint\uc758 \uacbd\uc6b0) \uc77c\ubc18 \uacbd\ub85c\uc785\ub2c8\ub2e4. KVM\uc5d0\uc11c\ub294 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uac00 \ub9c8\uc6b4\ud2b8\ub418\ub294 \uac01 \ud638\uc2a4\ud2b8\uc0c1\uc758 \uacbd\ub85c\uc785\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, /mnt/primary \uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addprimarystorage.server": "(NFS, iSCSI \ub610\ub294 PreSetup\uc758 \uacbd\uc6b0) \uc2a4\ud1a0\ub9ac\uc9c0 \uae30\uae30\uc758 IP \uc8fc\uc18c \ub610\ub294 DNS \uba85\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ud638\uc2a4\ud2b8 \ud558\ub294 NFS \uc11c\ubc84 IP \uc8fc\uc18c\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addsecondarystorage.path": "\uc704\uc5d0\uc11c \uc9c0\uc815\ud55c \uc11c\ubc84\uc5d0 \uc874\uc7ac\ud558\ub294 \ub0b4\ubcf4\ub0b4\uae30 \uacbd\ub85c\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addzone.dns1": "Zone\ub0b4\uc758 \uac8c\uc2a4\ud2b8 VM\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c DNS \uc11c\ubc84\uc5d0\ub294 \ub2e4\uc74c\uc5d0 \ucd94\uac00\ud558\ub294 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uacbd\uc720\ub85c \uc811\uadfc \ud569\ub2c8\ub2e4. Zone\uc758 \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 \uacf5\uac1c DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addzone.dns2": "Zone\ub0b4 \uac8c\uc2a4\ud2b8 VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\uc5d0\ub294 \ub2e4\uc74c\uc5d0 \ucd94\uac00\ud558\ub294 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uacbd\uc720\ub85c \uc811\uadfc\ud569\ub2c8\ub2e4. Zone\uc758 \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 \uacf5\uac1c DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addzone.internaldns1": "Zone\ub0b4\uc758 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\ub294 \uc2dc\uc2a4\ud15c VM\uc758 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac1c\uc785\uc2dc\ucf1c \uc811\uadfc\ud569\ub2c8\ub2e4. Pod\uc758 \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addzone.internaldns2": "Zone\ub0b4 \uc2dc\uc2a4\ud15c VM\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\ub294 \uc2dc\uc2a4\ud15c VM\uc758 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac1c\uc785\uc2dc\ucf1c \uc811\uadfc\ud569\ub2c8\ub2e4. Pod\uc758 \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.addzone.name": "Zone\uc758 \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.description": "\ub124\ud2b8\uc6cc\ud06c \uc124\uba85\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "\ud604\uc7ac Zone\uc758 \uac8c\uc2a4\ud2b8\uc5d0\uac8c \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\ud558\ub294 NIC\uac00 \ud55c \uac00\uc9c0\uc778 \uacbd\uc6b0\ub294 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 Pod\uc758 CIDR\uc640 \uac19\uc740 CIDR\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "\uac8c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "\uac8c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ub137 \ub9c8\uc2a4\ud06c\uc785\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "\ud604\uc7ac Zone\uc758 \uac8c\uc2a4\ud2b8\uc5d0\uac8c \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\ud558\ub294 NIC\uac00 \ud55c \uac00\uc9c0 \uacbd\uc6b0\ub294 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 Pod\uc758 CIDR\uc640 \uac19\uc740 CIDR\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.installwizard.tooltip.configureguesttraffic.name": "\ub124\ud2b8\uc6cc\ud06c \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
+"message.instancewizard.notemplates": "\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud15c\ud50c\ub9bf\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \ud638\ud658\uc131\uc774 \uc788\ub294 \ud15c\ud50c\ub9bf\uc744 \ucd94\uac00\ud558\uace0, \uc778\uc2a4\ud134\uc2a4 \uc704\uc800\ub4dc\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.ip.address.changed": "\uc0ac\uc6a9 IP \uc8fc\uc18c\uac00 \ubcc0\uacbd\ub41c \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ubaa9\ub85d\uc744 \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\uae4c? \uadf8 \uacbd\uc6b0\ub294 \uc0c1\uc138 \uc124\uc815\ucc3d\uc774 \ub2eb\ub294 \uac83\uc5d0 \uc8fc\uc758\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.iso.desc": "\ub370\uc774\ud130 \ub610\ub294 OS \uc2dc\uc791 \uac00\ub2a5 \ubbf8\ub514\uc5b4\ub97c \ud3ec\ud568\ud55c \ub514\uc2a4\ud06c \uc774\ubbf8\uc9c0",
+"message.join.project": "\uc774\uac83\uc73c\ub85c, \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud588\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\ub97c \ucc38\uc870\ud558\ub824\uba74 \ud504\ub85c\uc81d\ud2b8 \ubcf4\uae30\ub85c \uc804\ud658\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.launch.vm.on.private.network": "\uc0ac\uc801 \uc804\uc6a9 \ub124\ud2b8\uc6cc\ud06c\ub85c \uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud569\ub2c8\uae4c?",
+"message.launch.zone": "Zone\uc744 \uc2dc\uc791\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uc21c\uc11c\uc5d0 \ub530\ub77c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc7a0\uadf8\uc5b4\ub3c4 \uc88b\uc2b5\ub2c8\uae4c? \uc774 \uacc4\uc815 \uc815\ubcf4 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\uac00 \ud074\ub77c\uc6b0\ub4dc \uc790\uc6d0\uc744 \uad00\ub9ac\ud560 \uc218 \uc5c6\uac8c \ub429\ub2c8\ub2e4. \uadf8 \ud6c4\ub3c4 \uae30\uc874 Zone \uc790\uc6d0\uc5d0\ub294 \uc811\uadfc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.migrate.instance.confirm": "\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \uc774\uc804 \uc704\uce58\ub294 \ub2e4\uc74c \ud638\uc2a4\ud2b8\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.migrate.instance.to.host": "\ub2e4\ub978 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.migrate.instance.to.ps": "\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.migrate.router.confirm": "\ub77c\uc6b0\ud130 \uc774\uc804 \uc704\uce58\ub85c \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\uc2ed\uc2dc\uc624.",
+"message.migrate.systemvm.confirm": "\uc2dc\uc2a4\ud15c VM \uc774\uc804 \uc774\uc804 \uc704\uce58\ub85c \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\uc2ed\uc2dc\uc624.",
+"message.migrate.volume": "\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ubcfc\ub968\uc744 \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "\uacc4\uc815 \uc815\ubcf4\uc5d0 \uc0c8\ub85c\uc6b4 \uc0ac\uc6a9\uc790\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c\uc11c vSphere\ub97c \uc120\ud0dd\ud588\uc73c\ub098 \uc774 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc5d0 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c \uae30\ub2a5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e8\uacc4 5\ub85c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.no.network.support.configuration.not.true": "\ubcf4\uc548 \uadf8\ub8f9\uc774 \uc720\ud6a8\ud55c Zone\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c \uae30\ub2a5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e8\uacc4 5\ub85c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.no.projects": "\ud504\ub85c\uc81d\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. <br/>\ud504\ub85c\uc81d\ud2b8 \uc139\uc158\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.no.projects.adminonly": "\ud504\ub85c\uc81d\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. <br/>\uad00\ub9ac\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131\uc744 \uc758\ub8b0\ud558\uc2ed\uc2dc\uc624.",
+"message.number.clusters": "<h2>\ud074\ub7ec\uc2a4\ud130<span>\uc218</span></h2>",
+"message.number.hosts": "<h2>\ud638\uc2a4\ud2b8<span>\uc218</span></h2>",
+"message.number.pods": "<h2>Pod<span>\uc218</span></h2>",
+"message.number.storage": "<h2>\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ubcfc\ub968<span>\uc218</span></h2>",
+"message.number.zones": "<h2>Zone<span>\uc218</span></h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"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": "\ubcf4\ub958\uc911\uc778 \ud504\ub85c\uc81d\ud2b8 \ucd08\ub300\uc7a5\uc774 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.pending.projects.2": "\ud45c\uc2dc\ud558\ub824\uba74 \ud504\ub85c\uc81d\ud2b8 \uc139\uc158\uc73c\ub85c \uc774\ub3d9\ud558\uace0 \ubaa9\ub85d\uc5d0\uc11c \ucd08\ub300\uc7a5\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4.",
+"message.please.add.at.lease.one.traffic.range": "\uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \ud2b8\ub798\ud53d \ubc94\uc704\ub97c \ucd94\uac00\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
+"message.please.proceed": "\ub2e4\uc74c\uc758 \uc21c\uc11c\uc5d0 \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.please.select.a.configuration.for.your.zone": "Zone \uad6c\uc131\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.please.select.a.different.public.and.management.network.before.removing": "\uc0ad\uc81c \uc804\uc5d0 \ub2e4\ub978 \uacf5\uac1c \ubc0f \uad00\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.please.select.networks": "\uac00\uc0c1 \uba38\uc2e0 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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\uc774 \ub9cc\ub4e4\uae30\ub420 \ub54c\uae4c\uc9c0 \uc7a0\uae50 \uae30\ub2e4\ub824 \uc8fc\uc2ed\uc2dc\uc624...",
+"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": "\uc0ac\uc6a9\uc790\uc5d0\uac8c \ucd08\ub300\uc7a5\uc774 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \ucd08\ub300\ub97c \uc2b9\uc778\ud558\uba74, \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd94\uac00\ub429\ub2c8\ub2e4.",
+"message.public.traffic.in.advanced.zone": "\ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 VM\uc774 \uc778\ud130\ub137\uc5d0 \uc811\uadfc \ud558\uba74, \uacf5\uac1c \ud2b8\ub798\ud53d\uc774 \uc0dd\uc131\ub429\ub2c8\ub2e4. \uc774 \ub54c\ubb38\uc5d0 \uc77c\ubc18\uc801\uc73c\ub85c \uc811\uadfc \uac00\ub2a5\ud55c IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uc885 \uc0ac\uc6a9\uc790\ub294 CloudStack \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud574 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uace0 \uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\uc640 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc774\uc5d0 NAT\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <br/><br/>\uc778\ud130\ub137 \ud2b8\ub798\ud53d\uc744 \uc704\ud574 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.public.traffic.in.basic.zone": "\ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 VM\uc774 \uc778\ud130\ub137\uc5d0 \uc811\uadfc \ud560 \ub54c \uc778\ud130\ub137 \uacbd\uc720\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc11c\ube44\uc2a4\ub97c \uc81c\uacf5\ud558\uba74, \uacf5\uac1c \ud2b8\ub798\ud53d\uc774 \uc0dd\uc131\ub429\ub2c8\ub2e4. \uc774 \ub54c\ubb38\uc5d0  \uc77c\ubc18\uc801\uc73c\ub85c \uc811\uadfc \uac00\ub2a5\ud55c IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4e4\uae30\ud558\uba74, \uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \uc678\uc5d0\uc774 \uacf5\uac1c IP \uc8fc\uc18c \ubc94\uc704\uc5d0\uc11c \uc8fc\uc18c\uac00 \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud560\ub2f9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacf5\uac1c IP \uc8fc\uc18c\uc640 \uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \uc0ac\uc774\uc5d0 \uc815\uc801\uc778 1\ub300 1 NAT\uac00 \uc790\ub3d9\uc73c\ub85c \uc124\uc815 \ub429\ub2c8\ub2e4. \ucd5c\uc885 \uc0ac\uc6a9\uc790\ub294 CloudStack \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud574 \ucd94\uac00 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uace0 \uc778\uc2a4\ud134\uc2a4\uc640 \uacf5\uac1c IP \uc8fc\uc18c \uc0ac\uc774\uc5d0 \uc815\uc801 NAT\ub97c \uad6c\ud604\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.",
+"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\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.remove.vpn.access": "\ub2e4\uc74c \uc0ac\uc6a9\uc790\uc5d0\uc11c VPN \uc811\uadfc\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.removed.ssh.key.pair": "Removed a SSH Key Pair",
+"message.reset.password.warning.notpasswordenabled": "\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4 \ud15c\ud50c\ub9bf\uc740 \uc554\ud638 \uad00\ub9ac\ub97c \uc0ac\uc6a9 \ud558\uc9c0 \uc54a\uace0 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.reset.password.warning.notstopped": "\ud604\uc7ac \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.",
+"message.reset.vpn.connection": "VPN \uc811\uc18d\uc744 \uc7ac\uc124\uc815 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.restart.mgmt.server": "\uc0c8\ub85c\uc6b4 \uc124\uc815\uc744 \uc0ac\uc6a9 \ud558\uae30 \uc704\ud574 \uad00\ub9ac \uc11c\ubc84\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.restart.mgmt.usage.server": "\uc0c8\ub85c\uc6b4 \uc124\uc815\uc744 \uc0ac\uc6a9 \ud558\uae30 \uc704\ud574 \uad00\ub9ac \uc11c\ubc84\uc640 \uc0ac\uc6a9 \uc0c1\ud669 \uce21\uc815 \uc11c\ubc84\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.restart.network": "\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.restart.vpc": "VPC\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(\ud574\ub2f9\ud558\ub294 \ubcf4\uc548 \uadf8\ub8f9\uc744 \ubaa8\ub450 \uc120\ud0dd\ud558\ub824\uba74 <strong>Ctrl \ud0a4\ub97c \ub204\ub974\uba74\uc11c \ud074\ub9ad</strong>\ud574 \uc8fc\uc2ed\uc2dc\uc624)",
+"message.select.a.zone": "Zone\uc740 \uc6d0\ub798 \ub2e8\uc77c \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4. \ubcf5\uc218 Zone\uc744 \uc124\uc815\ud558\uace0 \ubb3c\ub9ac\uc801\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \ud074\ub77c\uc6b0\ub4dc\uc758 \uc2e0\ub8b0\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.select.affinity.groups": "Please select any affinity groups you want this VM to belong to:",
+"message.select.instance": "\uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.select.iso": "\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 ISO\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.select.item": "\ud56d\ubaa9\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.select.security.groups": "\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uba38\uc2e0 \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.select.template": "\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\ud655\uc7a5 Zone\uc744 \ucd94\uac00\ud560 \ub54c\ub294 \ud55c \uac1c \uc774\uc0c1 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uac01 \ub124\ud2b8\uc6cc\ud06c\ub294 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc0c1 \ud55c \uac00\uc9c0 \ub124\ud2b8\uc6cc\ud06c \uce74\ub4dc(NIC)\uc5d0 \ub300\uc751\ud569\ub2c8\ub2e4. \uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c\ub294 \uad6c\uc131\uc5d0 \uc81c\ud55c\uc774 \uc788\uc73c\ub098, \ud55c \uac00\uc9c0 \uc885\ub958 \uc774\uc0c1 \ud2b8\ub798\ud53d\uc744 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <br/><br/>\uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ub300\ud574\uc11c<strong>\ud2b8\ub798\ud53d \uc885\ub958\ub97c \ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d</strong>\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.setup.physical.network.during.zone.creation.basic": "\uae30\ubcf8 Zone\uc744 \ucd94\uac00\ud560 \ub54c\ub294 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc0c1\uc758 \ub124\ud2b8\uc6cd\uce74\ub4dc(NIC)\uc5d0 \ub300\uc751\ud558\ub294 \ud55c \uac00\uc9c0 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc124\uc815 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub124\ud2b8\uc6cc\ud06c\ub294 \uba87 \uac00\uc9c0 \uc885\ub958\uc758 \ud2b8\ub798\ud53d\uc744 \uc804\uc1a1\ud569\ub2c8\ub2e4. <br/><br/>\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ub2e4\ub978 \ud2b8\ub798\ud53d\uc758 \uc885\ub958\ub97c<strong>\ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d</strong> \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.setup.successful": "\ud074\ub77c\uc6b0\ub4dc\uac00 \uc124\uc815 \ub418\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "URL\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624",
+"message.step.1.desc": "\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc6a9 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.ISO\ub97c \uc124\uce58 \ud560 \uc218 \uc788\ub294 \uacf5\ubc31 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.step.2.continue": "\uc2e4\ud589\ud558\ub824\uba74 \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.step.3.continue": "\uc2e4\ud589\ud558\ub824\uba74 \ub514\uc2a4\ud06c\uc81c\uacf5\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.step.4.continue": "\uc2e4\ud589\ud558\ub824\uba74 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.step.4.desc": "\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uac00 \uc811\uc18d\ud558\ub294 \uae30\ubcf8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.storage.traffic": "\ud638\uc2a4\ud2b8\ub098 CloudStack \uc2dc\uc2a4\ud15c VM \ub4f1 \uad00\ub9ac \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud558\ub294 CloudStack \ub0b4\ubd80 \uc790\uc6d0\uac04 \ud2b8\ub798\ud53d\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.suspend.project": "\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc77c\uc2dc\uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.systems.vms.ready": "System VMs ready.",
+"message.template.copying": "Template is being copied.",
+"message.template.desc": "VM\uc758 \uc2dc\uc791\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 OS \uc774\ubbf8\uc9c0",
+"message.template.iso": "\uc2e4\ud589\ud558\ub824\uba74 \ud15c\ud50c\ub9bf \ub610\ub294 ISO\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.tier.required": "Tier is required",
+"message.tooltip.dns.1": "Zone\ub0b4 VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Zone \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.tooltip.dns.2": "Zone\ub0b4 VM \ub85c \uc0ac\uc6a9\ud558\ub294 \ub450\ubc88\uc9f8 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Zone \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.tooltip.internal.dns.1": "Zone\ub0b4 CloudStack \ub0b4\ubd80 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Pod \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.tooltip.internal.dns.2": "Zone\ub0b4 CloudStack \ub0b4\ubd80 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Pod \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.",
+"message.tooltip.network.domain": "DNS \uc11c\ud53d\uc2a4\uc785\ub2c8\ub2e4. \uc774 \uc11c\ud53d\uc2a4\uc5d0\uc11c \uac8c\uc2a4\ud2b8 VM \ub85c \uc811\uadfc \ud558\ub294 \ub124\ud2b8\uc6cc\ud06c \ub9de\ucda4\ud615 \ub3c4\uba54\uc778\uba85\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.",
+"message.tooltip.pod.name": "\ud604\uc7ac Pod \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.tooltip.reserved.system.gateway": "Pod\ub0b4 \ud638\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4.",
+"message.tooltip.reserved.system.netmask": "Pod \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\ub97c \uc815\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c \ud504\ub808\ud53d\uc2a4\uc785\ub2c8\ub2e4. CIDR \ud45c\uae30\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.",
+"message.tooltip.zone.name": "Zone \uc774\ub984\uc785\ub2c8\ub2e4.",
+"message.update.os.preference": "\ud604\uc7ac \ud638\uc2a4\ud2b8 OS \uae30\ubcf8 \uc124\uc815\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uac19\uc740 \uae30\ubcf8 \uc124\uc815\uc744 \uac00\uc9c0\ub294 \ubaa8\ub4e0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub294 \ub2e4\ub978 \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\ud558\uae30 \uc804\uc5d0 \uc6b0\uc120\uc774 \ud638\uc2a4\ud2b8\uac00 \ud560\ub2f9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.update.resource.count": "\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4 \uc790\uc6d0\uc218\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.update.ssl": "\uac01 \ucf58\uc194 \ud504\ub85d\uc2dc \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 X.509 \uae30\ubc18 \uc0c8 SSL \uc778\uc99d\uc11c\ub97c \uc804\uc1a1\ud574 \uc8fc\uc2ed\uc2dc\uc624:",
+"message.update.ssl.failed": "Failed to update SSL Certificate.",
+"message.update.ssl.succeeded": "Update SSL Certificates succeeded",
+"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": "\uc778\uc2a4\ud134\uc2a4\uba85\uc740 63 \ubb38\uc790 \uc774\ub0b4\uc5d0\uc11c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. ASCII \ubb38\uc790\uc758 a-z, A-Z, \uc22b\uc790\uc758 0-9 \ubc0f \ud558\uc774\ud508\ub9cc\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubb38\uc790\ub85c \uc2dc\uc791\ud558\uc5ec \ubb38\uc790 \ub610\ub294 \uc22b\uc790\ub85c \ub05d\ub0b4\uc57c \ud569\ub2c8\ub2e4.",
+"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.validate.url": "Please enter a valid URL.",
+"message.virtual.network.desc": "\uacc4\uc815 \uc815\ubcf4 \uc804\uc6a9 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778\uc740 VLAN \ub0b4\uc5d0 \ubc30\uce58\ub418\uc5b4 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc811\uadfc\ub294 \ubaa8\ub450 \uac00\uc0c1 \ub77c\uc6b0\ud130\uc5d0 \ud574\uc11c \ub8e8\ud305 \ub429\ub2c8\ub2e4.",
+"message.vm.create.template.confirm": "\ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\ud558\uba74 VM\uc774 \uc790\ub3d9\uc73c\ub85c \uc7ac\uc2dc\uc791\ub429\ub2c8\ub2e4.",
+"message.vm.review.launch": "\ub2e4\uc74c\uc758 \uc815\ubcf4\ub97c \ucc38\uc870\ud558\uace0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub97c \uc62c\ubc14\ub974\uac8c \uc124\uc815\ud55c \uac83\uc744 \ud655\uc778\ud558\uace0 \ub098\uc11c \uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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": "\ud604\uc7ac \ub514\uc2a4\ud06c \ubcfc\ub968 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4dc\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \ubcfc\ub968 \ud06c\uae30\uc5d0 \ub530\ub77c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4.",
+"message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
+"message.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"message.you.must.have.at.least.one.physical.network": "\uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uac00 \ud544\uc694\ud569\ub2c8\ub2e4",
+"message.your.cloudstack.is.ready": "Your CloudStack is ready!",
+"message.zone.creation.complete": "Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 Zone\uc744 \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
+"message.zone.no.network.selection": "\uc120\ud0dd\ud55c Zone\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.",
+"message.zone.step.1.desc": "Zone \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.zone.step.2.desc": "\uc0c8 Zone\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"message.zone.step.3.desc": "\uc0c8 Pod\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.",
+"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}.",
+"network.rate": "\ub124\ud2b8\uc6cc\ud06c \uc18d\ub3c4",
+"side.by.side": "\ubcd1\ub82c",
+"state.accepted": "\uc2b9\uc778 \uc644\ub8cc",
+"state.active": "\ud65c\uc131",
+"state.allocating": "\ud560\ub2f9 \uc911",
+"state.backedup": "\ubc31\uc5c5 \uc644\ub8cc",
+"state.backingup": "\ubc31\uc5c5 \uc911",
+"state.completed": "\uc644\ub8cc",
+"state.creating": "\uc0dd\uc131 \uc911",
+"state.declined": "\uac70\uc808",
+"state.destroyed": "\ud30c\uae30\ub41c \uc0c1\ud0dc",
+"state.detached": "Detached",
+"state.disabled": "\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740",
+"state.enabled": "\uc0ac\uc6a9\ud568",
+"state.error": "\uc624\ub958",
+"state.expunging": "\uc81c\uac70 \uc911",
+"state.migrating": "\uc774\uc804 \uc911",
+"state.pending": "\ubcf4\ub958",
+"state.running": "\uc2e4\ud589 \uc911",
+"state.starting": "\uc2dc\uc791 \uc911",
+"state.stopped": "\uc815\uc9c0\ub41c \uc0c1\ud0dc",
+"state.stopping": "\uc815\uc9c0\ud558\uace0 \uc788\ub294 \uc911",
+"state.suspended": "\uc77c\uc2dc\uc815\uc9c0",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/nb_NO.json b/ui/public/locales/nb_NO.json
new file mode 100644
index 0000000..7225293
--- /dev/null
+++ b/ui/public/locales/nb_NO.json
@@ -0,0 +1,2364 @@
+{
+"changed.item.properties": "Endrede egenskaper",
+"confirm.enable.s3": "Vennligst fyll inn f\u00f8lgende informasjon for \u00e5 aktivere st\u00f8tte for S3-st\u00f8ttet sekund\u00e6rlagring",
+"confirm.enable.swift": "Vennligst fyll inn f\u00f8lgende informasjon for \u00e5 aktivere st\u00f8tte 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\u00e5 tilbake og korriger feilene.",
+"error.invalid.username.password": "Ugyldig brukernavn eller passord",
+"error.login": "Ditt brukernavn/passord stemmer ikke overens med v\u00e5re opplysninger.",
+"error.menu.select": "Kan ikke utf\u00f8re handlingen grunnet ingen valgte elementer.",
+"error.mgmt.server.inaccessible": "Administrasjonsserver er utilgjengelig. Vennligst pr\u00f8v igjen senere.",
+"error.password.not.match": "Passordfeltene sammensvarer ikke",
+"error.please.specify.physical.network.tags": "Nettverkstilbud er ikke tilgjengelig f\u00f8r du spesifiserer knagger for dette fysiske nettverket.",
+"error.session.expired": "Din sesjon har utl\u00f8pt.",
+"error.unable.to.reach.management.server": "Kan ikke oppn\u00e5 kontakt med administrasjonsserveren",
+"error.unresolved.internet.name": "Ditt internettnavn kan ikke l\u00f8ses.",
+"force.delete.domain.warning": "Advarsel: dette alternativet vil medf\u00f8re 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\u00f8rende virtuelle maskiner, f\u00f8r verten blir fjernet fra klyngen.",
+"force.stop": "Tving stopp",
+"force.stop.instance.warning": "Advarsel: \u00c5 tvinge en stopp av denne instansen b\u00f8r v\u00e6re siste utvei. Det kan f\u00f8re til tap av data og ukonsistent oppf\u00f8rsel 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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Bilde-katalog",
+"inline": "I Rekke",
+"label.about": "Om",
+"label.about.app": "Om CloudStack",
+"label.accept.project.invitation": "Aksepter prosjektinvitasjon",
+"label.accesskey": "Aksessn\u00f8kkel",
+"label.account": "Konto",
+"label.account.and.security.group": "Konto, Sikkerhetsgruppe",
+"label.account.details": "Kontodetaljer",
+"label.account.id": "Konto ID",
+"label.account.name": "Kontonavn",
+"label.account.specific": "Kontospesifikk",
+"label.accounts": "Kontoer",
+"label.accounttype": "Kontotype",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL Liste Regler",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL erstattet",
+"label.aclid": "ACL",
+"label.aclname": "ACL Navn",
+"label.acltotal": "Nettverk ACL Total",
+"label.acquire.new.ip": "Tilegne ny IP",
+"label.acquire.new.secondary.ip": "Tilegne ny sekund\u00e6r 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.configure.stickiness": "Klebrighet",
+"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 \u00f8yeblikksbilde....",
+"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.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\u00e5ende regel",
+"label.action.delete.ingress.rule.processing": "Sletter inng\u00e5ende regel....",
+"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.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\u00e6rlagring",
+"label.action.delete.primary.storage.processing": "Sletter prim\u00e6rlagring....",
+"label.action.delete.secondary.storage": "Slett sekund\u00e6rlagring",
+"label.action.delete.secondary.storage.processing": "Sletter sekund\u00e6rlagring....",
+"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 \u00f8yeblikksbilde",
+"label.action.delete.snapshot.processing": "Sletter \u00f8yeblikksbilde....",
+"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": "\u00d8delegg Instans",
+"label.action.destroy.instance.processing": "\u00d8delegger 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.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.iso": "Rediger ISO",
+"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\u00e6rlagring",
+"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\u00e5 nytt....",
+"label.action.generate.keys": "Generer n\u00f8kler",
+"label.action.generate.keys.processing": "Genererer n\u00f8kler....",
+"label.action.list.nexusvswitch": "Liste Nexus 1000v",
+"label.action.lock.account": "L\u00e5s konto",
+"label.action.lock.account.processing": "L\u00e5ser 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.project.add.account": "Legg kontoen til prosjektet",
+"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 \u00f8yeblikksbilder",
+"label.action.register.iso": "Registrer ISO",
+"label.action.register.template": "Registrer mal fra en URL",
+"label.action.release.ip": "Frigj\u00f8r IP",
+"label.action.release.ip.processing": "Frigj\u00f8r 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\u00f8rrelse p\u00e5 volum",
+"label.action.resize.volume.processing": "Endrer st\u00f8rrelse p\u00e5 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 \u00f8yeblikksbilde",
+"label.action.revert.snapshot.processing": "Tilbakestiller til \u00f8yeblikksbilde....",
+"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 \u00f8yeblikksbilde",
+"label.action.take.snapshot.processing": "Tar \u00f8yeblikksbilde....",
+"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 \u00f8yeblikksbilde",
+"label.action.vmsnapshot.delete": "Slett VM \u00f8yeblikksbilde",
+"label.action.vmsnapshot.revert": "Tilbakestill til maskin\u00f8yeblikksbilde",
+"label.actions": "Handlinger",
+"label.activate.project": "Aktiver prosjekt",
+"label.activeviewersessions": "Aktive sesjoner",
+"label.add": "Legg til",
+"label.add.account": "Legg til konto",
+"label.add.accounts": "Legg til kontoer",
+"label.add.accounts.to": "Legg kontoer til",
+"label.add.acl": "Legg til ACL",
+"label.add.acl.list": "Legg til ACL liste",
+"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.bigswitchbcf.device": "Legg til BigSwitch BCF kontroller",
+"label.add.brocadevcs.device": "Legg til Brocade VCS Svitsj",
+"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.f5.device": "Legg til F5 enhet",
+"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.gateway": "Legg til ny gateway",
+"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.tier": "Legg til ny gren",
+"label.add.nfs.secondary.staging.store": "Legg Til NFS sekund\u00e6rmellomlagringsomr\u00e5de",
+"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.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\u00e6rlagring",
+"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\u00e6rlagring",
+"label.add.security.group": "Legg til sikkerhetsgruppe",
+"label.add.service.offering": "Legg til tjenestetilbud",
+"label.add.srx.device": "Legg til SRX enhet",
+"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.vlan": "Legg til VLAN",
+"label.add.vm": "Legg til VM",
+"label.add.vm.to.tier": "Legg VM til VPC-gren",
+"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.gateway": "Legg til VPN Gateway",
+"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.address": "Address",
+"label.admin": "Admin",
+"label.admin.accounts": "Adminkontoer",
+"label.advanced": "Avansert",
+"label.advanced.mode": "Avansermodus",
+"label.advanced.search": "Avansert s\u00f8k",
+"label.affinity": "Affinitet",
+"label.affinity.groups": "Affinitetsgrupper",
+"label.affinitygroup": "Affinitetsgruppe",
+"label.agent.password": "Agentpassord",
+"label.agent.username": "Agentbrukernavn",
+"label.agentport": "Agentport",
+"label.agentstate": "Agentstatus",
+"label.agree": "Godtar",
+"label.alert": "Varsel",
+"label.alert.archived": "Varsel arkivert",
+"label.alert.deleted": "Varsel slettet",
+"label.alert.details": "Varseldetaljer",
+"label.alerts": "Varsler",
+"label.algorithm": "Algoritme",
+"label.all": "Alle",
+"label.allocated": "Allokert",
+"label.allocationstate": "Allokeringsstatus",
+"label.allow": "Tillat",
+"label.anti.affinity": "Anti-affinitet",
+"label.anti.affinity.group": "Anti-affinitetsgruppe",
+"label.anti.affinity.groups": "Anti-affinitetsgrupper",
+"label.api.version": "API Versjon",
+"label.apikey": "API-n\u00f8kkel",
+"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.associatednetwork": "Assosiert nettverk",
+"label.associatednetworkid": "Assosiert nettverksid",
+"label.associatednetworkname": "Nettverksnavn",
+"label.author.email": "Forfatter e-post",
+"label.author.name": "Forfatternavn",
+"label.autoscale": "Autoskaler",
+"label.autoscale.configuration.wizard": "Autoskalering konfigurasjonsveiviser",
+"label.availability": "Tilgjengelighet",
+"label.availabilityzone": "tilgjengelighetssone",
+"label.available": "Tilgjengelig",
+"label.available.public.ips": "Tilgjengelig offentlige IP-adresser",
+"label.back": "Tilbake",
+"label.balance": "Balanse",
+"label.bandwidth": "B\u00e5ndbredde",
+"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.baremetalcpu": "CPU (i MHz)",
+"label.baremetalcpucores": "# av CPU-kjerner",
+"label.baremetalmac": "Verts MAC",
+"label.baremetalmemory": "Minne (i MB)",
+"label.basic": "Basis",
+"label.basic.mode": "Basismodus",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF detaljer",
+"label.bigswitch.controller.address": "BigSwitch BCF kontrolleradresse",
+"label.bladeid": "Blad-ID",
+"label.blades": "Blad",
+"label.bootable": "Botbar",
+"label.broadcastdomainrange": "Kringkastings domene rekke",
+"label.broadcastdomaintype": "Kringkastings Domene Type",
+"label.broadcasturi": "kringkastinguri",
+"label.brocade.vcs.address": "Vcs Switch Addresse",
+"label.brocade.vcs.details": "Brocade Vcs svitsj detaljer",
+"label.bucket": "B\u00f8tte",
+"label.by.account": "Etter Konto",
+"label.by.alert.type": "Etter varseltype",
+"label.by.availability": "Etter Tilgjengelighet",
+"label.by.domain": "Etter Domene",
+"label.by.end.date": "Etter sluttdato",
+"label.by.event.type": "Etter hendelsestype",
+"label.by.level": "Etter niv\u00e5",
+"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.cachemode": "Write-cache Type",
+"label.cancel": "Avbryt",
+"label.capacity": "Kapasitet",
+"label.capacity.iops": "Kapasitet IOPS",
+"label.capacitybytes": "Kapasitet Bytes",
+"label.capacityiops": "IOPS Totalt",
+"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.of.destination.network": "CIDR for destinasjonsnettverk",
+"label.cidrlist": "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.cleanup": "Rydd opp",
+"label.clear.list": "T\u00f8m liste",
+"label.close": "Lukk",
+"label.cloud.console": "Cloud",
+"label.cloud.managed": "Forvaltet Av Cloud.com",
+"label.cluster": "Klynge",
+"label.cluster.name": "Klyngenavn",
+"label.clusterid": "Klynge",
+"label.clustername": "Klynge",
+"label.clusternamelabel": "Klyngenavn",
+"label.clusters": "Klynger",
+"label.clustertype": "Klyngetype",
+"label.clvm": "CLVM",
+"label.code": "Kode",
+"label.community": "Fellesskap",
+"label.compute": "Beregne",
+"label.compute.and.storage": "Regnekraft og lagring",
+"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.confirmation": "Bekreftelse",
+"label.confirmdeclineinvitation": "Er du sikker p\u00e5 du \u00f8nsker \u00e5 avvise denne prosjektinvitasjonen?",
+"label.confirmpassword": "Bekreft passord",
+"label.congratulations": "Gratulerer!",
+"label.connectiontimeout": "Tilkoblingsavbrudd",
+"label.conservemode": "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.counterid": "Teller",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU allokert",
+"label.cpu.sockets": "CPU Sokkel",
+"label.cpuallocated": "CPU Allokert for VMer",
+"label.cpuallocatedghz": "Allokert",
+"label.cpulimit": "CPU-begrensninger",
+"label.cpumaxdeviation": "Avvik",
+"label.cpusockets": "Totalt antall CPU-sockets",
+"label.cpuspeed": "CPU (i MHz)",
+"label.cputotal": "Totalt CPU",
+"label.cputotalghz": "Totalt",
+"label.cpuused": "CPU-utnyttelse",
+"label.create.nfs.secondary.staging.storage": "Legg Til NFS sekund\u00e6rmellomlagringsomr\u00e5de",
+"label.create.nfs.secondary.staging.store": "Opprett NFS sekund\u00e6rmellomlagringsomr\u00e5de",
+"label.create.project": "Opprett prosjekt",
+"label.create.ssh.key.pair": "Lag SSH-n\u00f8kkelpar",
+"label.create.template": "Opprett mal",
+"label.create.vpn.connection": "Opprett VPN-tilkobling",
+"label.created": "Opprettet",
+"label.created.by.system": "Opprettet av systemet",
+"label.createnfscache": "Legg Til NFS sekund\u00e6rmellomlagringsomr\u00e5de",
+"label.credit": "Kreditt",
+"label.crosszones": "Kryssoner",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Tilpasset",
+"label.custom.disk.offering": "Brukertilpasset disktilbud",
+"label.customdisksize": "Tilpasset Diskst\u00f8rrelse",
+"label.daily": "Daglig",
+"label.dashboard": "Dashbord",
+"label.data.disk.offering": "Datadisktilbud",
+"label.date": "Dato",
+"label.day": "Dag",
+"label.day.of.month": "Dag i m\u00e5ned",
+"label.day.of.week": "Dag i uke",
+"label.dc.name": "Datasenter Navn",
+"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.use": "Standard bruk",
+"label.default.view": "Standardvisning",
+"label.delete": "Slett",
+"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.bigswitchbcf": "Fjern BigSwitch BCF-kontroller",
+"label.delete.brocadevcs": "Fjern Brocade VCS-svitsj",
+"label.delete.ciscoasa1000v": "Slett CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Slett CiscoVNMC ressurs",
+"label.delete.events": "Slett hendelser",
+"label.delete.f5": "Slett F5",
+"label.delete.gateway": "slett gateway",
+"label.delete.internal.lb": "Slett intern LB",
+"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.portable.ip.range": "Slett portabel IP-rekke",
+"label.delete.project": "Slett prosjekt",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Slett NFS sekund\u00e6rmellomlagringsomr\u00e5de",
+"label.delete.srx": "Slett SRX",
+"label.delete.ucs.manager": "Slett UCS Manager",
+"label.delete.vpn.connection": "Slett VPN-tilkobling",
+"label.delete.vpn.customer.gateway": "Slett VPN-kundegateway",
+"label.delete.vpn.gateway": "Slett VPN-gateway",
+"label.delete.vpn.user": "Slett VPN-bruker",
+"label.deleteprofile": "Slett Profil",
+"label.deleting.failed": "Sletting feilet",
+"label.deleting.processing": "Sletter....",
+"label.deny": "Nekt",
+"label.deploymentplanner": "utbyggings planlegger",
+"label.description": "Beskrivelse",
+"label.destinationphysicalnetworkid": "Fysisk nettverksid-destinasjon",
+"label.destinationzoneid": "Destinasjonssone",
+"label.destroy": "Destruer",
+"label.destroy.router": "Slett ruter",
+"label.destroyvmgraceperiod": "\u00d8delegg VM ventetid",
+"label.detaching.disk": "Kobler fra disk",
+"label.details": "Detaljer",
+"label.deviceid": "Enhets ID",
+"label.devices": "Enheter",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP servertype",
+"label.direct.attached.public.ip": "Direkte Tilknyttet Offentlig IP-adresse",
+"label.direct.ips": "Deltnettverk-IPadresser",
+"label.directdownload": "Direct Download",
+"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.disconnected": "Siste Frakobling",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disktilbud detaljer",
+"label.disk.offerings": "Disktilbud",
+"label.disk.size": "Diskst\u00f8rrelse",
+"label.disk.volume": "Disk Volum",
+"label.diskbytesreadrate": "Disklesehastighet (BPS)",
+"label.diskbyteswriterate": "Diskskrivehastighet  (BPS)",
+"label.diskiopsmax": "Maks IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disklesehastighet (IOPS)",
+"label.diskiopswriterate": "Diskskrivehastighet (IOPS)",
+"label.diskioread": "Disk lese (IO)",
+"label.diskiowrite": "Disk skrive (IO)",
+"label.diskkbsread": "Disk lese (Bytes)",
+"label.diskkbswrite": "Disk skrive (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Disktilbud",
+"label.diskofferingid": "Disktilbud",
+"label.disksize": "Diskst\u00f8rrelse (i GB)",
+"label.disksizeallocated": "Disk allokert",
+"label.disksizeallocatedgb": "Allokert",
+"label.disksizetotal": "Disk Totalt",
+"label.disksizetotalgb": "Totalt",
+"label.disksizeunallocatedgb": "Uallokert",
+"label.disksizeusedgb": "Brukt",
+"label.display.text": "Visningstekst",
+"label.displayname": "Visningsnavn",
+"label.displaytext": "Beskrivelse",
+"label.distributedvpcrouter": "Distribuert VPC router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS domene for gjestenettverk",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domene",
+"label.domains": "Domene",
+"label.domain.details": "Domenedetaljer",
+"label.domain.name": "Domenenavn",
+"label.domain.router": "Domeneruter",
+"label.domain.suffix": "DNS domenesuffiks (f.eks, xyz.com)",
+"label.domainid": "Domene ID",
+"label.domainname": "Domene",
+"label.domainpath": "Domene",
+"label.done": "Utf\u00f8rt",
+"label.double.quotes.are.not.allowed": "Doble anf\u00f8rselstegn er ikke tillatt",
+"label.download.progress": "Nedlastningsprogresjon",
+"label.dpd": "D\u00f8d endepunkt-deteksjon",
+"label.drag.new.position": "Dra til ny posisjon",
+"label.driver": "Driver",
+"label.duration.in.sec": "Varighet (i sek.)",
+"label.edit": "Editer",
+"label.edit.acl.list": "Edit ACL List",
+"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\u00e9r 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\u00e6re 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.egressdefaultpolicy": "Egress standard policy",
+"label.elastic": "Elastisk",
+"label.email": "E-post",
+"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\u00f8ttet sekund\u00e6rlagring",
+"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.reserved.system.ip": "Siste reserverte system IP",
+"label.end.vlan": "Slutt VLAN",
+"label.end.vxlan": "Slutt VXLAN",
+"label.enddate": "Etter dato (slutt)",
+"label.endip": "Slutt-IP",
+"label.endipv4": "IPv4 Slutt IP",
+"label.endipv6": "IPv6 Slutt IP",
+"label.endpoint": "Endepunkt",
+"label.endpoint.or.operation": "Endepunkt eller operasjon",
+"label.endport": "Sluttport",
+"label.enter.token": "Skriv inn koden",
+"label.error": "Feil",
+"label.error.code": "Feilkode",
+"label.error.something.went.wrong.please.correct.the.following": "Noe gikk galt. Vennligst korrig\u00e9r f\u00f8lgende",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP kryptering",
+"label.esphash": "ESP hash",
+"label.esplifetime": "ESP levetid (sekund)",
+"label.esppolicy": "ESP policy",
+"label.event": "Hendelse",
+"label.event.archived": "Hendelser Arkivert",
+"label.event.deleted": "Hendelse slettet",
+"label.events": "Hendelser",
+"label.every": "Hver",
+"label.example": "Eksempel",
+"label.expunge": "Permanent Slett",
+"label.external.link": "Ekstern kobling",
+"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.firstname": "Fornavn",
+"label.firstname.lower": "fornavn",
+"label.forceencap": "Tving UDP innkapsling av ESP-pakker",
+"label.format": "Format",
+"label.friday": "Fredag",
+"label.full": "Full",
+"label.full.path": "Full sti",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "Generelle varsler",
+"label.generating.url": "Genererer URL",
+"label.global.settings": "Globale innstillinger",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS-konfigurasjon",
+"label.glustervolume": "Volum",
+"label.go.step.2": "G\u00e5 til steg 2",
+"label.go.step.3": "G\u00e5 til steg 3",
+"label.go.step.4": "G\u00e5 til steg 4",
+"label.go.step.5": "G\u00e5 til steg 5",
+"label.gpu": "GPU",
+"label.group": "Gruppe",
+"label.group.by.account": "Grupper p\u00e5 konto",
+"label.group.by.cluster": "Grupper p\u00e5 kluster",
+"label.group.by.pod": "Grupper p\u00e5 pod",
+"label.group.by.zone": "Grupper p\u00e5 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.lb.details": "Lastbalanseringsdetaljer",
+"label.gslb.lb.remove": "Fjern lastbalansering fra denne GSLB",
+"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.gslbdomainname": "GSLB domenenavn",
+"label.gslbprovider": "GSLB tjeneste",
+"label.gslbproviderprivateip": "GSLB tjeneste privat IP-adresse",
+"label.gslbproviderpublicip": "GSLB tjeneste offentlig IP-adresse",
+"label.gslbservicetype": "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.guestcidraddress": "Gjest CIDR",
+"label.guestendip": "Gjest slutt-IP",
+"label.guestgateway": "Gjestegateway",
+"label.guestipaddress": "Gjest IP-adresse",
+"label.guestiptype": "Gjestetype",
+"label.guestnetmask": "Gjest nettmaske",
+"label.guestnetworkid": "Nettverks ID",
+"label.guestnetworkname": "Nettverksnavn",
+"label.guestosid": "OS-type",
+"label.gueststartip": "Gjest start-IP",
+"label.guestvlanrange": "VLAN-rekke(r)",
+"label.haenable": "HA Aktivert",
+"label.hahost": "HA Aktivert",
+"label.header.volume.snapshot": "Du kan sette opp gjentakende \u00f8yeblikksbilder ved \u00e5 velge fra tilgjengelige opsjoner nedenfor og aktivere dine preferanser.",
+"label.header.volume.take.snapshot": "Vennligst bekreft at du vil ta et \u00f8yeblikksbilde av dette volumet.",
+"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\u00f8re 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.alerts": "Hosts in Alert State",
+"label.host.name": "Vertsnavn",
+"label.host.tag": "Merkelapper for vert",
+"label.hostid": "Vert",
+"label.hostname": "Vert",
+"label.hostnamelabel": "Vertsnavn",
+"label.hosts": "Verter",
+"label.hosttags": "Vertsknagger",
+"label.hourly": "Hver time",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor evner",
+"label.hypervisor.type": "Hypervisor type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor \u00d8yeblikks Kapasitet",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor versjon",
+"label.hypervnetworklabel": "HyperV Trafikk Etikett",
+"label.icmpcode": "ICMP-kode",
+"label.icmptype": "ICMP-type",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE kryptering",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE livstid (sekunder)",
+"label.ikepolicy": "IKE policy",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastruktur",
+"label.ingress.rule": "Ingressregel",
+"label.initiated.by": "Initiert av",
+"label.insideportprofile": "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\u00e6rlagring?",
+"label.installwizard.addprimarystorageintro.title": "Legg til prim\u00e6rlagring",
+"label.installwizard.addsecondarystorageintro.subtitle": "Hva er sekund\u00e6rlagring?",
+"label.installwizard.addsecondarystorageintro.title": "Legg til sekund\u00e6rlagring",
+"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.name": "Instans Navn",
+"label.instance.scaled.up": "Instans skalert til forespurt tilbud",
+"label.instancename": "Internt navn",
+"label.instanceport": "Instansport",
+"label.instances": "Instanser",
+"label.instanciate.template.associate.profile.blade": "Instansier mal og assosier malen med Blade",
+"label.intermediate.certificate": "Intermediate sertifikat",
+"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.internaldns1": "Intern DNS 1",
+"label.internaldns2": "Intern DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Sjekkintervall (i sekunder)",
+"label.intervaltype": "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.allocations": "IP Allokeringer",
+"label.ip.or.fqdn": "IP eller FQDN",
+"label.ip.range": "IP-rekke",
+"label.ip.ranges": "IP-rekker",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 nettmaske",
+"label.ip6address": "IPv6 IP Adresse",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP-adresse",
+"label.ipaddress1": "IP-adresse",
+"label.ipaddress2": "IP-adresse",
+"label.iplimit": "Offentlig IP-addresse Grenser",
+"label.ips": "IPer",
+"label.ipsecpsk": "IPSec Delt N\u00f8kkel",
+"label.iptotal": "Totalt IP-adresser",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "M\u00e5l IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Er delt",
+"label.isadvanced": "VIs avanserte instillinger",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Tilpasset Diskst\u00f8rrelse",
+"label.iscustomizeddiskiops": "Tilpasset IOPS",
+"label.iscustomizediops": "Tilpasset IOPS",
+"label.isdedicated": "Dedikert",
+"label.isdefault": "Er standard",
+"label.isdynamicallyscalable": "Dynamisk skalerbar",
+"label.isextractable": "Nedlastbar",
+"label.isfeatured": "Fremhevet",
+"label.isforced": "Tving sletting",
+"label.ismanaged": "Administrert",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Isolerte nettverk",
+"label.isolatedpvlanid": "Sekund\u00e6r Isolert VLAN ID",
+"label.isolation.method": "Isolasjonsmetode",
+"label.isolation.mode": "Isolasjonsmetode",
+"label.isolationmethod": "Isolasjonsmetode",
+"label.isolationmethods": "Isolasjonsmetode",
+"label.isolationuri": "Isolasjons URI",
+"label.isoname": "Tilknyttet ISO",
+"label.isos": "ISOer",
+"label.ispasswordenabled": "Passord Aktivert",
+"label.ispersistent": "Vedvarende",
+"label.isportable": "Kryssoner",
+"label.ispublic": "Offentlig",
+"label.isready": "Klar",
+"label.isredundantrouter": "Redundant ruter",
+"label.isrouting": "Ruting",
+"label.isshared": "Delt",
+"label.issourcenat": "Kilde NAT",
+"label.isstaticnat": "Statistk NAT",
+"label.issystem": "Er system",
+"label.isvolatile": "volatil",
+"label.item.listing": "Elementlisting",
+"label.japanese.keyboard": "Japansk-tastatur",
+"label.keep": "Behold",
+"label.keep.colon": "Behold:",
+"label.key": "N\u00f8kkel",
+"label.keyboard": "Tastaturspr\u00e5k",
+"label.keyboardtype": "Tastaturtype",
+"label.keypair": "SSH-n\u00f8kkelpar",
+"label.kvmnetworklabel": "KVM trafikketikett",
+"label.l2gatewayserviceuuid": "L2 Gateway tjeneste-uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Tjeneste Uuid",
+"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.updated": "Sist oppdatert",
+"label.lastname": "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\u00e6rrest tilkoblinger",
+"label.lb.algorithm.roundrobin": "Ringdistribusjon",
+"label.lb.algorithm.source": "Kilde",
+"label.lbdevicededicated": "Dedikert",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Lastbalanseringstype",
+"label.ldap.configuration": "LDAP-konfigurasjon",
+"label.ldap.group.name": "LDAP Gruppe",
+"label.ldap.port": "LDAP port",
+"label.level": "Niv\u00e5",
+"label.limitcpuuse": "CPU begrensning",
+"label.link.domain.to.ldap": "Knytt domene til LDAP",
+"label.linklocalip": "Link-lokal IP-adresse",
+"label.load.balancer": "Lastbalanserer",
+"label.load.balancing.policies": "Regler for lastbalansering",
+"label.loadbalancerinstance": "Tildelte VMer",
+"label.loadbalancerrule": "Lastbalanseringsregel",
+"label.loadbalancing": "Lastbalansering",
+"label.loading": "Laster",
+"label.local": "Lokal",
+"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.localstorageenabled": "Aktiver lokal lagring for bruker VMer",
+"label.localstorageenabledforsystemvm": "Aktiver lokal lagring for SystemVMer",
+"label.login": "Logg inn",
+"label.logout": "Logg ut",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC trafikk etikett",
+"label.make.project.owner": "Gj\u00f8r konto prosjekteier",
+"label.makeredundant": "Gj\u00f8r redundant",
+"label.manage": "Administrer",
+"label.manage.resources": "Behandle ressurser",
+"label.management": "Administrasjon",
+"label.management.ips": "Administrasjons IP-adresser",
+"label.management.server": "Administrasjonsserver",
+"label.max.primary.storage": "Maks prim\u00e6r (GiB)",
+"label.max.secondary.storage": "Maks sekund\u00e6r (GiB)",
+"label.maxcpu": "Maks CPU kjerner",
+"label.maxerrorretry": "Max Nyfors\u00f8k Etter Feilmelding",
+"label.maxguestslimit": "Maks antall gjester",
+"label.maximum": "Maksimum",
+"label.maxinstance": "Maks Instanser",
+"label.maxiops": "Maks IOPS",
+"label.maxmemory": "Maks minne (MiB)",
+"label.maxnetwork": "Maks nettverk",
+"label.maxpublicip": "Maks offentlige IPer",
+"label.maxsnapshot": "Maks \u00f8yeblikksbilder",
+"label.maxtemplate": "Maks maler",
+"label.maxuservm": "Maks bruker-VMer",
+"label.maxvolume": "Maks volumer",
+"label.maxvpc": "Maks VPCs",
+"label.may.continue": "Du kan n\u00e5 fortsette.",
+"label.memallocated": "Minneallokering",
+"label.memory": "Minne",
+"label.memory.total": "Minne totalt",
+"label.memory.used": "Minne brukt",
+"label.memoryallocated": "Minne allokert",
+"label.memoryallocatedgb": "Allokert",
+"label.memorylimit": "Minnebegrensning (MiB)",
+"label.memorymaxdeviation": "Avvik",
+"label.memorytotal": "Minne allokert",
+"label.memorytotalgb": "Totalt",
+"label.memoryusedgb": "Brukt",
+"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.destroyed.instances": "\u00d8delagte instanser",
+"label.menu.featured.isos": "Fremhevede ISOer",
+"label.menu.featured.templates": "Fremhevde maler",
+"label.menu.ipaddresses": "IP-adresser",
+"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.physical.resources": "Fysiske ressurser",
+"label.menu.regions": "Regioner",
+"label.menu.running.instances": "Kj\u00f8rende instanser",
+"label.menu.security.groups": "Sikkerhetsgrupper",
+"label.menu.service.offerings": "Tjenestetilbud",
+"label.menu.sshkeypair": "SSH n\u00f8kkelpar",
+"label.menu.stopped.instances": "Stoppede instanser",
+"label.menu.storage": "Lagring",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtuelle Apparater",
+"label.menu.virtual.resources": "Virtuelle ressurser",
+"label.metrics": "Beregninger",
+"label.metrics.cpu.allocated": "CPU-Allokasjon",
+"label.metrics.cpu.usage": "CPU-bruk",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Lese",
+"label.metrics.disk.usage": "Diskforbruk",
+"label.metrics.disk.write": "Skriv",
+"label.metrics.memory.usage": "Minneforbruk",
+"label.metrics.network.read": "Lese",
+"label.metrics.network.usage": "Nettverksforbruk",
+"label.metrics.network.write": "Skriv",
+"label.metrics.num.cpu.cores": "Kjerner",
+"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\u00e6rlagring.",
+"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.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": "Migrer volumet til en annen prim\u00e6rlagring.",
+"label.min.balance": "Minste balanse",
+"label.min.past.hour": "minutter etter time",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instanser",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minutt(er) etter hel time",
+"label.minutes.past.hour": "minutt(er) etter time",
+"label.monday": "Mandag",
+"label.monthly": "M\u00e5nedlig",
+"label.more.templates": "Flere maler",
+"label.move.down.row": "Flytt \u00e9n rad ned",
+"label.move.to.bottom": "Flytt til bunnen",
+"label.move.to.top": "Flytt til toppen",
+"label.move.up.row": "Flytt \u00e9n 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.optional": "Navn (Valgfritt)",
+"label.nat": "BigSwitch BCF NAT aktivert",
+"label.nat.port.range": "NAT portrekke",
+"label.netmask": "Nettmaske",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler detaljer",
+"label.network": "Nettverk",
+"label.network.acl": "Nettverk ACL",
+"label.network.acls": "Nettverk ACLer",
+"label.network.addvm": "Legg nettverk til VM",
+"label.network.desc": "Nettverksbeskrivelse",
+"label.network.details": "Nettverksdetaljer",
+"label.network.device": "Nettverksenhet",
+"label.network.device.type": "Type nettverksenhet",
+"label.network.domain": "Nettverksdomene",
+"label.network.label.display.for.blank.value": "Bruk standard gateway",
+"label.network.name": "Nettverksnavn",
+"label.network.offering": "Nettverkstilbud",
+"label.network.offering.details": "Nettverkstilbud detaljer",
+"label.network.offering.display.text": "Nettverkstilbud Forklaring",
+"label.network.offering.name": "Nettverkstilbud Navn",
+"label.network.offerings": "Nettverkstilbud",
+"label.network.service.providers": "Nettverktjenestetilbydere",
+"label.networkcidr": "Nettverk CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Nettverksdomene",
+"label.networkdomaintext": "Nettverksdomene",
+"label.networkid": "Nettverk",
+"label.networking.and.security": "Nettverk og sikkerhet",
+"label.networkkbsread": "Nettverk les",
+"label.networkkbswrite": "Nettverk skriveoperasjoner",
+"label.networklimit": "Nettverksbegrensninger",
+"label.networkname": "Nettverksnavn",
+"label.networkofferingdisplaytext": "Nettverkstilbud",
+"label.networkofferingid": "Nettverkstilbud",
+"label.networkofferingidtext": "Nettverkstilbud ID",
+"label.networkofferingname": "Nettverkstilbud",
+"label.networkrate": "Nettverks fart (MB/s)",
+"label.networkread": "Nettverk les",
+"label.networks": "Nettverk",
+"label.networktype": "Nettverkstype",
+"label.networkwrite": "Nettverk skriveoperasjoner",
+"label.new": "Ny",
+"label.new.password": "Nytt passord",
+"label.new.project": "Nytt prosjekt",
+"label.new.vm": "Ny VM",
+"label.newdiskoffering": "Nytt tilbud",
+"label.newsize": "Ny st\u00f8rrelse (GB)",
+"label.next": "Neste",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Lagring",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Sti",
+"label.nfscachezoneid": "Sone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "NIC adaptertype",
+"label.nicira.controller.address": "Kontrolleradresse",
+"label.nicira.nvp.details": "Nicira NVP detaljer",
+"label.nics": "NICer",
+"label.no": "Nei",
+"label.no.actions": "Ingen tilgjengelige handlinger",
+"label.no.alerts": "Ingen nylige alarmer",
+"label.no.data": "Ingen data \u00e5 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.none": "Ingen",
+"label.noselect": "Nei, takk",
+"label.not.found": "Ikke funnet",
+"label.notifications": "Notifikasjoner",
+"label.num.cpu.cores": "# av CPU-kjerner",
+"label.number": "#Regel",
+"label.number.of.clusters": "Antall klynger",
+"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.numberofrouterrequiresupgrade": "Totalt antall virtuelle routere som trenger oppgradering",
+"label.numretries": "Antall fors\u00f8k",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "av m\u00e5ned",
+"label.offerha": "Tilby HA",
+"label.ok": "OK",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight kontroller",
+"label.opendaylight.controllerdetail": "OpenDaylight kontrollerdetaljer",
+"label.opendaylight.controllers": "OpenDaylight kontrollere",
+"label.optional": "Valgfritt",
+"label.order": "Rekkef\u00f8lge",
+"label.oscategoryid": "OS-preferanse",
+"label.ostypeid": "OS-type",
+"label.ostypename": "OS-type",
+"label.other": "Andre",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Overstyr Gjeste Trafikk",
+"label.override.public.traffic": "Overstyr Offentlig Trafikk",
+"label.overrideguesttraffic": "Overstyr Gjeste Trafikk",
+"label.overridepublictraffic": "Overstyr Offentlig Trafikk",
+"label.ovm3cluster": "Innebygd Klynge Funksjon",
+"label.ovm3networklabel": "OVM3 trafikketikett",
+"label.ovm3pool": "Innebygd Pooling",
+"label.ovm3vip": "Hoved VIP IP",
+"label.ovmnetworklabel": "OVM trafikk etikett",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Offentlige IP-addresser i bruk",
+"label.owner.account": "Eierkonto",
+"label.owner.domain": "Eierdomene",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto detaljer",
+"label.palp": "Palo Alto logg profil",
+"label.parent.domain": "Foreldre domene",
+"label.parentname": "Forelder",
+"label.passive": "Passiv",
+"label.password": "Passord",
+"label.password.reset.confirm": "Passordet har blitt resatt til",
+"label.passwordenabled": "Passord Aktivert",
+"label.path": "Sti",
+"label.patp": "Palo Alto trussel profil",
+"label.pavr": "Virtuell ruter",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Fysisk nettverk",
+"label.physical.network.id": "Fysisk nettverksid",
+"label.physical.network.name": "Fysisk nettverksnavn",
+"label.physicalnetworkid": "Fysisk nettverk",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS passord",
+"label.ping.cifs.username": "PING CIFS brukernavn",
+"label.ping.dir": "PING-mappe",
+"label.ping.path": "Ping Sti",
+"label.ping.storage.ip": "PING lagrings-IP",
+"label.plannermode": "Planleggingsmodus",
+"label.please.complete.the.following.fields": "Vennligst fullf\u00f8rt f\u00f8lgende 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.podid": "Pod",
+"label.podname": "Pod navn",
+"label.pods": "Pods",
+"label.port": "Port",
+"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.portableipaddress": "Portabel IP-rekke",
+"label.portforwarding": "Portvideresending",
+"label.powerstate": "Power State",
+"label.presetup": "Forberedt Konfigurasjon",
+"label.prev": "Forrige",
+"label.previous": "Forrige",
+"label.primary.network": "Prim\u00e6rnettverk",
+"label.primary.storage": "Prim\u00e6rlagring",
+"label.primary.storage.allocated": "Prim\u00e6rlagring allokert",
+"label.primary.storage.count": "Prim\u00e6rlagrings Pool",
+"label.primary.storage.used": "Prim\u00e6rlagring brukt",
+"label.primarystoragelimit": "Prim\u00e6rlagring Maxgrense (GiB)",
+"label.primarystoragetotal": "Prim\u00e6rlagring",
+"label.private.gateway": "Privat Gateway",
+"label.private.interface": "Privat Grensesnitt",
+"label.private.ip.range": "Privat IP-rekke",
+"label.private.ips": "Private IP-adresser",
+"label.private.zone": "Privat sone",
+"label.privateinterface": "Privat Grensesnitt",
+"label.privateip": "Privat IP-adresse",
+"label.privatekey": "PKCS#8 Privat N\u00f8kkel",
+"label.privatenetwork": "Privat nettverk",
+"label.privateport": "Privat port",
+"label.profiledn": "Assosiert Profil",
+"label.profilename": "Profil",
+"label.project": "Prosjekt",
+"label.project.dashboard": "Prosjektoversikt",
+"label.project.invite": "Inviter til prosjekt",
+"label.project.name": "Prosjektnavn",
+"label.project.view": "Prosjektvisning",
+"label.projectid": "Prosjektid",
+"label.projects": "Prosjekter",
+"label.property": "Egenskap",
+"label.protocol": "Protokoll",
+"label.protocol.number": "Protokollnummer",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Tilbyder",
+"label.providername": "Tilbyder",
+"label.providers": "Tilbydere",
+"label.provisioningtype": "Provisjoneringstype",
+"label.public.interface": "Offentlig Grensesnitt",
+"label.public.ip": "Offentlig IP-adresse",
+"label.public.ip.addresses": "Offentlig IP-adresser",
+"label.public.ips": "Offentlig IP-adresser",
+"label.public.lb": "Offentlig LB",
+"label.public.load.balancer.provider": "Offentlig Lastbalanserer Tilbyder",
+"label.public.network": "Offentlig nettverk",
+"label.public.traffic": "Offentlig trafikk",
+"label.public.zone": "Offentlig sone",
+"label.publicinterface": "Offentlig Grensesnitt",
+"label.publicip": "IP-adresse",
+"label.publickey": "Offentlig n\u00f8kkel",
+"label.publicnetwork": "Offentlig nettverk",
+"label.publicport": "Offentlig port",
+"label.purpose": "Form\u00e5l",
+"label.pxe.server.type": "PXE Servertype",
+"label.qostype": "QoS Type",
+"label.quickview": "Hurtigvisning",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Tid (sekunder)",
+"label.quota": "Kvoteverdi",
+"label.quota.value": "Kvoteverdi",
+"label.quota.add.credits": "Legg til kreditt",
+"label.quota.configuration": "Kvotekonfigurasjon",
+"label.quota.configure": "Konfigurer Kvote",
+"label.quota.credits": "Kreditt",
+"label.quota.dates": "Oppdater datoer",
+"label.quota.description": "Kvotebeskrivelse",
+"label.quota.enddate": "Sluttdato",
+"label.quota.endquota": "Sluttkvote",
+"label.quota.enforce": "Tving Kvote",
+"label.quota.fullsummary": "Alle kontoer",
+"label.quota.remove": "Fjern Kvote",
+"label.quota.startdate": "Startdato",
+"label.quota.startquota": "Startkvote",
+"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.summary": "Sammendrag",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Rediger tariff",
+"label.quota.tariff.effectivedate": "Effektiv dato",
+"label.quota.totalusage": "Totalbruk",
+"label.quota.usage": "Kvoteforbruk",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx hemmelighet",
+"label.reason": "Reason",
+"label.reboot": "Restart",
+"label.receivedbytes": "Bytes Mottatt",
+"label.recent.errors": "Nylige feil",
+"label.recover.vm": "Gjenopprett VM",
+"label.redundantrouter": "Redundant ruter",
+"label.redundantrouterstate": "Redundant tilstand",
+"label.redundantstate": "Redundant tilstand",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Oppfrisk",
+"label.refresh.blades": "Oppdater blad(er)",
+"label.region": "Region",
+"label.region.details": "Regiondetaljer",
+"label.reinstall.vm": "Reinstaller VM",
+"label.related": "Relaterte",
+"label.relationaloperator": "Operat\u00f8r",
+"label.release.account": "Frigi fra Konto",
+"label.release.dedicated.cluster": "Frigj\u00f8r dedikert kluster",
+"label.release.dedicated.host": "Frigj\u00f8r dedikert host",
+"label.release.dedicated.pod": "Frigj\u00f8r Dedikert Pod",
+"label.release.dedicated.vlan.range": "Frigj\u00f8r dedikerte VLAN rekke",
+"label.release.dedicated.zone": "Frigj\u00f8r dedikert sone",
+"label.remind.later": "P\u00e5minn 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\u00f8kkelpar",
+"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.replace.acl": "Erstatt ACL",
+"label.replace.acl.list": "Erstatt ACL Liste",
+"label.required": "P\u00e5krevd",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Krever oppgradering",
+"label.reserved.system.gateway": "Reservert System Gateway",
+"label.reserved.system.ip": "Reservert System IP",
+"label.reserved.system.netmask": "Reservert system nettmaske",
+"label.reservediprange": "Reservert IP-rekke",
+"label.reservedsystemendip": "Siste reserverte system IP",
+"label.reservedsystemgateway": "Reservert System Gateway",
+"label.reservedsystemnetmask": "Reservert system nettmaske",
+"label.reservedsystemstartip": "F\u00f8rste reserverte system IP",
+"label.reset.ssh.key.pair": "Resett SSH-n\u00f8kkelpar",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH-n\u00f8kkelpar p\u00e5 VM",
+"label.reset.vpn.connection": "Resett VPN-tilkobling",
+"label.resetvm": "Resett VM",
+"label.resource": "Ressurs",
+"label.resource.limit.exceeded": "Ressursbegrensning Overskridet",
+"label.resource.limits": "Ressursbegrensninger",
+"label.resource.name": "Ressursnavn",
+"label.resourceid": "Ressurs ID",
+"label.resourcename": "Ressursnavn",
+"label.resources": "Ressurser",
+"label.resourcestate": "Ressurs Status",
+"label.response.timeout.in.sec": "Respons Tidsavbrudd (sekunder)",
+"label.restart.network": "Nettverksomstart",
+"label.restart.vpc": "Omstart VPC",
+"label.restartrequired": "Omstart p\u00e5krevd",
+"label.restore": "Gjenopprett",
+"label.retry.interval": "Nyfors\u00f8k Intervall",
+"label.review": "Gjennomg\u00e5",
+"label.revoke.project.invite": "Tilbakekall invitasjonen",
+"label.role": "Rolle",
+"label.rolename": "Rolle",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Rootsertifikat",
+"label.root.disk.offering": "Root disktilbud",
+"label.root.disk.size": "Rotdiskst\u00f8rrelse (GB)",
+"label.rootdiskcontrollertype": "Root diskkontroller",
+"label.rootdiskcontrollertypekvm": "Root diskkontroller",
+"label.router.vm.scaled.up": "RuterVM skalert opp",
+"label.routercount": "Total antall virtuelle rutere",
+"label.routerrequiresupgrade": "Oppgradering er p\u00e5krevd",
+"label.routertype": "Type",
+"label.routing.host": "Ruter Vert",
+"label.rule": "Rule",
+"label.rule.number": "Regelnummer",
+"label.rules": "Regler",
+"label.running": "Kj\u00f8rende VMer",
+"label.s3.access.key": "Aksessn\u00f8kkel",
+"label.s3.bucket": "B\u00f8tte",
+"label.s3.connection.timeout": "Tilkoblingsavbrudd",
+"label.s3.endpoint": "Endepunkt",
+"label.s3.max.error.retry": "Max Nyfors\u00f8k Etter Feilmelding",
+"label.s3.nfs.path": "S3 NFS Sti",
+"label.s3.nfs.server": "S3 NFS Server",
+"label.s3.secret.key": "Hemmelig n\u00f8kkel",
+"label.s3.socket.timeout": "Socket Tidsavbrudd",
+"label.s3.use.https": "Bruk HTTPS",
+"label.samlenable": "Autoriser SAML SSO",
+"label.samlentity": "Identitets Tilbydere",
+"label.saturday": "L\u00f8rdag",
+"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\u00f8k",
+"label.secondary.staging.store": "Sekund\u00e6rmellomlagringsomr\u00e5de",
+"label.secondary.staging.store.details": "Sekund\u00e6rmellomlagringsomr\u00e5de detaljer",
+"label.secondary.storage": "Sekund\u00e6rlagring",
+"label.secondary.storage.count": "Sekund\u00e6rlagrings Pool",
+"label.secondary.storage.details": "Sekund\u00e6rlagringsdetaljer",
+"label.secondary.storage.vm": "Sekund\u00e6rlagring VM",
+"label.secondary.used": "Sekund\u00e6rlagringsplass brukt",
+"label.secondaryips": "Sekund\u00e6re IPer",
+"label.secondarystoragelimit": "Sekund\u00e6rlagringsbregrensninger (GiB)",
+"label.secretkey": "Hemmelig n\u00f8kkel",
+"label.security.group.name": "Sikkerhetsgruppenavn",
+"label.security.groups": "Sikkerhetsgrupper",
+"label.security.groups.enabled": "Sikkerhetsgrupper Aktivert",
+"label.securitygroup": "Sikkerhetsgruppe",
+"label.securitygroups": "Sikkerhetsgrupper",
+"label.select": "Velg",
+"label.select-view": "Velg visning",
+"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.tier": "Velg gren",
+"label.select.vm.for.static.nat": "Velg instans for statisk NAT",
+"label.self": "Mine",
+"label.sent": "Sendt",
+"label.sentbytes": "Bytes sendt",
+"label.server": "Tjener",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "DIstribuert router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Niv\u00e5 VPC",
+"label.service.lb.elasticlbcheckbox": "Elastisk LB",
+"label.service.lb.inlinemodedropdown": "Modus",
+"label.service.lb.lbisolationdropdown": "LB-isolering",
+"label.service.offering": "Tjenestetilbud",
+"label.service.offering.details": "Tjenstetilbudsdetaljer",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundant ruter",
+"label.service.state": "Tjenestestatus",
+"label.service.staticnat.associatepublicip": "Assosiert Offentlig IP-adresse",
+"label.service.staticnat.elasticipcheckbox": "Elastisk IP",
+"label.servicecapabilities": "Tjeneste Evner",
+"label.servicelist": "Tjenester",
+"label.serviceofferingid": "Regnekraftstilbud",
+"label.serviceofferingname": "Regnekraftstilbud",
+"label.session.expired": "Sesjon utl\u00f8pt",
+"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.sharedexecutable": "Delt",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Vis ingressregel",
+"label.shrinkok": "Krympe OK",
+"label.shutdown.provider": "Steng tilbyder",
+"label.simplified.chinese.keyboard": "Forenklet kinesisk-tastatur",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.size": "St\u00f8rrelse",
+"label.sizegb": "St\u00f8rrelse",
+"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.smbdomain": "SMB Domene",
+"label.smbpassword": "SMB Passord",
+"label.smbusername": "SMB Brukernavn",
+"label.snapshot": "\u00d8yeblikksbilde",
+"label.snapshot.name": "\u00d8yeblikksbildenavn",
+"label.snapshot.schedule": "Sett Opp Gjentagende \u00f8yeblikksbilder",
+"label.snapshotlimit": "\u00d8yeblikksbildebegrensning",
+"label.snapshotmemory": "\u00d8yeblikksbilde av minne",
+"label.snapshots": "\u00d8yeblikksbilder",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNM Port",
+"label.sockettimeout": "Socket Tidsavbrudd",
+"label.source.nat.supported": "SourceNAT st\u00f8ttet",
+"label.sourcecidr": "Kilde-CIDR",
+"label.sourceipaddress": "Kilde IP-adresse",
+"label.sourcenat": "Kilde NAT",
+"label.sourcenattype": "Supporterte kilde-NAT typer",
+"label.sourceport": "Kildeport",
+"label.specify.vxlan": "Spesifiser VXLAN",
+"label.specifyipranges": "Spesifiser IP-rekker",
+"label.specifyvlan": "Spesifiser VLAN",
+"label.sr.name": "SR navnelapp",
+"label.srx": "SRX",
+"label.srx.details": "SRX detaljer",
+"label.ssh.key.pair.details": "SSH-n\u00f8kkelpardetaljer",
+"label.ssh.key.pairs": "SSH n\u00f8kkelpar",
+"label.sshkeypair": "Nytt SSH-n\u00f8kkelpar",
+"label.standard.us.keyboard": "Standard (Amerikansk) tastatur",
+"label.start.ip": "Start-IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "F\u00f8rste reserverte system IP",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "Etter dato (start)",
+"label.startip": "Start-IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start port",
+"label.startquota": "Kvoteverdi",
+"label.state": "Status",
+"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.method": "Klebrighetmetode",
+"label.sticky.cookie-name": "Cookie navn",
+"label.sticky.expire": "Utl\u00f8per",
+"label.sticky.holdtime": "Oppholds tid",
+"label.sticky.indirect": "Indirekte",
+"label.sticky.length": "Lengde",
+"label.sticky.name": "Sticky Navn",
+"label.sticky.nocache": "Ingen cache",
+"label.sticky.postonly": "Send bare",
+"label.sticky.prefix": "Prefiks",
+"label.sticky.request-learn": "L\u00e6r Foresp\u00f8rsel",
+"label.sticky.tablesize": "Tabellst\u00f8rrelse",
+"label.stop": "Stopp",
+"label.stop.lb.vm": "Stop LB VM",
+"label.stopped": "Stoppede VMer",
+"label.storage": "Lagring",
+"label.storage.tags": "Merkelapper for lagring",
+"label.storage.traffic": "Lagringstrafikk",
+"label.storageid": "Prim\u00e6rlagring",
+"label.storagepool": "Lagringspool",
+"label.storagetags": "Merkelapper for lagring",
+"label.storagetype": "Lagringstype",
+"label.subdomainaccess": "Tilgang for underdomene",
+"label.submit": "Send",
+"label.submitted.by": "[Innsendt av: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Vellykket",
+"label.sunday": "S\u00f8ndag",
+"label.supportedservices": "St\u00f8ttede Tjenester",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "St\u00f8tter Region Niv\u00e5 VPC",
+"label.supportsstrechedl2subnet": "St\u00f8tter strekket L2 subnett",
+"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.offerings": "Systemtilbud",
+"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.vms": "System VMer",
+"label.system.wide.capacity": "Systemomfattende kapasistet",
+"label.systemvmtype": "SystemVM-type",
+"label.tag.key": "Merkelapp Key",
+"label.tag.value": "Tag Verdi",
+"label.tagged": "Tagget",
+"label.tags": "Tagger",
+"label.target.iqn": "M\u00e5l IQN",
+"label.tariffvalue": "Tariffverdi",
+"label.task.completed": "Oppgave utf\u00f8rt",
+"label.template": "Mal",
+"label.templatebody": "Innhold",
+"label.templatedn": "Velg Mal",
+"label.templatefileupload": "Lokal fil",
+"label.templatelimit": "Malbegrensninger",
+"label.templatename": "Mal",
+"label.templatenames": "Mal",
+"label.templates": "Maler",
+"label.templatesubject": "Emne",
+"label.templatetotal": "Mal",
+"label.templatetype": "Epostmal",
+"label.tftp.dir": "TFTP-mappe",
+"label.tftpdir": "TFTP rot-mappe",
+"label.theme.default": "Standardtema",
+"label.theme.grey": "Tilpasset - Gr\u00e5",
+"label.theme.lightblue": "Tilpasset - Lys Gr\u00e5",
+"label.threshold": "Terskel",
+"label.thursday": "Torsdag",
+"label.tier.details": "VPC-gren detaljer",
+"label.tiername": "Gren",
+"label.time": "Tid",
+"label.time.colon": "Time:",
+"label.timeout": "Tidsavbrudd",
+"label.timeout.in.second ": " Tidsavbrudd (sekunder)",
+"label.timezone": "Tidssone",
+"label.timezone.colon": "Tidssone:",
+"label.token": "Kode",
+"label.total.hosts": "Totalt Verter",
+"label.total.memory": "Totalt minne",
+"label.total.storage": "Totalt lagring",
+"label.total.vms": "Totalt VMs",
+"label.totalcpu": "Totalt CPU",
+"label.traffic.label": "Trafikketikett",
+"label.traffic.types": "Trafikktyper",
+"label.traffictype": "Trafikktype",
+"label.transportzoneuuid": "Transport sone Uuid",
+"label.tuesday": "Tirsdag",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK-tastatur",
+"label.unavailable": "Utilgjengelig",
+"label.unhealthy.threshold": "Usunn Terskel",
+"label.unit": "Bruksenhet",
+"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.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.sanity.result": "Forbruks Tilregnelighet Resultat",
+"label.usage.server": "Forbruksserver",
+"label.usageinterface": "Brukergrensesnitt",
+"label.usagename": "Brukstype",
+"label.usageunit": "Enhet",
+"label.use.vm.ip": "Bruk VM IP:",
+"label.use.vm.ips": "Bruk VM IPer",
+"label.usehttps": "Bruk HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Bruker",
+"label.user.details": "Brukerdetaljer",
+"label.user.vm": "Bruker VM",
+"label.userdata": "Brukerdata",
+"label.userdatal2": "Brukerdata",
+"label.username": "Brukernavn",
+"label.users": "Brukere",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi vert",
+"label.vcenterpassword": "vCenter passord",
+"label.vcenterusername": "vCenter brukernavn",
+"label.vcipaddress": "vCenter IP-adresse",
+"label.vcsdeviceid": "ID",
+"label.version": "Versjon",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "Maks oppl\u00f8sning",
+"label.vgpu.max.vgpu.per.gpu": "VGPUs per GPU",
+"label.vgpu.remaining.capacity": "Gjenst\u00e5ende kapasitet",
+"label.vgpu.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"label.view": "Vis",
+"label.view.all": "Vis alle",
+"label.view.console": "Se konsoll",
+"label.view.more": "Vis mer",
+"label.view.secondary.ips": "Se sekund\u00e6re 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.routers": "Virtuelle rutere",
+"label.virtual.routers.group.account": "Virtuelle rutere gruppert p\u00e5 konto",
+"label.virtual.routers.group.cluster": "Virtuelle rutere gruppert p\u00e5 kluster",
+"label.virtual.routers.group.pod": "Virtuelle rutere gruppert p\u00e5 pod",
+"label.virtual.routers.group.zone": "Virtuelle rutere gruppert p\u00e5 sone",
+"label.virtualmachinedisplayname": "VM-navn",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI Rekke",
+"label.vlan.range.details": "VLAN-rekke detaljer",
+"label.vlan.vni.ranges": "VLAN/VNI Rekke(r)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Rekke",
+"label.vm.add": "Legg til Instans",
+"label.vm.destroy": "Destruer",
+"label.vm.password": "Passord til VM er",
+"label.vm.reboot": "Restart",
+"label.vm.snapshots": "VM \u00d8yeblikksbilder",
+"label.vm.start": "Start",
+"label.vm.stop": "Stopp",
+"label.vmdisplayname": "Visningsnavn for VM",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS lagringsomr\u00e5de",
+"label.vmipaddress": "VM IP-adresse",
+"label.vmlimit": "Instans Begrensninger",
+"label.vmname": "VM-navn",
+"label.vms": "VMer",
+"label.vms.in.tier": "VMer i VPC-gren",
+"label.vmstate": "VM-status",
+"label.vmtotal": "Totalt av VM",
+"label.vmwaredcid": "VMware datasenter ID",
+"label.vmwaredcname": "VMware datasenternavn",
+"label.vmwaredcvcenter": "VMware datasenter vcenter",
+"label.vmwarenetworklabel": "VMware trafikketikett",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC enheter",
+"label.volgroup": "Volumgruppe",
+"label.volume": "Volum",
+"label.volume.details": "Volumdetaljer",
+"label.volume.migrated": "Volum migrert",
+"label.volumechecksum": "MD5 sjekksum",
+"label.volumefileupload": "Lokal fil",
+"label.volumegroup": "Volumgruppe",
+"label.volumelimit": "Volumbegrensninger",
+"label.volumename": "Volumnavn",
+"label.volumes": "Volumer",
+"label.volumetotal": "Volum",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC tilbudsdetaljer",
+"label.vpc.offerings": "VPC tilbud",
+"label.vpc.router.details": "VPC ruterdetaljer",
+"label.vpc.virtual.router": "VPC virtuell ruter",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC begrensninger",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC tilbud",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN-tilkobling",
+"label.vpn.gateway": "VPN Gateway",
+"label.vpncustomergatewayid": "VPN Kundegateway",
+"label.vsmctrlvlanid": "Kontroll VLAN ID",
+"label.vsmdeviceid": "Navn",
+"label.vsmdevicestate": "Status",
+"label.vsmipaddress": "Nexus 1000v IP Addresse",
+"label.vsmpassword": "Nexus 1000v Passord",
+"label.vsmpktvlanid": "Pakke VLAN ID",
+"label.vsmstoragevlanid": "Lagrings VLAN ID",
+"label.vsmusername": "Nexus 1000v Brukernavn",
+"label.vsmusername.req": "Nexus 1000v Brukernavn",
+"label.vsphere.managed": "Administrert Av vSphere",
+"label.vswitch.name": "vSwitch navn",
+"label.vswitch.type": "vSwitch type",
+"label.vswitchguestname": "Gjestetrafikk vSwitch Navn",
+"label.vswitchguesttype": "Gjestetrafikk vSwitch Type",
+"label.vswitchpublicname": "Offentlig Trafikk vSwitch Navn",
+"label.vswitchpublictype": "Offentlig Trafikk vSwitch Type",
+"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.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer trafikketikett",
+"label.xenservertoolsversion61plus": "Original XS versjon er 6.1+",
+"label.yes": "Ja",
+"label.zone": "Sone",
+"label.zone.dedicated": "Dedikert sone",
+"label.zone.details": "Sonedetaljer",
+"label.zone.id": "Sone ID",
+"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.zoneid": "Sone",
+"label.zonename": "Sone",
+"label.zonenamelabel": "Sonenavn",
+"label.zones": "Soner",
+"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\u00e6r og sekund\u00e6rlagringsservere, slik som VM-maler og \u00f8yeblikksbilder.",
+"message.acquire.ip.nic": "Vennligst bekreft at du vil allokere en ny sekund\u00e6r IP for dette nettverkskortet. <br />NB: Du m\u00e5 manuelt konfigurere den nye sekund\u00e6r-IPen i den virtuelle maskinen.",
+"message.acquire.new.ip": "Vennligst bekreft at du \u00f8nsker \u00e5 anskaffe en ny IP for dette nettverket",
+"message.acquire.new.ip.vpc": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 kansellere dette vedlikeholdet.",
+"message.action.change.service.warning.for.instance": "Din instans m\u00e5 v\u00e6re stopped f\u00f8r du fors\u00f8ker \u00e5 endret n\u00e5v\u00e6rende tjenestetilbud.",
+"message.action.change.service.warning.for.router": "Din ruter m\u00e5 v\u00e6re stoppet f\u00f8r du kan fors\u00f8ke \u00e5 endre n\u00e5v\u00e6rende tjenestetilbud.",
+"message.action.delete.cluster": "Vennligst bekreft at du vil slette denne klyngen.",
+"message.action.delete.disk.offering": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00e5 legge tilbake den samme eksterne brannmuren, m\u00e5 du resette bruksdataene p\u00e5 enheten.",
+"message.action.delete.external.load.balancer": "Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne eksterne lastbalansereren. Advarsel: hvis du planlegger \u00e5 legge til den samme eksterne lastbalansereren senere, m\u00e5 du resette bruksdataene p\u00e5 enheten.",
+"message.action.delete.ingress.rule": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne inng\u00e5ende regel.",
+"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 \u00f8nsker \u00e5 slette den fra alle soner.",
+"message.action.delete.network": "Vennligst bekreft at du vil slette dette nettverket.",
+"message.action.delete.nexusvswitch": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne nexus 1000v",
+"message.action.delete.physical.network": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 slette denne prim\u00e6rlagring.",
+"message.action.delete.secondary.storage": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne sekund\u00e6rlagring.",
+"message.action.delete.security.group": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne sikkerhetsgruppe.",
+"message.action.delete.service.offering": "Vennligst bekreft at du \u00f8nsker \u00e5 slette dette tjenestetilbud.",
+"message.action.delete.snapshot": "Vennligst bekreft at du \u00f8nsker \u00e5 slette dette \u00f8yeblikksbildet.",
+"message.action.delete.system.service.offering": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 slette denne sone.",
+"message.action.destroy.instance": "Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne instansen.",
+"message.action.destroy.systemvm": "Vennligst bekreft at du \u00f8nsker \u00e5 \u00f8delegge denne System VM.",
+"message.action.destroy.volume": "Please confirm that you want to destroy this volume.",
+"message.action.disable.cluster": "Vennligst bekreft at du \u00f8nsker \u00e5 detaktivere denne klyngen.",
+"message.action.disable.nexusvswitch": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne nexus 1000v",
+"message.action.disable.physical.network": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere dette fysiske nettverket.",
+"message.action.disable.pod": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne poden",
+"message.action.disable.static.nat": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere statisk NAT.",
+"message.action.disable.zone": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne sonen.",
+"message.action.download.iso": "Vennligst bekreft at du \u00f8nsker \u00e5 laste ned denne ISO.",
+"message.action.download.template": "Vennligst bekreft at du \u00f8nsker \u00e5 laste ned denne malen.",
+"message.action.downloading.template": "Laster ned mal.",
+"message.action.enable.cluster": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 aktivere denne nexus 1000v",
+"message.action.enable.physical.network": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere dette fysiske nettverket.",
+"message.action.enable.pod": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne poden.",
+"message.action.enable.zone": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00e5 koble til p\u00e5 nytt. Denne prosessen kan ta noen minutter.",
+"message.action.host.enable.maintenance.mode": "Aktivering av vedlikeholdsmodus vil for\u00e5rsake migrering av alle kj\u00f8rende instanser p\u00e5 denne vert til hvilken som helst annen tilgjengelig vert.",
+"message.action.instance.reset.password": "Vennligst bekreft ay du \u00f8nsker \u00e5 endre ROOT-passordet for denne virtuelle maskin.",
+"message.action.manage.cluster": "Vennligst bekreft at du \u00f8nsker \u00e5 administrere klyngen.",
+"message.action.primarystorage.enable.maintenance.mode": "Advarsel: setting av prim\u00e6rlagring i vedlikeholdsmodus vil for\u00e5rsake at alle VMer som benytter volum fra det vil bli stoppet. \u00d8nsker du \u00e5 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 \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 frigi denne IP.",
+"message.action.remove.host": "Vennligst bekreft at du vil gjerne denne tjeneren.",
+"message.action.reset.password.off": "Din instans st\u00f8tter forel\u00f8pig ikke denne funksjonen.",
+"message.action.reset.password.warning": "Din instans m\u00e5 v\u00e6re stoppet f\u00f8r man fors\u00f8ker \u00e5 bytte n\u00e5v\u00e6rende passord.",
+"message.action.restore.instance": "Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette denne instansen.",
+"message.action.revert.snapshot": "Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette volumet til dette \u00f8yeblikksbildet.",
+"message.action.start.instance": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 stoppe denne ruteren.",
+"message.action.stop.systemvm": "Vennligst bekreft at du vil stoppe denne system VM.",
+"message.action.unmanage.cluster": "Vennligst bekreft at du ikke \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 slette dette VM \u00f8yeblikksbildet.",
+"message.action.vmsnapshot.revert": "Tilbakestill VM \u00f8yeblikksbilde",
+"message.activate.project": "Er du sikker p\u00e5 du \u00f8nsker \u00e5 aktivere dette prosjektet?",
+"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\u00f8lgende parametere for \u00e5 legge til et nytt disktjenestetilbud",
+"message.add.domain": "Vennligst bekreft underdomenet du \u00f8nsker \u00e5 opprette under dette domenet",
+"message.add.firewall": "Legg en brannmur til sonen",
+"message.add.guest.network": "Vennligst bekreft at du \u00f8nsker \u00e5 legge til gjestenettverk",
+"message.add.host": "Vennligst spesifiser f\u00f8lgende parametere for \u00e5 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\u00f8lgende p\u00e5krevd informasjon for \u00e5 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\u00e5 inneholde en eller flere pods, og vi legger til den f\u00f8rste poden n\u00e5. En pod inneholder verter og prim\u00e6rlagring, som du legger til i et senere steg.F\u00f8rst, konfigurer en rekke med reserverte IP-adresser for CloudStacks interne administrasjonstrafikk. Den reserverte IP-rekken m\u00e5 v\u00e6re unik for hver sone i en sky.",
+"message.add.primary": "Vennligst spesifiser f\u00f8lgende paramtere for \u00e5 legge til ny hovedlagring.",
+"message.add.primary.storage": "Legg til ny prim\u00e6rlagring for sone <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
+"message.add.region": "Vennligst spesifiser f\u00f8lgende p\u00e5krevd informasjon for \u00e5 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\u00f8lgende data for \u00e5 legge til et nytt datakraftstilbud.",
+"message.add.system.service.offering": "Vennligst skriv inn f\u00f8lgende data for \u00e5 legge til et nytt systemtjenestetilbud.",
+"message.add.template": "Vennligst skriv inn f\u00f8lgende data for \u00e5 opprette din nye mal",
+"message.add.volume": "Vennligst skriv inn f\u00f8lgende data for \u00e5 legge til et nytt volum.",
+"message.add.vpn.gateway": "Vennligst bekreft at du \u00f8nsker \u00e5 legge til en VPN Gateway",
+"message.added.vpc.offering": "La til VPC tilbud",
+"message.adding.host": "Legger til vert",
+"message.adding.netscaler.device": "Legg til NetScaler-enhet",
+"message.adding.netscaler.provider": "Legger til Netscaler tilbyder",
+"message.additional.networks.desc": "Vennligst velg tilleggsnettverk som din virtuelle instans vil v\u00e6re tilkoblet.",
+"message.admin.guide.read": "For VMware-baserte VMer, vennligst les avsnittet om dynamisk skalering i administrasjonsdokumentasjonen f\u00f8r skalering. \u00d8nsker du \u00e5 fortsette?,",
+"message.advanced.mode.desc": "Velg denne nettverksmodellen hvis du \u00f8nsker \u00e5 aktivere VLAN-st\u00f8tte. Denne nettverksmodellen gir den st\u00f8rste fleksibiliteten ved \u00e5 tillate administatorer \u00e5 lage egne nettverkstilbud som \u00e5 tilby brannmur, vpn og lastbalanserings-st\u00f8tte s\u00e5 vel som \u00e5 tillate direkte mot virtuelt nettverk.",
+"message.advanced.security.group": "Velg dette hvis du \u00f8nsker \u00e5 bruke sikkerhetsgrupper for \u00e5 tilby gjeste-VM isolering.",
+"message.advanced.virtual": "Velg dette hvis du \u00f8nsker \u00e5 bruke soneomfattende VLAN for \u00e5 tilby gjeste-VM isolering.",
+"message.after.enable.s3": "S3-st\u00f8ttet sekund\u00e6rlagring konfigurert. Merk: N\u00e5r du forlater denne siden s\u00e5 vil det ikke v\u00e6re mulig \u00e5 konfigurere S3 p\u00e5 nytt.",
+"message.after.enable.swift": "Swift konfigurert. Merk: N\u00e5r du forlater denne siden s\u00e5 vil det ikke v\u00e6re mulig konfigurere Swift p\u00e5 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\u00e5v\u00e6rende \u00f8yeblikksbilde 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\u00f8lgende data for \u00e5 tilknytte et nytt volum. Hvis du tilknytter et diskvolum til en Windows-basert virtuell maskin s\u00e5 er du n\u00f8dt til \u00e5 restarte instansen for \u00e5 se den tilknyttede disken.",
+"message.basic.mode.desc": "Velg denne nettverksmodellen hvis du <b>*<u>ikke</u>*</b> vil aktivere VLAN st\u00f8tte. Alle virtuelle instnanser opprettet under denne nettverksmodellen vil bli tildelt en IP direkte fra nettverket og sikkerhetsgrupper blir benyttet for \u00e5 tilby sikkerhet og segregering.",
+"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 \u00e5 klikke p\u00e5 Rediger-knappen.",
+"message.configure.firewall.rules.allow.traffic": "Konfigurer reglene for \u00e5 tillate trafikk",
+"message.configure.firewall.rules.block.traffic": "Konfigurer reglene for \u00e5 blokkere trafikk",
+"message.configure.ldap": "Bekreft at du \u00f8nsker \u00e5 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 \u00f8nsker \u00e5 tvinge et nytt tilkoblingsfors\u00f8k for denne vert.",
+"message.confirm.add.vnmc.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 installere denne VNMC tilbyderen.",
+"message.confirm.archive.alert": "Vennlgist bekreft at du vil arkivere denne varslingen.",
+"message.confirm.archive.event": "Vennligst bekreft at du \u00f8nsker \u00e5 arkivere denne hendelsen.",
+"message.confirm.archive.selected.alerts": "Vennligst bekreft at du \u00f8nsker \u00e5 arkivere valgte varsler",
+"message.confirm.archive.selected.events": "Vennligst bekreft at du vil arkivere valgte hendelser",
+"message.confirm.attach.disk": "Er du sikker p\u00e5 at du vil tildele disk?",
+"message.confirm.create.volume": "Er du sikker p\u00e5 at du vil opprette volum?",
+"message.confirm.current.guest.cidr.unchanged": "\u00d8nsker du \u00e5 beholde n\u00e5v\u00e6rende 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": "\u00d8nsker du virkelig \u00e5 dedikere denne verten til et domene/konto?",
+"message.confirm.dedicate.pod.domain.account": "\u00d8nsker du virkelig \u00e5 dedikere denne pod til et domene/konto?",
+"message.confirm.dedicate.zone": "\u00d8nsker du virkelig \u00e5 dedikere denne sonen til et domene/konto?",
+"message.confirm.delete.acl.list": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 slette denne ACL listen?",
+"message.confirm.delete.alert": "Er du sikker p\u00e5 at du vil slette denne varslingen ?",
+"message.confirm.delete.baremetal.rack.configuration": "Vennligst bekreft at du \u00f8nsker \u00e5 slette Bare Metal-konfigurasjonen.",
+"message.confirm.delete.bigswitchbcf": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne BigSwitch BCF Controlleren?",
+"message.confirm.delete.brocadevcs": "Vennligst bekreft at du vil slette denne Brocade Vcs svitsjen",
+"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.f5": "Vennligst bekreft at du \u00f8nsker \u00e5 slette F5",
+"message.confirm.delete.internal.lb": "Vennligst bekreft at du \u00f8nsker \u00e5 slette Intern LB",
+"message.confirm.delete.netscaler": "Vennligst bekreft at du \u00f8nsker \u00e5 slette Netscaler",
+"message.confirm.delete.pa": "Vennligst bekreft at du vil slette Palo Alto",
+"message.confirm.delete.secondary.staging.store": "Vennligst bekreft at du vil slette dette sekund\u00e6rmellomlagringsomr\u00e5de.",
+"message.confirm.delete.srx": "Vennligst bekreft at du \u00f8nsker \u00e5 slette SRX",
+"message.confirm.delete.ucs.manager": "Vennligst bekreft at du \u00f8nsker \u00e5 slette UCS Manager",
+"message.confirm.destroy.router": "Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne ruteren",
+"message.confirm.disable.host": "Vennligst bekreft at du vil detaktivere denne vert",
+"message.confirm.disable.network.offering": "Er du sikker p\u00e5 at du vil deaktivere dette nettverkstilbudet?",
+"message.confirm.disable.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne tilbyderen",
+"message.confirm.disable.vnmc.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne VNMC tilbyderen.",
+"message.confirm.disable.vpc.offering": "Er du sikker p\u00e5 at du vil deaktivere dette VPC tilbudet?",
+"message.confirm.enable.host": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere verten",
+"message.confirm.enable.network.offering": "Vil du aktivere dette nettverkstilbudet?",
+"message.confirm.enable.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne tilbyderen",
+"message.confirm.enable.vnmc.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne VNMC tilbyderen.",
+"message.confirm.enable.vpc.offering": "Er du sikker p\u00e5 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 \u00f8nsker \u00e5 delta i dette prosjektet.",
+"message.confirm.migrate.volume": "\u00d8nsker du \u00e5 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": "\u00d8nsker du \u00e5 frigi denne dedikerte verten ?",
+"message.confirm.release.dedicated.pod": "\u00d8nsker du \u00e5 frigi denne dedikerte poden ?",
+"message.confirm.release.dedicated.zone": "\u00d8nsker du \u00e5 frigi denne dedikerte sonen ?",
+"message.confirm.remove.event": "Er du sikker p\u00e5 at du vil fjerne denne hendelsen?",
+"message.confirm.remove.ip.range": "Vennligst bekreft du til fjerne denne IP-rangen.",
+"message.confirm.remove.load.balancer": "Vennligst bekreft at du vil fjerne VM fra lastbalanserer",
+"message.confirm.remove.network.offering": "Er du sikker p\u00e5 at du vil fjerne dette nettverkstilbudet?",
+"message.confirm.remove.selected.alerts": "Vennligst bekreft at du \u00f8nsker \u00e5 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\u00e5 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": "\u00d8nsker du \u00e5 skalere opp denne Ruter-VMen?",
+"message.confirm.scale.up.system.vm": "\u00d8nsker du \u00e5 skalere opp denne system VM?",
+"message.confirm.shutdown.provider": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00e5 bruke nyere mal",
+"message.confirm.upgrade.routers.account.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne kontoen til \u00e5 bruke en nyere mal",
+"message.confirm.upgrade.routers.cluster.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne klyngen til \u00e5 bruke en nyere mal",
+"message.confirm.upgrade.routers.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne sonen til \u00e5 bruke en nyere mal",
+"message.confirm.upgrade.routers.pod.newtemplate": "Vennligst bekreft at du vil oppgradere alle rutere i denne pod til \u00e5 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": "\u00d8nsker du \u00e5 kopiere malen?",
+"message.create.template": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 lage malen?",
+"message.create.template.vm": "Lage VM fra template <b id=\"p_name\"></b>",
+"message.create.template.volume": "Vennligst spesifiser f\u00f8lgende informasjon f\u00f8r 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\u00f8rrelsen p\u00e5 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\u00e6rlagring",
+"message.creating.secondary.storage": "Oppretter sekund\u00e6rlagring",
+"message.creating.systemvm": "Oppretter system-VMer (dette kan ta litt tid)",
+"message.creating.zone": "Oppretter sone",
+"message.dedicate.zone": "Dedikerer sone",
+"message.dedicated.zone.released": "Sone dedikering frigitt",
+"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 \u00f8nsker \u00e5 slette gateway",
+"message.delete.project": "Er du sikker p\u00e5 du \u00f8nsker \u00e5 slette dette prosjektet?",
+"message.delete.user": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne bruker.",
+"message.delete.vpn.connection": "Vennligst bekreft at du \u00f8nsker \u00e5 slette VPN-tilkobling",
+"message.delete.vpn.customer.gateway": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne VPN gatewayen",
+"message.delete.vpn.gateway": "Vennligst bekreft at du \u00f8nsker \u00e5 slette denne VPN gatewayen",
+"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\u00e5 lag-3 ved hjelp av sikkerhetsgrupper (IP-adresse kilde-filtrering).",
+"message.desc.cluster": "Hver pod m\u00e5 inneholde en eller flere pods, og vi vil installere den f\u00f8rste klyngen n\u00e5. En klynge har til form\u00e5l \u00e5 samle en gruppe hypervisor verter. All vertene i en klynge m\u00e5 ha identisk marskinvare, kj\u00f8re samme hypervisor, v\u00e6re p\u00e5 samme nettverk, og ha tilgang til den samme prim\u00e6rlagringsenheten. Hver klynge best\u00e5r av en eller flere verter og en eller flere prim\u00e6rlagrings verter.",
+"message.desc.create.ssh.key.pair": "Vennligst fyll inn f\u00f8lgende data for \u00e5 opprette eller registrere et ssh-n\u00f8kkelpar. <br><br>(1) Hvis offentlig n\u00f8kkel er valgt s\u00e5 vil CloudStack registrere den offentlige n\u00f8kkelen. Du kan bruke den igjennom din private n\u00f8kkel.<br><br>(2) Hvis offentlig n\u00f8kkel ikke er valgt s\u00e5 vil CloudStack opprette et SSH-n\u00f8kkelpar. I dette tilfellet, vennligst kopier og ta v\u00e6re p\u00e5 den private n\u00f8kkelen. CloudStack vil ikke ta vare p\u00e5 den.<br>",
+"message.desc.created.ssh.key.pair": "Laget et SSH-n\u00f8kkelpar.",
+"message.desc.host": "Hver klynge m\u00e5 inneholde minst en vert (datamaskin) for gjester \u00e5 kj\u00f8re p\u00e5, og vi legger til den f\u00f8rste n\u00e5. For at en vert skal fungere i CloudStack m\u00e5 du installere hypervisor-programvare p\u00e5 den, tildele en IP-adresse og s\u00f8rge for at den er tilkoblet CloudStacks administrasjonsserver.<br/><br/>Oppgi vertens DNS- eller IP-adresse, brukernavnet (vanligvis root) og passord, og eventuelle etiketter du \u00f8nsker \u00e5 kategorisere den med.",
+"message.desc.primary.storage": "Hver klynge m\u00e5 inneholde en eller flere prim\u00e6rlagringer, og vi skal legge til den f\u00f8rste n\u00e5. Prim\u00e6rlagring inneholder diskvolumer for alle maskiner som kj\u00f8rer p\u00e5 verter i klyngen. Bruk hvilken som helst standard-protokoll den underliggende hypervisoren st\u00f8tter.",
+"message.desc.reset.ssh.key.pair": "Vennligst spesifiser et ssh n\u00f8kkelpar 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\u00e5 ha minst en NFS eller sekund\u00e6rlagringsserver og vi vil legge til den f\u00f8rste n\u00e5. Sekund\u00e6rlingsserveren lagrer VM-maler, ISO-bilder og VM-disk \u00f8yeblikksbilder. Denne serveren m\u00e5 v\u00e6re tilgjengelig for alle verter i denne sonen. <br/><br/>Oppgi IP-adresseng og eksportert sti.",
+"message.desc.zone": "En sone er den st\u00f8rste gruppe enheten i en CloudStack installasjon. En sone er typisk sett p\u00e5 som et datasenter,  og gir bedre p\u00e5litelighet gjennom isolasjon og redundans. En sone best\u00e5r av en eller flere pods (hver pod inneholder hypervisor verter og prim\u00e6rlagringsenheter) og en sekund\u00e6rlagringsenhet som er delt mellom alle pods i sonen.",
+"message.detach.disk": "Er du sikker p\u00e5 at du \u00f8nsker \u00e5 frakoble denne disken?",
+"message.detach.iso.confirm": "Vennligst bekreft at du \u00f8nsker \u00e5 frakoble ISOen fra denne virtuelle instansen.",
+"message.disable.account": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne kontoen. Ved \u00e5 deaktivere kontoen s\u00e5 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\u00e5v\u00e6rende \u00f8yeblikksbilde policyen.",
+"message.disable.user": "Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne bruker.",
+"message.disable.vpn": "Er du sikker p\u00e5 at du vil deaktivere VPN?",
+"message.disable.vpn.access": "Vennligst bekreft at du \u00f8nsker \u00e5 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 \u00e5 laste ned ISO",
+"message.download.template": "Vennligst klikk <a href=\"#\">00000</a> for \u00e5 laste ned mal",
+"message.download.volume": "Vennligst klikk <a href=\"#\">00000</a> for \u00e5 laste ned volumet",
+"message.download.volume.confirm": "Vennligst bekreft at du \u00f8nsker \u00e5 laste ned dette volumet.",
+"message.edit.account": "Oppdater (\"-1\" indikerer at det ikke er satt \u00f8vre grense for resursbruk)",
+"message.edit.confirm": "Vennligst bekreft dine endringer f\u00f8r du klikker \"Lagre\".",
+"message.edit.limits": "Oppdater \u00f8vre grense for resursbruk. \"-1\" indikerer at det ikke er satt \u00f8vre grense.",
+"message.edit.traffic.type": "Vennligst oppgi trafikk-etiketten du \u00f8nsker knyttet til denne trafikktypen.",
+"message.enable.account": "Bekreft at du \u00f8nsker \u00e5 aktivere denne kontoen.",
+"message.enable.user": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne bruker.",
+"message.enable.vpn": "Vennligst bekreft at du \u00f8nsker \u00e5 aktivere VPN-tilgang for denne IP-adressen",
+"message.enable.vpn.access": "VPN er deaktivert for denne IP-adressen. \u00d8nsker du \u00e5 aktivere VPN-tilgang?",
+"message.enabled.vpn": "Din fjerntilkoblings-VPN er aktivert og kan n\u00e5s via IPen",
+"message.enabled.vpn.ip.sec": "Din IPSec delte n\u00f8kkel (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 \u00f8nsker \u00e5 generere nye n\u00f8kler 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\u00f8rg 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\u00e5 knappen for \u00e5 pr\u00f8ve oppstart p\u00e5 nytt.",
+"message.installwizard.copy.whatisacluster": "En klynge har til form\u00e5l \u00e5 samle en gruppe hypervisor verter. All vertene i en klynge m\u00e5 ha identisk marskinvare, kj\u00f8re samme hypervisor, v\u00e6re p\u00e5 samme subnett, og ha tilgang til den samme prim\u00e6rlagringsenheten.   Kj\u00f8rende virtuelle maskiner (VM) kan migreres fra en vert i klyngen til en annen uten avbrudd for brukeren. En klynge er den tredje st\u00f8rste 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\u00f8re virtuelle gjester. Hver vert har hypervisor-programvare installert for \u00e5 administrere gjestene (bortsett fra r\u00e5jern-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\u00f8rer 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\u00f8rste 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\u00f8rste gruppe enheten i en CloudStack installasjon. En sone er typisk sett p\u00e5 som et datasenter, selv om man kan ha flere datasenter i en sone. CloudStack infrastrukturen kan deles inn i soner for \u00e5 isolere og \u00e5 gi redundans. Hver sone kan for eksempel ha sin egen data senter str\u00f8mtilf\u00f8rsel og nettverkslink, og soner kan v\u00e6re spredd over st\u00f8rre distanser.",
+"message.installwizard.copy.whatiscloudstack": "CloudStack&#8482 er en programvare-plattform som grupperer dataressurser for \u00e5 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 \u00e5 distribuere, administrerre og konfigurere dine skyressurser og milj\u00f8er.<br/><br/>Utvid forbi individuelle virtuelle gjester som kj\u00f8rer p\u00e5 typisk maskinvare, CloudStack&#8482 gir en skybasert infrastruktur-programvare for levering av virtuelle datasentre som en tjeneste - lever alle de essensielle komponenente for \u00e5 bygge, distribuere og administrere multi-tier og multi-tenant sky-applikasjoner. B\u00e5de fri kildekode- og premium-versjoner er tilgjengelig, hvor den fri kildekode-basert gir tiln\u00e6rmet samme funksjonalitet.",
+"message.installwizard.copy.whatisprimarystorage": "En CloudStack&#8482 sky-infrastruktur tar i bruk to typer lagring: prim\u00e6rlagring og sekund\u00e6rlagring. <br/><br/><strong>Prim\u00e6rlagring</strong> er assosiert med en klynge, og lagrer datadisker for hver gjest som kj\u00f8rer i den klyngen. Prim\u00e6rlagring er typisk plassert n\u00e6rt den faktiske verten.",
+"message.installwizard.copy.whatissecondarystorage": "Sekund\u00e6rlagring er assosiert med en sone, og lagrer f\u00f8lgende: <ul><li>Maler - OS-bilder som kan brukes til \u00e5 starte opp virtuelle gjester og kan inkludere ekstra konfigurasjon, som installerte applikasjoner</li><li>ISO-bilder - Bilder som kan v\u00e6re bootbare eller ikke-bootbare.</li><li>Diskvolum \u00f8yeblikksbilder - Lagrede kopier av virtuelle gjester som kan benyttes til rekonstruksjon eller for \u00e5 lage nye maler</li></ul>",
+"message.installwizard.now.building": "Bygger n\u00e5 din nettsky...",
+"message.installwizard.tooltip.addcluster.name": "Klyngenavnet. Dette kan v\u00e6re 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 \u00e5 administrere Sekund\u00e6rlagrins-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\u00e5 subnettet gjestene vil bruke.",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "Dette er IP-rekken i det private nettverket som CloudStack bruker for \u00e5 administrere Sekund\u00e6rlagrins-servere og Konsollproxy-servere. Disse IP-adressene tas fra samme subnett som regnekraft-serverne.",
+"message.installwizard.tooltip.addprimarystorage.name": "Navnet p\u00e5 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\u00e5 hver vert hvor denne prim\u00e6re 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\u00e6r 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\u00e5 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\u00e5 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\u00e5 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\u00e5 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\u00e6re tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, b\u00f8r disse IPene v\u00e6re i samme CIDR som podens CIDR.",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "Gatewayen gjestene skal bruke",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "Nettmasken benyttet p\u00e5 subnettet gjestene skal bruke",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "Rekken av IP-adresser som vil v\u00e6re tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, b\u00f8r disse IPene v\u00e6re i samme CIDR som podens CIDR.",
+"message.installwizard.tooltip.configureguesttraffic.name": "Et navn for nettverket",
+"message.instance.scaled.up.confirm": "\u00d8nsker du \u00e5 skalere opp denne instancen?",
+"message.instancewizard.notemplates": "Du har ingen maler tilgjengelig. Vennligst legg til en kompatibel mal og kj\u00f8r instansveiviseren.",
+"message.ip.address.changed": "Din IP-adresse kan ha endret seg. \u00d8nsker du \u00e5 oppdatere visningen? Merk at detaljvisningen vil i s\u00e5fall lukkes.",
+"message.iso.desc": "Diskimage som inneholder data etter oppstartsbar media for OS",
+"message.join.project": "Du har n\u00e5 deltatt i et prosjekt. Vennligst bytt til prosjektvisning for \u00e5 se prosjektet.",
+"message.launch.vm.on.private.network": "\u00d8nsker du \u00e5 starte instancen din p\u00e5 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 \u00f8nsker \u00e5 l\u00e5se denne kontoen. Ved \u00e5 l\u00e5se kontoen s\u00e5 vil ingen brukere av denne kontoen kunne administere sine skyressurser. Eksisterende ressurser kan fortsatt bli aksessert.",
+"message.migrate.instance.confirm": "Vennligst bekreft verten du \u00f8nsker \u00e5 migrere den virtuelle instansen til.",
+"message.migrate.instance.to.host": "Vennligst bekreft at du \u00f8nsker \u00e5 migrere instansen til en annen vert.",
+"message.migrate.instance.to.ps": "Vennligst bekreft at du \u00f8nsker \u00e5 migrere instansen til en annen prim\u00e6rlagring.",
+"message.migrate.router.confirm": "Vennligst bekreft verten du \u00f8nsker \u00e5 migrere ruteren til:",
+"message.migrate.systemvm.confirm": "Vennligst bekreft verten du \u00f8nsker \u00e5 migrere system VM til:",
+"message.migrate.volume": "Vennligst bekreft at du \u00f8nsker \u00e5 migrere volumet til en annen prim\u00e6rlagring.",
+"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\u00f8k p\u00e5 nytt.",
+"message.network.removenic": "Vennligst bekreft at du vil fjerne dette NIC, noe som ogs\u00e5 vil fjerne det assosierte nettverket fra VMen.",
+"message.network.updateip": "Vennligst bekreft at du \u00f8nsker \u00e5 endre IP-adressen til dette nettverkskortet p\u00e5 maskinen.",
+"message.new.user": "Spesifiser f\u00f8lgende informasjon for \u00e5 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 \u00e5 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\u00e6rlagringsvolumer</h2>",
+"message.number.zones": "<h2><span> # av </span> Soner</h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"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\u00f8lgende prosjektinvitasjoner:",
+"message.pending.projects.2": "For \u00e5 se, vennligst g\u00e5 til prosjektseksjonen og velg invitasjoner fra nedtrekksmenyen.",
+"message.please.add.at.lease.one.traffic.range": "Vennligst legg til minst \u00e9tt trafikkniv\u00e5",
+"message.please.confirm.remove.ssh.key.pair": "Vennligst bekreft at du vil fjerne dette SSH-n\u00f8kkelpar",
+"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\u00f8r 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\u00f8kkelpar 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\u00e5 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\u00e5 allokerers for dette form\u00e5et. Sluttbrukere kan bruke CloudStack brukergrensesnittet til \u00e5 foresp\u00f8rre om disse IP-adressene til \u00e5 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\u00e5r virtuelle gjester i skyen aksesserer internett eller kan tilby tjenester til klienter over internett. Offentlig tilgjengelige IP-adresser m\u00e5 allokerers for dette form\u00e5let. N\u00e5r 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\u00e5 bli satt opp automatisk mellom the offentlige og den private IP-adressen. Sluttbrukere kan ogs\u00e5 bruke CloudStack brukergrensesnittet til \u00e5 tilegne ekstra IP-adresser for \u00e5 implementere statisk NAT mellom deres instans og den offentlige IP-adressen.",
+"message.question.are.you.sure.you.want.to.add": "Er du sikker p\u00e5 at du vil legge til",
+"message.read.admin.guide.scaling.up": "Vennligst les avsnittet om dynamisk skalering i administrasjondokumentasjonen f\u00f8r du oppskalerer.",
+"message.recover.vm": "Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette denne VMen.",
+"message.redirecting.region": "Omdirigerer til region...",
+"message.reinstall.vm": "Advarsel: Fortsett med forsiktighet. Dette vil reinstallere VMen fra malen; data p\u00e5 rot-disken vil forsvinne. Ekstra datavolumer; hvis noen, vil ikke bli r\u00f8rt.",
+"message.remove.ldap": "Er du sikker p\u00e5 at du vil slette LDAP-konfigurasjonen?",
+"message.remove.region": "Er du sikker p\u00e5 at du vil fjerne denne regionen fra denne administrasjonsserveren?",
+"message.remove.vpc": "Vennligst bekreft at du \u00f8nsker \u00e5 fjerne VPC",
+"message.remove.vpn.access": "Vennligst bekreft at du \u00f8nsker \u00e5 fjerne VPN-tilgang fra f\u00f8lgende bruker.",
+"message.removed.ssh.key.pair": "Fjernet et SSH-n\u00f8kkelpar",
+"message.reset.password.warning.notpasswordenabled": "Denne malen vil bli opprettet uten passord",
+"message.reset.password.warning.notstopped": "Din instans m\u00e5 stoppes f\u00f8r man fors\u00f8ker \u00e5 bytte n\u00e5v\u00e6rende passord",
+"message.reset.vpn.connection": "Vennligst bekreft at du \u00f8nsker \u00e5 resette VPN-tilkobling",
+"message.restart.mgmt.server": "Vennlist restart administrajonsserveren(e) din(e) for at de nye innstillingene skal tr\u00e5 i kraft.",
+"message.restart.mgmt.usage.server": "Vennligst restart administrasjonsserveren(e) din(e) og bruksserver(e) for at de nye innstillingene skal tr\u00e5 i kraft.",
+"message.restart.network": "Alle tjenester fra dette nettverket vil bli avbrutt. Vennligst bekreft at du \u00f8nsker \u00e5 restarte dette nettverket.",
+"message.restart.vpc": "Vennligst bekreft at du \u00f8nsker \u00e5 restarte VPC",
+"message.restart.vpc.remark": "Vennligst bekreft du at du vil restarte VPC <p><small><i>Merk: \u00c5 gj\u00f8re en ikke reduntant VPC redundant vil tvinge en opprydning. Nettverkene vil ikke v\u00e6re tilgjengelig i noen minutter</i>.</small></p>",
+"message.restorevm": "Vil du gjenopprette denne VMen?",
+"message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(Bruk <strong>Ctrl-klikk</strong> for \u00e5 velge alle aktuelle sikkerhetsgrupper)",
+"message.select.a.zone": "En sone er typisk sett p\u00e5 som et datasenter. Multiple soner gir  CloudStack bedre p\u00e5litelighet gjennom isolasjon og redundans.",
+"message.select.affinity.groups": "Vennligst velg en affinitetsgruppe denne VMen skal tilh\u00f8re:",
+"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\u00f8re dette NIC til standard for denne VM.",
+"message.set.default.nic.manual": "Vennligst oppdater standard-NIC manuelt p\u00e5 VMen n\u00e5.",
+"message.setup.physical.network.during.zone.creation": "N\u00e5r du legger til en avansert sone, m\u00e5 du konfigurere en eller flere fysiske nettverk. Hvert nettverk representerer et NIC p\u00e5 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\u00e5r du legger til en enkel sone s\u00e5 kan du sette opp ett fysisk nettverk som korrensponderer til et NIC p\u00e5 hypervisor. Nettverket transporterer flere typer trafikk.<br/><br/> Du kan ogs\u00e5 <strong>drag og slippe</strong> andre trafikktyper over til det fysiske nettverket.",
+"message.setup.successful": "Oppsettet av nettskyen er vellykket!",
+"message.specifiy.tag.key.value": "Vennligst bekreft tag n\u00f8kkel og verdi",
+"message.specify.url": "Vennligst spesifiser URL",
+"message.step.1.desc": "Vennligst velg en mal for din nye virtuelle instans. Du kan ogs\u00e5 velge en blank mal som du kan installere fra en ISO p\u00e5.",
+"message.step.2.continue": "Velg et resurstilbud for \u00e5 fortsette",
+"message.step.3.continue": "Vennligst velg et disktilbud for \u00e5 fortsette",
+"message.step.4.continue": "Vennligst velg minst ett nettverk for \u00e5 fortsette",
+"message.step.4.desc": "Vennligst velg prim\u00e6rnettverket 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 \u00f8nsker \u00e5 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 \u00e5 starte VMer",
+"message.template.iso": "Vennligst velg en mal eller ISO for \u00e5 fortsette.",
+"message.tier.required": "VPC-gren er p\u00e5krevd.",
+"message.tooltip.dns.1": "Oppgi en DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen m\u00e5 ha en rute til denne serveren.",
+"message.tooltip.dns.2": "En sekund\u00e6r DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen m\u00e5 ha en rute til denne serveren.",
+"message.tooltip.internal.dns.1": "Navn p\u00e5 en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden m\u00e5 ha en rute til serveren.",
+"message.tooltip.internal.dns.2": "Navn p\u00e5 en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden m\u00e5 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\u00f8rst bli allokert til denne verten f\u00f8r andre velges.",
+"message.update.resource.count": "Vennligst bekreft at du \u00f8nsker \u00e5 oppdatere ressurstellere for denne kontoen.",
+"message.update.ssl": "Vennligst send inn en ny X.509 kompatibel SSL-sertifikatkjede for \u00e5 oppdatere hver konsollproxy og virtuell instans for sekund\u00e6rlagring:",
+"message.update.ssl.failed": "Oppdatering av SSL-sertifikat feilet.",
+"message.update.ssl.succeeded": "Oppdatering av SSL-sertifikat vellykket",
+"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\u00e5krevd.",
+"message.validate.fixfield": "Vennligst fiks dette feltet.",
+"message.validate.instance.name": "Instansnavn kan ikke v\u00e6re lenger enn 63 tegn. Kun ACSCII bokstaver a~z, A~Z, tall 0~9, bindestrek er tillatt. M\u00e5 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.validate.url": "Vennligst skriv inn en gyldig URL.",
+"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\u00f8lgende informasjon og bekreft at din virtuelle instans er korrekt f\u00f8r kj\u00f8ring",
+"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 \u00f8nsker \u00e5 lage en mal for dette diskvolumet. Opprettelse av male kan ta opptil flere minutter eller lenger, avhengig av st\u00f8rrelsen p\u00e5 volumet.",
+"message.waiting.for.builtin.templates.to.load": "Venter p\u00e5 at innebygde maler skal lastes...",
+"message.xstools61plus.update.failed": "Feilet \u00e5 oppdatere original XS versjon er 6.1+ feltet. Feil:",
+"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": "Opprettelsen av sonen utf\u00f8rt",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Soneopprettelse fullf\u00f8rt. \u00d8nsker du \u00e5 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\u00f8lgende informasjon for \u00e5 legge til en ny sone",
+"message.zone.step.3.desc": "Vennligst skriv inn f\u00f8lgende informasjon for \u00e5 legge til en ny pod",
+"message.zonewizard.enable.local.storage": "ADVARSEL: Hvis du aktiverer lokal lagring for denne sonen m\u00e5 du gj\u00f8re f\u00f8lgende, avhengig av hvor du \u00f8nsker at systemmaskiner skal starte:<br/><br/>1. Hvis systemmaskiner trenger \u00e5 starte fra delt lagring, m\u00e5 det legges til delt lagring etter at sonen er opprettet. Sonen m\u00e5 ogs\u00e5 startes som deaktivert.<br/><br/>2. Hvis systemmaskiner trenger \u00e5 starte fra lokal lagring, m\u00e5 system.vm.use.local.storage settes til true f\u00f8r du aktiverer sonen.<br/><br/><br/>Vil du fortsette?",
+"messgae.validate.min": "Skriv en verdig st\u00f8rre enn eller lik {0}.",
+"network.rate": "Nettverksrate",
+"side.by.side": "Side ved side",
+"state.accepted": "Akseptert",
+"state.active": "Aktiv",
+"state.allocating": "Allokerer",
+"state.backedup": "Sikkerhetskopiert",
+"state.backingup": "Sikkerhetskopierer",
+"state.completed": "Utf\u00f8rt",
+"state.creating": "Oppretter",
+"state.declined": "Avvist",
+"state.destroyed": "Destruert",
+"state.detached": "Frakoblet",
+"state.disabled": "Inaktiv",
+"state.enabled": "Aktivert",
+"state.error": "Feil",
+"state.expunging": "Fjerner",
+"state.migrating": "Migrering",
+"state.pending": "Venter",
+"state.running": "Kj\u00f8rer",
+"state.starting": "Starter",
+"state.stopped": "Stoppet",
+"state.stopping": "Stopper",
+"state.suspended": "Pauset",
+"title.upload.volume": "Last opp volum"
+}
\ No newline at end of file
diff --git a/ui/public/locales/nl_NL.json b/ui/public/locales/nl_NL.json
new file mode 100644
index 0000000..4a5e606
--- /dev/null
+++ b/ui/public/locales/nl_NL.json
@@ -0,0 +1,2364 @@
+{
+"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.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.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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Afbeelding Directory",
+"inline": "Inline",
+"label.about": "Over",
+"label.about.app": "Over CloudStack",
+"label.accept.project.invitation": "Accepteer project uitnodiging",
+"label.accesskey": "Toegangssleutel",
+"label.account": "Account",
+"label.account.and.security.group": "Account, Security group",
+"label.account.details": "rekening gegevens",
+"label.account.id": "Account ID",
+"label.account.name": "Account Naam",
+"label.account.specific": "Account-specifiek",
+"label.accounts": "Accounts",
+"label.accounttype": "Account type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL lijst regels",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL vervangen",
+"label.aclid": "ACL",
+"label.aclname": "ACL naam",
+"label.acltotal": "Netwerk ACL Totaal",
+"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.configure.stickiness": "Stickiness",
+"label.action.copy.iso": "Kopieer ISO",
+"label.action.copy.iso.processing": "Bezig een ISO te kopi\u00ebren...",
+"label.action.copy.template": "Kopieer Template",
+"label.action.copy.template.processing": "Bezig een template te kopi\u00ebren...",
+"label.action.create.template.from.vm": "Cre\u00eber Template vanaf VM",
+"label.action.create.template.from.volume": "Cre\u00eber Template van Volume",
+"label.action.create.template.processing": "Bezig met aanmaken Template....",
+"label.action.create.vm": "Cre\u00eber VM",
+"label.action.create.vm.processing": "Bezig met aanmaken VM....",
+"label.action.create.volume": "Cre\u00eber Volume",
+"label.action.create.volume.processing": "Bezig met cre\u00ebren volume....",
+"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.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.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.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.iso": "Wijzig ISO",
+"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.project.add.account": "Voeg account aan project toe",
+"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.activeviewersessions": "Actieve Sessies",
+"label.add": "Voeg toe",
+"label.add.account": "Voeg Account toe",
+"label.add.accounts": "Voeg accounts toe",
+"label.add.accounts.to": "Voeg accounts toe aan",
+"label.add.acl": "Voeg ACL toe",
+"label.add.acl.list": "voeg een ACL lijst toe",
+"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.bigswitchbcf.device": "Voeg eenBigSwitch BCF controller toe",
+"label.add.brocadevcs.device": "Voeg een Brocade Vcs switch 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.f5.device": "Voeg F5 apparaat 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\u00efsoleerd netwerk toe",
+"label.add.isolated.guest.network.with.sourcenat": "voeg en ge\u00efsoleerd 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.gateway": "Voeg nieuwe gateway 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.tier": "Voeg nieuwe Tier toe",
+"label.add.nfs.secondary.staging.store": "Secundaire Staging Opslag toevoegen",
+"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.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.srx.device": "SRX apparaat 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.vlan": "VLAN toevoegen",
+"label.add.vm": "VM toevoegen",
+"label.add.vm.to.tier": "Voeg VM toe aan tier",
+"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.gateway": "VPN 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.address": "Address",
+"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.groups": "Affinity Groepen",
+"label.affinitygroup": "Affinity Groep",
+"label.agent.password": "Agent wachtwoord",
+"label.agent.username": "Agent Gebruikersnaam",
+"label.agentport": "Agent poort",
+"label.agentstate": "agent status",
+"label.agree": "Accepteren",
+"label.alert": "Alarm",
+"label.alert.archived": "waarschuwing gearchiveerd",
+"label.alert.deleted": "waarschuwing verwijderd",
+"label.alert.details": "waarschuwing gegevens",
+"label.alerts": "Waarschuwingen",
+"label.algorithm": "Algoritme",
+"label.all": "Alle",
+"label.allocated": "Gebruikt",
+"label.allocationstate": "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.version": "API versie",
+"label.apikey": "API Sleutel",
+"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.associatednetwork": "Bijbehorend Netwerk",
+"label.associatednetworkid": "Bijbehorend Netwerk ID",
+"label.associatednetworkname": "Netwerk Naam",
+"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.availabilityzone": "beschikbaarheidszone",
+"label.available": "Beschikbaar",
+"label.available.public.ips": "Beschikbare Publieke IP adressen",
+"label.back": "Terug",
+"label.balance": "balans",
+"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.baremetalcpu": "CPU (in MHz)",
+"label.baremetalcpucores": "Aantal CPU Cores",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "Geheugen (in MB)",
+"label.basic": "Basis",
+"label.basic.mode": "Basis Modus",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF gegevens",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller adres",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootable",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs switch adres",
+"label.brocade.vcs.details": "Brocade Vcs switch gegevens",
+"label.bucket": "Bucket",
+"label.by.account": "Op Account",
+"label.by.alert.type": "Op alarm type",
+"label.by.availability": "Op Beschikbaarheid",
+"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.cachemode": "Schrijf cache Type",
+"label.cancel": "Annuleer",
+"label.capacity": "Capaciteit",
+"label.capacity.iops": "Capaciteit in IOPS",
+"label.capacitybytes": "Capaciteit in bytes",
+"label.capacityiops": "IOPS Totaal",
+"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.of.destination.network": "CIDR van bestemmingsnetwerk",
+"label.cidrlist": "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.cleanup": "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.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Cluster Naam",
+"label.clusters": "Clusters",
+"label.clustertype": "Cluster Type",
+"label.clvm": "CLVM",
+"label.code": "Code",
+"label.community": "Community",
+"label.compute": "Compute",
+"label.compute.and.storage": "Compute en Opslag",
+"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.confirmation": "Bevestiging",
+"label.confirmdeclineinvitation": "Weet u zeker dat u deze project uitnodiging wilt afwijzen?",
+"label.confirmpassword": "Bevestig wachtwoord",
+"label.congratulations": "Gefeliciteerd!",
+"label.connectiontimeout": "Connectie Timeout",
+"label.conservemode": "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\u00ebren",
+"label.corrections.saved": "Correcties opgeslagen",
+"label.counterid": "teller",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU gebruik",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "CPU gebruikt voor VMs",
+"label.cpuallocatedghz": "Gebruikt",
+"label.cpulimit": "CPU limieten",
+"label.cpumaxdeviation": "afwijking",
+"label.cpusockets": "Het aantal CPU sockets",
+"label.cpuspeed": "CPU (in MHz)",
+"label.cputotal": "Totaal CPU",
+"label.cputotalghz": "totaal",
+"label.cpuused": "CPU Verbruik",
+"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\u00eber een SSH sleutelpaar",
+"label.create.template": "Nieuwe template",
+"label.create.vpn.connection": "Nieuwe VPN connectie",
+"label.created": "Aangemaakt",
+"label.created.by.system": "Aangemaakt door systeem",
+"label.createnfscache": "Creeer NFS staging secudaire opslag",
+"label.credit": "krediet",
+"label.crosszones": "Over Zones",
+"label.current": "isHuidige",
+"label.currentpassword": "Current Password",
+"label.custom": "Aangepast",
+"label.custom.disk.offering": "schijf aanbieding op maat",
+"label.customdisksize": "Vrije schijf grootte",
+"label.daily": "Dagelijkse",
+"label.dashboard": "Dashboard",
+"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.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.use": "Standaard Gebruik",
+"label.default.view": "Standaard Weergave",
+"label.delete": "Verwijder",
+"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.bigswitchbcf": "Verwijder BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Verwijder Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "verwijder CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "CiscoVNMC resource verwijderen",
+"label.delete.events": "Verwijder gebeurtenissen",
+"label.delete.f5": "Verwijder F5",
+"label.delete.gateway": "Verwijder gateway",
+"label.delete.internal.lb": "verwijder interne LB",
+"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.portable.ip.range": "Porteerbare IP Range verwijderen",
+"label.delete.project": "Verwijder project",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Secundaire Staging Opslag verwijderen",
+"label.delete.srx": "Verwijder SRX",
+"label.delete.ucs.manager": "Verwijder UCS Manager",
+"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.vpn.user": "Verwijder VPN gebruiker",
+"label.deleteprofile": "Profiel Verwijderen",
+"label.deleting.failed": "Verwijderen Mislukt",
+"label.deleting.processing": "Verwijderen....",
+"label.deny": "Weigeren",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Beschrijving",
+"label.destinationphysicalnetworkid": "Bestemming fysiek netwerk ID",
+"label.destinationzoneid": "Bestemmingszone",
+"label.destroy": "Verwijder",
+"label.destroy.router": "Verwijder router",
+"label.destroyvmgraceperiod": "Respijt periode verwijderde VM",
+"label.detaching.disk": "Ontkoppelen Schijf",
+"label.details": "Details",
+"label.deviceid": "Apparaat ID",
+"label.devices": "Apparaten",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "direct verbonden publieke IP",
+"label.direct.ips": "Shared Netwerk IPs",
+"label.directdownload": "Direct Download",
+"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.disconnected": "Laatse keer niet verbonden",
+"label.disk": "schijf",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "schijfe offerte gegevens",
+"label.disk.offerings": "Schijf Aanbiedingen",
+"label.disk.size": "Schijf Grootte",
+"label.disk.volume": "Schijf Volume",
+"label.diskbytesreadrate": "Lees Snelheid Schijf (BPS)",
+"label.diskbyteswriterate": "Schrijf Snelheid Schijf (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Lees Snelheid Schijf (IOPS)",
+"label.diskiopswriterate": "Schrijf snelheid Schijf (IOPS)",
+"label.diskioread": "Schijf Lezen (IO)",
+"label.diskiowrite": "Schijf Schrijven (IO)",
+"label.diskkbsread": "Schijf lezen (Bytes)",
+"label.diskkbswrite": "Schijf Schrijven (Bytes)",
+"label.diskoffering": "opslagaanbieding",
+"label.diskofferingdisplaytext": "Schijf Aanbieding",
+"label.diskofferingid": "Schijf Aanbieding",
+"label.disksize": "Schijf Grootte (in GB)",
+"label.disksizeallocated": "Schijfruimte gealloceerd",
+"label.disksizeallocatedgb": "Gebruikt",
+"label.disksizetotal": "Schijf Totaal",
+"label.disksizetotalgb": "totaal",
+"label.disksizeunallocatedgb": "niet-toegekend",
+"label.disksizeusedgb": "Gebruikt",
+"label.display.text": "Weergavetekst",
+"label.displayname": "publieke naam",
+"label.displaytext": "Beschrijving",
+"label.distributedvpcrouter": "Gedistribueerde VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS domein voor Gast Netwerken",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domein",
+"label.domains": "Domein",
+"label.domain.details": "domein gegevens",
+"label.domain.name": "Domeinnaam",
+"label.domain.router": "Domein router",
+"label.domain.suffix": "DNS domein achtervoegsel (v.b., xyz.com)",
+"label.domainid": "Domein ID",
+"label.domainname": "Domein",
+"label.domainpath": "Domein",
+"label.done": "Klaar",
+"label.double.quotes.are.not.allowed": "Aanhalingstekens zijn hier niet toegestaan",
+"label.download.progress": "Download Voortgang",
+"label.dpd": "Dead Peer detectie",
+"label.drag.new.position": "Sleep naar nieuwe positie",
+"label.driver": "Driver",
+"label.duration.in.sec": "duur (in sec)",
+"label.edit": "Wijzig",
+"label.edit.acl.list": "Verander een ACL lijst",
+"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.egressdefaultpolicy": "Standaard Uitgaande policy",
+"label.elastic": "Elastisch",
+"label.email": "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.reserved.system.ip": "Einde gereserveerde systeem IP",
+"label.end.vlan": "Laatste VLAN",
+"label.end.vxlan": "Laatste VXLAN",
+"label.enddate": "Op datum (eind)",
+"label.endip": "Eind IP",
+"label.endipv4": "IPv4 Eind IP",
+"label.endipv6": "IPv6 Eind IP",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "Eind Poort",
+"label.enter.token": "Voer token in",
+"label.error": "Fout",
+"label.error.code": "Fout code",
+"label.error.something.went.wrong.please.correct.the.following": "Er is iets mis gegaan; Corrigeer het volgende",
+"label.error.upper": "FOUT",
+"label.espencryption": "ESP Encryptie",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "ESP Lifetime (secondes)",
+"label.esppolicy": "ESP policy",
+"label.event": "gebeurtenis",
+"label.event.archived": "gebeurtenis gearchiveerd",
+"label.event.deleted": "gebeurtenis verwijderd",
+"label.events": "Gebeurtenissen",
+"label.every": "elke",
+"label.example": "Voorbeeld",
+"label.expunge": "Ruim op",
+"label.external.link": "Externe link",
+"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.firstname": "Voornaam",
+"label.firstname.lower": "voornaam",
+"label.forceencap": "Forceer UDP Encapsulatie van ESP Packets",
+"label.format": "Formaat",
+"label.friday": "Vrijdag",
+"label.full": "Volledig",
+"label.full.path": "Volledig pad",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Type",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "Algemene Waarschuwingen",
+"label.generating.url": "Generen van URL",
+"label.global.settings": "Algemene Instellingen",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS configuratie",
+"label.glustervolume": "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.lb.details": "load balancing details",
+"label.gslb.lb.remove": "verwijder load balancing van deze GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Publiek IP",
+"label.gslbdomainname": "GSLB Domein Naam",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Publiek IP",
+"label.gslbservicetype": "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.guestcidraddress": "Gast CIDR",
+"label.guestendip": "Gast eind IP",
+"label.guestgateway": "Gast Gateway",
+"label.guestipaddress": "Gast IP Adres",
+"label.guestiptype": "Gast Type",
+"label.guestnetmask": "Gast Netmask",
+"label.guestnetworkid": "Netwerk ID",
+"label.guestnetworkname": "Netwerk Naam",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Gast start IP",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "HA ingeschakeld",
+"label.hahost": "HA ingeschakeld",
+"label.header.volume.snapshot": "U kunt terugkerende momentopname plannen maken door uit de onderstaande mogelijkheden te kiezen en uw beleid voorkeuren toe te passen.",
+"label.header.volume.take.snapshot": "Bevestig dat u een snapshot wilt maken van dit volume.",
+"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.alerts": "Hosts in Alert State",
+"label.host.name": "Hostnaam",
+"label.host.tag": "machine kenteken",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Hostnaam",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Uurlijks",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor mogelijkheden",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor versie",
+"label.hypervnetworklabel": "HyperV verkeerslabel",
+"label.icmpcode": "ICMP Code",
+"label.icmptype": "ICMP Type",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE Encryptie",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE lifetime (secondes)",
+"label.ikepolicy": "IKE policy",
+"label.info": "Info",
+"label.info.upper": "INFORMATIE",
+"label.infrastructure": "Infrastructuur",
+"label.ingress.rule": "Inkomende Regel",
+"label.initiated.by": "Ge\u00efnitieerd door",
+"label.insideportprofile": "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.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.name": "Instantie Naam",
+"label.instance.scaled.up": "Instantie is geschaald naar de gevraagde aanbieding",
+"label.instancename": "Interne naam",
+"label.instanceport": "instantie poort",
+"label.instances": "Instanties",
+"label.instanciate.template.associate.profile.blade": "Initieer Template en verbind Profiel met Blade",
+"label.intermediate.certificate": "Intermediair certificaat",
+"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.internaldns1": "Interne DNS 1",
+"label.internaldns2": "Interne DNS 2",
+"label.internallbvm": "interne LBVM",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "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.allocations": "IP Allocaties",
+"label.ip.or.fqdn": "IP of FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "IP Ranges",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP Adres",
+"label.ipaddress1": "IP Adres",
+"label.ipaddress2": "IP Adres",
+"label.iplimit": "Publieke IP Limieten",
+"label.ips": "IPs",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "totaal aantal IP adressen",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Doel IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Is Gedeeld",
+"label.isadvanced": "Geavaceerde instellingen weergeven",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Vrije schijf grootte",
+"label.iscustomizeddiskiops": "Aangepaste IOPS",
+"label.iscustomizediops": "Aangepaste IOPS",
+"label.isdedicated": "Toegewijd",
+"label.isdefault": "Is Standaard",
+"label.isdynamicallyscalable": "Dynamisch Schaalbaar",
+"label.isextractable": "Uitpakbaar",
+"label.isfeatured": "Voorgesteld",
+"label.isforced": "Geforceerd verwijderen",
+"label.ismanaged": "beheerd(e)",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Geisoleerde netwerken",
+"label.isolatedpvlanid": "Secundair Geisoleerd VLAN ID",
+"label.isolation.method": "Isolatie methode",
+"label.isolation.mode": "Isolatie Modus",
+"label.isolationmethod": "Isolatie methode",
+"label.isolationmethods": "Isolatie methode",
+"label.isolationuri": "Isolatie URI",
+"label.isoname": "Gekoppelde ISO",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Wachtwoord Ingeschakeld",
+"label.ispersistent": "Persistent",
+"label.isportable": "Over Zones",
+"label.ispublic": "Publiek",
+"label.isready": "Klaar",
+"label.isredundantrouter": "Redundante Router",
+"label.isrouting": "Routing",
+"label.isshared": "Gedeeld",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is Systeem",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Items lijst",
+"label.japanese.keyboard": "Japans toetsenbord",
+"label.keep": "Bewaar",
+"label.keep.colon": "bewaar:",
+"label.key": "Sleutel",
+"label.keyboard": "toetsenbord taal",
+"label.keyboardtype": "Toetsenbord type",
+"label.keypair": "SSH sleutelpaar",
+"label.kvmnetworklabel": "KVM verkeer label",
+"label.l2gatewayserviceuuid": "L2 gateway service UUID",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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.updated": "laatste wijziging",
+"label.lastname": "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.lbdevicededicated": "Toegewijd",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Type",
+"label.lbdevicestate": "Status",
+"label.lbtype": "loadbalancer type",
+"label.ldap.configuration": "LDAP Configuratie",
+"label.ldap.group.name": "LDAP Groep",
+"label.ldap.port": "LDAP poort",
+"label.level": "Level",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "link domein aan LDAP",
+"label.linklocalip": "Link Local IP Adres",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Load balancing policies",
+"label.loadbalancerinstance": "toegewezen VMs",
+"label.loadbalancerrule": "load balancing regel",
+"label.loadbalancing": "Load Balancing",
+"label.loading": "Laden",
+"label.local": "Lokaal",
+"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.localstorageenabled": "Schakel locale opslag voor gebruiker VMs in",
+"label.localstorageenabledforsystemvm": "zet lokale opslag voor systeem VMs aan",
+"label.login": "Login",
+"label.logout": "Log uit",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC verkeerslabel",
+"label.make.project.owner": "Maak account project eigenaar",
+"label.makeredundant": "Maak redundant",
+"label.manage": "Beheer",
+"label.manage.resources": "Beheer Resources",
+"label.management": "Beheer",
+"label.management.ips": "Beheers IP Adressen",
+"label.management.server": "Beheers Machine",
+"label.max.primary.storage": "Max. primare opslag (GiB)",
+"label.max.secondary.storage": "Max. secundaire opslag (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "Max. opnieuw proberen na Fout",
+"label.maxguestslimit": "Max. Instanties",
+"label.maximum": "Maximaal",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. geheugen (MiB)",
+"label.maxnetwork": "Max. netwerken",
+"label.maxpublicip": "Max. publieke IPs",
+"label.maxsnapshot": "Max. snapshots",
+"label.maxtemplate": "Max. templates",
+"label.maxuservm": "Max. VMs per gebruiker",
+"label.maxvolume": "Max. volumes",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "U kunt nu verder gaan.",
+"label.memallocated": "geheugen allocatie",
+"label.memory": "Geheugen",
+"label.memory.total": "Totaal Geheugen",
+"label.memory.used": "Geheugen gebruikt",
+"label.memoryallocated": "Geheugen Gealloceerd",
+"label.memoryallocatedgb": "Gebruikt",
+"label.memorylimit": "Geheugen limieten (MiB)",
+"label.memorymaxdeviation": "afwijking",
+"label.memorytotal": "Geheugen Gealloceerd",
+"label.memorytotalgb": "totaal",
+"label.memoryusedgb": "Gebruikt",
+"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.destroyed.instances": "Vernietigde Instanties",
+"label.menu.featured.isos": "Voorgestelde ISOs",
+"label.menu.featured.templates": "Voorgestelde Templates",
+"label.menu.ipaddresses": "IP Adressen",
+"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.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.sshkeypair": "SSH sleutelpaar",
+"label.menu.stopped.instances": "Uitgeschakelde Instanties",
+"label.menu.storage": "Opslag",
+"label.menu.system": "Systeem",
+"label.menu.virtual.appliances": "Virtueele Appliances",
+"label.menu.virtual.resources": "Virtuele Resources",
+"label.metrics": "meet-gegevens",
+"label.metrics.cpu.allocated": "CPU allocatie",
+"label.metrics.cpu.usage": "CPU gebruik",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "lees",
+"label.metrics.disk.usage": "schijf gebruik",
+"label.metrics.disk.write": "schrijf",
+"label.metrics.memory.usage": "geheugen gebruik",
+"label.metrics.network.read": "lees",
+"label.metrics.network.usage": "netwerk gebruik",
+"label.metrics.network.write": "schrijf",
+"label.metrics.num.cpu.cores": "kernen",
+"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.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": "Migreer volume naar andere primaire opslag",
+"label.min.balance": "min balans",
+"label.min.past.hour": "min na het uur",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "Minuten na het uur",
+"label.minutes.past.hour": "minu(u)t(en) in het laatste uur",
+"label.monday": "Maandag",
+"label.monthly": "Maandelijks",
+"label.more.templates": "Meer Templates",
+"label.move.down.row": "Verplaats \u00e9\u00e9n regel naar beneden",
+"label.move.to.bottom": "Verplaats naar beneden",
+"label.move.to.top": "Verplaats naar boven",
+"label.move.up.row": "Verplaats \u00e9\u00e9n 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.optional": "Naam (Optioneel)",
+"label.nat": "BigSwitch BCF NAT staat aan",
+"label.nat.port.range": "NAT Poort Range",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "Netwerk",
+"label.network.acl": "Netwerk ACL",
+"label.network.acls": "Netwerk ACLs",
+"label.network.addvm": "Voeg netwerk toe aan VM",
+"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.label.display.for.blank.value": "Gebruik standaard gateway",
+"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.name": "Netwerk Aanbieding Naam",
+"label.network.offerings": "Netwerk Aanbiedingen",
+"label.network.service.providers": "Netwerk Service Aanbieders",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Type",
+"label.networkdomain": "Netwerk Domein",
+"label.networkdomaintext": "Netwerk Domein",
+"label.networkid": "Netwerk",
+"label.networking.and.security": "Netwerken en beveiliging",
+"label.networkkbsread": "Netwerk gelezen",
+"label.networkkbswrite": "Netwerk geschreven",
+"label.networklimit": "Netwerk limieten",
+"label.networkname": "Netwerk Naam",
+"label.networkofferingdisplaytext": "Netwerk Aanbieding",
+"label.networkofferingid": "Netwerk Aanbieding",
+"label.networkofferingidtext": "Netwerk Aanbieding ID",
+"label.networkofferingname": "Netwerk Aanbieding",
+"label.networkrate": "Netwerk Snelheid (Mb/s)",
+"label.networkread": "Netwerk gelezen",
+"label.networks": "Netwerken",
+"label.networktype": "Netwerk Type",
+"label.networkwrite": "Netwerk geschreven",
+"label.new": "Nieuw",
+"label.new.password": "Nieuw wachtwoord",
+"label.new.project": "Nieuw Project",
+"label.new.vm": "Nieuwe VM",
+"label.newdiskoffering": "Nieuwe Aanbieding",
+"label.newsize": "Nieuwe grootte (GB)",
+"label.next": "Volgende",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Opslag",
+"label.nfscachenfsserver": "NFS Server",
+"label.nfscachepath": "Pad",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "NFS Server",
+"label.nicadaptertype": "NIC adapter type",
+"label.nicira.controller.address": "Controller Adres",
+"label.nicira.nvp.details": "Nicira NVP details",
+"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.none": "Geen",
+"label.noselect": "Nee bedankt",
+"label.not.found": "Niet gevonden",
+"label.notifications": "Notificaties",
+"label.num.cpu.cores": "Aantal CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Aantal Clusters",
+"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.numberofrouterrequiresupgrade": "Totaal Virtueele Routers die een ugrade nodig hebben",
+"label.numretries": "Keren opnieuw geprorbeerd",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "van de maand",
+"label.offerha": "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.optional": "Optioneel",
+"label.order": "Volgorde",
+"label.oscategoryid": "OS Voorkeur",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "anders",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Overschrijf Gast Verkeer",
+"label.override.public.traffic": "Overschrijf Publiek Verkeer",
+"label.overrideguesttraffic": "Overschrijf Gast Verkeer",
+"label.overridepublictraffic": "Overschrijf Publiek Verkeer",
+"label.ovm3cluster": "inheems clustering",
+"label.ovm3networklabel": "OVM3 verkeer etiket",
+"label.ovm3pool": "inheemse pooling",
+"label.ovm3vip": "Master VIP IP ip",
+"label.ovmnetworklabel": "OVM verkeerslabel",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Publieke IP Adressen in beheer",
+"label.owner.account": "Account Eigenaar",
+"label.owner.domain": "Domein Eigenaar",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profiel",
+"label.parent.domain": "Bovenliggend Domein",
+"label.parentname": "Bovenliggend",
+"label.passive": "passief",
+"label.password": "Wachtwoord",
+"label.password.reset.confirm": "Het wachtwoord is gereset naar",
+"label.passwordenabled": "Wachtwoord Ingeschakeld",
+"label.path": "Pad",
+"label.patp": "Palo Alto Threat Profiel",
+"label.pavr": "Virtuele Router",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Fysiek Netwerk",
+"label.physical.network.id": "Fysiek netwerk ID",
+"label.physical.network.name": "fysieke netwerk naam",
+"label.physicalnetworkid": "Fysiek Netwerk",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS wachtwoord",
+"label.ping.cifs.username": "PING CIFS gebruikersnaam",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "ping pad",
+"label.ping.storage.ip": "PING opslag IP",
+"label.plannermode": "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.podid": "Pod",
+"label.podname": "Pod Naam",
+"label.pods": "Pods",
+"label.port": "Poort",
+"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.portableipaddress": "Porteerbare IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Terug",
+"label.previous": "Vorige",
+"label.primary.network": "Primair Netwerk",
+"label.primary.storage": "Primaire Opslag",
+"label.primary.storage.allocated": "Primaire Opslag Gealloceerd",
+"label.primary.storage.count": "Primaire Opslag Pools",
+"label.primary.storage.used": "Primaire Opslag Gebruikt",
+"label.primarystoragelimit": "Primaire Opslag limieten (GiB)",
+"label.primarystoragetotal": "Primaire Opslag",
+"label.private.gateway": "Priv\u00e9 Gateway",
+"label.private.interface": "Priv\u00e9 Interface",
+"label.private.ip.range": "Priv\u00e9 IP Range",
+"label.private.ips": "Priv\u00e9 IP adressen",
+"label.private.zone": "Priv\u00e9 Zone",
+"label.privateinterface": "Priv\u00e9 Interface",
+"label.privateip": "Priv\u00e9 IP Adres",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Priv\u00e9 Netwerk",
+"label.privateport": "Priv\u00e9 Port",
+"label.profiledn": "Bijbehorend Profiel",
+"label.profilename": "Profiel",
+"label.project": "Project",
+"label.project.dashboard": "Project Dashboard",
+"label.project.invite": "Nodig uit voor project",
+"label.project.name": "Project naam",
+"label.project.view": "Project Weergave",
+"label.projectid": "Project ID",
+"label.projects": "Projecten",
+"label.property": "eigenschap",
+"label.protocol": "Protocol",
+"label.protocol.number": "protocol nummer",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Providers",
+"label.provisioningtype": "Provisioning type",
+"label.public.interface": "Publieke Interface",
+"label.public.ip": "Publiek IP Adres",
+"label.public.ip.addresses": "Publieke IP Adressen",
+"label.public.ips": "Publieke IP Adressen",
+"label.public.lb": "publieke LB",
+"label.public.load.balancer.provider": "Publieke Load Balancer Provider",
+"label.public.network": "Publiek netwerk",
+"label.public.traffic": "Publiek verkeer",
+"label.public.zone": "Publieke Zone",
+"label.publicinterface": "Publieke Interface",
+"label.publicip": "IP Adres",
+"label.publickey": "publieke sleutel",
+"label.publicnetwork": "Publiek netwerk",
+"label.publicport": "Publieke Poort",
+"label.purpose": "Doel",
+"label.pxe.server.type": "PXE Server Type",
+"label.qostype": "QoS Type",
+"label.quickview": "Sneloverzicht",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "quota waarde",
+"label.quota.value": "quota waarde",
+"label.quota.add.credits": "voeg krediet toe",
+"label.quota.configuration": "quota configuratie",
+"label.quota.configure": "configureer quota",
+"label.quota.credits": "tegoeden",
+"label.quota.dates": "bijwerken data",
+"label.quota.description": "quota beschrijving",
+"label.quota.enddate": "eind datum",
+"label.quota.endquota": "eind quota",
+"label.quota.enforce": "dwing quota af",
+"label.quota.fullsummary": "Alle Accounts",
+"label.quota.remove": "verwijder quota",
+"label.quota.startdate": "start datum",
+"label.quota.startquota": "start quota",
+"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.summary": "samenvatting",
+"label.quota.tariff": "tarief",
+"label.quota.tariff.edit": "wijzig tarief",
+"label.quota.tariff.effectivedate": "effectieve datum",
+"label.quota.totalusage": "totaal gebruik",
+"label.quota.usage": "quota verbruik",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx gebruiker",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "Reboot",
+"label.receivedbytes": "Bytes Ontvangen",
+"label.recent.errors": "Recente Fouten",
+"label.recover.vm": "Herstel VM",
+"label.redundantrouter": "Redundante Router",
+"label.redundantrouterstate": "Redundante staat",
+"label.redundantstate": "Redundante staat",
+"label.redundantvpcrouter": "Redundante VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Ververs",
+"label.refresh.blades": "Ververs Blades",
+"label.region": "Regio",
+"label.region.details": "regio gegevens",
+"label.reinstall.vm": "Herinstalleer VM",
+"label.related": "Samenhangend",
+"label.relationaloperator": "operator",
+"label.release.account": "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.replace.acl": "vervang ACL",
+"label.replace.acl.list": "vervang ACL lijst",
+"label.required": "Vereist",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Upgrade Benodigd",
+"label.reserved.system.gateway": "Gereseveerde systeem gateway",
+"label.reserved.system.ip": "Gereserveerd Systeem IP",
+"label.reserved.system.netmask": "Gereserveerd systeem netmask",
+"label.reservediprange": "Gereserveerde IP Range",
+"label.reservedsystemendip": "Einde gereserveerde systeem IP",
+"label.reservedsystemgateway": "Gereseveerde systeem gateway",
+"label.reservedsystemnetmask": "Gereserveerd systeem netmask",
+"label.reservedsystemstartip": "Start gereseveerd systeem IP",
+"label.reset.ssh.key.pair": "zet SSH sleutelpaar terug",
+"label.reset.ssh.key.pair.on.vm": "zet SSH sleutelpaar terug op VM",
+"label.reset.vpn.connection": "Reset VPN verbinding",
+"label.resetvm": "Reset VM",
+"label.resource": "Verbruik",
+"label.resource.limit.exceeded": "resource limiet overschreden",
+"label.resource.limits": "Verbruikslimieten",
+"label.resource.name": "Verbruik Naam",
+"label.resourceid": "Verbruik ID",
+"label.resourcename": "Verbruik Naam",
+"label.resources": "Verbruiken",
+"label.resourcestate": "Verbruik staat",
+"label.response.timeout.in.sec": "antwoord wachttijd (in sec)",
+"label.restart.network": "Herstart netwerk",
+"label.restart.vpc": "herstart VPC",
+"label.restartrequired": "Herstart benodigd",
+"label.restore": "Herstel",
+"label.retry.interval": "Wachttijd voor nieuwe poging",
+"label.review": "Beoordeel",
+"label.revoke.project.invite": "Trek uitnodiging in",
+"label.role": "Rol",
+"label.rolename": "Rol",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "root certificaat",
+"label.root.disk.offering": "Root Schijf Aanbieding",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Root schijf controller",
+"label.rootdiskcontrollertypekvm": "Root schijf controller",
+"label.router.vm.scaled.up": "Router VM Omhoog  Geschaald",
+"label.routercount": "Totaal Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is benodigd",
+"label.routertype": "Type",
+"label.routing.host": "routeer machine",
+"label.rule": "Rule",
+"label.rule.number": "Regel Nummer",
+"label.rules": "Regels",
+"label.running": "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.samlenable": "authoriseer SAML SSO",
+"label.samlentity": "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.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.vm": "Secundaire Opslag VM",
+"label.secondary.used": "Secundaire Opslag Gebruikt",
+"label.secondaryips": "Secundaire IPs",
+"label.secondarystoragelimit": "Secundaire Opslag limieten (GiB)",
+"label.secretkey": "Geheime sleutel",
+"label.security.group.name": "Security Group Naam",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Ingeschakeld",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Security Groups",
+"label.select": "Selecteer",
+"label.select-view": "Selecteer Weergave",
+"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.tier": "Selecteer Tier",
+"label.select.vm.for.static.nat": "Selecteer VM voor static NAT",
+"label.self": "Eigen",
+"label.sent": "Verstuurd",
+"label.sentbytes": "Bytes Verzonden",
+"label.server": "Server",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "gedistribueerde router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastisch LB",
+"label.service.lb.inlinemodedropdown": "Modus",
+"label.service.lb.lbisolationdropdown": "LB isolatie",
+"label.service.offering": "Service Aanbieding",
+"label.service.offering.details": "dienst offerte gegevens",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundante router mogelijkheden",
+"label.service.state": "Service Status",
+"label.service.staticnat.associatepublicip": "Associeers Publiek IP",
+"label.service.staticnat.elasticipcheckbox": "Elastisch IP",
+"label.servicecapabilities": "Service Mogelijkheden",
+"label.servicelist": "Diensten",
+"label.serviceofferingid": "Compute aanbieding",
+"label.serviceofferingname": "Compute aanbieding",
+"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\u00eber netwerk",
+"label.setup.zone": "cre\u00eber zone",
+"label.shared": "Gedeeld",
+"label.sharedexecutable": "Gedeeld",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Toon Inkomende Regel",
+"label.shrinkok": "Verklein OK",
+"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.sizegb": "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.smbdomain": "SMB Domein",
+"label.smbpassword": "SMB Wachtwoord",
+"label.smbusername": "SMB Gebruikersnaam",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Naam",
+"label.snapshot.schedule": "cre\u00eber herhaalde momentopname",
+"label.snapshotlimit": "Snapshot Limieten",
+"label.snapshotmemory": "Snapshot geheugen",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Poort",
+"label.sockettimeout": "Socket Timeout",
+"label.source.nat.supported": "SourceNAT ondersteund",
+"label.sourcecidr": "Bron CIDR",
+"label.sourceipaddress": "bron IP adres",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Ondersteunde Source NAT type",
+"label.sourceport": "bron poort",
+"label.specify.vxlan": "Specificeer VXLAN",
+"label.specifyipranges": "Specificeer IP ranges",
+"label.specifyvlan": "Specificeer VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH sleutelpaar gegevens",
+"label.ssh.key.pairs": "SSH sleutel paren",
+"label.sshkeypair": "nieuw SSH sleutelpaar",
+"label.standard.us.keyboard": "standaard (Amerikaans-US) toetsenbord",
+"label.start.ip": "Start IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Start gereseveerd systeem IP",
+"label.start.vlan": "start VLAN",
+"label.start.vxlan": "start VXLAN",
+"label.startdate": "Op datum (start)",
+"label.startip": "Start IP",
+"label.startipv4": "IPv4 Begin IP",
+"label.startipv6": "IPv6 Begin IP",
+"label.startport": "Start Poort",
+"label.startquota": "quota waarde",
+"label.state": "Staat",
+"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.method": "kleef methode",
+"label.sticky.cookie-name": "Cookie naam",
+"label.sticky.expire": "Verloopt",
+"label.sticky.holdtime": "Wacht tijd",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "Lengte",
+"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": "Uitgeschakelde VMs",
+"label.storage": "Opslag",
+"label.storage.tags": "Opslag Tags",
+"label.storage.traffic": "Opslag Verkeer",
+"label.storageid": "Primaire Opslag",
+"label.storagepool": "opslag poel",
+"label.storagetags": "Opslag Tags",
+"label.storagetype": "Opslag Type",
+"label.subdomainaccess": "Subdomein Toegang",
+"label.submit": "Verstuur",
+"label.submitted.by": "[Verstuurd door: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Geslaagd",
+"label.sunday": "Zondag",
+"label.supportedservices": "Geondersteunde Diensten",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Ondersteund Region Level VPC",
+"label.supportsstrechedl2subnet": "Ondersteund Streched L2 Subnet",
+"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.offerings": "Systeem Aanbiedingen",
+"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.vms": "Systeem VMs",
+"label.system.wide.capacity": "Systeembreede capaciteit",
+"label.systemvmtype": "Systeem VM type",
+"label.tag.key": "Tag Sleutel",
+"label.tag.value": "Tag Waarde",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Doel IQN",
+"label.tariffvalue": "tarief waarde",
+"label.task.completed": "Taak uitgevoerd",
+"label.template": "Template",
+"label.templatebody": "inhoud",
+"label.templatedn": "Selecteer Template",
+"label.templatefileupload": "lokaal bestand",
+"label.templatelimit": "Template Limieten",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "onderwerp",
+"label.templatetotal": "Template",
+"label.templatetype": "e-mail sjabloon",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "Tier details",
+"label.tiername": "Tier",
+"label.time": "Tijd",
+"label.time.colon": "tijd:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " timeout (seconden)",
+"label.timezone": "Tijdzone",
+"label.timezone.colon": "tijdszone:",
+"label.token": "Token",
+"label.total.hosts": "Totaal Hosts",
+"label.total.memory": "Totaal Geheugen",
+"label.total.storage": "Totaal Opslag",
+"label.total.vms": "Totaal VMs",
+"label.totalcpu": "Totaal CPU",
+"label.traffic.label": "Verkeerslabel",
+"label.traffic.types": "Verkeer Types",
+"label.traffictype": "Verkeer Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Dinsdag",
+"label.type": "Type",
+"label.type.id": "Type ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "Brits toetsenbord",
+"label.unavailable": "Niet beschikbaar",
+"label.unhealthy.threshold": "ongezonde marge",
+"label.unit": "gebruik eenheid",
+"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.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.sanity.result": "gebruiks zingevings resultaat",
+"label.usage.server": "gebruik server",
+"label.usageinterface": "Verbruik Interface",
+"label.usagename": "gebruik type",
+"label.usageunit": "eenheid",
+"label.use.vm.ip": "Gebruik VM IP:",
+"label.use.vm.ips": "Gebruik VM IPs",
+"label.usehttps": "Gebruik HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Gebruiker",
+"label.user.details": "gebruikers gegevens",
+"label.user.vm": "gebruiker VM",
+"label.userdata": "Gebruikers gegevens",
+"label.userdatal2": "Gebruiker Data",
+"label.username": "Gebruikersnaam",
+"label.users": "Gebruikers",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "VCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Wachtwoord",
+"label.vcenterusername": "vCenter Gebruikersnaam",
+"label.vcipaddress": "vCenter IP Adres",
+"label.vcsdeviceid": "ID",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vCPU type",
+"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.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.virtualmachinedisplayname": "VM naam",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI Reeks",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Reeks",
+"label.vm.add": "Instantie Toevoegen",
+"label.vm.destroy": "Verwijder",
+"label.vm.password": "Het wachtwoord van de VM is",
+"label.vm.reboot": "Reboot",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Start",
+"label.vm.stop": "Stop",
+"label.vmdisplayname": "VM weergave naam",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "VM IP adres",
+"label.vmlimit": "Instantie Limieten",
+"label.vmname": "VM naam",
+"label.vms": "VMs",
+"label.vms.in.tier": "VMs in tier",
+"label.vmstate": "VM staat",
+"label.vmtotal": "Totaal VMs",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Naam",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware verkeerslabel",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC apparaten",
+"label.volgroup": "Volume Groep",
+"label.volume": "Volume",
+"label.volume.details": "volume gegevens",
+"label.volume.migrated": "volume gemigreerd",
+"label.volumechecksum": "MD5 checksum",
+"label.volumefileupload": "lokaal bestand",
+"label.volumegroup": "Volume Groep",
+"label.volumelimit": "Volume Limieten",
+"label.volumename": "Volume Naam",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC Aanbieding details",
+"label.vpc.offerings": "VPC Aanbiedingen",
+"label.vpc.router.details": "VPC router details",
+"label.vpc.virtual.router": "VPC Virtueele Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limieten",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Aanbieding",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN Connectie",
+"label.vpn.gateway": "VPN Gateway",
+"label.vpncustomergatewayid": "VPN Customer Gateway",
+"label.vsmctrlvlanid": "Controle VLAN ID",
+"label.vsmdeviceid": "Naam",
+"label.vsmdevicestate": "Staat",
+"label.vsmipaddress": "Nexus 1000v IP Adres",
+"label.vsmpassword": "Nexus 1000v Wachtwoord",
+"label.vsmpktvlanid": "Pakket VLAN ID",
+"label.vsmstoragevlanid": "Opslag VLAN ID",
+"label.vsmusername": "Nexus 1000v Gebruikersnaam",
+"label.vsmusername.req": "Nexus 1000v Gebruikersnaam",
+"label.vsphere.managed": "vSphere beheerd",
+"label.vswitch.name": "vSwitch naam",
+"label.vswitch.type": "vSwitch type",
+"label.vswitchguestname": "vSwitch Gast Verkeer Naam",
+"label.vswitchguesttype": "vSwitch Gast Verkeer Type",
+"label.vswitchpublicname": "vSwitch Publiek Verkeer Naam",
+"label.vswitchpublictype": "vSwitch Publiek Verkeer Type",
+"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.writecachetype": "Schrijf cache Type",
+"label.xennetworklabel": "XenServer verkeerslabel",
+"label.xenservertoolsversion61plus": "XenServer Tools Versie 6.1+",
+"label.yes": "Ja",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone toegewijd",
+"label.zone.details": "Zone details",
+"label.zone.id": "Zone ID",
+"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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "zone naam",
+"label.zones": "Zones",
+"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",
+"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.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.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.network": "Bevestig dat u dit netwerk wilt verwijderen.",
+"message.action.delete.nexusvswitch": "Bevestig dat u deze nexus 1000v wilt verwijderen",
+"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.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.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 \u00e9\u00e9n 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\u00ebren 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.add.vpn.gateway": "Bevestig dat u een VPN Gateway wilt toevoegen",
+"message.added.vpc.offering": "VPC aanbieding toegevoegd",
+"message.adding.host": "Host toevoegen",
+"message.adding.netscaler.device": "Netscaler toevoegen",
+"message.adding.netscaler.provider": "Netscaler provider 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.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\u00ebren?",
+"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.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.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.ciscoasa1000v": "bevestig dat u CiscoASA100v wilt verwijderen, alstublieft",
+"message.confirm.delete.ciscovnmc.resource": "Bevestig dat u de CiscoVNMC resource wilt verwijderen.",
+"message.confirm.delete.f5": "Bevestig dat u deze F5 wilt verwijderen",
+"message.confirm.delete.internal.lb": "bevestigd dat U interne LB wilt verwijderen, alstublieft",
+"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.secondary.staging.store": "Bevestig dat u de secudaire staging opslag wilt verwijderen.",
+"message.confirm.delete.srx": "Bevestig dat u deze SRX 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.event": "Weet u zeker dat u deze melding wilt verwijderen?",
+"message.confirm.remove.ip.range": "Bevestig dat u deze IP range 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.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone toewijding losgekoppeld",
+"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.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.desc.add.new.lb.sticky.rule": "voeg een nieuwe LB klevende regel toe",
+"message.desc.advanced.zone": "Voor ingewikkeldere netwerk topologie\u00ebn. 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\u00ebert 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 \u00e9\u00e9n 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 \u00e9\u00e9n of meerdere hosts en \u00e9\u00e9n 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\u00ebren. In dat geval, kopi\u00ebert en slaat van de private/geheime sleutel alsutblieft op. CloudStack zal het niet bewaren. <br>",
+"message.desc.created.ssh.key.pair": "Cre\u00eber 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 \u00e9\u00e9n 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 \u00e9\u00e9n 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 \u00e9\u00e9n 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\u00ebren. 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\u00eble 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\u00ebn 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\u00ebxporteerde 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\u00ebxporteerde 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 \u00e9\u00e9n 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 \u00e9\u00e9n 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\u00efmporteerd",
+"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.network.removenic": "Bevestig dat u deze netwerkkaart wilt verwijderen, de VM zal ontkoppeld worden van het netwerk wat aan de netwerkkaart aangesloten zit.",
+"message.network.updateip": "Bevestig alstublieft dat U het IP adres voor deze NIC op de VM wilt wijzigen.",
+"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.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 \u00e9\u00e9n 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 \u00e9\u00e9n 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\u00efnstalleerd 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.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.reset.vpn.connection": "Bevestig dat u deze VPN verbinding wilt resetten",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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.specifiy.tag.key.value": "Gelieve een tag sleutel en waarde te specificeren",
+"message.specify.url": "Gelieve een URL te specificeren",
+"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 \u00e9\u00e9n 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.template.iso": "Gelieve een template of ISO te selecteren om door te gaan",
+"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\u00e9 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\u00e9 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.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.validate.url": "Gelieve een geldige URL 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\u00ebren 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.xstools61plus.update.failed": "Kon XenServer Tools Version 6.1+ field niet updaten. Fout:",
+"message.you.must.have.at.least.one.physical.network": "U moet minimaal \u00e9\u00e9n fysiek netwerk hebben",
+"message.your.cloudstack.is.ready": "Uw CloudStack is klaar!",
+"message.zone.creation.complete": "De installatie van de zone is compleet",
+"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.",
+"network.rate": "Netwerk Snelheid",
+"side.by.side": "Zij aan Zij",
+"state.accepted": "Geaccepteerd",
+"state.active": "Actief",
+"state.allocating": "Alloceren",
+"state.backedup": "Geback-upt",
+"state.backingup": "Back-uppen",
+"state.completed": "Uitgevoerd",
+"state.creating": "Aanmaken",
+"state.declined": "Geweigerd",
+"state.destroyed": "Verwijderd",
+"state.detached": "ontkoppeld",
+"state.disabled": "Uitgeschakeld",
+"state.enabled": "Geactiveerd",
+"state.error": "Fout",
+"state.expunging": "Opruimen",
+"state.migrating": "MIgreren",
+"state.pending": "In afwachting",
+"state.running": "Draaiend",
+"state.starting": "Starten",
+"state.stopped": "Gestopt",
+"state.stopping": "Stoppen",
+"state.suspended": "Gepauzeerd",
+"title.upload.volume": "laad volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/pl.json b/ui/public/locales/pl.json
new file mode 100644
index 0000000..29c1c06
--- /dev/null
+++ b/ui/public/locales/pl.json
@@ -0,0 +1,2364 @@
+{
+"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\u0142\u0119dna nazwa u\u017cytkownika lub has\u0142o",
+"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.unable.to.reach.management.server": "Unable to reach Management Server",
+"error.unresolved.internet.name": "Your internet name cannot be resolved.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "Image Directory",
+"inline": "Inline",
+"label.about": "About",
+"label.about.app": "About CloudStack",
+"label.accept.project.invitation": "Accept project invitation",
+"label.accesskey": "Access Key",
+"label.account": "Konto",
+"label.account.and.security.group": "Account, Security group",
+"label.account.details": "Account details",
+"label.account.id": "ID konta",
+"label.account.name": "Nazwa konta",
+"label.account.specific": "Account-Specific",
+"label.accounts": "Konta",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "Network ACL Total",
+"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\u0144 has\u0142o",
+"label.action.change.service": "Change Service",
+"label.action.change.service.processing": "Changing Service....",
+"label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
+"label.action.configure.stickiness": "Stickiness",
+"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.from.vm": "Utw\u00f3rz szablon z VM",
+"label.action.create.template.from.volume": "Utw\u00f3rz Szablon z wolumenu",
+"label.action.create.template.processing": "Tworz\u0119 szablon",
+"label.action.create.vm": "Utw\u00f3rz VM",
+"label.action.create.vm.processing": "Tworz\u0119 VM....",
+"label.action.create.volume": "Utw\u00f3rz wolumen",
+"label.action.create.volume.processing": "Tworz\u0119 wolumen....",
+"label.action.delete.account": "Usu\u0144 dost\u0119p",
+"label.action.delete.account.processing": "Usuwanie dost\u0119pu....",
+"label.action.delete.cluster": "Usu\u0144 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\u0144 domen\u0119",
+"label.action.delete.domain.processing": "Usuwam domen\u0119....",
+"label.action.delete.firewall": "Usu\u0144 regu\u0142\u0119 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.ip.range": "Delete IP Range",
+"label.action.delete.ip.range.processing": "Deleting IP Range....",
+"label.action.delete.iso": "Usu\u0144 ISO",
+"label.action.delete.iso.processing": "Usuwam ISO....",
+"label.action.delete.load.balancer": "Delete load balancer rule",
+"label.action.delete.load.balancer.processing": "Deleting Load Balancer....",
+"label.action.delete.network": "Usu\u0144 sie\u0107",
+"label.action.delete.network.processing": "Usuwam sie\u0107....",
+"label.action.delete.nexusvswitch": "Usu\u0144 Nexus 1000v",
+"label.action.delete.nic": "Remove NIC",
+"label.action.delete.physical.network": "Usu\u0144 fizyczn\u0105 sie\u0107",
+"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\u0144 u\u017cytkownika",
+"label.action.delete.user.processing": "Usuwam u\u017cytkownika....",
+"label.action.delete.volume": "Usu\u0144 wolumen",
+"label.action.delete.volume.processing": "Usuwam wolumen....",
+"label.action.delete.zone": "Usu\u0144 stref\u0119",
+"label.action.delete.zone.processing": "Usuwam stref\u0119....",
+"label.action.destroy.instance": "Usu\u0144 instancj\u0119",
+"label.action.destroy.instance.processing": "Usuwam instancj\u0119",
+"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\u0142\u0105cz dysk",
+"label.action.detach.disk.processing": "Od\u0142\u0105czanie dysku....",
+"label.action.detach.iso": "Od\u0142\u0105cz obraz ISO",
+"label.action.detach.iso.processing": "Od\u0142\u0105czanie obrazu ISO",
+"label.action.disable.account": "Wy\u0142\u0105cz dost\u0119p",
+"label.action.disable.account.processing": "Wy\u0142\u0105czam dost\u0119p....",
+"label.action.disable.cluster": "Wy\u0142\u0105cz klaster",
+"label.action.disable.cluster.processing": "Wy\u0142\u0105czam klaster....",
+"label.action.disable.nexusvswitch": "Wy\u0142\u0105cz Nexus 1000v",
+"label.action.disable.physical.network": "Wy\u0142\u0105cz fizyczn\u0105 sie\u0107",
+"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\u0142\u0105cz u\u017cytkownika",
+"label.action.disable.user.processing": "Wy\u0142\u0105czam u\u017cytkownika",
+"label.action.disable.zone": "Wy\u0142\u0105cz stref\u0119",
+"label.action.disable.zone.processing": "Wy\u0142\u0105czam stref\u0119....",
+"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.account": "Edytuj dost\u0119p",
+"label.action.edit.disk.offering": "Edit Disk Offering",
+"label.action.edit.domain": "Edytuj domen\u0119",
+"label.action.edit.global.setting": "Edytuj Globalne ustawienia",
+"label.action.edit.host": "Edytuj host",
+"label.action.edit.instance": "Edytuj instancj\u0119",
+"label.action.edit.iso": "Edytuj ISO",
+"label.action.edit.network": "Edytuj sie\u0107",
+"label.action.edit.network.offering": "Edit Network Offering",
+"label.action.edit.network.processing": "Zmieniam sie\u0107....",
+"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\u017cytkownika",
+"label.action.edit.zone": "Edytuj stref\u0119",
+"label.action.enable.account": "W\u0142\u0105cz dost\u0119p",
+"label.action.enable.account.processing": "W\u0142\u0105czam dost\u0119p....",
+"label.action.enable.cluster": "W\u0142\u0105cz klaster",
+"label.action.enable.cluster.processing": "W\u0142\u0105czam klaster....",
+"label.action.enable.maintenance.mode": "Enable Maintenance Mode",
+"label.action.enable.maintenance.mode.processing": "Enabling Maintenance Mode....",
+"label.action.enable.nexusvswitch": "W\u0142\u0105cz Nexus 1000v",
+"label.action.enable.physical.network": "W\u0142\u0105cz fizyczn\u0105 sie\u0107",
+"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\u0142\u0105cz u\u017cytkownika",
+"label.action.enable.user.processing": "W\u0142\u0105czam u\u017cytkownika....",
+"label.action.enable.zone": "W\u0142\u0105cz stref\u0119",
+"label.action.enable.zone.processing": "W\u0142\u0105czam stref\u0119....",
+"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\u0119 klucze....",
+"label.action.list.nexusvswitch": "Kista Nexus 1000v",
+"label.action.lock.account": "Zablokuj dost\u0119p",
+"label.action.lock.account.processing": "Blokuj\u0119 dost\u0119p....",
+"label.action.manage.cluster": "Zarz\u0105dzaj klastrem",
+"label.action.manage.cluster.processing": "Zarz\u0105dzam klastrem....",
+"label.action.migrate.instance": "Migruj instancj\u0119",
+"label.action.migrate.instance.processing": "Migruj\u0119 instancj\u0119....",
+"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\u0119 system VM....",
+"label.action.project.add.account": "Dodaj konto do projektu",
+"label.action.reboot.instance": "Restartuj instancj\u0119",
+"label.action.reboot.instance.processing": "Restartuje instancj\u0119",
+"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\u0144 host",
+"label.action.remove.host.processing": "Usuwam host....",
+"label.action.reset.password": "Resetuj has\u0142o",
+"label.action.reset.password.processing": "Resetuj\u0119 has\u0142o....",
+"label.action.resize.volume": "Zmie\u0144 wielko\u015b\u0107 wolumenu",
+"label.action.resize.volume.processing": "Zmieniam wielko\u015b\u0107 wolumenu....",
+"label.action.resource.limits": "Resource limits",
+"label.action.restore.instance": "Przywr\u00f3\u0107 instancj\u0119",
+"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\u0119",
+"label.action.start.instance.processing": "Uruchamiam instancj\u0119....",
+"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\u0119",
+"label.action.stop.instance.processing": "Zatrzymuj\u0119 instancj\u0119....",
+"label.action.stop.router": "Zatrzymaj router",
+"label.action.stop.router.processing": "Zatrzymuj\u0119 router...",
+"label.action.stop.systemvm": "Zatrzymaj system VM",
+"label.action.stop.systemvm.processing": "Zatrzymuj\u0119 system VM....",
+"label.action.take.snapshot": "Zr\u00f3b snapshot",
+"label.action.take.snapshot.processing": "Tworz\u0119 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.activeviewersessions": "Active Sessions",
+"label.add": "Dodaj",
+"label.add.account": "Dodaj konto",
+"label.add.accounts": "Dodaj konta",
+"label.add.accounts.to": "Dodaj konto do",
+"label.add.acl": "Dodaj ACL",
+"label.add.acl.list": "Add 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.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"label.add.by": "Dodaj przez",
+"label.add.by.cidr": "Dodaj przez CIDR",
+"label.add.by.group": "Dodaj przez grup\u0119",
+"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\u0119",
+"label.add.egress.rule": "Add egress rule",
+"label.add.f5.device": "Add F5 device",
+"label.add.firewall": "Dodaj regu\u0142\u0119 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\u0119cej",
+"label.add.netscaler.device": "Add Netscaler device",
+"label.add.network": "Dodaj sie\u0107",
+"label.add.network.acl": "Add network ACL",
+"label.add.network.acl.list": "Add Network ACL List",
+"label.add.network.device": "Dodaj urz\u0105dzenie sieciowe",
+"label.add.network.offering": "Add network offering",
+"label.add.new.f5": "Dodaj nowy F5",
+"label.add.new.gateway": "Add new gateway",
+"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.tier": "Add new tier",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "Add Nvp Controller",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "Add Palo Alto device",
+"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\u0142\u0119",
+"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.srx.device": "Add SRX device",
+"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\u017cytkownika",
+"label.add.vlan": "Dodaj VLAN",
+"label.add.vm": "Dodaj VM",
+"label.add.vm.to.tier": "Add VM to tier",
+"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.gateway": "Add VPN Gateway",
+"label.add.vpn.user": "Add VPN user",
+"label.add.vxlan": "Add VXLAN",
+"label.add.zone": "Dodaj stref\u0119",
+"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.address": "Address",
+"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.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "Agent Password",
+"label.agent.username": "Agent Username",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "Agree",
+"label.alert": "Alert",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "Alarmy",
+"label.algorithm": "Algorithm",
+"label.all": "Wszystko",
+"label.allocated": "Allocated",
+"label.allocationstate": "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.version": "API Version",
+"label.apikey": "Klucz API",
+"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.associatednetwork": "Associated Network",
+"label.associatednetworkid": "Associated Network ID",
+"label.associatednetworkname": "Nazwa sieci",
+"label.author.email": "Author e-mail",
+"label.author.name": "Imi\u0119 autora",
+"label.autoscale": "AutoScale",
+"label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
+"label.availability": "Availability",
+"label.availabilityzone": "availabilityZone",
+"label.available": "Dost\u0119pne",
+"label.available.public.ips": "Dost\u0119pne publiczne adresy IP",
+"label.back": "Wstecz",
+"label.balance": "Balance",
+"label.bandwidth": "Przepustowo\u015b\u0107",
+"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.baremetalcpu": "CPU (w MHz)",
+"label.baremetalcpucores": "# of CPU Cores",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "Pami\u0119\u0107 (w MB)",
+"label.basic": "Basic",
+"label.basic.mode": "Basic Mode",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "Bootable",
+"label.broadcastdomainrange": "Broadcast domain range",
+"label.broadcastdomaintype": "Broadcast Domain Type",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "By Account",
+"label.by.alert.type": "By alert type",
+"label.by.availability": "By Availability",
+"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.cachemode": "Write-cache Type",
+"label.cancel": "Zako\u0144cz",
+"label.capacity": "Capacity",
+"label.capacity.iops": "Capacity IOPS",
+"label.capacitybytes": "Capacity Bytes",
+"label.capacityiops": "IOPS Total",
+"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.of.destination.network": "CIDR of destination network",
+"label.cidrlist": "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.cleanup": "Wyczy\u015b\u0107",
+"label.clear.list": "Wyczy\u015b\u0107 list\u0119",
+"label.close": "Zamknij",
+"label.cloud.console": "Cloud Management Console",
+"label.cloud.managed": "Cloud.com Managed",
+"label.cluster": "Cluster",
+"label.cluster.name": "Cluster Name",
+"label.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Cluster Name",
+"label.clusters": "Clusters",
+"label.clustertype": "Cluster Type",
+"label.clvm": "CLVM",
+"label.code": "Kod",
+"label.community": "Spo\u0142eczno\u015b\u0107",
+"label.compute": "Compute",
+"label.compute.and.storage": "Compute and Storage",
+"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.confirmation": "Potwierdzenie",
+"label.confirmdeclineinvitation": "Are you sure you want to decline this project invitation?",
+"label.confirmpassword": "Potwierd\u017a has\u0142o",
+"label.congratulations": "Gratulacje!",
+"label.connectiontimeout": "Connection Timeout",
+"label.conservemode": "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.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU Allocated",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "CPU Allocated for VMs",
+"label.cpuallocatedghz": "Allocated",
+"label.cpulimit": "Limit CPU",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (w MHz)",
+"label.cputotal": "Total CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilized",
+"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\u00f3rz projekt",
+"label.create.ssh.key.pair": "Create a SSH Key Pair",
+"label.create.template": "Create template",
+"label.create.vpn.connection": "Create VPN Connection",
+"label.created": "Utworzono",
+"label.created.by.system": "Utworzono przez system",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "Cross Zones",
+"label.current": "isCurrent",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "Custom Disk Size",
+"label.daily": "Dziennie",
+"label.dashboard": "Dashboard",
+"label.data.disk.offering": "Data Disk Offering",
+"label.date": "Data",
+"label.day": "Day",
+"label.day.of.month": "Dzie\u0144 miesi\u0105ca",
+"label.day.of.week": "Dzie\u0144 tygodnia",
+"label.dc.name": "DC Name",
+"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\u015blnie",
+"label.default.use": "Default Use",
+"label.default.view": "Widok domy\u015blny",
+"label.delete": "Usu\u0144",
+"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.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "Delete events",
+"label.delete.f5": "Usu\u0144 F5",
+"label.delete.gateway": "Delete gateway",
+"label.delete.internal.lb": "Delete Internal LB",
+"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.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "Usu\u0144 projekt",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "Usu\u0144 SRX",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"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.vpn.user": "Delete VPN user",
+"label.deleteprofile": "Delete Profile",
+"label.deleting.failed": "Usuwanie nieudane",
+"label.deleting.processing": "Usuwanie....",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "Description",
+"label.destinationphysicalnetworkid": "Destination physical network ID",
+"label.destinationzoneid": "Destination Zone",
+"label.destroy": "Zniszcz",
+"label.destroy.router": "Zniszcz router",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "Od\u0142\u0105czanie dysku",
+"label.details": "Szczeg\u00f3\u0142y",
+"label.deviceid": "Device ID",
+"label.devices": "Devices",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP Server Type",
+"label.direct.attached.public.ip": "Direct Attached Public IP",
+"label.direct.ips": "Shared Network IPs",
+"label.directdownload": "Direct Download",
+"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\u0142\u0105cz VPN",
+"label.disabled": "Wy\u0142\u0105czony",
+"label.disabling.vpn.access": "Disabling VPN Access",
+"label.disassociate.profile.blade": "Disassociate Profile from Blade",
+"label.disbale.vnmc.device": "Disable VNMC device",
+"label.disconnected": "Last Disconnected",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "Disk Offerings",
+"label.disk.size": "Wielko\u015b\u0107 dysku",
+"label.disk.volume": "Disk Volume",
+"label.diskbytesreadrate": "Disk Read Rate (BPS)",
+"label.diskbyteswriterate": "Disk Write Rate (BPS)",
+"label.diskiopsmax": "Max IOPS",
+"label.diskiopsmin": "Min IOPS",
+"label.diskiopsreadrate": "Disk Read Rate (IOPS)",
+"label.diskiopswriterate": "Disk Write Rate (IOPS)",
+"label.diskioread": "Disk Read (IO)",
+"label.diskiowrite": "Disk Write (IO)",
+"label.diskkbsread": "Disk Read (Bytes)",
+"label.diskkbswrite": "Disk Write (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Disk Offering",
+"label.diskofferingid": "Disk Offering",
+"label.disksize": "Wielko\u015b\u0107 dysku (w GB)",
+"label.disksizeallocated": "Disk Allocated",
+"label.disksizeallocatedgb": "Allocated",
+"label.disksizetotal": "Disk Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "U\u017cyte",
+"label.display.text": "Display Text",
+"label.displayname": "Display Name",
+"label.displaytext": "Description",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS domain for Guest Networks",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Domena",
+"label.domains": "Domena",
+"label.domain.details": "Domain details",
+"label.domain.name": "Nazwa domeny",
+"label.domain.router": "Domain router",
+"label.domain.suffix": "DNS Domain Suffix (i.e., xyz.com)",
+"label.domainid": "ID domeny",
+"label.domainname": "Domena",
+"label.domainpath": "Domena",
+"label.done": "Sko\u0144czono",
+"label.double.quotes.are.not.allowed": "Double quotes are not allowed",
+"label.download.progress": "Post\u0119p w pobieraniu",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "Przenie\u015b w nowe miejsce",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "Edytuj",
+"label.edit.acl.list": "Edit ACL List",
+"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\u00f3\u0142y sieci",
+"label.edit.project.details": "Zmie\u0144 szczeg\u00f3\u0142y 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.egressdefaultpolicy": "Default egress policy",
+"label.elastic": "Elastyczny",
+"label.email": "Poczta",
+"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\u0142\u0105cz VPN",
+"label.enabling.vpn": "Enabling VPN",
+"label.enabling.vpn.access": "Enabling VPN Access",
+"label.end.ip": "End IP",
+"label.end.reserved.system.ip": "End Reserved system IP",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "By date (end)",
+"label.endip": "End IP",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "Endpoint",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "End Port",
+"label.enter.token": "Enter token",
+"label.error": "B\u0142\u0105d",
+"label.error.code": "Error Code",
+"label.error.something.went.wrong.please.correct.the.following": "Something went wrong; please correct the following",
+"label.error.upper": "ERROR",
+"label.espencryption": "ESP Encryption",
+"label.esphash": "ESP Hash",
+"label.esplifetime": "ESP Lifetime (second)",
+"label.esppolicy": "ESP policy",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "Events",
+"label.every": "Every",
+"label.example": "Example",
+"label.expunge": "Expunge",
+"label.external.link": "External link",
+"label.f5": "F5",
+"label.f5.details": "F5 details",
+"label.failed": "B\u0142\u0105d",
+"label.featured": "Polecane",
+"label.fetch.latest": "Fetch latest",
+"label.filterby": "Filtrowanie wg",
+"label.fingerprint": "FingerPrint",
+"label.firewall": "Zapora",
+"label.firstname": "Pierwsza nazwa",
+"label.firstname.lower": "firstname",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "Format",
+"label.friday": "Pi\u0105tek",
+"label.full": "Full",
+"label.full.path": "Pe\u0142na \u015bcie\u017cka",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Wpisz",
+"label.fwdevicestate": "Status",
+"label.gateway": "Gateway",
+"label.general.alerts": "General Alerts",
+"label.generating.url": "Generating URL",
+"label.global.settings": "Global Settings",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "Volume",
+"label.go.step.2": "Id\u017a do punktu 2",
+"label.go.step.3": "Id\u017a do punktu 3",
+"label.go.step.4": "Id\u017a do punktu 4",
+"label.go.step.5": "Id\u017a 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.lb.details": "Load balancing details",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "Service Type",
+"label.guest": "Go\u015b\u0107",
+"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.guestcidraddress": "Guest CIDR",
+"label.guestendip": "Guest end IP",
+"label.guestgateway": "Guest Gateway",
+"label.guestipaddress": "Guest IP Address",
+"label.guestiptype": "Rodzaj go\u015bci",
+"label.guestnetmask": "Guest Netmask",
+"label.guestnetworkid": "ID sieci",
+"label.guestnetworkname": "Nazwa sieci",
+"label.guestosid": "OS Type",
+"label.gueststartip": "Guest start IP",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "HA Enabled",
+"label.hahost": "HA Enabled",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "Please confirm that you want to take a snapshot of this volume.",
+"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.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Host Tag",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Host Tags",
+"label.hourly": "Hourly",
+"label.hypervisor": "Hypervisor",
+"label.hypervisor.capabilities": "Hypervisor capabilities",
+"label.hypervisor.type": "Hypervisor Type",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "Hypervisor",
+"label.hypervisorversion": "Hypervisor version",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "ICMP Code",
+"label.icmptype": "ICMP Type",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "IKE Encryption",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE lifetime (second)",
+"label.ikepolicy": "IKE policy",
+"label.info": "Informacje",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infrastruktura",
+"label.ingress.rule": "Ingress Rule",
+"label.initiated.by": "Initiated By",
+"label.insideportprofile": "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.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.name": "Instance Name",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "Internal name",
+"label.instanceport": "Instance Port",
+"label.instances": "Instancje",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"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.internaldns1": "Internal DNS 1",
+"label.internaldns2": "Internal DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "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\u015b",
+"label.invite.to": "Zapro\u015b do",
+"label.invited.accounts": "Zaproszone konta",
+"label.ip": "IP",
+"label.ip.allocations": "IP Allocations",
+"label.ip.or.fqdn": "IP or FQDN",
+"label.ip.range": "IP Range",
+"label.ip.ranges": "IP Ranges",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP Address",
+"label.ipaddress1": "IP Address",
+"label.ipaddress2": "IP Address",
+"label.iplimit": "Public IP Limits",
+"label.ips": "IP",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "Total of IP Addresses",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.redundant.router": "Redundant",
+"label.is.shared": "Is Shared",
+"label.isadvanced": "Show advanced settings",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Custom Disk Size",
+"label.iscustomizeddiskiops": "Custom IOPS",
+"label.iscustomizediops": "Custom IOPS",
+"label.isdedicated": "Dedykowany",
+"label.isdefault": "Is Default",
+"label.isdynamicallyscalable": "Dynamically Scalable",
+"label.isextractable": "Extractable",
+"label.isfeatured": "Polecane",
+"label.isforced": "Force Delete",
+"label.ismanaged": "Managed",
+"label.iso": "ISO",
+"label.iso.boot": "ISO Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Isolated networks",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "Isolation method",
+"label.isolation.mode": "Isolation Mode",
+"label.isolationmethod": "Isolation method",
+"label.isolationmethods": "Isolation method",
+"label.isolationuri": "Isolation URI",
+"label.isoname": "Attached ISO",
+"label.isos": "ISO",
+"label.ispasswordenabled": "Password Enabled",
+"label.ispersistent": "Persistent ",
+"label.isportable": "Cross Zones",
+"label.ispublic": "Pobliczny",
+"label.isready": "Gotowe",
+"label.isredundantrouter": "Redundant Router",
+"label.isrouting": "Routing",
+"label.isshared": "Shared",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "Static NAT",
+"label.issystem": "Is System",
+"label.isvolatile": "Volatile",
+"label.item.listing": "Item listing",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Zostaw",
+"label.keep.colon": "Keep:",
+"label.key": "Klucz",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "Keyboard type",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "KVM traffic label",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"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\u0144ski",
+"label.lang.korean": "Korea\u0144ski",
+"label.lang.norwegian": "Norwegian",
+"label.lang.polish": "Polish",
+"label.lang.russian": "Rosyjski",
+"label.lang.spanish": "Hiszpia\u0144ski",
+"label.last.updated": "Last Update",
+"label.lastname": "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\u0142\u0105czenie",
+"label.lb.algorithm.roundrobin": "Round-robin",
+"label.lb.algorithm.source": "Source",
+"label.lbdevicededicated": "Dedykowany",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Wpisz",
+"label.lbdevicestate": "Status",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "Poziom",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "Link Local IP Address",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Load balancing policies",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "Load balancing rule",
+"label.loadbalancing": "Load Balancing",
+"label.loading": "Wczytywanie",
+"label.local": "Lokalne",
+"label.local.storage": "Pami\u0119\u0107 lokalna",
+"label.local.storage.enabled": "Enable local storage for User VMs",
+"label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
+"label.localstorageenabled": "Enable local storage for User VMs",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "Zaloguj",
+"label.logout": "Wyloguj",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "Make account project owner",
+"label.makeredundant": "Make redundant",
+"label.manage": "Manage",
+"label.manage.resources": "Manage Resources",
+"label.management": "Management",
+"label.management.ips": "Management IP Addresses",
+"label.management.server": "Management Server",
+"label.max.primary.storage": "Max. primary (GiB)",
+"label.max.secondary.storage": "Max. secondary (GiB)",
+"label.maxcpu": "Max. CPU cores",
+"label.maxerrorretry": "Max Error Retry",
+"label.maxguestslimit": "Maksymalna liczba go\u015bci",
+"label.maximum": "Maksimum",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "Max IOPS",
+"label.maxmemory": "Max. memory (MiB)",
+"label.maxnetwork": "Max. networks",
+"label.maxpublicip": "Maksymalna liczba publicznych adres\u00f3w IP",
+"label.maxsnapshot": "Max. snapshots",
+"label.maxtemplate": "Max. templates",
+"label.maxuservm": "Max. user VMs",
+"label.maxvolume": "Max. volumes",
+"label.maxvpc": "Max. VPCs",
+"label.may.continue": "You may now continue.",
+"label.memallocated": "Mem Allocation",
+"label.memory": "Pami\u0119\u0107",
+"label.memory.total": "Memory Total",
+"label.memory.used": "Memory Used",
+"label.memoryallocated": "Memory Allocated",
+"label.memoryallocatedgb": "Allocated",
+"label.memorylimit": "Limit pami\u0119ci (MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "Memory Allocated",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "U\u017cyte",
+"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.destroyed.instances": "Destroyed Instances",
+"label.menu.featured.isos": "Featured ISOs",
+"label.menu.featured.templates": "Featured Templates",
+"label.menu.ipaddresses": "Adresy IP",
+"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.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.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Stopped Instances",
+"label.menu.storage": "Storage",
+"label.menu.system": "System",
+"label.menu.virtual.appliances": "Virtual Appliances",
+"label.menu.virtual.resources": "Virtual Resources",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"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.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.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "Minimum",
+"label.mininstance": "Min Instances",
+"label.miniops": "Min IOPS",
+"label.minute.past.hour": "minute(s) past the hour",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "Poniedzia\u0142ek",
+"label.monthly": "Miesi\u0119cznie",
+"label.more.templates": "More Templates",
+"label.move.down.row": "Jeden rz\u0105d na d\u00f3\u0142",
+"label.move.to.bottom": "Move to bottom",
+"label.move.to.top": "Przenie\u015b na sam\u0105 g\u00f3r\u0119",
+"label.move.up.row": "Jeden rz\u0105d do g\u00f3ry",
+"label.my.account": "Moje konto",
+"label.my.network": "Moja sie\u0107",
+"label.my.templates": "My templates",
+"label.na": "N/A",
+"label.name": "Nazwa",
+"label.name.optional": "Nazwa (opcjonalnie)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "NAT Port Range",
+"label.netmask": "Netmask",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "Sie\u0107",
+"label.network.acl": "Network ACL",
+"label.network.acls": "Network ACLs",
+"label.network.addvm": "Add network to VM",
+"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.label.display.for.blank.value": "Use default gateway",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Network Offerings",
+"label.network.service.providers": "Network Service Providers",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "Wpisz",
+"label.networkdomain": "Network Domain",
+"label.networkdomaintext": "Network Domain",
+"label.networkid": "Sie\u0107",
+"label.networking.and.security": "Networking and security",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Network limits",
+"label.networkname": "Nazwa sieci",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Network Rate (Mb/s)",
+"label.networkread": "Network Read",
+"label.networks": "Sieci",
+"label.networktype": "Network Type",
+"label.networkwrite": "Network Write",
+"label.new": "Nowy",
+"label.new.password": "New Password",
+"label.new.project": "Nowy projekt",
+"label.new.vm": "New VM",
+"label.newdiskoffering": "New Offering",
+"label.newsize": "New Size (GB)",
+"label.next": "Nast\u0119pny",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS Storage",
+"label.nfscachenfsserver": "Serwer NFS",
+"label.nfscachepath": "\u015acie\u017cka",
+"label.nfscachezoneid": "Zone",
+"label.nfsserver": "Serwer NFS",
+"label.nicadaptertype": "NIC adapter type",
+"label.nicira.controller.address": "Controller Address",
+"label.nicira.nvp.details": "Nicira NVP details",
+"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.none": "Brak",
+"label.noselect": "Nie dzi\u0119kuj\u0119",
+"label.not.found": "Not Found",
+"label.notifications": "Przypomnienia",
+"label.num.cpu.cores": "# of CPU Cores",
+"label.number": "#Rule",
+"label.number.of.clusters": "Number of Clusters",
+"label.number.of.hosts": "Liczba host\u00f3w",
+"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.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "Number of Retries",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "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.optional": "Optional",
+"label.order": "Zadanie",
+"label.oscategoryid": "OS Preference",
+"label.ostypeid": "OS Type",
+"label.ostypename": "OS Type",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "Owned Public IP Addresses",
+"label.owner.account": "Owner Account",
+"label.owner.domain": "Owner Domain",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "Parent Domain",
+"label.parentname": "Parent",
+"label.passive": "Passive",
+"label.password": "Has\u0142o",
+"label.password.reset.confirm": "Password has been reset to ",
+"label.passwordenabled": "Password Enabled",
+"label.path": "\u015acie\u017cka",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Virtual Router",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "Physical Network",
+"label.physical.network.id": "Physical network ID",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "Physical Network",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "PING storage IP",
+"label.plannermode": "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\u0119 czeka\u0107",
+"label.plugin.details": "Szczeg\u00f3\u0142y wtyczki",
+"label.plugins": "Wtyczki",
+"label.pod": "Pod",
+"label.pod.dedicated": "Pod Dedicated",
+"label.pod.name": "Pod name",
+"label.podid": "Pod",
+"label.podname": "Pod name",
+"label.pods": "Pods",
+"label.port": "Port",
+"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.portableipaddress": "Portable IPs",
+"label.portforwarding": "Port Forwarding",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "Wstecz",
+"label.primary.network": "Primary Network",
+"label.primary.storage": "Primary Storage",
+"label.primary.storage.allocated": "Primary Storage Allocated",
+"label.primary.storage.count": "Primary Storage Pools",
+"label.primary.storage.used": "Primary Storage Used",
+"label.primarystoragelimit": "Primary Storage limits (GiB)",
+"label.primarystoragetotal": "Primary Storage",
+"label.private.gateway": "Private Gateway",
+"label.private.interface": "Private Interface",
+"label.private.ip.range": "Private IP Range",
+"label.private.ips": "Private IP Addresses",
+"label.private.zone": "Private Zone",
+"label.privateinterface": "Private Interface",
+"label.privateip": "Private IP Address",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Sie\u0107 prywatna",
+"label.privateport": "Private Port",
+"label.profiledn": "Associated Profile",
+"label.profilename": "Profile",
+"label.project": "Projekt",
+"label.project.dashboard": "Project dashboard",
+"label.project.invite": "Zapro\u015b do projektu",
+"label.project.name": "Nazwa projektu",
+"label.project.view": "Project View",
+"label.projectid": "Nazwa ID projektu",
+"label.projects": "Projekty",
+"label.property": "Property",
+"label.protocol": "Protok\u00f3\u0142",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "Provider",
+"label.providername": "Provider",
+"label.providers": "Dostawcy",
+"label.provisioningtype": "Provisioning Type",
+"label.public.interface": "Public Interface",
+"label.public.ip": "Publiczny adres IP",
+"label.public.ip.addresses": "Publiczne adresy IP",
+"label.public.ips": "Publiczne adresy IP",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "Sie\u0107 publiczna",
+"label.public.traffic": "Public traffic",
+"label.public.zone": "Public Zone",
+"label.publicinterface": "Public Interface",
+"label.publicip": "IP Address",
+"label.publickey": "Public Key",
+"label.publicnetwork": "Sie\u0107 publiczna",
+"label.publicport": "Publiczny port",
+"label.purpose": "Purpose",
+"label.pxe.server.type": "Pxe Server Type",
+"label.qostype": "QoS Type",
+"label.quickview": "Quickview",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "Wszystkie konta",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "Uruchom ponownie",
+"label.receivedbytes": "Bytes Received",
+"label.recent.errors": "Recent Errors",
+"label.recover.vm": "Recover VM",
+"label.redundantrouter": "Redundant Router",
+"label.redundantrouterstate": "Redundant state",
+"label.redundantstate": "Redundant state",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Od\u015bwie\u017c",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "Region",
+"label.region.details": "Region details",
+"label.reinstall.vm": "Reinstall VM",
+"label.related": "Related",
+"label.relationaloperator": "Operator",
+"label.release.account": "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\u00f3\u017aniej",
+"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\u0144 regu\u0142\u0119",
+"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\u0144 VPC",
+"label.remove.vpc.offering": "Remove VPC offering",
+"label.removing": "Usuwanie",
+"label.removing.user": "Usu\u0144 u\u017cytkownika",
+"label.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "Wymagane",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "Reserved system gateway",
+"label.reserved.system.ip": "Reserved System IP",
+"label.reserved.system.netmask": "Reserved system netmask",
+"label.reservediprange": "Reserved IP Range",
+"label.reservedsystemendip": "End Reserved system IP",
+"label.reservedsystemgateway": "Reserved system gateway",
+"label.reservedsystemnetmask": "Reserved system netmask",
+"label.reservedsystemstartip": "Start Reserved system IP",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "Reset VPN connection",
+"label.resetvm": "Reset VM",
+"label.resource": "Zas\u00f3b",
+"label.resource.limit.exceeded": "Resource Limit Exceeded",
+"label.resource.limits": "Limit zasob\u00f3w",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "Zasoby",
+"label.resourcestate": "Resource state",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "Restart network",
+"label.restart.vpc": "Restart VPC",
+"label.restartrequired": "Wymagany restart",
+"label.restore": "Restore",
+"label.retry.interval": "Retry Interval",
+"label.review": "Review",
+"label.revoke.project.invite": "Revoke invitation",
+"label.role": "Role",
+"label.rolename": "Role",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "Root Disk Offering",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "Root disk controller",
+"label.rootdiskcontrollertypekvm": "Root disk controller",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "Total of Virtual Routers",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "Wpisz",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "Rule Number",
+"label.rules": "Zasady",
+"label.running": "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.samlenable": "Authorize SAML SSO",
+"label.samlentity": "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.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.vm": "Secondary storage VM",
+"label.secondary.used": "Secondary Storage Used",
+"label.secondaryips": "Secondary IPs",
+"label.secondarystoragelimit": "Secondary Storage limits (GiB)",
+"label.secretkey": "Secret Key",
+"label.security.group.name": "Security Group Name",
+"label.security.groups": "Security Groups",
+"label.security.groups.enabled": "Security Groups Enabled",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Security Groups",
+"label.select": "Wybierz",
+"label.select-view": "Select view",
+"label.select.a.zone": "Select a zone",
+"label.select.instance": "Wybierz instancj\u0119",
+"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.tier": "Select Tier",
+"label.select.vm.for.static.nat": "Select VM for static NAT",
+"label.self": "Mine",
+"label.sent": "Wys\u0142ano",
+"label.sentbytes": "Bytes Sent",
+"label.server": "Serwer",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "Elastic LB",
+"label.service.lb.inlinemodedropdown": "Tryb",
+"label.service.lb.lbisolationdropdown": "LB isolation",
+"label.service.offering": "Service Offering",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Redundant router capability",
+"label.service.state": "Service State",
+"label.service.staticnat.associatepublicip": "Associate Public IP",
+"label.service.staticnat.elasticipcheckbox": "Zmienne IP",
+"label.servicecapabilities": "Service Capabilities",
+"label.servicelist": "Services",
+"label.serviceofferingid": "Compute offering",
+"label.serviceofferingname": "Compute offering",
+"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.sharedexecutable": "Shared",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Show Ingress Rule",
+"label.shrinkok": "Shrink OK",
+"label.shutdown.provider": "Shutdown provider",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.size": "Wielko\u015bc",
+"label.sizegb": "Wielko\u015bc",
+"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.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Snapshot Name",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "Snapshot Limits",
+"label.snapshotmemory": "Snapshot memory",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "Socket Timeout",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "Source CIDR",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Supported Source NAT type",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "Specify VXLAN",
+"label.specifyipranges": "Wyszczeg\u00f3lnij zasi\u0119g adres\u00f3w IP",
+"label.specifyvlan": "Specify VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "Start IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "Start Reserved system IP",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "By date (start)",
+"label.startip": "Start IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "Start Port",
+"label.startquota": "Quota Value",
+"label.state": "Status",
+"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.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie name",
+"label.sticky.expire": "Wygasa",
+"label.sticky.holdtime": "Hold time",
+"label.sticky.indirect": "Indirect",
+"label.sticky.length": "D\u0142ugo\u015b\u0107",
+"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": "Stopped VMs",
+"label.storage": "Storage",
+"label.storage.tags": "Storage Tags",
+"label.storage.traffic": "Storage Traffic",
+"label.storageid": "Primary Storage",
+"label.storagepool": "Storage Pool",
+"label.storagetags": "Storage Tags",
+"label.storagetype": "Storage Type",
+"label.subdomainaccess": "Subdomain Access",
+"label.submit": "Submit",
+"label.submitted.by": "[Submitted by: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Succeeded",
+"label.sunday": "Niedziela",
+"label.supportedservices": "Supported Services",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"label.suspend.project": "Zawie\u015b 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.offerings": "System Offerings",
+"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.vms": "System VMs",
+"label.system.wide.capacity": "System-wide capacity",
+"label.systemvmtype": "System VM Type",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "Otagowany",
+"label.tags": "Tagi",
+"label.target.iqn": "Target IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "Zadania uko\u0144czone",
+"label.template": "Template",
+"label.templatebody": "Body",
+"label.templatedn": "Select Template",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "Template Limits",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "Subject",
+"label.templatetotal": "Template",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "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.details": "Tier details",
+"label.tiername": "Tier",
+"label.time": "Czas",
+"label.time.colon": "Time:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "Strefa czasowa",
+"label.timezone.colon": "Timezone:",
+"label.token": "Token",
+"label.total.hosts": "Total Hosts",
+"label.total.memory": "Total Memory",
+"label.total.storage": "Total Storage",
+"label.total.vms": "Total VMs",
+"label.totalcpu": "Total CPU",
+"label.traffic.label": "Traffic label",
+"label.traffic.types": "Traffic Types",
+"label.traffictype": "Traffic Type",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "Tuesday",
+"label.type": "Wpisz",
+"label.type.id": "Wpisz ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "Niedost\u0119pny",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"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.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.sanity.result": "Usage Sanity Result",
+"label.usage.server": "Usage Server",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "Use VM IP:",
+"label.use.vm.ips": "Use VM IPs",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "U\u017cytkowni",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "Nazwa u\u017cytkownika",
+"label.users": "U\u017cytkownicy",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "vCenter IP Address",
+"label.vcsdeviceid": "ID",
+"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.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"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.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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm.add": "Dodaj instancj\u0119",
+"label.vm.destroy": "Zniszcz",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "Uruchom ponownie",
+"label.vm.snapshots": "VM Snapshots",
+"label.vm.start": "Rozpocznij",
+"label.vm.stop": "Stop",
+"label.vmdisplayname": "VM display name",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "VM IP Address",
+"label.vmlimit": "Instance Limits",
+"label.vmname": "VM Name",
+"label.vms": "VMs",
+"label.vms.in.tier": "VMs in tier",
+"label.vmstate": "VM state",
+"label.vmtotal": "Total of VMs",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "VMware traffic label",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "Volume Group",
+"label.volume": "Volume",
+"label.volume.details": "Volume details",
+"label.volume.migrated": "Volume migrated",
+"label.volumechecksum": "MD5 checksum",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "Volume Group",
+"label.volumelimit": "Volume Limits",
+"label.volumename": "Volume Name",
+"label.volumes": "Volumes",
+"label.volumetotal": "Volume",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC offering details",
+"label.vpc.offerings": "VPC Offerings",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC limits",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC Offering",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN Connection",
+"label.vpn.gateway": "VPN Gateway",
+"label.vpncustomergatewayid": "VPN Customer Gateway",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "Nazwa",
+"label.vsmdevicestate": "Status",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN Range",
+"label.waiting": "Czekanie",
+"label.warn": "Ostrze\u017cenie",
+"label.warn.upper": "WARN",
+"label.warning": "Warning",
+"label.wednesday": "\u015aroda",
+"label.weekly": "Tygodniowo",
+"label.welcome": "Witaj",
+"label.welcome.cloud.console": "Welcome to Management Console",
+"label.what.is.cloudstack": "Czym jest CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "XenServer traffic label",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "Tak",
+"label.zone": "Zone",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "Zone details",
+"label.zone.id": "Zone ID",
+"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.zoneid": "Zone",
+"label.zonename": "Zone",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "Zones",
+"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",
+"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.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.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.network": "Please confirm that you want to delete this network.",
+"message.action.delete.nexusvswitch": "Potwierd\u017a, \u017ce chcesz usun\u0105\u0107: nexus 1000v",
+"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\u017a, \u017ce chcesz pobra\u0107 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.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\u0107 ten projekt?",
+"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.add.vpn.gateway": "Please confirm that you want to add a VPN Gateway",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "Adding host",
+"message.adding.netscaler.device": "Adding Netscaler device",
+"message.adding.netscaler.provider": "Adding Netscaler provider",
+"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.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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "Czy na pewno chcesz usun\u0105\u0107 F5?",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"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.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "Czy na pewno chcesz usun\u0105\u0107 SRX?",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "Please confirm that you would like to remove this IP range.",
+"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.dedicate.zone": "Dedicating zone",
+"message.dedicated.zone.released": "Zone dedication released",
+"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\u0105\u0107 ten projekt?",
+"message.delete.user": "Please confirm that you would like to delete this user.",
+"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.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\u0142\u0105czy\u0107 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.network.removenic": "Please confirm that want to remove this NIC, which will also remove the associated network from the VM.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"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 \u017cadnych projekt\u00f3w.<br/> Utw\u00f3rz nowy projekt w zak\u0142adce 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.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\u017a do nast\u0119pnego 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.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.reset.vpn.connection": "Please confirm that you want to reset VPN connection",
+"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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "Please specify URL",
+"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\u0107 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.template.iso": "Please select a template or ISO to continue",
+"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.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.validate.url": "Please enter a valid URL.",
+"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.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"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": "Zone creation complete",
+"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}.",
+"network.rate": "Network Rate",
+"side.by.side": "Side by Side",
+"state.accepted": "Akceptowano",
+"state.active": "Aktywny",
+"state.allocating": "Allocating",
+"state.backedup": "Backed Up",
+"state.backingup": "Backing Up",
+"state.completed": "Uko\u0144czono",
+"state.creating": "Tworzenie",
+"state.declined": "Odrzucono",
+"state.destroyed": "Zniszczono",
+"state.detached": "Detached",
+"state.disabled": "Wy\u0142\u0105czony",
+"state.enabled": "W\u0142\u0105czone",
+"state.error": "B\u0142\u0105d",
+"state.expunging": "Expunging",
+"state.migrating": "Migrating",
+"state.pending": "Pending",
+"state.running": "Running",
+"state.starting": "Rozpoczynanie",
+"state.stopped": "Zatrzymano",
+"state.stopping": "Stopping",
+"state.suspended": "Zawieszono",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/pt_BR.json b/ui/public/locales/pt_BR.json
new file mode 100644
index 0000000..9dd3c63
--- /dev/null
+++ b/ui/public/locales/pt_BR.json
@@ -0,0 +1,2363 @@
+{
+"changed.item.properties": "Propriedades do item alteradas",
+"confirm.enable.s3": "Por favor, preencha as informa\u00e7\u00f5es abaixo para habilitar suporte o Storage Secund\u00e1rio fornecido por S3",
+"confirm.enable.swift": "Por favor, preencha as informa\u00e7\u00f5es abaixo para habilitar suporte ao Swift",
+"error.could.not.change.your.password.because.non.native.user": "Erro: a nuvem n\u00e3o alterou sua senha porque o LDAP est\u00e1 ativo.",
+"error.could.not.enable.zone": "N\u00e3o foi poss\u00edvel habilitar a zona",
+"error.installwizard.message": "Alguma coisa est\u00e1 errada; voc\u00ea pode voltar e corrigir quaisquer erros",
+"error.invalid.username.password": "Usu\u00e1rio ou senha inv\u00e1lidos",
+"error.login": "O seu usu\u00e1rio/senha n\u00e3o coincidem com nossos registros.",
+"error.menu.select": "N\u00e3o foi poss\u00edvel realizar a a\u00e7\u00e3o pois nenhum item foi selecionado.",
+"error.mgmt.server.inaccessible": "O Servidor de Gerenciamento est\u00e1 inacess\u00edvel. Tente novamente mais tarde.",
+"error.password.not.match": "Os campos de senha n\u00e3o combinam",
+"error.please.specify.physical.network.tags": "As Ofertas de Rede n\u00e3o estar\u00e3o dispon\u00edveis enquanto voc\u00ea n\u00e3o especificar tags para esta interface f\u00edsica.",
+"error.session.expired": "Sua sess\u00e3o expirou.",
+"error.unable.to.reach.management.server": "N\u00e3o foi poss\u00edvel acessar o Servidor de Gerenciamento",
+"error.unresolved.internet.name": "Imposs\u00edvel resolver DNS",
+"force.delete.domain.warning": "Aten\u00e7\u00e3o: Esta op\u00e7\u00e3o remover\u00e1 todos os dom\u00ednios, contas e recursos associados.",
+"force.remove": "For\u00e7ar Remo\u00e7\u00e3o",
+"force.remove.host.warning": "Aten\u00e7\u00e3o: O CloudStack desligar\u00e1 de maneira for\u00e7ada todas as VMs antes de remover o host do cluster.",
+"force.stop": "For\u00e7ar Parada",
+"force.stop.instance.warning": "Aviso: For\u00e7ar o desligamento desta inst\u00e2ncia deve ser sua \u00faltima op\u00e7\u00e3o. Isto pode levar a perda de dados, bem como  comportamento inconsist\u00eante do estado da m\u00e1quina 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",
+"icmp.code.desc": "Informe -1, se voc\u00eas quiser permitir todos os c\u00f3digos ICMP.",
+"icmp.type.desc": "Informe -1, se voc\u00eas quiser permitir todos os tipos ICMP.",
+"image.directory": "Diret\u00f3rio da Imagem",
+"inline": "Inline",
+"label.about": "Sobre",
+"label.about.app": "Sobre o CloudStack",
+"label.accept.project.invitation": "Aceitar convite de projeto.",
+"label.accesskey": "Chave de acesso",
+"label.account": "Conta",
+"label.account.and.security.group": "Contas, grupos de Seguran\u00e7a",
+"label.account.details": "Detalhes da conta",
+"label.account.id": "ID da Conta",
+"label.account.name": "Nome da Conta",
+"label.account.specific": "Conta-Specific",
+"label.accounts": "Contas",
+"label.accounttype": "Tipo de Conta",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "Lista de regas de ACL",
+"label.acl.reason.description": "Motivo para se utilizar a regra.",
+"label.acl.replaced": "ACL trocado",
+"label.aclid": "ACL",
+"label.aclname": "Nome da ACL",
+"label.acltotal": "Total de rede ACL",
+"label.acquire.new.ip": "Adquirir novo IP",
+"label.acquire.new.secondary.ip": "Adquira um novo IP secund\u00e1rio",
+"label.action": "A\u00e7\u00e3o",
+"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\u00e7\u00e3o",
+"label.action.cancel.maintenance.mode.processing": "Cancelando Modo de Manuten\u00e7\u00e3o....",
+"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\u00e7\u00e3o SAML SSO",
+"label.action.configure.stickiness": "Ader\u00eancia",
+"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.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.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\u00ednio",
+"label.action.delete.domain.processing": "Removendo Dom\u00ednio....",
+"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.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.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\u00edsica",
+"label.action.delete.pod": "Remover POD",
+"label.action.delete.pod.processing": "Removendo POD....",
+"label.action.delete.primary.storage": "Remover Storage Prim\u00e1rio",
+"label.action.delete.primary.storage.processing": "Removendo Storage Prim\u00e1rio....",
+"label.action.delete.secondary.storage": "Remover Storage Secund\u00e1rio",
+"label.action.delete.secondary.storage.processing": "Removendo Storage Secund\u00e1rio....",
+"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\u00e7o de Sistema",
+"label.action.delete.template": "Remover Template",
+"label.action.delete.template.processing": "Removendo Template....",
+"label.action.delete.user": "Remover Usu\u00e1rio",
+"label.action.delete.user.processing": "Removendo Usu\u00e1rio....",
+"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\u00e2ncia",
+"label.action.destroy.instance.processing": "Apagando Inst\u00e2ncia....",
+"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\u00edsica",
+"label.action.disable.pod": "Desativar POD",
+"label.action.disable.pod.processing": "Desativando POD....",
+"label.action.disable.static.nat": "Desativar NAT Est\u00e1tico",
+"label.action.disable.static.nat.processing": "Desativando NAT Est\u00e1tico....",
+"label.action.disable.user": "Desativar Usu\u00e1rio",
+"label.action.disable.user.processing": "Desativando Usu\u00e1rio....",
+"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.account": "Editar conta",
+"label.action.edit.disk.offering": "Editar Oferta de Disco",
+"label.action.edit.domain": "Editar Dom\u00ednio",
+"label.action.edit.global.setting": "Editar Configura\u00e7\u00f5es Globais",
+"label.action.edit.host": "Editar Host",
+"label.action.edit.instance": "Editar Inst\u00e2ncia",
+"label.action.edit.iso": "Editar ISO",
+"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\u00e1rio",
+"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\u00e1rio",
+"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\u00e7\u00e3o",
+"label.action.enable.maintenance.mode.processing": "Ativando Modo de Manuten\u00e7\u00e3o....",
+"label.action.enable.nexusvswitch": "Habilitar NexusVswitch",
+"label.action.enable.physical.network": "Habilitar rede f\u00edsica",
+"label.action.enable.pod": "Ativar POD",
+"label.action.enable.pod.processing": "Ativando POD....",
+"label.action.enable.static.nat": "Ativar NAT Est\u00e1tico",
+"label.action.enable.static.nat.processing": "Ativando NAT Est\u00e1tico....",
+"label.action.enable.user": "Habilitar usu\u00e1rio",
+"label.action.enable.user.processing": "Habilitando Usu\u00e1rio...",
+"label.action.enable.zone": "Ativar Zona",
+"label.action.enable.zone.processing": "Ativando Zona....",
+"label.action.expunge.instance": "Eliminar Inst\u00e2ncia",
+"label.action.expunge.instance.processing": "Expurgando Inst\u00e2ncia....",
+"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\u00e2ncia",
+"label.action.migrate.instance.processing": "Migrando Inst\u00e2ncia....",
+"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.project.add.account": "Adicionar conta ao projeto",
+"label.action.reboot.instance": "Reiniciar Inst\u00e2ncia",
+"label.action.reboot.instance.processing": "Reiniciando Inst\u00e2ncia...",
+"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\u00e2ncia",
+"label.action.restore.instance.processing": "Restaurando Inst\u00e2ncia...",
+"label.action.revert.snapshot": "Reverter para Snapshot",
+"label.action.revert.snapshot.processing": "Revertendo para Snapshot...",
+"label.action.start.instance": "Iniciar Inst\u00e2ncia",
+"label.action.start.instance.processing": "Iniciando Inst\u00e2ncia...",
+"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\u00e2ncia",
+"label.action.stop.instance.processing": "Parando Inst\u00e2ncia...",
+"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\u00eancia de SO",
+"label.action.update.os.preference.processing": "Atualizando Prefer\u00eancia 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\u00e7\u00f5es",
+"label.activate.project": "Ativar Projeto",
+"label.activeviewersessions": "Sess\u00f5es Ativas",
+"label.add": "Adicionar",
+"label.add.account": "Adicionar Conta",
+"label.add.accounts": "Adicionar contas",
+"label.add.accounts.to": "Adicionar contas para",
+"label.add.acl": "Adicionar ACL",
+"label.add.acl.list": "Adiciona Lista ACL",
+"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\u00e7\u00e3o de Rack de Baremetal",
+"label.add.bigswitchbcf.device": "Adicionar BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Adicionar Brocade Vcs Switch",
+"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\u00e7\u00e3o",
+"label.add.direct.iprange": "Add Direct Ip Range",
+"label.add.disk.offering": "Adicionar Oferta de Disco",
+"label.add.domain": "Adicionar Dom\u00ednio",
+"label.add.egress.rule": "Adicionar regra egress",
+"label.add.f5.device": "Adicionar dispositivo F5",
+"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\u00e1rio",
+"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.gateway": "Adicionar novo gateway",
+"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.tier": "Adicionar nova camada",
+"label.add.nfs.secondary.staging.store": "Adiciona Armazenamento NFS de Est\u00e1gio Secund\u00e1rio",
+"label.add.niciranvp.device": "Adicionar Controlador Nvp",
+"label.add.opendaylight.device": "Adiciona Controlador OpenDaylight",
+"label.add.pa.device": "Adicionar dispositivo Palo Alto",
+"label.add.physical.network": "Adicionar rede f\u00edsica",
+"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\u00e7os IPs Port\u00e1veis",
+"label.add.primary.storage": "Adicionar Storage Prim\u00e1rio",
+"label.add.private.gateway": "Adicionar Gateway Privado",
+"label.add.region": "Adicionar Regi\u00e3o",
+"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\u00e1rio",
+"label.add.security.group": "Adicionar Security Group",
+"label.add.service.offering": "Adicionar Plano",
+"label.add.srx.device": "Adicionar dispositivo SRX",
+"label.add.static.nat.rule": "Adicionar regra de NAT est\u00e1tico",
+"label.add.static.route": "Adicionar rota est\u00e1tica",
+"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\u00e1rio",
+"label.add.vlan": "Adicionar VLAN",
+"label.add.vm": "Adicionar VM",
+"label.add.vm.to.tier": "Adicionar m\u00e1quina virtual \u00e0 camada",
+"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\u00e1rio",
+"label.add.vpn.gateway": "Adicionar gateway de VPN",
+"label.add.vpn.user": "Adicionar usu\u00e1rio 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\u00e1rio",
+"label.adding.zone": "Adicionando Zona",
+"label.additional.networks": "Redes Adicionais",
+"label.address": "Endere\u00e7o",
+"label.admin": "Administrador",
+"label.admin.accounts": "Contas Administrativas",
+"label.advanced": "Avan\u00e7ado",
+"label.advanced.mode": "Modo Avan\u00e7ado",
+"label.advanced.search": "Busca Avan\u00e7ada",
+"label.affinity": "Afinidade",
+"label.affinity.groups": "Grupos de Afinidade",
+"label.affinitygroup": "Grupo de Afinidade",
+"label.agent.password": "Senha do Agente",
+"label.agent.username": "Usu\u00e1rio do Agente",
+"label.agentport": "Porta do Agente",
+"label.agentstate": "Estado 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.alerts": "Alertas",
+"label.algorithm": "Algoritmo",
+"label.all": "Todos",
+"label.allocated": "Alocado",
+"label.allocationstate": "Status da Aloca\u00e7\u00e3o",
+"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.version": "Ver\u00e3o da API",
+"label.apikey": "API Key",
+"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\u00e2ncia para outra Conta",
+"label.assign.to.load.balancer": "Atribuindo Inst\u00e2ncia ao balanceador de carga",
+"label.assign.vms": "Atribuir VMs",
+"label.associatednetwork": "Rede associada",
+"label.associatednetworkid": "ID de Rede Associado",
+"label.associatednetworkname": "Nome da Rede",
+"label.author.email": "E-mail do autor",
+"label.author.name": "Nome do autor",
+"label.autoscale": "Escalonamento Autom\u00e1tico",
+"label.autoscale.configuration.wizard": "Assistente de configura\u00e7\u00e3o de AutoScale",
+"label.availability": "Availability",
+"label.availabilityzone": "availabilityZone",
+"label.available": "Dispon\u00edvel",
+"label.available.public.ips": "IP P\u00fablico Dispon\u00edvel",
+"label.back": "Voltar",
+"label.balance": "Saldo",
+"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\u00e7\u00e3o do Rack de Baremetal",
+"label.baremetalcpu": "CPU (em MHz)",
+"label.baremetalcpucores": "# de Core CPU",
+"label.baremetalmac": "Host MAC",
+"label.baremetalmemory": "Mem\u00f3ria (em MB)",
+"label.basic": "B\u00e1sico",
+"label.basic.mode": "Modo B\u00e1sico",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "Detalhes do BigSwitch BCF",
+"label.bigswitch.controller.address": "Endere\u00e7o do BigSwitch BCF Controller",
+"label.bladeid": "ID da L\u00e2mina",
+"label.blades": "L\u00e2minas",
+"label.bootable": "Inicializ\u00e1vel",
+"label.broadcastdomainrange": "Range do dom\u00ednio de Broadcast",
+"label.broadcastdomaintype": "Tipo de Dom\u00ednio Broadcast",
+"label.broadcasturi": "url de broadcast",
+"label.brocade.vcs.address": "Endere\u00e7o do Vcs Switch",
+"label.brocade.vcs.details": "Detalhes do Brocade Vcs Switch",
+"label.bucket": "Balde",
+"label.by.account": "por Conta",
+"label.by.alert.type": "Por tipo de alerta",
+"label.by.availability": "By Availability",
+"label.by.domain": "por Dom\u00ednio",
+"label.by.end.date": "por Data Final",
+"label.by.event.type": "Por tipo de evento",
+"label.by.level": "por N\u00edvel",
+"label.by.pod": "por Pod",
+"label.by.role": "por Fun\u00e7\u00e3o",
+"label.by.start.date": "por Data Inicial",
+"label.by.state": "por estado",
+"label.by.traffic.type": "por Tipo de Tr\u00e1fego",
+"label.by.type": "Por Tipo",
+"label.by.type.id": "por Tipo de ID",
+"label.by.zone": "por Zona",
+"label.cachemode": "Tipo do cache de escrita",
+"label.cancel": "Cancelar",
+"label.capacity": "Capacidade",
+"label.capacity.iops": "Capacidade de IOPS",
+"label.capacitybytes": "Capacidade de Bytes",
+"label.capacityiops": "IOPS Total",
+"label.certificate": "Certificado",
+"label.change.affinity": "Muda Afinidade",
+"label.change.ipaddress": "Mudan\u00e7a de endere\u00e7o IP para NIC",
+"label.change.service.offering": "Alterar oferta de servi\u00e7o",
+"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.of.destination.network": "CIDR da rede de destino",
+"label.cidrlist": "CIDR de Origem",
+"label.cisco.nexus1000v.ip.address": "Endere\u00e7o IP do Nexus 1000v",
+"label.cisco.nexus1000v.password": "Senha do Nexus 1000v",
+"label.cisco.nexus1000v.username": "Usu\u00e1rio do Nexus 1000v",
+"label.ciscovnmc.resource.details": "Detalhes de recurso CiscoVNMC",
+"label.cleanup": "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.clusterid": "Cluster",
+"label.clustername": "Cluster",
+"label.clusternamelabel": "Nome do Cluster",
+"label.clusters": "Clusters",
+"label.clustertype": "Tipo de Cluster",
+"label.clvm": "CLVM",
+"label.code": "C\u00f3digo",
+"label.community": "Comunidade",
+"label.compute": "Computa\u00e7\u00e3o",
+"label.compute.and.storage": "Processamento e Armazenamento",
+"label.compute.offerings": "Oferta de Computa\u00e7\u00e3o",
+"label.configuration": "Configura\u00e7\u00e3o",
+"label.configure": "Configurar",
+"label.configure.ldap": "Configurar LDAP",
+"label.configure.network.acls": "Configure ACLs de rede",
+"label.configure.sticky.policy": "Configurar Pol\u00edtica Fixa",
+"label.configure.vpc": "Configurar VPC",
+"label.confirmation": "Confirma\u00e7\u00e3o",
+"label.confirmdeclineinvitation": "Voc\u00ea tem certeza que quer rejeitar este convite de projeto ?",
+"label.confirmpassword": "Confirme a senha",
+"label.congratulations": "Parab\u00e9ns!",
+"label.connectiontimeout": "Tempo limite de conex\u00e3o",
+"label.conservemode": "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\u00e7\u00e3o b\u00e1sica",
+"label.copying.iso": "Copiando ISO",
+"label.corrections.saved": "Altera\u00e7\u00f5es salvas",
+"label.counterid": "Contador",
+"label.cpu": "CPU",
+"label.cpu.allocated": "CPU Alocada",
+"label.cpu.sockets": "Sockets",
+"label.cpuallocated": "CPU Alocada por VMs",
+"label.cpuallocatedghz": "Alocado",
+"label.cpulimit": "Limite de CPU",
+"label.cpumaxdeviation": "Desvio",
+"label.cpusockets": "O N\u00famero de Sockets de CPU",
+"label.cpuspeed": "CPU (em MHz)",
+"label.cputotal": "CPU TOTAL",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU Utilizada",
+"label.create.nfs.secondary.staging.storage": "Cria Armazenamento NFS de Est\u00e1gio Secund\u00e1rio",
+"label.create.nfs.secondary.staging.store": "Criar storage staging secund\u00e1rio NFS",
+"label.create.project": "Criar um projeto",
+"label.create.ssh.key.pair": "Criar par de chaves SSH",
+"label.create.template": "Criar template",
+"label.create.vpn.connection": "Criar uma conex\u00e3o VPN",
+"label.created": "Criado",
+"label.created.by.system": "Criado pelo sistema",
+"label.createnfscache": "Cria Armazenamento NFS de Est\u00e1gio Secund\u00e1rio",
+"label.credit": "Cru00e9dito",
+"label.crosszones": "Inter Zonas",
+"label.current": "isCurrent",
+"label.currentpassword": "Senha Antiga",
+"label.custom": "Customizado",
+"label.custom.disk.offering": "Oferta de Disco customizado",
+"label.customdisksize": "Tamanho Customizado",
+"label.daily": "Di\u00e1rio",
+"label.dashboard": "Dashboard",
+"label.data.disk.offering": "Oferta de Disco Adicional",
+"label.date": "Data",
+"label.day": "Dia",
+"label.day.of.month": "Dia do M\u00eas",
+"label.day.of.week": "Dia da Semana",
+"label.dc.name": "Nome do DC",
+"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\u00e3o",
+"label.default.use": "Uso padr\u00e3o",
+"label.default.view": "Vis\u00e3o Padr\u00e3o",
+"label.delete": "Remover",
+"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\u00e7\u00e3o de Rack de Baremetal",
+"label.delete.bigswitchbcf": "Remover BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remover Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Apaga CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Apaga recurso CiscoVNMC",
+"label.delete.events": "Remover eventos",
+"label.delete.f5": "Remover F5",
+"label.delete.gateway": "delete gateway",
+"label.delete.internal.lb": "Apaga LB Interno",
+"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.portable.ip.range": "Deletar Endere\u00e7os IPs Port\u00e1teis",
+"label.delete.project": "Deletar projeto",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Apaga Armazenamento de Est\u00e1gio Secund\u00e1rio",
+"label.delete.srx": "Remover SRX",
+"label.delete.ucs.manager": "Apaga Gerenciador UCS",
+"label.delete.vpn.connection": "deletar a conex\u00e3o VPN",
+"label.delete.vpn.customer.gateway": "deletar gateway de VPN de usu\u00e1rio",
+"label.delete.vpn.gateway": "deletar um gateway de VPN",
+"label.delete.vpn.user": "Deletar usu\u00e1rio VPN",
+"label.deleteprofile": "Apaga Perfil",
+"label.deleting.failed": "Falha ao remover",
+"label.deleting.processing": "Removendo....",
+"label.deny": "Negar",
+"label.deploymentplanner": "Deployment planejado",
+"label.description": "Descri\u00e7\u00e3o",
+"label.destinationphysicalnetworkid": "ID de destino da rede f\u00edsica",
+"label.destinationzoneid": "Zona de Destino",
+"label.destroy": "Apagar",
+"label.destroy.router": "Destruir roteador",
+"label.destroyvmgraceperiod": "Destruir Grace Period da VM",
+"label.detaching.disk": "Desplugando Disco",
+"label.details": "Detalhes",
+"label.deviceid": "ID do Dispositivo",
+"label.devices": "Dispositivos",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "Tipo de Servidor DHCP",
+"label.direct.attached.public.ip": "IP P\u00fablico COnectado Diretamente",
+"label.direct.ips": "IPs Diretos",
+"label.directdownload": "Direct Download",
+"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\u00e2mina",
+"label.disbale.vnmc.device": "Desabilita dispositivo VNMC",
+"label.disconnected": "Last Disconnected",
+"label.disk": "Disco",
+"label.disk.newoffering": "Nova oferta de disco",
+"label.disk.newoffering.description": "Oferta de disco a ser aplicada no volume ap\u00f3s migra\u00e7\u00e3o.",
+"label.disk.offering.details": "Detalhes da oferta de disco",
+"label.disk.offerings": "Oferta de Discos",
+"label.disk.size": "Tamanho do Disco",
+"label.disk.volume": "Disco",
+"label.diskbytesreadrate": "Taxa de Leitura do Disco (BPS)",
+"label.diskbyteswriterate": "Taxa de Escrita no Disco (BPS)",
+"label.diskiopsmax": "M\u00e1x IOPS",
+"label.diskiopsmin": "M\u00edn IOPS",
+"label.diskiopsreadrate": "Taxa de Leitura do Disco (IOPS)",
+"label.diskiopswriterate": "Taxa de Escrita no Disco (IOPS)",
+"label.diskioread": "Leitura do Disk (I/O)",
+"label.diskiowrite": "Escrita no Disco (I/O)",
+"label.diskkbsread": "Leitura do Disco (Bytes)",
+"label.diskkbswrite": "Escrita no Disco (Bytes)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "Oferta de Disco",
+"label.diskofferingid": "Oferta de Disco",
+"label.disksize": "Tamanho (em GB)",
+"label.disksizeallocated": "Disco Alocado",
+"label.disksizeallocatedgb": "Alocado",
+"label.disksizetotal": "Disco Total",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "N\u00e3o alocado",
+"label.disksizeusedgb": "Usado",
+"label.display.text": "Descri\u00e7\u00e3o",
+"label.displayname": "Mostrar Nome",
+"label.displaytext": "Descri\u00e7\u00e3o",
+"label.distributedvpcrouter": "Roteador VPC Distribuido",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "Dom\u00ednio DNS para redes h\u00f3spedes",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "Dom\u00ednio",
+"label.domain.details": "Detalhes do dom\u00ednio",
+"label.domain.name": "Nome do Dom\u00ednio",
+"label.domain.router": "Roteador do Dom\u00ednio",
+"label.domain.suffix": "Sufixo de Dom\u00ednio DNS (ex. xyz.com)",
+"label.domainid": "ID do Dom\u00ednio",
+"label.domainname": "Dom\u00ednio",
+"label.domainpath": "Dom\u00ednio",
+"label.done": "Pronto",
+"label.double.quotes.are.not.allowed": "Aspas duplas n\u00e3o s\u00e3o permitidas",
+"label.download.progress": "Status do Download",
+"label.dpd": "Detec\u00e7\u00e3o de correspondente morto",
+"label.drag.new.position": "Arrastar para uma nova posi\u00e7\u00e3o",
+"label.driver": "Driver",
+"label.duration.in.sec": "Dura\u00e7\u00e3o (em seg)",
+"label.edit": "Editar",
+"label.edit.acl.list": "Edit ACL List",
+"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\u00e3o",
+"label.edit.role": "Edit Role",
+"label.edit.rule": "Editar regra",
+"label.edit.secondary.ips": "Editar IPs secund\u00e1rios",
+"label.edit.tags": "Edite etiquetas",
+"label.edit.traffic.type": "Editar tipo de tr\u00e1fego",
+"label.edit.vpc": "Editar VPC",
+"label.egress.default.policy": "Pol\u00edtica de Entrada Padr\u00e3o",
+"label.egress.rule": "Regra Egress",
+"label.egress.rules": "Regras de sa\u00edda",
+"label.egressdefaultpolicy": "Pol\u00edtica padr\u00e3o de egress\u00e3o",
+"label.elastic": "El\u00e1stico",
+"label.email": "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\u00e1ria 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.reserved.system.ip": "Fim dos IPs reservados para o sistema",
+"label.end.vlan": "VLAN final",
+"label.end.vxlan": "VXLAN final",
+"label.enddate": "Por data (final)",
+"label.endip": "IP do fim",
+"label.endipv4": "IP FInal IPv4",
+"label.endipv6": "IP FInal IPv6",
+"label.endpoint": "Ponto de acesso",
+"label.endpoint.or.operation": "Endpoint or Operation",
+"label.endport": "Porta Final",
+"label.enter.token": "Digite o token",
+"label.error": "Erro",
+"label.error.code": "C\u00f3digo de Erro",
+"label.error.something.went.wrong.please.correct.the.following": "Alguma coisa est\u00e1 errada; por favor corrija abaixo",
+"label.error.upper": "ERRO",
+"label.espencryption": "Encripta\u00e7\u00e3o ESP",
+"label.esphash": "Hash ESP",
+"label.esplifetime": "Tempo de vida do ESP (segundos)",
+"label.esppolicy": "Pol\u00edtica ESP",
+"label.event": "Eventos",
+"label.event.archived": "Evento Arquivado",
+"label.event.deleted": "Evento Detectado",
+"label.events": "Eventos",
+"label.every": "Cada",
+"label.example": "Examplo",
+"label.expunge": "Eliminar",
+"label.external.link": "Link externo",
+"label.f5": "F5",
+"label.f5.details": "Detalhes do F5",
+"label.failed": "Falhou",
+"label.featured": "Featured",
+"label.fetch.latest": "Obter \u00faltimos",
+"label.filterby": "Filtrar por",
+"label.fingerprint": "Impress\u00e3o Digital",
+"label.firewall": "Firewall",
+"label.firstname": "Primeiro Nome",
+"label.firstname.lower": "primeiro nome",
+"label.forceencap": "For\u00e7ar encapsulamento UDP de pacotes ESP",
+"label.format": "Formato",
+"label.friday": "Sexta-feira",
+"label.full": "Full",
+"label.full.path": "Path completo",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "Tipo",
+"label.fwdevicestate": "Estado",
+"label.gateway": "Gateway",
+"label.general.alerts": "Alertas Gerais",
+"label.generating.url": "Criando URL",
+"label.global.settings": "Configura\u00e7\u00f5es Globais",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "Configurar GloboDNS",
+"label.glustervolume": "Disco",
+"label.go.step.2": "V\u00e1 para passo 2",
+"label.go.step.3": "V\u00e1 para passo 3",
+"label.go.step.4": "V\u00e1 para passo 4",
+"label.go.step.5": "V\u00e1 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.lb.details": "Detalhes de balanceamento de carga",
+"label.gslb.lb.remove": "Remova balanceamento de carga deste GSLB",
+"label.gslb.service": "Servi\u00e7o GSLB",
+"label.gslb.service.private.ip": "Servi\u00e7o GSLB - IP Privado",
+"label.gslb.service.public.ip": "GSLB atende IP P\u00fablico",
+"label.gslbdomainname": "Nome do Dom\u00ednio GSLB",
+"label.gslbprovider": "Servi\u00e7o GSLB",
+"label.gslbproviderprivateip": "Servi\u00e7o GSLB - IP Privado",
+"label.gslbproviderpublicip": "GSLB atende IP P\u00fablico",
+"label.gslbservicetype": "Tipo do Servi\u00e7o",
+"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\u00e7o IP Convidado",
+"label.guest.ip.range": "Intervalo de rede convidado",
+"label.guest.netmask": "M\u00e1scara de rede Guest",
+"label.guest.network.details": "Detalhes de rede convidada",
+"label.guest.networks": "Redes Guest",
+"label.guest.start.ip": "IP de in\u00edcio do guest",
+"label.guest.traffic": "Tr\u00e1fego de h\u00f3spedes",
+"label.guestcidraddress": "CIDR de rede Convidado",
+"label.guestendip": "IP do fim do guest",
+"label.guestgateway": "Gateway de rede Convidado",
+"label.guestipaddress": "Endere\u00e7o IP Convidado",
+"label.guestiptype": "Tipo de Guest",
+"label.guestnetmask": "M\u00e1scara de rede Guest",
+"label.guestnetworkid": "ID de Rede",
+"label.guestnetworkname": "Nome da Rede",
+"label.guestosid": "Tipo de SO",
+"label.gueststartip": "IP de in\u00edcio do guest",
+"label.guestvlanrange": "Range(s) de VLAN",
+"label.haenable": "HA Ativado",
+"label.hahost": "HA Ativado",
+"label.header.volume.snapshot": "Voc\u00ea pode configurar Snapshots recorrentes agendados selecionando as op\u00e7\u00f5es dispon\u00edveis abaixo e aplicando suas pol\u00edticas preferenciais",
+"label.header.volume.take.snapshot": "Por favor confirme que voc\u00ea deseja criar um snapshot deste volume.",
+"label.health.check": "Checagem de Sa\u00fade",
+"label.health.check.advanced.options": "Op\u00e7\u00f5es avan\u00e7adas:",
+"label.health.check.configurations.options": "Op\u00e7\u00f5es de configura\u00e7\u00e3o:",
+"label.health.check.interval.in.sec": "Intervalo de Health Check (em seg)",
+"label.health.check.message.desc": "Seu balanceador de carga realizar\u00e1 automaticamente verifica\u00e7\u00f5es da sa\u00fade das suas inst\u00e2ncias no Cloudstack e ir\u00e1 rotear tr\u00e1fego somente  para as inst\u00e2ncias que passarem nas verifica\u00e7\u00f5es.",
+"label.health.check.wizard": "Assistente de configura\u00e7\u00e3o 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.alerts": "Hosts in Alert State",
+"label.host.name": "Host Name",
+"label.host.tag": "Tag de host",
+"label.hostid": "Host",
+"label.hostname": "Host",
+"label.hostnamelabel": "Host Name",
+"label.hosts": "Hosts",
+"label.hosttags": "Tags de Host",
+"label.hourly": "A cada hora",
+"label.hypervisor": "Hipervisor",
+"label.hypervisor.capabilities": "Recursos de Virtualizador",
+"label.hypervisor.type": "Tipo do Hypervisor",
+"label.hypervisors": "Hypervisors",
+"label.hypervisorsnapshotreserve": "Reserva de Snapshot do Hypervisor",
+"label.hypervisortype": "Hipervisor",
+"label.hypervisorversion": "Vers\u00e3o de Virtualizador",
+"label.hypervnetworklabel": "R\u00f3tulo de tr\u00e1fego HyperV",
+"label.icmpcode": "C\u00f3digo ICMP",
+"label.icmptype": "Tipo ICMP",
+"label.id": "ID",
+"label.ikedh": "DH IKE",
+"label.ikeencryption": "Encripta\u00e7\u00e3o IKE",
+"label.ikehash": "Hash IKE",
+"label.ikelifetime": "Tempo de vida IKE (segundos)",
+"label.ikepolicy": "Pol\u00edtica IKE",
+"label.info": "Info",
+"label.info.upper": "INFO",
+"label.infrastructure": "Infra-estrutura",
+"label.ingress.rule": "Regra de Entrada",
+"label.initiated.by": "Iniciado por",
+"label.insideportprofile": "Perfil de Porta Interna",
+"label.installwizard.addclusterintro.subtitle": "O que \u00e9 um cluster?",
+"label.installwizard.addclusterintro.title": "Vamos adicionar um cluster",
+"label.installwizard.addhostintro.subtitle": "O que \u00e9 um Host ?",
+"label.installwizard.addhostintro.title": "Vamos adicionar um host",
+"label.installwizard.addpodintro.subtitle": "O que \u00e9 um pod ?",
+"label.installwizard.addpodintro.title": "Vamos adicionar um pod",
+"label.installwizard.addprimarystorageintro.subtitle": "Qual \u00e9 o storage prim\u00e1rio ?",
+"label.installwizard.addprimarystorageintro.title": "Vamos adicionar o storage prim\u00e1rio",
+"label.installwizard.addsecondarystorageintro.subtitle": "Qual \u00e9 o storage secund\u00e1rio ?",
+"label.installwizard.addsecondarystorageintro.title": "Vamos adicionar o storage secund\u00e1rio",
+"label.installwizard.addzoneintro.subtitle": "O que \u00e9 uma zona?",
+"label.installwizard.addzoneintro.title": "Vamos adicionar uma zona",
+"label.installwizard.click.launch": "Click no bot\u00e3o executar.",
+"label.installwizard.subtitle": "Este tour vai auxiliar voc\u00ea na configura\u00e7\u00e3o da sua instala\u00e7\u00e3o de  CloudStack&#8482",
+"label.installwizard.title": "Ol\u00e1, seja bem vindo ao CloudStack&#8482",
+"label.instance": "Inst\u00e2ncia",
+"label.instance.name": "Nome da Inst\u00e2ncia",
+"label.instance.scaled.up": "Inst\u00e2ncia escalada para a oferta solicitada",
+"label.instancename": "Nome interno",
+"label.instanceport": "Instanciar Porta",
+"label.instances": "Inst\u00e2ncias",
+"label.instanciate.template.associate.profile.blade": "Instancia Template e Associa Perfil \u00e0 L\u00e2mina",
+"label.intermediate.certificate": "Certificado intermedi\u00e1rio",
+"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.internaldns1": "DNS 1 Interno",
+"label.internaldns2": "DNS 2 Interno",
+"label.internallbvm": "LbVm Interno",
+"label.interval": "Intervalo de Polling (em seg)",
+"label.intervaltype": "Tipo de Intervalo",
+"label.introduction.to.cloudstack": "Introdu\u00e7\u00e3o ao CloudStack&#8482",
+"label.invalid.integer": "Invalid Integer",
+"label.invalid.number": "N\u00famero inv\u00e1lido",
+"label.invitations": "Convites",
+"label.invite": "Convidar",
+"label.invite.to": "Convidar para",
+"label.invited.accounts": "Contas convidadas",
+"label.ip": "IP",
+"label.ip.allocations": "Aloca\u00e7\u00f5es de IP",
+"label.ip.or.fqdn": "IP ou FQDN",
+"label.ip.range": "Range de IP",
+"label.ip.ranges": "Ranges de IP",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "Gateway IPV4",
+"label.ip4netmask": "M\u00e1scara de Rede IPv4",
+"label.ip6address": "Endere\u00e7o IPv6",
+"label.ip6cidr": "CIDR IPv6",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "Gateway IPv6",
+"label.ipaddress": "Endere\u00e7o IP",
+"label.ipaddress1": "Endere\u00e7o IP",
+"label.ipaddress2": "Endere\u00e7o IP",
+"label.iplimit": "Limites de IP P\u00fablico",
+"label.ips": "IPs",
+"label.ipsecpsk": "Chave IPSec pr\u00e9 compartilhada",
+"label.iptotal": "Total de Endere\u00e7os IPs",
+"label.ipv4.cidr": "CIDR IPv4",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "Target IQN",
+"label.is.redundant.router": "Redundante",
+"label.is.shared": "\u00c9 Compartilhado",
+"label.isadvanced": "Mostra ajustes avan\u00e7ados",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "Tamanho Customizado",
+"label.iscustomizeddiskiops": "IOPS personalizado",
+"label.iscustomizediops": "IOPS personalizado",
+"label.isdedicated": "Dedicado",
+"label.isdefault": "\u00c9\u0089 Padr\u00e3o",
+"label.isdynamicallyscalable": "Dinamicamente Escal\u00e1vel",
+"label.isextractable": "Extra\u00edvel",
+"label.isfeatured": "Featured",
+"label.isforced": "For\u00e7ar Exclus\u00e3o",
+"label.ismanaged": "Gerenciado",
+"label.iso": "ISO",
+"label.iso.boot": "ISO de Boot",
+"label.isoid": "ISO",
+"label.isolated.networks": "Redes Isoladas",
+"label.isolatedpvlanid": "ID de VLAN Secund\u00e1ria Isolada",
+"label.isolation.method": "M\u00e9todo de isolamento",
+"label.isolation.mode": "Modo Isolado",
+"label.isolationmethod": "M\u00e9todo de isolamento",
+"label.isolationmethods": "M\u00e9todo de isolamento",
+"label.isolationuri": "URI de isolamento",
+"label.isoname": "Imagem ISO Plugada",
+"label.isos": "ISOs",
+"label.ispasswordenabled": "Senha Ativada",
+"label.ispersistent": "Persistente",
+"label.isportable": "Inter Zonas",
+"label.ispublic": "P\u00fablico",
+"label.isready": "Pronto",
+"label.isredundantrouter": "Roteador Redundantee",
+"label.isrouting": "Roteamento",
+"label.isshared": "Compatilhado",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "NAT Est\u00e1tico",
+"label.issystem": "\u00e9 um sistema",
+"label.isvolatile": "Vol\u00e1til",
+"label.item.listing": "Listar items",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "Manter",
+"label.keep.colon": "Manter",
+"label.key": "Chave",
+"label.keyboard": "Linguagem do teclado",
+"label.keyboardtype": "Tipo de Teclado",
+"label.keypair": "Par de chaves SSH",
+"label.kvmnetworklabel": "Etiqueta de tr\u00e1fego KVM",
+"label.l2gatewayserviceuuid": "Uuid do Servi\u00e7o de Gateway L2",
+"label.l3gatewayserviceuuid": "Uuid do Servi\u00e7o de Gateway L3",
+"label.label": "Etiqueta",
+"label.lang.arabic": "Arabe",
+"label.lang.brportugese": "Portugu\u00eas brasileiro",
+"label.lang.catalan": "Catal\u00e3o",
+"label.lang.chinese": "Chinese (Simplified)",
+"label.lang.dutch": "Holand\u00eas (Holanda)",
+"label.lang.english": "English",
+"label.lang.french": "Franc\u00eas",
+"label.lang.german": "Alem\u00e3o",
+"label.lang.hungarian": "H\u00fangaro",
+"label.lang.italian": "Italiano",
+"label.lang.japanese": "Japanese",
+"label.lang.korean": "Coreano",
+"label.lang.norwegian": "Noruegu\u00eas",
+"label.lang.polish": "Polon\u00eas",
+"label.lang.russian": "Russo",
+"label.lang.spanish": "Spanish",
+"label.last.updated": "u00daltima atualizau00e7u00e3o",
+"label.lastname": "\u00daltimo Nome",
+"label.lastname.lower": "\u00faltimo nome",
+"label.latest.events": "\u00daltimos 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.lbdevicededicated": "Dedicado",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "Tipo",
+"label.lbdevicestate": "Estado",
+"label.lbtype": "Tipo de Balanceamento de Carga",
+"label.ldap.configuration": "Configura\u00e7\u00e3o do LDAP",
+"label.ldap.group.name": "Grupo LDAP",
+"label.ldap.port": "Porta do LDAP",
+"label.level": "N\u00edvel",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Dom\u00ednio para LDAP",
+"label.linklocalip": "Endere\u00e7o IP do Link Local",
+"label.load.balancer": "Load Balancer",
+"label.load.balancing.policies": "Pol\u00edticas de balanceamento de carga",
+"label.loadbalancerinstance": "VMs designadas",
+"label.loadbalancerrule": "Regra de balanceamento de carga",
+"label.loadbalancing": "Balanceamento de Carga",
+"label.loading": "Carregando",
+"label.local": "Local",
+"label.local.storage": "Storage Local",
+"label.local.storage.enabled": "Habilitar storage local para VMs de usu\u00e1rios",
+"label.local.storage.enabled.system.vms": "Habilitar storage local para VMs de Sistema",
+"label.localstorageenabled": "Habilitar storage local para VMs de usu\u00e1rios",
+"label.localstorageenabledforsystemvm": "Habilitar storage local para VMs de Sistema",
+"label.login": "Entrar",
+"label.logout": "Sair",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "R\u00f3tulo de tr\u00e1fego LXC",
+"label.make.project.owner": "Criar propriet\u00e1rio de conta de projeto",
+"label.makeredundant": "Deixar redundante",
+"label.manage": "Gerenciar",
+"label.manage.resources": "Gerenciar Recursos",
+"label.management": "Gerenciamento",
+"label.management.ips": "Gerenciamento de Endere\u00e7os IP",
+"label.management.server": "Servidor de Gerenciamento",
+"label.max.primary.storage": "M\u00e1x. prim\u00e1rio (GiB)",
+"label.max.secondary.storage": "Max. Secund\u00e1rio (GiB)",
+"label.maxcpu": "M\u00e1ximo de cores de CPU",
+"label.maxerrorretry": "Limite de tentativas de recupera\u00e7\u00e3o de erro",
+"label.maxguestslimit": "Limite m\u00e1x. de guest",
+"label.maximum": "M\u00e1ximo",
+"label.maxinstance": "Inst\u00e2ncias Max",
+"label.maxiops": "M\u00e1x IOPS",
+"label.maxmemory": "M\u00e1x. de mem\u00f3ria (MiB)",
+"label.maxnetwork": "M\u00e1x. de redes",
+"label.maxpublicip": "M\u00e1x. IPs p\u00fablicos",
+"label.maxsnapshot": "Max. snapshots",
+"label.maxtemplate": "M\u00e1x. templates",
+"label.maxuservm": "M\u00e1x. VMs de usu\u00e1rio",
+"label.maxvolume": "M\u00e1x. volumes",
+"label.maxvpc": "M\u00e1x. VPCs",
+"label.may.continue": "Voc\u00ea pode continuar agora",
+"label.memallocated": "Aloca\u00e7\u00e3o de Mem\u00f3ria",
+"label.memory": "Mem\u00f3ria (em MB)",
+"label.memory.total": "Mem\u00f3ria Total",
+"label.memory.used": "Mem\u00f3ria Usada",
+"label.memoryallocated": "Mem\u00f3ria Alocada",
+"label.memoryallocatedgb": "Alocado",
+"label.memorylimit": "Limites de mem\u00f3ria (MiB)",
+"label.memorymaxdeviation": "Desvio",
+"label.memorytotal": "Mem\u00f3ria Alocada",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "Usado",
+"label.menu.all.accounts": "Todas as Contas",
+"label.menu.all.instances": "Todas Inst\u00e2ncias",
+"label.menu.community.isos": "ISOs P\u00fablicas",
+"label.menu.community.templates": "Templates P\u00fablicos",
+"label.menu.destroyed.instances": "Inst\u00e2ncias Apagadas",
+"label.menu.featured.isos": "ISOs Customizada",
+"label.menu.featured.templates": "Templates Customizados",
+"label.menu.ipaddresses": "Endere\u00e7os IP",
+"label.menu.my.accounts": "Minhas Contas",
+"label.menu.my.instances": "Minhas Inst\u00e2ncias",
+"label.menu.my.isos": "Minhas ISOs",
+"label.menu.my.templates": "Meus Templates",
+"label.menu.physical.resources": "Recursos B\u00e1\u00adsicos",
+"label.menu.regions": "Regi\u00f5es",
+"label.menu.running.instances": "Inst\u00e2ncias Rodando",
+"label.menu.security.groups": "Grupos de seguran\u00e7a",
+"label.menu.service.offerings": "Oferta de Servi\u00e7os",
+"label.menu.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "Inst\u00e2ncias Paradas",
+"label.menu.storage": "Storage",
+"label.menu.system": "Sistema",
+"label.menu.virtual.appliances": "Appliance Virtual",
+"label.menu.virtual.resources": "Recursos Virtuais",
+"label.metrics": "Metricas",
+"label.metrics.cpu.allocated": "Aloca\u00e7\u00e3o de CPU",
+"label.metrics.cpu.usage": "Utiliza\u00e7\u00e3o de",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Leitura",
+"label.metrics.disk.usage": "Utiliza\u00e7\u00e3o do Disco",
+"label.metrics.disk.write": "Escrita",
+"label.metrics.memory.usage": "Utiliza\u00e7\u00e3o de Mem\u00f3ria",
+"label.metrics.network.read": "Leitura",
+"label.metrics.network.usage": "Utiliza\u00e7\u00e3o de Rede",
+"label.metrics.network.write": "Escrita",
+"label.metrics.num.cpu.cores": "N\u00facleos",
+"label.migrate.instance.to": "Migrar Inst\u00e2ncia para",
+"label.migrate.instance.to.host": "Migrar inst\u00e2ncia para outro host",
+"label.migrate.instance.to.ps": "Migrar inst\u00e2ncia para outro storage prim\u00e1rio",
+"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.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": "Migrar volume para outro storage prim\u00e1rio",
+"label.min.balance": "Saldo Mu00ednimo",
+"label.min.past.hour": "minutos passados da \u00faltima hora",
+"label.minimum": "M\u00ed\u00adnimo",
+"label.mininstance": "Inst\u00e2ncias Min",
+"label.miniops": "M\u00edn IOPS",
+"label.minute.past.hour": "minuto(s) passado(s) da \u00faltima hora",
+"label.minutes.past.hour": "minuto(s) passados da \u00faltima hora",
+"label.monday": "Segunda",
+"label.monthly": "Mensal",
+"label.more.templates": "Mais Templates",
+"label.move.down.row": "Mover uma c\u00e9lula para baixo",
+"label.move.to.bottom": "Mover para baixo",
+"label.move.to.top": "Mover para o topo",
+"label.move.up.row": "Mover uma c\u00e9lula 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.optional": "Nome (Opcional)",
+"label.nat": "Habilitar BigSwitch BCF NAT",
+"label.nat.port.range": "Range de Portas NAT",
+"label.netmask": "M\u00e1scara de Rede",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "Detalhes do NetScaler",
+"label.network": "Rede",
+"label.network.acl": "ACL de rede",
+"label.network.acls": "Network ACLs",
+"label.network.addvm": "Adicionar rede para VM",
+"label.network.desc": "Descri\u00e7\u00e3o 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\u00ednio de Rede",
+"label.network.label.display.for.blank.value": "Utilizar gateway default",
+"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.name": "Network Offering Name",
+"label.network.offerings": "Oferta de Rede",
+"label.network.service.providers": "Provedores de Servi\u00e7os de Rede",
+"label.networkcidr": "CIDR da Rede",
+"label.networkdevicetype": "Tipo",
+"label.networkdomain": "Dom\u00ednio de Rede",
+"label.networkdomaintext": "Dom\u00ednio de Rede",
+"label.networkid": "Rede",
+"label.networking.and.security": "Rede e seguran\u00e7a",
+"label.networkkbsread": "Network Read",
+"label.networkkbswrite": "Network Write",
+"label.networklimit": "Limites de rede",
+"label.networkname": "Nome da Rede",
+"label.networkofferingdisplaytext": "Network Offering",
+"label.networkofferingid": "Network Offering",
+"label.networkofferingidtext": "Network Offering ID",
+"label.networkofferingname": "Network Offering",
+"label.networkrate": "Taxa de Transfer\u00eancia",
+"label.networkread": "Network Read",
+"label.networks": "Redes",
+"label.networktype": "Tipo de Rede",
+"label.networkwrite": "Network Write",
+"label.new": "Novo",
+"label.new.password": "Nova Senha",
+"label.new.project": "Novo Projeto",
+"label.new.vm": "Nova VM",
+"label.newdiskoffering": "New Offering",
+"label.newsize": "Novo Tamanho (GB)",
+"label.next": "Pr\u00f3ximo",
+"label.nexusvswitch": "Nexus Vswitch",
+"label.nfs": "NFS",
+"label.nfs.storage": "Storage NFS",
+"label.nfscachenfsserver": "Servidor NFS",
+"label.nfscachepath": "Caminho (Path)",
+"label.nfscachezoneid": "Zona",
+"label.nfsserver": "Servidor NFS",
+"label.nicadaptertype": "Tipo de adaptador de Rede",
+"label.nicira.controller.address": "Endere\u00e7o do Controlador",
+"label.nicira.nvp.details": "Detalhes do Nicira NVP",
+"label.nics": "Adaptadores de Rede",
+"label.no": "N\u00e3o",
+"label.no.actions": "Sem A\u00e7\u00f5es Dispon\u00edveis",
+"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\u00edvel",
+"label.no.items": "Sem Itens Dispon\u00edveis",
+"label.no.security.groups": "Sem Security Groups Dispon\u00edveis",
+"label.none": "Nenhum",
+"label.noselect": "N\u00e3o obrigado",
+"label.not.found": "N\u00e3o Encontrado",
+"label.notifications": "Notifica\u00e7\u00f5es",
+"label.num.cpu.cores": "# de Core CPU",
+"label.number": "#Regra",
+"label.number.of.clusters": "N\u00famero de Clusters",
+"label.number.of.hosts": "N\u00famero de Hosts",
+"label.number.of.pods": "N\u00famero de Pods",
+"label.number.of.system.vms": "N\u00famero de VMs de sistema",
+"label.number.of.virtual.routers": "N\u00famero de Roteadores Virtuais",
+"label.number.of.zones": "N\u00famero de Zonas",
+"label.numberofrouterrequiresupgrade": "Total de Roteadores Virtuais que requerem atualiza\u00e7\u00e3o",
+"label.numretries": "N\u00famero de Tentativas",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "do m\u00eas",
+"label.offerha": "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.optional": "Opcional",
+"label.order": "Ordenar",
+"label.oscategoryid": "Prefer\u00eancia de SO",
+"label.ostypeid": "Tipo de SO",
+"label.ostypename": "Tipo de SO",
+"label.other": "Outro",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Anula Tr\u00e1fego Convidado",
+"label.override.public.traffic": "Sobrep\u00f5e Tr\u00e1fego P\u00fablico",
+"label.overrideguesttraffic": "Anula Tr\u00e1fego Convidado",
+"label.overridepublictraffic": "Sobrep\u00f5e Tr\u00e1fego P\u00fablico",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "Label de trafego OVM3",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "IP principal do Vip",
+"label.ovmnetworklabel": "R\u00f3tulo de tr\u00e1fego OVM",
+"label.ovs": "OVS",
+"label.owned.public.ips": "IP P\u00fablico Utilizado",
+"label.owner.account": "Dono da Conta",
+"label.owner.domain": "Dono do Dom\u00ednio",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Detalhes do Palo Alto",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "Dom\u00ednio Principal",
+"label.parentname": "Pai",
+"label.passive": "Passivo",
+"label.password": "Senha",
+"label.password.reset.confirm": "A senha foi recuperada para",
+"label.passwordenabled": "Senha Ativada",
+"label.path": "Caminho (Path)",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "Roteador Virtual",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permiss\u00e3o",
+"label.physical.network": "Rede F\u00edsica",
+"label.physical.network.id": "ID da rede f\u00edsica",
+"label.physical.network.name": "Nome da rede f\u00edsica",
+"label.physicalnetworkid": "Rede F\u00edsica",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS password",
+"label.ping.cifs.username": "PING CIFS username",
+"label.ping.dir": "PING Directory",
+"label.ping.path": "Caminho do Ping",
+"label.ping.storage.ip": "Disparar PING para IP do Storage",
+"label.plannermode": "Modo planejado",
+"label.please.complete.the.following.fields": "Por favor, preencha os seguintes campos",
+"label.please.specify.netscaler.info": "Por favor especifique as informa\u00e7\u00f5es 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.podid": "POD",
+"label.podname": "Nome do Pod",
+"label.pods": "Pods",
+"label.port": "Porta",
+"label.port.forwarding.policies": "Pol\u00edticas de redirecionamento de portas",
+"label.port.range": "Range de Porta",
+"label.portable.ip": "IP Port\u00e1vel",
+"label.portable.ip.range.details": "Detalhes de Range de IP Port\u00e1veis",
+"label.portable.ip.ranges": "Faixa de endere\u00e7os IPs Port\u00e1vel",
+"label.portableipaddress": "IPs Port\u00e1veis",
+"label.portforwarding": "Encaminhamento de Porta",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "Prev",
+"label.previous": "Anterior",
+"label.primary.network": "Rede Prim\u00e1ria",
+"label.primary.storage": "Storage Prim\u00e1rio",
+"label.primary.storage.allocated": "Aloca\u00e7\u00e3o do Storage Prim\u00e1rio",
+"label.primary.storage.count": "Pools de Storage Prim\u00e1rios",
+"label.primary.storage.used": "Uso do Storage Prim\u00e1rio",
+"label.primarystoragelimit": "Limites do Storage Prim\u00e1rio (GiB)",
+"label.primarystoragetotal": "Storage Prim\u00e1rio",
+"label.private.gateway": "Gateway privado",
+"label.private.interface": "Interface Privada",
+"label.private.ip.range": "Range de IP Privado",
+"label.private.ips": "IPs Privados",
+"label.private.zone": "Zona Privada",
+"label.privateinterface": "Interface Privada",
+"label.privateip": "Endere\u00e7o IP Privado",
+"label.privatekey": "PKCS#8 Private Key",
+"label.privatenetwork": "Rede Privada",
+"label.privateport": "Porta Privada",
+"label.profiledn": "Perfil Associado",
+"label.profilename": "Perfil",
+"label.project": "Projeto",
+"label.project.dashboard": "Dashboard do Projeto",
+"label.project.invite": "Convidar para o projeto",
+"label.project.name": "Nome de projeto",
+"label.project.view": "Vis\u00e3o de Projeto",
+"label.projectid": "ID de Projeto",
+"label.projects": "Projetos",
+"label.property": "Propriedade",
+"label.protocol": "Protocolo",
+"label.protocol.number": "N\u00famero do Protocolo",
+"label.protocolnumber": "#Protocolo",
+"label.provider": "Provedor",
+"label.providername": "Provedor",
+"label.providers": "Providers",
+"label.provisioningtype": "Tipo de Provisionamento",
+"label.public.interface": "Interface P\u00fablica",
+"label.public.ip": "Endere\u00e7o IP P\u00fablico",
+"label.public.ip.addresses": "IPs P\u00fablicos",
+"label.public.ips": "IPs P\u00fablicos",
+"label.public.lb": "LB p\u00fablico",
+"label.public.load.balancer.provider": "Provedor P\u00fablico de Balanceamento de Carga",
+"label.public.network": "Rede P\u00fablica",
+"label.public.traffic": "Tr\u00e1fego P\u00fablico",
+"label.public.zone": "Zona P\u00fablica",
+"label.publicinterface": "Interface P\u00fablica",
+"label.publicip": "Endere\u00e7o IP",
+"label.publickey": "Chave p\u00fablica",
+"label.publicnetwork": "Rede P\u00fablica",
+"label.publicport": "Porta P\u00fablica",
+"label.purpose": "Prop\u00f3sito",
+"label.pxe.server.type": "Tipo de Servidor PXE",
+"label.qostype": "Tipo de QoS",
+"label.quickview": "Visualiza\u00e7\u00e3o r\u00e1pida",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Tempo Silencioso (em seg)",
+"label.quota": "Valor",
+"label.quota.value": "Valor",
+"label.quota.add.credits": "Adicionar Cru00e9ditos",
+"label.quota.configuration": "Configurau00e7u00e3o da Tarifa",
+"label.quota.configure": "Configure a Cota",
+"label.quota.credits": "Cru00e9ditos",
+"label.quota.dates": "Atualizar Data",
+"label.quota.description": "Descriu00e7u00e3o",
+"label.quota.enddate": "Data de Fim",
+"label.quota.endquota": "Fim",
+"label.quota.enforce": "Bloquear Conta pu00f3s Limite",
+"label.quota.fullsummary": "Todas as Contas",
+"label.quota.remove": "Remover Cota",
+"label.quota.startdate": "Data de Inu00edcio",
+"label.quota.startquota": "Inu00edcio",
+"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.summary": "Sumu00e1rio",
+"label.quota.tariff": "Tarifa",
+"label.quota.tariff.edit": "Editar Tarifa",
+"label.quota.tariff.effectivedate": "Data Efetiva",
+"label.quota.totalusage": "Uso Total",
+"label.quota.usage": "Consumo da Cota",
+"label.rbd": "RDB",
+"label.rbdid": "Usu\u00e1rio Ceph",
+"label.rbdmonitor": "Monitor Ceph",
+"label.rbdpool": "Pool Ceph",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Motivo",
+"label.reboot": "Reiniciar",
+"label.receivedbytes": "Bytes Recebidos",
+"label.recent.errors": "Erros Recentes",
+"label.recover.vm": "Recuperar VM",
+"label.redundantrouter": "Roteador Redundantee",
+"label.redundantrouterstate": "Estado redundante",
+"label.redundantstate": "Estado redundante",
+"label.redundantvpcrouter": "VPC Redundante",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "Atualizar",
+"label.refresh.blades": "Atualizar L\u00e2minas",
+"label.region": "Regi\u00e3o",
+"label.region.details": "Detalhes da regi\u00e3o",
+"label.reinstall.vm": "Reinstalar VM",
+"label.related": "Relacionado",
+"label.relationaloperator": "Operador",
+"label.release.account": "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\u00e2ncia 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\u00e3o",
+"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\u00e1tico",
+"label.remove.static.route": "Remover rota est\u00e1tica",
+"label.remove.this.physical.network": "Remover esta rede f\u00edsica",
+"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\u00e1rio",
+"label.replace.acl": "Substituir ACL",
+"label.replace.acl.list": "Substituir Lista ACL",
+"label.required": "Obrigat\u00f3rio",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requer Atualiza\u00e7\u00e3o",
+"label.reserved.system.gateway": "Gateway de sistema reservado",
+"label.reserved.system.ip": "IP de Sistema Reservado",
+"label.reserved.system.netmask": "M\u00e1scara de rede reservada do sistema",
+"label.reservediprange": "Faixa de IP Reservada",
+"label.reservedsystemendip": "Fim dos IPs reservados para o sistema",
+"label.reservedsystemgateway": "Gateway de sistema reservado",
+"label.reservedsystemnetmask": "M\u00e1scara de rede reservada do sistema",
+"label.reservedsystemstartip": "In\u00edcio dos IPs reservados para o sistema",
+"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.reset.vpn.connection": "Resetar a conex\u00e3o VPN",
+"label.resetvm": "Restabelecer VM",
+"label.resource": "Recurso",
+"label.resource.limit.exceeded": "Limite de Recurso Excedido",
+"label.resource.limits": "Limite de Recursos",
+"label.resource.name": "Nome do Recurso",
+"label.resourceid": "ID do Recurso",
+"label.resourcename": "Nome do Recurso",
+"label.resources": "Recursos",
+"label.resourcestate": "Estado do Recurso",
+"label.response.timeout.in.sec": "Timeout de Resposta (em seg)",
+"label.restart.network": "Reiniciar rede",
+"label.restart.vpc": "reiniciar a VPC",
+"label.restartrequired": "Reiniciar obrigat\u00f3rio",
+"label.restore": "Restaurar",
+"label.retry.interval": "Intervalo de repeti\u00e7\u00e3o",
+"label.review": "Revisar",
+"label.revoke.project.invite": "Revogar convite",
+"label.role": "Fun\u00e7\u00e3o",
+"label.rolename": "Fun\u00e7\u00e3o",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Certificado Root",
+"label.root.disk.offering": "Oferta de Disco ROOT",
+"label.root.disk.size": "Tamanho do disco root (GB)",
+"label.rootdiskcontrollertype": "Controlador do disco Root",
+"label.rootdiskcontrollertypekvm": "Controlador do disco Root",
+"label.router.vm.scaled.up": "VM do Roteador Escalonada",
+"label.routercount": "Total de Roteadores Virtuais",
+"label.routerrequiresupgrade": "Atualiza\u00e7\u00e3o \u00e9 necess\u00e1ria",
+"label.routertype": "Tipo",
+"label.routing.host": "Host de Roteamento",
+"label.rule": "Regra",
+"label.rule.number": "Regra N\u00famero",
+"label.rules": "Regras",
+"label.running": "VMs Rodando",
+"label.s3.access.key": "Chave de acesso",
+"label.s3.bucket": "Balde",
+"label.s3.connection.timeout": "Tempo limite de conex\u00e3o",
+"label.s3.endpoint": "Ponto de acesso",
+"label.s3.max.error.retry": "Limite de tentativas de recupera\u00e7\u00e3o 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.samlenable": "Autorizar SAML SSO",
+"label.samlentity": "Provedor de Identidade",
+"label.saturday": "S\u00e1bado",
+"label.save": "Salvar",
+"label.save.and.continue": "Salvar e continuar",
+"label.save.changes": "Salvar altera\u00e7\u00f5es",
+"label.saving.processing": "Salvando....",
+"label.scale.up.policy": "Pol\u00edtica de Escalonamento",
+"label.scaledown.policy": "Pol\u00edtica de redu\u00e7\u00e3o",
+"label.scaleup.policy": "Pol\u00edtica de amplia\u00e7\u00e3o",
+"label.scope": "Escopo",
+"label.search": "Pesquisar",
+"label.secondary.staging.store": "Armazenamento de Est\u00e1gio Secund\u00e1rio",
+"label.secondary.staging.store.details": "Detalhes do Armazenamento de Est\u00e1gio Secund\u00e1rio",
+"label.secondary.storage": "Storage Secund\u00e1rio",
+"label.secondary.storage.count": "Pools de Storage secund\u00e1rios",
+"label.secondary.storage.details": "Detalhes de armazenamento secund\u00e1rio",
+"label.secondary.storage.vm": "VM de storage secund\u00e1rio",
+"label.secondary.used": "Uso do Storage Secund\u00c3\u00a1rio",
+"label.secondaryips": "IPs secund\u00e1rios",
+"label.secondarystoragelimit": "Limites do Storage Secund\u00e1rio (GiB)",
+"label.secretkey": "Chave Secreta",
+"label.security.group.name": "Nome do Security Group",
+"label.security.groups": "Grupos de seguran\u00e7a",
+"label.security.groups.enabled": "Security Groups Ativado",
+"label.securitygroup": "Security Group",
+"label.securitygroups": "Grupos de seguran\u00e7a",
+"label.select": "Selecionar",
+"label.select-view": "Selecionar visualiza\u00e7\u00e3o",
+"label.select.a.zone": "Selecione uma zona",
+"label.select.instance": "Selecionar inst\u00e2ncia",
+"label.select.instance.to.attach.volume.to": "Escolha uma inst\u00e2ncia 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\u00e3o",
+"label.select.tier": "Selecione camada",
+"label.select.vm.for.static.nat": "Selecionar VM para NAT est\u00e1tico",
+"label.self": "Meus",
+"label.sent": "Enviado",
+"label.sentbytes": "Bytes Enviados",
+"label.server": "Servidor",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Roteador Distribuido",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "VPC a N\u00edvel de Regi\u00e3o",
+"label.service.lb.elasticlbcheckbox": "LB El\u00e1stico",
+"label.service.lb.inlinemodedropdown": "Modo",
+"label.service.lb.lbisolationdropdown": "Isolamento de LB",
+"label.service.offering": "Plano",
+"label.service.offering.details": "Detalhes da oferta de servi\u00e7o",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "Recurso de roteador redundante",
+"label.service.state": "Estado do Servi\u00e7o",
+"label.service.staticnat.associatepublicip": "Associa IP P\u00fablico",
+"label.service.staticnat.elasticipcheckbox": "IP El\u00e1stico",
+"label.servicecapabilities": "Recursos de servi\u00e7os",
+"label.servicelist": "Servi\u00e7os",
+"label.serviceofferingid": "Oferta de Computa\u00e7\u00e3o",
+"label.serviceofferingname": "Oferta de Computa\u00e7\u00e3o",
+"label.session.expired": "Sess\u00e3o Expirada",
+"label.set.default.nic": "Configurar para NIC padr\u00e3o",
+"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\u00e7\u00e3o",
+"label.setup.network": "Configurar Rede",
+"label.setup.zone": "Configurar Zona",
+"label.shared": "Compatilhado",
+"label.sharedexecutable": "Compatilhado",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "Mostrar Regra de Entrada",
+"label.shrinkok": "Shrink OK",
+"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.sizegb": "Tamanho",
+"label.skip.guide": "Eu utilizei o CloudStack antes, pular este guia",
+"label.smb.domain": "Dom\u00ednio SMB",
+"label.smb.password": "Senha SMB",
+"label.smb.username": "Usu\u00e1rio SMB",
+"label.smbdomain": "Dom\u00ednio SMB",
+"label.smbpassword": "Senha SMB",
+"label.smbusername": "Usu\u00e1rio SMB",
+"label.snapshot": "Snapshot",
+"label.snapshot.name": "Nome do Snapshot",
+"label.snapshot.schedule": "Configurar Snapshot Recorrente",
+"label.snapshotlimit": "Limites de Snapshot",
+"label.snapshotmemory": "Snapshot da mem\u00f3ria",
+"label.snapshots": "Snapshots",
+"label.snmpcommunity": "Comunidade SNMP",
+"label.snmpport": "Porta SNMP",
+"label.sockettimeout": "Tempo limite no socket",
+"label.source.nat.supported": "SourceNAT Supportado",
+"label.sourcecidr": "CIDR de Origem",
+"label.sourceipaddress": "Endere\u00e7o IP de origem",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "Tipo de Source NAT Suportado",
+"label.sourceport": "Porta de origem",
+"label.specify.vxlan": "Especificar VXLAN",
+"label.specifyipranges": "Especifique range de IP",
+"label.specifyvlan": "Especificar VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "Detalhes do SRX",
+"label.ssh.key.pair.details": "Detalhes do par de chaves SSH",
+"label.ssh.key.pairs": "Par de chaves SSH",
+"label.sshkeypair": "Novo par de chaves SSH",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "IP do in\u00edcio",
+"label.start.lb.vm": "Iniciar LB VM",
+"label.start.reserved.system.ip": "In\u00edcio dos IPs reservados para o sistema",
+"label.start.vlan": "VLAN Inicial",
+"label.start.vxlan": "VXLAN Inicial",
+"label.startdate": "Por data (in\u00edcio)",
+"label.startip": "IP do in\u00edcio",
+"label.startipv4": "IP Inicial IPv4",
+"label.startipv6": "IP Inicial IPv6",
+"label.startport": "Porta de In\u00edcio",
+"label.startquota": "Valor",
+"label.state": "Estado",
+"label.static.nat.enabled": "NAT est\u00e1tico Habilitado",
+"label.static.nat.to": "NAT Est\u00e1tico para",
+"label.static.nat.vm.details": "Detalhes de NAT est\u00e1tico da VM",
+"label.static.routes": "Rotas est\u00e1ticas",
+"label.statistics": "Estat\u00edsticas",
+"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.method": "M\u00e9todo de Stickness",
+"label.sticky.cookie-name": "Nome do Cookie",
+"label.sticky.expire": "Expires",
+"label.sticky.holdtime": "Tempo de espera",
+"label.sticky.indirect": "Indireto",
+"label.sticky.length": "Tamanho",
+"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 Paradas",
+"label.storage": "Storage",
+"label.storage.tags": "Tags de Storage",
+"label.storage.traffic": "Tr\u00e1fego do Storage",
+"label.storageid": "Storage Prim\u00e1rio",
+"label.storagepool": "Pool de Armazanamento",
+"label.storagetags": "Tags de Storage",
+"label.storagetype": "Tipo de Storage",
+"label.subdomainaccess": "Acesso ao subdom\u00ednio",
+"label.submit": "Enviar",
+"label.submitted.by": "[Enviado por: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "Sucedido",
+"label.sunday": "Domingo",
+"label.supportedservices": "Servi\u00e7os Suportados",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Suporta VPC em N\u00edvel de Regi\u00e3o",
+"label.supportsstrechedl2subnet": "Suporte \u00e0 Streched L2 Subnet",
+"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.offerings": "Ofertas do Sistema",
+"label.system.service.offering": "System Service Offering",
+"label.system.service.offering.details": "Detalhes da oferta de servi\u00e7o 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.vms": "VM de Sistemas",
+"label.system.wide.capacity": "Capacidade Total do Sistema",
+"label.systemvmtype": "Tipo de VM de Sistema",
+"label.tag.key": "Chave",
+"label.tag.value": "Valor",
+"label.tagged": "Tagged",
+"label.tags": "Tags",
+"label.target.iqn": "Target IQN",
+"label.tariffvalue": "Valor da Tarifa",
+"label.task.completed": "Tarefa completa",
+"label.template": "Template",
+"label.templatebody": "Corpo do Email",
+"label.templatedn": "Seleciona Template",
+"label.templatefileupload": "Arquivo local",
+"label.templatelimit": "Limites do Template",
+"label.templatename": "Template",
+"label.templatenames": "Template",
+"label.templates": "Templates",
+"label.templatesubject": "Assunto",
+"label.templatetotal": "Template",
+"label.templatetype": "Template de Email",
+"label.tftp.dir": "TFTP Directory",
+"label.tftpdir": "Diret\u00f3rio raiz do tftp",
+"label.theme.default": "Tema Padr\u00e3o",
+"label.theme.grey": "Custom - Grey",
+"label.theme.lightblue": "Custom - Light Blue",
+"label.threshold": "Limiar",
+"label.thursday": "Quinta",
+"label.tier.details": "Detalhes da camada",
+"label.tiername": "Camada",
+"label.time": "Time",
+"label.time.colon": "Tempo:",
+"label.timeout": "Timeout",
+"label.timeout.in.second ": " Timeout (segundos)",
+"label.timezone": "Fuso Hor\u00e1rio",
+"label.timezone.colon": "Fuso Hor\u00e1rio",
+"label.token": "Token",
+"label.total.hosts": "Total de Hosts",
+"label.total.memory": "Total de Mem\u00f3ria",
+"label.total.storage": "Totam de Storage",
+"label.total.vms": "Total VMs",
+"label.totalcpu": "CPU TOTAL",
+"label.traffic.label": "Etiqueta de tr\u00e1fego",
+"label.traffic.types": "Tipos de Tr\u00e1fego",
+"label.traffictype": "Tipo de Tr\u00e1fego",
+"label.transportzoneuuid": "Uuid da Zona de Transporte",
+"label.tuesday": "Ter\u00e7a",
+"label.type": "Tipo",
+"label.type.id": "Tipo do ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "Indispon\u00edvel",
+"label.unhealthy.threshold": "Limiar de Insalubridade",
+"label.unit": "Unidade",
+"label.unlimited": "Ilimitado",
+"label.untagged": "N\u00e3o 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.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.sanity.result": "Resultado de Sanidade de Uso",
+"label.usage.server": "Uso do Servidor",
+"label.usageinterface": "Usage Interface",
+"label.usagename": "Tipo",
+"label.usageunit": "Unidade",
+"label.use.vm.ip": "Usar IP da VM:",
+"label.use.vm.ips": "Usa IPs da VM",
+"label.usehttps": "Use HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "Usu\u00e1rio",
+"label.user.details": "Detalhes do usu\u00e1rio",
+"label.user.vm": "VM do Usu\u00e1rio",
+"label.userdata": "Userdata",
+"label.userdatal2": "Dados de Usu\u00e1rio",
+"label.username": "Nome de usu\u00e1rio",
+"label.users": "Usu\u00e1rios",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"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.vcenterdatacenter": "vCenter Datacenter",
+"label.vcenterdatastore": "vCenter Datastore",
+"label.esx.host": "ESX/ESXi Host",
+"label.vcenterpassword": "vCenter Password",
+"label.vcenterusername": "vCenter Username",
+"label.vcipaddress": "Endere\u00e7o IP do vCenter",
+"label.vcsdeviceid": "ID",
+"label.version": "Vers\u00e3o",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "Resulo\u00e7\u00e3o max",
+"label.vgpu.max.vgpu.per.gpu": "vGPU por GPU",
+"label.vgpu.remaining.capacity": "Capacidade restante",
+"label.vgpu.video.ram": "RAM de v\u00eddeo",
+"label.vgputype": "Tipo de vGPU",
+"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\u00e1rios",
+"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.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.virtualmachinedisplayname": "Nome da VM",
+"label.virtualmachineid": "ID da VM",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "Intervalo de VLAN",
+"label.vlan.range.details": "Detalhes de range VLAN",
+"label.vlan.vni.ranges": "Range(s) de VLAN/VNI",
+"label.vlanid": "VLAN ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "Intervalo de VLAN",
+"label.vm.add": "Adicionar Inst\u00e2ncia",
+"label.vm.destroy": "Apagar",
+"label.vm.password": "Senha para a VM \u00e9",
+"label.vm.reboot": "Reiniciar",
+"label.vm.snapshots": "Snapshot da VM",
+"label.vm.start": "In\u00edcio",
+"label.vm.stop": "Parar",
+"label.vmdisplayname": "Nome de exibi\u00e7\u00e3o da VM",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS datastore",
+"label.vmipaddress": "Endere\u00e7o IP da VM",
+"label.vmlimit": "Limites da Inst\u00e2ncia",
+"label.vmname": "Nome da VM",
+"label.vms": "VMs",
+"label.vms.in.tier": "M\u00e1quinas virtuais em camadas",
+"label.vmstate": "Estado da VM",
+"label.vmtotal": "Total VMs",
+"label.vmwaredcid": "ID do datacenter VMware",
+"label.vmwaredcname": "Nome do datacenter VMware",
+"label.vmwaredcvcenter": "Vcednter do datacenter VMware",
+"label.vmwarenetworklabel": "Etiqueta de tr\u00e1fego VMware",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "Dispositivos VNMC",
+"label.volgroup": "Grupo de Volume",
+"label.volume": "Disco",
+"label.volume.details": "Detalhe do volume",
+"label.volume.migrated": "Volume migrado",
+"label.volumechecksum": "MD5 checksum",
+"label.volumefileupload": "Arquivo local",
+"label.volumegroup": "Grupo de Volume",
+"label.volumelimit": "Limites de Disco",
+"label.volumename": "Nome do Disco",
+"label.volumes": "Discos",
+"label.volumetotal": "Disco",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "Detalhes da oferta VPC",
+"label.vpc.offerings": "Ofertas VPC",
+"label.vpc.router.details": "Detalhes do roteador da VPC",
+"label.vpc.virtual.router": "Roteador Virtual VPC",
+"label.vpcid": "VPC",
+"label.vpclimit": "Limites VPC",
+"label.vpcname": "VPC",
+"label.vpcoffering": "Oferta VPC",
+"label.vpn": "VPN",
+"label.vpn.connection": "Conex\u00e3o VPN",
+"label.vpn.gateway": "Gateway de VPN",
+"label.vpncustomergatewayid": "Gateway de VPN de usu\u00e1rio",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "Nome",
+"label.vsmdevicestate": "Estado",
+"label.vsmipaddress": "Endere\u00e7o IP do Nexus 1000v",
+"label.vsmpassword": "Senha do Nexus 1000v",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Usu\u00e1rio do Nexus 1000v",
+"label.vsmusername.req": "Usu\u00e1rio do Nexus 1000v",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "Nome do vSwitch",
+"label.vswitch.type": "Tipo do vSwitch",
+"label.vswitchguestname": "Nome do vSwitch de Tr\u00e1fego Convidado",
+"label.vswitchguesttype": "Tipo de vSwitch de Tr\u00e1fego Convidado",
+"label.vswitchpublicname": "Nome do vSwitch de Tr\u00e1fego P\u00fablico",
+"label.vswitchpublictype": "Tipo de vSwitch de Tr\u00e1fego P\u00fablico",
+"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\u00e7\u00e3o",
+"label.wednesday": "Quarta-Feira",
+"label.weekly": "Semanal",
+"label.welcome": "Bem-Vindo",
+"label.welcome.cloud.console": "Painel de Controle",
+"label.what.is.cloudstack": "O que \u00e9 o CloudStack&#8482?",
+"label.writecachetype": "Tipo do cache de escrita",
+"label.xennetworklabel": "Etiqueta de tr\u00e1fego XenServer",
+"label.xenservertoolsversion61plus": "Vers\u00e3o original do XS \u00e9 6.1+",
+"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.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.zoneid": "Zona",
+"label.zonename": "Zona",
+"label.zonenamelabel": "Nome da zona",
+"label.zones": "Zonas",
+"label.zonewizard.traffictype.guest": "H\u00f3spede: tr\u00e1fego entre m\u00e1quinas virtuais de usu\u00e1rios finais",
+"label.zonewizard.traffictype.management": "Ger\u00eancia: Tr\u00e1fego entre recursos internos do CloudStack incluindo quaisquer componentes que se comunicam com o servidor de gerenciamento tais como hosts e m\u00e1quinas virtuais de sistema do CloudStack",
+"label.zonewizard.traffictype.public": "P\u00fablico: tr\u00e1fego entre a internet e m\u00e1quinas virtuais na nuvem.",
+"label.zonewizard.traffictype.storage": "Storage: tr\u00e1fego entre servidores de storage prim\u00e1ria e secund\u00e1ria, tais como templates de m\u00e1quinas virtuais e snapshots",
+"message.acquire.ip.nic": "Por favor, confirme que voc\u00ea deseja adquirir um novo IP secund\u00e1rio para esta Interface de Rede.</br>NOTA: Voc\u00ea precisa configurar manualmente o novo IP secund\u00e1rio dentro da maquinas virtual.",
+"message.acquire.new.ip": "Por favor confirme que voc\u00ea gostaria de adquirir um novo IP para esta rede.",
+"message.acquire.new.ip.vpc": "Por favor confirme que voc\u00ea gostaria de adquirir um novo IP para esta VPC.",
+"message.acquire.public.ip": "Selecione a zona de onde voc\u00ea deseja adquirir o novo IP",
+"message.action.cancel.maintenance": "A Manuten\u00e7\u00e3o do seu HOST foi cancelada com sucesso",
+"message.action.cancel.maintenance.mode": "Confirme que voc\u00ea deseja cancelar esta Manuten\u00e7\u00e3o",
+"message.action.change.service.warning.for.instance": "Sua inst\u00e2ncia deve ser desligada antes de tentar alterar a oferta de servi\u00e7os utilizada.",
+"message.action.change.service.warning.for.router": "O roteador precisa ser desligado antes de trocar o plano/tamanho.",
+"message.action.delete.cluster": "Confirme que voc\u00ea deseja excluir este HOST",
+"message.action.delete.disk.offering": "Confirme que voc\u00ea deseja excluir esta oferta de disco",
+"message.action.delete.domain": "Confirme que voc\u00ea deseja excluir este Dom\u00ednio",
+"message.action.delete.external.firewall": "Confirme que voc\u00ea gostaria de remover este Firewall externo. Aviso: Se voc\u00ea Est\u00e1 planejando adicionar novamente este mesmo Firewall, \u00e9 necess\u00e1rio apagar os contadores do dispositivo.",
+"message.action.delete.external.load.balancer": "Confirme que voc\u00ea gostaria de remover este Load Balancer Externo. Aviso: Se voc\u00ea Est\u00e1 planejando adicionar novamente este mesmo Load Balancer, \u00e9 necess\u00e1rio apagar os contadores do dispositivo.",
+"message.action.delete.ingress.rule": "Confirme que voc\u00ea deseja excluir esta regra de entrada.",
+"message.action.delete.iso": "Confirme que voc\u00ea deseja excluir esta ISO",
+"message.action.delete.iso.for.all.zones": "Esta ISO \u00e9 usada por todas as Zonas. Confirme se voc\u00ea deseja excluir a ISO de todas as Zonas",
+"message.action.delete.network": "Confirme que voc\u00ea deseja remover esta rede.",
+"message.action.delete.nexusvswitch": "Por favor confirme que voc\ufffd deseja remover este nexusVswitch.",
+"message.action.delete.physical.network": "Por favor confirme que voc\u00ea deseja deletar esta rede f\u00edsica",
+"message.action.delete.pod": "Confirme que voc\u00ea deseja remover este POD.",
+"message.action.delete.primary.storage": "Confirme que voc\u00ea deseja remover este Storage Prim\u00e1rio.",
+"message.action.delete.secondary.storage": "Confirme que voc\u00ea deseja remover este Storage Secund\u00e1rio.",
+"message.action.delete.security.group": "Confirme que voc\u00ea deseja remover este Security Group.",
+"message.action.delete.service.offering": "Confirme que voc\u00ea deseja remover este Plano.",
+"message.action.delete.snapshot": "Confirme que voc\u00ea deseja remover este Snapshot.",
+"message.action.delete.system.service.offering": "Por favor confirme que voc\u00ea deseja deletar esta oferta de servi\u00e7o de sistema.",
+"message.action.delete.template": "Confirme que voc\u00ea deseja remover este Template.",
+"message.action.delete.template.for.all.zones": "Este Template \u00e9 usado por todas as zonas. Confirme que voc\u00ea deseja remover o Template de todas as zonas.",
+"message.action.delete.volume": "Confirme que voc\u00ea deseja remover este Disco.",
+"message.action.delete.zone": "Confirme que voc\u00ea deseja remover esta Zona.",
+"message.action.destroy.instance": "Por favor, confirme que voc\u00ea deseja excluir esta Inst\u00e2ncia.",
+"message.action.destroy.systemvm": "Confirme que voc\u00ea 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\u00e7\u00e3o do cluster.",
+"message.action.disable.nexusvswitch": "Por favor confirme que voc\ufffd deseja desabilitar este nexusVswitch",
+"message.action.disable.physical.network": "Por favor confirme que voc\u00ea deseja desabilitar esta rede f\u00edsica.",
+"message.action.disable.pod": "Confirma a desativa\u00e7\u00e3o do POD.",
+"message.action.disable.static.nat": "Confirme que voc\u00ea deseja desativar o NAT Est\u00e1tico.",
+"message.action.disable.zone": "Confirma a desativa\u00e7\u00e3o da zona.",
+"message.action.download.iso": "Por favor confirme que voc\u00ea deseja baixar esta ISO.",
+"message.action.download.template": "Por favor confirme que voc\u00ea deseja baixar este template.",
+"message.action.downloading.template": "Baixando template",
+"message.action.enable.cluster": "Confirma a ativa\u00e7\u00e3o do cluster.",
+"message.action.enable.maintenance": "O Host foi preparado com sucesso para Manuten\u00e7\u00e3o. Este processo poder\u00e1 levar alguns minutos ou mais dependendo do n\u00famero de VMs hospedadas neste Host.",
+"message.action.enable.nexusvswitch": "Por favor confirme que voc\ufffd deseja habilitar este nexusVswitch.",
+"message.action.enable.physical.network": "Por favor confirme que voc\u00ea deseja habilitar esta rede f\u00edsica.",
+"message.action.enable.pod": "Confirma a ativa\u00e7\u00e3o do POD.",
+"message.action.enable.zone": "Confirma a ativa\u00e7\u00e3o da zona.",
+"message.action.expunge.instance": "Por favor, confirme que voc\u00ea deseja eliminar esta inst\u00e2ncia.",
+"message.action.force.reconnect": "O procedimento de reconex\u00e3o for\u00e7ada foi preparado com sucesso. Este processo poder\u00e1 levar alguns minutos.",
+"message.action.host.enable.maintenance.mode": "Ativar o modo de Manuten\u00e7\u00e3o ir\u00e1 causar o live migration de todas as Inst\u00e2ncias hospedadas neste Host para o pr\u00f3ximo dispon\u00edvel.",
+"message.action.instance.reset.password": "Por favor confirme que voc\u00ea deseja alterar a senha de ROOT para est\u00e1 m\u00e1quina virtual.",
+"message.action.manage.cluster": "Confirma a vincula\u00e7\u00e3o do cluster.",
+"message.action.primarystorage.enable.maintenance.mode": "Aviso: Colocar o Storage prim\u00e1rio em modo de Manuten\u00e7\u00e3o ir\u00e1 causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar?",
+"message.action.reboot.instance": "Por favor, confirme que voc\u00ea deseja reiniciar esta inst\u00e2ncia.",
+"message.action.reboot.router": "Confirme que voc\ufffd deseja reiniciar este roteador.",
+"message.action.reboot.systemvm": "Confirme que voc\u00ea 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\u00ea deseja liberar este IP.",
+"message.action.remove.host": "Favor confirmar que voc\u00ea deseja remover este host.",
+"message.action.reset.password.off": "Sua Inst\u00e2ncia n\u00e3o suporta esta funcionalidade.",
+"message.action.reset.password.warning": "Para recuperar a senha \u00e9 necess\u00e1rio parar a Inst\u00e2ncia.",
+"message.action.restore.instance": "Por favor, confirme que voc\u00ea deseja restaurar esta Inst\u00e2ncia.",
+"message.action.revert.snapshot": "Por favor, confirme que voc\u00ea deseja reverter o seu volume deste snapshot.",
+"message.action.start.instance": "Por favor, confirme que voc\u00ea deseja iniciar esta Inst\u00e2ncia.",
+"message.action.start.router": "Confirme que voc\u00ea deseja inciar este roteador.",
+"message.action.start.systemvm": "Confirme que voc\u00ea deseja iniciar esta VM de sistema.",
+"message.action.stop.instance": "Por favor, confirme que voc\u00ea deseja parar esta inst\u00e2ncia.",
+"message.action.stop.router": "Confirme que voc\ufffd deseja parar este roteador.",
+"message.action.stop.systemvm": "Confirme que voc\u00ea deseja parar esta VM de Sistema.",
+"message.action.unmanage.cluster": "Confirma a desvincula\u00e7\u00e3o 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\u00ea deseja excluir este snapshot da VM.",
+"message.action.vmsnapshot.revert": "Reverter snapshot da VM",
+"message.activate.project": "Voc\u00ea tem certeza que deseja ativar este projeto ?",
+"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\u00e2metros para adicionar uma nova oferta de disco.",
+"message.add.domain": "Por favor especifique o subdom\u00ednio que voc\u00ea deseja criar neste dom\u00ednio",
+"message.add.firewall": "Adicionar Firewall \u00e0\u00a0 zona.",
+"message.add.guest.network": "Por favor confirme que voc\u00ea gostaria de adicionar uma rede guest.",
+"message.add.host": "Especifique os seguintes par\u00e2metros 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\u00e7\u00e3o 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\u00e9m hosts e servidores de storage prim\u00e1rio que ser\u00e3o adicionados em uma etapa posterior. Inicialmente, configure um intervalo de endere\u00e7os IP reservados para o tr\u00e1fego de gerenciamento interno do CloudStack. A faixa de IP reservados devem ser \u00fanicos para cada zona na nuvem.",
+"message.add.primary": "Especifique os seguintes par\u00e2metros para adicionar um novo Storage prim\u00e1rio.",
+"message.add.primary.storage": "Adicionar novo Storage prim\u00e1rio \u00c3\u00a0 zona <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
+"message.add.region": "Por favor, especifique as informa\u00e7\u00f5es necess\u00e1rias para adicionar uma nova regi\u00e3o.",
+"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\u00e7\u00e3o.",
+"message.add.system.service.offering": "Por favor preencha os dados abaixo para adicionar uma nova oferta de servi\u00e7o 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.add.vpn.gateway": "Favor confirmar que voc\u00ea deseja adicionar um gateway de VPN",
+"message.added.vpc.offering": "Adicionada oferta VPC",
+"message.adding.host": "Adicionando host",
+"message.adding.netscaler.device": "Adicionando dispositivo Nescaler",
+"message.adding.netscaler.provider": "Adicionando Netscaler provider",
+"message.additional.networks.desc": "Por favor, selecione a(s) rede(s) adicionais que sua inst\u00e2ncia virtual estar\u00e1 conectada.",
+"message.admin.guide.read": "Para VMs baseadas em VMware, por favor leia a sess\u00e3o sobre escalonamento din\u00e2mico no guia do administrador antes de escalonar. Voc\u00ea 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\u00e7\u00e3o se desejar utilizar Security Groups para isolamento das VMs guest.",
+"message.advanced.virtual": "Escolha esta op\u00e7\u00e3o se desejar utilizar VLANs para isolamento das VMs guest.",
+"message.after.enable.s3": "Storage secund\u00e1ria fornecida por S3 configurada. Nota: ao deixar esta p\u00e1gina, voc\u00ea n\u00e3o ser\u00e1 capaz de reconfigurar S3 novamente.",
+"message.after.enable.swift": "Swift Configurado. Nota: Ap\u00f3s deixar esta p\u00e1gina, voc\u00ea n\u00e3o ser\u00e1 capaz de reconfigurar o Swift novamente.",
+"message.alert.state.detected": "Alerta de estado detectado",
+"message.allow.vpn.access": "Entre com nome de Usu\u00e1rio e senha do Usu\u00e1rio que ter\u00e1 acesso VPN.",
+"message.apply.snapshot.policy": "Voc\u00ea atualizou com sucesso sua pol\u00edtica 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\u00ea deseja conectar o ISO \u00e0 esta inst\u00e2ncia virtual.",
+"message.attach.volume": "Preencha os seguintes dados para conectar o novo disco. Se voc\u00ea Est\u00e1 conectando um disco a uma maquina virtual Windows, ser\u00e1 necess\u00e1rio reiniciar a Inst\u00e2ncia para visualizar o novo disco.",
+"message.basic.mode.desc": "Escolha este modelo de rede se voc\u00ea <b>*<u>n\u00e3o</u>*</b> quer suporte a VLAN. Toda Inst\u00e2ncia criada neste modelo de rede estar\u00e1 ligado diretamente a um IP da rede e ser\u00e1 usado Security Groups para prover seguran\u00e7a e segrega\u00e7\u00e3o.",
+"message.change.offering.confirm": "Por favor, confirme que voc\u00ea deseja mudar a oferta de servi\u00e7o desta inst\u00e2ncia 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\u00ea tem m\u00faltiplas redes f\u00edsicas; favor configurar etiquetas para cada tipo de tr\u00e1fego clicando no bot\u00e3o Edit.",
+"message.configure.firewall.rules.allow.traffic": "Configure as regras para permitir o Tr\u00e1fego",
+"message.configure.firewall.rules.block.traffic": "Configurar as regras para bloquear o Tr\u00e1fego",
+"message.configure.ldap": "Por favor, confirme que voc\u00ea deseja configurar o LDAP.",
+"message.configuring.guest.traffic": "Configurando tr\u00e1fego do guest",
+"message.configuring.physical.networks": "Configurando redes f\u00edsicas",
+"message.configuring.public.traffic": "Configurando tr\u00e1fego p\u00fablico",
+"message.configuring.storage.traffic": "Configurando tr\u00e1fego de storage",
+"message.confirm.action.force.reconnect": "Por favor confirme que voc\u00ea deseja for\u00e7ar a reconex\u00e3o com este host.",
+"message.confirm.add.vnmc.provider": "Por favor confirme que voc\u00ea gostaria de adicionar este provedor VNMC.",
+"message.confirm.archive.alert": "Por favor confirme que voc\u00ea deseja arquivar este alerta.",
+"message.confirm.archive.event": "Por favor confirme que voc\u00ea deseja arquivar este evento",
+"message.confirm.archive.selected.alerts": "Por favor confirme que voc\u00ea deseja arquivar os alertas selecionados",
+"message.confirm.archive.selected.events": "Por favor confirme que voc\u00ea deseja arquivar os eventos selecionados",
+"message.confirm.attach.disk": "Voc\u00ea tem certeza que deseja conectar este disco?",
+"message.confirm.create.volume": "Voc\u00ea 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\u00ea realmente quer dedicar este cluster ao dom\u00ednio/conta?",
+"message.confirm.dedicate.host.domain.account": "Voc\u00ea realmente quer dedicar este host ao dom\u00ednio/conta?",
+"message.confirm.dedicate.pod.domain.account": "Voc\u00ea realmente quer dedicar este pod ao dom\u00ednio/conta?",
+"message.confirm.dedicate.zone": "Voc\u00ea realmente quer dedicar esta zona ao dom\u00ednio/conta?",
+"message.confirm.delete.acl.list": "Voc\u00ea tem certeza que deseja apagar esta lista ACL?",
+"message.confirm.delete.alert": "Voc\u00ea tem certeza que deseja apagar este alerta?",
+"message.confirm.delete.baremetal.rack.configuration": "Por favor, confirme que voc\u00ea deseja remover a Configura\u00e7\u00e3o de Rack de Baremetal",
+"message.confirm.delete.bigswitchbcf": "Por favor, confirme que voc\u00ea deseja deletar este BigSwitch BCF Controller",
+"message.confirm.delete.brocadevcs": "Por favor confirme que voc\u00ea deseja remover o Brocade Vcs Switch",
+"message.confirm.delete.ciscoasa1000v": "Favor confirmar que voc\u00ea deseja apagar este CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Por favor confirme que voc\u00ea deseja apagar este recurso CiscoVNMC",
+"message.confirm.delete.f5": "Por favor confirme que voc\u00ea deseja remover o F5",
+"message.confirm.delete.internal.lb": "Por favor confirme que voc\u00ea deseja remover este LB interno",
+"message.confirm.delete.netscaler": "Por favor confirme que voc\u00ea deseja remover o NetScaler",
+"message.confirm.delete.pa": "Por favor, confirme que voc\u00ea deseja remover Palo Alto",
+"message.confirm.delete.secondary.staging.store": "Por favor confirme que deseja apagar Armazenamento de Est\u00e1gio Secund\u00e1rio",
+"message.confirm.delete.srx": "Por favor confirme que voc\u00ea deseja remover o SRX",
+"message.confirm.delete.ucs.manager": "Confirme se voc\u00ea deseja excluir o Gerente UCS.",
+"message.confirm.destroy.router": "Por favor confirme que voc\u00ea gostaria de destruir este roteador",
+"message.confirm.disable.host": "Favor confirmar que voc\u00ea deseja desabilitar este host.",
+"message.confirm.disable.network.offering": "Voc\u00ea tem certeza que deseja deshabilitar esta oferta de rede?",
+"message.confirm.disable.provider": "Por favor confirme que voc\u00ea gostaria de desabilitar este provider",
+"message.confirm.disable.vnmc.provider": "Por favor confirme que voc\u00ea gostaria de desabilitar este provedor VNMC.",
+"message.confirm.disable.vpc.offering": "Voc\u00ea tem certeza que deseja desabilitar esta oferta de VPC?",
+"message.confirm.enable.host": "Por favor confirme que voc\u00ea deseja habilitar este host.",
+"message.confirm.enable.network.offering": "Voc\u00ea tem certeza que deseja habilitar esta oferta de rede?",
+"message.confirm.enable.provider": "Por favor confirme que voc\u00ea gostaria de habilitar este provider",
+"message.confirm.enable.vnmc.provider": "Por favor confirme que voc\u00ea gostaria de habilitar este provedor VNMC.",
+"message.confirm.enable.vpc.offering": "Voc\u00ea 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\u00ea deseja entrar neste projeto",
+"message.confirm.migrate.volume": "Voc\u00ea quer migrar este volume?",
+"message.confirm.refresh.blades": "Por favor confirme que voc\u00ea deseja renovar as l\u00e2minas.",
+"message.confirm.release.dedicate.vlan.range": "Confirme que voc\u00ea deseja liberar esta faixa de VLAN dedicada.",
+"message.confirm.release.dedicated.cluster": "Voc\u00ea deseja liberar este cluster dedicado?",
+"message.confirm.release.dedicated.host": "Voc\u00ea deseja liberar esta host dedicado?",
+"message.confirm.release.dedicated.pod": "Voc\u00ea deseja liberar esta pod dedicado?",
+"message.confirm.release.dedicated.zone": "Voc\u00ea deseja liberar esta zona dedicada?",
+"message.confirm.remove.event": "Voc\u00ea tem certeza que deseja remover este evento?",
+"message.confirm.remove.ip.range": "Por favor confirme que voc\u00ea deseja remover este range de IP.",
+"message.confirm.remove.load.balancer": "Por favor, confirme que voc\u00ea quer remover a VM do Balanceador de Carga",
+"message.confirm.remove.network.offering": "Voc\u00ea tem certeza que deseja remover esta oferta de rede?",
+"message.confirm.remove.selected.alerts": "Por favor confirme que voc\u00ea deseja remover os alertas selecionados",
+"message.confirm.remove.selected.events": "Por favor confirme que voc\u00ea deseja remover os eventos selecionados",
+"message.confirm.remove.vmware.datacenter": "Por favor, confirme que voc\u00ea quer remover este VMware datacenter",
+"message.confirm.remove.vpc.offering": "Voc\u00ea tem certeza que deseja remover esta oferta de VPC?",
+"message.confirm.replace.acl.new.one": "Voc\u00ea deseja substituir a ACL com uma nova?",
+"message.confirm.scale.up.router.vm": "Voc\u00ea realmente quer escalonar a VM do Roteador?",
+"message.confirm.scale.up.system.vm": "Voc\u00ea realmente quer escalonar a VM do sistema?",
+"message.confirm.shutdown.provider": "Por favor confirme que voc\u00ea deseja desligar este provider",
+"message.confirm.start.lb.vm": "Confirme que voc\u00ea deseja iniciar esta LB VM",
+"message.confirm.stop.lb.vm": "Confirme que voc\u00ea deseja parar esta LB VM",
+"message.confirm.upgrade.router.newer.template": "Por favor confirme que voc\u00ea deseja atualizar o roteador para usar template mais recente.",
+"message.confirm.upgrade.routers.account.newtemplate": "Por favor confirme que voc\u00ea deseja atualizar todos os roteadores desta conta para o template mais novo.",
+"message.confirm.upgrade.routers.cluster.newtemplate": "Por favor confirme que voc\u00ea deseja atualizar todos os roteadores deste cluster para o template mais novo.",
+"message.confirm.upgrade.routers.newtemplate": "Por favor confirme que voc\u00ea deseja atualizar todos os roteadores desta zona para o template mais novo.",
+"message.confirm.upgrade.routers.pod.newtemplate": "Por favor confirme que voc\u00ea deseja atualizar todos os roteadores neste pod para o template mais novo.",
+"message.copy.iso.confirm": "Confirme se voc\u00ea 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\u00ea tem certeza que deseja copiar o template ?",
+"message.create.template": "Voc\u00ea 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\u00e7\u00f5es antes de criar o template a partir do disco: <b><span id=\"volume_name\"></span></b>. A cria\u00e7\u00e3o 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\u00e1rio",
+"message.creating.secondary.storage": "Criando storage secund\u00e1rio",
+"message.creating.systemvm": "Criando VMs do sistema (isso pode levar algum tempo)",
+"message.creating.zone": "Criando zona.",
+"message.dedicate.zone": "Zona dedicada",
+"message.dedicated.zone.released": "Zona dedicada lioberada",
+"message.delete.account": "Confirme se voc\u00ea deseja excluir esta conta.",
+"message.delete.affinity.group": "Por favor, confirme que voc\u00ea deseja remover este grupo de afinidade",
+"message.delete.gateway": "Favor confirmar que voc\u00ea deseja deleta o gateway",
+"message.delete.project": "Voc\u00ea tem certeza que deseja deletar este projeto ?",
+"message.delete.user": "Por favor confirme que voc\u00ea deseja deletar este usu\u00e1rio.",
+"message.delete.vpn.connection": "Favor confirmar que voc\u00ea deseja deletar esta conex\u00e3o VPN",
+"message.delete.vpn.customer.gateway": "Favor confirmar que voc\u00ea deseja deletar este gateway de VPN de usu\u00e1rio",
+"message.delete.vpn.gateway": "Favor confirmar que voc\u00ea deseja deletar este gateway de VPN",
+"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\u00e7\u00e3o 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 \u00fanica rede onde em cada inst\u00e2ncia de VM \u00e9 atribu\u00eddo um IP diretamente na rede. O isolamento Guest podem ser fornecidos atrav\u00e9s de camada-3 da rede com grupos de seguran\u00e7a (filtragem da fonte de endere\u00e7os 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\u00eam hardware id\u00eantico, executam o mesmo hypervisor, est\u00e3o na mesma sub-rede e acessam o mesmo storage compartilhado. Cada cluster \u00e9 constitu\u00eddo por um ou mais hosts e um ou mais servidores de storage prim\u00e1rio.",
+"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\u00fablica est\u00e1 definida, CloudStack ir\u00e1 registrar a chave p\u00fablica. Voc\u00ea pode us\u00e1-la atrav\u00e9s de sua chave privada.<br><br>(2) Se a chave p\u00fablica n\u00e3o est\u00e1 definida, CloudStack ir\u00e1 criar um novo par de chaves SSH. Neste caso, copie e salve a chave privada. CloudStack n\u00e3o ir\u00e1 mant\u00ea-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\u00ea deve instalar um hypervisor no host, atribuir um endere\u00e7o IP e garantir que o host est\u00e1 conectado ao servidor de gerenciamento do CloudStack.<br/><br/>Forne\u00e7a o hostname ou o endere\u00e7o IP do host, o nome de usu\u00e1rio (geralmente root) e a senha  e qualquer label que voc\u00ea utiliza para categorizar os hosts.",
+"message.desc.primary.storage": "Cada cluster deve conter um ou mais servidores de storage prim\u00e1rio e iremos adicionar o primeiro agora. Um storage prim\u00e1rio, cont\u00e9m os volumes de disco para todas as VMs em execu\u00e7\u00e3o nos hosts do cluster. Utiliza qualquer protocolo compat\u00edvel com os padr\u00f5es que \u00e9 suportado pelo hypervisor utilizado.",
+"message.desc.reset.ssh.key.pair": "Por favor, especifique um par de chaves SSH que voc\u00ea deseja adicionar a esta VM. Por favor, note que a senha de root ser\u00e1 alterada por esta opera\u00e7\u00e3o caso a senha esteja ativada.",
+"message.desc.secondary.storage": "Cada zona deve ter pelo menos um NFS ou servidor de storage secund\u00e1rio e iremos adicionar o primeiro agora. Um storage secund\u00e1rios armazena templates de VM, imagens ISO e snapshots do volume de disco da VM. Esse servidor deve estar dispon\u00edvel para todos os hosts na zona. <br/><br/> Fornecer o endere\u00e7o IP e o caminho exportados.",
+"message.desc.zone": "Uma zona \u00e9 a maior unidade organizacional no CloudStack e normalmente corresponde \u00e0 um \u00fanico datacenter. As Zonas disponibilizam isolamento f\u00edsico e redund\u00e2ncia. Uma zona \u00e9 composta por um ou mais pods (cada um dos quais cont\u00e9m os hosts e servidores de storage prim\u00e1rio) e um servidor de storage secund\u00e1rio que \u00e9 compartilhado por todos os pods na zona.",
+"message.detach.disk": "Voc\u00ea tem certeza que deseja desconectar este disco ?",
+"message.detach.iso.confirm": "Confirme se voc\u00ea deseja desconectar o ISO da inst\u00e2ncia virtual.",
+"message.disable.account": "Por favor confirme que voc\u00ea deseja desabilitar esta conta. Ap\u00f3s desabilitar uma conta, todos os usu\u00e1rios desta conta n\u00e3o ir\u00e3o possuir mais acesso aos seus recursos da cloud.  Todas as m\u00e1quinas virtuais ser\u00e3o automaticamente desligadas.",
+"message.disable.snapshot.policy": "Voc\u00ea desativou com sucesso sua pol\u00edtica de Snapshot.",
+"message.disable.user": "Por favor confirme que voc\u00ea deseja desabilitar este usu\u00e1rio.",
+"message.disable.vpn": "Voc\u00ea tem certeza que deseja desabilitar a VPN?",
+"message.disable.vpn.access": "Confirme se voc\u00ea 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\u00e3o-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\u00ea quer baixar este volume",
+"message.edit.account": "Editar (\"-1\" indica que n\u00e3o haver\u00e1 limites para a quantidade de recursos criado)",
+"message.edit.confirm": "Por favor, confirme as altera\u00e7\u00f5es 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\u00e1fego que voc\u00ea deseja associar com este tipo de tr\u00e1fego.",
+"message.enable.account": "Confirme se voc\u00ea deseja ativar a conta.",
+"message.enable.user": "Por favor confirme que voc\u00ea deseja habilitar este usu\u00e1rio.",
+"message.enable.vpn": "Por favor confirme que voc\u00ea deseja acesso VPN habilitado para este endere\u00e7o IP.",
+"message.enable.vpn.access": "VPN Est\u00e1 desativada para este endere\u00e7o IP. Gostaria de ativar o acesso VPN?",
+"message.enabled.vpn": "Seu acesso VPN Est\u00e1 ativado e pode ser acessado atrav\u00e9s do IP",
+"message.enabled.vpn.ip.sec": "Sua chave IPSec (pre-shared) \u00e9",
+"message.enabling.network.offering": "Habilitando oferta de rede",
+"message.enabling.security.group.provider": "Habilitar provider de grupo de seguran\u00e7a",
+"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\u00edrgula, se houver mais de uma",
+"message.enter.token": "Por favor entre o token que voc\u00ea recebeu no e-mail privado.",
+"message.generate.keys": "Por favor confirme que voc\u00ea deseja gerar novas chaves para este usu\u00e1rio.",
+"message.gslb.delete.confirm": "Confirme que voc\u00ea deseja apagar este GSLB",
+"message.gslb.lb.remove.confirm": "Confirme que voc\u00ea deseja remover o balanceamento de carga deste GSLB",
+"message.guest.traffic.in.advanced.zone": "O tr\u00e1fego de rede guest \u00e9 para comunica\u00e7\u00e3o entre m\u00e1quinas virtuais do usu\u00e1rio final. Especifique um intervalo de IDs de VLAN para transportar o tr\u00e1fego do guest para cada rede f\u00edsica.",
+"message.guest.traffic.in.basic.zone": "O tr\u00e1fego de rede guest \u00e9 para comunica\u00e7\u00e3o entre m\u00e1quinas virtuais do usu\u00e1rio final. Especifique um intervalo de endere\u00e7os IP para que CloudStack possa atribuir \u00e0s VMs. Certifique-se que este intervalo n\u00e3o 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\u00e3o para tentar executar novamente.",
+"message.installwizard.copy.whatisacluster": "Um cluster prov\u00ea uma maneira de agrupar hosts. Os hosts em um cluster tem hardware id\u00eantico, rodam o mesmo hypervisor, est\u00e3o na mesma subnet, acessam o mesmo storage compartilhado. Inst\u00e2ncias de m\u00e1quinas virtuais (VMs) podem ser migradas a quente - live migration -  de um host para outro host no mesmo cluster, sem interromper o servi\u00e7o para o usu\u00e1rio. Um Cluster \u00e9 a terceira maior unidade organizacional em uma instala\u00e7\u00e3o CloudStack&#8482; . Clusters est\u00e3o contidos em pods e pods est\u00e3o contidos em zonas.<br/><br/>O CloudStack&#8482; permite m\u00faltiplos clusters em uma mesma cloud, entretanto para a instala\u00e7\u00e3o b\u00e1sica, n\u00f3s iremos precisar apenas de um cluster.",
+"message.installwizard.copy.whatisahost": "Um host \u00e9 um \u00fanico computador. Os Hosts prov\u00eaem os recursos computacionais para executar as m\u00e1quinas virtuais.  Cada host possu\u00ed o software do hypervisor instalado nele para gerenciar as guest VMs (Exceto os hosts bare metal, que s\u00e3o um caso especial discutido no Guia Avan\u00e7ado de Instala\u00e7\u00e3o). Por exemplo, um servidor Linux com KVM habilitado,  um servidor Citrix XenServer e um servidor ESXi s\u00e3o hosts. Na Instala\u00e7\u00e3o B\u00e1sica, n\u00f3s utilizamos um \u00fanico host rodando XenServer ou KVM.<br/><br/>O host \u00e9 a menor unidade organizacional dentro de uma instala\u00e7\u00e3o CloudStack&#8482; . Hosts est\u00e3o contidos dentro de Clusters, clusters est\u00e3o contidos dentro de pods e pods est\u00e3o contidos dentro de zonas.",
+"message.installwizard.copy.whatisapod": "Um pod normalmente representa um \u00fanico rack. Hosts no mesmo pod est\u00e3o na mesma subrede.<br/><br/> Um pod \u00e9 a segunda maior unidade organizacional de uma instala\u00e7\u00e3o CloudStack&#8482; . Pods est\u00e3o contidos dentro de zonas. Cada zona, pode conter um ou mais pods; Na instala\u00e7\u00e3o b\u00e1sica, voc\u00ea ir\u00e1 ter apenas um pod na sua zona.",
+"message.installwizard.copy.whatisazone": "Uma zona \u00e9 a maior unidade organizacional em uma instala\u00e7\u00e3o CloudStack&#8482; . Uma zona tipicamente corresponde a um \u00fanico datacenter, apesar de ser poss\u00edvel ter m\u00faltiplas zonas no mesmo datacenter. O benef\u00edcio de se organizar a infra-estrutura em zonas \u00e9 permitir o isolamento f\u00edsico e redund\u00e2ncia. Por exemplo, cada zona pode possuir sua pr\u00f3pria alimenta\u00e7\u00e3o de  energia e link de sa\u00edda de internet e zonas podem estar geograficamente separadas (apesar de n\u00e3o ser obrigat\u00f3rio).",
+"message.installwizard.copy.whatiscloudstack": "O CloudStack&#8482 \u00e9 uma plataforma de software que agrega recursos computacionais para construir uma Cloud de Infra-estrutura como Servi\u00e7o (IaaS) p\u00fablica, privada ou h\u00edbrida. O CloudStack&#8482 ger\u00eancia a rede, o storage e os recursos computacionais que comp\u00f5em a infra-estrutura de cloud. Utilize o CloudStack&#8482 para instalar, gerenciar e configurar os ambientes de cloud computing.<br/><br/>Indo al\u00e9m de imagens de m\u00e1quinas virtuais individuais rodando em hardware commodity, CloudStack&#8482 prov\u00ea uma solu\u00e7\u00e3o  completa de software de infra-estrutura de cloud para entregar datacenters virtuais como um servi\u00e7o - possuindo todos os componentes essenciais para contruir, instalar e gerenciar aplica\u00e7\u00f5es na cloud multi-camadas e multi-tenant. Ambas as vers\u00f5es open-source e premium est\u00e3o dispon\u00edveis, com a vers\u00e3o opensource oferecendo praticamente os mesmos recursos.",
+"message.installwizard.copy.whatisprimarystorage": "Uma infraestrutura de Cloud CloudStack; utiliza dois tipos de storage: storage prim\u00e1rio e storage secund\u00e1rio. Ambos os tipos podem ser iSCSI,  NFS servers, ou disco local.<br/><br/><strong>O Storage prim\u00e1rio</strong> est\u00e1 associado com um cluster, e armazena os volumes de disco de cada guest VM para todas as VMs em execu\u00e7\u00e3o nos hosts deste cluster. O servidor de storage prim\u00e1rio tipicamente encontra-se localizado perto dos hosts.",
+"message.installwizard.copy.whatissecondarystorage": "O storage secund\u00e1rio est\u00e1 associado a uma zona, ele \u00e9 respons\u00e1vel por armazenar o seguinte: <ul><li>Imagens de Templates do SO - que podem ser utilizadas para boot das VMs e podem incluir configura\u00e7\u00f5es adicionais, como por exemplo as aplica\u00e7\u00f5es instaladas</li><li>Imagens ISO - Imagens de sistema operacional que podem ser boot\u00e1veis ou n\u00e3o</li><li>Snapshots do volume de discos - c\u00f3pias salvas dos dados de uma VM que pode ser utilizada para recupera\u00e7\u00e3o de dados ou cria\u00e7\u00e3o 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\u00e3o \u00e9 usado pelo CloudStack.",
+"message.installwizard.tooltip.addhost.hostname": "O nome DNS ou endere\u00e7o IP do host.",
+"message.installwizard.tooltip.addhost.password": "Este \u00e9 a senha do usu\u00e1rio especificado acima (da sua instala\u00e7\u00e3o 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 \u00e9 o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secund\u00e1rio das VMs e Proxy Console das VMs. Estes endere\u00e7os IP s\u00e3o 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\u00e1scara de rede est\u00e1 em uso na subrede que os guests ir\u00e3o utilizar.",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "Este \u00e9 o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secund\u00e1rio das VMs e Proxy Console das VMs. Estes endere\u00e7os IP s\u00e3o 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 \u00e9 o path exportado pelo servidor. Path (para SharedMountPoint). Com o KVM este \u00e9 o path em cada host onde o storage prim\u00e1rio est\u00e1 montado. Por exemplo, \"/mnt/primary\".",
+"message.installwizard.tooltip.addprimarystorage.server": "(para NFS, iSCSI ou PreSetup) O Endere\u00e7o IP ou nome DNS do dispositivo de storage.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "O endere\u00e7o IP do servidor NFS hospedando o storage secund\u00e1rio",
+"message.installwizard.tooltip.addsecondarystorage.path": "Path exportado, localizado no servidor que voc\u00ea especificou acima",
+"message.installwizard.tooltip.addzone.dns1": "Estes s\u00e3o os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS ser\u00e3o acessados pela interface de rede p\u00fablica que voc\u00ea ir\u00e1 adicionar posteriormente. O endere\u00e7o IP p\u00fablico da zona deve possuir uma rota para os servidores DNS configurados aqui.",
+"message.installwizard.tooltip.addzone.dns2": "Estes s\u00e3o os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS ser\u00e3o acessados pela interface de rede p\u00fablica que voc\u00ea ir\u00e1 adicionar posteriormente. O endere\u00e7o IP p\u00fablico da zona deve possuir uma rota para os servidores DNS configurados aqui.",
+"message.installwizard.tooltip.addzone.internaldns1": "Estes s\u00e3o os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS ser\u00e3o acessados atrav\u00e9s da interface de rede privada das VMs de sistema. O endere\u00e7o IP privado que voc\u00ea configurar para os pods deve possuir uma rota para os servidores DNS configurados aqui.",
+"message.installwizard.tooltip.addzone.internaldns2": "Estes s\u00e3o os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS ser\u00e3o acessados atrav\u00e9s da interface de rede privada das VMs de sistema. O endere\u00e7o IP privado que voc\u00ea 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\u00e7\u00e3o da sua rede",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "O range de endere\u00e7os IP que estar\u00e1 dispon\u00edvel para aloca\u00e7\u00e3o 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\u00e1scara de rede da subrede que os guests devem usar",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "O range de endere\u00e7os IP que estar\u00e1 dispon\u00edvel para aloca\u00e7\u00e3o 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\u00ea realmente quer escalonar sua inst\u00e2ncia?",
+"message.instancewizard.notemplates": "Voc\u00ea n\u00e3o possui nenhum template dispon\u00edvel; por favor adicione um template compat\u00edvel e reinicie o wizard de inst\u00e2ncia.",
+"message.ip.address.changed": "Seu endere\u00e7o IP pode ter mudado; voc\u00ea gostaria de atualizar a listagem ? Note que neste caso o painel de detalhes ir\u00e1 fechar.",
+"message.iso.desc": "Imagem de disco contendo dados ou m\u00eddia de sistema operacional boot\u00e1vel",
+"message.join.project": "Voc\u00ea agora entrou em um projeto. Por favor troque para a vis\u00e3o de Projeto para visualizar o projeto.",
+"message.launch.vm.on.private.network": "Voc\u00ea deseja executar a sua inst\u00e2ncia na sua pr\u00f3pria rede privada dedicada?",
+"message.launch.zone": "A zona est\u00e1 pronta para ser executada; por favor, v\u00e1 para o pr\u00f3ximo passo.",
+"message.ldap.group.import": "Todos os usu\u00e1rios do grupo nome dado ser\u00e1 importado",
+"message.link.domain.to.ldap": "Ativar sincroniza\u00e7\u00e3o autom\u00e1tica para este dom\u00ednio em LDAP",
+"message.listview.subselect.multi": "(Ctrl/Cmd-click)",
+"message.lock.account": "Confirme se voc\u00ea deseja bloquear esta conta. Bloqueando a conta, todos os Usu\u00e1rios desta conta n\u00e3o estar\u00e3o mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poder\u00e3o ser acessados.",
+"message.migrate.instance.confirm": "Confirme o host que voc\u00ea deseja migrar a inst\u00e2ncia virtual.",
+"message.migrate.instance.to.host": "Por favor confirme que voc\u00ea deseja migrar a inst\u00e2ncia para outro host.",
+"message.migrate.instance.to.ps": "Por favor confirme que voc\u00ea deseja migrar a inst\u00e2ncia para outro storage prim\u00e1rio.",
+"message.migrate.router.confirm": "Por favor confirme o host que voc\u00ea deseja migrar o roteador para:",
+"message.migrate.systemvm.confirm": "Por favor confirme o host para o qual voc\u00ea deseja migrar a VM de sistema:",
+"message.migrate.volume": "Por favor confirme que voc\u00ea deseja migrar o volume para outro storage prim\u00e1rio.",
+"message.network.addvm.desc": "Por favor especifique a rede onde voc\u00ea gostaria de adicionar esta VM. Uma nova NIC ser\u00e1 adicionada a esta rede.",
+"message.network.addvmnic": "Por favor confirme que voc\u00ea gostaria de adicionar uma nova VM NIC para esta rede.",
+"message.network.remote.access.vpn.configuration": "A configura\u00e7\u00e3o 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.network.removenic": "Por favor, confirme que deseja remover esta Interface de Rede, esta a\u00e7\u00e3o tamb\u00e9m ir\u00e1 remover a rede associada \u00e0 VM.",
+"message.network.updateip": "Por favor, confirme que voc\u00ea gostaria de mudar o endere\u00e7o IP da NIC em VM.",
+"message.new.user": "Especifique abaixo para adicionar novos usu\u00e1rios para a conta",
+"message.no.affinity.groups": "Voc\u00ea n\u00e3o tem nenhum grupo de afinidade. Por favor, v\u00e1 para o pr\u00f3ximo passo.",
+"message.no.host.available": "Sem hosts dispon\u00edveis para Migra\u00e7\u00e3o",
+"message.no.network.support": "O hypervisor escolhido, vSphere, n\u00e3o possui nenhum recurso de rede adicional. Por favor, v\u00e1 para o passo 5.",
+"message.no.network.support.configuration.not.true": "Voc\u00ea n\u00e3o possui nenhuma zona com grupos de seguran\u00e7a habilitado. Assim sendo, n\u00e3o possui recursos adicionais de rede. Por favor continue para o passo 5.",
+"message.no.projects": "Voc\u00ea n\u00e3o possui nenhum projeto.<br/>Por favor crie um novo projeto \u00e0 partir da se\u00e7\u00e3o Projetos.",
+"message.no.projects.adminonly": "Voc\u00ea n\u00e3o possui nenhum projeto. <br/> Por favor solicite ao seu administrador a cria\u00e7\u00e3o 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\u00e1rio</h2>",
+"message.number.zones": "<h2>Zonas</h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"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\u00ea possui convites de projetos pendentes:",
+"message.pending.projects.2": "Para visualizar, por favor acesse a se\u00e7\u00e3o 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\u00e1fego.",
+"message.please.confirm.remove.ssh.key.pair": "Por favor, confirme que voc\u00ea deseja remover este par de chaves SSH",
+"message.please.proceed": "Por favor, v\u00e1 para o pr\u00f3ximo 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\u00fablica e de gerenciamento diferente antes de remover",
+"message.please.select.networks": "Por favor selecione as redes para sua m\u00e1quina virtual.",
+"message.please.select.ssh.key.pair.use.with.this.vm": "Por favor, selecione um par de chaves SSH que voc\u00ea deseja que esta VM utilize:",
+"message.please.wait.while.zone.is.being.created": "Por favor, espere enquanto sua zona est\u00e1 sendo criada; isto pode demorar um pouco...",
+"message.pod.dedication.released": "Pod Dedicado liberado",
+"message.portable.ip.delete.confirm": "Favor confirmar que voc\u00ea deseja apagar esta Faixa de IPs Port\u00e1veis",
+"message.project.invite.sent": "Convite enviado para o usu\u00e1rio; Eles ser\u00e3o adicionados ao projeto ap\u00f3s aceitarem o convite",
+"message.public.traffic.in.advanced.zone": "O tr\u00e1fego p\u00fablico \u00e9 gerado quando as VMs na nuvem acessam a internet. Os IPs acess\u00edveis ao p\u00fablico devem ser alocados para essa finalidade. Os usu\u00e1rios finais podem usar a interface do usu\u00e1rio CloudStack para adquirir esses IPs afim de implementar NAT entre a sua rede de guests e sua rede p\u00fablica. <br/><br/> Forne\u00e7a pelo menos um intervalo de endere\u00e7os IP para o tr\u00e1fego de internet.",
+"message.public.traffic.in.basic.zone": "O tr\u00e1fego p\u00fablico \u00e9 gerado quando as VMs na nuvem acessam a Internet ou prestam servi\u00e7os aos clientes atrav\u00e9s da Internet. Os IPs acess\u00edveis ao p\u00fablico devem ser alocados para essa finalidade. Quando uma inst\u00e2ncia \u00e9 criada, um IP a partir deste conjunto de IPs p\u00fablicos ser\u00e3o destinados \u00e0 inst\u00e2ncia, al\u00e9m do endere\u00e7o IP guest. Um NAT est\u00e1tico 1-1  ser\u00e1 criada automaticamente entre o IP p\u00fablico e IP guest. Os usu\u00e1rios finais tamb\u00e9m podem usar a interface de usu\u00e1rio CloudStack para adquirir IPs adicionais afim de se implementar NAT est\u00e1tico entre suas inst\u00e2ncias e o IP p\u00fablico.",
+"message.question.are.you.sure.you.want.to.add": "Voc\u00ea tem certeza que deseja adicionar",
+"message.read.admin.guide.scaling.up": "Por favor leia a sess\u00e3o sobre escalonamento din\u00e2mico no guia do administrador antes de escalonar.",
+"message.recover.vm": "Por favor, confirme a recupera\u00e7\u00e3o desta VM.",
+"message.redirecting.region": "Redirecionando para regi\u00e3o...",
+"message.reinstall.vm": "NOTA: Proceda com cuidado. Isso far\u00e1 com que a m\u00e1quina virtual seja re-instalada a partir  do Template. Todos os datos do disco ROOT ser\u00e3o perdidos. Volumes de Dados adicionais, se houver, n\u00e3o ser\u00e3o alterados.",
+"message.remove.ldap": "Voc\u00ea tem certeza que deseja deletar a configura\u00e7\u00e3o LDAP?",
+"message.remove.region": "Voc\u00ea tem certeza que deseja remover esta regi\u00e3o deste servidor de gerenciamento?",
+"message.remove.vpc": "Favor confirmar que voc\u00ea deseja remover a VPC",
+"message.remove.vpn.access": "Confirme se voc\u00ea deseja remover acesso VPN do seguinte Usu\u00e1rio.",
+"message.removed.ssh.key.pair": "Par de chaves SSH removido",
+"message.reset.password.warning.notpasswordenabled": "O template desta inst\u00e2ncia foi criado sem uma senha habilitada",
+"message.reset.password.warning.notstopped": "Sua inst\u00e2ncia deve estar parada antes de tentar trocar sua senha atual",
+"message.reset.vpn.connection": "Favor confirmar que voc\u00ea deseja resetar a conex\u00e3o VPN",
+"message.restart.mgmt.server": "Reinicie o(s) servidor(es) de gerenciamento para que a nova configura\u00c3\u00a7\u00c3\u00a3o tenha efeito.",
+"message.restart.mgmt.usage.server": "Por favor reinicie seu servidor(es) de gerenciamento e seu servidor(es) de utiliza\u00e7\u00e3o para as mudan\u00e7as entrarem em efeito.",
+"message.restart.network": "Por favor confirme que voc\ufffd deseja reiniciar a rede",
+"message.restart.vpc": "Favor confirmar que voc\u00ea deseja reiniciar a VPC",
+"message.restart.vpc.remark": "Por favor, confirme a reinicializa\u00e7\u00e3o do VPC <p><small><i>Observa\u00e7\u00e3o: fazendo um VPC redundante n\u00e3o redundante ir\u00e1 for\u00e7ar uma limpeza. As redes n\u00e3o estar\u00e3o dispon\u00edveis por alguns minutos</i>.</small></p>",
+"message.restorevm": "Quer restaurar a VM?",
+"message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"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 \u00fanico datacenter. M\u00faltiplas zonas auxiliam a cloud a ser mais confi\u00e1vel provendo isolamento f\u00edsico e redund\u00e2ncia.",
+"message.select.affinity.groups": "Por favor, selecione quaisquer grupos de afinidade que voc\u00ea deseja que esta VM perten\u00e7a:",
+"message.select.instance": "Por favor selecione uma inst\u00e2ncia.",
+"message.select.iso": "Por favor selecione um ISO para sua nova inst\u00e2ncia virtual",
+"message.select.item": "Por favor selecione um item.",
+"message.select.security.groups": "Por favor selecione o(s) grupo(s) de seguran\u00e7a para sua nova VM",
+"message.select.template": "Por favor selecione um template para sua nova inst\u00e2ncia virtual.",
+"message.select.tier": "Por favor, selecione um tier",
+"message.set.default.nic": "Por favor confirme que voc\u00ea quer tornar este NIC o padr\u00e3o para esta VM,",
+"message.set.default.nic.manual": "Por favor atualize manualmente o NIC padr\u00e3o desta VM agora.",
+"message.setup.physical.network.during.zone.creation": "Ao adicionar uma zona avan\u00e7ada, voc\u00ea precisa configurar uma ou mais redes f\u00edsicas. Cada rede corresponde  \u00e0 uma Interface de Rede no hypervisor. Cada rede f\u00edsica pode ser utilizada para transportar um ou mais tipos de tr\u00e1fego, com certas restri\u00e7\u00f5es sobre como eles podem ser combinados. <br/> <strong> Arraste e solte um ou mais tipos de tr\u00e1fego </ strong> em cada rede f\u00edsica.",
+"message.setup.physical.network.during.zone.creation.basic": "Quando adicionar uma zona b\u00e1sica, voc\u00ea pode configurar uma rede f\u00edsica, que corresponde a uma Interface de Rede no hypervisor. A rede carrega diversos tipos de tr\u00e1fego.<br/><br/>Voc\u00ea pode <strong>adicionar e remover</strong> outros tipos de tr\u00e1fego na mesma interface de rede f\u00edsica.",
+"message.setup.successful": "Cloud configurada com sucesso!",
+"message.specifiy.tag.key.value": "Por favor especifique chave e valor da tag",
+"message.specify.url": "Por favor especifique a URL",
+"message.step.1.desc": "Por favor, selecione um template para a sua nova inst\u00e2ncia virtual. Voc\u00ea pode tamb\u00e9m 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\u00e2ncia virtual estar\u00e1 conectada.",
+"message.storage.traffic": "Tr\u00e1fego entre os recursos internos do CloudStack, incluindo todos os componentes que se comunicam com o servidor de gerenciamento tais como hosts e m\u00e1quinas virtuais de sistema CloudStack. Por favor, configure o tr\u00e1fego do storage aqui.",
+"message.suspend.project": "Voc\u00ea tem certeza que deseja suspender este projeto ?",
+"message.systems.vms.ready": "VM de Sistema prontas.",
+"message.template.copying": "O template est\u00e1 sendo copiado.",
+"message.template.desc": "Imagem de SO que pode ser utilizada para bootar VMs",
+"message.template.iso": "Selecione o template ou ISO para continuar",
+"message.tier.required": "Tier \u00e9 obrigat\u00f3rio",
+"message.tooltip.dns.1": "Endere\u00e7o de um servidor DNS que ser\u00e1 utilizado por todas as VMs da Zone. A faixa de IPs p\u00fablicos para essa Zone deve possuir uma rota para o servidor configurado.",
+"message.tooltip.dns.2": "Um servidor DNS secund\u00e1rio para ser utilizado pelas VMs nesta zona. Os endere\u00e7os IP p\u00fablicos nesta zona devem ter rota para este servidor.",
+"message.tooltip.internal.dns.1": "Nome de um servidor DNS que ser\u00e1 utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endere\u00e7os privados dos pods devem ter uma rota para este servidor.",
+"message.tooltip.internal.dns.2": "Nome de um servidor DNS que ser\u00e1 utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endere\u00e7os privados dos pods devem ter uma rota para este servidor.",
+"message.tooltip.network.domain": "Um sufixo DNS que ir\u00e1 criar um nome de dom\u00ednio customizado para a rede que \u00e9 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\u00e7\u00e3o CIDR.",
+"message.tooltip.zone.name": "Um nome para a zona.",
+"message.update.os.preference": "Escolha o SO de preferencia para este host. Todas Inst\u00e2ncias com preferencias similares ser\u00e3o alocadas neste host antes de tentar em outro.",
+"message.update.resource.count": "Por favor confirme que voc\u00ea 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\u00e7\u00e3o do Certificado SSL falhou",
+"message.update.ssl.succeeded": "Atualiza\u00e7\u00e3o do Certificado SSL feita com sucesso",
+"message.validate.accept": "Por favor entre com uma extens\u00e3o v\u00e1lida.",
+"message.validate.creditcard": "Por favor entre um n\u00famero de cart\u00e3o de cr\u00e9dito v\u00e1lido.",
+"message.validate.date": "Por favor entre com uma data v\u00e1lida.",
+"message.validate.date.iso": "Por favor entre com uma data v\u00e1lida (ISO).",
+"message.validate.digits": "Por favor entre com d\u00edgitos apenas.",
+"message.validate.email.address": "Por favor entre um email v\u00e1lido.",
+"message.validate.equalto": "Por favor entre com o mesmo valor novamente.",
+"message.validate.fieldrequired": "Este campo \u00e9 obrigat\u00f3rio.",
+"message.validate.fixfield": "Por favor, arrume este campo.",
+"message.validate.instance.name": "Nomes de inst\u00e2ncias n\u00e3o podem ter mais de 63 caracteres. Somente letras ASCII a~z, A~Z, d\u00edgitos 0~9 e h\u00edfen s\u00e3o permitidos. Deve come\u00e7ar com uma letra e terminar com uma letra ou d\u00edgito.",
+"message.validate.invalid.characters": "Caracteres inv\u00e1lidos 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\u00famero v\u00e1lido.",
+"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.validate.url": "Por favor entre uma URL v\u00e1lida.",
+"message.virtual.network.desc": "Rede virtual dedicado para sua conta. O Dom\u00ednio de broadcast Est\u00e1 na VLAN e todo acesso a internet \u00e9 roteado atrav\u00e9s do virtual router.",
+"message.vm.create.template.confirm": "Criar Template reiniciar\u00e1 a VM automaticamente.",
+"message.vm.review.launch": "Por favor revise a informa\u00e7\u00e3o abaixo e confirme que sua inst\u00e2ncia virtual est\u00e1 correta antes de executa-la.",
+"message.vnmc.available.list": "VNMC n\u00e3o est\u00e1 dispon\u00edvel na lista de provedores.",
+"message.vnmc.not.available.list": "VNMC n\u00e3o est\u00e1 dispon\u00edvel na lista de provedores.",
+"message.volume.create.template.confirm": "Confirme se voc\u00ea deseja criar um template a partir deste disco. A cria\u00e7\u00e3o 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.xstools61plus.update.failed": "A atualiza\u00e7\u00e3o do campo Original XS Version is 6.1+ falhou. Erro:",
+"message.you.must.have.at.least.one.physical.network": "Voc\u00ea deve ter pelo menos uma rede f\u00edsica",
+"message.your.cloudstack.is.ready": "Seu CLoudStack est\u00e1 pronto!",
+"message.zone.creation.complete": "Cria\u00e7\u00e3o de zona completa",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "Cria\u00e7\u00e3o de zona completa. Voc\u00ea gostaria de habilitar esta zona?",
+"message.zone.no.network.selection": "A zona que voc\u00ea selecionou n\u00e3o 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\u00e7\u00e3o a seguir para adicionar uma nova zona",
+"message.zone.step.3.desc": "Entre a informa\u00e7\u00e3o a seguir para adicionar um novo pod",
+"message.zonewizard.enable.local.storage": "ALERTA: se voc\u00ea habilitar storage local para esta zona, voc\u00ea deve fazer o seguinte, dependendo se voc\u00ea quiser que suas m\u00e1quinas virtuais de sistema inicializem:<br/><br/>1. Se m\u00e1quinas virtuais de sistema precisam ser iniciadas em storage prim\u00e1ria, storage prim\u00e1ria precisa ser adicionada \u00e0 zona ap\u00f3s a cria\u00e7\u00e3o. Voc\u00ea tamb\u00e9m deve ativar a zona em um estado desabilitado.<br/><br/>2. Se m\u00e1quinas virtuais de sistema precisam ser iniciadas em storage local, system.vm.use.local.storage precisa ser estabelecida como verdadeira antes de voc\u00ea habilitar a zona.<br/><br/><br/>Voc\u00ea quer continuar?",
+"messgae.validate.min": "Por favor entre com um valor maior que ou igual a {0}.",
+"network.rate": "Taxa de Transfer\u00eancia",
+"side.by.side": "Lado a Lado",
+"state.accepted": "Aceito",
+"state.active": "Ativo",
+"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\u00eddo",
+"state.detached": "Desanexado",
+"state.disabled": "Desativado",
+"state.enabled": "Habilitado",
+"state.error": "Erro",
+"state.expunging": "Removendo",
+"state.migrating": "Migrando",
+"state.pending": "Pendente",
+"state.running": "Executando",
+"state.starting": "Iniciando",
+"state.stopped": "Parado",
+"state.stopping": "Parando",
+"state.suspended": "Suspendido",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/ru_RU.json b/ui/public/locales/ru_RU.json
new file mode 100644
index 0000000..5fd7d81
--- /dev/null
+++ b/ui/public/locales/ru_RU.json
@@ -0,0 +1,2363 @@
+{
+"changed.item.properties": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b",
+"confirm.enable.s3": "\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f  S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"confirm.enable.swift": "\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438 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": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"error.installwizard.message": "\u0427\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430\u0437\u0430\u0434 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.",
+"error.invalid.username.password": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0456\u0439 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c",
+"error.login": "\u0412\u0430\u0448\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c.",
+"error.menu.select": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432.",
+"error.mgmt.server.inaccessible": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0437\u0436\u0435.",
+"error.password.not.match": "\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442",
+"error.please.specify.physical.network.tags": "\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438.",
+"error.session.expired": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u0441\u0442\u0435\u043a\u043b\u043e.",
+"error.unable.to.reach.management.server": "\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f",
+"error.unresolved.internet.name": "\u0412\u0430\u0448\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0438\u043c\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c.",
+"force.delete.domain.warning": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u0412\u044b\u0431\u043e\u0440 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"force.remove": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435",
+"force.remove.host.warning": "\u0412\u044b\u0431\u043e\u0440 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430.",
+"force.stop": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
+"force.stop.instance.warning": "\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0430\u043c\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435/\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"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",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438",
+"inline": "\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439",
+"label.about": "\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u0435",
+"label.about.app": "\u041e CloudStack",
+"label.accept.project.invitation": "\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.accesskey": "\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430",
+"label.account": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.account.and.security.group": "\u0410\u043a\u043a\u0430\u0443\u043d\u0442, \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.account.details": "Account details",
+"label.account.id": "ID \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.account.name": "\u0418\u043c\u044f \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.account.specific": "\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0430\u043a\u043a\u0430\u0443\u043d\u043d\u0442\u0430",
+"label.accounts": "\u0423\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.accounttype": "Account Type",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL List Rules",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL replaced",
+"label.aclid": "ACL",
+"label.aclname": "ACL Name",
+"label.acltotal": "\u0412\u0441\u0435\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 ACL",
+"label.acquire.new.ip": "\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 IP",
+"label.acquire.new.secondary.ip": "\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.action": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f",
+"label.action.attach.disk": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0438\u0441\u043a",
+"label.action.attach.disk.processing": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430...",
+"label.action.attach.iso": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO",
+"label.action.attach.iso.processing": "\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 ISO...",
+"label.action.cancel.maintenance.mode": "\u0412\u044b\u0439\u0442\u0438 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.",
+"label.action.cancel.maintenance.mode.processing": "\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f...",
+"label.action.change.password": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c",
+"label.action.change.service": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443",
+"label.action.change.service.processing": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0431\u044b...",
+"label.action.configure.samlauthorization": "Configure SAML SSO Authorization",
+"label.action.configure.stickiness": "\u041b\u0438\u043f\u043a\u0438\u0439",
+"label.action.copy.iso": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c ISO",
+"label.action.copy.iso.processing": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ISO...",
+"label.action.copy.template": "\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.action.copy.template.processing": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430...",
+"label.action.create.template.from.vm": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0437 \u0412\u041c",
+"label.action.create.template.from.volume": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0437 \u0442\u043e\u043c\u0430",
+"label.action.create.template.processing": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430...",
+"label.action.create.vm": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.create.vm.processing": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.create.volume": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0441\u043a",
+"label.action.create.volume.processing": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430...",
+"label.action.delete.account": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.action.delete.account.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438...",
+"label.action.delete.cluster": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.action.delete.cluster.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430...",
+"label.action.delete.disk.offering": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.action.delete.disk.offering.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430...",
+"label.action.delete.domain": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d",
+"label.action.delete.domain.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u0435\u043d\u0430...",
+"label.action.delete.firewall": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430",
+"label.action.delete.firewall.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430...",
+"label.action.delete.ingress.rule": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.action.delete.ingress.rule.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430...",
+"label.action.delete.ip.range": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.action.delete.ip.range.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432...",
+"label.action.delete.iso": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c ISO",
+"label.action.delete.iso.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 ISO...",
+"label.action.delete.load.balancer": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.action.delete.load.balancer.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438....",
+"label.action.delete.network": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0442\u044c",
+"label.action.delete.network.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0438...",
+"label.action.delete.nexusvswitch": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c NexusVswitch",
+"label.action.delete.nic": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c NIC",
+"label.action.delete.physical.network": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438",
+"label.action.delete.pod": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434",
+"label.action.delete.pod.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430...",
+"label.action.delete.primary.storage": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.action.delete.primary.storage.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430...",
+"label.action.delete.secondary.storage": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.action.delete.secondary.storage.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430...",
+"label.action.delete.security.group": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c Security Group",
+"label.action.delete.security.group.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 Security Group....",
+"label.action.delete.service.offering": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441",
+"label.action.delete.service.offering.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430...",
+"label.action.delete.snapshot": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a",
+"label.action.delete.snapshot.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430...",
+"label.action.delete.system.service.offering": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441",
+"label.action.delete.template": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.action.delete.template.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430...",
+"label.action.delete.user": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.action.delete.user.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f...",
+"label.action.delete.volume": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u043c",
+"label.action.delete.volume.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043c\u0430...",
+"label.action.delete.zone": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.action.delete.zone.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b...",
+"label.action.destroy.instance": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.destroy.instance.processing": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.destroy.systemvm": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c",
+"label.action.destroy.systemvm.processing": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c....",
+"label.action.destroy.volume": "Destroy Volume",
+"label.action.detach.disk": "\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043a",
+"label.action.detach.disk.processing": "\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430....",
+"label.action.detach.iso": "\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c ISO",
+"label.action.detach.iso.processing": "\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 ISO....",
+"label.action.disable.account": "\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.action.disable.account.processing": "\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.action.disable.cluster": "\u041e\u0442\u043a\u043b\u044e\u0447\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.action.disable.cluster.processing": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430...",
+"label.action.disable.nexusvswitch": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Nexus 1000v",
+"label.action.disable.physical.network": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.action.disable.pod": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434.",
+"label.action.disable.pod.processing": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430...",
+"label.action.disable.static.nat": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Static NAT",
+"label.action.disable.static.nat.processing": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u0432....",
+"label.action.disable.user": "\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.action.disable.user.processing": "\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f....",
+"label.action.disable.zone": "\u041e\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.action.disable.zone.processing": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b...",
+"label.action.download.iso": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c ISO",
+"label.action.download.template": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.action.download.volume": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0441\u043a",
+"label.action.download.volume.processing": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0438\u0441\u043a\u0430....",
+"label.action.edit.account": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.action.edit.disk.offering": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.action.edit.domain": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d",
+"label.action.edit.global.setting": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+"label.action.edit.host": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b",
+"label.action.edit.instance": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.edit.iso": "\u0418\u0437\u043c\u0435\u043d\u0438\u0438\u0442\u044c ISO",
+"label.action.edit.network": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0442\u044c",
+"label.action.edit.network.offering": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430",
+"label.action.edit.network.processing": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0442\u0438....",
+"label.action.edit.pod": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043d\u0434",
+"label.action.edit.primary.storage": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.action.edit.resource.limits": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f",
+"label.action.edit.service.offering": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f",
+"label.action.edit.template": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.action.edit.user": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.action.edit.zone": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.action.enable.account": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.action.enable.account.processing": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438....",
+"label.action.enable.cluster": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.action.enable.cluster.processing": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430...",
+"label.action.enable.maintenance.mode": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f",
+"label.action.enable.maintenance.mode.processing": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.....",
+"label.action.enable.nexusvswitch": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c Nexus 1000v",
+"label.action.enable.physical.network": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.action.enable.pod": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434",
+"label.action.enable.pod.processing": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430..",
+"label.action.enable.static.nat": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c Static NAT",
+"label.action.enable.static.nat.processing": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u0432....",
+"label.action.enable.user": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.action.enable.user.processing": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f....",
+"label.action.enable.zone": "\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.action.enable.zone.processing": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0437\u043e\u043d\u044b...",
+"label.action.expunge.instance": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0412\u041c",
+"label.action.expunge.instance.processing": "Expunging Instance....",
+"label.action.force.reconnect": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c",
+"label.action.force.reconnect.processing": "\u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435...",
+"label.action.generate.keys": "\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438",
+"label.action.generate.keys.processing": "\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439...",
+"label.action.list.nexusvswitch": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 Nexus 1000v",
+"label.action.lock.account": "\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.action.lock.account.processing": "\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438....",
+"label.action.manage.cluster": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c",
+"label.action.manage.cluster.processing": "\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f...",
+"label.action.migrate.instance": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.migrate.instance.processing": "\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u044b....",
+"label.action.migrate.router": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.action.migrate.router.processing": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0440\u043e\u0443\u0442\u0435\u0440\u0430...",
+"label.action.migrate.systemvm": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c",
+"label.action.migrate.systemvm.processing": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c...",
+"label.action.project.add.account": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.action.reboot.instance": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.reboot.instance.processing": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.reboot.router": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.action.reboot.router.processing": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430...",
+"label.action.reboot.systemvm": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c",
+"label.action.reboot.systemvm.processing": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c",
+"label.action.recover.volume": "Recover Volume",
+"label.action.recurring.snapshot": "\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 \u0441\u043d\u0438\u043c\u043a\u0438",
+"label.action.register.iso": "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f ISO",
+"label.action.register.template": "\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e URL",
+"label.action.release.ip": "\u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c IP",
+"label.action.release.ip.processing": "\u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 IP...",
+"label.action.remove.host": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b",
+"label.action.remove.host.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430...",
+"label.action.reset.password": "\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c",
+"label.action.reset.password.processing": "\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f...",
+"label.action.resize.volume": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430",
+"label.action.resize.volume.processing": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0438\u0441\u043a\u0430....",
+"label.action.resource.limits": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u043e\u0432",
+"label.action.restore.instance": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.restore.instance.processing": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.revert.snapshot": "\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0441\u043d\u0438\u043c\u043a\u0443",
+"label.action.revert.snapshot.processing": "\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u043d\u0438\u043c\u043a\u0443...",
+"label.action.start.instance": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.start.instance.processing": "\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.start.router": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.action.start.router.processing": "\u0417\u0430\u043f\u0443\u0441\u043a \u0440\u043e\u0443\u0442\u0435\u0440\u0430....",
+"label.action.start.systemvm": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c",
+"label.action.start.systemvm.processing": "\u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c...",
+"label.action.stop.instance": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"label.action.stop.instance.processing": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b...",
+"label.action.stop.router": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.action.stop.router.processing": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430...",
+"label.action.stop.systemvm": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c",
+"label.action.stop.systemvm.processing": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c...",
+"label.action.take.snapshot": "\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a...",
+"label.action.take.snapshot.processing": "\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430...",
+"label.action.unmanage.cluster": "\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c",
+"label.action.unmanage.cluster.processing": "\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c...",
+"label.action.update.os.preference": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041e\u0421",
+"label.action.update.os.preference.processing": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u041e\u0421...",
+"label.action.update.resource.count": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0447\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.action.update.resource.count.processing": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.action.vmsnapshot.create": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c",
+"label.action.vmsnapshot.delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c",
+"label.action.vmsnapshot.revert": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c",
+"label.actions": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f",
+"label.activate.project": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.activeviewersessions": "\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438",
+"label.add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c",
+"label.add.account": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.add.accounts": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.add.accounts.to": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.add.acl": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c ACL",
+"label.add.acl.list": "Add ACL List",
+"label.add.affinity.group": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e affinity group",
+"label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device",
+"label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration",
+"label.add.bigswitchbcf.device": "Add BigSwitch BCF Controller",
+"label.add.brocadevcs.device": "Add Brocade Vcs Switch",
+"label.add.by": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c",
+"label.add.by.cidr": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a CIDR",
+"label.add.by.group": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0433\u0440\u0443\u043f\u043f\u0435",
+"label.add.ciscoasa1000v": "Add CiscoASA1000v Resource",
+"label.add.cluster": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.add.compute.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f",
+"label.add.direct.iprange": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0445 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.add.disk.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.add.domain": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d",
+"label.add.egress.rule": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.add.f5.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c F5 \u0443\u0441\u0442\u0440\u043e\u0439\u0432\u043e",
+"label.add.firewall": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430.",
+"label.add.globo.dns": "Add GloboDNS",
+"label.add.gslb": "Add GSLB",
+"label.add.guest.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.add.host": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b",
+"label.add.ingress.rule": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.add.intermediate.certificate": "Add intermediate certificate",
+"label.add.internal.lb": "Add Internal LB",
+"label.add.ip.range": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.add.isolated.guest.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.add.isolated.guest.network.with.sourcenat": "Add Isolated Guest Network with SourceNat",
+"label.add.isolated.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.add.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c LDAP \u0430\u043a\u043a\u0430\u0443\u043d\u0442",
+"label.add.list.name": "ACL List Name",
+"label.add.load.balancer": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.add.more": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435",
+"label.add.netscaler.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Netscaler \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.add.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u044c",
+"label.add.network.acl": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e ACL",
+"label.add.network.acl.list": "Add Network ACL List",
+"label.add.network.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.add.network.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.add.new.f5": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 F5",
+"label.add.new.gateway": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0448\u043b\u044e\u0437",
+"label.add.new.netscaler": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 NetScaler",
+"label.add.new.pa": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Palo Alto",
+"label.add.new.srx": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 SRX",
+"label.add.new.tier": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Tier",
+"label.add.nfs.secondary.staging.store": "Add NFS Secondary Staging Store",
+"label.add.niciranvp.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 Nvp",
+"label.add.opendaylight.device": "Add OpenDaylight Controller",
+"label.add.pa.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Palo Alto",
+"label.add.physical.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c",
+"label.add.pod": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434",
+"label.add.port.forwarding.rule": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430",
+"label.add.portable.ip.range": "Add Portable IP Range",
+"label.add.primary.storage": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445",
+"label.add.private.gateway": "Add Private Gateway",
+"label.add.region": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d",
+"label.add.resources": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.add.role": "Add Role",
+"label.add.route": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442",
+"label.add.rule": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.add.rule.desc": "Create a new ACL rule",
+"label.add.secondary.storage": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.add.security.group": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.add.service.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443",
+"label.add.srx.device": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c SRX \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.add.static.nat.rule": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e NAT",
+"label.add.static.route": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442",
+"label.add.system.service.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431",
+"label.add.template": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.add.to.group": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443",
+"label.add.ucs.manager": "Add UCS Manager",
+"label.add.user": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.add.vlan": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VLAN",
+"label.add.vm": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c",
+"label.add.vm.to.tier": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c \u043a tier",
+"label.add.vms": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c-\u044b",
+"label.add.vms.to.lb": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.add.vmware.datacenter": "Add VMware datacenter",
+"label.add.vnmc.device": "Add VNMC device",
+"label.add.vnmc.provider": "Add VNMC provider",
+"label.add.volume": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0441\u043a",
+"label.add.vpc": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPC",
+"label.add.vpc.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC",
+"label.add.vpn.customer.gateway": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430",
+"label.add.vpn.gateway": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437",
+"label.add.vpn.user": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f VPN",
+"label.add.vxlan": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VXLAN",
+"label.add.zone": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.added.brocade.vcs.switch": "Added new Brocade Vcs Switch",
+"label.added.network.offering": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"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": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b",
+"label.adding.cluster": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430",
+"label.adding.failed": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c",
+"label.adding.pod": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430",
+"label.adding.processing": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435...",
+"label.adding.succeeded": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e",
+"label.adding.user": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.adding.zone": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b",
+"label.additional.networks": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438",
+"label.address": "Address",
+"label.admin": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440",
+"label.admin.accounts": "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.advanced": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439",
+"label.advanced.mode": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c",
+"label.advanced.search": "\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a",
+"label.affinity": " \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c",
+"label.affinity.groups": "Affinity Groups",
+"label.affinitygroup": "Affinity Group",
+"label.agent.password": "\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0433\u0435\u043d\u0442\u0430",
+"label.agent.username": "\u0418\u043c\u044f \u0430\u0433\u0435\u043d\u0442\u0430",
+"label.agentport": "Agent Port",
+"label.agentstate": "Agent State",
+"label.agree": "\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d",
+"label.alert": "\u0422\u0440\u0435\u0432\u043e\u0433\u0430",
+"label.alert.archived": "Alert Archived",
+"label.alert.deleted": "Alert Deleted",
+"label.alert.details": "Alert details",
+"label.alerts": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f",
+"label.algorithm": "\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c",
+"label.all": "\u0412\u0441\u0435",
+"label.allocated": "\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e",
+"label.allocationstate": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f",
+"label.allow": "Allow",
+"label.anti.affinity": "Anti-affinity",
+"label.anti.affinity.group": "Anti-affinity Group",
+"label.anti.affinity.groups": "Anti-affinity Groups",
+"label.api.version": "\u0412\u0435\u0440\u0441\u0438\u044f API",
+"label.apikey": "\u041a\u043b\u044e\u0447 API",
+"label.app.name": "CloudStack",
+"label.apply": "\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c",
+"label.archive": "Archive",
+"label.archive.alerts": "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0432\u043e\u0433\u0438",
+"label.archive.events": "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f",
+"label.assign": "\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e",
+"label.assign.instance.another": "Assign Instance to Another Account",
+"label.assign.to.load.balancer": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.assign.vms": "Assign VMs",
+"label.associatednetwork": "\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.associatednetworkid": "ID \u0421\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438",
+"label.associatednetworkname": "\u0418\u043c\u044f \u0441\u0435\u0442\u0438",
+"label.author.email": "E-mail \u0430\u0432\u0442\u043e\u0440\u0430",
+"label.author.name": "\u0418\u043c\u044f \u0430\u0432\u0442\u043e\u0440\u0430",
+"label.autoscale": "AutoScale",
+"label.autoscale.configuration.wizard": "AutoScale Configuration Wizard",
+"label.availability": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c",
+"label.availabilityzone": "availabilityZone",
+"label.available": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e",
+"label.available.public.ips": "\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 IP \u0430\u0434\u0440\u0435\u0441\u0430",
+"label.back": "\u041d\u0430\u0437\u0430\u0434",
+"label.balance": "Balance",
+"label.bandwidth": "\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c",
+"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.baremetalcpu": "CPU (\u0432 \u041c\u0433\u0446)",
+"label.baremetalcpucores": "\u041a\u043e\u043b-\u0432\u043e \u044f\u0434\u0435\u0440 CPU",
+"label.baremetalmac": "MAC \u0443\u0437\u043b\u0430",
+"label.baremetalmemory": "\u041f\u0430\u043c\u044f\u0442\u044c (\u0432 \u041c\u0411)",
+"label.basic": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439",
+"label.basic.mode": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": "BigSwitch BCF details",
+"label.bigswitch.controller.address": "BigSwitch BCF Controller Address",
+"label.bladeid": "Blade ID",
+"label.blades": "Blades",
+"label.bootable": "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439",
+"label.broadcastdomainrange": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430",
+"label.broadcastdomaintype": "\u0422\u0438\u043f \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430",
+"label.broadcasturi": "broadcasturi",
+"label.brocade.vcs.address": "Vcs Switch Address",
+"label.brocade.vcs.details": "Brocade Vcs Switch details",
+"label.bucket": "Bucket",
+"label.by.account": "\u041f\u043e \u0443\u0447\u0435\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c",
+"label.by.alert.type": "\u041f\u043e \u0442\u0438\u043f\u0443 \u0442\u0440\u0435\u0432\u043e\u0433\u0438",
+"label.by.availability": "\u041f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438",
+"label.by.domain": "\u0414\u043e \u0434\u043e\u043c\u0435\u043d\u0443",
+"label.by.end.date": "\u041f\u043e \u0434\u0430\u0442\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f",
+"label.by.event.type": "\u041f\u043e \u0442\u0438\u043f\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f",
+"label.by.level": "\u041f\u043e \u0443\u0440\u043e\u0432\u043d\u044e",
+"label.by.pod": "\u041f\u043e \u0441\u0442\u0435\u043d\u0434\u0443",
+"label.by.role": "\u041f\u043e \u0440\u043e\u043b\u044f\u043c",
+"label.by.start.date": "\u041f\u043e \u0434\u0430\u0442\u0435 \u043d\u0430\u0447\u0430\u043b\u0430",
+"label.by.state": "\u041f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e",
+"label.by.traffic.type": "\u041f\u043e \u0442\u0438\u043f\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"label.by.type": "\u041f\u043e \u0442\u0438\u043f\u0443",
+"label.by.type.id": "\u041f\u043e \u0442\u0438\u043f\u0443 ID",
+"label.by.zone": "\u041f\u043e \u0437\u043e\u043d\u0435",
+"label.cachemode": "Write-cache Type",
+"label.cancel": "\u041e\u0442\u043c\u0435\u043d\u0430",
+"label.capacity": "\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c",
+"label.capacity.iops": "\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e IOPS",
+"label.capacitybytes": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0411\u0430\u0439\u0442",
+"label.capacityiops": "\u0412\u0441\u0435\u0433\u043e IOPS",
+"label.certificate": "\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442",
+"label.change.affinity": "Change Affinity",
+"label.change.ipaddress": "Change IP address for NIC",
+"label.change.service.offering": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f",
+"label.change.value": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435",
+"label.character": "\u0421\u0438\u043c\u0432\u043e\u043b\u043e\u0432",
+"label.chassis": "Chassis",
+"label.checksum": "checksum",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR \u0438\u043b\u0438 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c/\u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.cidr.of.destination.network": "CIDR \u0441\u0435\u0442\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f",
+"label.cidrlist": "CIDR \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430",
+"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.cleanup": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c",
+"label.clear.list": "\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a",
+"label.close": "\u0417\u0430\u043a\u0440\u044b\u0442\u044c",
+"label.cloud.console": "\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u043c",
+"label.cloud.managed": "\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f",
+"label.cluster": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.cluster.name": "\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430",
+"label.clusterid": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.clustername": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.clusternamelabel": "\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430",
+"label.clusters": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b",
+"label.clustertype": "\u0422\u0438\u043f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430",
+"label.clvm": "CLVM",
+"label.code": "\u041a\u043e\u0434",
+"label.community": "\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e",
+"label.compute": "\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435",
+"label.compute.and.storage": "\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.compute.offerings": "\u0423\u0441\u043b\u0443\u0433\u0438 \u0432\u044b\u0447\u0435\u0441\u043b\u0435\u043d\u0438\u044f",
+"label.configuration": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f",
+"label.configure": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c",
+"label.configure.ldap": "Configure LDAP",
+"label.configure.network.acls": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 ACL \u0441\u0435\u0442\u0438",
+"label.configure.sticky.policy": "Configure Sticky Policy",
+"label.configure.vpc": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c VPC",
+"label.confirmation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435",
+"label.confirmdeclineinvitation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442.",
+"label.confirmpassword": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c",
+"label.congratulations": "\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u0435\u043c!",
+"label.connectiontimeout": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f",
+"label.conservemode": "\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c",
+"label.console.proxy": "\u041f\u0440\u043e\u043a\u0441\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438",
+"label.console.proxy.vm": "Console Proxy VM",
+"label.continue": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c",
+"label.continue.basic.install": "\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443",
+"label.copying.iso": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ISO",
+"label.corrections.saved": "\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b",
+"label.counterid": "Counter",
+"label.cpu": "CPU",
+"label.cpu.allocated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 CPU",
+"label.cpu.sockets": "CPU Sockets",
+"label.cpuallocated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c CPU",
+"label.cpuallocatedghz": "\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e",
+"label.cpulimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f CPU",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "The Number of CPU Sockets",
+"label.cpuspeed": "CPU (\u0432 \u041c\u0433\u0446)",
+"label.cputotal": "\u0412\u0441\u0435\u0433\u043e CPU",
+"label.cputotalghz": "Total",
+"label.cpuused": "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e CPU",
+"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": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.create.ssh.key.pair": "Create a SSH Key Pair",
+"label.create.template": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.create.vpn.connection": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435",
+"label.created": "\u0421\u043e\u0437\u0434\u0430\u043d\u043e",
+"label.created.by.system": "\u0421\u043e\u0437\u0434\u0430\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439",
+"label.createnfscache": "Create NFS Secondary Staging Store",
+"label.credit": "Credit",
+"label.crosszones": "\u041e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0437\u043e\u043d",
+"label.current": "\u0422\u0435\u043a\u0443\u0449\u0435\u0439",
+"label.currentpassword": "Current Password",
+"label.custom": "Custom",
+"label.custom.disk.offering": "Custom Disk Offering",
+"label.customdisksize": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430",
+"label.daily": "\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e",
+"label.dashboard": "\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f",
+"label.data.disk.offering": "\u0423\u0441\u043b\u0443\u0433\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.date": "\u0414\u0430\u0442\u0430",
+"label.day": "Day",
+"label.day.of.month": "\u0414\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430",
+"label.day.of.week": "\u0414\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438",
+"label.dc.name": "DC Name",
+"label.decline.invitation": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435",
+"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": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439",
+"label.dedicated.vlan.vni.ranges": "Dedicated VLAN/VNI Ranges",
+"label.default": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"label.default.use": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"label.default.view": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0438\u0434",
+"label.delete": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c",
+"label.delete.acl.list": "Delete ACL List",
+"label.delete.affinity.group": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c affinity group",
+"label.delete.alerts": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0440\u0435\u0432\u043e\u0433\u0438",
+"label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
+"label.delete.bigswitchbcf": "Remove BigSwitch BCF Controller",
+"label.delete.brocadevcs": "Remove Brocade Vcs Switch",
+"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
+"label.delete.events": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f",
+"label.delete.f5": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c F5",
+"label.delete.gateway": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u043b\u044e\u0437",
+"label.delete.internal.lb": "Delete Internal LB",
+"label.delete.netscaler": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c NetScaler",
+"label.delete.niciranvp": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c Nvp \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440",
+"label.delete.opendaylight.device": "Delete OpenDaylight Controller",
+"label.delete.pa": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c Palo Alto",
+"label.delete.portable.ip.range": "Delete Portable IP Range",
+"label.delete.project": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "Delete Secondary Staging Store",
+"label.delete.srx": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c SRX",
+"label.delete.ucs.manager": "Delete UCS Manager",
+"label.delete.vpn.connection": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435",
+"label.delete.vpn.customer.gateway": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430",
+"label.delete.vpn.gateway": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437",
+"label.delete.vpn.user": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f VPN",
+"label.deleteprofile": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c",
+"label.deleting.failed": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c",
+"label.deleting.processing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435...",
+"label.deny": "Deny",
+"label.deploymentplanner": "Deployment planner",
+"label.description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",
+"label.destinationphysicalnetworkid": "ID \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438",
+"label.destinationzoneid": "\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0437\u043e\u043d\u0430",
+"label.destroy": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c",
+"label.destroy.router": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.destroyvmgraceperiod": "Destroy VM Grace Period",
+"label.detaching.disk": "\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430",
+"label.details": "\u0414\u0435\u0442\u0430\u043b\u0438",
+"label.deviceid": "ID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
+"label.devices": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DHCP",
+"label.direct.attached.public.ip": "\u0412\u044b\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP",
+"label.direct.ips": "\u041f\u0440\u044f\u043c\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",
+"label.disable.host": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u043e\u0441\u0442",
+"label.disable.network.offering": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.disable.provider": "\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"label.disable.vnmc.provider": "Disable VNMC provider",
+"label.disable.vpc.offering": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC",
+"label.disable.vpn": "\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN",
+"label.disabled": "\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e",
+"label.disabling.vpn.access": "\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a VPN",
+"label.disassociate.profile.blade": "Disassociate Profile from Blade",
+"label.disbale.vnmc.device": "Disable VNMC device",
+"label.disconnected": "\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "Disk offering details",
+"label.disk.offerings": "\u0423\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.disk.size": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430",
+"label.disk.volume": "\u041e\u0431\u044a\u0435\u043c \u0434\u0438\u0441\u043a\u0430",
+"label.diskbytesreadrate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430 (BPS)",
+"label.diskbyteswriterate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (BPS)",
+"label.diskiopsmax": "\u041c\u0430\u043a\u0441. IOPS",
+"label.diskiopsmin": "\u041c\u0438\u043d. IOPS",
+"label.diskiopsreadrate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (IOPS)",
+"label.diskiopswriterate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (IOPS)",
+"label.diskioread": "\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441 \u0434\u0438\u0441\u043a\u0430 (IO)",
+"label.diskiowrite": "\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0434\u0438\u0441\u043a (IO)",
+"label.diskkbsread": "\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441 \u0434\u0438\u0441\u043a\u0430 (\u0411\u0430\u0439\u0442)",
+"label.diskkbswrite": "\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0434\u0438\u0441\u043a (\u0411\u0430\u0439\u0442)",
+"label.diskoffering": "diskoffering",
+"label.diskofferingdisplaytext": "\u0423\u0441\u043b\u0443\u0433\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.diskofferingid": "\u0423\u0441\u043b\u0443\u0433\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.disksize": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 (\u0432 \u0413\u0411)",
+"label.disksizeallocated": "\u0417\u0430\u043d\u044f\u0442\u043e \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"label.disksizeallocatedgb": "\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e",
+"label.disksizetotal": "\u0412\u0441\u0435\u0433\u043e \u0432 \u0434\u0438\u0441\u043a\u0430\u0445",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e",
+"label.display.text": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442",
+"label.displayname": "Display Name",
+"label.displaytext": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435",
+"label.distributedvpcrouter": "Distributed VPC Router",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "DNS \u0434\u043e\u043c\u0435\u043d \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "\u0414\u043e\u043c\u0435\u043d",
+"label.domain.details": "Domain details",
+"label.domain.name": "\u0418\u043c\u044f \u0434\u043e\u043c\u0435\u043d\u0430",
+"label.domain.router": "\u041c\u0430\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440",
+"label.domain.suffix": "\u0421\u0443\u0444\u0444\u0438\u043a\u0441 \u0434\u043e\u043c\u0435\u043d\u0430 DNS (\u043d\u043f\u0440. xyz.com)",
+"label.domainid": "ID \u0434\u043e\u043c\u0435\u043d\u0430",
+"label.domainname": "\u0414\u043e\u043c\u0435\u043d",
+"label.domainpath": "\u0414\u043e\u043c\u0435\u043d",
+"label.done": "\u0413\u043e\u0442\u043e\u0432\u043e",
+"label.double.quotes.are.not.allowed": "\u0414\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f",
+"label.download.progress": "\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.dpd": "Dead Peer Detection",
+"label.drag.new.position": "\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e",
+"label.driver": "Driver",
+"label.duration.in.sec": "Duration (in sec)",
+"label.edit": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "Edit ACL rule",
+"label.edit.affinity.group": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c affinity group",
+"label.edit.lb.rule": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c LB \u043f\u0440\u0430\u0432\u0438\u043b\u0430",
+"label.edit.network.details": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+"label.edit.project.details": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.edit.region": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d",
+"label.edit.role": "Edit Role",
+"label.edit.rule": "Edit rule",
+"label.edit.secondary.ips": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.edit.tags": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438",
+"label.edit.traffic.type": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"label.edit.vpc": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPC",
+"label.egress.default.policy": "\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"label.egress.rule": "\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.egress.rules": "\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430",
+"label.egressdefaultpolicy": "\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"label.elastic": "\u0413\u0438\u0431\u043a\u0438\u0439",
+"label.email": "E-mail",
+"label.enable.autoscale": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",
+"label.enable.host": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u043e\u0441\u0442",
+"label.enable.network.offering": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443",
+"label.enable.provider": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"label.enable.s3": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.enable.swift": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c Swift",
+"label.enable.vnmc.device": "Enable VNMC device",
+"label.enable.vnmc.provider": "Enable VNMC provider",
+"label.enable.vpc.offering": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC",
+"label.enable.vpn": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN",
+"label.enabling.vpn": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f VPN",
+"label.enabling.vpn.access": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e VPN",
+"label.end.ip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 IP",
+"label.end.reserved.system.ip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.end.vlan": "End VLAN",
+"label.end.vxlan": "End VXLAN",
+"label.enddate": "\u041f\u043e \u0434\u0430\u0442\u0435(\u043a\u043e\u043d\u0435\u0446)",
+"label.endip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 IP",
+"label.endipv4": "IPv4 End IP",
+"label.endipv6": "IPv6 End IP",
+"label.endpoint": "\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430",
+"label.endpoint.or.operation": "\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f",
+"label.endport": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430",
+"label.enter.token": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d",
+"label.error": "\u041e\u0448\u0438\u0431\u043a\u0430",
+"label.error.code": "\u041a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438",
+"label.error.something.went.wrong.please.correct.the.following": "\u0427\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430\u0437\u0430\u0434 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.",
+"label.error.upper": "ERROR",
+"label.espencryption": "\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ESP",
+"label.esphash": "\u0445\u044d\u0448 ESP",
+"label.esplifetime": "\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 ESP (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)",
+"label.esppolicy": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 ESP",
+"label.event": "Event",
+"label.event.archived": "Event Archived",
+"label.event.deleted": "Event Deleted",
+"label.events": "\u0421\u043e\u0431\u044b\u0442\u0438\u044f",
+"label.every": "Every",
+"label.example": "\u041f\u0440\u0438\u043c\u0435\u0440",
+"label.expunge": "\u0423\u0434\u0430\u043b\u0451\u043d",
+"label.external.link": "\u0412\u043d\u0435\u0448\u043d\u0435\u0435 \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435",
+"label.f5": "F5",
+"label.f5.details": "F5 details",
+"label.failed": "\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u043e",
+"label.featured": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439",
+"label.fetch.latest": "\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445",
+"label.filterby": "\u0424\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c",
+"label.fingerprint": "FingerPrint",
+"label.firewall": "\u0424\u0430\u0435\u0440\u0432\u043e\u043b",
+"label.firstname": "\u0418\u043c\u044f",
+"label.firstname.lower": "\u0418\u043c\u044f",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "\u0424\u043e\u0440\u043c\u0430\u0442",
+"label.friday": "\u041f\u044f\u0442\u043d\u0438\u0446\u0430",
+"label.full": "\u041f\u043e\u043b\u043d\u044b\u0439",
+"label.full.path": "\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "\u0422\u0438\u043f",
+"label.fwdevicestate": "\u0421\u0442\u0430\u0442\u0443\u0441",
+"label.gateway": "\u0428\u043b\u044e\u0437",
+"label.general.alerts": "\u041e\u0431\u0449\u0438\u0435 \u0442\u0440\u0435\u0432\u043e\u0433\u0438",
+"label.generating.url": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 URL",
+"label.global.settings": "\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+"label.globo.dns": "GloboDNS",
+"label.globo.dns.configuration": "GloboDNS Configuration",
+"label.glustervolume": "\u0422\u043e\u043c",
+"label.go.step.2": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 2",
+"label.go.step.3": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 3",
+"label.go.step.4": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 4",
+"label.go.step.5": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 5",
+"label.gpu": "GPU",
+"label.group": "\u0413\u0440\u0443\u043f\u043f\u0430",
+"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": "\u0413\u0440\u0443\u043f\u043f\u0430 (\u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e)",
+"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.lb.details": "\u0414\u0435\u0442\u0430\u043b\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.gslb.lb.remove": "Remove load balancing from this GSLB",
+"label.gslb.service": "GSLB service",
+"label.gslb.service.private.ip": "GSLB service Private IP",
+"label.gslb.service.public.ip": "GSLB service Public IP",
+"label.gslbdomainname": "GSLB Domain Name",
+"label.gslbprovider": "GSLB service",
+"label.gslbproviderprivateip": "GSLB service Private IP",
+"label.gslbproviderpublicip": "GSLB service Public IP",
+"label.gslbservicetype": "Service Type",
+"label.guest": "\u0413\u043e\u0441\u0442\u044c",
+"label.guest.cidr": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 CIDR",
+"label.guest.end.ip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP.",
+"label.guest.gateway": "\u0428\u043b\u044e\u0437",
+"label.guest.ip": "\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.guest.ip.range": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.guest.netmask": "\u0413\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430",
+"label.guest.network.details": "Guest network details",
+"label.guest.networks": "\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0442\u0438",
+"label.guest.start.ip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP",
+"label.guest.traffic": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a",
+"label.guestcidraddress": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 CIDR",
+"label.guestendip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP.",
+"label.guestgateway": "\u0428\u043b\u044e\u0437",
+"label.guestipaddress": "\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.guestiptype": "\u0422\u0438\u043f \u0433\u043e\u0441\u0442\u044f",
+"label.guestnetmask": "\u0413\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430",
+"label.guestnetworkid": "ID \u0441\u0435\u0442\u0438",
+"label.guestnetworkname": "\u0418\u043c\u044f \u0441\u0435\u0442\u0438",
+"label.guestosid": "\u0422\u0438\u043f \u041e\u0421",
+"label.gueststartip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP",
+"label.guestvlanrange": "VLAN Range(s)",
+"label.haenable": "\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430",
+"label.hahost": "\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430",
+"label.header.volume.snapshot": "You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference",
+"label.header.volume.take.snapshot": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430.",
+"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": "\u041f\u043e\u043c\u043e\u0449\u044c",
+"label.hide.ingress.rule": "\u0421\u043a\u0440\u044b\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.hints": "\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438",
+"label.home": "\u0413\u043b\u0430\u0432\u043d\u0430\u044f",
+"label.host": "\u0423\u0437\u0435\u043b",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "\u0418\u043c\u044f \u0443\u0437\u043b\u0430",
+"label.host.tag": "Host Tag",
+"label.hostid": "\u0423\u0437\u0435\u043b",
+"label.hostname": "\u0423\u0437\u0435\u043b",
+"label.hostnamelabel": "\u0418\u043c\u044f \u0443\u0437\u043b\u0430",
+"label.hosts": "\u0423\u0437\u043b\u044b",
+"label.hosttags": "\u041c\u0435\u0442\u043a\u0438 \u0443\u0437\u043b\u0430",
+"label.hourly": "\u0415\u0436\u0435\u0447\u0430\u0441\u043d\u043e",
+"label.hypervisor": "\u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440",
+"label.hypervisor.capabilities": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430",
+"label.hypervisor.type": "\u0422\u0438\u043f \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430",
+"label.hypervisors": "\u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u044b",
+"label.hypervisorsnapshotreserve": "Hypervisor Snapshot Reserve",
+"label.hypervisortype": "\u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440",
+"label.hypervisorversion": "\u0412\u0435\u0440\u0441\u0438\u044f \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430",
+"label.hypervnetworklabel": "HyperV Traffic Label",
+"label.icmpcode": "\u041a\u043e\u0434 ICMP",
+"label.icmptype": "\u0422\u0438\u043f ICMP",
+"label.id": "ID",
+"label.ikedh": "IKE DH",
+"label.ikeencryption": "\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 IKE",
+"label.ikehash": "IKE Hash",
+"label.ikelifetime": "IKE lifetime (second)",
+"label.ikepolicy": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 IKE",
+"label.info": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f",
+"label.info.upper": "INFO",
+"label.infrastructure": "\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430",
+"label.ingress.rule": "\u0412\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.initiated.by": "\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043e",
+"label.insideportprofile": "Inside Port Profile",
+"label.installwizard.addclusterintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u041a\u043b\u0430\u0441\u0442\u0435\u0440\"?",
+"label.installwizard.addclusterintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440",
+"label.installwizard.addhostintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u0423\u0437\u0435\u043b\"?",
+"label.installwizard.addhostintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0437\u0435\u043b",
+"label.installwizard.addpodintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u0421\u0442\u0435\u043d\u0434\"?",
+"label.installwizard.addpodintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0435\u043d\u0434",
+"label.installwizard.addprimarystorageintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\"?",
+"label.installwizard.addprimarystorageintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.installwizard.addsecondarystorageintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\"?",
+"label.installwizard.addsecondarystorageintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u044c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.",
+"label.installwizard.addzoneintro.subtitle": "\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \"\u0417\u043e\u043d\u0430\"?",
+"label.installwizard.addzoneintro.title": "\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u043e\u043d\u0443",
+"label.installwizard.click.launch": "\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430",
+"label.installwizard.subtitle": "\u042d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442 \u0432\u0430\u0448 CloudStack.",
+"label.installwizard.title": "\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0438 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 CloudStack!",
+"label.instance": "\u041c\u0430\u0448\u0438\u043d\u0430",
+"label.instance.name": "\u0418\u043c\u044f \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.instance.scaled.up": "Instance scaled to the requested offering",
+"label.instancename": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f",
+"label.instanceport": "Instance Port",
+"label.instances": "\u041c\u0430\u0448\u0438\u043d\u044b",
+"label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
+"label.intermediate.certificate": "Intermediate certificate",
+"label.internal.dns.1": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 1",
+"label.internal.dns.2": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 2",
+"label.internal.lb": "Internal LB",
+"label.internal.lb.details": "Internal LB details",
+"label.internaldns1": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 1",
+"label.internaldns2": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "Polling Interval (in sec)",
+"label.intervaltype": "\u0422\u0438\u043f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430",
+"label.introduction.to.cloudstack": "\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 CloudStack",
+"label.invalid.integer": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e",
+"label.invalid.number": "\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e",
+"label.invitations": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f",
+"label.invite": "\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c",
+"label.invite.to": "\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c",
+"label.invited.accounts": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.ip": "IP",
+"label.ip.allocations": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 IP",
+"label.ip.or.fqdn": "IP \u0438\u043b\u0438 FQDN",
+"label.ip.range": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.ip.ranges": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 Gateway",
+"label.ip4netmask": "IPv4 Netmask",
+"label.ip6address": "IPv6 IP Address",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 Gateway",
+"label.ipaddress": "IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430",
+"label.ipaddress1": "IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430",
+"label.ipaddress2": "IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430",
+"label.iplimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0445 IP",
+"label.ips": "IP",
+"label.ipsecpsk": "IPsec Preshared-Key",
+"label.iptotal": "\u0412\u0441\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "\u0426\u0435\u043b\u0435\u0432\u043e\u0439 IQN",
+"label.is.redundant.router": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439",
+"label.is.shared": "\u041e\u0431\u0449\u0438\u0439",
+"label.isadvanced": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430",
+"label.iscustomizeddiskiops": "\u0421\u0432\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e IPOS",
+"label.iscustomizediops": "\u0421\u0432\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e IPOS",
+"label.isdedicated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439",
+"label.isdefault": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"label.isdynamicallyscalable": "\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",
+"label.isextractable": "\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0439",
+"label.isfeatured": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439",
+"label.isforced": "\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435",
+"label.ismanaged": "\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439",
+"label.iso": "ISO",
+"label.iso.boot": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 ISO",
+"label.isoid": "ISO",
+"label.isolated.networks": "\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438",
+"label.isolatedpvlanid": "Secondary Isolated VLAN ID",
+"label.isolation.method": "\u041c\u0435\u0442\u043e\u0434 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438",
+"label.isolation.mode": "\u0420\u0435\u0436\u0438\u043c \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438",
+"label.isolationmethod": "\u041c\u0435\u0442\u043e\u0434 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438",
+"label.isolationmethods": "\u041c\u0435\u0442\u043e\u0434 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438",
+"label.isolationuri": "\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f URI",
+"label.isoname": "\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0439 ISO",
+"label.isos": "ISO",
+"label.ispasswordenabled": "\u041f\u0430\u0440\u043e\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d",
+"label.ispersistent": "Persistent ",
+"label.isportable": "\u041e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0437\u043e\u043d",
+"label.ispublic": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439",
+"label.isready": "\u0413\u043e\u0442\u043e\u0432",
+"label.isredundantrouter": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.isrouting": "\u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f",
+"label.isshared": "\u041e\u0431\u0449\u0438\u0439",
+"label.issourcenat": "Source NAT",
+"label.isstaticnat": "\u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 NAT",
+"label.issystem": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435",
+"label.isvolatile": "Volatile",
+"label.item.listing": "\u0421\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432",
+"label.japanese.keyboard": "Japanese keyboard",
+"label.keep": "\u0425\u0440\u0430\u043d\u0438\u0442\u044c",
+"label.keep.colon": "Keep:",
+"label.key": "\u041a\u043b\u044e\u0447",
+"label.keyboard": "Keyboard language",
+"label.keyboardtype": "\u0422\u0438\u043f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b",
+"label.keypair": "SSH Key Pair",
+"label.kvmnetworklabel": "\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 KVM",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service Uuid",
+"label.label": "\u041c\u0435\u0442\u043a\u0430",
+"label.lang.arabic": "Arabic",
+"label.lang.brportugese": "Brazilian Portugese",
+"label.lang.catalan": "Catalan",
+"label.lang.chinese": "\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439)",
+"label.lang.dutch": "Dutch (Netherlands)",
+"label.lang.english": "\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439",
+"label.lang.french": "French",
+"label.lang.german": "German",
+"label.lang.hungarian": "Hungarian",
+"label.lang.italian": "Italian",
+"label.lang.japanese": "\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439",
+"label.lang.korean": "\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439",
+"label.lang.norwegian": "Norwegian",
+"label.lang.polish": "Polish",
+"label.lang.russian": "\u0420\u0443\u0441\u0441\u043a\u0438\u0439",
+"label.lang.spanish": "\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439",
+"label.last.updated": "Last Update",
+"label.lastname": "\u0424\u0430\u043c\u0438\u043b\u0438\u044f",
+"label.lastname.lower": "\u0424\u0430\u043c\u0438\u043b\u0438\u044f",
+"label.latest.events": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f",
+"label.launch": "\u0417\u0430\u043f\u0443\u0441\u043a",
+"label.launch.vm": "\u0417\u0430\u043f\u0443\u0441\u043a \u0412\u041c",
+"label.launch.zone": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"label.lb.algorithm.leastconn": "Least connections",
+"label.lb.algorithm.roundrobin": "Round-robin",
+"label.lb.algorithm.source": "\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a",
+"label.lbdevicededicated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "\u0422\u0438\u043f",
+"label.lbdevicestate": "\u0421\u0442\u0430\u0442\u0443\u0441",
+"label.lbtype": "Load Balancer Type",
+"label.ldap.configuration": "LDAP Configuration",
+"label.ldap.group.name": "LDAP Group",
+"label.ldap.port": "LDAP port",
+"label.level": "\u0423\u0440\u043e\u0432\u0435\u043d\u044c",
+"label.limitcpuuse": "CPU Cap",
+"label.link.domain.to.ldap": "Link Domain to LDAP",
+"label.linklocalip": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441",
+"label.load.balancer": "\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.load.balancing.policies": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.loadbalancerinstance": "Assigned VMs",
+"label.loadbalancerrule": "\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.loadbalancing": "\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.loading": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430",
+"label.local": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439",
+"label.local.storage": "\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.local.storage.enabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0412\u041c",
+"label.local.storage.enabled.system.vms": "Enable local storage for System VMs",
+"label.localstorageenabled": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0412\u041c",
+"label.localstorageenabledforsystemvm": "Enable local storage for System VMs",
+"label.login": "\u0412\u043e\u0439\u0442\u0438",
+"label.logout": "\u0412\u044b\u0439\u0442\u0438",
+"label.lun": "LUN",
+"label.lun.number": "LUN #",
+"label.lxcnetworklabel": "LXC Traffic Label",
+"label.make.project.owner": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.makeredundant": "Make redundant",
+"label.manage": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
+"label.manage.resources": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438",
+"label.management": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435",
+"label.management.ips": "\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430\u043c\u0438",
+"label.management.server": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u043b\u0435\u043d\u0438\u044f",
+"label.max.primary.storage": "\u041c\u0430\u043a\u0441. \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u0432 \u0413\u0438\u0411)",
+"label.max.secondary.storage": "\u041c\u0430\u043a\u0441. \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u0432 \u0413\u0438\u0411)",
+"label.maxcpu": "\u041c\u0430\u043a\u0441. \u044f\u0434\u0435\u0440 \u0426\u041f",
+"label.maxerrorretry": "Max Error Retry",
+"label.maxguestslimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0433\u043e\u0441\u0442\u0435\u0439",
+"label.maximum": "\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c",
+"label.maxinstance": "Max Instances",
+"label.maxiops": "\u041c\u0430\u043a\u0441. IOPS",
+"label.maxmemory": "\u041c\u0430\u043a\u0441. \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432 \u041c\u0438\u0411)",
+"label.maxnetwork": "\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u0435\u0442\u0435\u0439",
+"label.maxpublicip": "\u041c\u0430\u043a\u0441. \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 IP",
+"label.maxsnapshot": "\u041c\u0430\u043a\u0441. \u0441\u043d\u0438\u043c\u043a\u043e\u0432",
+"label.maxtemplate": "\u041c\u0430\u043a\u0441. \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432",
+"label.maxuservm": "\u041c\u0430\u043a\u0441. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0412\u041c",
+"label.maxvolume": "\u041c\u0430\u043a\u0441. \u0434\u0438\u0441\u043a\u043e\u0432",
+"label.maxvpc": "\u041c\u0430\u043a\u0441. VPC",
+"label.may.continue": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c.",
+"label.memallocated": "Mem Allocation",
+"label.memory": "\u041f\u0430\u043c\u044f\u0442\u044c",
+"label.memory.total": "\u0412\u0441\u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.memory.used": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.memoryallocated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.memoryallocatedgb": "\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e",
+"label.memorylimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432 \u041c\u0438\u0411)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e",
+"label.menu.all.accounts": "\u0412\u0441\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.menu.all.instances": "\u0412\u0441\u0435 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.menu.community.isos": "ISO-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430",
+"label.menu.community.templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430",
+"label.menu.destroyed.instances": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.menu.featured.isos": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 ISO",
+"label.menu.featured.templates": "\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b",
+"label.menu.ipaddresses": "IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.menu.my.accounts": "\u041c\u043e\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.menu.my.instances": "\u041c\u043e\u0438 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.menu.my.isos": "\u041c\u043e\u0438 ISO",
+"label.menu.my.templates": "\u041c\u043e\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b",
+"label.menu.physical.resources": "\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.menu.regions": "\u0420\u0435\u0433\u0438\u043e\u043d",
+"label.menu.running.instances": "\u0420\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.menu.security.groups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.menu.service.offerings": "\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u043b\u0443\u0436\u0431",
+"label.menu.sshkeypair": "SSH KeyPair",
+"label.menu.stopped.instances": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.menu.storage": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.menu.system": "\u0421\u0438\u0441\u0442\u0435\u043c\u0430",
+"label.menu.virtual.appliances": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
+"label.menu.virtual.resources": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u0432",
+"label.migrate.instance.to.host": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0437\u0435\u043b",
+"label.migrate.instance.to.ps": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.migrate.lb.vm": "Migrate LB VM",
+"label.migrate.router.to": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432",
+"label.migrate.systemvm.to": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c \u0432",
+"label.migrate.to.host": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0443\u0437\u0435\u043b",
+"label.migrate.to.storage": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.migrate.volume": "\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0438\u0441\u043a\u0430",
+"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": "\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0434\u0438\u0441\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "min past the hr",
+"label.minimum": "\u041c\u0438\u043d\u0438\u043c\u0443\u043c",
+"label.mininstance": "Min Instances",
+"label.miniops": "\u041c\u0438\u043d. IOPS",
+"label.minute.past.hour": "\u041c\u0438\u043d\u0443\u0442",
+"label.minutes.past.hour": "minutes(s) past the hour",
+"label.monday": "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a",
+"label.monthly": "\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446",
+"label.more.templates": "\u0415\u0449\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b",
+"label.move.down.row": "\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0438\u0436\u0435",
+"label.move.to.bottom": "\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437",
+"label.move.to.top": "\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u0432\u0435\u0440\u0445",
+"label.move.up.row": "\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0448\u0435",
+"label.my.account": "\u041c\u043e\u044f \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c",
+"label.my.network": "\u041c\u043e\u044f \u0441\u0435\u0442\u044c",
+"label.my.templates": "\u041c\u043e\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b",
+"label.na": "N/A",
+"label.name": "\u0418\u043c\u044f",
+"label.name.optional": "\u0418\u043c\u044f (\u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e)",
+"label.nat": "BigSwitch BCF NAT Enabled",
+"label.nat.port.range": "\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0440\u0442\u043e\u0432 NAT",
+"label.netmask": "\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler details",
+"label.network": "\u0421\u0435\u0442\u044c",
+"label.network.acl": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 ACL",
+"label.network.acls": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 ACL",
+"label.network.addvm": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u044c \u0432 \u0412\u041c",
+"label.network.desc": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0438",
+"label.network.details": "Network Details",
+"label.network.device": "\u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.network.device.type": "\u0422\u0438\u043f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
+"label.network.domain": "\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d",
+"label.network.label.display.for.blank.value": "\u0418\u0441\u043f. \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u043b\u044e\u0437",
+"label.network.name": "\u0418\u043c\u044f \u0441\u0435\u0442\u0438",
+"label.network.offering": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.network.offering.details": "Network offering details",
+"label.network.offering.display.text": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.network.offering.name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.network.offerings": "\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u0435\u0442\u0438",
+"label.network.service.providers": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0436\u0431",
+"label.networkcidr": "Network CIDR",
+"label.networkdevicetype": "\u0422\u0438\u043f",
+"label.networkdomain": "\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d",
+"label.networkdomaintext": "\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d",
+"label.networkid": "\u0421\u0435\u0442\u044c",
+"label.networking.and.security": "\u0421\u0435\u0442\u044c \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c",
+"label.networkkbsread": "\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c",
+"label.networkkbswrite": "\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c",
+"label.networklimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u0438",
+"label.networkname": "\u0418\u043c\u044f \u0441\u0435\u0442\u0438",
+"label.networkofferingdisplaytext": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.networkofferingid": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.networkofferingidtext": "ID \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.networkofferingname": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438",
+"label.networkrate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438",
+"label.networkread": "\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c",
+"label.networks": "\u0421\u0435\u0442\u0438",
+"label.networktype": "\u0422\u0438\u043f \u0441\u0435\u0442\u0438",
+"label.networkwrite": "\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c",
+"label.new": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c",
+"label.new.password": "\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c",
+"label.new.project": "\u041d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.new.vm": "\u041d\u043e\u0432\u0430\u044f \u0412\u041c",
+"label.newdiskoffering": "\u041d\u043e\u0432\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430",
+"label.newsize": "\u041d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (GB)",
+"label.next": "\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 NFS",
+"label.nfscachenfsserver": "\u0421\u0435\u0440\u0432\u0435\u0440 NFS",
+"label.nfscachepath": "\u041f\u0443\u0442\u044c",
+"label.nfscachezoneid": "\u0417\u043e\u043d\u0430",
+"label.nfsserver": "\u0421\u0435\u0440\u0432\u0435\u0440 NFS",
+"label.nicadaptertype": "\u0422\u0438\u043f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b (NIC)",
+"label.nicira.controller.address": "\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430",
+"label.nicira.nvp.details": "Nicira NVP details",
+"label.nics": "\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b",
+"label.no": "\u041d\u0435\u0442",
+"label.no.actions": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439",
+"label.no.alerts": "\u0422\u0440\u0435\u0432\u043e\u0433 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",
+"label.no.data": "\u041d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430",
+"label.no.errors": "\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",
+"label.no.grouping": "(no grouping)",
+"label.no.isos": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 ISO",
+"label.no.items": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432",
+"label.no.security.groups": "\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.none": "\u041d\u0435\u0442",
+"label.noselect": "\u041d\u0435\u0442, \u0441\u043f\u0430\u0441\u0438\u0431\u043e",
+"label.not.found": "\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e",
+"label.notifications": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f",
+"label.num.cpu.cores": "\u041a\u043e\u043b-\u0432\u043e \u044f\u0434\u0435\u0440 CPU",
+"label.number": "#Rule",
+"label.number.of.clusters": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432",
+"label.number.of.hosts": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432",
+"label.number.of.pods": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432",
+"label.number.of.system.vms": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c",
+"label.number.of.virtual.routers": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432",
+"label.number.of.zones": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043e\u043d",
+"label.numberofrouterrequiresupgrade": "Total of Virtual Routers that require upgrade",
+"label.numretries": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "of month",
+"label.offerha": "\u0423\u0441\u043b\u0443\u0433\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438",
+"label.ok": "OK",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight Controller",
+"label.opendaylight.controllerdetail": "OpenDaylight Controller Details",
+"label.opendaylight.controllers": "OpenDaylight Controllers",
+"label.optional": "\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e",
+"label.order": "\u041e\u0447\u0435\u0440\u0435\u0434\u044c",
+"label.oscategoryid": "\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u041e\u0421",
+"label.ostypeid": "\u0422\u0438\u043f \u041e\u0421",
+"label.ostypename": "\u0422\u0438\u043f \u041e\u0421",
+"label.other": "Other",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "Override Guest-Traffic",
+"label.override.public.traffic": "Override Public-Traffic",
+"label.overrideguesttraffic": "Override Guest-Traffic",
+"label.overridepublictraffic": "Override Public-Traffic",
+"label.ovm3cluster": "Native Clustering",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "Native Pooling",
+"label.ovm3vip": "Master Vip IP",
+"label.ovmnetworklabel": "OVM traffic label",
+"label.ovs": "OVS",
+"label.owned.public.ips": "\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 IP \u0430\u0434\u0440\u0435\u0441\u0430",
+"label.owner.account": "\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430",
+"label.owner.domain": "\u0414\u043e\u043c\u0435\u043d \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430",
+"label.pa": "static NAT",
+"label.palo.alto.details": "Palo Alto details",
+"label.palp": "Palo Alto Log Profile",
+"label.parent.domain": "\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0434\u043e\u043c\u0435\u043d",
+"label.parentname": "\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c",
+"label.passive": "Passive",
+"label.password": "\u041f\u0430\u0440\u043e\u043b\u044c",
+"label.password.reset.confirm": "\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d \u0432",
+"label.passwordenabled": "\u041f\u0430\u0440\u043e\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d",
+"label.path": "\u041f\u0443\u0442\u044c",
+"label.patp": "Palo Alto Threat Profile",
+"label.pavr": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "Perfect Forward Secrecy",
+"label.permission": "Permission",
+"label.physical.network": "\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0442\u0438",
+"label.physical.network.id": "ID \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438",
+"label.physical.network.name": "Physical network name",
+"label.physicalnetworkid": "\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0442\u0438",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "\u041f\u0430\u0440\u043e\u043b\u044c PING CIFS",
+"label.ping.cifs.username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PING CIFS",
+"label.ping.dir": "\u041a\u0430\u0442\u0430\u043b\u043e\u0433 PING",
+"label.ping.path": "Ping Path",
+"label.ping.storage.ip": "IP \u0430\u0434\u0440\u0435\u0441 PING-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.plannermode": "Planner mode",
+"label.please.complete.the.following.fields": "Please complete the following fields",
+"label.please.specify.netscaler.info": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 NetScaler",
+"label.please.wait": "\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435",
+"label.plugin.details": "\u0414\u0435\u0442\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430",
+"label.plugins": "\u041f\u043b\u0430\u0433\u0438\u043d\u044b",
+"label.pod": "\u0421\u0442\u0435\u043d\u0434",
+"label.pod.dedicated": "Pod Dedicated",
+"label.pod.name": "\u0418\u043c\u044f \u0441\u0442\u0435\u043d\u0434\u0430",
+"label.podid": "\u0421\u0442\u0435\u043d\u0434",
+"label.podname": "\u0418\u043c\u044f \u0441\u0442\u0435\u043d\u0434\u0430",
+"label.pods": "\u0421\u0442\u0435\u043d\u0434\u044b",
+"label.port": "Port",
+"label.port.forwarding.policies": "\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u043e\u0432",
+"label.port.range": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0440\u0442\u043e\u0432",
+"label.portable.ip": "Portable IP",
+"label.portable.ip.range.details": "Portable IP Range details",
+"label.portable.ip.ranges": "Portable IP Ranges",
+"label.portableipaddress": "Portable IPs",
+"label.portforwarding": "\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u043e\u0432",
+"label.powerstate": "Power State",
+"label.presetup": "\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430",
+"label.prev": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0448\u0438\u0439",
+"label.previous": "\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439",
+"label.primary.network": "\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.primary.storage": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.primary.storage.allocated": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.primary.storage.count": "\u041f\u0443\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.primary.storage.used": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.primarystoragelimit": "\u041b\u0438\u043c\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (GiB)",
+"label.primarystoragetotal": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.private.gateway": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0448\u043b\u044e\u0437",
+"label.private.interface": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
+"label.private.ip.range": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0430\u0441\u0442\u043d\u044b\u0445 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.private.ips": "\u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.private.zone": "\u0427\u0430\u0441\u0442\u043d\u0430\u044f \u0437\u043e\u043d\u0430",
+"label.privateinterface": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
+"label.privateip": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441",
+"label.privatekey": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 PKCS#8",
+"label.privatenetwork": "\u0427\u0430\u0441\u0442\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.privateport": "\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442",
+"label.profiledn": "Associated Profile",
+"label.profilename": "\u041f\u0440\u043e\u0444\u0438\u043b\u044c",
+"label.project": "\u041f\u0440\u043e\u0435\u043a\u0442",
+"label.project.dashboard": "\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.project.invite": "\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.project.name": "\u0418\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.project.view": "\u041f\u0440\u043e\u0435\u043a\u0442\u044b",
+"label.projectid": "ID \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.projects": "\u041f\u0440\u043e\u0435\u043a\u0442\u044b",
+"label.property": "Property",
+"label.protocol": "\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b",
+"label.protocol.number": "Protocol Number",
+"label.protocolnumber": "#Protocol",
+"label.provider": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438",
+"label.providername": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438",
+"label.providers": "\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438",
+"label.provisioningtype": "Provisioning Type",
+"label.public.interface": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
+"label.public.ip": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.public.ip.addresses": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.public.ips": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.public.lb": "Public LB",
+"label.public.load.balancer.provider": "Public Load Balancer Provider",
+"label.public.network": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.public.traffic": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a",
+"label.public.zone": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0437\u043e\u043d\u0430",
+"label.publicinterface": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441",
+"label.publicip": "IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430",
+"label.publickey": "Public Key",
+"label.publicnetwork": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.publicport": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0440\u0442",
+"label.purpose": "\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435",
+"label.pxe.server.type": "\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 PXE",
+"label.qostype": "\u0422\u0438\u043f QoS",
+"label.quickview": "\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",
+"label.quiescevm": "Quiesce VM",
+"label.quiettime": "Quiet Time (in sec)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "\u0412\u0441\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx user",
+"label.rbdmonitor": "Ceph monitor",
+"label.rbdpool": "Ceph pool",
+"label.rbdsecret": "Cephx secret",
+"label.reason": "Reason",
+"label.reboot": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c",
+"label.receivedbytes": "\u0411\u0430\u0439\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e",
+"label.recent.errors": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438",
+"label.recover.vm": "\u0412\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0412\u041c",
+"label.redundantrouter": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u0440\u043e\u0443\u0442\u0435\u0440",
+"label.redundantrouterstate": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0430",
+"label.redundantstate": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0430",
+"label.redundantvpcrouter": "Redundant VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c",
+"label.refresh.blades": "Refresh Blades",
+"label.region": "\u0420\u0435\u0433\u0438\u043e\u043d",
+"label.region.details": "Region details",
+"label.reinstall.vm": "\u041f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0412\u041c",
+"label.related": "\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439",
+"label.relationaloperator": "Operator",
+"label.release.account": "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": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0437\u0436\u0435",
+"label.remove.acl": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c ACL",
+"label.remove.egress.rule": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.remove.from.load.balancer": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.remove.ingress.rule": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.remove.ip.range": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP",
+"label.remove.ldap": "Remove LDAP",
+"label.remove.network.offering": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443",
+"label.remove.pf": "\u0414\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430",
+"label.remove.project.account": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.remove.region": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d",
+"label.remove.rule": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.remove.ssh.key.pair": "Remove SSH Key Pair",
+"label.remove.static.nat.rule": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e static NAT",
+"label.remove.static.route": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442",
+"label.remove.this.physical.network": "Remove this physical network",
+"label.remove.tier": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c tier",
+"label.remove.vm.from.lb": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0412\u041c \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.remove.vm.load.balancer": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0412\u041c \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"label.remove.vmware.datacenter": "Remove VMware datacenter",
+"label.remove.vpc": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPC",
+"label.remove.vpc.offering": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC",
+"label.removing": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435",
+"label.removing.user": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.replace.acl": "Replace ACL",
+"label.replace.acl.list": "Replace ACL List",
+"label.required": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "Requires Upgrade",
+"label.reserved.system.gateway": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u043b\u044e\u0437",
+"label.reserved.system.ip": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP",
+"label.reserved.system.netmask": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430",
+"label.reservediprange": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IP \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d",
+"label.reservedsystemendip": "\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.reservedsystemgateway": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u043b\u044e\u0437",
+"label.reservedsystemnetmask": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430",
+"label.reservedsystemstartip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.reset.ssh.key.pair": "Reset SSH Key Pair",
+"label.reset.ssh.key.pair.on.vm": "Reset SSH Key Pair on VM",
+"label.reset.vpn.connection": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435",
+"label.resetvm": "\u0421\u0431\u0440\u043e\u0441 \u0412\u041c",
+"label.resource": "\u0420\u0435\u0441\u0443\u0440\u0441",
+"label.resource.limit.exceeded": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043b\u0438\u043c\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.resource.limits": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.resource.name": "Resource Name",
+"label.resourceid": "Resource ID",
+"label.resourcename": "Resource Name",
+"label.resources": "\u0420\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.resourcestate": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432",
+"label.response.timeout.in.sec": "Response Timeout (in sec)",
+"label.restart.network": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0442\u044c",
+"label.restart.vpc": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c VPC",
+"label.restartrequired": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a",
+"label.restore": "\u0412\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
+"label.retry.interval": "Retry Interval",
+"label.review": "\u041e\u0431\u0437\u043e\u0440",
+"label.revoke.project.invite": "\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435",
+"label.role": "\u0420\u043e\u043b\u044c",
+"label.rolename": "\u0420\u043e\u043b\u044c",
+"label.roles": "Roles",
+"label.roletype": "Role Type",
+"label.root.certificate": "Root certificate",
+"label.root.disk.offering": "\u0423\u0441\u043b\u0443\u0433\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430",
+"label.rootdiskcontrollertypekvm": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430",
+"label.router.vm.scaled.up": "Router VM Scaled Up",
+"label.routercount": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432",
+"label.routerrequiresupgrade": "Upgrade is required",
+"label.routertype": "\u0422\u0438\u043f",
+"label.routing.host": "Routing Host",
+"label.rule": "Rule",
+"label.rule.number": "\u041d\u043e\u043c\u0435\u0440 \u043f\u0440\u0430\u0432\u0438\u043b\u0430",
+"label.rules": "\u041f\u0440\u0430\u0432\u0438\u043b\u0430",
+"label.running": "\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0412\u041c",
+"label.s3.access.key": "\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430",
+"label.s3.bucket": "Bucket",
+"label.s3.connection.timeout": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f",
+"label.s3.endpoint": "\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430",
+"label.s3.max.error.retry": "Max Error Retry",
+"label.s3.nfs.path": "S3 NFS \u043f\u0443\u0442\u044c",
+"label.s3.nfs.server": "S3 NFS \u0421\u0435\u0440\u0432\u0435\u0440",
+"label.s3.secret.key": "\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447",
+"label.s3.socket.timeout": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043a\u0435\u0442\u0430",
+"label.s3.use.https": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 HTTPS",
+"label.samlenable": "Authorize SAML SSO",
+"label.samlentity": "Identity Provider",
+"label.saturday": "\u0421\u0443\u0431\u0431\u043e\u0442\u0430",
+"label.save": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c",
+"label.save.and.continue": "\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c",
+"label.save.changes": "Save changes",
+"label.saving.processing": "\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435...",
+"label.scale.up.policy": "SCALE UP POLICY",
+"label.scaledown.policy": "ScaleDown Policy",
+"label.scaleup.policy": "ScaleUp Policy",
+"label.scope": "\u041e\u0445\u0432\u0430\u0442",
+"label.search": "\u041f\u043e\u0438\u0441\u043a",
+"label.secondary.staging.store": "Secondary Staging Store",
+"label.secondary.staging.store.details": "Secondary Staging Store details",
+"label.secondary.storage": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.secondary.storage.count": "\u041f\u0443\u043b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.secondary.storage.details": "Secondary storage details",
+"label.secondary.storage.vm": "\u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.secondary.used": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.secondaryips": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430",
+"label.secondarystoragelimit": "\u041b\u0438\u043c\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (GiB)",
+"label.secretkey": "\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447",
+"label.security.group.name": "\u0418\u043c\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.security.groups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.security.groups.enabled": "\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b",
+"label.securitygroup": "\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.securitygroups": "\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"label.select": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c",
+"label.select-view": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0438\u0434",
+"label.select.a.zone": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043e\u043d\u0443",
+"label.select.instance": "\u0412\u044b\u0431\u0438\u0440\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440",
+"label.select.instance.to.attach.volume.to": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0430\u0448\u0438\u043d\u0443 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430",
+"label.select.iso.or.template": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 ISO \u0438\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.select.offering": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435",
+"label.select.project": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.select.region": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d",
+"label.select.tier": "\u0412\u044b\u0431\u0440\u0430\u0442\u044c Tier",
+"label.select.vm.for.static.nat": "\u0412\u044b\u0431\u043e\u0440 VM \u0434\u043b\u044f NAT",
+"label.self": "\u041c\u043e\u0438",
+"label.sent": "\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",
+"label.sentbytes": "\u0411\u0430\u0439\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e",
+"label.server": "\u0421\u0435\u0440\u0432\u0435\u0440",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
+"label.service.lb.elasticlbcheckbox": "\u0413\u0438\u0431\u043a\u0438\u0439 LB",
+"label.service.lb.inlinemodedropdown": "\u0420\u0435\u0436\u0438\u043c",
+"label.service.lb.lbisolationdropdown": "\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f LB",
+"label.service.offering": "\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441",
+"label.service.offering.details": "Service offering details",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u0440\u043e\u0443\u0442\u0435\u0440\u0430",
+"label.service.state": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0431",
+"label.service.staticnat.associatepublicip": "\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0435 IP",
+"label.service.staticnat.elasticipcheckbox": "\u0413\u0438\u0431\u043a\u0438\u0439 IP",
+"label.servicecapabilities": "\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0443\u0436\u0431\u044b",
+"label.servicelist": "Services",
+"label.serviceofferingid": "\u0423\u0441\u043b\u0443\u0433\u0430 \u0432\u044b\u0447\u0435\u0441\u043b\u0435\u043d\u0438\u044f",
+"label.serviceofferingname": "\u0423\u0441\u043b\u0443\u0433\u0430 \u0432\u044b\u0447\u0435\u0441\u043b\u0435\u043d\u0438\u044f",
+"label.session.expired": "\u0421\u0435\u0430\u043d\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d",
+"label.set.default.nic": "\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c NIC \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e",
+"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": "\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0438\u043f \u0437\u043e\u043d\u044b",
+"label.settings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
+"label.setup": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430",
+"label.setup.network": "Set up Network",
+"label.setup.zone": "Set up Zone",
+"label.shared": "\u041e\u0431\u0449\u0438\u0439",
+"label.sharedexecutable": "\u041e\u0431\u0449\u0438\u0439",
+"label.sharedmountpoint": "\u041e\u0442\u043a\u0440\u044b\u0442\u0430\u044f\u0422\u043e\u0447\u043a\u0430\u0414\u043e\u0441\u0442\u0443\u043f\u0430",
+"label.show.ingress.rule": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e",
+"label.shrinkok": "Shrink OK",
+"label.shutdown.provider": "\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
+"label.site.to.site.vpn": "Site-to-site VPN",
+"label.size": "\u0420\u0430\u0437\u043c\u0435\u0440",
+"label.sizegb": "\u0420\u0430\u0437\u043c\u0435\u0440",
+"label.skip.guide": "\u042f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b CloudStack, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e",
+"label.smb.domain": "SMB Domain",
+"label.smb.password": "SMB Password",
+"label.smb.username": "SMB Username",
+"label.smbdomain": "SMB Domain",
+"label.smbpassword": "SMB Password",
+"label.smbusername": "SMB Username",
+"label.snapshot": "\u0421\u043d\u0438\u043c\u043e\u043a",
+"label.snapshot.name": "\u0418\u043c\u044f \u0441\u043d\u0438\u043c\u043a\u0430",
+"label.snapshot.schedule": "Set up Recurring Snapshot",
+"label.snapshotlimit": "\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043d\u0438\u043c\u043a\u043e\u0432",
+"label.snapshotmemory": "\u0421\u043d\u0438\u043c\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.snapshots": "\u0421\u043d\u0438\u043c\u043a\u0438",
+"label.snmpcommunity": "SNMP Community",
+"label.snmpport": "SNMP Port",
+"label.sockettimeout": "\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043a\u0435\u0442\u0430",
+"label.source.nat.supported": "SourceNAT Supported",
+"label.sourcecidr": "CIDR \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430",
+"label.sourceipaddress": "Source IP Address",
+"label.sourcenat": "Source NAT",
+"label.sourcenattype": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b NAT-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430",
+"label.sourceport": "Source Port",
+"label.specify.vxlan": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 VXLAN",
+"label.specifyipranges": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.specifyvlan": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 VLAN",
+"label.sr.name": "SR Name-Label",
+"label.srx": "SRX",
+"label.srx.details": "SRX details",
+"label.ssh.key.pair.details": "SSH Key Pair Details",
+"label.ssh.key.pairs": "SSH Key Pairs",
+"label.sshkeypair": "New SSH Key Pair",
+"label.standard.us.keyboard": "Standard (US) keyboard",
+"label.start.ip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 IP",
+"label.start.lb.vm": "Start LB VM",
+"label.start.reserved.system.ip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441",
+"label.start.vlan": "Start VLAN",
+"label.start.vxlan": "Start VXLAN",
+"label.startdate": "\u041f\u043e \u0434\u0430\u0442\u0435(\u043d\u0430\u0447\u0430\u043b\u043e)",
+"label.startip": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 IP",
+"label.startipv4": "IPv4 Start IP",
+"label.startipv6": "IPv6 Start IP",
+"label.startport": "\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442",
+"label.startquota": "Quota Value",
+"label.state": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
+"label.static.nat.enabled": "\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 NAT \u0432\u043a\u043b\u044e\u0447\u0435\u043d",
+"label.static.nat.to": "\u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 NAT \u043a",
+"label.static.nat.vm.details": "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 NAT \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d",
+"label.static.routes": "Static Routes",
+"label.statistics": "\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430",
+"label.status": "\u0421\u0442\u0430\u0442\u0443\u0441",
+"label.step.1": "\u0428\u0430\u0433 1",
+"label.step.1.title": "\u0428\u0430\u0433 1: <strong>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d</strong>",
+"label.step.2": "\u0428\u0430\u0433 2",
+"label.step.2.title": "\u0428\u0430\u0433 2: <strong>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441</strong>",
+"label.step.3": "\u0428\u0430\u0433 3",
+"label.step.3.title": "Step 3: <strong id=\"step3_label\">\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430</strong>",
+"label.step.4": "\u0428\u0430\u0433 4",
+"label.step.4.title": "Step 4: <strong>\u0421\u0435\u0442\u044c</strong>",
+"label.step.5": "\u0428\u0430\u0433 5",
+"label.step.5.title": "Step 5: <strong>\u041e\u0431\u0437\u043e\u0440</strong>",
+"label.stickiness.method": "Stickiness method",
+"label.sticky.cookie-name": "Cookie name",
+"label.sticky.expire": "\u0418\u0441\u0442\u0435\u043a\u0430\u0435\u0442",
+"label.sticky.holdtime": "\u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f",
+"label.sticky.indirect": "\u041a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u0439",
+"label.sticky.length": "\u0414\u043b\u0438\u043d\u0430",
+"label.sticky.name": "Sticky Name",
+"label.sticky.nocache": "\u041d\u0435\u0442 \u043a\u044d\u0448\u0430",
+"label.sticky.postonly": "\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435",
+"label.sticky.prefix": "\u041f\u0440\u0435\u0444\u0438\u043a\u0441",
+"label.sticky.request-learn": "\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435.",
+"label.sticky.tablesize": "\u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b",
+"label.stop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
+"label.stop.lb.vm": "Stop LB VM",
+"label.stopped": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0412\u041c",
+"label.storage": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.storage.tags": "\u041c\u0435\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.storage.traffic": "\u0422\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.storageid": "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"label.storagepool": "\u041f\u0443\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.storagetags": "\u041c\u0435\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.storagetype": "\u0422\u0438\u043f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"label.subdomainaccess": "\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d\u0443",
+"label.submit": "\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c",
+"label.submitted.by": "[\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e",
+"label.sunday": "\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435",
+"label.supportedservices": "\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "Supports Region Level VPC",
+"label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
+"label.suspend.project": "\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442",
+"label.switch.type": "\u0422\u0438\u043f \u0441\u0432\u0438\u0447\u0430",
+"label.system.capacity": "\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b",
+"label.system.offering": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.system.offering.for.router": "System Offering for Router",
+"label.system.offerings": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b",
+"label.system.service.offering": "\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431",
+"label.system.service.offering.details": "System service offering details",
+"label.system.vm": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0412\u041c",
+"label.system.vm.details": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0412\u041c",
+"label.system.vm.scaled.up": "System VM Scaled Up",
+"label.system.vms": "\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c",
+"label.system.wide.capacity": "\u041e\u0431\u0449\u0435\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430",
+"label.systemvmtype": "\u0422\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c",
+"label.tag.key": "Tag Key",
+"label.tag.value": "Tag Value",
+"label.tagged": "\u0421 \u043c\u0435\u0442\u043a\u043e\u0439",
+"label.tags": "\u041c\u0435\u0442\u043a\u0438",
+"label.target.iqn": "\u0426\u0435\u043b\u0435\u0432\u043e\u0439 IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "\u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430",
+"label.template": "\u0428\u0430\u0431\u043b\u043e\u043d",
+"label.templatebody": "Body",
+"label.templatedn": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d",
+"label.templatefileupload": "Local file",
+"label.templatelimit": "\u041f\u0440\u0435\u0434\u0435\u043b\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430",
+"label.templatename": "\u0428\u0430\u0431\u043b\u043e\u043d",
+"label.templatenames": "\u0428\u0430\u0431\u043b\u043e\u043d",
+"label.templates": "\u0428\u0430\u0431\u043b\u043e\u043d\u044b",
+"label.templatesubject": "Subject",
+"label.templatetotal": "\u0428\u0430\u0431\u043b\u043e\u043d",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "\u041a\u0430\u0442\u0430\u043b\u043e\u0433 TFTP",
+"label.tftpdir": "Tftp root directory",
+"label.theme.default": "\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0442\u0435\u043c\u0430",
+"label.theme.grey": "\u0421\u0435\u0440\u0430\u044f \u0442\u0435\u043c\u0430",
+"label.theme.lightblue": "\u0413\u043e\u043b\u0443\u0431\u0430\u044f \u0442\u0435\u043c\u0430",
+"label.threshold": "Threshold",
+"label.thursday": "\u0427\u0435\u0442\u0432\u0435\u0440\u0433",
+"label.tier.details": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 Tier",
+"label.tiername": "Tier",
+"label.time": "\u0412\u0440\u0435\u043c\u044f",
+"label.time.colon": "Time:",
+"label.timeout": "\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f",
+"label.timeout.in.second ": " Timeout (seconds)",
+"label.timezone": "\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441",
+"label.timezone.colon": "Timezone:",
+"label.token": "\u0422\u043e\u043a\u0435\u043d",
+"label.total.hosts": "\u0412\u0441\u0435\u0433\u043e \u0443\u0437\u043b\u043e\u0432",
+"label.total.memory": "\u0412\u0441\u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438",
+"label.total.storage": "\u0412\u0441\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f",
+"label.total.vms": "\u0412\u0441\u0435\u0433\u043e \u0412\u041c",
+"label.totalcpu": "\u0412\u0441\u0435\u0433\u043e CPU",
+"label.traffic.label": "\u0422\u0440\u0430\u0444\u0438\u043a",
+"label.traffic.types": "\u0422\u0438\u043f\u044b \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"label.traffictype": "\u0422\u0438\u043f \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"label.transportzoneuuid": "Transport Zone Uuid",
+"label.tuesday": "\u0412\u0442\u043e\u0440\u043d\u0438\u043a",
+"label.type": "\u0422\u0438\u043f",
+"label.type.id": "ID \u0442\u0438\u043f\u0430",
+"label.ucs": "UCS",
+"label.uk.keyboard": "UK keyboard",
+"label.unavailable": "\u041d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e",
+"label.unhealthy.threshold": "Unhealthy Threshold",
+"label.unit": "Usage Unit",
+"label.unlimited": "\u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e",
+"label.untagged": "\u0411\u0435\u0437 \u043c\u0435\u0442\u043a\u0438",
+"label.update.project.resources": "\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430",
+"label.update.ssl": " \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b SSL",
+"label.update.ssl.cert": " \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b SSL",
+"label.updating": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435",
+"label.upgrade.router.newer.template": "Upgrade Router to Use Newer Template",
+"label.upload": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c",
+"label.upload.from.local": "Upload from Local",
+"label.upload.template.from.local": "Upload Template from Local",
+"label.upload.volume": "\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c  \u0434\u0438\u0441\u043a",
+"label.upload.volume.from.local": "Upload Volume from Local",
+"label.upload.volume.from.url": "Upload volume from URL",
+"label.url": "URL",
+"label.usage.sanity.result": "Usage Sanity Result",
+"label.usage.server": "\u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438",
+"label.usageinterface": "\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 IP \u0412\u041c:",
+"label.use.vm.ips": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0412\u041c IPs",
+"label.usehttps": "\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c",
+"label.user.details": "User details",
+"label.user.vm": "User VM",
+"label.userdata": "Userdata",
+"label.userdatal2": "User Data",
+"label.username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f",
+"label.users": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435",
+"label.vcdcname": "\u0418\u043c\u044f vCenter DC",
+"label.vcenter": "vcenter",
+"label.vcenter.cluster": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440 vCenter",
+"label.vcenter.datacenter": "\u0426\u041e\u0414 vCenter",
+"label.vcenter.datastore": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 vCenter",
+"label.vcenter.host": "\u0423\u0437\u0435\u043b vCenter",
+"label.vcenter.password": "\u041f\u0430\u0440\u043e\u043b\u044c vCenter",
+"label.vcenter.username": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f vCenter",
+"label.vcenterdatacenter": "\u0426\u041e\u0414 vCenter",
+"label.vcenterdatastore": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 vCenter",
+"label.esx.host": "\u0423\u0437\u0435\u043b ESX/ESXi",
+"label.vcenterpassword": "\u041f\u0430\u0440\u043e\u043b\u044c vCenter",
+"label.vcenterusername": "\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f vCenter",
+"label.vcipaddress": "vCenter IP \u0410\u0434\u0440\u0435\u0441\u0441",
+"label.vcsdeviceid": "ID",
+"label.version": "\u0412\u0435\u0440\u0441\u0438\u044f",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "Max resolution",
+"label.vgpu.max.vgpu.per.gpu": "vGPUs per GPU",
+"label.vgpu.remaining.capacity": "\u041e\u0441\u0442\u0430\u0448\u0438\u0435\u0441\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c",
+"label.vgpu.video.ram": "Video RAM",
+"label.vgputype": "vGPU type",
+"label.view": "\u0412\u0438\u0434",
+"label.view.all": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0451",
+"label.view.console": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c",
+"label.view.more": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435",
+"label.view.secondary.ips": "\u041e\u0431\u0437\u043e\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432",
+"label.viewing": "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440",
+"label.virtual.appliance": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
+"label.virtual.appliance.details": "Virtual applicance details",
+"label.virtual.appliances": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
+"label.virtual.machine": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430",
+"label.virtual.machines": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.virtual.network": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c",
+"label.virtual.networking": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430t \u0441\u0435\u0442\u0438",
+"label.virtual.routers": "\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440",
+"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.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN",
+"label.vlan.range": "VLAN/VNI Range",
+"label.vlan.range.details": "VLAN Range details",
+"label.vlan.vni.ranges": "VLAN/VNI Range(s)",
+"label.vlanid": "ID VLAN",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI Range",
+"label.vm.add": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u044b",
+"label.vm.destroy": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c",
+"label.vm.password": "Password of the VM is",
+"label.vm.reboot": "\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c",
+"label.vm.snapshots": "\u0421\u043d\u0438\u043c\u043e\u043a \u0412\u041c",
+"label.vm.start": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
+"label.vm.stop": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
+"label.vmdisplayname": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u0412\u041c",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 VMFS",
+"label.vmipaddress": "\u0412\u041c IP-\u0430\u0434\u0440\u0435\u0441",
+"label.vmlimit": "\u041b\u0438\u043c\u0438\u0442 \u043c\u0430\u0448\u0438\u043d",
+"label.vmname": "VM Name",
+"label.vms": "\u0412\u041c",
+"label.vms.in.tier": "Tier \u0412\u041c",
+"label.vmstate": "\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430",
+"label.vmtotal": "\u0412\u0441\u0435\u0433\u043e \u0412\u041c",
+"label.vmwaredcid": "VMware datacenter ID",
+"label.vmwaredcname": "VMware datacenter Name",
+"label.vmwaredcvcenter": "VMware datacenter vcenter",
+"label.vmwarenetworklabel": "\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 VMware",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC Devices",
+"label.volgroup": "\u0413\u0440\u0443\u043f\u043f\u0430 \u0434\u0438\u0441\u043a\u0430",
+"label.volume": "\u0422\u043e\u043c",
+"label.volume.details": "\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0434\u0438\u0441\u043a\u0435",
+"label.volume.migrated": "\u0414\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043d",
+"label.volumechecksum": "\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c MD5 \u0441\u0443\u043c\u043c\u0443",
+"label.volumefileupload": "Local file",
+"label.volumegroup": "\u0413\u0440\u0443\u043f\u043f\u0430 \u0434\u0438\u0441\u043a\u0430",
+"label.volumelimit": "\u041a\u043e\u043b\u0438\u0447\u0435\u0442\u0441\u0432\u043e \u0434\u0438\u0441\u043a\u043e\u0432",
+"label.volumename": "\u0418\u043c\u044f \u0442\u043e\u043c\u0430",
+"label.volumes": "\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f",
+"label.volumetotal": "\u0422\u043e\u043c",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "\u0414\u0435\u0442\u0430\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0438 VPC",
+"label.vpc.offerings": "\u0423\u0441\u043b\u0443\u0433\u0438 VPS",
+"label.vpc.router.details": "VPC Router Details",
+"label.vpc.virtual.router": "VPC Virtual Router",
+"label.vpcid": "VPC",
+"label.vpclimit": "\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f VPC",
+"label.vpcname": "VPC",
+"label.vpcoffering": "\u0423\u0441\u043b\u0443\u0433\u0430 VPC",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435",
+"label.vpn.gateway": "VPN \u0448\u043b\u044e\u0437",
+"label.vpncustomergatewayid": "VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430",
+"label.vsmctrlvlanid": "Control VLAN ID",
+"label.vsmdeviceid": "\u0418\u043c\u044f",
+"label.vsmdevicestate": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
+"label.vsmipaddress": "Nexus 1000v IP Address",
+"label.vsmpassword": "Nexus 1000v Password",
+"label.vsmpktvlanid": "Packet VLAN ID",
+"label.vsmstoragevlanid": "Storage VLAN ID",
+"label.vsmusername": "Nexus 1000v Username",
+"label.vsmusername.req": "Nexus 1000v Username",
+"label.vsphere.managed": "vSphere Managed",
+"label.vswitch.name": "vSwitch Name",
+"label.vswitch.type": "vSwitch Type",
+"label.vswitchguestname": "Guest Traffic vSwitch Name",
+"label.vswitchguesttype": "Guest Traffic vSwitch Type",
+"label.vswitchpublicname": "Public Traffic vSwitch Name",
+"label.vswitchpublictype": "Public Traffic vSwitch Type",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d Range",
+"label.waiting": "\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435",
+"label.warn": "\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435",
+"label.warn.upper": "WARN",
+"label.warning": "Warning",
+"label.wednesday": "\u0421\u0440\u0435\u0434\u0430",
+"label.weekly": "\u0415\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e",
+"label.welcome": "\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c",
+"label.welcome.cloud.console": "\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f",
+"label.what.is.cloudstack": "\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 CloudStack&#8482?",
+"label.writecachetype": "Write-cache Type",
+"label.xennetworklabel": "\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 XenServer",
+"label.xenservertoolsversion61plus": "Original XS Version is 6.1+",
+"label.yes": "\u0414\u0430",
+"label.zone": "\u0417\u043e\u043d\u0430",
+"label.zone.dedicated": "Zone Dedicated",
+"label.zone.details": "\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0437\u043e\u043d\u044b",
+"label.zone.id": "ID \u0437\u043e\u043d\u044b",
+"label.zone.step.1.title": "\u0428\u0430\u0433 1: <strong>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u044c</strong>",
+"label.zone.step.2.title": "Step 2: <strong>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0437\u043e\u043d\u0443</strong>",
+"label.zone.step.3.title": "Step 3: <strong>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u0442\u0435\u043d\u0434</strong>",
+"label.zone.step.4.title": "Step 4: <strong>\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432</strong>",
+"label.zone.type": "\u0422\u0438\u043f \u0437\u043e\u043d\u044b",
+"label.zone.wide": "\u0412\u0441\u0435\u0439 \u0437\u043e\u043d\u044b",
+"label.zoneid": "\u0417\u043e\u043d\u0430",
+"label.zonename": "\u0417\u043e\u043d\u0430",
+"label.zonenamelabel": "Zone Name",
+"label.zones": "\u0417\u043e\u043d\u044b",
+"label.zonewizard.traffictype.guest": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439",
+"label.zonewizard.traffictype.management": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c CloudStack, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0443\u0437\u043b\u044b \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"label.zonewizard.traffictype.public": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439: \u0442\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435",
+"label.zonewizard.traffictype.storage": "\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u043c\u0438 \u0438 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0438 \u0441\u043d\u0438\u043c\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d.",
+"message.acquire.ip.nic": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 IP \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b. <br/>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u0434\u0430\u0432\u043d\u043e  \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 IP \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"message.acquire.new.ip": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \"\u0431\u0435\u043b\u044b\u0439\" IP \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438.",
+"message.acquire.new.ip.vpc": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \"\u0431\u0435\u043b\u044b\u0439\" IP \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e VPC.",
+"message.acquire.public.ip": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043e\u043d\u0443, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 IP.",
+"message.action.cancel.maintenance": "\u0423\u0437\u0435\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0448\u0435\u043b \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442.",
+"message.action.cancel.maintenance.mode": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.",
+"message.action.change.service.warning.for.instance": "\u041f\u0435\u0440\u0435\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430",
+"message.action.change.service.warning.for.router": "\u0414\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u043d\u0430\u0431\u043e\u0440\u0430 \u0443\u0441\u043b\u0443\u0433 \u0412\u0430\u0448 \u0440\u043e\u0443\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d",
+"message.action.delete.cluster": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.",
+"message.action.delete.disk.offering": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u042b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"message.action.delete.domain": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043c\u0435\u043d.",
+"message.action.delete.external.firewall": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0435\u043d\u0438\u0435: \u0415\u0441\u043b\u0438 \u0412\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435.",
+"message.action.delete.external.load.balancer": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0435\u043d\u0438\u0435: \u0415\u0441\u043b\u0438 \u0412\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435",
+"message.action.delete.ingress.rule": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e.",
+"message.action.delete.iso": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 ISO.",
+"message.action.delete.iso.for.all.zones": "ISO \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0437\u043e\u043d\u0430\u043c\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0432\u0441\u0435\u0445 \u0437\u043e\u043d.",
+"message.action.delete.network": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0435\u0442\u044c.",
+"message.action.delete.nexusvswitch": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e nexus 1000v",
+"message.action.delete.physical.network": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c",
+"message.action.delete.pod": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434.",
+"message.action.delete.primary.storage": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.",
+"message.action.delete.secondary.storage": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"message.action.delete.security.group": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 security group.",
+"message.action.delete.service.offering": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u042b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0441\u043b\u0443\u0433\u0443 \u0441\u043b\u0443\u0436\u0431",
+"message.action.delete.snapshot": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043d\u0438\u043c\u043e\u043a.",
+"message.action.delete.system.service.offering": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441.",
+"message.action.delete.template": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d.",
+"message.action.delete.template.for.all.zones": "\u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0437\u043e\u043d\u0430\u0445. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0437\u043e\u043d\u0430\u0445.",
+"message.action.delete.volume": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u043e\u043c.",
+"message.action.delete.zone": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443.",
+"message.action.destroy.instance": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.destroy.systemvm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c.",
+"message.action.destroy.volume": "Please confirm that you want to destroy this volume.",
+"message.action.disable.cluster": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.",
+"message.action.disable.nexusvswitch": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e nexusVswitch.",
+"message.action.disable.physical.network": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c.",
+"message.action.disable.pod": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434.",
+"message.action.disable.static.nat": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0430\u0434\u0440\u0435\u0441\u043e\u0432.",
+"message.action.disable.zone": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u043e\u043d\u0443.",
+"message.action.download.iso": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 ISO.",
+"message.action.download.template": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d.",
+"message.action.downloading.template": "Downloading template.",
+"message.action.enable.cluster": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.",
+"message.action.enable.maintenance": "\u0412\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u043d\u0435\u043c \u0432 \u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.",
+"message.action.enable.nexusvswitch": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e nexus 1000v.",
+"message.action.enable.physical.network": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c.",
+"message.action.enable.pod": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434.",
+"message.action.enable.zone": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443.",
+"message.action.expunge.instance": "Please confirm that you want to expunge this instance.",
+"message.action.force.reconnect": "\u0412\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442.",
+"message.action.host.enable.maintenance.mode": "\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d.",
+"message.action.instance.reset.password": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"message.action.manage.cluster": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.",
+"message.action.primarystorage.enable.maintenance.mode": "\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?",
+"message.action.reboot.instance": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.reboot.router": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440.",
+"message.action.reboot.systemvm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c.",
+"message.action.recover.volume": "Please confirm that you would like to recover this volume.",
+"message.action.release.ip": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u043e\u0442 IP \u0430\u0434\u0440\u0435\u0441.",
+"message.action.remove.host": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e/\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f/\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e.",
+"message.action.reset.password.off": "\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e",
+"message.action.reset.password.warning": "\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430.",
+"message.action.restore.instance": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.revert.snapshot": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0438\u0441\u043a \u043a \u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u043c \u0441\u043d\u0438\u043c\u043a\u0443",
+"message.action.start.instance": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.start.router": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440.",
+"message.action.start.systemvm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c.",
+"message.action.stop.instance": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.stop.router": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440.",
+"message.action.stop.systemvm": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.action.unmanage.cluster": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c.",
+"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": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c.",
+"message.action.vmsnapshot.revert": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c",
+"message.activate.project": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442?",
+"message.add.cluster": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u0432 \u0432 \u0437\u043e\u043d\u0435 <b><span id=\"zone_name\"></span></b>, pod <b><span id=\"pod_name\"></span></b>",
+"message.add.cluster.zone": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u0432 \u0432 \u0437\u043e\u043d\u0435 <b><span id=\"zone_name\"></span></b>",
+"message.add.disk.offering": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430",
+"message.add.domain": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d, \u0433\u0434\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0430\u0448 \u0434\u043e\u043c\u0435\u043d",
+"message.add.firewall": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0435\u0440\u0432\u043e\u043b \u0432 \u0437\u043e\u043d\u0443",
+"message.add.guest.network": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c",
+"message.add.host": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430.",
+"message.add.ip.range": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0437\u043e\u043d\u044b",
+"message.add.ip.range.direct.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c IP-\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u0435\u0442\u0438 <b><span id=\"directnetwork_name\"></span></b> \u0432 \u0437\u043e\u043d\u0435 <b><span id=\"zone_name\"></span></b>",
+"message.add.ip.range.to.pod": "<p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u0441\u0442\u0435\u043d\u0434: <b><span id=\"pod_name_label\"></span></b></p>",
+"message.add.load.balancer": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u0437\u043e\u043d\u0443",
+"message.add.load.balancer.under.ip": "\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 IP:",
+"message.add.network": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043d\u044b: <b><span id=\"zone_name\"></span></b>",
+"message.add.new.gateway.to.vpc": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430 \u0432 VPC",
+"message.add.pod": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043b\u044f \u0437\u043e\u043d\u044b <b><span id=\"add_pod_zone_name\"></span></b>",
+"message.add.pod.during.zone.creation": "\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u043c. \u0421\u0442\u0435\u043d\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0437\u043b\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 IP \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 IP \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u043e\u043d\u044b \u043e\u0431\u043b\u0430\u043a\u0430.",
+"message.add.primary": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0437\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"message.add.primary.storage": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0437\u043e\u043d\u044b <b><span id=\"zone_name\"></span></b>, \u0441\u0442\u0435\u043d\u0434\u0430 <b><span id=\"pod_name\"></span></b>",
+"message.add.region": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430.",
+"message.add.secondary.storage": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u0437\u043e\u043d\u0443 <b><span id=\"zone_name\"></span></b>",
+"message.add.service.offering": "\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430.",
+"message.add.system.service.offering": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438",
+"message.add.template": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430",
+"message.add.volume": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430.",
+"message.add.vpn.gateway": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437",
+"message.added.vpc.offering": "Added VPC offering",
+"message.adding.host": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430",
+"message.adding.netscaler.device": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 NetScaler",
+"message.adding.netscaler.provider": "\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Netscaler",
+"message.additional.networks.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430.",
+"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": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0435\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e VLAN. \u042d\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u0430\u043a \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u041f\u041d, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0435 \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437  \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u0435\u0442\u0438.",
+"message.advanced.security.group": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c security groups \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d.",
+"message.advanced.virtual": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VLAN \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d.",
+"message.after.enable.s3": "S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c S3 \u0441\u043d\u043e\u0432\u0430.",
+"message.after.enable.swift": "Swift \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Swift \u0441\u043d\u043e\u0432\u0430",
+"message.alert.state.detected": "\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0440\u0435\u0432\u043e\u0433\u0438",
+"message.allow.vpn.access": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f.",
+"message.apply.snapshot.policy": "\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439.",
+"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": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO \u043a \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.",
+"message.attach.volume": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u0438\u043d\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0412\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u0434\u0438\u0441\u043a \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 Windows, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b \u0434\u0438\u0441\u043a \u0431\u044b\u043b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d.",
+"message.basic.mode.desc": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0412\u044b <b>*<u>\u043d\u0435</u>*</b> \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 VLAN.  \u0412\u0441\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b Security groups.",
+"message.change.offering.confirm": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0438 \u0441\u043b\u0443\u0436\u0431 \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"message.change.password": "\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0432\u0430\u0448 \u043f\u0430\u0440\u043e\u043b\u044c.",
+"message.cluster.dedicated": "Cluster Dedicated",
+"message.cluster.dedication.released": "Cluster dedication released",
+"message.configure.all.traffic.types": "\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c.",
+"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": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"message.configuring.physical.networks": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439",
+"message.configuring.public.traffic": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"message.configuring.storage.traffic": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"message.confirm.action.force.reconnect": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0437\u043b\u0443",
+"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.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.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.ciscoasa1000v": "Please confirm you want to delete CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "Please confirm you want to delete CiscoVNMC resource",
+"message.confirm.delete.f5": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c F5",
+"message.confirm.delete.internal.lb": "Please confirm you want to delete Internal LB",
+"message.confirm.delete.netscaler": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c NetScaler",
+"message.confirm.delete.pa": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c Palo Alto",
+"message.confirm.delete.secondary.staging.store": "Please confirm you want to delete Secondary Staging Store.",
+"message.confirm.delete.srx": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c SRX",
+"message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
+"message.confirm.destroy.router": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443.",
+"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.event": "Are you sure you want to remove this event?",
+"message.confirm.remove.ip.range": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP.",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430",
+"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": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0412\u0430\u0448 ISO \u0432",
+"message.copy.template": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d <b id=\"copy_template_name_text\">XXX</b> \u0438\u0437 \u0437\u043e\u043d\u044b <b id=\"copy_template_source_zone_text\"></b> \u0432",
+"message.copy.template.confirm": "Are you sure you want to copy template?",
+"message.create.template": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u043d?",
+"message.create.template.vm": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <b id=\"p_name\"></b>",
+"message.create.template.volume": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0412\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0441\u043a\u0430: <b><span id=\"volume_name\"></span></b>. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0412\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0441\u043a\u0430.",
+"message.creating.cluster": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430",
+"message.creating.guest.network": "\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c",
+"message.creating.physical.networks": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439",
+"message.creating.pod": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430",
+"message.creating.primary.storage": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"message.creating.secondary.storage": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430",
+"message.creating.systemvm": "Creating system VMs (this may take a while)",
+"message.creating.zone": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b",
+"message.dedicate.zone": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430",
+"message.dedicated.zone.released": "Zone dedication released",
+"message.delete.account": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c.",
+"message.delete.affinity.group": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 affinity group",
+"message.delete.gateway": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u043b\u044e\u0437.",
+"message.delete.project": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442?",
+"message.delete.user": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
+"message.delete.vpn.connection": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.",
+"message.delete.vpn.customer.gateway": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0448\u043b\u044e\u0437 VPN.",
+"message.delete.vpn.gateway": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u043b\u044e\u0437 VPN.",
+"message.desc.add.new.lb.sticky.rule": "Add new LB sticky rule",
+"message.desc.advanced.zone": "\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0439. \u042d\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043c\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d, VPN, \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.",
+"message.desc.basic.zone": "\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0412\u041c \u0438\u043c\u0435\u0435\u0442 \u00ab\u0431\u0435\u043b\u044b\u0439\u00bb IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0438. \u0418\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0438 3-\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f IP-\u0432\u0434\u0440\u0435\u0441\u043e\u0432)",
+"message.desc.cluster": "\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0443\u0437\u043b\u043e\u0432. \u0423\u0437\u043b\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0434\u043d\u043e\u043c\u0443  \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449.",
+"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": "\u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b (\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440) \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0412\u041c, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0437\u043b\u0430 \u0432 CloudStack \u0432\u0430\u0436\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 IP \u043a \u0443\u0437\u043b\u0443 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f CloudStack.<br/><br/>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0438\u043c\u044f DNS \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 IP, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043a \u041e\u0421 (\u043e\u0431\u044b\u0447\u043d\u043e root), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432.",
+"message.desc.primary.storage": "\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441. \u041f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0443\u0437\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430.",
+"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": "\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c NFS \u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438 \u0438\u0445 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0412\u041c, \u043e\u0431\u0440\u0430\u0437\u043e\u0432 ISO \u0438 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0412\u041c. \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u0437\u043e\u043d\u044b.<br/><br/>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0443\u0442\u044c.",
+"message.desc.zone": "layer 3",
+"message.detach.disk": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0438\u0441\u043a?",
+"message.detach.iso.confirm": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO \u043e\u0442 \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b.",
+"message.disable.account": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u041e\u0431\u043b\u0430\u043a\u0430. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.",
+"message.disable.snapshot.policy": "\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439.",
+"message.disable.user": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
+"message.disable.vpn": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN?",
+"message.disable.vpn.access": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f.",
+"message.disabling.network.offering": "Disabling network offering",
+"message.disabling.vpc.offering": "Disabling VPC offering",
+"message.disallowed.characters": "Disallowed characters: <,>",
+"message.download.iso": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <a href=\"#\">00000</a> \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437",
+"message.download.template": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <a href=\"#\">00000</a>\u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438",
+"message.download.volume": "\u041d\u0430\u0436\u043c\u0438\u0442\u0435 <a href=\"#\">00000</a> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0438\u0441\u043a\u0430",
+"message.download.volume.confirm": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 <a href=\"#\">00000</a> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0438\u0441\u043a\u0430",
+"message.edit.account": "\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"-1\" \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430)",
+"message.edit.confirm": "Please confirm your changes before clicking \"Save\".",
+"message.edit.limits": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \"-1\" \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439.",
+"message.edit.traffic.type": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0435\u0442\u043a\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430  \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u0430.",
+"message.enable.account": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c.",
+"message.enable.user": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
+"message.enable.vpn": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a VPN \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430.",
+"message.enable.vpn.access": "VPN \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e IP \u0430\u0434\u0440\u0435\u0441\u0430. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPN?",
+"message.enabled.vpn": "\u0412\u0430\u0448 VPN \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d. \u0414\u043e\u0441\u0442\u0443\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 IP \u0430\u0434\u0440\u0435\u0441",
+"message.enabled.vpn.ip.sec": "\u0412\u0430\u0448 IPSec pre-shared \u043a\u043b\u044e\u0447",
+"message.enabling.network.offering": "Enabling network offering",
+"message.enabling.security.group.provider": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0433\u0440\u0443\u043f\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438",
+"message.enabling.vpc.offering": "Enabling VPC offering",
+"message.enabling.zone": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443",
+"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": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435",
+"message.generate.keys": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.",
+"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": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 VLAN \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438.",
+"message.guest.traffic.in.basic.zone": "\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432 IP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 CloudStack \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u0412\u041c. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.",
+"message.host.dedicated": "Host Dedicated",
+"message.host.dedication.released": "Host dedication released",
+"message.installwizard.click.retry": "\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a.",
+"message.installwizard.copy.whatisacluster": "\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0443\u0437\u043b\u043e\u0432. \u0423\u0437\u043b\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u0435\u0440\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u0449\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b (\u0412\u041c) \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \"\u0432\u0436\u0438\u0432\u0443\u044e\" \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 - \u0442\u0440\u0435\u0442\u044c\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&#8482. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043d\u0434\u0430\u0445, \u0430 \u0441\u0442\u0435\u043d\u0434\u044b - \u0432 \u0437\u043e\u043d\u0430\u0445. <br/><br/>CloudStack&#8482; \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.",
+"message.installwizard.copy.whatisahost": "\u0423\u0437\u0435\u043b - \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0423\u0437\u043b\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0412\u041c (\u043a\u0440\u043e\u043c\u0435 \u0443\u0437\u043b\u043e\u0432 BareMetal, \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e Linux-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 KVM, \u0441\u0435\u0440\u0432\u0435\u0440 Citrix XenServer \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 ESXI. \u041f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b \u0441 XenServer.<br/><br/>\u0423\u0437\u0435\u043b - \u044d\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&#8482;, \u0434\u0430\u043b\u0435\u0435 \u0443\u0437\u043b\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b - \u0432 \u0441\u0442\u0435\u043d\u0434\u0430\u0445, \u0441\u0442\u0435\u043d\u0434\u044b - \u0432 \u0437\u043e\u043d\u0430\u0445.",
+"message.installwizard.copy.whatisapod": "\u0421\u0442\u0435\u043d\u0434, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0439\u043a\u0443 \u0441 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u0437\u043b\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438.<br/><br/>\u0421\u0442\u0435\u043d\u0434 - \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&#8482;. \u0421\u0442\u0435\u043d\u0434\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u043e\u043d\u0430\u0445. \u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432 \u0437\u043e\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0441\u0442\u0435\u043d\u0434.",
+"message.installwizard.copy.whatisazone": "\u0417\u043e\u043d\u0430 - \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&#8482;. \u0417\u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u0426\u041e\u0414, \u0445\u043e\u0442\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043e\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0426\u041e\u0414. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u0441\u0435\u0442\u044c, \u0430 \u0441\u0430\u043c\u0438 \u0437\u043e\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438.",
+"message.installwizard.copy.whatiscloudstack": "CloudStack&#8482 - \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043f\u043b\u0430\u0444\u0442\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445, \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0438 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u00ab\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u00bb (IaaS). CloudStack&#8482 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0442\u044c\u044e, \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, CloudStack&#8482 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<br/><br/>CloudStack&#8482 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0438 \u0446\u0435\u043b\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u043b\u0430\u043a\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0438 \u0411\u0435\u0437\u043d\u0435\u0441-\u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f.",
+"message.installwizard.copy.whatisprimarystorage": "CloudStack&#8482; - \u044d\u0442\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c iSCSI \u0438\u043b\u0438 NFS-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0441\u043a.<br/><br/><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435</strong> \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0438 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0442\u043e\u043c\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432 \u0443\u0437\u043b\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043e\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0443\u0437\u043b\u043e\u043c.",
+"message.installwizard.copy.whatissecondarystorage": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u0437\u043e\u043d\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<ul><li>\u0428\u0430\u0431\u043b\u043e\u043d\u044b - \u043e\u0431\u0440\u0430\u0437\u044b \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0412\u041c \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.</li><li>\u041e\u0431\u0440\u0430\u0437\u044b ISO - \u044d\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435 \u0438\u043b\u0438 \u043d\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u041e\u0421</li><li>\u0421\u043d\u0438\u043c\u043a\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0442\u043e\u043c\u043e\u0432 - \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0412\u041c, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430</ul>",
+"message.installwizard.now.building": "\u0412\u0430\u0448\u0435 \u043e\u0431\u043b\u0430\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f...",
+"message.installwizard.tooltip.addcluster.name": "\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u043c\u044f, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 Cloudstack.",
+"message.installwizard.tooltip.addhost.hostname": "\u0418\u043c\u044f DNS \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0437\u043b\u0430.",
+"message.installwizard.tooltip.addhost.password": "\u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0441 \u0432\u0430\u0448\u0435\u0433\u043e XenServer)",
+"message.installwizard.tooltip.addhost.username": "\u041e\u0431\u044b\u0447\u043d\u043e root.",
+"message.installwizard.tooltip.addpod.name": "\u0418\u043c\u044f \u0441\u0442\u0435\u043d\u0434\u0430",
+"message.installwizard.tooltip.addpod.reservedsystemendip": "\u042d\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CloudStack \u0434\u043b\u044f \u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438. \u042d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0435\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432.",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "\u0428\u043b\u044e\u0437 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430.",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439.",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "\u042d\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CloudStack \u0434\u043b\u044f \u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438. \u042d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0435\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432.",
+"message.installwizard.tooltip.addprimarystorage.name": "\u0418\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.",
+"message.installwizard.tooltip.addprimarystorage.path": "(\u0434\u043b\u044f NFS) \u0412 NFS \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u044d\u043a\u043f\u043e\u0440\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0443\u0442\u044c (\u0434\u043b\u044f SharedMountPoint). \u0412 KVM \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"/mnt/primary\".",
+"message.installwizard.tooltip.addprimarystorage.server": "(\u0434\u043b\u044f NFS, iSCSI \u0438\u043b\u0438 PreSetup) IP-\u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 \u0438\u043c\u044f DNS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 NFS, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435",
+"message.installwizard.tooltip.addsecondarystorage.path": "\u041f\u0443\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.",
+"message.installwizard.tooltip.addzone.dns1": "\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0437\u0436\u0435. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0437\u043e\u043d\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS.",
+"message.installwizard.tooltip.addzone.dns2": "\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0437\u0436\u0435. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0437\u043e\u043d\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS.",
+"message.installwizard.tooltip.addzone.internaldns1": "\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c. \u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0435\u043d\u0434\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS.",
+"message.installwizard.tooltip.addzone.internaldns2": "\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c. \u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0435\u043d\u0434\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS.",
+"message.installwizard.tooltip.addzone.name": "\u0418\u043c\u044f \u0437\u043e\u043d\u044b",
+"message.installwizard.tooltip.configureguesttraffic.description": "\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (NIC) \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 (CIDR) \u0441\u0442\u0435\u043d\u0434\u0430.",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "\u0428\u043b\u044e\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0433\u043e\u0441\u0442\u044f\u043c\u0438",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439.",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (NIC) \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 (CIDR) \u0441\u0442\u0435\u043d\u0434\u0430.",
+"message.installwizard.tooltip.configureguesttraffic.name": "\u0418\u043c\u044f \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438",
+"message.instance.scaled.up.confirm": "Do you really want to scale Up your instance ?",
+"message.instancewizard.notemplates": "\u0412\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432; \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d.",
+"message.ip.address.changed": "\u0412\u0430\u0448\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0434\u0440\u0435\u0441\u043e\u0432? \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u0430.",
+"message.iso.desc": "\u041e\u0431\u0440\u0430\u0437 \u0434\u0438\u0441\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u041e\u0421",
+"message.join.project": "\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\".",
+"message.launch.vm.on.private.network": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0432 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0412\u0430\u043c \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438?",
+"message.launch.zone": "\u0417\u043e\u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443.",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c.  \u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438.  \u042d\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439.",
+"message.migrate.instance.confirm": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443.",
+"message.migrate.instance.to.host": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0437\u0435\u043b.",
+"message.migrate.instance.to.ps": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.",
+"message.migrate.router.confirm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432 \u0443\u0437\u0435\u043b:",
+"message.migrate.systemvm.confirm": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c \u0432 \u0443\u0437\u0435\u043b",
+"message.migrate.volume": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0434\u0438\u0441\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.",
+"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.network.removenic": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 NIC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0438\u0437 \u0412\u041c.",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c.",
+"message.no.affinity.groups": "\u0412\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435 affinity groups. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443.",
+"message.no.host.available": "No Hosts are available for Migration",
+"message.no.network.support": "\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (vSphere) \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 5.",
+"message.no.network.support.configuration.not.true": "\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b security group \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0437\u043e\u043d\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 5.",
+"message.no.projects": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<br/>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 \"\u041f\u0440\u043e\u0435\u043a\u0442\u044b\"",
+"message.no.projects.adminonly": "\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<br/>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.",
+"message.number.clusters": "<h2><span> # of </span> \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b</h2>",
+"message.number.hosts": "<h2><span> # of </span> \u0423\u0437\u043b\u044b</h2>",
+"message.number.pods": "<h2><span> # of </span> \u0421\u0442\u0435\u043d\u0434\u044b</h2>",
+"message.number.storage": "<h2><span> # of </span> \u0422\u043e\u043c\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430</h2>",
+"message.number.zones": "<h2><span> # of </span> \u0417\u043e\u043d\u044b</h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"message.password.has.been.reset.to": "\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d \u0432",
+"message.password.of.the.vm.has.been.reset.to": "Password of the VM has been reset to",
+"message.pending.projects.1": "\u0412 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f:",
+"message.pending.projects.2": "\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0435\u043d\u044e.",
+"message.please.add.at.lease.one.traffic.range": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430",
+"message.please.confirm.remove.ssh.key.pair": "Please confirm that you want to remove this SSH Key Pair",
+"message.please.proceed": "\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443",
+"message.please.select.a.configuration.for.your.zone": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b",
+"message.please.select.a.different.public.and.management.network.before.removing": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c",
+"message.please.select.networks": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b",
+"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": "\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043e\u043d\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f...",
+"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": "\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e; \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f.",
+"message.public.traffic.in.advanced.zone": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0412\u041c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 IP \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CloudStack UI \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f IP \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f NAT, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e. <br/><br/>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0442\u0440\u0430\u0444\u0438\u043a\u0430.",
+"message.public.traffic.in.basic.zone": "\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0412\u041c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0441\u043b\u0443\u0436\u0431 \u0447\u0435\u0440\u0435\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442.  \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 IP \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0412\u041c, \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 Ip \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u0442\u0441\u044f \u043a \u043c\u0430\u0448\u0438\u043d\u0435 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 IP. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 1-1 NAT \u0434\u043e\u043b\u0436\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u044c\u044e. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CloudStack UI \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e NAT \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e.",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0412\u041c",
+"message.redirecting.region": "\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0433\u0438\u043e\u043d",
+"message.reinstall.vm": "\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: C\u043e\u0431\u043b\u044e\u0434\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c.  \u0412\u041c \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430; \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f, \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b.",
+"message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
+"message.remove.region": "\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u0433\u0438\u043e\u043d \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f?",
+"message.remove.vpc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 VPC",
+"message.remove.vpn.access": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e.",
+"message.removed.ssh.key.pair": "Removed a SSH Key Pair",
+"message.reset.password.warning.notpasswordenabled": "\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u043d \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f",
+"message.reset.password.warning.notstopped": "\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443",
+"message.reset.vpn.connection": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.",
+"message.restart.mgmt.server": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440(\u044b) \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 \u0441\u0438\u043b\u0443.",
+"message.restart.mgmt.usage.server": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0441\u0438\u043b\u0443.",
+"message.restart.network": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0442\u044c.",
+"message.restart.vpc": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c 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.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <strong>Ctrl-click</strong> \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0445 security groups)",
+"message.select.a.zone": "\u0417\u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u0446\u0435\u043d\u0442\u0440\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043e\u043d \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c.",
+"message.select.affinity.groups": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043b\u044e\u0431\u044b\u0435 affinity groups, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430:",
+"message.select.instance": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440.",
+"message.select.iso": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 ISO \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c",
+"message.select.item": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+"message.select.security.groups": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0443(\u044b) \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c",
+"message.select.template": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c",
+"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": "\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u043e\u043d\u044b, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u041a\u0430\u043a\u0436\u0434\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<br/><br/><strong>\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430</strong> \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438.",
+"message.setup.physical.network.during.zone.creation.basic": "\u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0437\u043e\u043d\u0443, \u0432\u044b \u043c\u043e\u0436\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u0435\u0442 NIC \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440. \u0421\u0435\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<br/><br/>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c <strong>drag and drop</strong> \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0442\u0438.",
+"message.setup.successful": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u043b\u0430\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!",
+"message.specifiy.tag.key.value": "Please specify a tag key and value",
+"message.specify.url": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 URL",
+"message.step.1.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0412\u044b \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 ISO.",
+"message.step.2.continue": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f",
+"message.step.3.continue": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f",
+"message.step.4.continue": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.",
+"message.step.4.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0412\u0430\u0448\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430.",
+"message.storage.traffic": "\u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 CloudStack, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0443\u0437\u043b\u044b \u0438 CloudStack \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c.",
+"message.suspend.project": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442?",
+"message.systems.vms.ready": "System VMs ready.",
+"message.template.copying": "Template is being copied.",
+"message.template.desc": "\u041e\u0431\u0440\u0430\u0437 \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0439 \u0432 \u0412\u041c",
+"message.template.iso": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u043b\u0438 ISO \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.",
+"message.tier.required": "Tier is required",
+"message.tooltip.dns.1": "\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
+"message.tooltip.dns.2": "\u0418\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
+"message.tooltip.internal.dns.1": "\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0412\u041c CloudStack \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
+"message.tooltip.internal.dns.2": "\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0412\u041c CloudStack \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.",
+"message.tooltip.network.domain": "\u0421\u0443\u0444\u0444\u0438\u043a\u0441 DNS \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u0442\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u043c\u0438 \u0412\u041c.",
+"message.tooltip.pod.name": "\u0418\u043c\u044f \u0434\u043b\u044f \u0441\u0442\u0435\u043d\u0434\u0430",
+"message.tooltip.reserved.system.gateway": "\u0428\u043b\u044e\u0437 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430",
+"message.tooltip.reserved.system.netmask": "\u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0441\u0435\u0442\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u044c \u0441\u0442\u0435\u043d\u0434\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CIDR.",
+"message.tooltip.zone.name": "\u0418\u043c\u044f \u0434\u043b\u044f \u0437\u043e\u043d\u044b",
+"message.update.os.preference": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u041e\u0421 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u041e\u0421 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435.",
+"message.update.resource.count": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430.",
+"message.update.ssl": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0432\u044c\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 X.509 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f:",
+"message.update.ssl.failed": "Failed to update SSL Certificate.",
+"message.update.ssl.succeeded": "Update SSL Certificates succeeded",
+"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": "\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u0438\u043d\u0435\u0435 63 \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u0422\u043e\u043b\u044c\u043a\u043e ASCII, \u0431\u0443\u043a\u0432\u044b a~z, A~Z, \u0446\u044b\u0444\u0440\u044b 0~9, \u0434\u0435\u0444\u0438\u0441 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0414\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u043a\u0432\u043e\u0439 \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u043e\u0439.",
+"message.validate.invalid.characters": "\u041d\u0430\u0439\u0434\u0435\u043d\u044b \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b; \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u0430\u0432\u044c\u0442\u0435.",
+"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.validate.url": "Please enter a valid URL.",
+"message.virtual.network.desc": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u0428\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d \u0412\u0430\u0448\u0435\u0433\u043e VLAN \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c.",
+"message.vm.create.template.confirm": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u0438\u0440\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b",
+"message.vm.review.launch": "\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.",
+"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": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043c\u0430.  \u042d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u043e\u043c\u0430.",
+"message.waiting.for.builtin.templates.to.load": "Waiting for builtin templates to load...",
+"message.xstools61plus.update.failed": "Failed to update Original XS Version is 6.1+ field. Error:",
+"message.you.must.have.at.least.one.physical.network": "\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c",
+"message.your.cloudstack.is.ready": "Your CloudStack is ready!",
+"message.zone.creation.complete": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u0425\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443?",
+"message.zone.no.network.selection": "\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0435\u0442\u0438.",
+"message.zone.step.1.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b.",
+"message.zone.step.2.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u043e\u043d\u044b",
+"message.zone.step.3.desc": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0421\u0442\u0435\u043d\u0434\u0430",
+"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}.",
+"network.rate": "\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438",
+"side.by.side": "\u0411\u043e\u043a-\u043e-\u0411\u043e\u043a",
+"state.accepted": "\u041f\u0440\u0438\u043d\u044f\u0442\u043e",
+"state.active": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d",
+"state.allocating": "\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435",
+"state.backedup": "\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e",
+"state.backingup": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435",
+"state.completed": "\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e",
+"state.creating": "\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f",
+"state.declined": "\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e",
+"state.destroyed": "\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043e",
+"state.detached": "\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e",
+"state.disabled": "\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e",
+"state.enabled": "\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e",
+"state.error": "\u041e\u0448\u0438\u0431\u043a\u0430",
+"state.expunging": "\u0423\u0434\u0430\u043b\u0451\u043d",
+"state.migrating": "\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f",
+"state.pending": "\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f",
+"state.running": "\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043e",
+"state.starting": "\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f",
+"state.stopped": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e",
+"state.stopping": "\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c",
+"state.suspended": "\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e",
+"title.upload.volume": "Upload Volume"
+}
\ No newline at end of file
diff --git a/ui/public/locales/zh_CN.json b/ui/public/locales/zh_CN.json
new file mode 100644
index 0000000..511a048
--- /dev/null
+++ b/ui/public/locales/zh_CN.json
@@ -0,0 +1,2367 @@
+{
+"changed.item.properties": "\u66f4\u6539\u9879\u76ee\u5c5e\u6027",
+"confirm.enable.s3": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8\u7684\u652f\u6301",
+"confirm.enable.swift": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 SWIFT \u7684\u652f\u6301",
+"error.could.not.change.your.password.because.non.native.user": "\u9519\u8bef\u3002LDAP \u5904\u4e8e\u542f\u7528\u72b6\u6001\uff0c\u65e0\u6cd5\u66f4\u6539\u60a8\u7684\u5bc6\u7801\u3002",
+"error.could.not.enable.zone": "\u65e0\u6cd5\u542f\u7528\u8d44\u6e90\u57df",
+"error.installwizard.message": "\u51fa\u73b0\u95ee\u9898\uff1b\u8bf7\u8fd4\u56de\u5e76\u66f4\u6b63\u4efb\u4f55\u9519\u8bef",
+"error.invalid.username.password": "\u7528\u6237\u540d\u6216\u5bc6\u7801\u65e0\u6548",
+"error.login": "\u60a8\u7684\u7528\u6237\u540d/\u5bc6\u7801\u4e0e\u6211\u4eec\u7684\u8bb0\u5f55\u4e0d\u4e00\u81f4\u3002",
+"error.menu.select": "\u6b63\u5728\u9009\u62e9\u9879\u76ee\uff0c\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002",
+"error.mgmt.server.inaccessible": "\u65e0\u6cd5\u8bbf\u95ee\u7ba1\u7406\u670d\u52a1\u5668\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002",
+"error.password.not.match": "\u5bc6\u7801\u5b57\u6bb5\u4e0d\u4e00\u81f4",
+"error.please.specify.physical.network.tags": "\u7f51\u7edc\u65b9\u6848\u5728\u60a8\u4e3a\u6b64\u7269\u7406\u7f51\u7edc\u6307\u5b9a\u6807\u7b7e\u4e4b\u540e\u624d\u53ef\u7528\u3002",
+"error.session.expired": "\u60a8\u7684\u4f1a\u8bdd\u5df2\u8fc7\u671f\u3002",
+"error.unable.to.reach.management.server": "\u65e0\u6cd5\u8bbf\u95ee\u7ba1\u7406\u670d\u52a1\u5668",
+"error.unresolved.internet.name": "\u65e0\u6cd5\u89e3\u6790\u60a8\u7684 Internet \u540d\u79f0\u3002",
+"force.delete.domain.warning": "\u8b66\u544a: \u9009\u62e9\u6b64\u9009\u9879\u5c06\u5bfc\u81f4\u5220\u9664\u6240\u6709\u5b50\u57df\u4ee5\u53ca\u6240\u6709\u76f8\u5173\u8054\u7684\u5e10\u6237\u53ca\u5176\u8d44\u6e90\u3002",
+"force.remove": "\u5f3a\u5236\u79fb\u9664",
+"force.remove.host.warning": "\u8b66\u544a: \u9009\u62e9\u6b64\u9009\u9879\u5c06\u5bfc\u81f4 CloudStack \u5728\u4ece\u7fa4\u96c6\u4e2d\u79fb\u9664\u6b64\u4e3b\u673a\u4e4b\u524d\uff0c\u5f3a\u5236\u505c\u6b62\u6240\u6709\u6b63\u5728\u8fd0\u884c\u7684\u865a\u62df\u673a\u3002",
+"force.stop": "\u5f3a\u5236\u505c\u6b62",
+"force.stop.instance.warning": "\u8b66\u544a: \u9664\u975e\u4e07\u4e0d\u5f97\u5df2\uff0c\u5426\u5219\u4e0d\u5e94\u5f3a\u5236\u505c\u6b62\u6b64\u5b9e\u4f8b\u3002\u505c\u6b62\u6b64\u5b9e\u4f8b\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u4ee5\u53ca\u81f4\u4f7f\u865a\u62df\u673a\u72b6\u6001\u4e0d\u4e00\u81f4\u3002",
+"hint.no.host.tags": "\u672a\u627e\u5230\u4e3b\u673a\u6807\u7b7e",
+"hint.no.storage.tags": "\u672a\u627e\u5230\u5b58\u50a8\u6807\u7b7e",
+"hint.type.part.host.tag": "\u4e3b\u673a\u6807\u7b7e\u7c7b\u578b",
+"hint.type.part.storage.tag": "\u5b58\u50a8\u6807\u8bb0\u7c7b\u578b",
+"icmp.code.desc": "Please specify -1 if you want to allow all ICMP codes",
+"icmp.type.desc": "Please specify -1 if you want to allow all ICMP types.",
+"image.directory": "\u56fe\u7247\u76ee\u5f55",
+"inline": "\u5185\u8054",
+"label.about": "\u5173\u4e8e",
+"label.about.app": "\u5173\u4e8e CloudStack",
+"label.accept.project.invitation": "\u63a5\u53d7\u9879\u76ee\u9080\u8bf7",
+"label.accesskey": "\u8bbf\u95ee\u5bc6\u94a5",
+"label.account": "\u5e10\u6237",
+"label.account.and.security.group": "\u5e10\u6237\u3001\u5b89\u5168\u7ec4",
+"label.account.details": "\u8d26\u53f7\u8be6\u60c5",
+"label.account.id": "\u5e10\u6237 ID",
+"label.account.name": "\u5e10\u6237\u540d\u79f0",
+"label.account.specific": "\u5e10\u6237\u4e13\u7528",
+"label.accounts": "\u5e10\u6237",
+"label.accounttype": "\u5e10\u53f7\u7c7b\u578b",
+"label.acl.export": "Export ACLs",
+"label.acl.id": "ACL ID",
+"label.acl.list.rules": "ACL\u5217\u8868\u7b56\u7565",
+"label.acl.reason.description": "Enter the reason behind an ACL rule.",
+"label.acl.replaced": "ACL \u5df2\u66ff\u6362",
+"label.aclid": "ACL",
+"label.aclname": "ACL \u540d\u79f0",
+"label.acltotal": "\u7f51\u7edc ACL \u603b\u6570",
+"label.acquire.new.ip": "\u83b7\u53d6\u65b0 IP",
+"label.acquire.new.secondary.ip": "\u83b7\u53d6\u65b0\u4e8c\u7ea7 IP",
+"label.action": "\u64cd\u4f5c",
+"label.action.attach.disk": "\u9644\u52a0\u78c1\u76d8",
+"label.action.attach.disk.processing": "\u6b63\u5728\u9644\u52a0\u78c1\u76d8...",
+"label.action.attach.iso": "\u9644\u52a0 ISO",
+"label.action.attach.iso.processing": "\u6b63\u5728\u9644\u52a0 ISO...",
+"label.action.cancel.maintenance.mode": "\u53d6\u6d88\u7ef4\u62a4\u6a21\u5f0f",
+"label.action.cancel.maintenance.mode.processing": "\u6b63\u5728\u53d6\u6d88\u7ef4\u62a4\u6a21\u5f0f...",
+"label.action.change.password": "\u66f4\u6539\u5bc6\u7801",
+"label.action.change.service": "\u66f4\u6539\u670d\u52a1",
+"label.action.change.service.processing": "\u6b63\u5728\u66f4\u6539\u670d\u52a1...",
+"label.action.configure.samlauthorization": "\u914d\u7f6e SAML SSO \u8ba4\u8bc1",
+"label.action.configure.stickiness": "\u7c98\u6027",
+"label.action.copy.iso": "\u590d\u5236 ISO",
+"label.action.copy.iso.processing": "\u6b63\u5728\u590d\u5236ISO\u955c\u50cf",
+"label.action.copy.template": "\u590d\u5236\u6a21\u677f",
+"label.action.copy.template.processing": "\u6b63\u5728\u590d\u5236\u6a21\u677f",
+"label.action.create.template.from.vm": "\u57fa\u4e8e VM \u521b\u5efa\u6a21\u677f",
+"label.action.create.template.from.volume": "\u57fa\u4e8e\u5377\u521b\u5efa\u6a21\u677f",
+"label.action.create.template.processing": "\u6b63\u5728\u521b\u5efa\u6a21\u677f...",
+"label.action.create.vm": "\u521b\u5efa VM",
+"label.action.create.vm.processing": "\u6b63\u5728\u521b\u5efa VM...",
+"label.action.create.volume": "\u521b\u5efa\u5377",
+"label.action.create.volume.processing": "\u6b63\u5728\u521b\u5efa\u5377...",
+"label.action.delete.account": "\u5220\u9664\u5e10\u6237",
+"label.action.delete.account.processing": "\u6b63\u5728\u5220\u9664\u5e10\u6237...",
+"label.action.delete.cluster": "\u5220\u9664\u7fa4\u96c6",
+"label.action.delete.cluster.processing": "\u6b63\u5728\u5220\u9664\u7fa4\u96c6...",
+"label.action.delete.disk.offering": "\u5220\u9664\u78c1\u76d8\u65b9\u6848",
+"label.action.delete.disk.offering.processing": "\u6b63\u5728\u5220\u9664\u78c1\u76d8\u65b9\u6848...",
+"label.action.delete.domain": "\u5220\u9664\u57df",
+"label.action.delete.domain.processing": "\u6b63\u5728\u5220\u9664\u57df...",
+"label.action.delete.firewall": "\u5220\u9664\u9632\u706b\u5899\u89c4\u5219",
+"label.action.delete.firewall.processing": "\u6b63\u5728\u5220\u9664\u9632\u706b\u5899...",
+"label.action.delete.ingress.rule": "\u5220\u9664\u5165\u53e3\u89c4\u5219",
+"label.action.delete.ingress.rule.processing": "\u6b63\u5728\u5220\u9664\u5165\u53e3\u89c4\u5219...",
+"label.action.delete.ip.range": "\u5220\u9664 IP \u8303\u56f4",
+"label.action.delete.ip.range.processing": "\u6b63\u5728\u5220\u9664 IP \u8303\u56f4...",
+"label.action.delete.iso": "\u5220\u9664 ISO",
+"label.action.delete.iso.processing": "\u6b63\u5728\u5220\u9664 ISO...",
+"label.action.delete.load.balancer": "\u5220\u9664\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219",
+"label.action.delete.load.balancer.processing": "\u6b63\u5728\u5220\u9664\u8d1f\u8f7d\u5e73\u8861\u5668...",
+"label.action.delete.network": "\u5220\u9664\u7f51\u7edc",
+"label.action.delete.network.processing": "\u6b63\u5728\u5220\u9664\u7f51\u7edc...",
+"label.action.delete.nexusvswitch": "\u5220\u9664 Nexus 1000v",
+"label.action.delete.nic": "\u79fb\u9664 NIC",
+"label.action.delete.physical.network": "\u5220\u9664\u7269\u7406\u7f51\u7edc",
+"label.action.delete.pod": "\u5220\u9664\u63d0\u4f9b\u70b9",
+"label.action.delete.pod.processing": "\u6b63\u5728\u5220\u9664\u63d0\u4f9b\u70b9...",
+"label.action.delete.primary.storage": "\u5220\u9664\u4e3b\u5b58\u50a8",
+"label.action.delete.primary.storage.processing": "\u6b63\u5728\u5220\u9664\u4e3b\u5b58\u50a8...",
+"label.action.delete.secondary.storage": "\u5220\u9664\u4e8c\u7ea7\u5b58\u50a8",
+"label.action.delete.secondary.storage.processing": "\u6b63\u5728\u5220\u9664\u4e8c\u7ea7\u5b58\u50a8...",
+"label.action.delete.security.group": "\u5220\u9664\u5b89\u5168\u7ec4",
+"label.action.delete.security.group.processing": "\u6b63\u5728\u5220\u9664\u5b89\u5168\u7ec4...",
+"label.action.delete.service.offering": "\u5220\u9664\u670d\u52a1\u65b9\u6848",
+"label.action.delete.service.offering.processing": "\u6b63\u5728\u5220\u9664\u670d\u52a1\u65b9\u6848...",
+"label.action.delete.snapshot": "\u5220\u9664\u5feb\u7167",
+"label.action.delete.snapshot.processing": "\u6b63\u5728\u5220\u9664\u5feb\u7167...",
+"label.action.delete.system.service.offering": "\u5220\u9664\u7cfb\u7edf\u670d\u52a1\u65b9\u6848",
+"label.action.delete.template": "\u5220\u9664\u6a21\u677f",
+"label.action.delete.template.processing": "\u6b63\u5728\u5220\u9664\u6a21\u677f...",
+"label.action.delete.user": "\u5220\u9664\u7528\u6237",
+"label.action.delete.user.processing": "\u6b63\u5728\u5220\u9664\u7528\u6237...",
+"label.action.delete.volume": "\u5220\u9664\u5377",
+"label.action.delete.volume.processing": "\u6b63\u5728\u5220\u9664\u5377...",
+"label.action.delete.zone": "\u5220\u9664\u8d44\u6e90\u57df",
+"label.action.delete.zone.processing": "\u6b63\u5728\u5220\u9664\u8d44\u6e90\u57df...",
+"label.action.destroy.instance": "\u9500\u6bc1\u5b9e\u4f8b",
+"label.action.destroy.instance.processing": "\u6b63\u5728\u9500\u6bc1\u5b9e\u4f8b...",
+"label.action.destroy.systemvm": "\u9500\u6bc1\u7cfb\u7edf VM",
+"label.action.destroy.systemvm.processing": "\u6b63\u5728\u9500\u6bc1\u7cfb\u7edf VM...",
+"label.action.destroy.volume": "\u9500\u6bc1\u5377",
+"label.action.detach.disk": "\u53d6\u6d88\u9644\u52a0\u78c1\u76d8",
+"label.action.detach.disk.processing": "\u6b63\u5728\u53d6\u6d88\u9644\u52a0\u78c1\u76d8...",
+"label.action.detach.iso": "\u53d6\u6d88\u9644\u52a0 ISO",
+"label.action.detach.iso.processing": "\u6b63\u5728\u53d6\u6d88\u9644\u52a0 ISO...",
+"label.action.disable.account": "\u7981\u7528\u5e10\u6237",
+"label.action.disable.account.processing": "\u6b63\u5728\u7981\u7528\u5e10\u6237...",
+"label.action.disable.cluster": "\u7981\u7528\u7fa4\u96c6",
+"label.action.disable.cluster.processing": "\u6b63\u5728\u7981\u7528\u7fa4\u96c6...",
+"label.action.disable.nexusvswitch": "\u7981\u7528 Nexus 1000v",
+"label.action.disable.physical.network": "\u7981\u7528\u7269\u7406\u7f51\u7edc",
+"label.action.disable.pod": "\u7981\u7528\u63d0\u4f9b\u70b9",
+"label.action.disable.pod.processing": "\u6b63\u5728\u7981\u7528\u63d0\u4f9b\u70b9...",
+"label.action.disable.static.nat": "\u7981\u7528\u9759\u6001 NAT",
+"label.action.disable.static.nat.processing": "\u6b63\u5728\u7981\u7528\u9759\u6001 NAT...",
+"label.action.disable.user": "\u7981\u7528\u7528\u6237",
+"label.action.disable.user.processing": "\u6b63\u5728\u7981\u7528\u7528\u6237...",
+"label.action.disable.zone": "\u7981\u7528\u8d44\u6e90\u57df",
+"label.action.disable.zone.processing": "\u6b63\u5728\u7981\u7528\u8d44\u6e90\u57df...",
+"label.action.download.iso": "\u4e0b\u8f7d ISO",
+"label.action.download.template": "\u4e0b\u8f7d\u6a21\u677f",
+"label.action.download.volume": "\u4e0b\u8f7d\u5377",
+"label.action.download.volume.processing": "\u6b63\u5728\u4e0b\u8f7d\u5377...",
+"label.action.edit.account": "\u7f16\u8f91\u5e10\u6237",
+"label.action.edit.disk.offering": "\u7f16\u8f91\u78c1\u76d8\u65b9\u6848",
+"label.action.edit.domain": "\u7f16\u8f91\u57df",
+"label.action.edit.global.setting": "\u7f16\u8f91\u5168\u5c40\u8bbe\u7f6e",
+"label.action.edit.host": "\u7f16\u8f91\u4e3b\u673a",
+"label.action.edit.instance": "\u7f16\u8f91\u5b9e\u4f8b",
+"label.action.edit.iso": "\u7f16\u8f91 ISO",
+"label.action.edit.network": "\u7f16\u8f91\u7f51\u7edc",
+"label.action.edit.network.offering": "\u7f16\u8f91\u7f51\u7edc\u65b9\u6848",
+"label.action.edit.network.processing": "\u6b63\u5728\u7f16\u8f91\u7f51\u7edc...",
+"label.action.edit.pod": "\u7f16\u8f91\u63d0\u4f9b\u70b9",
+"label.action.edit.primary.storage": "\u7f16\u8f91\u4e3b\u5b58\u50a8",
+"label.action.edit.resource.limits": "\u7f16\u8f91\u8d44\u6e90\u9650\u5236",
+"label.action.edit.service.offering": "\u7f16\u8f91\u670d\u52a1\u65b9\u6848",
+"label.action.edit.template": "\u7f16\u8f91\u6a21\u677f",
+"label.action.edit.user": "\u7f16\u8f91\u7528\u6237",
+"label.action.edit.zone": "\u7f16\u8f91\u8d44\u6e90\u57df",
+"label.action.enable.account": "\u542f\u7528\u5e10\u6237",
+"label.action.enable.account.processing": "\u6b63\u5728\u542f\u7528\u5e10\u6237...",
+"label.action.enable.cluster": "\u542f\u7528\u7fa4\u96c6",
+"label.action.enable.cluster.processing": "\u6b63\u5728\u542f\u7528\u7fa4\u96c6...",
+"label.action.enable.maintenance.mode": "\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f",
+"label.action.enable.maintenance.mode.processing": "\u6b63\u5728\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f...",
+"label.action.enable.nexusvswitch": "\u542f\u7528 Nexus 1000v",
+"label.action.enable.physical.network": "\u542f\u7528\u7269\u7406\u7f51\u7edc",
+"label.action.enable.pod": "\u542f\u7528\u63d0\u4f9b\u70b9",
+"label.action.enable.pod.processing": "\u6b63\u5728\u542f\u7528\u63d0\u4f9b\u70b9...",
+"label.action.enable.static.nat": "\u542f\u7528\u9759\u6001 NAT",
+"label.action.enable.static.nat.processing": "\u6b63\u5728\u542f\u7528\u9759\u6001 NAT...",
+"label.action.enable.user": "\u542f\u7528\u7528\u6237",
+"label.action.enable.user.processing": "\u6b63\u5728\u542f\u7528\u7528\u6237...",
+"label.action.enable.zone": "\u542f\u7528\u8d44\u6e90\u57df",
+"label.action.enable.zone.processing": "\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df...",
+"label.action.expunge.instance": "\u5220\u9664\u5b9e\u4f8b",
+"label.action.expunge.instance.processing": "\u6b63\u5728\u5220\u9664\u5b9e\u4f8b...",
+"label.action.force.reconnect": "\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5",
+"label.action.force.reconnect.processing": "\u6b63\u5728\u91cd\u65b0\u8fde\u63a5...",
+"label.action.generate.keys": "\u751f\u6210\u5bc6\u94a5",
+"label.action.generate.keys.processing": "\u6b63\u5728\u751f\u6210\u5bc6\u94a5...",
+"label.action.list.nexusvswitch": "\u5217\u51fa Nexus 1000v",
+"label.action.lock.account": "\u9501\u5b9a\u5e10\u6237",
+"label.action.lock.account.processing": "\u6b63\u5728\u9501\u5b9a\u5e10\u6237...",
+"label.action.manage.cluster": "\u6258\u7ba1\u7fa4\u96c6",
+"label.action.manage.cluster.processing": "\u6b63\u5728\u6258\u7ba1\u7fa4\u96c6...",
+"label.action.migrate.instance": "\u8fc1\u79fb\u5b9e\u4f8b",
+"label.action.migrate.instance.processing": "\u6b63\u5728\u8fc1\u79fb\u5b9e\u4f8b...",
+"label.action.migrate.router": "\u8fc1\u79fb\u8def\u7531\u5668",
+"label.action.migrate.router.processing": "\u6b63\u5728\u8fc1\u79fb\u8def\u7531\u5668...",
+"label.action.migrate.systemvm": "\u8fc1\u79fb\u7cfb\u7edf VM",
+"label.action.migrate.systemvm.processing": "\u6b63\u5728\u8fc1\u79fb\u7cfb\u7edf VM...",
+"label.action.project.add.account": "\u5411\u9879\u76ee\u4e2d\u6dfb\u52a0\u5e10\u6237",
+"label.action.reboot.instance": "\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b",
+"label.action.reboot.instance.processing": "\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b...",
+"label.action.reboot.router": "\u91cd\u65b0\u542f\u52a8\u8def\u7531\u5668",
+"label.action.reboot.router.processing": "\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u8def\u7531\u5668...",
+"label.action.reboot.systemvm": "\u91cd\u65b0\u542f\u52a8\u7cfb\u7edf VM",
+"label.action.reboot.systemvm.processing": "\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u7cfb\u7edf VM...",
+"label.action.recover.volume": "\u6062\u590d\u5377",
+"label.action.recurring.snapshot": "\u91cd\u73b0\u5feb\u7167",
+"label.action.register.iso": "\u6ce8\u518c ISO",
+"label.action.register.template": "\u4f7f\u7528URL\u6ce8\u518c\u6a21\u677f",
+"label.action.release.ip": "\u91ca\u653e IP",
+"label.action.release.ip.processing": "\u6b63\u5728\u91ca\u653e IP...",
+"label.action.remove.host": "\u5220\u9664\u4e3b\u673a",
+"label.action.remove.host.processing": "\u6b63\u5728\u5220\u9664\u4e3b\u673a...",
+"label.action.reset.password": "\u91cd\u7f6e\u5bc6\u7801",
+"label.action.reset.password.processing": "\u6b63\u5728\u91cd\u7f6e\u5bc6\u7801...",
+"label.action.resize.volume": "\u8c03\u6574\u5377\u5927\u5c0f",
+"label.action.resize.volume.processing": "\u6b63\u5728\u8c03\u6574\u5377\u5927\u5c0f....",
+"label.action.resource.limits": "\u8d44\u6e90\u9650\u5236",
+"label.action.restore.instance": "\u8fd8\u539f\u5b9e\u4f8b",
+"label.action.restore.instance.processing": "\u6b63\u5728\u8fd8\u539f\u5b9e\u4f8b...",
+"label.action.revert.snapshot": "\u8fd8\u539f\u5230\u5feb\u7167",
+"label.action.revert.snapshot.processing": "\u6b63\u5728\u8fd8\u539f\u5230\u5feb\u7167...",
+"label.action.start.instance": "\u542f\u52a8\u5b9e\u4f8b",
+"label.action.start.instance.processing": "\u6b63\u5728\u542f\u52a8\u5b9e\u4f8b...",
+"label.action.start.router": "\u542f\u52a8\u8def\u7531\u5668",
+"label.action.start.router.processing": "\u6b63\u5728\u542f\u52a8\u8def\u7531\u5668...",
+"label.action.start.systemvm": "\u542f\u52a8\u7cfb\u7edf VM",
+"label.action.start.systemvm.processing": "\u6b63\u5728\u542f\u52a8\u7cfb\u7edf VM...",
+"label.action.stop.instance": "\u505c\u6b62\u5b9e\u4f8b",
+"label.action.stop.instance.processing": "\u6b63\u5728\u505c\u6b62\u5b9e\u4f8b...",
+"label.action.stop.router": "\u505c\u6b62\u8def\u7531\u5668",
+"label.action.stop.router.processing": "\u6b63\u5728\u505c\u6b62\u8def\u7531\u5668...",
+"label.action.stop.systemvm": "\u505c\u6b62\u7cfb\u7edf VM",
+"label.action.stop.systemvm.processing": "\u6b63\u5728\u505c\u6b62\u7cfb\u7edf VM...",
+"label.action.take.snapshot": "\u521b\u5efa\u5feb\u7167",
+"label.action.take.snapshot.processing": "\u6b63\u5728\u521b\u5efa\u5feb\u7167...",
+"label.action.unmanage.cluster": "\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6",
+"label.action.unmanage.cluster.processing": "\u6b63\u5728\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6...",
+"label.action.update.os.preference": "\u66f4\u65b0\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879",
+"label.action.update.os.preference.processing": "\u6b63\u5728\u66f4\u65b0\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879...",
+"label.action.update.resource.count": "\u66f4\u65b0\u8d44\u6e90\u6570\u91cf",
+"label.action.update.resource.count.processing": "\u6b63\u5728\u66f4\u65b0\u8d44\u6e90\u6570\u91cf...",
+"label.action.vmsnapshot.create": "\u521b\u5efa VM \u5feb\u7167",
+"label.action.vmsnapshot.delete": "\u5220\u9664 VM \u5feb\u7167",
+"label.action.vmsnapshot.revert": "\u8fd8\u539f\u5230 VM \u5feb\u7167",
+"label.actions": "\u64cd\u4f5c",
+"label.activate.project": "\u6fc0\u6d3b\u9879\u76ee",
+"label.activeviewersessions": "\u6d3b\u52a8\u4f1a\u8bdd",
+"label.add": "\u6dfb\u52a0",
+"label.add.account": "\u6dfb\u52a0\u5e10\u6237",
+"label.add.accounts": "\u6dfb\u52a0\u5e10\u6237",
+"label.add.accounts.to": "\u6dfb\u52a0\u5e10\u6237\u81f3",
+"label.add.acl": "\u6dfb\u52a0 ACL",
+"label.add.acl.list": "\u6dfb\u52a0 ACL \u5217\u8868",
+"label.add.affinity.group": "\u6dfb\u52a0\u65b0\u5173\u8054\u6027\u7ec4",
+"label.add.baremetal.dhcp.device": "\u6dfb\u52a0\u88f8\u673a DHCP \u8bbe\u5907",
+"label.add.baremetal.rack.configuration": "\u6dfb\u52a0 Baremetal Rack \u914d\u7f6e",
+"label.add.bigswitchbcf.device": "\u6dfb\u52a0 BigSwitch BCF \u63a7\u5236\u5668",
+"label.add.brocadevcs.device": "\u6dfb\u52a0 Brocade Vcs \u4ea4\u6362\u673a",
+"label.add.by": "\u6dfb\u52a0\u65b9\u5f0f",
+"label.add.by.cidr": "\u6309 CIDR \u6dfb\u52a0",
+"label.add.by.group": "\u6309\u7ec4\u6dfb\u52a0",
+"label.add.ciscoasa1000v": "\u6dfb\u52a0 CiscoASA1000v \u8d44\u6e90",
+"label.add.cluster": "\u6dfb\u52a0\u7fa4\u96c6",
+"label.add.compute.offering": "\u6dfb\u52a0\u8ba1\u7b97\u65b9\u6848",
+"label.add.direct.iprange": "\u6dfb\u52a0\u76f4\u63a5 IP \u8303\u56f4",
+"label.add.disk.offering": "\u6dfb\u52a0\u78c1\u76d8\u65b9\u6848",
+"label.add.domain": "\u6dfb\u52a0\u57df",
+"label.add.egress.rule": "\u6dfb\u52a0\u51fa\u53e3\u89c4\u5219",
+"label.add.f5.device": "\u6dfb\u52a0 F5 \u8bbe\u5907",
+"label.add.firewall": "\u6dfb\u52a0\u9632\u706b\u5899\u89c4\u5219",
+"label.add.globo.dns": "\u6dfb\u52a0\u5168\u5c40DNS",
+"label.add.gslb": "\u6dfb\u52a0 GSLB",
+"label.add.guest.network": "\u6dfb\u52a0\u6765\u5bbe\u7f51\u7edc",
+"label.add.host": "\u6dfb\u52a0\u4e3b\u673a",
+"label.add.ingress.rule": "\u6dfb\u52a0\u5165\u53e3\u89c4\u5219",
+"label.add.intermediate.certificate": "\u6dfb\u52a0\u4e2d\u95f4\u8bc1\u4e66",
+"label.add.internal.lb": "\u6dfb\u52a0\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.add.ip.range": "\u6dfb\u52a0 IP \u8303\u56f4",
+"label.add.isolated.guest.network": "\u6dfb\u52a0\u9694\u79bb\u7684\u6765\u5bbe\u7f51\u7edc",
+"label.add.isolated.guest.network.with.sourcenat": "\u6dfb\u52a0\u9694\u79bb\u7684\u6765\u5bbe\u7f51\u7edc\u5e76\u542f\u7528 SourceNat",
+"label.add.isolated.network": "\u6dfb\u52a0\u9694\u79bb\u7f51\u7edc",
+"label.add.l2.guest.network": "Add L2 Guest Network",
+"label.add.ldap.account": "\u6dfb\u52a0 LDAP \u8d26\u6237",
+"label.add.list.name": "ACL \u5217\u8868\u540d\u79f0",
+"label.add.load.balancer": "\u6dfb\u52a0\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.add.more": "\u6dfb\u52a0\u66f4\u591a",
+"label.add.netscaler.device": "\u6dfb\u52a0 Netscaler \u8bbe\u5907",
+"label.add.network": "\u6dfb\u52a0\u7f51\u7edc",
+"label.add.network.acl": "\u6dfb\u52a0\u7f51\u7edc ACL",
+"label.add.network.acl.list": "\u6dfb\u52a0\u7f51\u7edc ACL \u5217\u8868",
+"label.add.network.device": "\u6dfb\u52a0\u7f51\u7edc\u8bbe\u5907",
+"label.add.network.offering": "\u6dfb\u52a0\u7f51\u7edc\u65b9\u6848",
+"label.add.new.f5": "\u6dfb\u52a0\u65b0 F5",
+"label.add.new.gateway": "\u6dfb\u52a0\u65b0\u7f51\u5173",
+"label.add.new.netscaler": "\u6dfb\u52a0\u65b0 NetScaler",
+"label.add.new.pa": "\u6dfb\u52a0\u65b0 Palo Alto",
+"label.add.new.srx": "\u6dfb\u52a0\u65b0 SRX",
+"label.add.new.tier": "\u6dfb\u52a0\u65b0\u5c42",
+"label.add.nfs.secondary.staging.store": "\u6dfb\u52a0 NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.add.niciranvp.device": "\u6dfb\u52a0 Nvp \u63a7\u5236\u5668",
+"label.add.opendaylight.device": "\u6dfb\u52a0 OpenDaylight \u63a7\u5236\u5668",
+"label.add.pa.device": "\u6dfb\u52a0 Palo Alto \u8bbe\u5907",
+"label.add.physical.network": "\u6dfb\u52a0\u7269\u7406\u7f51\u7edc",
+"label.add.pod": "\u6dfb\u52a0\u63d0\u4f9b\u70b9",
+"label.add.port.forwarding.rule": "\u6dfb\u52a0\u7aef\u53e3\u8f6c\u53d1\u89c4\u5219",
+"label.add.portable.ip.range": "\u6dfb\u52a0\u53ef\u79fb\u690d IP \u8303\u56f4",
+"label.add.primary.storage": "\u6dfb\u52a0\u4e3b\u5b58\u50a8",
+"label.add.private.gateway": "\u6dfb\u52a0\u79c1\u6709\u7f51\u5173",
+"label.add.region": "\u6dfb\u52a0\u5730\u7406\u533a\u57df",
+"label.add.resources": "\u6dfb\u52a0\u8d44\u6e90",
+"label.add.role": "Add Role",
+"label.add.route": "\u6dfb\u52a0\u8def\u7531",
+"label.add.rule": "\u6dfb\u52a0\u89c4\u5219",
+"label.add.rule.desc": "Create a new ACL rule",
+"label.add.secondary.storage": "\u6dfb\u52a0\u4e8c\u7ea7\u5b58\u50a8",
+"label.add.security.group": "\u6dfb\u52a0\u5b89\u5168\u7ec4",
+"label.add.service.offering": "\u6dfb\u52a0\u670d\u52a1\u65b9\u6848",
+"label.add.srx.device": "\u6dfb\u52a0 SRX \u8bbe\u5907",
+"label.add.static.nat.rule": "\u6dfb\u52a0\u9759\u6001 NAT \u89c4\u5219",
+"label.add.static.route": "\u6dfb\u52a0\u9759\u6001\u8def\u7531",
+"label.add.system.service.offering": "\u6dfb\u52a0\u7cfb\u7edf\u670d\u52a1\u65b9\u6848",
+"label.add.template": "\u6dfb\u52a0\u6a21\u677f",
+"label.add.to.group": "\u6dfb\u52a0\u5230\u7ec4",
+"label.add.ucs.manager": "\u6dfb\u52a0 UCS \u7ba1\u7406\u5668",
+"label.add.user": "\u6dfb\u52a0\u7528\u6237",
+"label.add.vlan": "\u6dfb\u52a0 VLAN",
+"label.add.vm": "\u6dfb\u52a0 VM",
+"label.add.vm.to.tier": "\u5411\u5c42\u4e2d\u6dfb\u52a0 VM",
+"label.add.vms": "\u6dfb\u52a0 VM",
+"label.add.vms.to.lb": "\u5411\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\u4e2d\u6dfb\u52a0 VM",
+"label.add.vmware.datacenter": "\u6dfb\u52a0 VMware \u6570\u636e\u4e2d\u5fc3",
+"label.add.vnmc.device": "\u6dfb\u52a0 VNMC \u8bbe\u5907",
+"label.add.vnmc.provider": "\u6dfb\u52a0 VNMC \u63d0\u4f9b\u7a0b\u5e8f",
+"label.add.volume": "\u6dfb\u52a0\u5377",
+"label.add.vpc": "\u6dfb\u52a0 VPC",
+"label.add.vpc.offering": "\u6dfb\u52a0 VPC \u65b9\u6848",
+"label.add.vpn.customer.gateway": "\u6dfb\u52a0 VPN \u5ba2\u6237\u7f51\u5173",
+"label.add.vpn.gateway": "\u6dfb\u52a0 VPN \u7f51\u5173",
+"label.add.vpn.user": "\u6dfb\u52a0 VPN \u7528\u6237",
+"label.add.vxlan": "\u6dfb\u52a0 VXLAN",
+"label.add.zone": "\u6dfb\u52a0\u8d44\u6e90\u57df",
+"label.added.brocade.vcs.switch": "\u5df2\u6dfb\u52a0\u65b0 Brocade Vcs \u4ea4\u6362\u673a",
+"label.added.network.offering": "\u5df2\u6dfb\u52a0\u7f51\u7edc\u65b9\u6848",
+"label.added.new.bigswitch.bcf.controller": "\u6dfb\u52a0\u65b0\u7684 BigSwitch BCF \u63a7\u5236\u5668",
+"label.added.nicira.nvp.controller": "\u5df2\u6dfb\u52a0\u65b0 Nicira NVP \u63a7\u5236\u5668",
+"label.addes.new.f5": "\u5df2\u6dfb\u52a0\u65b0 F5",
+"label.adding": "\u6b63\u5728\u6dfb\u52a0",
+"label.adding.cluster": "\u6b63\u5728\u6dfb\u52a0\u7fa4\u96c6",
+"label.adding.failed": "\u6dfb\u52a0\u5931\u8d25",
+"label.adding.pod": "\u6b63\u5728\u6dfb\u52a0\u63d0\u4f9b\u70b9",
+"label.adding.processing": "\u6b63\u5728\u6dfb\u52a0...",
+"label.adding.succeeded": "\u5df2\u6210\u529f\u6dfb\u52a0",
+"label.adding.user": "\u6b63\u5728\u6dfb\u52a0\u7528\u6237",
+"label.adding.zone": "\u6b63\u5728\u6dfb\u52a0\u8d44\u6e90\u57df",
+"label.additional.networks": "\u5176\u4ed6\u7f51\u7edc",
+"label.address": "Address",
+"label.admin": "\u7ba1\u7406\u5458",
+"label.admin.accounts": "\u7ba1\u7406\u5458\u5e10\u6237",
+"label.advanced": "\u9ad8\u7ea7",
+"label.advanced.mode": "\u9ad8\u7ea7\u6a21\u5f0f",
+"label.advanced.search": "\u9ad8\u7ea7\u641c\u7d22",
+"label.affinity": "\u5173\u8054\u6027",
+"label.affinity.groups": "\u5173\u8054\u6027\u7ec4",
+"label.affinitygroup": "\u5173\u8054\u6027\u7ec4",
+"label.agent.password": "\u4ee3\u7406\u5bc6\u7801",
+"label.agent.username": "\u4ee3\u7406\u7528\u6237\u540d",
+"label.agentport": "\u4ee3\u7406\u7aef\u53e3",
+"label.agentstate": "\u4ee3\u7406\u72b6\u6001",
+"label.agree": "\u540c\u610f",
+"label.alert": "\u8b66\u62a5",
+"label.alert.archived": "\u8b66\u62a5\u5df2\u5b58\u6863",
+"label.alert.deleted": "\u8b66\u62a5\u5df2\u5220\u9664",
+"label.alert.details": "\u8b66\u62a5\u8be6\u7ec6\u4fe1\u606f",
+"label.alerts": "\u8b66\u62a5",
+"label.algorithm": "\u7b97\u6cd5",
+"label.all": "\u5168\u90e8",
+"label.allocated": "\u5df2\u5206\u914d",
+"label.allocationstate": "\u5206\u914d\u72b6\u6001",
+"label.allow": "\u5141\u8bb8",
+"label.anti.affinity": "\u53cd\u5173\u8054\u6027",
+"label.anti.affinity.group": "\u53cd\u5173\u8054\u6027\u7ec4",
+"label.anti.affinity.groups": "\u53cd\u5173\u8054\u6027\u7ec4",
+"label.api.version": "API \u7248\u672c",
+"label.apikey": "API \u5bc6\u94a5",
+"label.app.name": "CloudStack",
+"label.apply": "\u5e94\u7528",
+"label.archive": "\u5b58\u6863",
+"label.archive.alerts": "\u5b58\u6863\u8b66\u62a5",
+"label.archive.events": "\u5b58\u6863\u4e8b\u4ef6",
+"label.assign": "\u5206\u914d",
+"label.assign.instance.another": "\u5c06\u5b9e\u4f8b\u5206\u914d\u7ed9\u5176\u4ed6\u5e10\u6237",
+"label.assign.to.load.balancer": "\u6b63\u5728\u5c06\u5b9e\u4f8b\u5206\u914d\u7ed9\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.assign.vms": "\u5206\u914d\u5b9e\u4f8b",
+"label.associatednetwork": "\u5173\u8054\u7f51\u7edc",
+"label.associatednetworkid": "\u5df2\u5173\u8054\u7f51\u7edc ID",
+"label.associatednetworkname": "\u7f51\u7edc\u540d\u79f0",
+"label.author.email": "\u4f5c\u8005\u7535\u5b50\u90ae\u4ef6",
+"label.author.name": "\u4f5c\u8005\u59d3\u540d",
+"label.autoscale": "\u81ea\u52a8\u6269\u5c55",
+"label.autoscale.configuration.wizard": "\u81ea\u52a8\u6269\u5c55\u914d\u7f6e\u5411\u5bfc",
+"label.availability": "\u53ef\u7528\u6027",
+"label.availabilityzone": "\u53ef\u7528\u533a\u57df",
+"label.available": "\u53ef\u7528",
+"label.available.public.ips": "\u53ef\u7528\u516c\u7528 IP \u5730\u5740",
+"label.back": "\u540e\u9000",
+"label.balance": "Balance",
+"label.bandwidth": "\u5e26\u5bbd",
+"label.baremetal.dhcp.devices": "\u88f8\u673a DHCP \u8bbe\u5907",
+"label.baremetal.dhcp.provider": "\u88f8\u673a DHCP \u63d0\u4f9b\u7a0b\u5e8f",
+"label.baremetal.pxe.device": "\u6dfb\u52a0\u88f8\u673a PXE \u8bbe\u5907",
+"label.baremetal.pxe.devices": "\u88f8\u673a PXE \u8bbe\u5907",
+"label.baremetal.pxe.provider": "\u88f8\u673a PXE \u63d0\u4f9b\u7a0b\u5e8f",
+"label.baremetal.rack.configuration": "Baremetal Rack \u914d\u7f6e",
+"label.baremetalcpu": "CPU (MHz)",
+"label.baremetalcpucores": "CPU \u5185\u6838\u6570",
+"label.baremetalmac": "\u4e3b\u673a MAC",
+"label.baremetalmemory": "\u5185\u5b58(MB)",
+"label.basic": "\u57fa\u672c",
+"label.basic.mode": "\u57fa\u672c\u6a21\u5f0f",
+"label.bcfdeviceid": "ID",
+"label.bigswitch.bcf.details": " BigSwitch BCF \u8be6\u60c5",
+"label.bigswitch.controller.address": "BigSwitch BCF \u63a7\u5236\u5668\u5730\u5740",
+"label.bladeid": "\u5200\u7247\u5f0f\u670d\u52a1\u5668 ID",
+"label.blades": "\u5200\u7247\u5f0f\u670d\u52a1\u5668",
+"label.bootable": "\u53ef\u542f\u52a8",
+"label.broadcastdomainrange": "\u5e7f\u64ad\u57df\u8303\u56f4",
+"label.broadcastdomaintype": "\u5e7f\u64ad\u57df\u7c7b\u578b",
+"label.broadcasturi": "\u5e7f\u64ad URI",
+"label.brocade.vcs.address": "Vcs \u4ea4\u6362\u673a\u5730\u5740",
+"label.brocade.vcs.details": "Brocade Vcs \u4ea4\u6362\u673a\u8be6\u7ec6\u4fe1\u606f",
+"label.bucket": "\u5b58\u50a8\u6876",
+"label.by.account": "\u6309\u5e10\u6237",
+"label.by.alert.type": "\u6309\u8b66\u62a5\u7c7b\u578b",
+"label.by.availability": "\u6309\u53ef\u7528\u6027",
+"label.by.domain": "\u6309\u57df",
+"label.by.end.date": "\u6309\u7ed3\u675f\u65e5\u671f",
+"label.by.event.type": "\u6309\u4e8b\u4ef6\u7c7b\u578b",
+"label.by.level": "\u6309\u7ea7\u522b",
+"label.by.pod": "\u6309\u63d0\u4f9b\u70b9",
+"label.by.role": "\u6309\u89d2\u8272",
+"label.by.start.date": "\u6309\u5f00\u59cb\u65e5\u671f",
+"label.by.state": "\u6309\u72b6\u6001",
+"label.by.traffic.type": "\u6309\u6d41\u91cf\u7c7b\u578b",
+"label.by.type": "\u6309\u7c7b\u578b",
+"label.by.type.id": "\u6309\u7c7b\u578b ID",
+"label.by.zone": "\u6309\u8d44\u6e90\u57df",
+"label.cachemode": "\u5199\u5165\u7f13\u5b58\u7c7b\u578b",
+"label.cancel": "\u53d6\u6d88",
+"label.capacity": "\u5bb9\u91cf",
+"label.capacity.iops": "\u5bb9\u91cf IOPS",
+"label.capacitybytes": "\u5bb9\u91cf(\u5b57\u8282)",
+"label.capacityiops": "\u603b IOPS",
+"label.certificate": "\u670d\u52a1\u5668\u8bc1\u4e66",
+"label.change.affinity": "\u66f4\u6539\u5173\u8054\u6027",
+"label.change.ipaddress": "Change IP address for NIC",
+"label.change.service.offering": "\u66f4\u6539\u670d\u52a1\u65b9\u6848",
+"label.change.value": "\u66f4\u6539\u503c",
+"label.character": "\u5b57\u7b26",
+"label.chassis": "\u673a\u7bb1",
+"label.checksum": "\u6821\u9a8c",
+"label.cidr": "CIDR",
+"label.cidr.account": "CIDR \u6216\u5e10\u6237/\u5b89\u5168\u7ec4",
+"label.cidr.of.destination.network": "\u76ee\u7684\u5730\u7f51\u7edc\u7684 CIDR",
+"label.cidrlist": "\u6e90 CIDR",
+"label.cisco.nexus1000v.ip.address": "Nexus 1000v IP \u5730\u5740",
+"label.cisco.nexus1000v.password": "Nexus 1000v \u5bc6\u7801",
+"label.cisco.nexus1000v.username": "Nexus 1000v \u7528\u6237\u540d",
+"label.ciscovnmc.resource.details": "CiscoVNMC \u8d44\u6e90\u8be6\u7ec6\u4fe1\u606f",
+"label.cleanup": "\u6e05\u7406",
+"label.clear.list": "\u6e05\u9664\u5217\u8868",
+"label.close": "\u5173\u95ed",
+"label.cloud.console": "\u4e91\u7ba1\u7406\u63a7\u5236\u53f0",
+"label.cloud.managed": "\u7531 Cloud.com \u7ba1\u7406",
+"label.cluster": "\u7fa4\u96c6",
+"label.cluster.name": "\u7fa4\u96c6\u540d\u79f0",
+"label.clusterid": "\u7fa4\u96c6",
+"label.clustername": "\u7fa4\u96c6",
+"label.clusternamelabel": "\u7fa4\u96c6\u540d\u79f0",
+"label.clusters": "\u7fa4\u96c6",
+"label.clustertype": "\u7fa4\u96c6\u7c7b\u578b",
+"label.clvm": "CLVM",
+"label.code": "\u4ee3\u7801",
+"label.community": "\u793e\u533a",
+"label.compute": "\u8ba1\u7b97",
+"label.compute.and.storage": "\u8ba1\u7b97\u4e0e\u5b58\u50a8",
+"label.compute.offerings": "\u8ba1\u7b97\u65b9\u6848",
+"label.configuration": "\u914d\u7f6e",
+"label.configure": "\u914d\u7f6e",
+"label.configure.ldap": "\u914d\u7f6e LDAP",
+"label.configure.network.acls": "\u914d\u7f6e\u7f51\u7edc ACL",
+"label.configure.sticky.policy": "\u914d\u7f6e\u7c98\u6ede\u7b56\u7565",
+"label.configure.vpc": "\u914d\u7f6e VPC",
+"label.confirmation": "\u786e\u8ba4",
+"label.confirmdeclineinvitation": "\u662f\u5426\u786e\u5b9e\u8981\u62d2\u7edd\u6b64\u9879\u76ee\u9080\u8bf7?",
+"label.confirmpassword": "\u786e\u8ba4\u5bc6\u7801",
+"label.congratulations": "\u795d\u8d3a\u60a8!",
+"label.connectiontimeout": "\u8fde\u63a5\u8d85\u65f6",
+"label.conservemode": "\u8282\u80fd\u6a21\u5f0f",
+"label.console.proxy": "\u63a7\u5236\u53f0\u4ee3\u7406",
+"label.console.proxy.vm": "\u63a7\u5236\u53f0\u4ee3\u7406 VM",
+"label.continue": "\u7ee7\u7eed",
+"label.continue.basic.install": "\u7ee7\u7eed\u6267\u884c\u57fa\u672c\u5b89\u88c5",
+"label.copying.iso": "\u6b63\u5728\u590d\u5236 ISO",
+"label.corrections.saved": "\u5df2\u4fdd\u5b58\u4fee\u6b63",
+"label.counterid": "\u8ba1\u6570\u5668",
+"label.cpu": "CPU",
+"label.cpu.allocated": "\u5df2\u5206\u914d\u7684 CPU",
+"label.cpu.sockets": "CPU \u63d2\u69fd",
+"label.cpuallocated": "\u5df2\u5206\u914d\u7ed9 VM \u7684 CPU",
+"label.cpuallocatedghz": "\u5df2\u5206\u914d",
+"label.cpulimit": "CPU \u9650\u5236",
+"label.cpumaxdeviation": "Deviation",
+"label.cpusockets": "CPU \u63d2\u69fd\u6570",
+"label.cpuspeed": "CPU (MHz)",
+"label.cputotal": "CPU \u603b\u91cf",
+"label.cputotalghz": "Total",
+"label.cpuused": "CPU \u5229\u7528\u7387",
+"label.create.nfs.secondary.staging.storage": "\u521b\u5efa NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.create.nfs.secondary.staging.store": "\u521b\u5efa NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.create.project": "\u521b\u5efa\u9879\u76ee",
+"label.create.ssh.key.pair": "\u751f\u6210SSH\u5bc6\u94a5\u5bf9",
+"label.create.template": "\u521b\u5efa\u6a21\u677f",
+"label.create.vpn.connection": "\u521b\u5efa VPN \u8fde\u63a5",
+"label.created": "\u521b\u5efa\u65e5\u671f",
+"label.created.by.system": "\u7531\u7cfb\u7edf\u521b\u5efa",
+"label.createnfscache": "\u521b\u5efa NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.credit": "Credit",
+"label.crosszones": "\u8de8\u8d44\u6e90\u57df",
+"label.current": "\u6700\u65b0\u7248\u672c",
+"label.currentpassword": "Current Password",
+"label.custom": "\u81ea\u5b9a\u4e49",
+"label.custom.disk.offering": "\u81ea\u5b9a\u4e49\u78c1\u76d8\u65b9\u6848",
+"label.customdisksize": "\u81ea\u5b9a\u4e49\u78c1\u76d8\u5927\u5c0f",
+"label.daily": "\u6bcf\u5929",
+"label.dashboard": "\u63a7\u5236\u677f",
+"label.data.disk.offering": "\u6570\u636e\u78c1\u76d8\u65b9\u6848",
+"label.date": "\u65e5\u671f",
+"label.day": "\u5929",
+"label.day.of.month": "\u65e5\u671f",
+"label.day.of.week": "\u661f\u671f",
+"label.dc.name": "\u6570\u636e\u4e2d\u5fc3\u540d\u79f0",
+"label.decline.invitation": "\u62d2\u7edd\u9080\u8bf7",
+"label.dedicate": "\u4e13\u7528",
+"label.dedicate.cluster": "\u5c06\u7fa4\u96c6\u4e13\u7528",
+"label.dedicate.host": "\u5c06\u4e3b\u673a\u4e13\u7528",
+"label.dedicate.pod": "\u5c06\u63d0\u4f9b\u70b9\u4e13\u7528",
+"label.dedicate.vlan.vni.range": "\u5c06 VLAN/VNI \u8303\u56f4\u4e13\u7528",
+"label.dedicate.zone": "\u5c06\u8d44\u6e90\u57df\u4e13\u7528",
+"label.dedicated": "\u4e13\u7528",
+"label.dedicated.vlan.vni.ranges": "VLAN/VNI \u8303\u56f4\u5df2\u4e13\u7528",
+"label.default": "\u9ed8\u8ba4\u8bbe\u7f6e",
+"label.default.use": "\u9ed8\u8ba4\u4f7f\u7528",
+"label.default.view": "\u9ed8\u8ba4\u89c6\u56fe",
+"label.delete": "\u5220\u9664",
+"label.delete.acl.list": "\u5220\u9664 ACL \u5217\u8868",
+"label.delete.affinity.group": "\u5220\u9664\u5173\u8054\u6027\u7ec4",
+"label.delete.alerts": "\u5220\u9664\u8b66\u62a5",
+"label.delete.baremetal.rack.configuration": "\u5220\u9664 Baremetal Rack \u914d\u7f6e",
+"label.delete.bigswitchbcf": "\u79fb\u9664 BigSwitch BCF \u63a7\u5236\u5668",
+"label.delete.brocadevcs": "\u5220\u9664 Brocade Vcs \u4ea4\u6362\u673a",
+"label.delete.ciscoasa1000v": "\u5220\u9664 CiscoASA1000v",
+"label.delete.ciscovnmc.resource": "\u5220\u9664 CiscoVNMC \u8d44\u6e90",
+"label.delete.events": "\u5220\u9664\u4e8b\u4ef6",
+"label.delete.f5": "\u5220\u9664 F5",
+"label.delete.gateway": "\u5220\u9664\u7f51\u5173",
+"label.delete.internal.lb": "\u5220\u9664\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.delete.netscaler": "\u5220\u9664 NetScaler",
+"label.delete.niciranvp": "\u5220\u9664 Nvp \u63a7\u5236\u5668",
+"label.delete.opendaylight.device": "\u5220\u9664 OpenDaylight \u63a7\u5236\u5668",
+"label.delete.pa": "\u5220\u9664 Palo Alto",
+"label.delete.portable.ip.range": "\u5220\u9664\u53ef\u79fb\u690d IP \u8303\u56f4",
+"label.delete.project": "\u5220\u9664\u9879\u76ee",
+"label.delete.role": "Delete Role",
+"label.delete.secondary.staging.store": "\u5220\u9664\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.delete.srx": "\u5220\u9664 SRX",
+"label.delete.ucs.manager": "\u5220\u9664 UCS Manager",
+"label.delete.vpn.connection": "\u5220\u9664 VPN \u8fde\u63a5",
+"label.delete.vpn.customer.gateway": "\u5220\u9664 VPN \u5ba2\u6237\u7f51\u5173",
+"label.delete.vpn.gateway": "\u5220\u9664 VPN \u7f51\u5173",
+"label.delete.vpn.user": "\u5220\u9664 VPN \u7528\u6237",
+"label.deleteprofile": "\u5220\u9664\u914d\u7f6e\u6587\u4ef6",
+"label.deleting.failed": "\u5220\u9664\u5931\u8d25",
+"label.deleting.processing": "\u6b63\u5728\u5220\u9664...",
+"label.deny": "\u62d2\u7edd",
+"label.deploymentplanner": "\u90e8\u7f72\u89c4\u5212\u5668",
+"label.description": "\u8bf4\u660e",
+"label.destinationphysicalnetworkid": "\u76ee\u6807\u7269\u7406\u7f51\u7edc ID",
+"label.destinationzoneid": "\u76ee\u6807\u8d44\u6e90\u57df",
+"label.destroy": "\u9500\u6bc1",
+"label.destroy.router": "\u9500\u6bc1\u8def\u7531\u5668",
+"label.destroyvmgraceperiod": "\u9500\u6bc1 VM \u5bbd\u9650\u671f",
+"label.detaching.disk": "\u6b63\u5728\u53d6\u6d88\u9644\u52a0\u78c1\u76d8",
+"label.details": "\u8be6\u7ec6\u4fe1\u606f",
+"label.deviceid": "\u8bbe\u5907 ID",
+"label.devices": "\u8bbe\u5907",
+"label.dhcp": "DHCP",
+"label.dhcp.server.type": "DHCP \u670d\u52a1\u5668\u7c7b\u578b",
+"label.direct.attached.public.ip": "\u76f4\u8fde\u516c\u7528 IP",
+"label.direct.ips": "\u5171\u4eab\u7f51\u7edc IP",
+"label.directdownload": "Direct Download",
+"label.disable.autoscale": "\u7981\u7528\u81ea\u52a8\u7f29\u653e",
+"label.disable.host": "\u7981\u7528\u4e3b\u673a",
+"label.disable.network.offering": "\u7981\u7528\u7f51\u7edc\u65b9\u6848",
+"label.disable.provider": "\u7981\u7528\u63d0\u4f9b\u7a0b\u5e8f",
+"label.disable.vnmc.provider": "\u7981\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f",
+"label.disable.vpc.offering": "\u7981\u7528 VPC \u65b9\u6848",
+"label.disable.vpn": "\u7981\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN",
+"label.disabled": "\u5df2\u7981\u7528",
+"label.disabling.vpn.access": "\u6b63\u5728\u7981\u7528 VPN \u8bbf\u95ee",
+"label.disassociate.profile.blade": "\u53d6\u6d88\u5c06\u914d\u7f6e\u6587\u4ef6\u4e0e\u5200\u7247\u5f0f\u670d\u52a1\u5668\u5173\u8054",
+"label.disbale.vnmc.device": "\u7981\u7528 VNMC \u8bbe\u5907",
+"label.disconnected": "\u4e0a\u6b21\u65ad\u5f00\u8fde\u63a5\u65f6\u95f4",
+"label.disk": "Disk",
+"label.disk.newoffering": "New Disk Offering",
+"label.disk.newoffering.description": "New disk offering to be used by this volume after the migration.",
+"label.disk.offering.details": "\u78c1\u76d8\u65b9\u6848\u8be6\u60c5",
+"label.disk.offerings": "\u78c1\u76d8\u65b9\u6848",
+"label.disk.size": "\u78c1\u76d8\u5927\u5c0f",
+"label.disk.volume": "\u78c1\u76d8\u5377",
+"label.diskbytesreadrate": "\u78c1\u76d8\u8bfb\u53d6\u901f\u5ea6(BPS)",
+"label.diskbyteswriterate": "\u78c1\u76d8\u5199\u5165\u901f\u5ea6(BPS)",
+"label.diskiopsmax": "\u6700\u5927 IOPS",
+"label.diskiopsmin": "\u6700\u5c0f IOPS",
+"label.diskiopsreadrate": "\u78c1\u76d8\u8bfb\u53d6\u901f\u5ea6(IOPS)",
+"label.diskiopswriterate": "\u78c1\u76d8\u5199\u5165\u901f\u5ea6(IOPS)",
+"label.diskioread": "\u78c1\u76d8\u8bfb\u53d6(IO)",
+"label.diskiowrite": "\u78c1\u76d8\u5199\u5165(IO)",
+"label.diskkbsread": "\u78c1\u76d8\u8bfb\u53d6(\u5b57\u8282)",
+"label.diskkbswrite": "\u78c1\u76d8\u5199\u5165(\u5b57\u8282)",
+"label.diskoffering": "\u78c1\u76d8\u65b9\u6848",
+"label.diskofferingdisplaytext": "\u78c1\u76d8\u65b9\u6848",
+"label.diskofferingid": "\u78c1\u76d8\u65b9\u6848",
+"label.disksize": "\u78c1\u76d8\u5927\u5c0f(GB)",
+"label.disksizeallocated": "\u5df2\u5206\u914d\u7684\u78c1\u76d8",
+"label.disksizeallocatedgb": "\u5df2\u5206\u914d",
+"label.disksizetotal": "\u78c1\u76d8\u603b\u91cf",
+"label.disksizetotalgb": "Total",
+"label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeusedgb": "\u5df2\u4f7f\u7528",
+"label.display.text": "\u663e\u793a\u6587\u672c",
+"label.displayname": "\u663e\u793a\u540d\u79f0",
+"label.displaytext": "\u8bf4\u660e",
+"label.distributedvpcrouter": "\u5206\u5e03\u5f0f VPC \u8def\u7531\u5668",
+"label.dns": "DNS",
+"label.dns.domain.for.guest.networks": "\u6765\u5bbe\u7f51\u7edc\u7684 DNS \u57df",
+"label.dns1": "DNS 1",
+"label.dns2": "DNS 2",
+"label.domain": "\u57df",
+"label.domain.details": "\u57df\u8be6\u60c5",
+"label.domain.name": "\u57df\u540d",
+"label.domain.router": "\u57df\u8def\u7531\u5668",
+"label.domain.suffix": "DNS \u57df\u540e\u7f00(\u4f8b\u5982 xyz.com)",
+"label.domainid": "\u57df ID",
+"label.domainname": "\u57df",
+"label.domainpath": "\u57df",
+"label.done": "\u5b8c\u6210",
+"label.double.quotes.are.not.allowed": "\u4e0d\u5141\u8bb8\u4f7f\u7528\u53cc\u5f15\u53f7",
+"label.download.progress": "\u4e0b\u8f7d\u8fdb\u5ea6",
+"label.dpd": "\u5931\u6548\u5bf9\u7b49\u4f53\u68c0\u6d4b",
+"label.drag.new.position": "\u62d6\u52a8\u5230\u65b0\u4f4d\u7f6e",
+"label.driver": "Driver",
+"label.duration.in.sec": "\u6301\u7eed\u65f6\u95f4 (\u79d2)",
+"label.edit": "\u7f16\u8f91",
+"label.edit.acl.list": "Edit ACL List",
+"label.edit.acl.rule": "\u7f16\u8f91 ACL \u89c4\u5219",
+"label.edit.affinity.group": "\u7f16\u8f91\u5173\u8054\u6027\u7ec4",
+"label.edit.lb.rule": "\u7f16\u8f91\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219",
+"label.edit.network.details": "\u7f16\u8f91\u7f51\u7edc\u8be6\u60c5",
+"label.edit.project.details": "\u7f16\u8f91\u9879\u76ee\u8be6\u60c5",
+"label.edit.region": "\u7f16\u8f91\u5730\u7406\u533a\u57df",
+"label.edit.role": "Edit Role",
+"label.edit.rule": "\u7f16\u8f91\u89c4\u5219",
+"label.edit.secondary.ips": "\u7f16\u8f91\u4e8c\u7ea7 IPs",
+"label.edit.tags": "\u7f16\u8f91\u6807\u7b7e",
+"label.edit.traffic.type": "\u7f16\u8f91\u6d41\u91cf\u7c7b\u578b",
+"label.edit.vpc": "\u7f16\u8f91 VPC",
+"label.egress.default.policy": "\u51fa\u53e3\u9ed8\u8ba4\u7b56\u7565",
+"label.egress.rule": "\u51fa\u53e3\u89c4\u5219",
+"label.egress.rules": "\u51fa\u53e3\u89c4\u5219",
+"label.egressdefaultpolicy": "\u9ed8\u8ba4\u51fa\u53e3\u89c4\u5219",
+"label.elastic": "\u5f39\u6027",
+"label.email": "\u7535\u5b50\u90ae\u4ef6",
+"label.enable.autoscale": "\u542f\u7528\u81ea\u52a8\u7f29\u653e",
+"label.enable.host": "\u542f\u7528\u4e3b\u673a",
+"label.enable.network.offering": "\u542f\u7528\u7f51\u7edc\u65b9\u6848",
+"label.enable.provider": "\u542f\u7528\u63d0\u4f9b\u7a0b\u5e8f",
+"label.enable.s3": "\u542f\u7528 S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8",
+"label.enable.swift": "\u542f\u7528 SWIFT",
+"label.enable.vnmc.device": "\u542f\u7528 VNMC \u8bbe\u5907",
+"label.enable.vnmc.provider": "\u542f\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f",
+"label.enable.vpc.offering": "\u542f\u7528 VPC \u65b9\u6848",
+"label.enable.vpn": "\u542f\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN",
+"label.enabling.vpn": "\u6b63\u5728\u542f\u7528 VPN",
+"label.enabling.vpn.access": "\u6b63\u5728\u542f\u7528 VPN \u8bbf\u95ee",
+"label.end.ip": "\u7ed3\u675f IP",
+"label.end.reserved.system.ip": "\u7ed3\u675f\u9884\u7559\u7cfb\u7edf IP",
+"label.end.vlan": "\u7ed3\u675f VLAN",
+"label.end.vxlan": "\u7ed3\u675f VXLAN",
+"label.enddate": "\u6309\u65e5\u671f(\u7ed3\u675f\u65e5\u671f)",
+"label.endip": "\u7ed3\u675f IP",
+"label.endipv4": "IPv4 \u7ed3\u675f IP",
+"label.endipv6": "IPv6 \u7ed3\u675f IP",
+"label.endpoint": "\u7aef\u70b9",
+"label.endpoint.or.operation": "\u7aef\u70b9\u6216\u64cd\u4f5c",
+"label.endport": "\u7ed3\u675f\u7aef\u53e3",
+"label.enter.token": "\u8f93\u5165\u4ee4\u724c",
+"label.error": "\u9519\u8bef",
+"label.error.code": "\u9519\u8bef\u4ee3\u7801",
+"label.error.something.went.wrong.please.correct.the.following": "\u51fa\u73b0\u95ee\u9898\uff1b\u8bf7\u66f4\u6b63\u4ee5\u4e0b\u5404\u9879",
+"label.error.upper": "\u9519\u8bef",
+"label.espencryption": "ESP \u52a0\u5bc6\u7b97\u6cd5",
+"label.esphash": "ESP \u54c8\u5e0c\u7b97\u6cd5",
+"label.esplifetime": "ESP \u4f7f\u7528\u671f\u9650(\u7b2c\u4e8c\u9636\u6bb5)",
+"label.esppolicy": "ESP \u7b56\u7565",
+"label.event": "\u4e8b\u4ef6",
+"label.event.archived": "\u4e8b\u4ef6\u5df2\u5b58\u6863",
+"label.event.deleted": "\u4e8b\u4ef6\u5df2\u5220\u9664",
+"label.events": "\u4e8b\u4ef6",
+"label.every": "\u6bcf",
+"label.example": "\u793a\u4f8b",
+"label.expunge": "\u5220\u9664",
+"label.external.link": "\u5916\u90e8\u94fe\u63a5",
+"label.f5": "F5",
+"label.f5.details": "F5 \u8be6\u7ec6\u4fe1\u606f",
+"label.failed": "\u5931\u8d25",
+"label.featured": "\u7cbe\u9009",
+"label.fetch.latest": "\u63d0\u53d6\u6700\u65b0\u5185\u5bb9",
+"label.filterby": "\u8fc7\u6ee4\u4f9d\u636e",
+"label.fingerprint": "\u6307\u7eb9",
+"label.firewall": "\u9632\u706b\u5899",
+"label.firstname": "\u540d\u5b57",
+"label.firstname.lower": "\u540d\u5b57",
+"label.forceencap": "Force UDP Encapsulation of ESP Packets",
+"label.format": "\u683c\u5f0f",
+"label.friday": "\u661f\u671f\u4e94",
+"label.full": "\u6ee1\u8f7d",
+"label.full.path": "\u5b8c\u6574\u8def\u5f84",
+"label.fwdeviceid": "ID",
+"label.fwdevicename": "\u7c7b\u578b",
+"label.fwdevicestate": "\u72b6\u6001",
+"label.gateway": "\u7f51\u5173",
+"label.general.alerts": "\u5e38\u89c4\u8b66\u62a5",
+"label.generating.url": "\u6b63\u5728\u751f\u6210 URL",
+"label.global.settings": "\u5168\u5c40\u8bbe\u7f6e",
+"label.globo.dns": "\u5168\u5c40DNS",
+"label.globo.dns.configuration": "\u5168\u5c40 DNS \u914d\u7f6e",
+"label.glustervolume": "\u5377",
+"label.go.step.2": "\u8f6c\u81f3\u6b65\u9aa4 2",
+"label.go.step.3": "\u8f6c\u81f3\u6b65\u9aa4 3",
+"label.go.step.4": "\u8f6c\u81f3\u6b65\u9aa4 4",
+"label.go.step.5": "\u8f6c\u81f3\u6b65\u9aa4 5",
+"label.gpu": "GPU",
+"label.group": "\u7ec4",
+"label.group.by.account": "\u6309\u5e10\u6237\u5206\u7ec4",
+"label.group.by.cluster": "\u6309\u7fa4\u96c6\u5206\u7ec4",
+"label.group.by.pod": "\u6309\u63d0\u4f9b\u70b9\u5206\u7ec4",
+"label.group.by.zone": "\u6309\u8d44\u6e90\u57df\u5206\u7ec4",
+"label.group.optional": "\u7ec4(\u53ef\u9009)",
+"label.gslb": "GSLB",
+"label.gslb.assigned.lb": "\u5df2\u5206\u914d\u8d1f\u8f7d\u5e73\u8861",
+"label.gslb.assigned.lb.more": "\u5206\u914d\u66f4\u591a\u8d1f\u8f7d\u5e73\u8861",
+"label.gslb.delete": "\u5220\u9664 GSLB",
+"label.gslb.details": "GSLB \u8be6\u7ec6\u4fe1\u606f",
+"label.gslb.lb.details": "\u8d1f\u8f7d\u5e73\u8861\u8be6\u7ec6\u4fe1\u606f",
+"label.gslb.lb.remove": "\u4ece\u6b64 GSLB \u4e2d\u5220\u9664\u8d1f\u8f7d\u5e73\u8861",
+"label.gslb.service": "GSLB \u670d\u52a1",
+"label.gslb.service.private.ip": "GSLB \u670d\u52a1\u4e13\u7528 IP",
+"label.gslb.service.public.ip": "GSLB \u670d\u52a1\u516c\u7528 IP",
+"label.gslbdomainname": "GSLB \u57df\u540d",
+"label.gslbprovider": "GSLB \u670d\u52a1",
+"label.gslbproviderprivateip": "GSLB \u670d\u52a1\u4e13\u7528 IP",
+"label.gslbproviderpublicip": "GSLB \u670d\u52a1\u516c\u7528 IP",
+"label.gslbservicetype": "\u670d\u52a1\u7c7b\u578b",
+"label.guest": "\u6765\u5bbe",
+"label.guest.cidr": "\u6765\u5bbe CIDR",
+"label.guest.end.ip": "\u6765\u5bbe\u7ed3\u675f IP",
+"label.guest.gateway": "\u6765\u5bbe\u7f51\u5173",
+"label.guest.ip": "\u6765\u5bbe IP \u5730\u5740",
+"label.guest.ip.range": "\u6765\u5bbe IP \u8303\u56f4",
+"label.guest.netmask": "\u6765\u5bbe\u7f51\u7edc\u63a9\u7801",
+"label.guest.network.details": "\u6765\u5bbe\u7f51\u7edc\u8be6\u7ec6\u4fe1\u606f",
+"label.guest.networks": "\u6765\u5bbe\u7f51\u7edc",
+"label.guest.start.ip": "\u6765\u5bbe\u8d77\u59cb IP",
+"label.guest.traffic": "\u6765\u5bbe\u6d41\u91cf",
+"label.guestcidraddress": "\u6765\u5bbe CIDR",
+"label.guestendip": "\u6765\u5bbe\u7ed3\u675f IP",
+"label.guestgateway": "\u6765\u5bbe\u7f51\u5173",
+"label.guestipaddress": "\u6765\u5bbe IP \u5730\u5740",
+"label.guestiptype": "\u6765\u5bbe\u7c7b\u578b",
+"label.guestnetmask": "\u6765\u5bbe\u7f51\u7edc\u63a9\u7801",
+"label.guestnetworkid": "\u7f51\u7edc ID",
+"label.guestnetworkname": "\u7f51\u7edc\u540d\u79f0",
+"label.guestosid": "\u64cd\u4f5c\u7cfb\u7edf\u7c7b\u578b",
+"label.gueststartip": "\u6765\u5bbe\u8d77\u59cb IP",
+"label.guestvlanrange": "VLAN \u8303\u56f4",
+"label.haenable": "\u5df2\u542f\u7528\u9ad8\u53ef\u7528\u6027",
+"label.hahost": "\u5df2\u542f\u7528\u9ad8\u53ef\u7528\u6027",
+"label.header.volume.snapshot": "\u53ef\u4ee5\u901a\u8fc7\u4ece\u4ee5\u4e0b\u53ef\u7528\u9009\u9879\u4e2d\u8fdb\u884c\u9009\u62e9\u5e76\u5e94\u7528\u60a8\u7684\u7b56\u7565\u9996\u9009\u9879\u6765\u8bbe\u7f6e\u91cd\u73b0\u5feb\u7167\u8ba1\u5212",
+"label.header.volume.take.snapshot": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u521b\u5efa\u6b64\u5377\u7684\u5feb\u7167\u3002",
+"label.health.check": "\u8fd0\u884c\u72b6\u51b5\u68c0\u67e5",
+"label.health.check.advanced.options": "\u9ad8\u7ea7\u9009\u9879:",
+"label.health.check.configurations.options": "\u914d\u7f6e\u9009\u9879:",
+"label.health.check.interval.in.sec": "\u8fd0\u884c\u72b6\u51b5\u68c0\u67e5\u65f6\u95f4\u95f4\u9694(\u79d2)",
+"label.health.check.message.desc": "\u8d1f\u8f7d\u5747\u8861\u5668\u4f1a\u81ea\u52a8\u5bf9\u5b9e\u4f8b\u8fdb\u884c\u72b6\u51b5\u68c0\u67e5\u5e76\u4e14\u53ea\u6709\u8def\u7531\u5668\u81f3\u5b9e\u4f8b\u7684\u94fe\u8def\u6b63\u5e38\u624d\u80fd\u901a\u8fc7\u68c0\u67e5",
+"label.health.check.wizard": "\u8fd0\u884c\u68c0\u67e5\u5411\u5bfc",
+"label.healthy.threshold": "\u6b63\u5e38\u9608\u503c",
+"label.help": "\u5e2e\u52a9",
+"label.hide.ingress.rule": "\u9690\u85cf\u5165\u53e3\u89c4\u5219",
+"label.hints": "\u63d0\u793a",
+"label.home": "\u9996\u9875",
+"label.host": "\u4e3b\u673a",
+"label.host.alerts": "Hosts in Alert State",
+"label.host.name": "\u4e3b\u673a\u540d\u79f0",
+"label.host.tag": "\u5bbf\u4e3b\u673a\u6807\u7b7e",
+"label.hostid": "\u4e3b\u673a",
+"label.hostname": "\u4e3b\u673a",
+"label.hostnamelabel": "\u4e3b\u673a\u540d\u79f0",
+"label.hosts": "\u4e3b\u673a",
+"label.hosttags": "\u4e3b\u673a\u6807\u7b7e",
+"label.hourly": "\u6bcf\u5c0f\u65f6",
+"label.hypervisor": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f",
+"label.hypervisor.capabilities": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u529f\u80fd",
+"label.hypervisor.type": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u7c7b\u578b",
+"label.hypervisors": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f",
+"label.hypervisorsnapshotreserve": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u5feb\u7167\u9884\u7559",
+"label.hypervisortype": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f",
+"label.hypervisorversion": "\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u7248\u672c",
+"label.hypervnetworklabel": "HyperV \u6d41\u91cf\u6807\u7b7e",
+"label.icmpcode": "ICMP \u4ee3\u7801",
+"label.icmptype": "ICMP \u7c7b\u578b",
+"label.id": "ID",
+"label.ikedh": "IKE DH \u7b97\u6cd5",
+"label.ikeencryption": "IKE \u52a0\u5bc6\u7b97\u6cd5",
+"label.ikehash": "IKE \u54c8\u5e0c\u7b97\u6cd5",
+"label.ikelifetime": "IKE \u4f7f\u7528\u671f\u9650(\u7b2c\u4e8c\u9636\u6bb5)",
+"label.ikepolicy": "IKE \u7b56\u7565",
+"label.info": "\u4fe1\u606f",
+"label.info.upper": "\u4fe1\u606f",
+"label.infrastructure": "\u57fa\u7840\u67b6\u6784",
+"label.ingress.rule": "\u5165\u53e3\u89c4\u5219",
+"label.initiated.by": "\u542f\u52a8\u8005",
+"label.insideportprofile": "\u5185\u90e8\u7aef\u53e3\u914d\u7f6e\u6587\u4ef6",
+"label.installwizard.addclusterintro.subtitle": "\u4ec0\u4e48\u662f\u7fa4\u96c6?",
+"label.installwizard.addclusterintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u7fa4\u96c6",
+"label.installwizard.addhostintro.subtitle": "\u4ec0\u4e48\u662f\u4e3b\u673a?",
+"label.installwizard.addhostintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u4e3b\u673a",
+"label.installwizard.addpodintro.subtitle": "\u4ec0\u4e48\u662f\u63d0\u4f9b\u70b9?",
+"label.installwizard.addpodintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u63d0\u4f9b\u70b9",
+"label.installwizard.addprimarystorageintro.subtitle": "\u4ec0\u4e48\u662f\u4e3b\u5b58\u50a8?",
+"label.installwizard.addprimarystorageintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u4e3b\u5b58\u50a8",
+"label.installwizard.addsecondarystorageintro.subtitle": "\u4ec0\u4e48\u662f\u4e8c\u7ea7\u5b58\u50a8?",
+"label.installwizard.addsecondarystorageintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u4e8c\u7ea7\u5b58\u50a8",
+"label.installwizard.addzoneintro.subtitle": "\u4ec0\u4e48\u662f\u8d44\u6e90\u57df?",
+"label.installwizard.addzoneintro.title": "\u6dfb\u52a0\u4e00\u4e2a\u8d44\u6e90\u57df",
+"label.installwizard.click.launch": "\u8bf7\u5355\u51fb\u201c\u542f\u52a8\u201d\u6309\u94ae\u3002",
+"label.installwizard.subtitle": "\u6b64\u6559\u7a0b\u5c06\u5e2e\u52a9\u60a8\u8bbe\u7f6e CloudStack&#8482 \u5b89\u88c5",
+"label.installwizard.title": "\u60a8\u597d\uff0c\u6b22\u8fce\u4f7f\u7528 CloudStack&#8482",
+"label.instance": "\u5b9e\u4f8b",
+"label.instance.name": "\u5b9e\u4f8b\u540d\u79f0",
+"label.instance.scaled.up": "\u63d0\u4f9b\u9700\u8981\u6269\u5c55\u7684\u5b9e\u4f8b",
+"label.instancename": "\u5185\u90e8\u540d\u79f0",
+"label.instanceport": "\u5b9e\u4f8b\u7aef\u53e3",
+"label.instances": "\u5b9e\u4f8b",
+"label.instanciate.template.associate.profile.blade": "\u5c06\u6a21\u677f\u5b9e\u4f8b\u5316\u5e76\u5c06\u914d\u7f6e\u6587\u4ef6\u4e0e\u5200\u7247\u5f0f\u670d\u52a1\u5668\u5173\u8054",
+"label.intermediate.certificate": "\u4e2d\u95f4\u8bc1\u4e66",
+"label.internal.dns.1": "\u5185\u90e8 DNS 1",
+"label.internal.dns.2": "\u5185\u90e8 DNS 2",
+"label.internal.lb": "\u5185\u90e8\u8d1f\u8f7d\u5747\u8861\u5668",
+"label.internal.lb.details": "\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\u8be6\u7ec6\u4fe1\u606f",
+"label.internaldns1": "\u5185\u90e8 DNS 1",
+"label.internaldns2": "\u5185\u90e8 DNS 2",
+"label.internallbvm": "InternalLbVm",
+"label.interval": "\u8f6e\u8be2\u65f6\u95f4\u95f4\u9694(\u79d2)",
+"label.intervaltype": "\u95f4\u9694\u7c7b\u578b",
+"label.introduction.to.cloudstack": "CloudStack&#8482 \u7b80\u4ecb",
+"label.invalid.integer": "\u65e0\u6548\u6574\u6570",
+"label.invalid.number": "\u65e0\u6548\u6570\u5b57",
+"label.invitations": "\u9080\u8bf7",
+"label.invite": "\u9080\u8bf7",
+"label.invite.to": "\u9080\u8bf7\u52a0\u5165",
+"label.invited.accounts": "\u5df2\u9080\u8bf7\u7684\u5e10\u6237",
+"label.ip": "IP",
+"label.ip.allocations": "IP \u5206\u914d",
+"label.ip.or.fqdn": "IP \u6216 FQDN",
+"label.ip.range": "IP \u8303\u56f4",
+"label.ip.ranges": "IP \u8303\u56f4",
+"label.ip4dns1": "IPv4 DNS1",
+"label.ip4dns2": "IPv4 DNS2",
+"label.ip4gateway": "IPv4 \u7f51\u5173",
+"label.ip4netmask": "IPv4 \u7f51\u7edc\u63a9\u7801",
+"label.ip6address": "IPv6 IP \u5730\u5740",
+"label.ip6cidr": "IPv6 CIDR",
+"label.ip6dns1": "IPv6 DNS1",
+"label.ip6dns2": "IPv6 DNS2",
+"label.ip6gateway": "IPv6 \u7f51\u5173",
+"label.ipaddress": "IP \u5730\u5740",
+"label.ipaddress1": "IP \u5730\u5740",
+"label.ipaddress2": "IP \u5730\u5740",
+"label.iplimit": "\u516c\u7528 IP \u9650\u5236",
+"label.ips": "IP",
+"label.ipsecpsk": "IPsec \u9884\u5171\u4eab\u5bc6\u94a5",
+"label.iptotal": "IP\u5730\u5740\u603b\u6570",
+"label.ipv4.cidr": "IPv4 CIDR",
+"label.ipv4.dns1": "IPv4 DNS1",
+"label.ipv4.dns2": "IPv4 DNS2",
+"label.ipv6.dns1": "IPv6 DNS1",
+"label.ipv6.dns2": "IPv6 DNS2",
+"label.iqn": "\u76ee\u6807 IQN",
+"label.is.redundant.router": "\u5197\u4f59",
+"label.is.shared": "\u662f\u5426\u5171\u4eab",
+"label.isadvanced": "\u663e\u793a\u9ad8\u7ea7\u8bbe\u7f6e",
+"label.iscsi": "iSCSI",
+"label.iscustomized": "\u81ea\u5b9a\u4e49\u78c1\u76d8\u5927\u5c0f",
+"label.iscustomizeddiskiops": "\u81ea\u5b9a\u4e49 IOPS",
+"label.iscustomizediops": "\u81ea\u5b9a\u4e49 IOPS",
+"label.isdedicated": "\u4e13\u7528",
+"label.isdefault": "\u662f\u5426\u4e3a\u9ed8\u8ba4\u8bbe\u7f6e",
+"label.isdynamicallyscalable": "\u53ef\u52a8\u6001\u6269\u5c55",
+"label.isextractable": "\u53ef\u63d0\u53d6",
+"label.isfeatured": "\u7cbe\u9009",
+"label.isforced": "\u5f3a\u5236\u5220\u9664",
+"label.ismanaged": "\u6258\u7ba1",
+"label.iso": "ISO",
+"label.iso.boot": "ISO \u542f\u52a8",
+"label.isoid": "ISO",
+"label.isolated.networks": "\u9694\u79bb\u7f51\u7edc",
+"label.isolatedpvlanid": "\u4e8c\u7ea7\u9694\u79bb VLAN ID",
+"label.isolation.method": "\u9694\u79bb\u65b9\u6cd5",
+"label.isolation.mode": "\u9694\u79bb\u6a21\u5f0f",
+"label.isolationmethod": "\u9694\u79bb\u65b9\u6cd5",
+"label.isolationmethods": "\u9694\u79bb\u65b9\u6cd5",
+"label.isolationuri": "\u9694\u79bb URI",
+"label.isoname": "\u5df2\u9644\u52a0 ISO",
+"label.isos": "ISO",
+"label.ispasswordenabled": "\u5df2\u542f\u7528\u5bc6\u7801",
+"label.ispersistent": "\u6c38\u4e45",
+"label.isportable": "\u8de8\u8d44\u6e90\u57df",
+"label.ispublic": "\u516c\u7528",
+"label.isready": "\u5df2\u5c31\u7eea",
+"label.isredundantrouter": "\u5197\u4f59\u8def\u7531\u5668",
+"label.isrouting": "\u6b63\u5728\u8def\u7531",
+"label.isshared": "\u5df2\u5171\u4eab",
+"label.issourcenat": "\u6e90 NAT",
+"label.isstaticnat": "\u9759\u6001 NAT",
+"label.issystem": "\u662f\u5426\u4e3a\u7cfb\u7edf",
+"label.isvolatile": "\u53ef\u53d8",
+"label.item.listing": "\u9879\u76ee\u5217\u8868",
+"label.japanese.keyboard": "\u65e5\u5f0f\u952e\u76d8",
+"label.keep": "\u4fdd\u7559",
+"label.keep.colon": "\u4fdd\u7559",
+"label.key": "\u5bc6\u94a5",
+"label.keyboard": "\u952e\u76d8\u8bed\u8a00",
+"label.keyboardtype": "\u952e\u76d8\u7c7b\u578b",
+"label.keypair": "SSH\u5bc6\u94a5\u5bf9",
+"label.kvmnetworklabel": "KVM \u6d41\u91cf\u6807\u7b7e",
+"label.l2gatewayserviceuuid": "L2 Gateway Service Uuid",
+"label.l3gatewayserviceuuid": "L3 Gateway Service UUID",
+"label.label": "\u6807\u7b7e",
+"label.lang.arabic": "\u963f\u62c9\u4f2f\u8bed",
+"label.lang.brportugese": "\u8461\u8404\u7259\u8bed(\u5df4\u897f)",
+"label.lang.catalan": "\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u8bed",
+"label.lang.chinese": "\u7b80\u4f53\u4e2d\u6587",
+"label.lang.dutch": "\u8377\u5170\u8bed(\u8377\u5170)",
+"label.lang.english": "\u82f1\u8bed",
+"label.lang.french": "\u6cd5\u8bed",
+"label.lang.german": "\u5fb7\u8bed",
+"label.lang.hungarian": "\u5308\u7259\u5229",
+"label.lang.italian": "\u610f\u5927\u5229\u8bed",
+"label.lang.japanese": "\u65e5\u8bed",
+"label.lang.korean": "\u97e9\u8bed",
+"label.lang.norwegian": "\u632a\u5a01\u8bed",
+"label.lang.polish": "\u6ce2\u5170\u8bed",
+"label.lang.russian": "\u4fc4\u8bed",
+"label.lang.spanish": "\u897f\u73ed\u7259\u8bed",
+"label.last.updated": "Last Update",
+"label.lastname": "\u59d3\u6c0f",
+"label.lastname.lower": "\u59d3\u6c0f",
+"label.latest.events": "\u6700\u65b0\u4e8b\u4ef6",
+"label.launch": "\u542f\u52a8",
+"label.launch.vm": "\u542f\u52a8 VM",
+"label.launch.zone": "\u542f\u52a8\u8d44\u6e90\u57df",
+"label.lb.algorithm.leastconn": "\u6700\u5c11\u8fde\u63a5\u7b97\u6cd5",
+"label.lb.algorithm.roundrobin": "\u8f6e\u5faa",
+"label.lb.algorithm.source": "\u6e90\u7b97\u6cd5",
+"label.lbdevicededicated": "\u4e13\u7528",
+"label.lbdeviceid": "ID",
+"label.lbdevicename": "\u7c7b\u578b",
+"label.lbdevicestate": "\u72b6\u6001",
+"label.lbtype": "\u8d1f\u8f7d\u5e73\u8861\u5668\u7c7b\u578b",
+"label.ldap.configuration": "LDAP \u914d\u7f6e",
+"label.ldap.group.name": "LDAP \u7ec4",
+"label.ldap.port": "LDAP \u7aef\u53e3",
+"label.level": "\u7ea7\u522b",
+"label.limitcpuuse": "CPU \u4e0a\u9650",
+"label.link.domain.to.ldap": "\u57df\u94fe\u63a5\u81f3 LDAP",
+"label.linklocalip": "\u94fe\u63a5\u672c\u5730 IP \u5730\u5740",
+"label.load.balancer": "\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.load.balancing.policies": "\u8d1f\u8f7d\u5e73\u8861\u7b56\u7565",
+"label.loadbalancerinstance": "\u5df2\u5206\u914d\u7684 VM",
+"label.loadbalancerrule": "\u8d1f\u8f7d\u5e73\u8861\u89c4\u5219",
+"label.loadbalancing": "\u8d1f\u8f7d\u5e73\u8861",
+"label.loading": "\u6b63\u5728\u52a0\u8f7d",
+"label.local": "\u672c\u5730",
+"label.local.storage": "\u672c\u5730\u5b58\u50a8",
+"label.local.storage.enabled": "\u4e3a\u7528\u6237\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8",
+"label.local.storage.enabled.system.vms": "\u4e3a\u7cfb\u7edf\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8",
+"label.localstorageenabled": "\u4e3a\u7528\u6237\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8",
+"label.localstorageenabledforsystemvm": "\u4e3a\u7cfb\u7edf\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8",
+"label.login": "\u767b\u5f55",
+"label.logout": "\u6ce8\u9500",
+"label.lun": "LUN",
+"label.lun.number": "LUN \u53f7",
+"label.lxcnetworklabel": "LXC \u6d41\u91cf\u6807\u7b7e",
+"label.make.project.owner": "\u8bbe\u4e3a\u5e10\u6237\u9879\u76ee\u6240\u6709\u8005",
+"label.makeredundant": "\u5197\u4f59",
+"label.manage": "\u6258\u7ba1",
+"label.manage.resources": "\u7ba1\u7406\u8d44\u6e90",
+"label.management": "\u7ba1\u7406",
+"label.management.ips": "\u7ba1\u7406\u7c7b IP \u5730\u5740",
+"label.management.server": "\u7ba1\u7406\u670d\u52a1\u5668",
+"label.max.primary.storage": "\u6700\u5927\u4e3b\u5b58\u50a8(GiB)",
+"label.max.secondary.storage": "\u6700\u5927\u4e8c\u7ea7\u5b58\u50a8(GiB)",
+"label.maxcpu": "\u6700\u5927 CPU \u5185\u6838\u6570",
+"label.maxerrorretry": "\u6700\u5927\u9519\u8bef\u91cd\u8bd5\u6b21\u6570",
+"label.maxguestslimit": "\u6700\u5927\u6765\u5bbe\u6570\u9650\u5236",
+"label.maximum": "\u6700\u5927\u503c",
+"label.maxinstance": "\u6700\u5927\u5b9e\u4f8b\u6570",
+"label.maxiops": "\u6700\u5927 IOPS",
+"label.maxmemory": "\u6700\u5927\u5185\u5b58(MiB)",
+"label.maxnetwork": "\u6700\u5927\u7f51\u7edc\u6570",
+"label.maxpublicip": "\u6700\u5927\u516c\u7528 IP \u6570",
+"label.maxsnapshot": "\u6700\u5927\u5feb\u7167\u6570",
+"label.maxtemplate": "\u6700\u5927\u6a21\u677f\u6570",
+"label.maxuservm": "\u6700\u5927\u7528\u6237 VM \u6570",
+"label.maxvolume": "\u6700\u5927\u5377\u6570",
+"label.maxvpc": "\u6700\u5927 VPC \u6570",
+"label.may.continue": "\u60a8\u73b0\u5728\u53ef\u4ee5\u7ee7\u7eed\u8fdb\u884c\u64cd\u4f5c\u3002",
+"label.memallocated": "Mem Allocation",
+"label.memory": "\u5185\u5b58",
+"label.memory.total": "\u5185\u5b58\u603b\u91cf",
+"label.memory.used": "\u5df2\u4f7f\u7528\u7684\u5185\u5b58",
+"label.memoryallocated": "\u5df2\u5206\u914d\u7684\u5185\u5b58",
+"label.memoryallocatedgb": "\u5df2\u5206\u914d",
+"label.memorylimit": "\u5185\u5b58\u9650\u5236(MiB)",
+"label.memorymaxdeviation": "Deviation",
+"label.memorytotal": "\u5df2\u5206\u914d\u7684\u5185\u5b58",
+"label.memorytotalgb": "Total",
+"label.memoryusedgb": "\u5df2\u4f7f\u7528",
+"label.menu.all.accounts": "\u6240\u6709\u5e10\u6237",
+"label.menu.all.instances": "\u6240\u6709\u5b9e\u4f8b",
+"label.menu.community.isos": "\u793e\u533a ISO",
+"label.menu.community.templates": "\u793e\u533a\u6a21\u677f",
+"label.menu.destroyed.instances": "\u5df2\u9500\u6bc1\u7684\u5b9e\u4f8b",
+"label.menu.featured.isos": "\u7cbe\u9009 ISO",
+"label.menu.featured.templates": "\u7cbe\u9009\u6a21\u677f",
+"label.menu.ipaddresses": "IP \u5730\u5740",
+"label.menu.my.accounts": "\u6211\u7684\u5e10\u6237",
+"label.menu.my.instances": "\u6211\u7684\u5b9e\u4f8b",
+"label.menu.my.isos": "\u6211\u7684 ISO",
+"label.menu.my.templates": "\u6211\u7684\u6a21\u677f",
+"label.menu.physical.resources": "\u7269\u7406\u8d44\u6e90",
+"label.menu.regions": "\u5730\u7406\u533a\u57df",
+"label.menu.running.instances": "\u6b63\u5728\u8fd0\u884c\u7684\u5b9e\u4f8b",
+"label.menu.security.groups": "\u5b89\u5168\u7ec4",
+"label.menu.service.offerings": "\u670d\u52a1\u65b9\u6848",
+"label.menu.sshkeypair": "SSH \u5bc6\u94a5\u5bf9",
+"label.menu.stopped.instances": "\u5df2\u505c\u6b62\u7684\u5b9e\u4f8b",
+"label.menu.storage": "\u5b58\u50a8",
+"label.menu.system": "\u7cfb\u7edf",
+"label.menu.virtual.appliances": "\u865a\u62df\u8bbe\u5907",
+"label.menu.virtual.resources": "\u865a\u62df\u8d44\u6e90",
+"label.metrics": "Metrics",
+"label.metrics.cpu.allocated": "CPU Allocation",
+"label.metrics.cpu.usage": "CPU Usage",
+"label.metrics.disk.iops.total": "IOPS",
+"label.metrics.disk.read": "Read",
+"label.metrics.disk.usage": "Disk Usage",
+"label.metrics.disk.write": "Write",
+"label.metrics.memory.usage": "Mem Usage",
+"label.metrics.network.read": "Read",
+"label.metrics.network.usage": "Network Usage",
+"label.metrics.network.write": "Write",
+"label.metrics.num.cpu.cores": "Cores",
+"label.migrate.instance.to": "\u8fc1\u79fb\u5b9e\u4f8b\u81f3",
+"label.migrate.instance.to.host": "\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u673a",
+"label.migrate.instance.to.ps": "\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8",
+"label.migrate.lb.vm": "\u8fc1\u79fb LB VM",
+"label.migrate.router.to": "\u8fc1\u79fb\u8def\u7531\u5668\u81f3",
+"label.migrate.systemvm.to": "\u8fc1\u79fb\u7cfb\u7edf VM \u81f3",
+"label.migrate.to.host": "\u8fc1\u79fb\u5230\u4e3b\u673a",
+"label.migrate.to.storage": "\u8fc1\u79fb\u5230\u5b58\u50a8",
+"label.migrate.volume": "\u8fc1\u79fb\u5377",
+"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": "\u5c06\u5377\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8",
+"label.min.balance": "Min Balance",
+"label.min.past.hour": "\u5206 \u6bcf\u5c0f\u65f6",
+"label.minimum": "\u6700\u5c0f\u503c",
+"label.mininstance": "\u6700\u5c0f\u5b9e\u4f8b\u6570",
+"label.miniops": "\u6700\u5c0f IOPS",
+"label.minute.past.hour": "\u5206\u949f\u65f6",
+"label.minutes.past.hour": "\u5206 (\u6bcf\u5c0f\u65f6)",
+"label.monday": "\u661f\u671f\u4e00",
+"label.monthly": "\u6bcf\u6708",
+"label.more.templates": "\u66f4\u591a\u6a21\u677f",
+"label.move.down.row": "\u5411\u4e0b\u79fb\u52a8\u4e00\u884c",
+"label.move.to.bottom": "\u79fb\u81f3\u5e95\u90e8",
+"label.move.to.top": "\u79fb\u81f3\u9876\u90e8",
+"label.move.up.row": "\u5411\u4e0a\u79fb\u52a8\u4e00\u884c",
+"label.my.account": "\u6211\u7684\u5e10\u6237",
+"label.my.network": "\u6211\u7684\u7f51\u7edc",
+"label.my.templates": "\u6211\u7684\u6a21\u677f",
+"label.na": "\u65e0",
+"label.name": "\u540d\u79f0",
+"label.name.optional": "\u540d\u79f0(\u53ef\u9009)",
+"label.nat": "BigSwitch BCF  NAT \u5df2\u542f\u7528",
+"label.nat.port.range": "NAT \u7aef\u53e3\u8303\u56f4",
+"label.netmask": "\u7f51\u7edc\u63a9\u7801",
+"label.netscaler": "NetScaler",
+"label.netscaler.details": "NetScaler \u8be6\u7ec6\u4fe1\u606f",
+"label.network": "\u7f51\u7edc",
+"label.network.acl": "\u7f51\u7edc ACL",
+"label.network.acls": "\u7f51\u7edc ACL",
+"label.network.addvm": "\u5c06\u7f51\u7edc\u6dfb\u52a0\u5230 VM",
+"label.network.desc": "\u7f51\u7edc\u63cf\u8ff0",
+"label.network.details": "\u7f51\u7edc\u8be6\u60c5",
+"label.network.device": "\u7f51\u7edc\u8bbe\u5907",
+"label.network.device.type": "\u7f51\u7edc\u8bbe\u5907\u7c7b\u578b",
+"label.network.domain": "\u7f51\u7edc\u57df",
+"label.network.label.display.for.blank.value": "\u4f7f\u7528\u9ed8\u8ba4\u7f51\u5173",
+"label.network.name": "\u7f51\u7edc\u540d\u79f0",
+"label.network.offering": "\u7f51\u7edc\u65b9\u6848",
+"label.network.offering.details": "\u7f51\u7edc\u65b9\u6848\u8be6\u60c5",
+"label.network.offering.display.text": "\u7f51\u7edc\u65b9\u6848\u663e\u793a\u6587\u672c",
+"label.network.offering.name": "\u7f51\u7edc\u65b9\u6848\u540d\u79f0",
+"label.network.offerings": "\u7f51\u7edc\u65b9\u6848",
+"label.network.service.providers": "\u7f51\u7edc\u670d\u52a1\u63d0\u4f9b\u7a0b\u5e8f",
+"label.networkcidr": "\u7f51\u7edc CIDR",
+"label.networkdevicetype": "\u7c7b\u578b",
+"label.networkdomain": "\u7f51\u7edc\u57df",
+"label.networkdomaintext": "\u7f51\u7edc\u57df",
+"label.networkid": "\u7f51\u7edc",
+"label.networking.and.security": "\u7f51\u7edc\u8fde\u63a5\u4e0e\u5b89\u5168",
+"label.networkkbsread": "\u7f51\u7edc\u8bfb\u53d6\u91cf",
+"label.networkkbswrite": "\u7f51\u7edc\u5199\u5165\u91cf",
+"label.networklimit": "\u7f51\u7edc\u9650\u5236",
+"label.networkname": "\u7f51\u7edc\u540d\u79f0",
+"label.networkofferingdisplaytext": "\u7f51\u7edc\u65b9\u6848",
+"label.networkofferingid": "\u7f51\u7edc\u65b9\u6848",
+"label.networkofferingidtext": "\u7f51\u7edc\u65b9\u6848 ID",
+"label.networkofferingname": "\u7f51\u7edc\u65b9\u6848",
+"label.networkrate": "\u7f51\u7edc\u901f\u7387(MB/\u79d2)",
+"label.networkread": "\u7f51\u7edc\u8bfb\u53d6\u91cf",
+"label.networks": "\u7f51\u7edc",
+"label.networktype": "\u7f51\u7edc\u7c7b\u578b",
+"label.networkwrite": "\u7f51\u7edc\u5199\u5165\u91cf",
+"label.new": "\u65b0\u5efa",
+"label.new.password": "\u65b0\u5bc6\u7801",
+"label.new.project": "\u65b0\u5efa\u9879\u76ee",
+"label.new.vm": "\u65b0\u5efa VM",
+"label.newdiskoffering": "\u65b0\u65b9\u6848",
+"label.newsize": "\u65b0\u5efa\u5927\u5c0f(GB)",
+"label.next": "\u4e0b\u4e00\u6b65",
+"label.nexusvswitch": "Nexus 1000v",
+"label.nfs": "NFS",
+"label.nfs.storage": "NFS \u5b58\u50a8",
+"label.nfscachenfsserver": "NFS \u670d\u52a1\u5668",
+"label.nfscachepath": "\u8def\u5f84",
+"label.nfscachezoneid": "\u8d44\u6e90\u57df",
+"label.nfsserver": "NFS \u670d\u52a1\u5668",
+"label.nicadaptertype": "NIC \u9002\u914d\u5668\u7c7b\u578b",
+"label.nicira.controller.address": "\u63a7\u5236\u5668\u5730\u5740",
+"label.nicira.nvp.details": "Nicira NVP \u8be6\u7ec6\u4fe1\u606f",
+"label.nics": "NIC",
+"label.no": "\u5426",
+"label.no.actions": "\u65e0\u53ef\u7528\u64cd\u4f5c",
+"label.no.alerts": "\u65e0\u6700\u8fd1\u53d1\u51fa\u7684\u8b66\u62a5",
+"label.no.data": "\u65e0\u53ef\u663e\u793a\u7684\u6570\u636e",
+"label.no.errors": "\u65e0\u6700\u8fd1\u51fa\u73b0\u7684\u9519\u8bef",
+"label.no.grouping": "(\u672a\u5206\u7ec4)",
+"label.no.isos": "\u65e0\u53ef\u7528 ISO",
+"label.no.items": "\u65e0\u53ef\u7528\u9879\u76ee",
+"label.no.security.groups": "\u65e0\u53ef\u7528\u5b89\u5168\u7ec4",
+"label.none": "\u65e0",
+"label.noselect": "\u4e0d\uff0c\u8c22\u8c22",
+"label.not.found": "\u672a\u627e\u5230",
+"label.notifications": "\u901a\u77e5",
+"label.num.cpu.cores": "CPU \u5185\u6838\u6570",
+"label.number": "#Rule",
+"label.number.of.clusters": "\u7fa4\u96c6\u6570\u91cf",
+"label.number.of.hosts": "\u4e3b\u673a\u6570\u91cf",
+"label.number.of.pods": "\u63d0\u4f9b\u70b9\u6570\u91cf",
+"label.number.of.system.vms": "\u7cfb\u7edf VM \u6570",
+"label.number.of.virtual.routers": "\u865a\u62df\u8def\u7531\u5668\u6570",
+"label.number.of.zones": "\u8d44\u6e90\u57df\u6570\u91cf",
+"label.numberofrouterrequiresupgrade": "\u9700\u8981\u5347\u7ea7\u7684\u865a\u62df\u8def\u7531\u5668\u603b\u6570",
+"label.numretries": "\u91cd\u8bd5\u6b21\u6570",
+"label.nvpdeviceid": "ID",
+"label.ocfs2": "OCFS2",
+"label.of.month": "\u6708",
+"label.offerha": "\u63d0\u4f9b\u9ad8\u53ef\u7528\u6027",
+"label.ok": "\u786e\u5b9a",
+"label.opendaylight": "OpenDaylight",
+"label.opendaylight.controller": "OpenDaylight \u63a7\u5236\u5668",
+"label.opendaylight.controllerdetail": "OpenDaylight \u63a7\u5236\u5668\u8be6\u7ec6\u4fe1\u606f",
+"label.opendaylight.controllers": "OpenDaylight \u63a7\u5236\u5668",
+"label.optional": "\u53ef\u9009",
+"label.order": "\u6392\u5e8f",
+"label.oscategoryid": "\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879",
+"label.ostypeid": "\u64cd\u4f5c\u7cfb\u7edf\u7c7b\u578b",
+"label.ostypename": "\u64cd\u4f5c\u7cfb\u7edf\u7c7b\u578b",
+"label.other": "\u5176\u4ed6",
+"label.outofbandmanagement": "Out-of-band Management",
+"label.outofbandmanagement.action.issue": "Issue Out-of-band Management Power Action",
+"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.enable": "Enable Out-of-band Management",
+"label.override.guest.traffic": "\u66ff\u4ee3\u6765\u5bbe\u6d41\u91cf",
+"label.override.public.traffic": "\u66ff\u4ee3\u516c\u5171\u6d41\u91cf",
+"label.overrideguesttraffic": "\u66ff\u4ee3\u6765\u5bbe\u6d41\u91cf",
+"label.overridepublictraffic": "\u66ff\u4ee3\u516c\u5171\u6d41\u91cf",
+"label.ovm3cluster": "\u672c\u5730\u96c6\u7fa4",
+"label.ovm3networklabel": "OVM3 traffic label",
+"label.ovm3pool": "\u539f\u751f\u6c60",
+"label.ovm3vip": "\u4e3b\u865a\u62dfIP",
+"label.ovmnetworklabel": "OVM \u6d41\u91cf\u6807\u7b7e",
+"label.ovs": "OVS",
+"label.owned.public.ips": "\u62e5\u6709\u7684\u516c\u7528 IP \u5730\u5740\u6570",
+"label.owner.account": "\u6240\u6709\u8005\u5e10\u6237",
+"label.owner.domain": "\u6240\u6709\u8005\u57df",
+"label.pa": "Palo Alto",
+"label.palo.alto.details": "Palo Alto \u8be6\u7ec6\u4fe1\u606f",
+"label.palp": "Palo Alto \u65e5\u5fd7\u914d\u7f6e\u6587\u4ef6",
+"label.parent.domain": "\u7236\u57df",
+"label.parentname": "\u7236\u540d\u79f0",
+"label.passive": "\u88ab\u52a8",
+"label.password": "\u5bc6\u7801",
+"label.password.reset.confirm": "\u5bc6\u7801\u5df2\u91cd\u7f6e\u4e3a",
+"label.passwordenabled": "\u5df2\u542f\u7528\u5bc6\u7801",
+"label.path": "\u8def\u5f84",
+"label.patp": "Palo Alto \u5a01\u80c1\u914d\u7f6e\u6587\u4ef6",
+"label.pavr": "\u865a\u62df\u8def\u7531\u5668",
+"label.pcidevice": "GPU",
+"label.perfectforwardsecrecy": "\u5b8c\u5168\u6b63\u5411\u4fdd\u5bc6",
+"label.permission": "Permission",
+"label.physical.network": "\u7269\u7406\u7f51\u7edc",
+"label.physical.network.id": "\u7269\u7406\u7f51\u7edc ID",
+"label.physical.network.name": "\u7269\u7406\u7f51\u7edc\u540d\u79f0",
+"label.physicalnetworkid": "\u7269\u7406\u7f51\u7edc",
+"label.physicalsize": "Physical Size",
+"label.ping.cifs.password": "PING CIFS \u5bc6\u7801",
+"label.ping.cifs.username": "PING CIFS \u7528\u6237\u540d",
+"label.ping.dir": "PING \u76ee\u5f55",
+"label.ping.path": "Ping \u8def\u5f84",
+"label.ping.storage.ip": "PING \u5b58\u50a8 IP",
+"label.plannermode": "\u89c4\u5212\u5668\u6a21\u5f0f",
+"label.please.complete.the.following.fields": "\u8bf7\u5b8c\u6210\u4ee5\u4e0b\u5185\u5bb9",
+"label.please.specify.netscaler.info": "\u8bf7\u6307\u5b9a NetScaler \u4fe1\u606f",
+"label.please.wait": "\u8bf7\u7a0d\u5019",
+"label.plugin.details": "\u63d2\u4ef6\u8be6\u7ec6\u4fe1\u606f",
+"label.plugins": "\u63d2\u4ef6",
+"label.pod": "\u63d0\u4f9b\u70b9",
+"label.pod.dedicated": "\u63d0\u4f9b\u70b9\u5df2\u4e13\u7528",
+"label.pod.name": "\u63d0\u4f9b\u70b9\u540d\u79f0",
+"label.podid": "\u63d0\u4f9b\u70b9",
+"label.podname": "\u63d0\u4f9b\u70b9\u540d\u79f0",
+"label.pods": "\u63d0\u4f9b\u70b9",
+"label.port": "\u7aef\u53e3",
+"label.port.forwarding.policies": "\u7aef\u53e3\u8f6c\u53d1\u7b56\u7565",
+"label.port.range": "\u7aef\u53e3\u8303\u56f4",
+"label.portable.ip": "\u53ef\u79fb\u690d IP",
+"label.portable.ip.range.details": "\u53ef\u79fb\u690d IP \u8303\u56f4\u8be6\u7ec6\u4fe1\u606f",
+"label.portable.ip.ranges": "\u53ef\u79fb\u690d IP \u8303\u56f4",
+"label.portableipaddress": "\u53ef\u79fb\u690d IP",
+"label.portforwarding": "\u7aef\u53e3\u8f6c\u53d1",
+"label.powerstate": "Power State",
+"label.presetup": "PreSetup",
+"label.prev": "\u4e0a\u4e00\u9875",
+"label.previous": "\u4e0a\u4e00\u6b65",
+"label.primary.network": "\u4e3b\u7f51\u7edc",
+"label.primary.storage": "\u4e3b\u5b58\u50a8",
+"label.primary.storage.allocated": "\u5df2\u5206\u914d\u7684\u4e3b\u5b58\u50a8",
+"label.primary.storage.count": "\u4e3b\u5b58\u50a8\u6c60",
+"label.primary.storage.used": "\u5df2\u4f7f\u7528\u7684\u4e3b\u5b58\u50a8",
+"label.primarystoragelimit": "\u4e3b\u5b58\u50a8\u9650\u5236(GiB)",
+"label.primarystoragetotal": "\u4e3b\u5b58\u50a8",
+"label.private.gateway": "\u4e13\u7528\u7f51\u5173",
+"label.private.interface": "\u4e13\u7528\u63a5\u53e3",
+"label.private.ip.range": "\u4e13\u7528 IP \u8303\u56f4",
+"label.private.ips": "\u4e13\u7528 IP \u5730\u5740",
+"label.private.zone": "\u4e13\u7528\u8d44\u6e90\u57df",
+"label.privateinterface": "\u4e13\u7528\u63a5\u53e3",
+"label.privateip": "\u4e13\u7528 IP \u5730\u5740",
+"label.privatekey": "PKCS#8 \u79c1\u94a5",
+"label.privatenetwork": "\u4e13\u7528\u7f51\u7edc",
+"label.privateport": "\u4e13\u7528\u7aef\u53e3",
+"label.profiledn": "\u5df2\u5173\u8054\u914d\u7f6e\u6587\u4ef6",
+"label.profilename": "\u914d\u7f6e\u6587\u4ef6",
+"label.project": "\u9879\u76ee",
+"label.project.dashboard": "\u9879\u76ee\u63a7\u5236\u677f",
+"label.project.invite": "\u9080\u8bf7\u52a0\u5165\u9879\u76ee",
+"label.project.name": "\u9879\u76ee\u540d\u79f0",
+"label.project.view": "\u9879\u76ee\u89c6\u56fe",
+"label.projectid": "\u9879\u76ee ID",
+"label.projects": "\u9879\u76ee",
+"label.property": "Property",
+"label.protocol": "\u534f\u8bae",
+"label.protocol.number": "\u534f\u8bae\u7f16\u53f7",
+"label.protocolnumber": "#Protocol",
+"label.provider": "\u63d0\u4f9b\u7a0b\u5e8f",
+"label.providername": "\u63d0\u4f9b\u7a0b\u5e8f",
+"label.providers": "\u63d0\u4f9b\u7a0b\u5e8f",
+"label.provisioningtype": "\u7f6e\u5907\u7c7b\u578b",
+"label.public.interface": "\u516c\u7528\u63a5\u53e3",
+"label.public.ip": "\u516c\u7528 IP \u5730\u5740",
+"label.public.ip.addresses": "\u516c\u7528 IP \u5730\u5740",
+"label.public.ips": "\u516c\u7528 IP \u5730\u5740",
+"label.public.lb": "\u516c\u5171\u8d1f\u8f7d\u5747\u8861\u5668",
+"label.public.load.balancer.provider": "\u516c\u7528\u8d1f\u8f7d\u5e73\u8861\u5668\u63d0\u4f9b\u7a0b\u5e8f",
+"label.public.network": "\u516c\u7528\u7f51\u7edc",
+"label.public.traffic": "\u516c\u5171\u6d41\u91cf",
+"label.public.zone": "\u516c\u7528\u8d44\u6e90\u57df",
+"label.publicinterface": "\u516c\u7528\u63a5\u53e3",
+"label.publicip": "IP \u5730\u5740",
+"label.publickey": "\u516c\u94a5",
+"label.publicnetwork": "\u516c\u7528\u7f51\u7edc",
+"label.publicport": "\u516c\u7528\u7aef\u53e3",
+"label.purpose": "\u76ee\u7684",
+"label.pxe.server.type": "Pxe \u670d\u52a1\u5668\u7c7b\u578b",
+"label.qostype": "QoS \u7c7b\u578b",
+"label.quickview": "\u5feb\u901f\u67e5\u770b",
+"label.quiescevm": "\u9759\u9ed8 VM",
+"label.quiettime": "\u5b89\u9759\u65f6\u95f4(\u79d2)",
+"label.quota": "Quota Value",
+"label.quota.value": "Quota Value",
+"label.quota.add.credits": "Add Credits",
+"label.quota.configuration": "Quota Configuration",
+"label.quota.configure": "Configure Quota",
+"label.quota.credits": "Credits",
+"label.quota.dates": "Update Dates",
+"label.quota.description": "Quota Description",
+"label.quota.enddate": "End Date",
+"label.quota.endquota": "End Quota",
+"label.quota.enforce": "Enforce Quota",
+"label.quota.fullsummary": "\u6240\u6709\u5e10\u6237",
+"label.quota.remove": "Remove Quota",
+"label.quota.startdate": "Start Date",
+"label.quota.startquota": "Start Quota",
+"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.summary": "Summary",
+"label.quota.tariff": "Tariff",
+"label.quota.tariff.edit": "Edit Tariff",
+"label.quota.tariff.effectivedate": "Effective Date",
+"label.quota.totalusage": "Total Usage",
+"label.quota.usage": "Quota Consumption",
+"label.rbd": "RBD",
+"label.rbdid": "Cephx \u7528\u6237",
+"label.rbdmonitor": "Ceph \u76d1\u89c6\u5668",
+"label.rbdpool": "Ceph \u6c60",
+"label.rbdsecret": "Cephx \u5bc6\u94a5",
+"label.reason": "Reason",
+"label.reboot": "\u91cd\u65b0\u542f\u52a8",
+"label.receivedbytes": "\u63a5\u6536\u7684\u5b57\u8282\u6570",
+"label.recent.errors": "\u6700\u8fd1\u51fa\u73b0\u7684\u9519\u8bef",
+"label.recover.vm": "\u6062\u590d VM",
+"label.redundantrouter": "\u5197\u4f59\u8def\u7531\u5668",
+"label.redundantrouterstate": "\u5197\u4f59\u72b6\u6001",
+"label.redundantstate": "\u5197\u4f59\u72b6\u6001",
+"label.redundantvpcrouter": "\u5197\u4f59VPC",
+"label.reenterpassword": "Re-enter Password",
+"label.refresh": "\u5237\u65b0",
+"label.refresh.blades": "\u5237\u65b0\u5200\u7247\u5f0f\u670d\u52a1\u5668",
+"label.region": "\u5730\u7406\u533a\u57df",
+"label.region.details": "\u5730\u7406\u533a\u57df\u8be6\u60c5",
+"label.reinstall.vm": "\u91cd\u65b0\u5b89\u88c5 VM",
+"label.related": "\u76f8\u5173\u8054",
+"label.relationaloperator": "\u8fd0\u7b97\u7b26",
+"label.release.account": "\u4ece\u5e10\u6237\u4e2d\u91ca\u653e",
+"label.release.dedicated.cluster": "\u91ca\u653e\u4e13\u7528\u7fa4\u96c6",
+"label.release.dedicated.host": "\u91ca\u653e\u4e13\u7528\u4e3b\u673a",
+"label.release.dedicated.pod": "\u91ca\u653e\u4e13\u7528\u63d0\u4f9b\u70b9",
+"label.release.dedicated.vlan.range": "\u91ca\u653e\u4e13\u7528 VLAN \u8303\u56f4",
+"label.release.dedicated.zone": "\u91ca\u653e\u4e13\u7528\u8d44\u6e90\u57df",
+"label.remind.later": "\u4ee5\u540e\u63d0\u9192\u6211",
+"label.remove.acl": "\u5220\u9664 ACL",
+"label.remove.egress.rule": "\u5220\u9664\u51fa\u53e3\u89c4\u5219",
+"label.remove.from.load.balancer": "\u6b63\u5728\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664\u5b9e\u4f8b",
+"label.remove.ingress.rule": "\u5220\u9664\u5165\u53e3\u89c4\u5219",
+"label.remove.ip.range": "\u5220\u9664 IP \u8303\u56f4",
+"label.remove.ldap": "\u5220\u9664 LDAP",
+"label.remove.network.offering": "\u5220\u9664\u7f51\u7edc\u65b9\u6848",
+"label.remove.pf": "\u5220\u9664\u7aef\u53e3\u8f6c\u53d1\u89c4\u5219",
+"label.remove.project.account": "\u4ece\u9879\u76ee\u4e2d\u5220\u9664\u5e10\u6237",
+"label.remove.region": "\u5220\u9664\u5730\u7406\u533a\u57df",
+"label.remove.rule": "\u5220\u9664\u89c4\u5219",
+"label.remove.ssh.key.pair": "\u5220\u9664\u5bc6\u94a5\u5bf9",
+"label.remove.static.nat.rule": "\u5220\u9664\u9759\u6001 NAT \u89c4\u5219",
+"label.remove.static.route": "\u5220\u9664\u9759\u6001\u8def\u7531",
+"label.remove.this.physical.network": "\u5220\u9664\u6b64\u7269\u7406\u7f51\u7edc",
+"label.remove.tier": "\u5220\u9664\u5c42",
+"label.remove.vm.from.lb": "\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\u4e2d\u5220\u9664 VM",
+"label.remove.vm.load.balancer": "\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664 VM",
+"label.remove.vmware.datacenter": "\u5220\u9664 VMware \u6570\u636e\u4e2d\u5fc3",
+"label.remove.vpc": "\u5220\u9664 VPC",
+"label.remove.vpc.offering": "\u5220\u9664 VPC \u65b9\u6848",
+"label.removing": "\u6b63\u5728\u5220\u9664",
+"label.removing.user": "\u6b63\u5728\u5220\u9664\u7528\u6237",
+"label.replace.acl": "\u66ff\u6362 ACL",
+"label.replace.acl.list": "\u66ff\u6362 ACL \u5217\u8868",
+"label.required": "\u5fc5\u586b\u9879",
+"label.requireshvm": "HVM",
+"label.requiresupgrade": "\u9700\u8981\u5347\u7ea7",
+"label.reserved.system.gateway": "\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u5173",
+"label.reserved.system.ip": "\u9884\u7559\u7684\u7cfb\u7edf IP",
+"label.reserved.system.netmask": "\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u7edc\u63a9\u7801",
+"label.reservediprange": "\u9884\u7559 IP \u8303\u56f4",
+"label.reservedsystemendip": "\u7ed3\u675f\u9884\u7559\u7cfb\u7edf IP",
+"label.reservedsystemgateway": "\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u5173",
+"label.reservedsystemnetmask": "\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u7edc\u63a9\u7801",
+"label.reservedsystemstartip": "\u8d77\u59cb\u9884\u7559\u7cfb\u7edf IP",
+"label.reset.ssh.key.pair": "\u91cd\u7f6eSSH\u5bc6\u94a5\u5bf9",
+"label.reset.ssh.key.pair.on.vm": "\u91cd\u7f6e\u5b9e\u4f8b\u7684SSH\u5bc6\u94a5\u5bf9",
+"label.reset.vpn.connection": "\u91cd\u7f6e VPN \u8fde\u63a5",
+"label.resetvm": "\u91cd\u7f6e VM",
+"label.resource": "\u8d44\u6e90",
+"label.resource.limit.exceeded": "\u5df2\u8d85\u51fa\u8d44\u6e90\u9650\u5236",
+"label.resource.limits": "\u8d44\u6e90\u9650\u5236",
+"label.resource.name": "\u8d44\u6e90\u540d\u79f0",
+"label.resourceid": "\u8d44\u6e90 ID",
+"label.resourcename": "\u8d44\u6e90\u540d\u79f0",
+"label.resources": "\u8d44\u6e90",
+"label.resourcestate": "\u8d44\u6e90\u72b6\u6001",
+"label.response.timeout.in.sec": "\u54cd\u5e94\u8d85\u65f6(\u79d2)",
+"label.restart.network": "\u91cd\u65b0\u542f\u52a8\u7f51\u7edc",
+"label.restart.vpc": "\u91cd\u65b0\u542f\u52a8 VPC",
+"label.restartrequired": "\u9700\u8981\u91cd\u65b0\u542f\u52a8",
+"label.restore": "\u8fd8\u539f",
+"label.retry.interval": "\u91cd\u8bd5\u65f6\u95f4\u95f4\u9694",
+"label.review": "\u6838\u5bf9",
+"label.revoke.project.invite": "\u64a4\u9500\u9080\u8bf7",
+"label.role": "\u89d2\u8272",
+"label.rolename": "\u89d2\u8272",
+"label.roles": "\u89d2\u8272",
+"label.roletype": "Role Type",
+"label.root.certificate": "\u6839\u8bc1\u4e66",
+"label.root.disk.offering": "\u6839\u78c1\u76d8\u65b9\u6848",
+"label.root.disk.size": "Root disk size (GB)",
+"label.rootdiskcontrollertype": "\u6839\u78c1\u76d8\u63a7\u5236\u5668",
+"label.rootdiskcontrollertypekvm": "\u6839\u78c1\u76d8\u63a7\u5236\u5668",
+"label.router.vm.scaled.up": "\u5df2\u6269\u5c55\u8def\u7531\u5668 VM",
+"label.routercount": "\u865a\u62df\u8def\u7531\u5668\u603b\u6570",
+"label.routerrequiresupgrade": "\u9700\u8981\u5347\u7ea7",
+"label.routertype": "\u7c7b\u578b",
+"label.routing.host": "\u6b63\u5728\u8def\u7531\u4e3b\u673a",
+"label.rule": "\u89c4\u5219",
+"label.rule.number": "\u89c4\u5219\u7f16\u53f7",
+"label.rules": "\u89c4\u5219",
+"label.running": "\u6b63\u5728\u8fd0\u884c\u7684 VM",
+"label.s3.access.key": "\u8bbf\u95ee\u5bc6\u94a5",
+"label.s3.bucket": "\u5b58\u50a8\u6876",
+"label.s3.connection.timeout": "\u8fde\u63a5\u8d85\u65f6",
+"label.s3.endpoint": "\u7aef\u70b9",
+"label.s3.max.error.retry": "\u6700\u5927\u9519\u8bef\u91cd\u8bd5\u6b21\u6570",
+"label.s3.nfs.path": "S3 NFS \u8def\u5f84",
+"label.s3.nfs.server": "S3 NFS \u670d\u52a1\u5668",
+"label.s3.secret.key": "\u5bc6\u94a5",
+"label.s3.socket.timeout": "\u5957\u63a5\u5b57\u8d85\u65f6",
+"label.s3.use.https": "\u4f7f\u7528 HTTPS",
+"label.samlenable": "\u6279\u51c6 SAML SSO",
+"label.samlentity": "\u8ba4\u8bc1\u65b9\u5f0f",
+"label.saturday": "\u661f\u671f\u516d",
+"label.save": "\u4fdd\u5b58",
+"label.save.and.continue": "\u4fdd\u5b58\u5e76\u7ee7\u7eed",
+"label.save.changes": "\u4fdd\u5b58\u4fee\u6539",
+"label.saving.processing": "\u6b63\u5728\u4fdd\u5b58...",
+"label.scale.up.policy": "\u6269\u5c55\u7b56\u7565",
+"label.scaledown.policy": "\u51cf\u7f29\u7b56\u7565",
+"label.scaleup.policy": "\u6269\u5c55\u7b56\u7565",
+"label.scope": "\u8303\u56f4",
+"label.search": "\u641c\u7d22",
+"label.secondary.staging.store": "\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8",
+"label.secondary.staging.store.details": "\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8\u8be6\u7ec6\u4fe1\u606f",
+"label.secondary.storage": "\u4e8c\u7ea7\u5b58\u50a8",
+"label.secondary.storage.count": "\u4e8c\u7ea7\u5b58\u50a8\u6c60",
+"label.secondary.storage.details": "\u4e8c\u7ea7\u5b58\u50a8\u8be6\u7ec6\u4fe1\u606f",
+"label.secondary.storage.vm": "\u4e8c\u7ea7\u5b58\u50a8 VM",
+"label.secondary.used": "\u5df2\u4f7f\u7528\u7684\u4e8c\u7ea7\u5b58\u50a8",
+"label.secondaryips": "\u4e8c\u7ea7 IPs",
+"label.secondarystoragelimit": "\u4e8c\u7ea7\u5b58\u50a8\u9650\u5236(GiB)",
+"label.secretkey": "\u5bc6\u94a5",
+"label.security.group.name": "\u5b89\u5168\u7ec4\u540d\u79f0",
+"label.security.groups": "\u5b89\u5168\u7ec4",
+"label.security.groups.enabled": "\u5df2\u542f\u7528\u5b89\u5168\u7ec4",
+"label.securitygroup": "\u5b89\u5168\u7ec4",
+"label.securitygroups": "\u5b89\u5168\u7ec4",
+"label.select": "\u9009\u62e9",
+"label.select-view": "\u9009\u62e9\u89c6\u56fe",
+"label.select.a.zone": "\u9009\u62e9\u4e00\u4e2a\u8d44\u6e90\u57df",
+"label.select.host": "\u9009\u62e9\u4e3b\u673a",
+"label.select.instance": "\u9009\u62e9\u5b9e\u4f8b",
+"label.select.instance.to.attach.volume.to": "\u9009\u62e9\u8981\u5c06\u5377\u9644\u52a0\u5230\u7684\u5b9e\u4f8b",
+"label.select.iso.or.template": "\u9009\u62e9 ISO \u6216\u6a21\u677f",
+"label.select.offering": "\u9009\u62e9\u65b9\u6848",
+"label.select.project": "\u9009\u62e9\u9879\u76ee",
+"label.select.region": "\u9009\u62e9\u5730\u7406\u533a\u57df",
+"label.select.tier": "\u9009\u62e9\u5c42",
+"label.select.vm.for.static.nat": "\u4e3a\u9759\u6001 NAT \u9009\u62e9 VM",
+"label.self": "\u672c\u7528\u6237",
+"label.sent": "\u5df2\u53d1\u9001",
+"label.sentbytes": "\u53d1\u9001\u7684\u5b57\u8282\u6570",
+"label.server": "\u670d\u52a1\u5668",
+"label.service.connectivity.distributedroutercapabilitycheckbox": "\u5206\u5e03\u5f0f\u8def\u7531\u5668",
+"label.service.connectivity.regionlevelvpccapabilitycheckbox": "\u5730\u7406\u533a\u57df\u7ea7 VPC",
+"label.service.lb.elasticlbcheckbox": "\u5f39\u6027\u8d1f\u8f7d\u5e73\u8861\u5668",
+"label.service.lb.inlinemodedropdown": "\u6a21\u5f0f",
+"label.service.lb.lbisolationdropdown": "\u8d1f\u8f7d\u5e73\u8861\u5668\u9694\u79bb",
+"label.service.offering": "\u670d\u52a1\u65b9\u6848",
+"label.service.offering.details": "\u670d\u52a1\u65b9\u6848\u8be6\u60c5",
+"label.service.sourcenat.redundantroutercapabilitycheckbox": "\u5197\u4f59\u8def\u7531\u5668\u529f\u80fd",
+"label.service.state": "\u670d\u52a1\u72b6\u6001",
+"label.service.staticnat.associatepublicip": "\u5173\u8054\u516c\u7528 IP",
+"label.service.staticnat.elasticipcheckbox": "\u5f39\u6027 IP",
+"label.servicecapabilities": "\u670d\u52a1\u529f\u80fd",
+"label.servicelist": "\u670d\u52a1",
+"label.serviceofferingid": "\u8ba1\u7b97\u65b9\u6848",
+"label.serviceofferingname": "\u8ba1\u7b97\u65b9\u6848",
+"label.session.expired": "\u4f1a\u8bdd\u5df2\u8fc7\u671f",
+"label.set.default.nic": "\u8bbe\u7f6e\u9ed8\u8ba4 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": "\u8bbe\u7f6e\u8d44\u6e90\u57df\u7c7b\u578b",
+"label.settings": "\u8bbe\u7f6e",
+"label.setup": "\u8bbe\u7f6e",
+"label.setup.network": "\u914d\u7f6e\u7f51\u7edc",
+"label.setup.zone": "\u914d\u7f6e\u533a\u57df",
+"label.shared": "\u5df2\u5171\u4eab",
+"label.sharedexecutable": "\u5df2\u5171\u4eab",
+"label.sharedmountpoint": "SharedMountPoint",
+"label.show.ingress.rule": "\u663e\u793a\u5165\u53e3\u89c4\u5219",
+"label.shrinkok": "\u662f\u5426\u786e\u5b9e\u8981\u7f29\u5c0f\u5377\u5927\u5c0f",
+"label.shutdown.provider": "\u5173\u95ed\u63d0\u4f9b\u7a0b\u5e8f",
+"label.simplified.chinese.keyboard": "\u7b80\u4f53\u4e2d\u6587\u952e\u76d8",
+"label.site.to.site.vpn": "\u70b9\u5bf9\u70b9 VPN",
+"label.size": "\u5927\u5c0f",
+"label.sizegb": "\u5927\u5c0f",
+"label.skip.guide": "\u6211\u4ee5\u524d\u4f7f\u7528\u8fc7 CloudStack\uff0c\u8df3\u8fc7\u6b64\u6307\u5357",
+"label.smb.domain": "SMB \u57df",
+"label.smb.password": "SMB \u5bc6\u7801",
+"label.smb.username": "SMB \u7528\u6237\u540d",
+"label.smbdomain": "SMB \u57df",
+"label.smbpassword": "SMB \u5bc6\u7801",
+"label.smbusername": "SMB \u7528\u6237\u540d",
+"label.snapshot": "\u5feb\u7167",
+"label.snapshot.name": "\u5feb\u7167\u540d\u79f0",
+"label.snapshot.schedule": "\u8bbe\u7f6e\u91cd\u73b0\u5feb\u7167",
+"label.snapshotlimit": "\u5feb\u7167\u9650\u5236",
+"label.snapshotmemory": "\u5feb\u7167\u5185\u5b58",
+"label.snapshots": "\u5feb\u7167",
+"label.snmpcommunity": "SNMP \u793e\u533a",
+"label.snmpport": "SNMP \u7aef\u53e3",
+"label.sockettimeout": "\u5957\u63a5\u5b57\u8d85\u65f6",
+"label.source.nat.supported": "\u652f\u6301 SourceNAT",
+"label.sourcecidr": "\u6e90 CIDR",
+"label.sourceipaddress": "\u6e90 IP \u5730\u5740",
+"label.sourcenat": "\u6e90 NAT",
+"label.sourcenattype": "\u652f\u6301\u7684\u6e90 NAT \u7c7b\u578b",
+"label.sourceport": "\u6e90\u7aef\u53e3",
+"label.specify.vxlan": "\u6307\u5b9a VXLAN",
+"label.specifyipranges": "\u6307\u5b9a IP \u8303\u56f4",
+"label.specifyvlan": "\u6307\u5b9a VLAN",
+"label.sr.name": "SR \u540d\u79f0\u6807\u7b7e",
+"label.srx": "SRX",
+"label.srx.details": "SRX \u8be6\u7ec6\u4fe1\u606f",
+"label.ssh.key.pair.details": "SSH\u5bc6\u94a5\u5bf9\u8be6\u60c5",
+"label.ssh.key.pairs": "SSH\u5bc6\u94a5\u5bf9",
+"label.sshkeypair": "\u65b0SSH\u5bc6\u94a5\u5bf9",
+"label.standard.us.keyboard": "\u6807\u51c6(US)\u952e\u76d8",
+"label.start.ip": "\u8d77\u59cb IP",
+"label.start.lb.vm": "\u542f\u52a8 LB VM",
+"label.start.reserved.system.ip": "\u8d77\u59cb\u9884\u7559\u7cfb\u7edf IP",
+"label.start.vlan": "\u8d77\u59cb VLAN",
+"label.start.vxlan": "\u8d77\u59cb VXLAN",
+"label.startdate": "\u6309\u65e5\u671f(\u5f00\u59cb\u65e5\u671f)",
+"label.startip": "\u8d77\u59cb IP",
+"label.startipv4": "IPv4 \u8d77\u59cb IP",
+"label.startipv6": "IPv6 \u8d77\u59cb IP",
+"label.startport": "\u8d77\u59cb\u7aef\u53e3",
+"label.startquota": "Quota Value",
+"label.state": "\u72b6\u6001",
+"label.static.nat.enabled": "\u5df2\u542f\u7528\u9759\u6001 NAT",
+"label.static.nat.to": "\u9759\u6001 NAT \u76ee\u6807",
+"label.static.nat.vm.details": "\u9759\u6001 NAT VM \u8be6\u60c5",
+"label.static.routes": "\u9759\u6001\u8def\u7531\u5668",
+"label.statistics": "\u7edf\u8ba1\u6570\u636e",
+"label.status": "\u72b6\u6001",
+"label.step.1": "\u6b65\u9aa4 1",
+"label.step.1.title": "\u6b65\u9aa4 1: <strong>\u9009\u62e9\u4e00\u4e2a\u6a21\u677f</strong>",
+"label.step.2": "\u6b65\u9aa4 2",
+"label.step.2.title": "\u6b65\u9aa4 2: <strong>\u670d\u52a1\u65b9\u6848</strong>",
+"label.step.3": "\u6b65\u9aa4 3",
+"label.step.3.title": "\u6b65\u9aa4 3: <strong id=\"step3_label\">\u9009\u62e9\u4e00\u79cd\u78c1\u76d8\u65b9\u6848</strong>",
+"label.step.4": "\u6b65\u9aa4 4",
+"label.step.4.title": "\u6b65\u9aa4 4: <strong>\u7f51\u7edc</strong>",
+"label.step.5": "\u6b65\u9aa4 5",
+"label.step.5.title": "\u6b65\u9aa4 5: <strong>\u6838\u5bf9</strong>",
+"label.stickiness.method": "\u7c98\u6027\u65b9\u6cd5",
+"label.sticky.cookie-name": "Cookie \u540d\u79f0",
+"label.sticky.expire": "\u8fc7\u671f\u65e5\u671f",
+"label.sticky.holdtime": "\u6301\u7eed\u65f6\u95f4",
+"label.sticky.indirect": "indirect",
+"label.sticky.length": "\u957f\u5ea6",
+"label.sticky.name": "\u7c98\u6027\u540d\u79f0",
+"label.sticky.nocache": "nocache",
+"label.sticky.postonly": "postonly",
+"label.sticky.prefix": "prefix",
+"label.sticky.request-learn": "request-learn",
+"label.sticky.tablesize": "\u8868\u5927\u5c0f",
+"label.stop": "\u505c\u6b62",
+"label.stop.lb.vm": "\u505c\u6b62 LB VM",
+"label.stopped": "\u5df2\u505c\u6b62\u7684 VM",
+"label.storage": "\u5b58\u50a8",
+"label.storage.tags": "\u5b58\u50a8\u6807\u7b7e",
+"label.storage.traffic": "\u5b58\u50a8\u6d41\u91cf",
+"label.storageid": "\u4e3b\u5b58\u50a8",
+"label.storagepool": "\u5b58\u50a8\u6c60",
+"label.storagetags": "\u5b58\u50a8\u6807\u7b7e",
+"label.storagetype": "\u5b58\u50a8\u7c7b\u578b",
+"label.subdomainaccess": "\u5b50\u57df\u8bbf\u95ee",
+"label.submit": "\u63d0\u4ea4",
+"label.submitted.by": "[\u63d0\u4ea4\u8005: <span id=\"submitted_by\"></span>]",
+"label.succeeded": "\u6210\u529f",
+"label.suitability": "\u9002\u5e94\u6027",
+"label.sunday": "\u661f\u671f\u65e5",
+"label.supportedservices": "\u652f\u6301\u7684\u670d\u52a1",
+"label.supportspublicaccess": "Supports Public Access",
+"label.supportsregionlevelvpc": "\u652f\u6301\u5730\u7406\u533a\u57df\u7ea7 VPC",
+"label.supportsstrechedl2subnet": "\u652f\u6301\u6269\u5c55\u4e8c\u7ea7\u5b50\u7f51",
+"label.suspend.project": "\u6682\u505c\u9879\u76ee",
+"label.switch.type": "\u4ea4\u6362\u673a\u7c7b\u578b",
+"label.system.capacity": "\u7cfb\u7edf\u5bb9\u91cf",
+"label.system.offering": "\u7cfb\u7edf\u65b9\u6848",
+"label.system.offering.for.router": "\u8def\u7531\u5668\u7684\u7cfb\u7edf\u65b9\u6848",
+"label.system.offerings": "\u7cfb\u7edf\u65b9\u6848",
+"label.system.service.offering": "\u7cfb\u7edf\u670d\u52a1\u65b9\u6848",
+"label.system.service.offering.details": "\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u8be6\u60c5",
+"label.system.vm": "\u7cfb\u7edf VM",
+"label.system.vm.details": "\u7cfb\u7edf VM \u8be6\u7ec6\u4fe1\u606f",
+"label.system.vm.scaled.up": "\u5df2\u6269\u5c55\u7cfb\u7edf VM",
+"label.system.vms": "\u7cfb\u7edf VM",
+"label.system.wide.capacity": "\u6574\u4e2a\u7cfb\u7edf\u7684\u5bb9\u91cf",
+"label.systemvmtype": "\u7cfb\u7edf VM \u7c7b\u578b",
+"label.tag.key": "\u6807\u8bb0\u5bc6\u94a5",
+"label.tag.value": "\u6807\u8bb0\u503c",
+"label.tagged": "\u5df2\u6807\u8bb0",
+"label.tags": "\u6807\u7b7e",
+"label.target.iqn": "\u76ee\u6807 IQN",
+"label.tariffvalue": "Tariff Value",
+"label.task.completed": "\u5df2\u5b8c\u6210\u4efb\u52a1",
+"label.template": "\u6a21\u677f",
+"label.templatebody": "Body",
+"label.templatedn": "\u9009\u62e9\u6a21\u677f",
+"label.templatefileupload": "\u672c\u5730\u6587\u4ef6",
+"label.templatelimit": "\u6a21\u677f\u9650\u5236",
+"label.templatename": "\u6a21\u677f",
+"label.templatenames": "\u6a21\u677f",
+"label.templates": "\u6a21\u677f",
+"label.templatesubject": "Subject",
+"label.templatetotal": "\u6a21\u677f",
+"label.templatetype": "Email Template",
+"label.tftp.dir": "TFTP \u76ee\u5f55",
+"label.tftpdir": "Tftp \u6839\u76ee\u5f55",
+"label.theme.default": "\u9ed8\u8ba4\u4e3b\u9898",
+"label.theme.grey": "\u81ea\u5b9a\u4e49 - \u7070\u8272",
+"label.theme.lightblue": "\u81ea\u5b9a\u4e49 - \u6de1\u84dd\u8272",
+"label.threshold": "\u9608\u503c",
+"label.thursday": "\u661f\u671f\u56db",
+"label.tier.details": "\u5c42\u8be6\u7ec6\u4fe1\u606f",
+"label.tiername": "\u5c42",
+"label.time": "\u65f6\u95f4",
+"label.time.colon": "\u65f6\u95f4:",
+"label.timeout": "\u8d85\u65f6",
+"label.timeout.in.second ": " \u8d85\u65f6(\u79d2)",
+"label.timezone": "\u65f6\u533a",
+"label.timezone.colon": "\u65f6\u533a",
+"label.token": "\u4ee4\u724c",
+"label.total.hosts": "\u603b\u4e3b\u673a\u6570",
+"label.total.memory": "\u5185\u5b58\u603b\u91cf",
+"label.total.storage": "\u5b58\u50a8\u603b\u91cf",
+"label.total.vms": "\u603b VM \u6570",
+"label.totalcpu": "CPU \u603b\u91cf",
+"label.traffic.label": "\u6d41\u91cf\u6807\u7b7e",
+"label.traffic.types": "\u6d41\u91cf\u7c7b\u578b",
+"label.traffictype": "\u6d41\u91cf\u7c7b\u578b",
+"label.transportzoneuuid": "\u4f20\u8f93\u8d44\u6e90\u57df UUID",
+"label.tuesday": "\u661f\u671f\u4e8c",
+"label.type": "\u7c7b\u578b",
+"label.type.id": "\u7c7b\u578b ID",
+"label.ucs": "UCS",
+"label.uk.keyboard": "\u7f8e\u5f0f\u952e\u76d8",
+"label.unavailable": "\u4e0d\u53ef\u7528",
+"label.unhealthy.threshold": "\u4e0d\u6b63\u5e38\u9608\u503c",
+"label.unit": "Usage Unit",
+"label.unlimited": "\u65e0\u9650\u5236",
+"label.untagged": "\u5df2\u53d6\u6d88\u6807\u8bb0",
+"label.update.project.resources": "\u66f4\u65b0\u9879\u76ee\u8d44\u6e90",
+"label.update.ssl": " SSL \u8bc1\u4e66",
+"label.update.ssl.cert": " SSL \u8bc1\u4e66",
+"label.updating": "\u6b63\u5728\u66f4\u65b0",
+"label.upgrade.router.newer.template": "\u5347\u7ea7\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"label.upload": "\u4e0a\u8f7d",
+"label.upload.from.local": "\u901a\u8fc7\u672c\u5730\u4e0a\u4f20",
+"label.upload.template.from.local": "\u901a\u8fc7\u672c\u5730\u4e0a\u4f20\u6a21\u677f",
+"label.upload.volume": "\u4e0a\u8f7d\u5377",
+"label.upload.volume.from.local": "\u901a\u8fc7\u672c\u5730\u4e0a\u4f20\u5377",
+"label.upload.volume.from.url": "\u901a\u8fc7URL\u4e0a\u4f20\u5377",
+"label.url": "URL",
+"label.usage.sanity.result": "\u4f7f\u7528\u5065\u5168\u6027\u68c0\u67e5\u7ed3\u679c",
+"label.usage.server": "\u4f7f\u7528\u670d\u52a1\u5668",
+"label.usageinterface": "\u4f7f\u7528\u754c\u9762",
+"label.usagename": "Usage Type",
+"label.usageunit": "Unit",
+"label.use.vm.ip": "\u4f7f\u7528 VM IP:",
+"label.use.vm.ips": "\u4f7f\u7528 VM IP",
+"label.usehttps": "\u4f7f\u7528 HTTPS",
+"label.usenewdiskoffering": "Replace disk offering?",
+"label.user": "\u7528\u6237",
+"label.user.details": "\u7528\u6237\u8be6\u60c5",
+"label.user.vm": "\u7528\u6237 VM",
+"label.userdata": "\u7528\u6237\u6570\u636e",
+"label.userdatal2": "\u7528\u6237\u6570\u636e",
+"label.username": "\u7528\u6237\u540d",
+"label.users": "\u7528\u6237",
+"label.usevpc": "VPC",
+"label.utilization": "Utilisation",
+"label.uuid": "ID",
+"label.value": "\u503c",
+"label.vcdcname": "vCenter DC \u540d\u79f0",
+"label.vcenter": "vCenter",
+"label.vcenter.cluster": "vCenter \u7fa4\u96c6",
+"label.vcenter.datacenter": "vCenter \u6570\u636e\u4e2d\u5fc3",
+"label.vcenter.datastore": "vCenter \u6570\u636e\u5b58\u50a8",
+"label.vcenter.host": "vCenter \u4e3b\u673a",
+"label.vcenter.password": "vCenter \u5bc6\u7801",
+"label.vcenter.username": "vCenter \u7528\u6237\u540d",
+"label.vcenterdatacenter": "vCenter \u6570\u636e\u4e2d\u5fc3",
+"label.vcenterdatastore": "vCenter \u6570\u636e\u5b58\u50a8",
+"label.esx.host": "ESX/ESXi \u4e3b\u673a",
+"label.vcenterpassword": "vCenter \u5bc6\u7801",
+"label.vcenterusername": "vCenter \u7528\u6237\u540d",
+"label.vcipaddress": "vCenter IP \u5730\u5740",
+"label.vcsdeviceid": "ID",
+"label.version": "\u7248\u672c",
+"label.vgpu": "VGPU",
+"label.vgpu.max.resolution": "\u6700\u5927\u5206\u8fa8\u7387",
+"label.vgpu.max.vgpu.per.gpu": "\u6bcf\u4e2a GPU \u7684 vGPU \u6570",
+"label.vgpu.remaining.capacity": "\u5269\u4f59\u5bb9\u91cf",
+"label.vgpu.video.ram": "\u89c6\u9891 RAM",
+"label.vgputype": "vGPU \u7c7b\u578b",
+"label.view": "\u67e5\u770b",
+"label.view.all": "\u67e5\u770b\u5168\u90e8",
+"label.view.console": "\u67e5\u770b\u63a7\u5236\u53f0",
+"label.view.more": "\u67e5\u770b\u66f4\u591a",
+"label.view.secondary.ips": "\u67e5\u770b\u4e8c\u7ea7 IP",
+"label.viewing": "\u67e5\u770b",
+"label.virtual.appliance": "\u865a\u62df\u8bbe\u5907",
+"label.virtual.appliance.details": "\u865a\u62df\u8bbe\u5907\u8be6\u7ec6\u4fe1\u606f",
+"label.virtual.appliances": "\u865a\u62df\u8bbe\u5907",
+"label.virtual.machine": "\u865a\u62df\u673a",
+"label.virtual.machines": "\u865a\u62df\u673a",
+"label.virtual.network": "\u865a\u62df\u7f51\u7edc",
+"label.virtual.networking": "\u865a\u62df\u7f51\u7edc\u8fde\u63a5",
+"label.virtual.routers": "\u865a\u62df\u8def\u7531\u5668",
+"label.virtual.routers.group.account": "\u865a\u62df\u8def\u7531\u5668(\u6309\u5e10\u6237\u5206\u7ec4)",
+"label.virtual.routers.group.cluster": "\u865a\u62df\u8def\u7531\u5668(\u6309\u7fa4\u96c6\u5206\u7ec4)",
+"label.virtual.routers.group.pod": "\u865a\u62df\u8def\u7531\u5668(\u6309\u63d0\u4f9b\u70b9\u5206\u7ec4)",
+"label.virtual.routers.group.zone": "\u865a\u62df\u8def\u7531\u5668(\u6309\u8d44\u6e90\u57df\u5206\u7ec4)",
+"label.virtualmachinedisplayname": "VM Name",
+"label.virtualmachineid": "VM ID",
+"label.virtualsize": "Virtual Size",
+"label.vlan": "VLAN/VNI",
+"label.vlan.range": "VLAN/VNI \u8303\u56f4",
+"label.vlan.range.details": "VLAN \u8303\u56f4\u8be6\u7ec6\u4fe1\u606f",
+"label.vlan.vni.ranges": "VLAN/VNI \u8303\u56f4",
+"label.vlanid": "VLAN/VNI ID",
+"label.vlanname": "VLAN",
+"label.vlanrange": "VLAN/VNI \u8303\u56f4",
+"label.vm.add": "\u6dfb\u52a0\u5b9e\u4f8b",
+"label.vm.destroy": "\u9500\u6bc1",
+"label.vm.password": "VM \u7684\u5bc6\u7801",
+"label.vm.reboot": "\u91cd\u65b0\u542f\u52a8",
+"label.vm.snapshots": "VM \u5feb\u7167",
+"label.vm.start": "\u542f\u52a8",
+"label.vm.stop": "\u505c\u6b62",
+"label.vmdisplayname": "VM \u663e\u793a\u540d\u79f0",
+"label.vmfs": "VMFS",
+"label.vmfs.datastore": "VMFS \u6570\u636e\u5b58\u50a8",
+"label.vmipaddress": "VM IP \u5730\u5740",
+"label.vmlimit": "\u5b9e\u4f8b\u9650\u5236",
+"label.vmname": "VM Name",
+"label.vms": "VM",
+"label.vms.in.tier": "\u5c42\u4e2d\u7684 VM",
+"label.vmstate": "VM \u72b6\u6001",
+"label.vmtotal": "\u603b VM \u6570",
+"label.vmwaredcid": "VMware \u6570\u636e\u4e2d\u5fc3 ID",
+"label.vmwaredcname": "VMware \u6570\u636e\u4e2d\u5fc3\u540d\u79f0",
+"label.vmwaredcvcenter": "VMware \u6570\u636e\u4e2d\u5fc3 vCenter",
+"label.vmwarenetworklabel": "VMware \u6d41\u91cf\u6807\u7b7e",
+"label.vnmc": "VNMC",
+"label.vnmc.devices": "VNMC \u8bbe\u5907",
+"label.volgroup": "\u5377\u7ec4",
+"label.volume": "\u5377",
+"label.volume.details": "\u5377\u8be6\u7ec6\u4fe1\u606f",
+"label.volume.migrated": "\u5377\u5df2\u8fc1\u79fb",
+"label.volumechecksum": "MD5 \u6821\u9a8c\u548c",
+"label.volumefileupload": "\u672c\u5730\u6587\u4ef6",
+"label.volumegroup": "\u5377\u7ec4",
+"label.volumelimit": "\u5377\u9650\u5236",
+"label.volumename": "\u5377\u540d\u79f0",
+"label.volumes": "\u5377",
+"label.volumetotal": "\u5377",
+"label.vpc": "VPC",
+"label.vpc.id": "VPC ID",
+"label.vpc.offering.details": "VPC \u65b9\u6848\u8be6\u7ec6\u4fe1\u606f",
+"label.vpc.offerings": "VPC \u65b9\u6848",
+"label.vpc.router.details": "VPC \u8def\u7531\u5668\u8be6\u7ec6\u4fe1\u606f",
+"label.vpc.virtual.router": "VPC \u865a\u62df\u8def\u7531\u5668",
+"label.vpcid": "VPC",
+"label.vpclimit": "VPC \u9650\u5236",
+"label.vpcname": "VPC",
+"label.vpcoffering": "VPC \u65b9\u6848",
+"label.vpn": "VPN",
+"label.vpn.connection": "VPN \u8fde\u63a5",
+"label.vpn.gateway": "VPN \u7f51\u5173",
+"label.vpncustomergatewayid": "VPN \u5ba2\u6237\u7f51\u5173",
+"label.vsmctrlvlanid": "\u63a7\u5236 VLAN ID",
+"label.vsmdeviceid": "\u540d\u79f0",
+"label.vsmdevicestate": "\u72b6\u6001",
+"label.vsmipaddress": "Nexus 1000v IP \u5730\u5740",
+"label.vsmpassword": "Nexus 1000v \u5bc6\u7801",
+"label.vsmpktvlanid": "\u6570\u636e\u5305 VLAN ID",
+"label.vsmstoragevlanid": "\u5b58\u50a8 VLAN ID",
+"label.vsmusername": "Nexus 1000v \u7528\u6237\u540d",
+"label.vsmusername.req": "Nexus 1000v \u7528\u6237\u540d",
+"label.vsphere.managed": "\u7531 vSphere \u7ba1\u7406",
+"label.vswitch.name": "vSwitch \u540d\u79f0",
+"label.vswitch.type": "vSwitch \u7c7b\u578b",
+"label.vswitchguestname": "\u6765\u5bbe\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u540d\u79f0",
+"label.vswitchguesttype": "\u6765\u5bbe\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u7c7b\u578b",
+"label.vswitchpublicname": "\u516c\u5171\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u540d\u79f0",
+"label.vswitchpublictype": "\u516c\u5171\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u7c7b\u578b",
+"label.vxlan": "VXLAN",
+"label.vxlan.id": "VXLAN ID",
+"label.vxlan.range": "VXLAN \u8303\u56f4",
+"label.waiting": "\u6b63\u5728\u7b49\u5f85",
+"label.warn": "\u8b66\u544a",
+"label.warn.upper": "\u8b66\u544a",
+"label.warning": "\u8b66\u544a",
+"label.wednesday": "\u661f\u671f\u4e09",
+"label.weekly": "\u6bcf\u5468",
+"label.welcome": "\u6b22\u8fce",
+"label.welcome.cloud.console": "\u6b22\u8fce\u4f7f\u7528\u7ba1\u7406\u63a7\u5236\u53f0",
+"label.what.is.cloudstack": "\u4ec0\u4e48\u662f CloudStack&#8482?",
+"label.writecachetype": "\u5199\u5165\u7f13\u5b58\u7c7b\u578b",
+"label.xennetworklabel": "XenServer \u6d41\u91cf\u6807\u7b7e",
+"label.xenservertoolsversion61plus": "\u539f\u59cb XS \u7248\u672c\u4e3a 6.1+",
+"label.yes": "\u662f",
+"label.zone": "\u8d44\u6e90\u57df",
+"label.zone.dedicated": "\u8d44\u6e90\u57df\u5df2\u4e13\u7528",
+"label.zone.details": "\u8d44\u6e90\u57df\u8be6\u7ec6\u4fe1\u606f",
+"label.zone.id": "\u8d44\u6e90\u57df ID",
+"label.zone.step.1.title": "\u6b65\u9aa4 1: <strong>\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc</strong>",
+"label.zone.step.2.title": "\u6b65\u9aa4 2: <strong>\u6dfb\u52a0\u4e00\u4e2a\u8d44\u6e90\u57df</strong>",
+"label.zone.step.3.title": "\u6b65\u9aa4 3: <strong>\u6dfb\u52a0\u4e00\u4e2a\u63d0\u4f9b\u70b9</strong>",
+"label.zone.step.4.title": "\u6b65\u9aa4 4: <strong>\u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4</strong>",
+"label.zone.type": "\u8d44\u6e90\u57df\u7c7b\u578b",
+"label.zone.wide": "\u6574\u4e2a\u8d44\u6e90\u57df",
+"label.zoneid": "\u8d44\u6e90\u57df",
+"label.zonename": "\u8d44\u6e90\u57df",
+"label.zonenamelabel": "\u533a\u57df\u540d\u79f0",
+"label.zones": "\u8d44\u6e90\u57df",
+"label.zonewizard.traffictype.guest": "\u6765\u5bbe: \u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u6d41\u91cf",
+"label.zonewizard.traffictype.management": "\u7ba1\u7406: CloudStack \u7684\u5185\u90e8\u8d44\u6e90(\u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u901a\u4fe1\u7684\u4efb\u4f55\u7ec4\u4ef6\uff0c\u4f8b\u5982\u4e3b\u673a\u548c CloudStack \u7cfb\u7edf VM)\u4e4b\u95f4\u7684\u6d41\u91cf",
+"label.zonewizard.traffictype.public": "\u516c\u7528: \u4e91\u4e2d Internet \u4e0e\u865a\u62df\u673a\u4e4b\u95f4\u7684\u6d41\u91cf\u3002",
+"label.zonewizard.traffictype.storage": "\u5b58\u50a8: \u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u4e0e\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668(\u4f8b\u5982 VM \u6a21\u677f\u4e0e\u5feb\u7167)\u4e4b\u95f4\u7684\u6d41\u91cf",
+"message.acquire.ip.nic": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u83b7\u53d6\u6b64 NIC \u7684\u65b0\u4e8c\u7ea7 IP\u3002<br/>\u6ce8\u610f: \u60a8\u9700\u8981\u5728\u865a\u62df\u673a\u5185\u90e8\u624b\u52a8\u914d\u7f6e\u65b0\u83b7\u53d6\u7684\u4e8c\u7ea7 IP\u3002",
+"message.acquire.new.ip": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7f51\u7edc\u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002",
+"message.acquire.new.ip.vpc": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64 VPC \u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002",
+"message.acquire.public.ip": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u8981\u4ece\u4e2d\u83b7\u53d6\u65b0 IP \u7684\u8d44\u6e90\u57df\u3002",
+"message.action.cancel.maintenance": "\u5df2\u6210\u529f\u53d6\u6d88\u7ef4\u62a4\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u65f6\u95f4\u3002",
+"message.action.cancel.maintenance.mode": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u53d6\u6d88\u6b64\u7ef4\u62a4\u6a21\u5f0f\u3002",
+"message.action.change.service.warning.for.instance": "\u5fc5\u987b\u5148\u7981\u7528\u60a8\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u670d\u52a1\u65b9\u6848\u3002",
+"message.action.change.service.warning.for.router": "\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u8def\u7531\u5668\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u670d\u52a1\u65b9\u6848\u3002",
+"message.action.delete.cluster": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7fa4\u96c6\u3002",
+"message.action.delete.disk.offering": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u78c1\u76d8\u65b9\u6848\u3002",
+"message.action.delete.domain": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u57df\u3002",
+"message.action.delete.external.firewall": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5916\u90e8\u9632\u706b\u5899\u3002\u8b66\u544a: \u5982\u679c\u60a8\u8ba1\u5212\u91cd\u65b0\u6dfb\u52a0\u540c\u4e00\u4e2a\u5916\u90e8\u9632\u706b\u5899\uff0c\u5219\u5fc5\u987b\u5728\u8bbe\u5907\u4e0a\u91cd\u7f6e\u4f7f\u7528\u6570\u636e\u3002",
+"message.action.delete.external.load.balancer": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5916\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\u3002\u8b66\u544a: \u5982\u679c\u60a8\u8ba1\u5212\u91cd\u65b0\u6dfb\u52a0\u540c\u4e00\u4e2a\u5916\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\uff0c\u5219\u5fc5\u987b\u5728\u8bbe\u5907\u4e0a\u91cd\u7f6e\u4f7f\u7528\u6570\u636e\u3002",
+"message.action.delete.ingress.rule": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5165\u53e3\u89c4\u5219\u3002",
+"message.action.delete.iso": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 ISO\u3002",
+"message.action.delete.iso.for.all.zones": "\u6b64 ISO \u7531\u6240\u6709\u8d44\u6e90\u57df\u4f7f\u7528\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5176\u4ece\u6240\u6709\u8d44\u6e90\u57df\u4e2d\u5220\u9664\u3002",
+"message.action.delete.network": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u7edc\u3002",
+"message.action.delete.nexusvswitch": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 Nexus 1000v",
+"message.action.delete.physical.network": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7269\u7406\u7f51\u7edc",
+"message.action.delete.pod": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u63d0\u4f9b\u70b9\u3002",
+"message.action.delete.primary.storage": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e3b\u5b58\u50a8\u3002",
+"message.action.delete.secondary.storage": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e8c\u7ea7\u5b58\u50a8\u3002",
+"message.action.delete.security.group": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5b89\u5168\u7ec4\u3002",
+"message.action.delete.service.offering": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u670d\u52a1\u65b9\u6848\u3002",
+"message.action.delete.snapshot": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5feb\u7167\u3002",
+"message.action.delete.system.service.offering": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u3002",
+"message.action.delete.template": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u6a21\u677f\u3002",
+"message.action.delete.template.for.all.zones": "\u6b64\u6a21\u677f\u7531\u6240\u6709\u8d44\u6e90\u57df\u4f7f\u7528\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5176\u4ece\u6240\u6709\u8d44\u6e90\u57df\u4e2d\u5220\u9664\u3002",
+"message.action.delete.volume": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5377\u3002",
+"message.action.delete.zone": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u8d44\u6e90\u57df\u3002",
+"message.action.destroy.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u5b9e\u4f8b\u3002",
+"message.action.destroy.systemvm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u7cfb\u7edf VM\u3002",
+"message.action.destroy.volume": "\u4f60\u786e\u5b9a\u8981\u9500\u6bc1\u8fd9\u4e2a\u5377\u5417?",
+"message.action.disable.cluster": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7fa4\u96c6\u3002",
+"message.action.disable.nexusvswitch": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64 Nexus 1000v",
+"message.action.disable.physical.network": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7269\u7406\u7f51\u7edc\u3002",
+"message.action.disable.pod": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u63d0\u4f9b\u70b9\u3002",
+"message.action.disable.static.nat": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u9759\u6001 NAT\u3002",
+"message.action.disable.zone": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u8d44\u6e90\u57df\u3002",
+"message.action.download.iso": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64 ISO\u3002",
+"message.action.download.template": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64\u6a21\u677f\u3002",
+"message.action.downloading.template": "\u6b63\u5728\u4e0b\u8f7d\u6a21\u677f\u3002",
+"message.action.enable.cluster": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7fa4\u96c6\u3002",
+"message.action.enable.maintenance": "\u5df2\u6210\u529f\u51c6\u5907\u597d\u7ef4\u62a4\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u6216\u66f4\u957f\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u5f53\u524d\u6b64\u4e3b\u673a\u4e0a\u7684 VM \u6570\u91cf\u3002",
+"message.action.enable.nexusvswitch": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64 Nexus 1000v",
+"message.action.enable.physical.network": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7269\u7406\u7f51\u7edc\u3002",
+"message.action.enable.pod": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u70b9\u3002",
+"message.action.enable.zone": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u8d44\u6e90\u57df\u3002",
+"message.action.expunge.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5b9e\u4f8b\u3002",
+"message.action.force.reconnect": "\u5df2\u6210\u529f\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u65f6\u95f4\u3002",
+"message.action.host.enable.maintenance.mode": "\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f\u4f1a\u5bfc\u81f4\u5c06\u6b64\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709\u5b9e\u4f8b\u5b9e\u65f6\u8fc1\u79fb\u5230\u4efb\u4f55\u53ef\u7528\u7684\u4e3b\u673a\u3002",
+"message.action.instance.reset.password": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u6539\u6b64\u865a\u62df\u673a\u7684 ROOT \u7528\u6237\u5bc6\u7801\u3002",
+"message.action.manage.cluster": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6258\u7ba1\u6b64\u7fa4\u96c6\u3002",
+"message.action.primarystorage.enable.maintenance.mode": "\u8b66\u544a: \u5c06\u4e3b\u5b58\u50a8\u7f6e\u4e8e\u7ef4\u62a4\u6a21\u5f0f\u5c06\u5bfc\u81f4\u4f7f\u7528\u4e3b\u5b58\u50a8\u4e2d\u7684\u5377\u7684\u6240\u6709 VM \u505c\u6b62\u8fd0\u884c\u3002\u662f\u5426\u8981\u7ee7\u7eed?",
+"message.action.reboot.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u5b9e\u4f8b\u3002",
+"message.action.reboot.router": "\u6b64\u865a\u62df\u8def\u7531\u5668\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u8def\u7531\u5668\u3002",
+"message.action.reboot.systemvm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u7cfb\u7edf VM\u3002",
+"message.action.recover.volume": "\u4f60\u786e\u5b9a\u8981\u6062\u590d\u8fd9\u4e2a\u5377\u5417?",
+"message.action.release.ip": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91ca\u653e\u6b64 IP\u3002",
+"message.action.remove.host": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e3b\u673a\u3002",
+"message.action.reset.password.off": "\u60a8\u7684\u5b9e\u4f8b\u5f53\u524d\u4e0d\u652f\u6301\u6b64\u529f\u80fd\u3002",
+"message.action.reset.password.warning": "\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u5bc6\u7801\u3002",
+"message.action.restore.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u8fd8\u539f\u6b64\u5b9e\u4f8b\u3002",
+"message.action.revert.snapshot": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u62e5\u6709\u7684\u5377\u8fd8\u539f\u4e3a\u6b64\u5feb\u7167\u3002",
+"message.action.start.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u5b9e\u4f8b\u3002",
+"message.action.start.router": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u8def\u7531\u5668\u3002",
+"message.action.start.systemvm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u7cfb\u7edf VM\u3002",
+"message.action.stop.instance": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u5b9e\u4f8b\u3002",
+"message.action.stop.router": "\u6b64\u865a\u62df\u8def\u7531\u5668\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u8def\u7531\u5668\u3002",
+"message.action.stop.systemvm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u7cfb\u7edf VM\u3002",
+"message.action.unmanage.cluster": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u53d6\u6d88\u6258\u7ba1\u6b64\u7fa4\u96c6\u3002",
+"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": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VM \u5feb\u7167\u3002",
+"message.action.vmsnapshot.revert": "\u8fd8\u539f VM \u5feb\u7167",
+"message.activate.project": "\u662f\u5426\u786e\u5b9e\u8981\u6fc0\u6d3b\u6b64\u9879\u76ee?",
+"message.add.cluster": "\u5411\u8d44\u6e90\u57df <b><span id=\"zone_name\"></span></b>\u3001\u63d0\u4f9b\u70b9 <b><span id=\"pod_name\"></span></b> \u4e2d\u6dfb\u52a0\u4e00\u4e2a\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u6258\u7ba1\u7684\u7fa4\u96c6",
+"message.add.cluster.zone": "\u5411\u8d44\u6e90\u57df <b><span id=\"zone_name\"></span></b> \u4e2d\u6dfb\u52a0\u4e00\u4e2a\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u6258\u7ba1\u7684\u7fa4\u96c6",
+"message.add.disk.offering": "\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u78c1\u76d8\u65b9\u6848",
+"message.add.domain": "\u8bf7\u6307\u5b9a\u8981\u5728\u6b64\u57df\u4e0b\u521b\u5efa\u7684\u5b50\u57df",
+"message.add.firewall": "\u5411\u8d44\u6e90\u57df\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u9632\u706b\u5899",
+"message.add.guest.network": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0\u4e00\u4e2a\u6765\u5bbe\u7f51\u7edc",
+"message.add.host": "\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u53f0\u65b0\u4e3b\u673a",
+"message.add.ip.range": "\u5411\u8d44\u6e90\u57df\u4e2d\u7684\u516c\u7528\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4",
+"message.add.ip.range.direct.network": "\u5411\u8d44\u6e90\u57df <b><span id=\"zone_name\"></span></b> \u4e2d\u7684\u76f4\u63a5\u7f51\u7edc <b><span id=\"directnetwork_name\"></span></b> \u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4",
+"message.add.ip.range.to.pod": "<p>\u5411\u63d0\u4f9b\u70b9\u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4: <b><span id=\"pod_name_label\"></span></b></p>",
+"message.add.load.balancer": "\u5411\u8d44\u6e90\u57df\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u8d1f\u8f7d\u5e73\u8861\u5668",
+"message.add.load.balancer.under.ip": "\u5df2\u5728\u4ee5\u4e0b IP \u4e0b\u6dfb\u52a0\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219:",
+"message.add.network": "\u4e3a\u8d44\u6e90\u57df <b><span id=\"zone_name\"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7f51\u7edc",
+"message.add.new.gateway.to.vpc": "\u8bf7\u6307\u5b9a\u5c06\u65b0\u7f51\u5173\u6dfb\u52a0\u5230\u6b64 VPC \u6240\u9700\u7684\u4fe1\u606f\u3002",
+"message.add.pod": "\u4e3a\u8d44\u6e90\u57df <b><span id=\"add_pod_zone_name\"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u63d0\u4f9b\u70b9",
+"message.add.pod.during.zone.creation": "\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u60a8\u5c06\u5728\u968f\u540e\u7684\u67d0\u4e2a\u6b65\u9aa4\u4e2d\u6dfb\u52a0\u8fd9\u4e9b\u4e3b\u673a\u548c\u670d\u52a1\u5668\u3002\u9996\u5148\uff0c\u8bf7\u4e3a CloudStack \u7684\u5185\u90e8\u7ba1\u7406\u6d41\u91cf\u914d\u7f6e\u4e00\u4e2a\u9884\u7559 IP \u5730\u5740\u8303\u56f4\u3002\u9884\u7559\u7684 IP \u8303\u56f4\u5bf9\u4e91\u4e2d\u7684\u6bcf\u4e2a\u8d44\u6e90\u57df\u6765\u8bf4\u5fc5\u987b\u552f\u4e00\u3002",
+"message.add.primary": "\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u4e3b\u5b58\u50a8",
+"message.add.primary.storage": "\u4e3a\u8d44\u6e90\u57df <b><span id=\"add_pod_zone_name\"></span></b>\u3001\u63d0\u4f9b\u70b9 <b><span id=\"pod_name\"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u4e3b\u5b58\u50a8",
+"message.add.region": "\u8bf7\u6307\u5b9a\u6dfb\u52a0\u65b0\u5730\u7406\u533a\u57df\u6240\u9700\u7684\u4fe1\u606f\u3002",
+"message.add.secondary.storage": "\u4e3a\u8d44\u6e90\u57df <b><span id=\"zone_name\"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u5b58\u50a8",
+"message.add.service.offering": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u8ba1\u7b97\u65b9\u6848\u3002",
+"message.add.system.service.offering": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u3002",
+"message.add.template": "\u8bf7\u8f93\u5165\u4ee5\u4e0b\u6570\u636e\u4ee5\u521b\u5efa\u65b0\u6a21\u677f",
+"message.add.volume": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u5377\u3002",
+"message.add.vpn.gateway": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0 VPN \u7f51\u5173",
+"message.added.vpc.offering": "\u6dfb\u52a0 VPC \u65b9\u6848",
+"message.adding.host": "\u6b63\u5728\u6dfb\u52a0\u4e3b\u673a",
+"message.adding.netscaler.device": "\u6b63\u5728\u6dfb\u52a0 NetScaler \u8bbe\u5907",
+"message.adding.netscaler.provider": "\u6b63\u5728\u6dfb\u52a0 NetScaler \u63d0\u4f9b\u7a0b\u5e8f",
+"message.additional.networks.desc": "\u8bf7\u9009\u62e9\u865a\u62df\u673a\u8981\u8fde\u63a5\u5230\u7684\u5176\u4ed6\u7f51\u7edc\u3002",
+"message.admin.guide.read": "\u5bf9\u4e8e\u57fa\u4e8e VMware \u7684 VM\uff0c\u8bf7\u5148\u9605\u8bfb\u7ba1\u7406\u6307\u5357\u4e2d\u7684\u52a8\u6001\u6269\u5c55\u90e8\u5206\uff0c\u7136\u540e\u518d\u8fdb\u884c\u6269\u5c55\u3002\u662f\u5426\u8981\u7ee7\u7eed?,",
+"message.advanced.mode.desc": "\u5982\u679c\u8981\u542f\u7528 VLAN \u652f\u6301\uff0c\u8bf7\u9009\u62e9\u6b64\u7f51\u7edc\u6a21\u5f0f\u3002\u6b64\u7f51\u7edc\u6a21\u5f0f\u5728\u5141\u8bb8\u7ba1\u7406\u5458\u63d0\u4f9b\u9632\u706b\u5899\u3001VPN \u6216\u8d1f\u8f7d\u5e73\u8861\u5668\u652f\u6301\u7b49\u81ea\u5b9a\u4e49\u7f51\u7edc\u65b9\u6848\u4ee5\u53ca\u542f\u7528\u76f4\u63a5\u7f51\u7edc\u8fde\u63a5\u4e0e\u865a\u62df\u7f51\u7edc\u8fde\u63a5\u7b49\u65b9\u9762\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002",
+"message.advanced.security.group": "\u5982\u679c\u8981\u4f7f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u6765\u5bbe VM \u9694\u79bb\uff0c\u8bf7\u9009\u62e9\u6b64\u6a21\u5f0f\u3002",
+"message.advanced.virtual": "\u5982\u679c\u8981\u4f7f\u7528\u6574\u4e2a\u8d44\u6e90\u57df\u7684 VLAN \u63d0\u4f9b\u6765\u5bbe VM \u9694\u79bb\uff0c\u8bf7\u9009\u62e9\u6b64\u6a21\u5f0f\u3002",
+"message.after.enable.s3": "\u5df2\u914d\u7f6e S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8\u3002\u6ce8\u610f: \u9000\u51fa\u6b64\u9875\u9762\u540e\uff0c\u60a8\u5c06\u65e0\u6cd5\u518d\u6b21\u91cd\u65b0\u914d\u7f6e S3\u3002",
+"message.after.enable.swift": "\u5df2\u914d\u7f6e SWIFT\u3002\u6ce8\u610f: \u9000\u51fa\u6b64\u9875\u9762\u540e\uff0c\u60a8\u5c06\u65e0\u6cd5\u518d\u6b21\u91cd\u65b0\u914d\u7f6e SWIFT\u3002",
+"message.alert.state.detected": "\u68c0\u6d4b\u5230\u8b66\u62a5\u72b6\u6001",
+"message.allow.vpn.access": "\u8bf7\u8f93\u5165\u8981\u5141\u8bb8\u8fdb\u884c VPN \u8bbf\u95ee\u7684\u7528\u6237\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u3002",
+"message.apply.snapshot.policy": "\u60a8\u5df2\u6210\u529f\u66f4\u65b0\u5f53\u524d\u7684\u5feb\u7167\u7b56\u7565\u3002",
+"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": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u6b64 ISO \u9644\u52a0\u5230\u6b64\u865a\u62df\u5b9e\u4f8b\u3002",
+"message.attach.volume": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u9644\u52a0\u4e00\u4e2a\u65b0\u5377\u3002\u5982\u679c\u8981\u5c06\u78c1\u76d8\u5377\u9644\u52a0\u5230\u57fa\u4e8e Windows \u7684\u865a\u62df\u673a\uff0c\u9700\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u5b9e\u4f8b\u624d\u80fd\u663e\u793a\u5df2\u8fde\u63a5\u7684\u78c1\u76d8\u3002",
+"message.basic.mode.desc": "\u5982\u679c\u60a8<b>*<u>\u4e0d</u>*</b>\u5e0c\u671b\u542f\u7528\u4efb\u4f55 VLAN \u652f\u6301\uff0c\u8bf7\u9009\u62e9\u6b64\u7f51\u7edc\u6a21\u5f0f\u3002\u5c06\u76f4\u63a5\u4ece\u6b64\u7f51\u7edc\u4e2d\u4e3a\u5728\u6b64\u7f51\u7edc\u6a21\u5f0f\u4e0b\u521b\u5efa\u7684\u6240\u6709\u865a\u62df\u673a\u5b9e\u4f8b\u5206\u914d\u4e00\u4e2a IP\uff0c\u5e76\u4f7f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u5b89\u5168\u6027\u548c\u9694\u79bb\u3002",
+"message.change.offering.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u6539\u6b64\u865a\u62df\u5b9e\u4f8b\u7684\u670d\u52a1\u65b9\u6848\u3002",
+"message.change.password": "\u8bf7\u66f4\u6539\u60a8\u7684\u5bc6\u7801\u3002",
+"message.cluster.dedicated": "\u7fa4\u96c6\u5df2\u4e13\u7528",
+"message.cluster.dedication.released": "\u5df2\u91ca\u653e\u4e13\u7528\u7fa4\u96c6",
+"message.configure.all.traffic.types": "\u60a8\u6709\u591a\u4e2a\u7269\u7406\u7f51\u7edc\uff0c\u8bf7\u5355\u51fb\u201c\u7f16\u8f91\u201d\u6309\u94ae\u4e3a\u6bcf\u79cd\u6d41\u91cf\u7c7b\u578b\u914d\u7f6e\u6807\u7b7e\u3002",
+"message.configure.firewall.rules.allow.traffic": "\u914d\u7f6e\u5141\u8bb8\u901a\u4fe1\u7684\u89c4\u5219",
+"message.configure.firewall.rules.block.traffic": "\u914d\u7f6e\u62d2\u7edd\u901a\u4fe1\u7684\u89c4\u5219",
+"message.configure.ldap": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u914d\u7f6e LDAP\u3002",
+"message.configuring.guest.traffic": "\u6b63\u5728\u914d\u7f6e\u6765\u5bbe\u6d41\u91cf",
+"message.configuring.physical.networks": "\u6b63\u5728\u914d\u7f6e\u7269\u7406\u7f51\u7edc",
+"message.configuring.public.traffic": "\u6b63\u5728\u914d\u7f6e\u516c\u5171\u6d41\u91cf",
+"message.configuring.storage.traffic": "\u6b63\u5728\u914d\u7f6e\u5b58\u50a8\u6d41\u91cf",
+"message.confirm.action.force.reconnect": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5\u6b64\u4e3b\u673a\u3002",
+"message.confirm.add.vnmc.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002",
+"message.confirm.archive.alert": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u6b64\u8b66\u62a5\u3002",
+"message.confirm.archive.event": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u6b64\u4e8b\u4ef6\u3002",
+"message.confirm.archive.selected.alerts": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u9009\u5b9a\u8b66\u62a5",
+"message.confirm.archive.selected.events": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u9009\u5b9a\u4e8b\u4ef6",
+"message.confirm.attach.disk": "\u662f\u5426\u786e\u5b9e\u8981\u9644\u52a0\u78c1\u76d8?",
+"message.confirm.create.volume": "\u662f\u5426\u786e\u5b9e\u8981\u521b\u5efa\u5377?",
+"message.confirm.current.guest.cidr.unchanged": "\u662f\u5426\u8981\u4f7f\u5f53\u524d\u6765\u5bbe\u7f51\u7edc CIDR \u4fdd\u6301\u4e0d\u53d8?",
+"message.confirm.dedicate.cluster.domain.account": "\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u7fa4\u96c6\u4e13\u7528\u4e8e\u57df/\u5e10\u6237?",
+"message.confirm.dedicate.host.domain.account": "\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u4e3b\u673a\u4e13\u7528\u4e8e\u57df/\u5e10\u6237?",
+"message.confirm.dedicate.pod.domain.account": "\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u63d0\u4f9b\u70b9\u4e13\u7528\u4e8e\u57df/\u5e10\u6237?",
+"message.confirm.dedicate.zone": "\u662f\u5426\u8981\u5c06\u6b64\u8d44\u6e90\u57df\u4e13\u7528\u4e8e\u57df/\u5e10\u6237?",
+"message.confirm.delete.acl.list": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64 ACL \u5217\u8868?",
+"message.confirm.delete.alert": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u8b66\u62a5?",
+"message.confirm.delete.baremetal.rack.configuration": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Baremetal Rack \u914d\u7f6e",
+"message.confirm.delete.bigswitchbcf": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64BigSwitch BCF \u63a7\u5236\u5668",
+"message.confirm.delete.brocadevcs": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Brocade Vcs \u4ea4\u6362\u673a",
+"message.confirm.delete.ciscoasa1000v": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 CiscoASA1000v",
+"message.confirm.delete.ciscovnmc.resource": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Cisco VNMC \u8d44\u6e90",
+"message.confirm.delete.f5": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 F5",
+"message.confirm.delete.internal.lb": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668",
+"message.confirm.delete.netscaler": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 NetScaler",
+"message.confirm.delete.pa": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Palo Alto",
+"message.confirm.delete.secondary.staging.store": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8\u3002",
+"message.confirm.delete.srx": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 SRX",
+"message.confirm.delete.ucs.manager": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 UCS Manager",
+"message.confirm.destroy.router": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u8def\u7531\u5668",
+"message.confirm.disable.host": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u4e3b\u673a",
+"message.confirm.disable.network.offering": "\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7f51\u7edc\u65b9\u6848?",
+"message.confirm.disable.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f",
+"message.confirm.disable.vnmc.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002",
+"message.confirm.disable.vpc.offering": "\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528\u6b64 VPC \u65b9\u6848?",
+"message.confirm.enable.host": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u4e3b\u673a",
+"message.confirm.enable.network.offering": "\u662f\u5426\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7f51\u7edc\u65b9\u6848?",
+"message.confirm.enable.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f",
+"message.confirm.enable.vnmc.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002",
+"message.confirm.enable.vpc.offering": "\u662f\u5426\u786e\u5b9e\u8981\u542f\u7528\u6b64 VPC \u65b9\u6848?",
+"message.confirm.force.update": "Do you want to make a force update?",
+"message.confirm.join.project": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u52a0\u5165\u6b64\u9879\u76ee\u3002",
+"message.confirm.migrate.volume": "\u662f\u5426\u8981\u8fc1\u79fb\u6b64\u5377?",
+"message.confirm.refresh.blades": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5237\u65b0\u5200\u7247\u5f0f\u670d\u52a1\u5668\u3002",
+"message.confirm.release.dedicate.vlan.range": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91ca\u653e\u4e13\u7528 VLAN \u8303\u56f4",
+"message.confirm.release.dedicated.cluster": "\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u7fa4\u96c6?",
+"message.confirm.release.dedicated.host": "\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u4e3b\u673a?",
+"message.confirm.release.dedicated.pod": "\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u63d0\u4f9b\u70b9?",
+"message.confirm.release.dedicated.zone": "\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u8d44\u6e90\u57df?",
+"message.confirm.remove.event": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e8b\u4ef6?",
+"message.confirm.remove.ip.range": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 IP \u8303\u56f4\u3002",
+"message.confirm.remove.load.balancer": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664 VM",
+"message.confirm.remove.network.offering": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u7edc\u65b9\u6848?",
+"message.confirm.remove.selected.alerts": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u9009\u5b9a\u8b66\u62a5",
+"message.confirm.remove.selected.events": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u9009\u5b9a\u4e8b\u4ef6",
+"message.confirm.remove.vmware.datacenter": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VMware \u6570\u636e\u4e2d\u5fc3",
+"message.confirm.remove.vpc.offering": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPC \u65b9\u6848?",
+"message.confirm.replace.acl.new.one": "\u662f\u5426\u8981\u5c06\u6b64 ACL \u66ff\u6362\u4e3a\u65b0 ACL?",
+"message.confirm.scale.up.router.vm": "\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u8def\u7531\u5668 VM?",
+"message.confirm.scale.up.system.vm": "\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u7cfb\u7edf VM?",
+"message.confirm.shutdown.provider": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5173\u95ed\u6b64\u63d0\u4f9b\u7a0b\u5e8f",
+"message.confirm.start.lb.vm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8 LB VM",
+"message.confirm.stop.lb.vm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62 LB VM",
+"message.confirm.upgrade.router.newer.template": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"message.confirm.upgrade.routers.account.newtemplate": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u5e10\u6237\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"message.confirm.upgrade.routers.cluster.newtemplate": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"message.confirm.upgrade.routers.newtemplate": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"message.confirm.upgrade.routers.pod.newtemplate": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u63d0\u4f9b\u70b9\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f",
+"message.copy.iso.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06 ISO \u590d\u5236\u5230",
+"message.copy.template": "\u5c06\u6a21\u677f <b id=\"copy_template_name_text\">XXX</b> \u4ece\u8d44\u6e90\u57df <b id=\"copy_template_source_zone_text\"></b> \u590d\u5236\u5230",
+"message.copy.template.confirm": "\u662f\u5426\u786e\u5b9e\u8981\u590d\u5236\u6a21\u677f?",
+"message.create.template": "\u662f\u5426\u786e\u5b9e\u8981\u521b\u5efa\u6a21\u677f?",
+"message.create.template.vm": "\u57fa\u4e8e\u6a21\u677f <b id=\"p_name\"></b> \u521b\u5efa VM",
+"message.create.template.volume": "\u8bf7\u5148\u6307\u5b9a\u4ee5\u4e0b\u4fe1\u606f\uff0c\u7136\u540e\u518d\u521b\u5efa\u78c1\u76d8\u5377 <b><span id=\"volume_name\"></span></b> \u7684\u6a21\u677f\u3002\u521b\u5efa\u6a21\u677f\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u5230\u66f4\u957f\u7684\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u78c1\u76d8\u5377\u7684\u5927\u5c0f\u3002",
+"message.creating.cluster": "\u6b63\u5728\u521b\u5efa\u7fa4\u96c6",
+"message.creating.guest.network": "\u6b63\u5728\u521b\u5efa\u6765\u5bbe\u7f51\u7edc",
+"message.creating.physical.networks": "\u6b63\u5728\u521b\u5efa\u7269\u7406\u7f51\u7edc",
+"message.creating.pod": "\u6b63\u5728\u521b\u5efa\u63d0\u4f9b\u70b9",
+"message.creating.primary.storage": "\u6b63\u5728\u521b\u5efa\u4e3b\u5b58\u50a8",
+"message.creating.secondary.storage": "\u6b63\u5728\u521b\u5efa\u4e8c\u7ea7\u5b58\u50a8",
+"message.creating.systemvm": "\u6b63\u5728\u521b\u5efa\u7cfb\u7edf VM (\u6b64\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u4e00\u4e9b\u65f6\u95f4)",
+"message.creating.zone": "\u6b63\u5728\u521b\u5efa\u8d44\u6e90\u57df",
+"message.dedicate.zone": "\u6b63\u5728\u5c06\u8d44\u6e90\u57df\u4e13\u7528",
+"message.dedicated.zone.released": "\u5df2\u91ca\u653e\u4e13\u7528\u8d44\u6e90\u57df",
+"message.delete.account": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5e10\u6237\u3002",
+"message.delete.affinity.group": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5173\u8054\u6027\u7ec4\u3002",
+"message.delete.gateway": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u5173",
+"message.delete.project": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u9879\u76ee?",
+"message.delete.user": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7528\u6237\u3002",
+"message.delete.vpn.connection": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VPN \u8fde\u63a5",
+"message.delete.vpn.customer.gateway": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPN \u5ba2\u6237\u7f51\u5173",
+"message.delete.vpn.gateway": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPN \u7f51\u5173",
+"message.desc.add.new.lb.sticky.rule": "\u6dfb\u52a0\u65b0\u8d1f\u8f7d\u5747\u8861\u7c98\u6ede\u89c4\u5219",
+"message.desc.advanced.zone": "\u9002\u7528\u4e8e\u66f4\u52a0\u590d\u6742\u7684\u7f51\u7edc\u62d3\u6251\u3002\u6b64\u7f51\u7edc\u6a21\u5f0f\u5728\u5b9a\u4e49\u6765\u5bbe\u7f51\u7edc\u5e76\u63d0\u4f9b\u9632\u706b\u5899\u3001VPN \u6216\u8d1f\u8f7d\u5e73\u8861\u5668\u652f\u6301\u7b49\u81ea\u5b9a\u4e49\u7f51\u7edc\u65b9\u6848\u65b9\u9762\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002",
+"message.desc.basic.zone": "\u63d0\u4f9b\u4e00\u4e2a\u7f51\u7edc\uff0c\u5c06\u76f4\u63a5\u4ece\u6b64\u7f51\u7edc\u4e2d\u4e3a\u6bcf\u4e2a VM \u5b9e\u4f8b\u5206\u914d\u4e00\u4e2a IP\u3002\u53ef\u4ee5\u901a\u8fc7\u5b89\u5168\u7ec4\u7b49\u7b2c 3 \u5c42\u65b9\u5f0f\u63d0\u4f9b\u6765\u5bbe\u9694\u79bb(IP \u5730\u5740\u6e90\u8fc7\u6ee4)\u3002",
+"message.desc.cluster": "\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7fa4\u96c6\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u7fa4\u96c6\u3002\u7fa4\u96c6\u63d0\u4f9b\u4e86\u4e00\u79cd\u7f16\u7ec4\u4e3b\u673a\u7684\u65b9\u6cd5\u3002\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u4e3b\u673a\u90fd\u5177\u6709\u76f8\u540c\u7684\u786c\u4ef6\uff0c\u8fd0\u884c\u76f8\u540c\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\uff0c\u4f4d\u4e8e\u76f8\u540c\u7684\u5b50\u7f51\u4e2d\uff0c\u5e76\u8bbf\u95ee\u76f8\u540c\u7684\u5171\u4eab\u5b58\u50a8\u3002\u6bcf\u4e2a\u7fa4\u96c6\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u673a\u4ee5\u53ca\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\u3002",
+"message.desc.create.ssh.key.pair": "\u8bf7\u586b\u5199\u4ee5\u4e0b\u5185\u5bb9\u4ee5\u521b\u5efa\u6216\u751f\u6210\u4e00\u4e2assh\u5bc6\u94a5\u5bf9.<br><br>(1) \u5982\u679c\u516c\u94a5\u5df2\u914d\u7f6e, cloudstack \u5c06\u6ce8\u518c\u6b64\u516c\u94a5. \u60a8\u53ef\u4ee5\u901a\u8fc7\u60a8\u7684\u79c1\u94a5\u6765\u8bbf\u95ee.<br><br>(2)\u5982\u679c\u516c\u94a5\u672a\u914d\u7f6e,cloudstack\u5c06\u521b\u5efa\u65b0\u7684\u5bc6\u94a5\u5bf9,\u8bf7\u590d\u5236\u5e76\u4fdd\u5b58\u79c1\u94a5,cloudstack\u5c06\u4e0d\u4f1a\u66ff\u60a8\u4fdd\u5b58<br>",
+"message.desc.created.ssh.key.pair": "\u5df2\u751f\u6210\u7684SSH\u5bc6\u94a5\u5bf9",
+"message.desc.host": "\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a\u4e3b\u673a\u4ee5\u4f9b\u6765\u5bbe VM \u5728\u4e0a\u9762\u8fd0\u884c\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u673a\u3002\u8981\u4f7f\u4e3b\u673a\u5728 CloudStack \u4e2d\u8fd0\u884c\uff0c\u5fc5\u987b\u5728\u6b64\u4e3b\u673a\u4e0a\u5b89\u88c5\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u8f6f\u4ef6\uff0c\u4e3a\u5176\u5206\u914d\u4e00\u4e2a IP \u5730\u5740\uff0c\u5e76\u786e\u4fdd\u5c06\u5176\u8fde\u63a5\u5230 CloudStack \u7ba1\u7406\u670d\u52a1\u5668\u3002<br/><br/>\u8bf7\u63d0\u4f9b\u4e3b\u673a\u7684 DNS \u6216 IP \u5730\u5740\u3001\u7528\u6237\u540d(\u901a\u5e38\u4e3a root)\u548c\u5bc6\u7801\uff0c\u4ee5\u53ca\u7528\u4e8e\u5bf9\u4e3b\u673a\u8fdb\u884c\u5206\u7c7b\u7684\u4efb\u4f55\u6807\u7b7e\u3002",
+"message.desc.primary.storage": "\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002\u4e3b\u5b58\u50a8\u4e2d\u5305\u542b\u5728\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u8fd0\u884c\u7684\u6240\u6709 VM \u7684\u78c1\u76d8\u5377\u3002\u8bf7\u4f7f\u7528\u5e95\u5c42\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u652f\u6301\u7684\u7b26\u5408\u6807\u51c6\u7684\u534f\u8bae\u3002",
+"message.desc.reset.ssh.key.pair": "\u8bf7\u6307\u5b9a\u60a8\u60f3\u6dfb\u52a0\u5230\u8fd9\u4e2aVM\u4e2d\u7684SSH\u5bc6\u94a5\u5bf9.\u8bf7\u6ce8\u610f,\u5982\u679c\u542f\u7528\u4e86\u5bc6\u7801\u7ba1\u7406,\u8d85\u7ea7\u7528\u6237\u53e3\u4ee4\u5c06\u4f1a\u88ab\u91cd\u7f6e\u3002",
+"message.desc.secondary.storage": "\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a NFS \u6216\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a NFS \u6216\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\u3002\u4e8c\u7ea7\u5b58\u50a8\u7528\u4e8e\u5b58\u50a8 VM \u6a21\u677f\u3001ISO \u6620\u50cf\u548c VM \u78c1\u76d8\u5377\u5feb\u7167\u3002\u6b64\u670d\u52a1\u5668\u5fc5\u987b\u5bf9\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u670d\u52a1\u5668\u53ef\u7528\u3002<br/><br/>\u8bf7\u63d0\u4f9b IP \u5730\u5740\u548c\u5bfc\u51fa\u8def\u5f84\u3002",
+"message.desc.zone": "\u8d44\u6e90\u57df\u662f CloudStack \u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\uff0c\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u8d44\u6e90\u57df\u53ef\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4e00\u4e2a\u8d44\u6e90\u57df\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\u4ee5\u53ca\u7531\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u63d0\u4f9b\u70b9\u5171\u4eab\u7684\u4e00\u4e2a\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\uff0c\u5176\u4e2d\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u591a\u4e2a\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002",
+"message.detach.disk": "\u662f\u5426\u786e\u5b9e\u8981\u53d6\u6d88\u9644\u52a0\u6b64\u78c1\u76d8?",
+"message.detach.iso.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece\u6b64\u865a\u62df\u673a\u4e2d\u53d6\u6d88\u9644\u52a0\u6b64 ISO\u3002",
+"message.disable.account": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u5e10\u6237\u3002\u7981\u7528\u540e\uff0c\u6b64\u5e10\u6237\u7684\u6240\u6709\u7528\u6237\u5c06\u4e0d\u518d\u6709\u6743\u8bbf\u95ee\u5404\u81ea\u7684\u4e91\u8d44\u6e90\u3002\u6240\u6709\u6b63\u5728\u8fd0\u884c\u7684\u865a\u62df\u673a\u5c06\u7acb\u5373\u5173\u95ed\u3002",
+"message.disable.snapshot.policy": "\u60a8\u5df2\u6210\u529f\u7981\u7528\u5f53\u524d\u7684\u5feb\u7167\u7b56\u7565\u3002",
+"message.disable.user": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7528\u6237\u3002",
+"message.disable.vpn": "\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528 VPN?",
+"message.disable.vpn.access": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN\u3002",
+"message.disabling.network.offering": "\u6b63\u5728\u7981\u7528\u7f51\u7edc\u65b9\u6848",
+"message.disabling.vpc.offering": "\u6b63\u5728\u7981\u7528 VPC \u65b9\u6848",
+"message.disallowed.characters": "\u7981\u7528\u5b57\u7b26: <,>",
+"message.download.iso": "\u8bf7\u5355\u51fb <a href=\"#\">00000</a> \u4e0b\u8f7d ISO",
+"message.download.template": "\u8bf7\u5355\u51fb <a href=\"#\">00000</a> \u4e0b\u8f7d\u6a21\u677f",
+"message.download.volume": "\u8bf7\u5355\u51fb <a href=\"#\">00000</a> \u4e0b\u8f7d\u5377",
+"message.download.volume.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64\u5377",
+"message.edit.account": "\u7f16\u8f91(\u201c-1\u201d\u8868\u793a\u5bf9\u8981\u521b\u5efa\u7684\u8d44\u6e90\u6570\u91cf\u6ca1\u6709\u4efb\u4f55\u9650\u5236)",
+"message.edit.confirm": "\u5728\u70b9\u51fb\u201c\u4fdd\u5b58\u201d\u524d\u8bf7\u5148\u786e\u8ba4\u60a8\u6240\u505a\u7684\u66f4\u6539\u3002",
+"message.edit.limits": "\u8bf7\u6307\u5b9a\u5bf9\u4ee5\u4e0b\u8d44\u6e90\u7684\u9650\u5236\u3002\u201c-1\u201d\u8868\u793a\u4e0d\u9650\u5236\u8981\u521b\u5efa\u7684\u8d44\u6e90\u6570\u3002",
+"message.edit.traffic.type": "\u8bf7\u6307\u5b9a\u60a8\u5e0c\u671b\u4e0e\u6b64\u6d41\u91cf\u7c7b\u578b\u5173\u8054\u7684\u6d41\u91cf\u6807\u7b7e\u3002",
+"message.enable.account": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u5e10\u6237\u3002",
+"message.enable.user": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7528\u6237\u3002",
+"message.enable.vpn": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5bf9\u6b64 IP \u5730\u5740\u542f\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN\u3002",
+"message.enable.vpn.access": "\u5f53\u524d\u5df2\u5bf9\u6b64 IP \u5730\u5740\u7981\u7528\u4e86 VPN\u3002\u662f\u5426\u8981\u542f\u7528 VPN \u8bbf\u95ee?",
+"message.enabled.vpn": "\u60a8\u7684\u8fdc\u7a0b\u8bbf\u95ee VPN \u5f53\u524d\u5df2\u542f\u7528\uff0c\u53ef\u4ee5\u901a\u8fc7 IP \u8fdb\u884c\u8bbf\u95ee",
+"message.enabled.vpn.ip.sec": "\u60a8\u7684 IPSec \u9884\u5171\u4eab\u5bc6\u94a5",
+"message.enabling.network.offering": "\u6b63\u5728\u542f\u7528\u7f51\u7edc\u65b9\u6848",
+"message.enabling.security.group.provider": "\u6b63\u5728\u542f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u7a0b\u5e8f",
+"message.enabling.vpc.offering": "\u6b63\u5728\u542f\u7528 VPC \u65b9\u6848",
+"message.enabling.zone": "\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df",
+"message.enabling.zone.dots": "\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df...",
+"message.enter.seperated.list.multiple.cidrs": "\u5982\u679c\u5b58\u5728\u591a\u4e2a CIDR\uff0c\u8bf7\u8f93\u5165\u7528\u9017\u53f7\u5206\u9694\u7684 CIDR \u5217\u8868",
+"message.enter.token": "\u8bf7\u8f93\u5165\u60a8\u5728\u9080\u8bf7\u7535\u5b50\u90ae\u4ef6\u4e2d\u6536\u5230\u7684\u4ee4\u724c\u3002",
+"message.generate.keys": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7528\u6237\u751f\u6210\u65b0\u5bc6\u94a5\u3002",
+"message.gslb.delete.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 GSLB",
+"message.gslb.lb.remove.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece GSLB \u4e2d\u5220\u9664\u8d1f\u8f7d\u5e73\u8861",
+"message.guest.traffic.in.advanced.zone": "\u6765\u5bbe\u7f51\u7edc\u6d41\u91cf\u662f\u6307\u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u6307\u5b9a\u4e00\u4e2a VLAN ID \u8303\u56f4\u53ef\u4f20\u9001\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u7684\u6765\u5bbe\u6d41\u91cf\u3002",
+"message.guest.traffic.in.basic.zone": "\u6765\u5bbe\u7f51\u7edc\u6d41\u91cf\u662f\u6307\u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u5e94\u6307\u5b9a\u4e00\u4e2a CloudStack \u53ef\u4ee5\u5206\u914d\u7ed9\u6765\u5bbe VM \u7684 IP \u5730\u5740\u8303\u56f4\u3002\u8bf7\u786e\u4fdd\u6b64\u8303\u56f4\u4e0e\u9884\u7559\u7684\u7cfb\u7edf IP \u8303\u56f4\u4e0d\u91cd\u53e0\u3002",
+"message.host.dedicated": "\u4e3b\u673a\u5df2\u4e13\u7528",
+"message.host.dedication.released": "\u5df2\u91ca\u653e\u4e13\u7528\u4e3b\u673a",
+"message.installwizard.click.retry": "\u8bf7\u5355\u51fb\u6b64\u6309\u94ae\u91cd\u65b0\u5c1d\u8bd5\u542f\u52a8\u3002",
+"message.installwizard.copy.whatisacluster": "\u7fa4\u96c6\u63d0\u4f9b\u4e86\u4e00\u79cd\u7f16\u7ec4\u4e3b\u673a\u7684\u65b9\u6cd5\u3002\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u4e3b\u673a\u90fd\u5177\u6709\u76f8\u540c\u7684\u786c\u4ef6\uff0c\u8fd0\u884c\u76f8\u540c\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\uff0c\u4f4d\u4e8e\u540c\u4e00\u5b50\u7f51\u4e2d\uff0c\u5e76\u8bbf\u95ee\u76f8\u540c\u7684\u5171\u4eab\u5b58\u50a8\u3002\u53ef\u4ee5\u5b9e\u65f6\u5c06\u865a\u62df\u673a\u5b9e\u4f8b(VM)\u4ece\u4e00\u53f0\u4e3b\u673a\u8fc1\u79fb\u5230\u540c\u4e00\u7fa4\u96c6\u5185\u7684\u5176\u4ed6\u4e3b\u673a\uff0c\u800c\u65e0\u9700\u4e2d\u65ad\u5411\u7528\u6237\u63d0\u4f9b\u670d\u52a1\u3002\u7fa4\u96c6\u662f CloudStack&#8482; \u90e8\u7f72\u4e2d\u7684\u7b2c\u4e09\u5927\u7ec4\u7ec7\u5355\u4f4d\u3002\u7fa4\u96c6\u5305\u542b\u5728\u63d0\u4f9b\u70b9\u4e2d\uff0c\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002<br/><br/>CloudStack&#8482; \u5141\u8bb8\u4e91\u90e8\u7f72\u4e2d\u5b58\u5728\u591a\u4e2a\u7fa4\u96c6\uff0c\u4f46\u5bf9\u4e8e\u57fa\u672c\u5b89\u88c5\uff0c\u6211\u4eec\u53ea\u9700\u8981\u4e00\u4e2a\u7fa4\u96c6\u3002",
+"message.installwizard.copy.whatisahost": "\u4e3b\u673a\u662f\u6307\u4e00\u53f0\u8ba1\u7b97\u673a\u3002\u4e3b\u673a\u63d0\u4f9b\u8fd0\u884c\u6765\u5bbe\u865a\u62df\u673a\u7684\u8ba1\u7b97\u8d44\u6e90\u3002\u6bcf\u53f0\u4e3b\u673a\u4e0a\u90fd\u5b89\u88c5\u6709\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u8f6f\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6765\u5bbe VM (\u88f8\u673a\u4e3b\u673a\u9664\u5916\uff0c\u5c06\u5728\u201c\u9ad8\u7ea7\u5b89\u88c5\u6307\u5357\u201d\u4e2d\u8ba8\u8bba\u8fd9\u4e00\u7279\u6b8a\u6848\u4f8b)\u3002\u4f8b\u5982\uff0c\u542f\u7528\u4e86 KVM \u7684 Linux \u670d\u52a1\u5668\u3001Citrix XenServer \u670d\u52a1\u5668\u548c ESXi \u670d\u52a1\u5668\u90fd\u53ef\u7528\u4f5c\u4e3b\u673a\u3002\u5728\u57fa\u672c\u5b89\u88c5\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u53f0\u8fd0\u884c XenServer \u7684\u4e3b\u673a\u3002<br/><br/>\u4e3b\u673a\u662f CloudStack&#8482; \u90e8\u7f72\u4e2d\u6700\u5c0f\u7684\u7ec4\u7ec7\u5355\u4f4d\u3002\u4e3b\u673a\u5305\u542b\u5728\u7fa4\u96c6\u4e2d\uff0c\u7fa4\u96c6\u5305\u542b\u5728\u63d0\u4f9b\u70b9\u4e2d\uff0c\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002",
+"message.installwizard.copy.whatisapod": "\u4e00\u4e2a\u63d0\u4f9b\u70b9\u901a\u5e38\u4ee3\u8868\u4e00\u4e2a\u673a\u67b6\u3002\u540c\u4e00\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u4f4d\u4e8e\u540c\u4e00\u5b50\u7f51\u4e2d\u3002<br/><br/>\u63d0\u4f9b\u70b9\u662f CloudStack&#8482; \u90e8\u7f72\u4e2d\u7684\u7b2c\u4e8c\u5927\u7ec4\u7ec7\u5355\u4f4d\u3002\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u53ef\u4ee5\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff1b\u5728\u57fa\u672c\u5b89\u88c5\u4e2d\uff0c\u60a8\u7684\u8d44\u6e90\u57df\u4e2d\u5c06\u4ec5\u5305\u542b\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002",
+"message.installwizard.copy.whatisazone": "\u8d44\u6e90\u57df\u662f CloudStack&#8482; \u90e8\u7f72\u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\u3002\u867d\u7136\u5141\u8bb8\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u4e2d\u5b58\u5728\u591a\u4e2a\u8d44\u6e90\u57df\uff0c\u4f46\u662f\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u5c06\u57fa\u7840\u67b6\u6784\u7f16\u7ec4\u5230\u8d44\u6e90\u57df\u4e2d\u7684\u597d\u5904\u662f\u53ef\u4ee5\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4f8b\u5982\uff0c\u6bcf\u4e2a\u8d44\u6e90\u57df\u90fd\u53ef\u4ee5\u62e5\u6709\u5404\u81ea\u7684\u7535\u6e90\u4f9b\u5e94\u548c\u7f51\u7edc\u4e0a\u884c\u65b9\u6848\uff0c\u5e76\u4e14\u5404\u8d44\u6e90\u57df\u53ef\u4ee5\u5728\u5730\u7406\u4f4d\u7f6e\u4e0a\u76f8\u9694\u5f88\u8fdc(\u867d\u7136\u5e76\u975e\u5fc5\u987b\u76f8\u9694\u5f88\u8fdc)\u3002",
+"message.installwizard.copy.whatiscloudstack": "CloudStack&#8482 \u662f\u4e00\u4e2a\u8f6f\u4ef6\u5e73\u53f0\uff0c\u53ef\u5c06\u8ba1\u7b97\u8d44\u6e90\u96c6\u4e2d\u5728\u4e00\u8d77\u4ee5\u6784\u5efa\u516c\u6709\u3001\u79c1\u6709\u548c\u6df7\u5408\u57fa\u7840\u8bbe\u65bd\u5373\u670d\u52a1(IaaS)\u4e91\u3002CloudStack&#8482 \u8d1f\u8d23\u7ba1\u7406\u7ec4\u6210\u4e91\u57fa\u7840\u67b6\u6784\u7684\u7f51\u7edc\u3001\u5b58\u50a8\u548c\u8ba1\u7b97\u8282\u70b9\u3002\u4f7f\u7528 CloudStack&#8482 \u53ef\u4ee5\u90e8\u7f72\u3001\u7ba1\u7406\u548c\u914d\u7f6e\u4e91\u8ba1\u7b97\u73af\u5883\u3002<br/><br/>CloudStack&#8482 \u901a\u8fc7\u6269\u5c55\u5546\u7528\u786c\u4ef6\u4e0a\u8fd0\u884c\u7684\u6bcf\u4e2a\u865a\u62df\u673a\u6620\u50cf\u7684\u8303\u56f4\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b9e\u65f6\u53ef\u7528\u7684\u4e91\u57fa\u7840\u67b6\u6784\u8f6f\u4ef6\u5806\u6808\u7528\u4e8e\u4ee5\u670d\u52a1\u65b9\u5f0f\u4ea4\u4ed8\u865a\u62df\u6570\u636e\u4e2d\u5fc3\uff0c\u5373\u4ea4\u4ed8\u6784\u5efa\u3001\u90e8\u7f72\u548c\u7ba1\u7406\u591a\u5c42\u6b21\u548c\u591a\u79df\u6237\u4e91\u5e94\u7528\u7a0b\u5e8f\u5fc5\u9700\u7684\u6240\u6709\u7ec4\u4ef6\u3002\u5f00\u6e90\u7248\u672c\u548c Premium \u7248\u672c\u90fd\u5df2\u53ef\u7528\uff0c\u4e14\u63d0\u4f9b\u7684\u529f\u80fd\u51e0\u4e4e\u5b8c\u5168\u76f8\u540c\u3002",
+"message.installwizard.copy.whatisprimarystorage": "CloudStack&#8482; \u4e91\u57fa\u7840\u67b6\u6784\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8: \u4e3b\u5b58\u50a8\u548c\u4e8c\u7ea7\u5b58\u50a8\u3002\u8fd9\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u53ef\u4ee5\u662f iSCSI \u6216 NFS \u670d\u52a1\u5668\uff0c\u4e5f\u53ef\u4ee5\u662f\u672c\u5730\u78c1\u76d8\u3002<br/><br/><strong>\u4e3b\u5b58\u50a8</strong>\u4e0e\u7fa4\u96c6\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u8be5\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709 VM \u5bf9\u5e94\u7684\u6bcf\u4e2a\u6765\u5bbe VM \u7684\u78c1\u76d8\u5377\u3002\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u901a\u5e38\u4f4d\u4e8e\u9760\u8fd1\u4e3b\u673a\u7684\u4f4d\u7f6e\u3002",
+"message.installwizard.copy.whatissecondarystorage": "\u4e8c\u7ea7\u5b58\u50a8\u4e0e\u8d44\u6e90\u57df\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u4ee5\u4e0b\u9879\u76ee:<ul><li>\u6a21\u677f - \u53ef\u7528\u4e8e\u542f\u52a8 VM \u5e76\u53ef\u4ee5\u5305\u542b\u5176\u4ed6\u914d\u7f6e\u4fe1\u606f(\u4f8b\u5982\uff0c\u5df2\u5b89\u88c5\u7684\u5e94\u7528\u7a0b\u5e8f)\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf</li><li>ISO \u6620\u50cf - \u53ef\u91cd\u65b0\u542f\u52a8\u6216\u4e0d\u53ef\u91cd\u65b0\u542f\u52a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf</li><li>\u78c1\u76d8\u5377\u5feb\u7167 - \u5df2\u4fdd\u5b58\u7684 VM \u6570\u636e\u526f\u672c\uff0c\u53ef\u7528\u4e8e\u6267\u884c\u6570\u636e\u6062\u590d\u6216\u521b\u5efa\u65b0\u6a21\u677f</ul>",
+"message.installwizard.now.building": "\u73b0\u5728\u6b63\u5728\u6784\u5efa\u60a8\u7684\u4e91...",
+"message.installwizard.tooltip.addcluster.name": "\u7fa4\u96c6\u7684\u540d\u79f0\u3002\u6b64\u540d\u79f0\u53ef\u4ee5\u662f\u60a8\u9009\u62e9\u7684\u6587\u672c\uff0c\u4e14\u672a\u7531 CloudStack \u4f7f\u7528\u3002",
+"message.installwizard.tooltip.addhost.hostname": "\u4e3b\u673a\u7684 DNS \u540d\u79f0\u6216 IP \u5730\u5740\u3002",
+"message.installwizard.tooltip.addhost.password": "\u6b64\u4e3a\u4e0a\u8ff0\u7528\u6237\u7684\u5bc6\u7801(\u6765\u81ea XenServer \u5b89\u88c5)\u3002",
+"message.installwizard.tooltip.addhost.username": "\u901a\u5e38\u4e3a root\u3002",
+"message.installwizard.tooltip.addpod.name": "\u63d0\u4f9b\u70b9\u7684\u540d\u79f0",
+"message.installwizard.tooltip.addpod.reservedsystemendip": "\u6b64\u4e3a CloudStack \u7528\u4e8e\u7ba1\u7406\u4e8c\u7ea7\u5b58\u50a8 VM \u548c\u63a7\u5236\u53f0\u4ee3\u7406 VM \u7684\u4e13\u7528\u7f51\u7edc\u4e2d\u7684 IP \u8303\u56f4\u3002\u8fd9\u4e9b IP \u5730\u5740\u6765\u81ea\u4e0e\u8ba1\u7b97\u670d\u52a1\u5668\u76f8\u540c\u7684\u5b50\u7f51\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemgateway": "\u8be5\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u7f51\u5173\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemnetmask": "\u6765\u5bbe\u5c06\u8981\u4f7f\u7528\u7684\u5b50\u7f51\u4e0a\u6b63\u5728\u4f7f\u7528\u7684\u7f51\u7edc\u63a9\u7801\u3002",
+"message.installwizard.tooltip.addpod.reservedsystemstartip": "\u6b64\u4e3a CloudStack \u7528\u4e8e\u7ba1\u7406\u4e8c\u7ea7\u5b58\u50a8 VM \u548c\u63a7\u5236\u53f0\u4ee3\u7406 VM \u7684\u4e13\u7528\u7f51\u7edc\u4e2d\u7684 IP \u8303\u56f4\u3002\u8fd9\u4e9b IP \u5730\u5740\u6765\u81ea\u4e0e\u8ba1\u7b97\u670d\u52a1\u5668\u76f8\u540c\u7684\u5b50\u7f51\u3002",
+"message.installwizard.tooltip.addprimarystorage.name": "\u5b58\u50a8\u8bbe\u5907\u7684\u540d\u79f0\u3002",
+"message.installwizard.tooltip.addprimarystorage.path": "(\u9002\u7528\u4e8e NFS)\u5728 NFS \u4e2d\uff0c\u6b64\u8def\u5f84\u4e3a\u670d\u52a1\u5668\u7684\u5bfc\u51fa\u8def\u5f84\u3002\u8def\u5f84(\u9488\u5bf9 SharedMountPoint)\u3002\u5bf9\u4e8e KVM\uff0c\u6b64\u8def\u5f84\u4e3a\u88c5\u8f7d\u4e86\u4e8c\u7ea7\u5b58\u50a8\u7684\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u7684\u8def\u5f84\u3002\u4f8b\u5982\uff0c/mnt/primary\u3002",
+"message.installwizard.tooltip.addprimarystorage.server": "(\u9002\u7528\u4e8e NFS\u3001iSCSI \u6216 PreSetup)\u5b58\u50a8\u8bbe\u5907\u7684 IP \u5730\u5740\u6216 DNS \u540d\u79f0\u3002",
+"message.installwizard.tooltip.addsecondarystorage.nfsserver": "\u6258\u7ba1\u4e8c\u7ea7\u5b58\u50a8\u7684 NFS \u670d\u52a1\u5668\u7684 IP \u5730\u5740",
+"message.installwizard.tooltip.addsecondarystorage.path": "\u5bfc\u51fa\u8def\u5f84(\u4f4d\u4e8e\u4e0a\u8ff0\u6307\u5b9a\u670d\u52a1\u5668\u4e0a)",
+"message.installwizard.tooltip.addzone.dns1": "\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u60a8\u7a0d\u540e\u8981\u6dfb\u52a0\u7684\u516c\u7528\u7f51\u7edc\u8fdb\u884c\u8bbf\u95ee\u3002\u6b64\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002",
+"message.installwizard.tooltip.addzone.dns2": "\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u60a8\u7a0d\u540e\u8981\u6dfb\u52a0\u7684\u516c\u7528\u7f51\u7edc\u8fdb\u884c\u8bbf\u95ee\u3002\u6b64\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002",
+"message.installwizard.tooltip.addzone.internaldns1": "\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u7cfb\u7edf VM \u7684\u4e13\u7528\u7f51\u7edc\u63a5\u53e3\u8fdb\u884c\u8bbf\u95ee\u3002\u60a8\u4e3a\u63d0\u4f9b\u70b9\u63d0\u4f9b\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002",
+"message.installwizard.tooltip.addzone.internaldns2": "\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u7cfb\u7edf VM \u7684\u4e13\u7528\u7f51\u7edc\u63a5\u53e3\u8fdb\u884c\u8bbf\u95ee\u3002\u60a8\u4e3a\u63d0\u4f9b\u70b9\u63d0\u4f9b\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002",
+"message.installwizard.tooltip.addzone.name": "\u8d44\u6e90\u57df\u540d\u79f0",
+"message.installwizard.tooltip.configureguesttraffic.description": "\u60a8\u7684\u7f51\u7edc\u8bf4\u660e",
+"message.installwizard.tooltip.configureguesttraffic.guestendip": "\u80fd\u591f\u5206\u914d\u7ed9\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe\u7684 IP \u5730\u5740\u8303\u56f4\u3002\u5982\u679c\u4f7f\u7528\u4e00\u4e2a NIC\uff0c\u8fd9\u4e9b IP \u5e94\u4f4d\u4e8e\u4e0e\u63d0\u4f9b\u70b9 CIDR \u76f8\u540c\u7684  CIDR \u4e2d\u3002",
+"message.installwizard.tooltip.configureguesttraffic.guestgateway": "\u6765\u5bbe\u5e94\u4f7f\u7528\u7684\u7f51\u5173",
+"message.installwizard.tooltip.configureguesttraffic.guestnetmask": "\u6765\u5bbe\u5e94\u4f7f\u7528\u7684\u5b50\u7f51\u4e0a\u6b63\u5728\u4f7f\u7528\u7684\u7f51\u7edc\u63a9\u7801",
+"message.installwizard.tooltip.configureguesttraffic.gueststartip": "\u80fd\u591f\u5206\u914d\u7ed9\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe\u7684 IP \u5730\u5740\u8303\u56f4\u3002\u5982\u679c\u4f7f\u7528\u4e00\u4e2a NIC\uff0c\u8fd9\u4e9b IP \u5e94\u4f4d\u4e8e\u4e0e\u63d0\u4f9b\u70b9 CIDR \u76f8\u540c\u7684  CIDR \u4e2d\u3002",
+"message.installwizard.tooltip.configureguesttraffic.name": "\u60a8\u7684\u7f51\u7edc\u540d\u79f0",
+"message.instance.scaled.up.confirm": "\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u60a8\u7684\u5b9e\u4f8b?",
+"message.instancewizard.notemplates": "\u60a8\u6ca1\u6709\u4efb\u4f55\u53ef\u7528\u6a21\u677f\uff1b\u8bf7\u6dfb\u52a0\u4e00\u4e2a\u517c\u5bb9\u7684\u6a21\u677f\uff0c\u7136\u540e\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b\u5411\u5bfc\u3002",
+"message.ip.address.changed": "\u60a8\u7684 IP \u5730\u5740\u53ef\u80fd\u5df2\u53d1\u751f\u53d8\u5316\uff1b\u662f\u5426\u8981\u5237\u65b0\u6b64\u5217\u8868? \u8bf7\u6ce8\u610f\uff0c\u5237\u65b0\u6b64\u5217\u8868\u65f6\uff0c\u201c\u8be6\u7ec6\u4fe1\u606f\u201d\u7a97\u683c\u5c06\u5173\u95ed\u3002",
+"message.iso.desc": "\u78c1\u76d8\u6620\u50cf\uff0c\u5176\u4e2d\u5305\u542b\u64cd\u4f5c\u7cfb\u7edf\u7684\u6570\u636e\u6216\u53ef\u542f\u52a8\u4ecb\u8d28",
+"message.join.project": "\u60a8\u73b0\u5728\u5df2\u52a0\u5165\u4e86\u4e00\u4e2a\u9879\u76ee\u3002\u8bf7\u5207\u6362\u5230\u201c\u9879\u76ee\u89c6\u56fe\u201d\u4ee5\u67e5\u770b\u9879\u76ee\u3002",
+"message.launch.vm.on.private.network": "\u662f\u5426\u8981\u5728\u60a8\u7684\u79c1\u4eba\u4e13\u7528\u7f51\u7edc\u4e2d\u542f\u52a8\u5b9e\u4f8b?",
+"message.launch.zone": "\u8d44\u6e90\u57df\u5df2\u51c6\u5907\u5c31\u7eea\uff0c\u53ef\u968f\u65f6\u542f\u52a8\uff1b\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u6b65\u9aa4\u3002",
+"message.ldap.group.import": "All The users from the given group name will be imported",
+"message.link.domain.to.ldap": "\u4e3a\u6b64\u57df\u5f00\u542f LDAP \u540c\u6b65",
+"message.listview.subselect.multi": "(\u6309\u4f4f Ctrl/Cmd \u5e76\u5355\u51fb)",
+"message.lock.account": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9501\u5b9a\u6b64\u5e10\u6237\u3002\u901a\u8fc7\u9501\u5b9a\u6b64\u5e10\u6237\uff0c\u6b64\u5e10\u6237\u7684\u6240\u6709\u7528\u6237\u5c06\u4e0d\u518d\u80fd\u591f\u7ba1\u7406\u5404\u81ea\u7684\u4e91\u8d44\u6e90\uff0c\u4f46\u4ecd\u7136\u53ef\u4ee5\u8bbf\u95ee\u73b0\u6709\u8d44\u6e90\u3002",
+"message.migrate.instance.confirm": "\u8bf7\u786e\u8ba4\u8981\u5c06\u865a\u62df\u5b9e\u4f8b\u8fc1\u79fb\u5230\u7684\u4e3b\u673a\u3002",
+"message.migrate.instance.select.host": "\u9009\u62e9\u7528\u4e8e\u8fc1\u79fb\u7684\u4e3b\u673a",
+"message.migrate.instance.to.host": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u673a\u3002",
+"message.migrate.instance.to.ps": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8\u3002",
+"message.migrate.router.confirm": "\u8bf7\u786e\u8ba4\u60a8\u8981\u5c06\u8def\u7531\u5668\u8fc1\u79fb\u5230\u7684\u4e3b\u673a:",
+"message.migrate.systemvm.confirm": "\u8bf7\u786e\u8ba4\u60a8\u8981\u5c06\u7cfb\u7edf VM \u8fc1\u79fb\u5230\u7684\u4e3b\u673a:",
+"message.migrate.volume": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5377\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8\u3002",
+"message.network.addvm.desc": "\u8bf7\u6307\u5b9a\u8981\u5c06\u6b64 VM \u6dfb\u52a0\u5230\u7684\u7f51\u7edc\u3002\u5c06\u4e3a\u6b64\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a\u65b0 NIC\u3002",
+"message.network.addvmnic": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a\u65b0 VM NIC\u3002",
+"message.network.remote.access.vpn.configuration": "\u8fdc\u7a0b\u8bbf\u95eeVPN\u914d\u7f6e\u5df2\u7ecf\u4ea7\u751f\uff0c\u4f46\u65e0\u6cd5\u5e94\u7528\u3002\u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u72b6\u51b5\uff0c\u7136\u540e\u91cd\u65b0\u5c1d\u8bd5\u3002",
+"message.network.removenic": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u79fb\u9664\u6b64 NIC\uff0c\u6b64\u64cd\u4f5c\u8fd8\u5c06\u4ece VM \u4e2d\u79fb\u9664\u5173\u8054\u7684\u7f51\u7edc\u3002",
+"message.network.updateip": "Please confirm that you would like to change the IP address for this NIC on VM.",
+"message.new.user": "\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u5411\u5e10\u6237\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7528\u6237",
+"message.no.affinity.groups": "\u60a8\u6ca1\u6709\u4efb\u4f55\u5173\u8054\u6027\u7ec4\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002",
+"message.no.host.available": "\u6ca1\u6709\u53ef\u7528\u4e8e\u8fc1\u79fb\u7684\u4e3b\u673a",
+"message.no.more.hosts.available": "\u6ca1\u6709\u53ef\u7528\u4e8e\u8fc1\u79fb\u7684\u4e3b\u673a",
+"message.no.network.support": "\u60a8\u9009\u62e9\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f vSphere \u6ca1\u6709\u4efb\u4f55\u5176\u4ed6\u7f51\u7edc\u529f\u80fd\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u6b65\u9aa4 5\u3002",
+"message.no.network.support.configuration.not.true": "\u60a8\u7684\u6240\u6709\u8d44\u6e90\u57df\u90fd\u672a\u542f\u7528\u5b89\u5168\u7ec4\uff0c\u56e0\u6b64\u65e0\u5176\u4ed6\u7f51\u7edc\u529f\u80fd\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u6b65\u9aa4 5\u3002",
+"message.no.projects": "\u60a8\u6ca1\u6709\u4efb\u4f55\u9879\u76ee\u3002<br/>\u8bf7\u4ece\u201c\u9879\u76ee\u201d\u90e8\u5206\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\u3002",
+"message.no.projects.adminonly": "\u60a8\u6ca1\u6709\u4efb\u4f55\u9879\u76ee\u3002<br/>\u8bf7\u8981\u6c42\u7ba1\u7406\u5458\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\u3002",
+"message.number.clusters": "<h2>\u7fa4\u96c6<span>\u6570</span></h2>",
+"message.number.hosts": "<h2>\u4e3b\u673a<span>\u6570</span></h2>",
+"message.number.pods": "<h2>\u63d0\u4f9b\u70b9<span>\u6570</span></h2>",
+"message.number.storage": "<h2>\u4e3b\u5b58\u50a8\u5377<span>\u6570</span></h2>",
+"message.number.zones": "<h2>\u8d44\u6e90\u57df<span>\u6570</span></h2>",
+"message.outofbandmanagement.action.maintenance": "Warning host is in maintenance mode",
+"message.password.has.been.reset.to": "\u5bc6\u7801\u5df2\u91cd\u7f6e\u4e3a",
+"message.password.of.the.vm.has.been.reset.to": "\u5b9e\u4f8b\u7684\u5bc6\u7801\u4ee5\u91cd\u7f6e\u4e3a",
+"message.pending.projects.1": "\u60a8\u6709\u5f85\u5b9a\u9879\u76ee\u9080\u8bf7:",
+"message.pending.projects.2": "\u8981\u67e5\u770b\uff0c\u8bf7\u8f6c\u81f3\u201c\u9879\u76ee\u201d\u90e8\u5206\uff0c\u7136\u540e\u4ece\u4e0b\u62c9\u5217\u8868\u4e2d\u9009\u62e9\u201c\u9080\u8bf7\u201d\u3002",
+"message.please.add.at.lease.one.traffic.range": "\u8bf7\u81f3\u5c11\u6dfb\u52a0\u4e00\u4e2a\u6d41\u91cf\u8303\u56f4\u3002",
+"message.please.confirm.remove.ssh.key.pair": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64SSH\u5bc6\u94a5\u5bf9",
+"message.please.proceed": "\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e2a\u6b65\u9aa4\u3002",
+"message.please.select.a.configuration.for.your.zone": "\u8bf7\u4e3a\u60a8\u7684\u8d44\u6e90\u57df\u9009\u62e9\u4e00\u79cd\u914d\u7f6e\u3002",
+"message.please.select.a.different.public.and.management.network.before.removing": "\u8bf7\u5148\u9009\u62e9\u5176\u4ed6\u516c\u7528\u7ba1\u7406\u7f51\u7edc\uff0c\u7136\u540e\u518d\u5220\u9664",
+"message.please.select.networks": "\u8bf7\u4e3a\u60a8\u7684\u865a\u62df\u673a\u9009\u62e9\u7f51\u7edc\u3002",
+"message.please.select.ssh.key.pair.use.with.this.vm": "\u8bf7\u4e3a\u6b64\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u5bc6\u94a5\u5bf9",
+"message.please.wait.while.zone.is.being.created": "\u6b63\u5728\u521b\u5efa\u8d44\u6e90\u57df\uff0c\u8bf7\u7a0d\u5019\uff1b\u6b64\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u5b8c\u6210...",
+"message.pod.dedication.released": "\u5df2\u91ca\u653e\u4e13\u7528\u63d0\u4f9b\u70b9",
+"message.portable.ip.delete.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u53ef\u79fb\u690d IP \u8303\u56f4",
+"message.project.invite.sent": "\u53d1\u9001\u7ed9\u7528\u6237\u7684\u9080\u8bf7\uff1b\u7528\u6237\u63a5\u53d7\u9080\u8bf7\u540e\uff0c\u5c06\u52a0\u5165\u5230\u9879\u76ee\u4e2d",
+"message.public.traffic.in.advanced.zone": "\u4e91\u4e2d\u7684 VM \u8bbf\u95ee Internet \u65f6\u5c06\u751f\u6210\u516c\u5171\u6d41\u91cf\uff0c\u4f46\u5fc5\u987b\u5206\u914d\u53ef\u516c\u5f00\u8bbf\u95ee\u7684 IP \u624d\u80fd\u5b9e\u73b0\u3002\u6700\u7ec8\u7528\u6237\u53ef\u4ee5\u4f7f\u7528 CloudStack UI \u83b7\u53d6\u8fd9\u4e9b IP\uff0c\u4ee5\u5728\u5176\u6765\u5bbe\u7f51\u7edc\u4e0e\u516c\u7528\u7f51\u7edc\u4e4b\u95f4\u6267\u884c NAT\u3002<br/><br/>\u8bf7\u81f3\u5c11\u4e3a Internet \u6d41\u91cf\u63d0\u4f9b\u4e00\u4e2a IP \u5730\u5740\u8303\u56f4\u3002",
+"message.public.traffic.in.basic.zone": "\u4e91\u4e2d\u7684 VM \u8bbf\u95ee Internet \u6216\u901a\u8fc7 Internet \u5411\u5ba2\u6237\u7aef\u63d0\u4f9b\u670d\u52a1\u65f6\u5c06\u751f\u6210\u516c\u5171\u6d41\u91cf\uff0c\u4f46\u5fc5\u987b\u5206\u914d\u53ef\u516c\u5f00\u8bbf\u95ee\u7684 IP \u624d\u80fd\u5b9e\u73b0\u3002\u521b\u5efa\u5b9e\u4f8b\u65f6\uff0c\u5c06\u628a\u8fd9\u4e00\u7ec4\u516c\u7528 IP \u4e2d\u7684 IP (\u6765\u5bbe IP \u5730\u5740\u9664\u5916)\u5206\u914d\u7ed9\u6b64\u5b9e\u4f8b\u3002\u9759\u6001 1-1 NAT \u5c06\u5728\u516c\u7528 IP \u4e0e\u6765\u5bbe IP \u4e4b\u95f4\u81ea\u52a8\u8bbe\u7f6e\u3002\u6700\u7ec8\u7528\u6237\u8fd8\u53ef\u4ee5\u4f7f\u7528 CloudStack UI \u83b7\u53d6\u5176\u4ed6 IP\uff0c\u4ee5\u5728\u5176\u5b9e\u4f8b\u4e0e\u516c\u7528 IP \u4e4b\u95f4\u6267\u884c\u9759\u6001 NAT\u3002",
+"message.question.are.you.sure.you.want.to.add": "\u60a8\u786e\u5b9a\u8981\u6dfb\u52a0",
+"message.read.admin.guide.scaling.up": "\u5f00\u59cb\u6269\u5c55\u4e4b\u524d\uff0c\u8bf7\u9605\u8bfb\u7ba1\u7406\u6307\u5357\u4e2d\u7684\u52a8\u6001\u6269\u5c55\u90e8\u5206\u3002",
+"message.recover.vm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6062\u590d\u6b64 VM\u3002",
+"message.redirecting.region": "\u6b63\u5728\u91cd\u5b9a\u5411\u5230\u5730\u7406\u533a\u57df...",
+"message.reinstall.vm": "\u6ce8\u610f: \u8bf7\u8c28\u614e\u64cd\u4f5c\u3002\u8fd9\u5c06\u5bfc\u81f4\u4ece\u6a21\u677f\u91cd\u65b0\u5b89\u88c5 VM\uff0c\u5e76\u4e14\u5f15\u5bfc\u78c1\u76d8\u4e0a\u5b58\u50a8\u7684\u6570\u636e\u5c06\u4e22\u5931\u3002\u989d\u5916\u7684\u6570\u636e\u5377(\u5982\u679c\u5b58\u5728)\u5c06\u65e0\u6cd5\u8bbf\u95ee\u3002",
+"message.remove.ldap": "\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664 LDAP \u914d\u7f6e?",
+"message.remove.region": "\u662f\u5426\u786e\u5b9e\u8981\u4ece\u6b64\u7ba1\u7406\u670d\u52a1\u5668\u4e2d\u5220\u9664\u6b64\u5730\u7406\u533a\u57df?",
+"message.remove.vpc": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VPC",
+"message.remove.vpn.access": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u4ee5\u4e0b\u7528\u6237\u7684 VPN \u8bbf\u95ee\u3002",
+"message.removed.ssh.key.pair": "\u5df2\u79fb\u9664\u7684SSH\u5bc6\u94a5\u5bf9",
+"message.reset.password.warning.notpasswordenabled": "\u521b\u5efa\u6b64\u5b9e\u4f8b\u7684\u6a21\u677f\u65f6\u672a\u542f\u7528\u5bc6\u7801",
+"message.reset.password.warning.notstopped": "\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u5b9e\u4f8b\uff0c\u624d\u80fd\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u5bc6\u7801",
+"message.reset.vpn.connection": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u7f6e VPN \u8fde\u63a5",
+"message.restart.mgmt.server": "\u8bf7\u91cd\u65b0\u542f\u52a8\u7ba1\u7406\u670d\u52a1\u5668\u4ee5\u4f7f\u60a8\u7684\u65b0\u8bbe\u7f6e\u751f\u6548\u3002",
+"message.restart.mgmt.usage.server": "\u8bf7\u91cd\u65b0\u542f\u52a8\u7ba1\u7406\u670d\u52a1\u5668\u548c\u4f7f\u7528\u670d\u52a1\u5668\u4ee5\u4f7f\u60a8\u7684\u65b0\u8bbe\u7f6e\u751f\u6548\u3002",
+"message.restart.network": "\u6b64\u7f51\u7edc\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u7f51\u7edc\u3002",
+"message.restart.vpc": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8 VPC",
+"message.restart.vpc.remark": "\u8bf7\u786e\u5b9a\u60a8\u8981\u91cd\u542fVPC  <p><small><i> \u8b66\u544a: \u91cd\u542f\u975e\u5197\u4f59\u7684VPC\u5c06\u4f1a\u5bfc\u81f4\u7f51\u7edc\u4e2d\u65ad,\u76f4\u81f3VPC\u91cd\u542f\u5b8c\u6210</i>.</small></p>",
+"message.restorevm": "\u662f\u5426\u8981\u8fd8\u539f\u6b64 VM?",
+"message.role.ordering.fail": "Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.",
+"message.role.update.fail": "Failed updating rule permission",
+"message.security.group.usage": "(<strong>\u6309\u4f4f Ctrl \u952e\u5e76\u5355\u51fb\u9f20\u6807</strong>\u53ef\u9009\u62e9\u6240\u6709\u9002\u7528\u7684\u5b89\u5168\u7ec4)",
+"message.select.a.zone": "\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u591a\u4e2a\u8d44\u6e90\u57df\u53ef\u4ee5\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\uff0c\u6709\u52a9\u4e8e\u4f7f\u4e91\u66f4\u52a0\u53ef\u9760\u3002",
+"message.select.affinity.groups": "\u8bf7\u9009\u62e9\u60a8\u5e0c\u671b\u6b64 VM \u6240\u5c5e\u7684\u4efb\u4f55\u5173\u8054\u6027\u7ec4:",
+"message.select.instance": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u5b9e\u4f8b\u3002",
+"message.select.iso": "\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a ISO\u3002",
+"message.select.item": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u9879\u76ee\u3002",
+"message.select.security.groups": "\u8bf7\u4e3a\u60a8\u7684\u65b0 VM \u9009\u62e9\u5b89\u5168\u7ec4",
+"message.select.template": "\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u3002",
+"message.select.tier": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u5c42",
+"message.set.default.nic": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u6b64 NIC \u8bbe\u7f6e\u4e3a\u6b64 VM \u7684\u9ed8\u8ba4 NIC\u3002",
+"message.set.default.nic.manual": "\u8bf7\u7acb\u5373\u624b\u52a8\u66f4\u65b0\u6b64 VM \u4e0a\u7684\u9ed8\u8ba4 NIC\u3002",
+"message.setup.physical.network.during.zone.creation": "\u6dfb\u52a0\u9ad8\u7ea7\u8d44\u6e90\u57df\u65f6\uff0c\u9700\u8981\u8bbe\u7f6e\u4e00\u4e2a\u6216\u591a\u4e2a\u7269\u7406\u7f51\u7edc\u3002\u6bcf\u4e2a\u7f51\u7edc\u90fd\u4e0e\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u4e2d\u7684\u4e00\u4e2a NIC \u76f8\u5bf9\u5e94\u3002\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u4e2d\u53ef\u4ee5\u5305\u542b\u4e00\u79cd\u6216\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\uff0c\u5e76\u5bf9\u8fd9\u4e9b\u6d41\u91cf\u7c7b\u578b\u53ef\u80fd\u7684\u7ec4\u5408\u65b9\u5f0f\u8bbe\u7f6e\u4e86\u67d0\u4e9b\u9650\u5236\u3002<br/><br/><strong>\u53ef\u4ee5\u5c06\u4e00\u79cd\u6216\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\u62d6\u653e</strong>\u5230\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u4e2d\u3002",
+"message.setup.physical.network.during.zone.creation.basic": "\u6dfb\u52a0\u57fa\u7840\u8d44\u6e90\u57df\u65f6\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u4e00\u4e2a\u7269\u7406\u7f51\u7edc\uff0c\u6b64\u7f51\u7edc\u5e94\u4e0e\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u4e2d\u7684 NIC \u76f8\u5bf9\u5e94\u3002\u6b64\u7f51\u7edc\u53ef\u4ee5\u627f\u8f7d\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\u3002<br/><br/>\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u5c06\u5176\u4ed6\u6d41\u91cf\u7c7b\u578b<strong>\u62d6\u653e</strong>\u5230\u6b64\u7269\u7406\u7f51\u7edc\u3002",
+"message.setup.successful": "\u5df2\u6210\u529f\u8bbe\u7f6e\u4e91!",
+"message.specifiy.tag.key.value": "\u8bf7\u6307\u5b9a\u6807\u8bb0\u5bc6\u94a5\u548c\u503c",
+"message.specify.url": "\u8bf7\u6307\u5b9a URL",
+"message.step.1.desc": "\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u3002\u8fd8\u53ef\u4ee5\u9009\u62e9\u4e00\u4e2a\u53ef\u5c06 ISO \u6620\u50cf\u5b89\u88c5\u5230\u5176\u4e2d\u7684\u7a7a\u6a21\u677f\u3002",
+"message.step.2.continue": "\u8bf7\u9009\u62e9\u4e00\u79cd\u670d\u52a1\u65b9\u6848\u4ee5\u7ee7\u7eed",
+"message.step.3.continue": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u78c1\u76d8\u65b9\u6848\u4ee5\u7ee7\u7eed",
+"message.step.4.continue": "\u8bf7\u81f3\u5c11\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u4ee5\u7ee7\u7eed",
+"message.step.4.desc": "\u8bf7\u9009\u62e9\u865a\u62df\u5b9e\u4f8b\u8981\u8fde\u63a5\u5230\u7684\u4e3b\u7f51\u7edc\u3002",
+"message.storage.traffic": "CloudStack \u5185\u90e8\u8d44\u6e90(\u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u901a\u4fe1\u7684\u4efb\u4f55\u7ec4\u4ef6\uff0c\u4f8b\u5982\u4e3b\u673a\u548c CloudStack \u7cfb\u7edf VM)\u4e4b\u95f4\u7684\u6d41\u91cf\u3002\u8bf7\u5728\u6b64\u5904\u914d\u7f6e\u5b58\u50a8\u6d41\u91cf\u3002",
+"message.suspend.project": "\u662f\u5426\u786e\u5b9e\u8981\u6682\u505c\u6b64\u9879\u76ee?",
+"message.systems.vms.ready": "\u7cfb\u7edf VM \u5df2\u5c31\u7eea\u3002",
+"message.template.copying": "\u6b63\u5728\u590d\u5236\u6a21\u677f\u3002",
+"message.template.desc": "\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf\uff0c\u53ef\u7528\u4e8e\u542f\u52a8 VM",
+"message.template.iso": "\u8bf7\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u6216 ISO \u4ee5\u7ee7\u7eed",
+"message.tier.required": "\u201c\u5c42\u201d\u4e3a\u5fc5\u586b\u9879",
+"message.tooltip.dns.1": "\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002",
+"message.tooltip.dns.2": "\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 VM \u4f7f\u7528\u7684\u4e8c\u7ea7 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002",
+"message.tooltip.internal.dns.1": "\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 CloudStack \u5185\u90e8\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u63d0\u4f9b\u70b9\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002",
+"message.tooltip.internal.dns.2": "\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 CloudStack \u5185\u90e8\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u63d0\u4f9b\u70b9\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002",
+"message.tooltip.network.domain": "DNS \u540e\u7f00\uff0c\u5c06\u4e3a\u7531\u6765\u5bbe VM \u8bbf\u95ee\u7684\u7f51\u7edc\u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u57df\u540d\u3002",
+"message.tooltip.pod.name": "\u6b64\u63d0\u4f9b\u70b9\u7684\u540d\u79f0\u3002",
+"message.tooltip.reserved.system.gateway": "\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u7f51\u5173\u3002",
+"message.tooltip.reserved.system.netmask": "\u7528\u4e8e\u5b9a\u4e49\u63d0\u4f9b\u70b9\u5b50\u7f51\u7684\u7f51\u7edc\u524d\u7f00\u3002\u8bf7\u4f7f\u7528 CIDR \u7b26\u53f7\u3002",
+"message.tooltip.zone.name": "\u8d44\u6e90\u57df\u540d\u79f0\u3002",
+"message.update.os.preference": "\u8bf7\u4e3a\u6b64\u4e3b\u673a\u9009\u62e9\u4e00\u4e2a\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879\u3002\u9996\u5148\u5c06\u5177\u6709\u76f8\u4f3c\u9996\u9009\u9879\u7684\u6240\u6709\u865a\u62df\u5b9e\u4f8b\u5206\u914d\u81f3\u6b64\u4e3b\u673a\uff0c\u7136\u540e\u518d\u9009\u62e9\u5176\u4ed6\u5b9e\u4f8b\u3002",
+"message.update.resource.count": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u65b0\u6b64\u5e10\u6237\u7684\u8d44\u6e90\u6570\u3002",
+"message.update.ssl": "\u8bf7\u63d0\u4ea4\u4e00\u4e2a X.509 \u517c\u5bb9\u7684\u65b0 SSL \u8bc1\u4e66\uff0c\u4ee5\u4fbf\u5c06\u5176\u66f4\u65b0\u5230\u6bcf\u4e2a\u63a7\u5236\u53f0\u4ee3\u7406\u548c\u4e8c\u7ea7\u5b58\u50a8\u865a\u62df\u5b9e\u4f8b:",
+"message.update.ssl.failed": "\u65e0\u6cd5\u66f4\u65b0 SSL \u8bc1\u4e66\u3002",
+"message.update.ssl.succeeded": "\u5df2\u6210\u529f\u66f4\u65b0 SSL \u8bc1\u4e66",
+"message.validate.accept": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u5e26\u6709\u6709\u6548\u6269\u5c55\u540d\u7684\u503c\u3002",
+"message.validate.creditcard": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u4fe1\u7528\u5361\u5361\u53f7\u3002",
+"message.validate.date": "\u8bf7\u8f93\u5165\u6709\u6548\u7684\u65e5\u671f\u3002",
+"message.validate.date.iso": "\u8bf7\u8f93\u5165\u6709\u6548\u7684\u65e5\u671f(ISO)\u3002",
+"message.validate.digits": "\u8bf7\u4ec5\u8f93\u5165\u6570\u5b57\u3002",
+"message.validate.email.address": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u3002",
+"message.validate.equalto": "\u8bf7\u91cd\u65b0\u8f93\u5165\u76f8\u540c\u7684\u503c\u3002",
+"message.validate.fieldrequired": "\u6b64\u5b57\u6bb5\u4e3a\u5fc5\u586b\u5b57\u6bb5\u3002",
+"message.validate.fixfield": "\u8bf7\u4fee\u590d\u6b64\u5b57\u6bb5\u3002",
+"message.validate.instance.name": "\u5b9e\u4f8b\u540d\u79f0\u4e0d\u5f97\u8d85\u8fc7 63 \u4e2a\u5b57\u7b26\u3002\u4ec5\u5141\u8bb8\u4f7f\u7528 ASCII \u5b57\u6bcd a - z \u6216 A - Z\u3001\u6570\u5b57 0 - 9 \u4ee5\u53ca\u8fde\u5b57\u7b26\u3002\u5b9e\u4f8b\u540d\u79f0\u5fc5\u987b\u4ee5\u5b57\u6bcd\u5f00\u5934\u5e76\u4ee5\u5b57\u6bcd\u6216\u6570\u5b57\u7ed3\u675f\u3002",
+"message.validate.invalid.characters": "\u67e5\u627e\u5230\u65e0\u6548\u5b57\u7b26\uff0c\u8bf7\u66f4\u6b63\u3002",
+"message.validate.max": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u5c0f\u4e8e\u6216\u7b49\u4e8e {0} \u7684\u503c\u3002",
+"message.validate.maxlength": "\u8bf7\u6700\u591a\u8f93\u5165 {0} \u4e2a\u5b57\u7b26\u3002",
+"message.validate.minlength": "\u8bf7\u81f3\u5c11\u8f93\u5165 {0} \u4e2a\u5b57\u7b26\u3002",
+"message.validate.number": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u5b57\u3002",
+"message.validate.range": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u4ecb\u4e8e {0} \u5230 {1} \u4e4b\u95f4\u7684\u503c\u3002",
+"message.validate.range.length": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4ecb\u4e8e {0} \u5230 {1} \u4e4b\u95f4\u7684\u503c\u3002",
+"message.validate.url": "\u8bf7\u8f93\u5165\u6709\u6548\u7684 URL\u3002",
+"message.virtual.network.desc": "\u60a8\u7684\u5e10\u6237\u7684\u4e13\u7528\u865a\u62df\u7f51\u7edc\u3002\u5e7f\u64ad\u57df\u5305\u542b\u5728 VLAN \u4e2d\uff0c\u5e76\u4e14\u6240\u6709\u516c\u7528\u7f51\u7edc\u8bbf\u95ee\u90fd\u7531\u865a\u62df\u8def\u7531\u5668\u8def\u7531\u51fa\u53bb\u3002",
+"message.vm.create.template.confirm": "\u521b\u5efa\u6a21\u677f\u5c06\u81ea\u52a8\u91cd\u65b0\u542f\u52a8 VM\u3002",
+"message.vm.review.launch": "\u8bf7\u5148\u6838\u5bf9\u4ee5\u4e0b\u4fe1\u606f\uff0c\u786e\u8ba4\u60a8\u7684\u865a\u62df\u5b9e\u4f8b\u6b63\u786e\u65e0\u8bef\uff0c\u7136\u540e\u518d\u542f\u52a8\u3002",
+"message.vnmc.available.list": "\u63d0\u4f9b\u7a0b\u5e8f\u5217\u8868\u4e2d\u672a\u63d0\u4f9b VNMC\u3002",
+"message.vnmc.not.available.list": "\u63d0\u4f9b\u7a0b\u5e8f\u5217\u8868\u4e2d\u672a\u63d0\u4f9b VNMC\u3002",
+"message.volume.create.template.confirm": "\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u78c1\u76d8\u5377\u521b\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u521b\u5efa\u6a21\u677f\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u5230\u66f4\u957f\u7684\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u5377\u7684\u5927\u5c0f\u3002",
+"message.waiting.for.builtin.templates.to.load": "\u6b63\u5728\u7b49\u5f85\u52a0\u8f7d\u5185\u7f6e\u6a21\u677f...",
+"message.xstools61plus.update.failed": "\u65e0\u6cd5\u66f4\u65b0\u201c\u539f\u59cb XS \u7248\u672c\u4e3a 6.1+\u201d\u5b57\u6bb5\u3002\u9519\u8bef:",
+"message.you.must.have.at.least.one.physical.network": "\u60a8\u5fc5\u987b\u81f3\u5c11\u62e5\u6709\u4e00\u4e2a\u7269\u7406\u7f51\u7edc",
+"message.your.cloudstack.is.ready": "\u60a8\u7684 CloudStack \u5df2\u5c31\u7eea!",
+"message.zone.creation.complete": "\u5df2\u5b8c\u6210\u521b\u5efa\u8d44\u6e90\u57df",
+"message.zone.creation.complete.would.you.like.to.enable.this.zone": "\u5df2\u5b8c\u6210\u521b\u5efa\u8d44\u6e90\u57df\u3002\u662f\u5426\u8981\u542f\u7528\u6b64\u8d44\u6e90\u57df?",
+"message.zone.no.network.selection": "\u6240\u9009\u8d44\u6e90\u57df\u65e0\u4efb\u4f55\u7f51\u7edc\u9009\u9879\u3002",
+"message.zone.step.1.desc": "\u8bf7\u4e3a\u60a8\u7684\u8d44\u6e90\u57df\u9009\u62e9\u4e00\u79cd\u7f51\u7edc\u6a21\u5f0f\u3002",
+"message.zone.step.2.desc": "\u8bf7\u8f93\u5165\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u8d44\u6e90\u57df",
+"message.zone.step.3.desc": "\u8bf7\u8f93\u5165\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u63d0\u4f9b\u70b9",
+"message.zonewizard.enable.local.storage": "\u8b66\u544a: \u5982\u679c\u4e3a\u6b64\u8d44\u6e90\u57df\u542f\u7528\u4e86\u672c\u5730\u5b58\u50a8\uff0c\u5219\u5fc5\u987b\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u60a8\u5e0c\u671b\u542f\u52a8\u7cfb\u7edf VM \u7684\u4f4d\u7f6e:<br/><br/>1. \u5982\u679c\u9700\u8981\u5728\u5171\u4eab\u4e3b\u5b58\u50a8\u4e2d\u542f\u52a8\u7cfb\u7edf VM\uff0c\u5219\u5fc5\u987b\u5728\u5b8c\u6210\u521b\u5efa\u540e\u5c06\u5171\u4eab\u4e3b\u5b58\u50a8\u6dfb\u52a0\u5230\u6b64\u8d44\u6e90\u57df\u3002<br/><br/>2. \u5982\u679c\u9700\u8981\u5728\u672c\u5730\u4e3b\u5b58\u50a8\u4e2d\u542f\u52a8\u7cfb\u7edf VM\uff0c\u5219\u5fc5\u987b\u5728\u542f\u7528\u6b64\u8d44\u6e90\u57df\u4e4b\u524d\u5c06 system.vm.use.local.storage \u8bbe\u7f6e\u4e3a true\u3002<br/><br/><br/>\u662f\u5426\u8981\u7ee7\u7eed?",
+"messgae.validate.min": "\u8bf7\u8f93\u5165\u4e00\u4e2a\u5927\u4e8e\u6216\u7b49\u4e8e {0} \u7684\u503c\u3002",
+"network.rate": "\u7f51\u7edc\u901f\u7387",
+"side.by.side": "\u5e76\u884c",
+"state.accepted": "\u5df2\u63a5\u53d7",
+"state.active": "\u6d3b\u52a8",
+"state.allocating": "\u6b63\u5728\u5206\u914d",
+"state.backedup": "\u5df2\u5907\u4efd",
+"state.backingup": "\u6b63\u5728\u5907\u4efd",
+"state.completed": "\u5df2\u5b8c\u6210",
+"state.creating": "\u6b63\u5728\u521b\u5efa",
+"state.declined": "\u5df2\u62d2\u7edd",
+"state.destroyed": "\u5df2\u9500\u6bc1",
+"state.detached": "\u5df2\u53d6\u6d88\u9644\u52a0",
+"state.disabled": "\u5df2\u7981\u7528",
+"state.enabled": "\u5df2\u542f\u7528",
+"state.error": "\u9519\u8bef",
+"state.expunging": "\u6b63\u5728\u5220\u9664",
+"state.migrating": "\u6b63\u5728\u8fc1\u79fb",
+"state.pending": "\u5f85\u5b9a",
+"state.running": "\u6b63\u5728\u8fd0\u884c",
+"state.starting": "\u6b63\u5728\u542f\u52a8",
+"state.stopped": "\u5df2\u505c\u6b62",
+"state.stopping": "\u6b63\u5728\u505c\u6b62",
+"state.suspended": "\u5df2\u6682\u505c",
+"title.upload.volume": "\u4e0a\u4f20\u5377"
+}
\ No newline at end of file
diff --git a/ui/scripts/cloudStack.js b/ui/scripts/cloudStack.js
deleted file mode 100644
index e6550b7..0000000
--- a/ui/scripts/cloudStack.js
+++ /dev/null
@@ -1,537 +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("");
-
-                $.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/scripts/configuration.js b/ui/scripts/configuration.js
deleted file mode 100644
index 3d3783d..0000000
--- a/ui/scripts/configuration.js
+++ /dev/null
@@ -1,5951 +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
-                                    },
-                                    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.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
-                                    };
-                                    $.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'
-                                    },
-                                    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',
-                        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/scripts/docs.js b/ui/scripts/docs.js
deleted file mode 100755
index 7f29f2b..0000000
--- a/ui/scripts/docs.js
+++ /dev/null
@@ -1,1413 +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 VMFS (iSCSI or FiberChannel) 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: ''
-    },
-    // 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/scripts/instanceWizard.js b/ui/scripts/instanceWizard.js
deleted file mode 100644
index dc7708d..0000000
--- a/ui/scripts/instanceWizard.js
+++ /dev/null
@@ -1,1477 +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
-                            }
-                        });
-                    }
-                });
-
-                if (selectedTemplateObj) {
-                    $.ajax({
-                        url: createURL("listTemplateOvfProperties&id=" + selectedTemplateObj.id),
-                        dataType: "json",
-                        async: false,
-                        success: function(json) {
-                            ovfProps = json.listtemplateovfpropertiesresponse.ovfproperty;
-                        }
-                    });
-                }
-
-                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 PRE-8: Configure OVF Properties (if available) for the template
-            function(args) {
-                args.response.success({
-                    data: {
-                        ovfProperties: ovfProps
-                    }
-                });
-            },
-
-            // 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["ovfproperties[" + k + "].key"] = deployOvfProperties[k].key;
-                    deployVmData["ovfproperties[" + 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
-                });
-            }
-
-            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/scripts/instances.js b/ui/scripts/instances.js
deleted file mode 100644
index 6a3ad4f..0000000
--- a/ui/scripts/instances.js
+++ /dev/null
@@ -1,4207 +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
-                  });
-                }
-              }
-            }
-          }
-        },
-        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
-                                          });
-                                      }
-                                  }
-                                }
-                            }
-                        },
-                        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
-                                });
-                            }
-                            $.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',
-                        action: function(args) {
-                            $.ajax({
-                                url: createURL("rebootVirtualMachine&id=" + args.context.instances[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 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/scripts/network.js b/ui/scripts/network.js
deleted file mode 100644
index 77cce33..0000000
--- a/ui/scripts/network.js
+++ /dev/null
@@ -1,7119 +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 ("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/scripts/sharedFunctions.js b/ui/scripts/sharedFunctions.js
deleted file mode 100644
index c13af41..0000000
--- a/ui/scripts/sharedFunctions.js
+++ /dev/null
@@ -1,3201 +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("+", "-");
-        secret = secret.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/scripts/storage.js b/ui/scripts/storage.js
deleted file mode 100644
index aa355ef..0000000
--- a/ui/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.take.snapshot',
-                                    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/scripts/system.js b/ui/scripts/system.js
deleted file mode 100755
index 29f428a..0000000
--- a/ui/scripts/system.js
+++ /dev/null
@@ -1,23213 +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);
-
-                                    $.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)'
-                                                });
-                                                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'
-                                    }
-                                },
-                                {
-                                    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: "vmfs",
-                                                    description: "vmfs"
-                                                });
-                                                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") {
-                                                    $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 == "vmfs") {
-                                                    $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") {
-                                        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 == "vmfs") {
-                                        var path = args.data.vCenterDataCenter;
-                                        if (path.substring(0, 1) != "/")
-                                            path = "/" + path;
-                                        path += "/" + args.data.vCenterDataStore;
-                                        url = vmfsURL("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);
-                                    }
-
-                                    $.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'
-                                    }
-                                },
-                                {
-                                    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/scripts/templates.js b/ui/scripts/templates.js
deleted file mode 100644
index f7e784f..0000000
--- a/ui/scripts/templates.js
+++ /dev/null
@@ -1,3961 +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]').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=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) {
-                            $.ajax({
-                                url: createURL("listTemplateOvfProperties&id=" + args.context.templates[0].id),
-                                dataType: "json",
-                                async: false,
-                                success: function(json) {
-                                    ovfprops = json.listtemplateovfpropertiesresponse.ovfproperty;
-                                }
-                            });
-                            var hiddenTabs = [];
-                            if (ovfprops == null || ovfprops.length === 0) {
-                                hiddenTabs.push("ovfpropertiestab");
-                            }
-                            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
-													});
-												}
-											});
-										}
-									}
-								})
-							},
-
-                            /**
-                             * OVF properties tab (only displayed when OVF properties are available)
-                             */
-                            ovfpropertiestab: {
-                                title: 'label.ovf.properties',
-                                listView: {
-                                    id: 'ovfproperties',
-                                    fields: {
-                                        label: {
-                                            label: 'label.label'
-                                        },
-                                        description: {
-                                            label: 'label.description'
-                                        },
-                                        value: {
-                                            label: 'label.value'
-                                        }
-                                    },
-                                    hideSearchBar: true,
-                                    dataProvider: function(args) {
-                                        $.ajax({
-                                            url: createURL("listTemplateOvfProperties"),
-                                            data: {
-                                                id: args.context.templates[0].id
-                                            },
-                                            success: function(json) {
-                                                var ovfprops = json.listtemplateovfpropertiesresponse.ovfproperty;
-                                                var listDetails = [];
-                                                for (index in ovfprops){
-                                                    var prop = ovfprops[index];
-                                                    var det = {};
-                                                    det['label'] = prop['label'];
-                                                    det['description'] = prop['description'];
-                                                    det['value'] = prop['value'];
-                                                    listDetails.push(det);
-                                                }
-                                                args.response.success({
-                                                    data: listDetails
-                                                });
-                                            },
-
-                                            error: function(json) {
-                                                args.response.error(parseXMLHttpResponse(json));
-                                            }
-                                        });
-
-                                    }
-                                }
-                            }
-						}
-                    }
-                }
-            },
-            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
-                                }
-                            }
-                        },
-
-                        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 {
-            allowedActions.push("downloadISO");
-        }
-
-        // "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/scripts/ui-custom/instanceWizard.js b/ui/scripts/ui-custom/instanceWizard.js
deleted file mode 100644
index 4aefa97..0000000
--- a/ui/scripts/ui-custom/instanceWizard.js
+++ /dev/null
@@ -1,1758 +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.startsWith("MaxLen")) {
-                                    var length = qualifiers.replace("MaxLen(","").slice(0,-1);
-                                    propertyField = $('<input id=ovf-property-'+key+'>')
-                                        .attr({maxlength : length, 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/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js
deleted file mode 100755
index 785f388..0000000
--- a/ui/scripts/zoneWizard.js
+++ /dev/null
@@ -1,4804 +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();
-                    } 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();
-                        } 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]').hide();
-                            args.$form.find('[rel=ip6dns2]').hide();
-                        }
-                    }
-                },
-                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
-                        }
-                   },
-
-                    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: "vmfs",
-                                    description: "vmfs"
-                                });
-                                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") {
-                                    $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 == "vmfs") {
-                                    $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
-                            });
-                        }
-                    }
-
-                    $.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") {
-                        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 == "vmfs") {
-                        var path = args.data.primaryStorage.vCenterDataCenter;
-                        if (path.substring(0, 1) != "/")
-                            path = "/" + path;
-                        path += "/" + args.data.primaryStorage.vCenterDataStore;
-                        url = vmfsURL("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/src/App.vue b/ui/src/App.vue
new file mode 100644
index 0000000..fa75a8e
--- /dev/null
+++ b/ui/src/App.vue
@@ -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.
+
+<template>
+  <a-config-provider :locale="locale">
+    <div id="app">
+      <router-view/>
+    </div>
+  </a-config-provider>
+</template>
+
+<script>
+import enUS from 'ant-design-vue/lib/locale-provider/en_US'
+import { AppDeviceEnquire } from '@/utils/mixin'
+
+export default {
+  mixins: [AppDeviceEnquire],
+  data () {
+    return {
+      locale: enUS,
+      configs: {}
+    }
+  },
+  created () {
+    window.less.modifyVars(this.$config.theme)
+    console.log('config and theme applied')
+  }
+}
+</script>
+<style>
+#app {
+  height: 100%;
+}
+</style>
diff --git a/ui/src/api/index.js b/ui/src/api/index.js
new file mode 100644
index 0000000..4056931
--- /dev/null
+++ b/ui/src/api/index.js
@@ -0,0 +1,61 @@
+// 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 { axios } from '@/utils/request'
+
+export function api (command, args = {}, method = 'GET', data = {}) {
+  let params = {}
+  args.command = command
+  args.response = 'json'
+
+  if (data) {
+    params = new URLSearchParams()
+    Object.entries(data).forEach(([key, value]) => {
+      params.append(key, value)
+    })
+  }
+
+  return axios({
+    params: {
+      ...args
+    },
+    url: '/',
+    method,
+    data: params || {}
+  })
+}
+
+export function login (arg) {
+  const params = new URLSearchParams()
+  params.append('command', 'login')
+  params.append('username', arg.username)
+  params.append('password', arg.password)
+  params.append('domain', arg.domain)
+  params.append('response', 'json')
+  return axios({
+    url: '/',
+    method: 'post',
+    data: params,
+    headers: {
+      'Content-Type': 'application/x-www-form-urlencoded'
+    }
+  })
+}
+
+export function logout () {
+  return api('logout')
+}
diff --git a/ui/src/assets/icons/cloudian.svg b/ui/src/assets/icons/cloudian.svg
new file mode 100644
index 0000000..3b9e91e
--- /dev/null
+++ b/ui/src/assets/icons/cloudian.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xml:space="preserve"
+   width="160"
+   height="160"
+   version="1.1"
+   style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision"
+   viewBox="0 0 1666.6667 1666.8369"
+   id="svg38"
+   sodipodi:docname="cloudian.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
+   id="metadata42"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1673"
+   inkscape:window-height="931"
+   id="namedview40"
+   showgrid="false"
+   units="px"
+   inkscape:zoom="1.11"
+   inkscape:cx="159.90991"
+   inkscape:cy="95.225335"
+   inkscape:window-x="54"
+   inkscape:window-y="26"
+   inkscape:window-maximized="0"
+   inkscape:current-layer="svg38" />
+ <defs
+   id="defs4">
+  <style
+   type="text/css"
+   id="style2">
+   <![CDATA[
+    .fil0 {fill:#424B53;fill-rule:nonzero}
+    .fil2 {fill:#969C98;fill-rule:nonzero}
+    .fil1 {fill:#BFD43F;fill-rule:nonzero}
+   ]]>
+  </style>
+ </defs>
+ <g
+   id="g4573"
+   transform="translate(-686.25631,82.403259)"><polygon
+     transform="translate(0,-69.453818)"
+     class="fil0"
+     points="1524,293 1524,-5 815,404 1073,553 "
+     id="polygon7"
+     style="fill:#424b53;fill-rule:nonzero" /><polygon
+     transform="translate(0,-69.453818)"
+     class="fil0"
+     points="1524,814 1726,697 1524,581 1323,697 "
+     id="polygon9"
+     style="fill:#424b53;fill-rule:nonzero" /><polygon
+     transform="translate(0,-69.453818)"
+     class="fil1"
+     points="1524,814 1524,1047 1726,930 1726,697 "
+     id="polygon11"
+     style="fill:#bfd43f;fill-rule:nonzero" /><polygon
+     transform="translate(0,-69.453818)"
+     class="fil1"
+     points="2234,404 1976,553 1976,1074 1524,1335 1524,1632 2234,1223 "
+     id="polygon13"
+     style="fill:#bfd43f;fill-rule:nonzero" /><polygon
+     transform="translate(0,-69.453818)"
+     class="fil2"
+     points="1524,1047 1524,814 1323,697 1323,930 "
+     id="polygon15"
+     style="fill:#969c98;fill-rule:nonzero" /><polygon
+     transform="translate(0,-69.453818)"
+     class="fil2"
+     points="1073,1074 1073,553 815,404 815,1223 1524,1632 1524,1335 "
+     id="polygon17"
+     style="fill:#969c98;fill-rule:nonzero" /></g>
+</svg>
diff --git a/ui/src/assets/icons/debian.svg b/ui/src/assets/icons/debian.svg
new file mode 100644
index 0000000..f12785b
--- /dev/null
+++ b/ui/src/assets/icons/debian.svg
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:ns4="http://ns.adobe.com/SaveForWeb/1.0/"
+   xmlns:ns3="http://ns.adobe.com/Variables/1.0/"
+   xmlns:ns2="http://ns.adobe.com/AdobeIllustrator/10.0/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   ns2:viewOrigin="262 450"
+   ns2:rulerOrigin="0 0"
+   ns2:pageBounds="0 792 612 0"
+   width="56"
+   height="56.000069"
+   viewBox="0 0 55.999999 56.000069"
+   overflow="visible"
+   enable-background="new 0 0 87.041 108.445"
+   xml:space="preserve"
+   version="1.1"
+   id="svg31"
+   sodipodi:docname="debian.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   style="overflow:visible"><defs
+   id="defs35" /><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1866"
+   inkscape:window-height="1017"
+   id="namedview33"
+   showgrid="false"
+   inkscape:zoom="2.1762184"
+   inkscape:cx="-62.475298"
+   inkscape:cy="28.002047"
+   inkscape:window-x="54"
+   inkscape:window-y="26"
+   inkscape:window-maximized="1"
+   inkscape:current-layer="g28"
+   fit-margin-top="0"
+   fit-margin-left="0"
+   fit-margin-right="0"
+   fit-margin-bottom="0" />
+	<metadata
+   id="metadata2">
+		<ns3:variableSets>
+			<ns3:variableSet
+   varSetName="binding1"
+   locked="none">
+				<ns3:variables />
+				<ns3:sampleDataSets />
+			</ns3:variableSet>
+		</ns3:variableSets>
+		<ns4:sfw>
+			<ns4:slices />
+			<ns4:sliceSourceBounds
+   y="341.555"
+   x="262"
+   width="87.041"
+   height="108.445"
+   bottomLeftOrigin="true" />
+		</ns4:sfw>
+	<rdf:RDF><cc:Work
+     rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+       rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata>
+	<g
+   id="Layer_1"
+   ns2:layer="yes"
+   ns2:dimmedPercent="50"
+   ns2:rgbTrio="#4F008000FFFF"
+   transform="translate(-20.985947,-26.22447)">
+		<g
+   id="g28">
+			<path
+   ns2:knockout="Off"
+   d="m 53.872479,55.811055 c -0.927921,0.01291 0.175567,0.478161 1.386977,0.664571 0.334609,-0.261284 0.638236,-0.525667 0.908815,-0.78282 -0.75442,0.184861 -1.522266,0.188992 -2.295792,0.118249"
+   id="path4"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 58.852891,54.569696 c 0.552518,-0.762682 0.955289,-1.597656 1.097291,-2.461031 -0.123929,0.615516 -0.458022,1.146863 -0.772493,1.707644 -1.734495,1.092127 -0.163174,-0.648564 -10e-4,-1.310037 -1.865137,2.347429 -0.256121,1.407631 -0.323766,2.063424"
+   id="path6"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 60.691176,49.786022 c 0.112053,-1.670981 -0.328929,-1.142732 -0.477128,-0.505012 0.172985,0.08985 0.309824,1.177846 0.477128,0.505012"
+   id="path8"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 50.353918,26.946873 c 0.495201,0.08882 1.069924,0.156977 0.98937,0.275226 0.541674,-0.118765 0.664571,-0.228236 -0.98937,-0.275226"
+   id="path10"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 51.343288,27.222099 -0.350101,0.07229 0.325831,-0.02892 0.02427,-0.04338"
+   id="path12"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 66.784887,50.419611 c 0.05525,1.500578 -0.438917,2.228663 -0.884546,3.517529 l -0.801926,0.400705 c -0.65631,1.274407 0.06351,0.809155 -0.406386,1.822794 -1.024482,0.910881 -3.109077,2.850376 -3.776231,3.027491 -0.486939,-0.01085 0.329962,-0.574722 0.436851,-0.79573 -1.371485,0.941864 -1.100389,1.413828 -3.197894,1.985969 l -0.06145,-0.136323 c -5.173018,2.433663 -12.358856,-2.389255 -12.26436,-8.969904 -0.05525,0.417745 -0.156977,0.313438 -0.271612,0.482292 -0.266964,-3.385854 1.563576,-6.786682 4.650966,-8.175207 3.019746,-1.494898 6.559995,-0.881448 8.723078,1.13447 -1.188172,-1.556347 -3.553158,-3.206156 -6.356027,-3.051761 -2.745552,0.04337 -5.313988,1.788197 -6.171166,3.682251 -1.406598,0.885579 -1.569772,3.413738 -2.182706,3.876408 -0.824647,6.060662 1.551183,8.679186 5.570109,11.759347 0.632556,0.426524 0.178148,0.49107 0.263866,0.815869 -1.335339,-0.625327 -2.558109,-1.569256 -3.563486,-2.724897 0.533413,0.780755 1.109168,1.539822 1.853261,2.136232 -1.258916,-0.426523 -2.940741,-3.050728 -3.431811,-3.157617 2.170313,3.885702 8.805182,6.814566 12.279335,5.361494 -1.607467,0.05938 -3.64972,0.03305 -5.455991,-0.634621 -0.758551,-0.390378 -1.790263,-1.199017 -1.605918,-1.350314 4.741331,1.771157 9.639123,1.341535 13.741702,-1.94724 1.043588,-0.81277 2.183738,-2.195615 2.513184,-2.214721 -0.496234,0.746158 0.08469,0.358879 -0.296398,1.01777 1.039974,-1.677178 -0.451826,-0.682645 1.075087,-2.896333 l 0.563879,0.776624 c -0.209647,-1.39214 1.728815,-3.082743 1.532077,-5.284555 0.444596,-0.673349 0.496234,0.724471 0.02427,2.273588 0.654761,-1.718487 0.172469,-1.994746 0.340806,-3.412705 0.181763,0.476612 0.420327,0.983173 0.542707,1.48612 -0.426523,-1.660654 0.437884,-2.796673 0.651662,-3.761773 -0.21068,-0.09346 -0.658374,0.734282 -0.760616,-1.227417 0.01497,-0.852014 0.237015,-0.446662 0.322733,-0.656309 -0.167305,-0.09605 -0.606222,-0.749257 -0.873186,-2.001976 0.19364,-0.294332 0.517405,0.763198 0.780755,0.806574 -0.16937,-0.996083 -0.461121,-1.755666 -0.472997,-2.519897 -0.769395,-1.607984 -0.272128,0.214294 -0.896423,-0.69039 -0.818966,-2.554494 0.679547,-0.592796 0.780755,-1.753601 1.24136,1.798525 1.949306,4.585903 2.274104,5.740512 -0.247858,-1.407631 -0.648563,-2.771371 -1.137568,-4.090702 0.376952,0.158526 -0.607254,-2.896333 0.490037,-0.873186 -1.172165,-4.312742 -5.016557,-8.342512 -8.553191,-10.233467 0.43272,0.396057 0.979042,0.893324 0.78282,0.971296 -1.758764,-1.047203 -1.449457,-1.12879 -1.701447,-1.571321 -1.432933,-0.582984 -1.526913,0.04699 -2.476005,0.001 -2.70063,-1.432419 -3.221133,-1.280089 -5.706433,-2.177544 l 0.113085,0.528249 c -1.78923,-0.595894 -2.084595,0.226171 -4.018409,0.0021 -0.117733,-0.09191 0.619646,-0.332544 1.226384,-0.420843 -1.729847,0.228236 -1.648777,-0.340806 -3.341446,0.063 0.417229,-0.292783 0.858211,-0.486423 1.303324,-0.735314 -1.410729,0.08572 -3.36778,0.821032 -2.763625,0.15233 -2.300955,1.026548 -6.387526,2.467743 -8.680735,4.617918 l -0.07229,-0.481776 c -1.050818,1.261498 -4.582289,3.767453 -4.863712,5.401255 l -0.280906,0.06558 c -0.546839,0.925856 -0.900553,1.975125 -1.334306,2.927832 -0.715176,1.218638 -1.048236,0.468866 -0.946511,0.659924 -1.406598,2.851924 -2.10525,5.248408 -2.708889,7.213721 0.430138,0.642884 0.01033,3.870211 0.172985,6.453106 -0.706398,12.756463 8.952863,25.142168 19.511129,28.001841 1.547568,0.553548 3.849039,0.532381 5.806607,0.589182 -2.309733,-0.660445 -2.608197,-0.350104 -4.858031,-1.134472 -1.622958,-0.764231 -1.978739,-1.636901 -3.128184,-2.634532 l 0.454924,0.803992 c -2.25448,-0.7978 -1.311068,-0.987308 -3.145223,-1.568227 l 0.485907,-0.634622 c -0.730667,-0.05525 -1.935364,-1.231548 -2.26481,-1.882693 l -0.799344,0.0315 c -0.960453,-1.185074 -1.472178,-2.039154 -1.434999,-2.700627 l -0.258186,0.460088 C 37.555113,72.462514 34.31436,68.520528 35.995668,69.438122 35.683263,69.152568 35.2681,68.973386 34.817823,68.155453 l 0.342355,-0.391411 c -0.809156,-1.041006 -1.489218,-2.375312 -1.437581,-2.819909 0.431688,0.582984 0.731184,0.691939 1.027581,0.791599 -2.043285,-5.069744 -2.15792,-0.279358 -3.705488,-5.160626 l 0.32738,-0.02634 c -0.250956,-0.377984 -0.403286,-0.7885 -0.605188,-1.191271 l 0.142519,-1.420024 c -1.471145,-1.70093 -0.411549,-7.232311 -0.19932,-10.265999 0.147166,-1.233613 1.227933,-2.546748 2.049998,-4.606041 l -0.500881,-0.08623 c 0.957354,-1.669948 5.466318,-6.706644 7.554528,-6.447425 1.011573,-1.270793 -0.200869,-0.0046 -0.39864,-0.324799 2.22195,-2.299406 2.920602,-1.624507 4.420148,-2.038121 1.617278,-0.959937 -1.388009,0.37437 -0.621196,-0.366108 2.79564,-0.714143 1.98132,-1.623475 5.628458,-1.985968 0.384698,0.218941 -0.892807,0.338223 -1.213475,0.622228 2.329356,-1.139634 7.371216,-0.880415 10.646049,0.632556 3.799984,1.775805 8.069351,7.025246 8.237688,11.964348 l 0.191575,0.05164 c -0.09708,1.963248 0.300528,4.233737 -0.388312,6.319365 l 0.468866,-0.987304"
+   id="path14"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 43.744352,57.084946 -0.130126,0.650629 c 0.609836,0.828261 1.093677,1.725716 1.872366,2.373247 -0.560264,-1.093677 -0.97646,-1.545502 -1.74224,-3.023876"
+   id="path16"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 45.186064,57.028145 c -0.322733,-0.356814 -0.513791,-0.786435 -0.727569,-1.214508 0.204483,0.752354 0.623261,1.398853 1.013123,2.056195 l -0.285554,-0.841687"
+   id="path18"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 70.696924,51.483338 -0.136323,0.341839 c -0.249924,1.775288 -0.789533,3.531987 -1.616762,5.160625 0.91398,-1.718487 1.505226,-3.598082 1.753085,-5.502464"
+   id="path20"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 50.53723,26.50176 c 0.627393,-0.229786 1.542405,-0.125995 2.208009,-0.277292 -0.867506,0.07281 -1.730881,0.116184 -2.583411,0.226171 l 0.375402,0.05112"
+   id="path22"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 28.511368,38.214118 c 0.144584,1.338437 -1.006926,1.857908 0.255088,0.975427 0.676447,-1.523815 -0.264383,-0.420843 -0.255088,-0.975427"
+   id="path24"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+			<path
+   ns2:knockout="Off"
+   d="m 27.028346,44.408521 c 0.290718,-0.892292 0.343388,-1.428286 0.454408,-1.944659 -0.803476,1.027065 -0.369723,1.246007 -0.454408,1.944659"
+   id="path26"
+   style="fill:#000000;fill-opacity:1;stroke-width:0.51637238"
+   inkscape:connector-curvature="0" />
+		</g>
+	</g>
+</svg>
\ No newline at end of file
diff --git a/ui/src/assets/icons/kubernetes.svg b/ui/src/assets/icons/kubernetes.svg
new file mode 100644
index 0000000..e244023
--- /dev/null
+++ b/ui/src/assets/icons/kubernetes.svg
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xml:space="preserve"
+   width="160"
+   height="160"
+   version="1.1"
+   style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision"
+   viewBox="0 0 1666.6667 1666.8369"
+   id="svg38"
+   sodipodi:docname="kubernetes.svg"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
+   id="metadata42"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="1673"
+   inkscape:window-height="931"
+   id="namedview40"
+   showgrid="false"
+   units="px"
+   inkscape:zoom="1.11"
+   inkscape:cx="-5.8558558"
+   inkscape:cy="95.225335"
+   inkscape:window-x="54"
+   inkscape:window-y="26"
+   inkscape:window-maximized="0"
+   inkscape:current-layer="layer1" />
+ <defs
+   id="defs4">
+  <style
+   type="text/css"
+   id="style2">
+   <![CDATA[
+    .fil0 {fill:#424B53;fill-rule:nonzero}
+    .fil2 {fill:#969C98;fill-rule:nonzero}
+    .fil1 {fill:#BFD43F;fill-rule:nonzero}
+   ]]>
+  </style>
+ </defs>
+
+<g
+   class="custom-icon"
+   transform="matrix(10.417731,0,0,10.417731,-3348.2599,-4287.0516)"
+   id="layer1"
+   inkscape:label="Layer 1"><path
+     inkscape:connector-curvature="0"
+     id="path3059"
+     d="m 402.68583,413.59883 c -2.48732,2.5e-4 -4.50412,2.24066 -4.50385,5.00427 4e-5,0.0425 0.01,0.0829 0.01,0.12498 -0.003,0.37553 -0.0216,0.82791 -0.01,1.15483 0.0593,1.59399 0.40679,2.81394 0.61591,4.28251 0.37888,3.14319 0.69635,5.7487 0.50043,8.17042 -0.19062,0.91322 -0.86313,1.74839 -1.46279,2.32891 l -0.10592,1.90548 c -2.70285,0.22389 -5.42381,0.63402 -8.14156,1.25107 -11.69445,2.65524 -21.7632,8.67911 -29.42894,16.81242 -0.49741,-0.33935 -1.36762,-0.96365 -1.6264,-1.15482 -0.80413,0.10868 -1.61682,0.3567 -2.67536,-0.25992 -2.01553,-1.35672 -3.85126,-3.2295 -6.0725,-5.48545 -1.01776,-1.07912 -1.75482,-2.10672 -2.96406,-3.1469 -0.2747,-0.2362 -0.69367,-0.55574 -1.00087,-0.79878 -0.94536,-0.75374 -2.06042,-1.14682 -3.13729,-1.18368 -1.3845,-0.0474 -2.71736,0.4939 -3.58957,1.58788 -1.55062,1.94485 -1.05417,4.91745 1.1067,6.64028 0.0216,0.0185 0.0453,0.0311 0.0674,0.048 0.29687,0.24082 0.66056,0.54913 0.93347,0.75065 1.28323,0.94742 2.45539,1.43242 3.73396,2.18454 2.69369,1.66351 4.92678,3.04288 6.69801,4.70595 0.6917,0.73727 0.81258,2.03647 0.90462,2.59836 l 1.44354,1.28957 c -7.72762,11.62948 -11.30404,25.99429 -9.19052,40.63081 l -1.88622,0.54854 c -0.49713,0.64195 -1.19961,1.6521 -1.93435,1.95358 -2.31739,0.72993 -4.92549,0.99797 -8.07418,1.32806 -1.47828,0.12291 -2.75379,0.0496 -4.32101,0.34645 -0.34491,0.0654 -0.82554,0.19064 -1.20294,0.27901 -0.0125,0.003 -0.0247,0.006 -0.0385,0.01 -0.0216,0.006 -0.0478,0.0155 -0.0674,0.0185 -2.6546,0.64143 -4.35993,3.0814 -3.81094,5.48546 0.54915,2.40459 3.14213,3.86693 5.81265,3.29126 0.0186,-0.003 0.0474,-0.006 0.0674,-0.01 0.0308,-0.006 0.0567,-0.0216 0.0865,-0.0278 0.37229,-0.0817 0.83881,-0.17276 1.16447,-0.25991 1.54079,-0.41256 2.65669,-1.01872 4.04191,-1.54942 2.98005,-1.06884 5.44825,-1.96173 7.85284,-2.30966 1.00431,-0.0785 2.06242,0.61966 2.58873,0.91427 l 1.96322,-0.33685 c 4.51777,14.00664 13.98554,25.32775 25.9741,32.4315 l -0.81803,1.96322 c 0.29502,0.76231 0.62008,1.79374 0.40044,2.54657 -0.87419,2.26691 -2.37156,4.65967 -4.07665,7.32723 -0.82557,1.23242 -1.6705,2.18882 -2.41551,3.59923 -0.1783,0.33748 -0.40532,0.8559 -0.57741,1.21258 -1.15754,2.4767 -0.30845,5.32921 1.91508,6.3997 2.23754,1.07716 5.01489,-0.0588 6.21685,-2.54063 10e-4,-0.003 0.01,-0.006 0.01,-0.01 10e-4,-0.003 -0.001,-0.006 0,-0.01 0.17122,-0.35186 0.41375,-0.81435 0.55817,-1.14522 0.63814,-1.46185 0.85047,-2.71462 1.29919,-4.1285 1.19167,-2.99338 1.84641,-6.13419 3.48685,-8.09124 0.44921,-0.53593 1.18157,-0.74202 1.94086,-0.94532 l 1.02009,-1.84774 c 10.45145,4.01167 22.15019,5.08819 33.83655,2.43478 2.66598,-0.60532 5.23968,-1.38871 7.72774,-2.3289 0.2867,0.50852 0.81954,1.4861 0.96236,1.73224 0.77161,0.25099 1.61384,0.38066 2.30005,1.39541 1.22733,2.09686 2.06666,4.57751 3.08916,7.57378 0.44882,1.41385 0.67063,2.66668 1.3088,4.12851 0.14537,0.3332 0.3868,0.8022 0.55818,1.15482 1.19945,2.4898 3.98561,3.62979 6.22648,2.55027 2.22329,-1.07103 3.07329,-3.92331 1.91508,-6.3997 -0.17214,-0.35664 -0.40876,-0.87509 -0.58702,-1.21257 -0.74511,-1.41034 -1.58989,-2.35724 -2.41554,-3.58959 -1.70522,-2.6675 -3.11947,-4.88346 -3.99378,-7.15034 -0.36557,-1.16918 0.0616,-1.8963 0.34644,-2.65612 -0.17059,-0.19554 -0.53546,-1.29959 -0.75064,-1.81883 12.45907,-7.35649 21.64881,-19.09978 25.96447,-32.66247 0.58277,0.0914 1.59566,0.27068 1.92472,0.33679 0.67734,-0.44674 1.30015,-1.02963 2.52137,-0.93346 2.40461,0.34777 4.87274,1.24096 7.85285,2.30966 1.38521,0.5306 2.50109,1.14655 4.04192,1.55902 0.32564,0.0871 0.79218,0.16845 1.16443,0.25006 0.0308,0.006 0.0563,0.0216 0.0866,0.0278 0.0216,0.003 0.048,0.006 0.0674,0.01 2.6707,0.57492 5.26414,-0.88651 5.81263,-3.29126 0.54841,-2.40421 -1.15614,-4.84475 -3.81094,-5.48546 -0.38614,-0.0878 -0.93378,-0.23682 -1.3088,-0.30795 -1.56722,-0.29686 -2.8427,-0.22358 -4.32098,-0.34646 -3.14871,-0.32994 -5.75676,-0.59825 -8.07422,-1.32804 -0.94487,-0.36657 -1.61707,-1.49092 -1.94395,-1.95361 l -1.81888,-0.52929 c 0.94304,-6.82258 0.68876,-13.92307 -0.94312,-21.02756 -1.64703,-7.17063 -4.55782,-13.72888 -8.43987,-19.50701 0.46655,-0.42413 1.34768,-1.20437 1.59751,-1.43393 0.073,-0.80813 0.01,-1.65541 0.84689,-2.55022 1.77113,-1.66317 4.00442,-3.04229 6.69801,-4.70597 1.27855,-0.75217 2.46041,-1.23705 3.74357,-2.18452 0.29008,-0.21435 0.68639,-0.5536 0.99124,-0.79879 2.16042,-1.72341 2.65784,-4.69582 1.1067,-6.64028 -1.55111,-1.94446 -4.55685,-2.1276 -6.71727,-0.40418 -0.30734,0.24358 -0.72478,0.56124 -1.00085,0.79876 -1.20918,1.04025 -1.95595,2.06773 -2.97367,3.14691 -2.22113,2.25607 -4.05704,4.13823 -6.0725,5.49508 -0.87337,0.50843 -2.15259,0.3325 -2.73311,0.29841 l -1.71301,1.22222 c -9.76795,-10.24277 -23.06727,-16.79141 -37.38759,-18.0635 -0.04,-0.60015 -0.0924,-1.68489 -0.10592,-2.01136 -0.58625,-0.56096 -1.29445,-1.0399 -1.47242,-2.25191 -0.19587,-2.42172 0.13126,-5.02725 0.51006,-8.17042 0.2091,-1.46857 0.5566,-2.68855 0.61593,-4.28251 0.0125,-0.36235 -0.01,-0.88815 -0.01,-1.27992 -3.3e-4,-2.76363 -2.0165,-5.00454 -4.50385,-5.00427 z m -5.63943,34.93365 -1.33765,23.62589 -0.0962,0.048 c -0.0897,2.11359 -1.82925,3.8013 -3.96493,3.8013 -0.87483,0 -1.68231,-0.28085 -2.33855,-0.76024 l -0.0385,0.0185 -19.37227,-13.73288 c 5.95388,-5.85455 13.56939,-10.1811 22.34598,-12.17382 1.60322,-0.36403 3.20572,-0.63412 4.80216,-0.82764 z m 11.28849,0 c 10.24674,1.26023 19.72298,5.90004 26.98456,13.01109 l -19.24719,13.64626 -0.0674,-0.0278 c -1.70835,1.24774 -4.11532,0.93814 -5.44696,-0.73139 -0.54547,-0.68398 -0.83167,-1.48817 -0.86612,-2.30006 l -0.0185,-0.01 z m -45.46185,21.8263 17.68817,15.82119 -0.0186,0.0962 c 1.59657,1.38792 1.832,3.79643 0.50044,5.4662 -0.54545,0.68396 -1.27559,1.14273 -2.05946,1.35691 l -0.0185,0.077 -22.67318,6.54403 c -1.154,-10.55214 1.33297,-20.80963 6.58253,-29.36156 z m 79.50048,0.01 c 2.62812,4.25979 4.61828,9.01757 5.80305,14.17554 1.17056,5.09613 1.46433,10.18315 0.98161,15.09944 l -22.78868,-6.56329 -0.0185,-0.096 c -2.04068,-0.55775 -3.29478,-2.63354 -2.81972,-4.71556 0.19461,-0.85294 0.6474,-1.57449 1.26069,-2.10758 l -0.01,-0.048 17.59192,-15.74421 z m -43.31578,17.03377 h 7.24656 l 4.50384,5.62978 -1.61677,7.02523 -6.50554,3.12767 -6.5248,-3.13729 -1.61676,-7.02522 z m 23.23136,19.26642 c 0.30795,-0.0155 0.61455,0.0125 0.91423,0.0674 l 0.0384,-0.048 23.45272,3.96493 c -3.43231,9.64301 -10.00017,17.99691 -18.77564,23.58741 l -9.10392,-21.9899 0.0278,-0.0384 c -0.83628,-1.94321 6.1e-4,-4.22195 1.92472,-5.14865 0.49264,-0.23713 1.00728,-0.36861 1.52053,-0.39455 z m -39.38937,0.096 c 1.78976,0.0247 3.39511,1.26729 3.81094,3.08916 0.19462,0.85291 0.0997,1.698 -0.22141,2.44438 l 0.0674,0.0865 -9.00769,21.76856 c -8.42167,-5.40418 -15.12958,-13.49585 -18.71788,-23.42383 l 23.2506,-3.94566 0.0385,0.048 c 0.26021,-0.0477 0.52383,-0.0708 0.7795,-0.0674 z m 19.64176,9.53699 c 0.62343,-0.0216 1.25603,0.10503 1.85733,0.39455 0.78825,0.37956 1.39714,0.97721 1.78039,1.69376 h 0.0865 l 11.46171,20.70997 c -1.48751,0.49864 -3.01676,0.92483 -4.58083,1.27995 -8.76578,1.99029 -17.50372,1.38722 -25.41592,-1.3088 L 399.1635,518.3999 h 0.0185 c 0.68603,-1.28244 1.98709,-2.04755 3.35864,-2.09794 z"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill-opacity:1;stroke:#ffffff;stroke-width:0.07698873;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
+     sodipodi:nodetypes="ccccccccsccccscssccsccccccccscccsccccccccccccccscccscsccsccccscscsccccccccscccscsccccsccccscscscccccccccccccccscccsccccccccccccscccccscccccccccccccccccccccccscccscccccccccscccscccc"
+     inkscape:export-filename="./path3059.png"
+     inkscape:export-xdpi="250.55"
+     inkscape:export-ydpi="250.55" /></g></svg>
\ No newline at end of file
diff --git a/ui/src/components/CheckBoxSelectPair.vue b/ui/src/components/CheckBoxSelectPair.vue
new file mode 100644
index 0000000..5c95252
--- /dev/null
+++ b/ui/src/components/CheckBoxSelectPair.vue
@@ -0,0 +1,116 @@
+// 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>
+    <a-checkbox v-decorator="[checkBoxDecorator, {}]" class="pair-checkbox" @change="handleCheckChange">
+      {{ checkBoxLabel }}
+    </a-checkbox>
+    <a-form-item class="pair-select-container" :label="selectLabel" v-if="this.checked">
+      <a-select
+        v-decorator="[selectDecorator, {
+          initialValue: this.getSelectInitialValue()
+        }]"
+        showSearch
+        optionFilterProp="children"
+        :filterOption="(input, option) => {
+          return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+        }"
+        @change="val => { this.handleSelectChange(val) }">
+        <a-select-option v-for="(opt) in selectOptions" :key="opt.name" :disabled="opt.enabled === false">
+          {{ opt.name || opt.description }}
+        </a-select-option>
+      </a-select>
+    </a-form-item>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'CheckBoxSelectPair',
+  props: {
+    resourceKey: {
+      type: String,
+      required: true
+    },
+    checkBoxLabel: {
+      type: String,
+      required: true
+    },
+    checkBoxDecorator: {
+      type: String,
+      default: ''
+    },
+    selectOptions: {
+      type: Array,
+      required: true
+    },
+    selectLabel: {
+      type: String,
+      default: ''
+    },
+    selectDecorator: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      checked: false,
+      selectedOption: ''
+    }
+  },
+  methods: {
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    getSelectInitialValue () {
+      if (this.arrayHasItems(this.selectOptions)) {
+        for (var i = 0; i < this.selectOptions.length; i++) {
+          if (this.selectOptions[i].enabled !== false) {
+            return this.selectOptions[i].name
+          }
+        }
+      }
+      return ''
+    },
+    handleCheckChange (e) {
+      this.checked = e.target.checked
+      if (this.checked && this.arrayHasItems(this.selectOptions)) {
+        this.selectedOption = this.selectOptions[0].name
+      }
+      this.$emit('handle-checkpair-change', this.resourceKey, this.checked, '')
+    },
+    handleSelectChange (val) {
+      this.$emit('handle-checkpair-change', this.resourceKey, this.checked, val)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .pair-checkbox {
+    width: 180px;
+  }
+  .pair-select-container {
+    position: relative;
+    float: right;
+    margin-bottom: -5px;
+    width: 20vw;
+  }
+</style>
diff --git a/ui/src/components/header/HeaderNotice.vue b/ui/src/components/header/HeaderNotice.vue
new file mode 100644
index 0000000..03a5acd
--- /dev/null
+++ b/ui/src/components/header/HeaderNotice.vue
@@ -0,0 +1,164 @@
+// 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>
+  <a-popover
+    v-model="visible"
+    trigger="click"
+    placement="bottom"
+    :autoAdjustOverflow="true"
+    :arrowPointAtCenter="true"
+    overlayClassName="header-notice-popover">
+    <template slot="content">
+      <a-spin :spinning="loading">
+        <a-list style="min-width: 200px; max-width: 300px">
+          <a-list-item>
+            <a-list-item-meta :title="$t('label.notifications')">
+              <a-avatar :style="{backgroundColor: '#6887d0', verticalAlign: 'middle'}" icon="notification" slot="avatar"/>
+              <a-button size="small" slot="description" @click="clearJobs">{{ $t('label.clear.list') }}</a-button>
+            </a-list-item-meta>
+          </a-list-item>
+          <a-list-item v-for="(job, index) in jobs" :key="index">
+            <a-list-item-meta :title="job.title" :description="job.description">
+              <a-avatar :style="notificationAvatar[job.status].style" :icon="notificationAvatar[job.status].icon" slot="avatar"/>
+            </a-list-item-meta>
+          </a-list-item>
+        </a-list>
+      </a-spin>
+    </template>
+    <span @click="showNotifications" class="header-notice-opener">
+      <a-badge :count="jobs.length">
+        <a-icon class="header-notice-icon" type="bell" />
+      </a-badge>
+    </span>
+  </a-popover>
+</template>
+
+<script>
+import { api } from '@/api'
+import store from '@/store'
+
+export default {
+  name: 'HeaderNotice',
+  data () {
+    return {
+      loading: false,
+      visible: false,
+      jobs: [],
+      poller: null,
+      notificationAvatar: {
+        done: { icon: 'check-circle', style: 'backgroundColor:#87d068' },
+        progress: { icon: 'loading', style: 'backgroundColor:#ffbf00' },
+        failed: { icon: 'close-circle', style: 'backgroundColor:#f56a00' }
+      }
+    }
+  },
+  methods: {
+    showNotifications () {
+      this.visible = !this.visible
+    },
+    clearJobs () {
+      this.jobs = this.jobs.filter(x => x.status === 'progress')
+      this.$store.commit('SET_ASYNC_JOB_IDS', this.jobs)
+    },
+    startPolling () {
+      this.poller = setInterval(() => {
+        this.pollJobs()
+      }, 4000)
+    },
+    async pollJobs () {
+      var hasUpdated = false
+      for (var i in this.jobs) {
+        if (this.jobs[i].status === 'progress') {
+          await api('queryAsyncJobResult', { jobid: this.jobs[i].jobid }).then(json => {
+            var result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 1 && this.jobs[i].status !== 'done') {
+              hasUpdated = true
+              const title = this.jobs[i].title
+              const description = this.jobs[i].description
+              this.$message.success({
+                content: title + (description ? ' - ' + description : ''),
+                key: this.jobs[i].jobid,
+                duration: 2
+              })
+              this.jobs[i].status = 'done'
+            } else if (result.jobstatus === 2 && this.jobs[i].status !== 'failed') {
+              hasUpdated = true
+              this.jobs[i].status = 'failed'
+              if (result.jobresult.errortext !== null) {
+                this.jobs[i].description = '(' + this.jobs[i].description + ') ' + result.jobresult.errortext
+              }
+              this.$notification.error({
+                message: this.jobs[i].title,
+                description: this.jobs[i].description,
+                key: this.jobs[i].jobid,
+                duration: 0
+              })
+            }
+          }).catch(function (e) {
+            console.log(this.$t('error.fetching.async.job.result') + e)
+          })
+        }
+      }
+      if (hasUpdated) {
+        this.$store.commit('SET_ASYNC_JOB_IDS', this.jobs.reverse())
+      }
+    }
+  },
+  beforeDestroy () {
+    clearInterval(this.poller)
+  },
+  created () {
+    this.startPolling()
+  },
+  mounted () {
+    this.jobs = (store.getters.asyncJobIds || []).reverse()
+    this.$store.watch(
+      (state, getters) => getters.asyncJobIds,
+      (newValue, oldValue) => {
+        if (oldValue !== newValue && newValue !== undefined) {
+          this.jobs = newValue.reverse()
+        }
+      }
+    )
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .header-notice {
+    display: inline-block;
+    transition: all 0.3s;
+
+    &-popover {
+      top: 50px !important;
+      width: 300px;
+      top: 50px;
+    }
+
+    &-opener {
+      display: inline-block;
+      transition: all 0.3s;
+      vertical-align: initial;
+    }
+
+    &-icon {
+      font-size: 18px;
+      padding: 4px;
+    }
+  }
+</style>
diff --git a/ui/src/components/header/Logo.vue b/ui/src/components/header/Logo.vue
new file mode 100644
index 0000000..ca67959
--- /dev/null
+++ b/ui/src/components/header/Logo.vue
@@ -0,0 +1,71 @@
+// 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="logo">
+    <img
+      v-if="$config.logo"
+      :style="{
+        width: $config.theme['@logo-width'],
+        height: $config.theme['@logo-height']
+      }"
+      :src="$config.logo"
+      class="logo-image" />
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'Logo',
+  components: {
+  },
+  props: {
+    title: {
+      type: String,
+      default: 'CloudStack',
+      required: false
+    },
+    showTitle: {
+      type: Boolean,
+      default: true,
+      required: false
+    }
+  }
+}
+</script>
+
+<style type="less" scoped>
+.logo {
+  height: 64px;
+  position: relative;
+  line-height: 64px;
+  -webkit-transition: all .3s;
+  transition: all .3s;
+  overflow: hidden;
+}
+
+.sider.light .logo {
+  box-shadow: 1px 1px 0px 0px #e8e8e8;
+}
+
+.logo-image {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+</style>
diff --git a/ui/src/components/header/ProjectMenu.vue b/ui/src/components/header/ProjectMenu.vue
new file mode 100644
index 0000000..01ff138
--- /dev/null
+++ b/ui/src/components/header/ProjectMenu.vue
@@ -0,0 +1,122 @@
+// 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>
+  <span class="header-notice-opener">
+    <a-select
+      class="project-select"
+      :defaultValue="$t('label.default.view')"
+      :loading="loading"
+      :value="($store.getters.project && 'id' in $store.getters.project) ? ($store.getters.project.displaytext || $store.getters.project.name) : $t('label.default.view')"
+      :disabled="isDisabled()"
+      :filterOption="filterProject"
+      @change="changeProject"
+      @focus="fetchData"
+      showSearch>
+
+      <a-tooltip placement="bottom" slot="suffixIcon">
+        <template slot="title">
+          <span>{{ $t('label.projects') }}</span>
+        </template>
+        <span style="font-size: 20px; color: #999; margin-top: -5px">
+          <a-icon v-if="!loading" type="project" />
+          <a-icon v-else type="loading" />
+        </span>
+      </a-tooltip>
+
+      <a-select-option v-for="(project, index) in projects" :key="index">
+        {{ project.displaytext || project.name }}
+      </a-select-option>
+    </a-select>
+  </span>
+</template>
+
+<script>
+import store from '@/store'
+import { api } from '@/api'
+import _ from 'lodash'
+
+export default {
+  name: 'ProjectMenu',
+  data () {
+    return {
+      projects: [],
+      loading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.isDisabled()) {
+        return
+      }
+      var page = 1
+      const projects = []
+      const getNextPage = () => {
+        this.loading = true
+        api('listProjects', { listAll: true, details: 'min', page: page, pageSize: 500 }).then(json => {
+          if (json && json.listprojectsresponse && json.listprojectsresponse.project) {
+            projects.push(...json.listprojectsresponse.project)
+          }
+          if (projects.length < json.listprojectsresponse.count) {
+            page++
+            getNextPage()
+          }
+        }).finally(() => {
+          this.projects = _.orderBy(projects, ['displaytext'], ['asc'])
+          this.projects.unshift({ name: this.$t('label.default.view') })
+          this.loading = false
+        })
+      }
+      getNextPage()
+    },
+    isDisabled () {
+      return !Object.prototype.hasOwnProperty.call(store.getters.apis, 'listProjects')
+    },
+    changeProject (index) {
+      const project = this.projects[index]
+      this.$store.dispatch('ProjectView', project.id)
+      this.$store.dispatch('SetProject', project)
+      this.$store.dispatch('ToggleTheme', project.id === undefined ? 'light' : 'dark')
+      this.$message.success(`${this.$t('message.switch.to')} "${project.displaytext || project.name}"`)
+      if (this.$route.name !== 'dashboard') {
+        this.$router.push({ name: 'dashboard' })
+      }
+    },
+    filterProject (input, option) {
+      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.project {
+  &-select {
+    width: 30vw;
+  }
+
+  &-icon {
+    font-size: 20px;
+    line-height: 1;
+    padding-top: 5px;
+    padding-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/components/header/SamlDomainSwitcher.vue b/ui/src/components/header/SamlDomainSwitcher.vue
new file mode 100644
index 0000000..edce64a
--- /dev/null
+++ b/ui/src/components/header/SamlDomainSwitcher.vue
@@ -0,0 +1,124 @@
+// 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>
+  <span class="header-notice-opener" v-if="showSwitcher">
+    <a-select
+      class="domain-select"
+      :loading="loading"
+      :defaultValue="currentAccount"
+      :value="currentAccount"
+      @change="changeAccount"
+      @focus="fetchData" >
+
+      <a-tooltip placement="bottom" slot="suffixIcon">
+        <template slot="title">
+          <span>{{ $t('label.domain') }}</span>
+        </template>
+        <span style="font-size: 20px; color: #999; margin-top: -5px">
+          <a-icon v-if="!loading" type="block" />
+          <a-icon v-else type="loading" />
+        </span>
+      </a-tooltip>
+
+      <a-select-option v-for="(account, index) in samlAccounts" :key="index">
+        {{ `${account.accountName} (${account.domainName})` }}
+      </a-select-option>
+    </a-select>
+  </span>
+</template>
+
+<script>
+import store from '@/store'
+import { api } from '@/api'
+import _ from 'lodash'
+
+export default {
+  name: 'SamlDomainSwitcher',
+  data () {
+    return {
+      showSwitcher: false,
+      samlAccounts: [],
+      currentAccount: '',
+      loading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      var page = 1
+      const samlAccounts = []
+      const getNextPage = () => {
+        this.loading = true
+        api('listAndSwitchSamlAccount', { listAll: true, details: 'min', page: page, pageSize: 500 }).then(json => {
+          if (json && json.listandswitchsamlaccountresponse && json.listandswitchsamlaccountresponse.samluseraccount) {
+            samlAccounts.push(...json.listandswitchsamlaccountresponse.samluseraccount)
+          }
+          if (samlAccounts.length < json.listandswitchsamlaccountresponse.count) {
+            page++
+            getNextPage()
+          }
+        }).catch(error => {
+          console.log(error)
+        }).finally(() => {
+          if (samlAccounts.length < 2) {
+            this.showSwitcher = false
+            return
+          }
+          this.samlAccounts = _.orderBy(samlAccounts, ['domainPath'], ['asc'])
+          const currentAccount = this.samlAccounts.filter(x => {
+            return x.userId === store.getters.userInfo.id
+          })[0]
+          this.currentAccount = `${currentAccount.accountName} (${currentAccount.domainName})`
+          this.loading = false
+          this.showSwitcher = true
+        })
+      }
+      getNextPage()
+    },
+    changeAccount (index) {
+      const account = this.samlAccounts[index]
+      api('listAndSwitchSamlAccount', {}, 'POST', {
+        userid: account.userId,
+        domainid: account.domainId
+      }).then(response => {
+        store.dispatch('GetInfo').then(() => {
+          this.$message.success(`Switched to "${account.accountName} (${account.domainPath})"`)
+          this.$router.go()
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.domain {
+  &-select {
+    width: 20vw;
+  }
+
+  &-icon {
+    font-size: 20px;
+    line-height: 1;
+    padding-top: 5px;
+    padding-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/components/header/TranslationMenu.vue b/ui/src/components/header/TranslationMenu.vue
new file mode 100644
index 0000000..3240e4f
--- /dev/null
+++ b/ui/src/components/header/TranslationMenu.vue
@@ -0,0 +1,94 @@
+// 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>
+  <a-dropdown>
+    <span class="action ant-dropdown-link translation-menu">
+      <font-awesome-icon :icon="['fas', 'language']" size="lg" />
+    </span>
+    <a-menu
+      slot="overlay"
+      :selectedKeys="[language]"
+      @click="onClick">
+      <a-menu-item key="en" value="enUS">English</a-menu-item>
+      <a-menu-item key="hi" value="hi">हिन्दी</a-menu-item>
+      <a-menu-item key="ja_JP" value="jpJP">日本語</a-menu-item>
+      <a-menu-item key="ko_KR" value="koKR">한국어</a-menu-item>
+      <a-menu-item key="zh_CN" value="zhCN">简体中文</a-menu-item>
+      <a-menu-item key="ar" value="arEG">Arabic</a-menu-item>
+      <a-menu-item key="ca" value="caES">Catalan</a-menu-item>
+      <a-menu-item key="de_DE" value="deDE">Deutsch</a-menu-item>
+      <a-menu-item key="es" value="esES">Español</a-menu-item>
+      <a-menu-item key="fr_FR" value="frFR">Français</a-menu-item>
+      <a-menu-item key="it_IT" value="itIT">Italiano</a-menu-item>
+      <a-menu-item key="hu" value="huHU">Magyar</a-menu-item>
+      <a-menu-item key="nl_NL" value="nlNL">Nederlands</a-menu-item>
+      <a-menu-item key="nb_NO" value="nbNO">Norsk</a-menu-item>
+      <a-menu-item key="pl" value="plPL">Polish</a-menu-item>
+      <a-menu-item key="pt_BR" value="ptBR">Português brasileiro</a-menu-item>
+      <a-menu-item key="ru_RU" value="ruRU">Русский</a-menu-item>
+    </a-menu>
+  </a-dropdown>
+</template>
+
+<script>
+import Vue from 'vue'
+import moment from 'moment'
+import 'moment/locale/zh-cn'
+import { loadLanguageAsync } from '@/locales'
+
+moment.locale('en')
+
+export default {
+  name: 'TranslationMenu',
+  data () {
+    return {
+      language: 'en'
+    }
+  },
+  mounted () {
+    this.language = Vue.ls.get('LOCALE') || 'en'
+    this.setLocale(this.language)
+  },
+  methods: {
+    moment,
+    onClick (e) {
+      let localeValue = e.key
+      if (!localeValue) {
+        localeValue = 'en'
+      }
+      this.setLocale(localeValue)
+    },
+    setLocale (localeValue) {
+      this.$locale = localeValue
+      this.$i18n.locale = localeValue
+      this.language = localeValue
+      moment.locale(localeValue)
+      Vue.ls.set('LOCALE', localeValue)
+      loadLanguageAsync(localeValue)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.translation-menu {
+  font-size: 18px;
+  line-height: 1;
+}
+
+</style>
diff --git a/ui/src/components/header/UserMenu.vue b/ui/src/components/header/UserMenu.vue
new file mode 100644
index 0000000..33335c6
--- /dev/null
+++ b/ui/src/components/header/UserMenu.vue
@@ -0,0 +1,112 @@
+// 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="user-menu">
+
+    <translation-menu class="action"/>
+    <header-notice class="action"/>
+    <a-dropdown>
+      <span class="user-menu-dropdown action">
+        <a-avatar class="user-menu-avatar avatar" size="small" :src="avatar()"/>
+        <span>{{ nickname() }}</span>
+      </span>
+      <a-menu slot="overlay" class="user-menu-wrapper">
+        <a-menu-item class="user-menu-item" key="0">
+          <router-link :to="{ path: '/accountuser/' + $store.getters.userInfo.id }">
+            <a-icon class="user-menu-item-icon" type="user"/>
+            <span class="user-menu-item-name">{{ $t('label.profilename') }}</span>
+          </router-link>
+        </a-menu-item>
+        <a-menu-item class="user-menu-item" key="1">
+          <a @click="toggleUseBrowserTimezone">
+            <a-icon class="user-menu-item-icon" type="clock-circle"/>
+            <span class="user-menu-item-name" style="margin-right: 5px">{{ $t('label.use.local.timezone') }}</span>
+            <a-switch
+              :checked="$store.getters.usebrowsertimezone" />
+          </a>
+        </a-menu-item>
+        <a-menu-item class="user-menu-item" key="2" disabled>
+          <a :href="$config.docBase" target="_blank">
+            <a-icon class="user-menu-item-icon" type="question-circle-o"></a-icon>
+            <span class="user-menu-item-name">{{ $t('label.help') }}</span>
+          </a>
+        </a-menu-item>
+        <a-menu-divider/>
+        <a-menu-item class="user-menu-item" key="3">
+          <a href="javascript:;" @click="handleLogout">
+            <a-icon class="user-menu-item-icon" type="logout"/>
+            <span class="user-menu-item-name">{{ $t('label.logout') }}</span>
+          </a>
+        </a-menu-item>
+      </a-menu>
+    </a-dropdown>
+  </div>
+</template>
+
+<script>
+import HeaderNotice from './HeaderNotice'
+import TranslationMenu from './TranslationMenu'
+import { mapActions, mapGetters } from 'vuex'
+
+export default {
+  name: 'UserMenu',
+  components: {
+    TranslationMenu,
+    HeaderNotice
+  },
+  methods: {
+    ...mapActions(['Logout']),
+    ...mapGetters(['nickname', 'avatar']),
+    toggleUseBrowserTimezone () {
+      this.$store.dispatch('SetUseBrowserTimezone', !this.$store.getters.usebrowsertimezone)
+    },
+    handleLogout () {
+      return this.Logout({}).then(() => {
+        this.$router.push('/user/login')
+      }).catch(err => {
+        this.$message.error({
+          title: 'Failed to Logout',
+          description: err.message
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.user-menu {
+  &-wrapper {
+    padding: 4px 0;
+  }
+
+  &-item {
+    width: auto;
+  }
+
+  &-item-name {
+    user-select: none;
+    margin-left: 8px;
+  }
+
+  &-item-icon i {
+    min-width: 12px;
+    margin-right: 8px;
+  }
+}
+</style>
diff --git a/ui/src/components/menu/SideMenu.vue b/ui/src/components/menu/SideMenu.vue
new file mode 100644
index 0000000..c670c9f
--- /dev/null
+++ b/ui/src/components/menu/SideMenu.vue
@@ -0,0 +1,128 @@
+// 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>
+  <a-layout-sider
+    :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
+    width="256px"
+    :collapsible="collapsible"
+    v-model="collapsed"
+    :trigger="null">
+    <logo />
+    <s-menu
+      :collapsed="collapsed"
+      :menu="menus"
+      :theme="theme"
+      :mode="mode"
+      @select="onSelect"></s-menu>
+  </a-layout-sider>
+
+</template>
+
+<script>
+import ALayoutSider from 'ant-design-vue/es/layout/Sider'
+import Logo from '../header/Logo'
+import SMenu from './index'
+import { mixin, mixinDevice } from '@/utils/mixin.js'
+
+export default {
+  name: 'SideMenu',
+  components: { ALayoutSider, Logo, SMenu },
+  mixins: [mixin, mixinDevice],
+  props: {
+    mode: {
+      type: String,
+      required: false,
+      default: 'inline'
+    },
+    theme: {
+      type: String,
+      required: false,
+      default: 'dark'
+    },
+    collapsible: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    collapsed: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    menus: {
+      type: Array,
+      required: true
+    }
+  },
+  methods: {
+    onSelect (obj) {
+      this.$emit('menuSelect', obj)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.sider {
+  box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
+  position: relative;
+  z-index: 10;
+  height: auto;
+
+  /deep/ .ant-layout-sider-children {
+    overflow-y: hidden;
+    &:hover {
+      overflow-y: auto;
+    }
+  }
+
+  /deep/ .ant-menu-vertical .ant-menu-item {
+    margin-top: 0px;
+    margin-bottom: 0px;
+  }
+
+  /deep/ .ant-menu-inline .ant-menu-item:not(:last-child) {
+    margin-bottom: 0px;
+  }
+
+  /deep/ .ant-menu-inline .ant-menu-item {
+    margin-top: 0px;
+  }
+
+  &.ant-fixed-sidemenu {
+    position: fixed;
+    height: 100%;
+  }
+
+  &.light {
+    box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05);
+
+    .ant-menu-light {
+      border-right-color: transparent;
+      padding: 14px 0;
+    }
+  }
+
+  &.dark {
+    .ant-menu-dark {
+      border-right-color: transparent;
+      padding: 14px 0;
+    }
+  }
+}
+</style>
diff --git a/ui/src/components/menu/index.js b/ui/src/components/menu/index.js
new file mode 100644
index 0000000..3f22f13
--- /dev/null
+++ b/ui/src/components/menu/index.js
@@ -0,0 +1,19 @@
+// 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 SMenu from './menu'
+export default SMenu
diff --git a/ui/src/components/menu/menu.js b/ui/src/components/menu/menu.js
new file mode 100644
index 0000000..7cb1a01
--- /dev/null
+++ b/ui/src/components/menu/menu.js
@@ -0,0 +1,207 @@
+// 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 Menu from 'ant-design-vue/es/menu'
+import Icon from 'ant-design-vue/es/icon'
+
+const { Item, SubMenu } = Menu
+
+export default {
+  name: 'SMenu',
+  props: {
+    menu: {
+      type: Array,
+      required: true
+    },
+    theme: {
+      type: String,
+      required: false,
+      default: 'dark'
+    },
+    mode: {
+      type: String,
+      required: false,
+      default: 'inline'
+    },
+    collapsed: {
+      type: Boolean,
+      required: false,
+      default: false
+    }
+  },
+  data () {
+    return {
+      openKeys: [],
+      selectedKeys: [],
+      cachedOpenKeys: [],
+      cachedPath: null
+    }
+  },
+  computed: {
+    rootSubmenuKeys: vm => {
+      const keys = []
+      vm.menu.forEach(item => keys.push(item.path))
+      return keys
+    }
+  },
+  created () {
+    this.updateMenu()
+  },
+  watch: {
+    collapsed (val) {
+      if (val) {
+        this.cachedOpenKeys = this.openKeys.concat()
+        this.openKeys = []
+      } else {
+        this.openKeys = this.cachedOpenKeys
+      }
+    },
+    $route: function () {
+      this.updateMenu()
+    }
+  },
+  methods: {
+    // select menu item
+    onOpenChange (openKeys) {
+      if (this.mode === 'horizontal') {
+        this.openKeys = openKeys
+        return
+      }
+      const latestOpenKey = openKeys.find(key => !this.openKeys.includes(key))
+      if (!this.rootSubmenuKeys.includes(latestOpenKey)) {
+        this.openKeys = openKeys
+      } else {
+        this.openKeys = latestOpenKey ? [latestOpenKey] : []
+      }
+    },
+    updateMenu () {
+      const routes = this.$route.matched.concat()
+
+      if (routes.length >= 4 && this.$route.meta.hidden) {
+        routes.pop()
+        this.selectedKeys = [routes[2].path]
+      } else {
+        this.selectedKeys = [routes.pop().path]
+      }
+
+      const openKeys = []
+      if (this.mode === 'inline') {
+        routes.forEach(item => {
+          openKeys.push(item.path)
+        })
+      }
+
+      this.cachedPath = this.selectedKeys[0]
+      this.collapsed ? (this.cachedOpenKeys = openKeys) : (this.openKeys = openKeys)
+    },
+
+    // render
+    renderItem (menu) {
+      if (!menu.hidden) {
+        return menu.children && !menu.hideChildrenInMenu ? this.renderSubMenu(menu) : this.renderMenuItem(menu)
+      }
+      return null
+    },
+    renderMenuItem (menu) {
+      const target = menu.meta.target || null
+      const props = {
+        to: { name: menu.name },
+        target: target
+      }
+      return (
+        <Item {...{ key: menu.path }}>
+          <router-link {...{ props }}>
+            {this.renderIcon(menu.meta.icon, menu)}
+            <span>{this.$t(menu.meta.title)}</span>
+          </router-link>
+        </Item>
+      )
+    },
+    renderSubMenu (menu) {
+      const itemArr = []
+      const on = {
+        click: () => {
+          this.handleClickParentMenu(menu)
+        }
+      }
+      if (!menu.hideChildrenInMenu) {
+        menu.children.forEach(item => itemArr.push(this.renderItem(item)))
+      }
+      return (
+        <SubMenu {...{ key: menu.path }}>
+          <span slot="title">
+            {this.renderIcon(menu.meta.icon, menu)}
+            <span {...{ on: on }}>{this.$t(menu.meta.title)}</span>
+          </span>
+          {itemArr}
+        </SubMenu>
+      )
+    },
+    renderIcon (icon, menuItem) {
+      if (icon === 'none' || icon === undefined) {
+        return null
+      }
+      const props = {}
+      const on = {
+        click: () => {
+          this.handleClickParentMenu(menuItem)
+        }
+      }
+      typeof (icon) === 'object' ? props.component = icon : props.type = icon
+      return (
+        <Icon {... { props, on } } />
+      )
+    },
+    handleClickParentMenu (menuItem) {
+      if (this.cachedPath === menuItem.redirect) {
+        return
+      }
+      if (menuItem.redirect) {
+        this.cachedPath = menuItem.redirect
+        setTimeout(() => this.$router.push({ path: menuItem.path }))
+      }
+    }
+  },
+  render () {
+    const { mode, theme, menu } = this
+    const props = {
+      mode: mode,
+      theme: theme,
+      openKeys: this.openKeys
+    }
+    const on = {
+      select: obj => {
+        this.selectedKeys = obj.selectedKeys
+        this.$emit('select', obj)
+      },
+      openChange: this.onOpenChange
+    }
+
+    const menuTree = menu.map(item => {
+      if (item.hidden) {
+        return null
+      }
+      return this.renderItem(item)
+    })
+    // {...{ props, on: on }}
+    return (
+      <Menu vModel={this.selectedKeys} {...{ props, on: on }}>
+        {menuTree}
+      </Menu>
+    )
+  }
+}
diff --git a/ui/src/components/menu/menu.render.js b/ui/src/components/menu/menu.render.js
new file mode 100644
index 0000000..841987a
--- /dev/null
+++ b/ui/src/components/menu/menu.render.js
@@ -0,0 +1,173 @@
+// 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 Menu from 'ant-design-vue/es/menu'
+import Icon from 'ant-design-vue/es/icon'
+
+const { Item, SubMenu } = Menu
+
+export default {
+  name: 'SMenu',
+  props: {
+    menu: {
+      type: Array,
+      required: true
+    },
+    theme: {
+      type: String,
+      required: false,
+      default: 'dark'
+    },
+    mode: {
+      type: String,
+      required: false,
+      default: 'inline'
+    },
+    collapsed: {
+      type: Boolean,
+      required: false,
+      default: false
+    }
+  },
+  data () {
+    return {
+      openKeys: [],
+      selectedKeys: [],
+      cachedOpenKeys: []
+    }
+  },
+  computed: {
+    rootSubmenuKeys: vm => {
+      const keys = []
+      vm.menu.forEach(item => keys.push(item.path))
+      return keys
+    }
+  },
+  created () {
+    this.updateMenu()
+  },
+  watch: {
+    collapsed (val) {
+      if (val) {
+        this.cachedOpenKeys = this.openKeys.concat()
+        this.openKeys = []
+      } else {
+        this.openKeys = this.cachedOpenKeys
+      }
+    },
+    $route: function () {
+      this.updateMenu()
+    }
+  },
+  methods: {
+    renderIcon: function (h, icon) {
+      if (icon === 'none' || icon === undefined) {
+        return null
+      }
+      const props = {}
+      typeof (icon) === 'object' ? props.component = icon : props.type = icon
+      return h(Icon, { props: { ...props } })
+    },
+    renderMenuItem: function (h, menu, pIndex, index) {
+      const target = menu.meta.target || null
+      return h(Item, { key: menu.path ? menu.path : 'item_' + pIndex + '_' + index }, [
+        h('router-link', { attrs: { to: { name: menu.name }, target: target } }, [
+          this.renderIcon(h, menu.meta.icon),
+          h('span', [menu.meta.title])
+        ])
+      ])
+    },
+    renderSubMenu: function (h, menu, pIndex, index) {
+      const this2_ = this
+      const subItem = [h('span', { slot: 'title' }, [this.renderIcon(h, menu.meta.icon), h('span', [menu.meta.title])])]
+      const itemArr = []
+      const pIndex_ = pIndex + '_' + index
+      console.log('menu', menu)
+      if (!menu.hideChildrenInMenu) {
+        menu.children.forEach(function (item, i) {
+          itemArr.push(this2_.renderItem(h, item, pIndex_, i))
+        })
+      }
+      return h(SubMenu, { key: menu.path ? menu.path : 'submenu_' + pIndex + '_' + index }, subItem.concat(itemArr))
+    },
+    renderItem: function (h, menu, pIndex, index) {
+      if (!menu.hidden) {
+        return menu.children && !menu.hideChildrenInMenu
+          ? this.renderSubMenu(h, menu, pIndex, index)
+          : this.renderMenuItem(h, menu, pIndex, index)
+      }
+    },
+    renderMenu: function (h, menuTree) {
+      const this2_ = this
+      const menuArr = []
+      menuTree.forEach(function (menu, i) {
+        if (!menu.hidden) {
+          menuArr.push(this2_.renderItem(h, menu, '0', i))
+        }
+      })
+      return menuArr
+    },
+    onOpenChange (openKeys) {
+      const latestOpenKey = openKeys.find(key => !this.openKeys.includes(key))
+      if (!this.rootSubmenuKeys.includes(latestOpenKey)) {
+        this.openKeys = openKeys
+      } else {
+        this.openKeys = latestOpenKey ? [latestOpenKey] : []
+      }
+    },
+    updateMenu () {
+      const routes = this.$route.matched.concat()
+
+      if (routes.length >= 4 && this.$route.meta.hidden) {
+        routes.pop()
+        this.selectedKeys = [routes[2].path]
+      } else {
+        this.selectedKeys = [routes.pop().path]
+      }
+
+      const openKeys = []
+      if (this.mode === 'inline') {
+        routes.forEach(item => {
+          openKeys.push(item.path)
+        })
+      }
+
+      this.collapsed ? (this.cachedOpenKeys = openKeys) : (this.openKeys = openKeys)
+    }
+  },
+  render (h) {
+    return h(
+      Menu,
+      {
+        props: {
+          theme: this.$props.theme,
+          mode: this.$props.mode,
+          openKeys: this.openKeys,
+          selectedKeys: this.selectedKeys
+        },
+        on: {
+          openChange: this.onOpenChange,
+          select: obj => {
+            this.selectedKeys = obj.selectedKeys
+            this.$emit('select', obj)
+          }
+        }
+      },
+      this.renderMenu(h, this.menu)
+    )
+  }
+}
diff --git a/ui/src/components/multitab/MultiTab.vue b/ui/src/components/multitab/MultiTab.vue
new file mode 100644
index 0000000..bb3d2a0
--- /dev/null
+++ b/ui/src/components/multitab/MultiTab.vue
@@ -0,0 +1,204 @@
+// 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 style="margin: -23px -24px 24px -24px">
+    &lt;!&ndash;<a-dropdown :trigger="['contextmenu']" overlayClassName="multi-tab-menu-wrapper">
+      <a-menu slot="overlay">
+        <a-menu-item key="1">1st menu item</a-menu-item>
+        <a-menu-item key="2">2nd menu item</a-menu-item>
+        <a-menu-item key="3">3rd menu item</a-menu-item>
+      </a-menu>
+    </a-dropdown>&ndash;&gt;
+    <a-tabs
+      hideAdd
+      v-model="activeKey"
+      type="editable-card"
+      :tabBarStyle="{ background: '#FFF', margin: 0, paddingLeft: '16px', paddingTop: '1px' }"
+      @edit="onEdit"
+    >
+      <a-tab-pane v-for="page in pages" :style="{ height: 0 }" :tab="page.meta.title" :key="page.fullPath" :closable="pages.length > 1">
+      </a-tab-pane>
+      <template slot="renderTabBar" slot-scope="props, DefaultTabBar">
+        <component :is="DefaultTabBar" {...props} />
+      </template>
+    </a-tabs>
+  </div>
+</template>
+-->
+
+<script>
+export default {
+  name: 'MultiTab',
+  data () {
+    return {
+      fullPathList: [],
+      pages: [],
+      activeKey: '',
+      newTabIndex: 0
+    }
+  },
+  created () {
+    this.pages.push(this.$route)
+    this.fullPathList.push(this.$route.fullPath)
+    this.selectedLastPath()
+  },
+  methods: {
+    onEdit (targetKey, action) {
+      this[action](targetKey)
+    },
+    remove (targetKey) {
+      this.pages = this.pages.filter(page => page.fullPath !== targetKey)
+      this.fullPathList = this.fullPathList.filter(path => path !== targetKey)
+      // 判断当前标签是否关闭,若关闭则跳转到最后一个还存在的标签页
+      if (!this.fullPathList.includes(this.activeKey)) {
+        this.selectedLastPath()
+      }
+    },
+    selectedLastPath () {
+      this.activeKey = this.fullPathList[this.fullPathList.length - 1]
+    },
+
+    // content menu
+    closeThat (e) {
+      this.remove(e)
+    },
+    closeLeft (e) {
+      const currentIndex = this.fullPathList.indexOf(e)
+      if (currentIndex > 0) {
+        this.fullPathList.forEach((item, index) => {
+          if (index < currentIndex) {
+            this.remove(item)
+          }
+        })
+      } else {
+        this.$message.info('左侧没有标签')
+      }
+    },
+    closeRight (e) {
+      const currentIndex = this.fullPathList.indexOf(e)
+      if (currentIndex < (this.fullPathList.length - 1)) {
+        this.fullPathList.forEach((item, index) => {
+          if (index > currentIndex) {
+            this.remove(item)
+          }
+        })
+      } else {
+        this.$message.info('右侧没有标签')
+      }
+    },
+    closeAll (e) {
+      const currentIndex = this.fullPathList.indexOf(e)
+      this.fullPathList.forEach((item, index) => {
+        if (index !== currentIndex) {
+          this.remove(item)
+        }
+      })
+    },
+    closeMenuClick ({ key, item, domEvent }) {
+      const vkey = domEvent.target.getAttribute('data-vkey')
+      switch (key) {
+        case 'close-right':
+          this.closeRight(vkey)
+          break
+        case 'close-left':
+          this.closeLeft(vkey)
+          break
+        case 'close-all':
+          this.closeAll(vkey)
+          break
+        default:
+        case 'close-that':
+          this.closeThat(vkey)
+          break
+      }
+    },
+    renderTabPaneMenu (e) {
+      return (
+        <a-menu {...{ on: { click: this.closeMenuClick } }}>
+          <a-menu-item key="close-that" data-vkey={e}>关闭当前标签</a-menu-item>
+          <a-menu-item key="close-right" data-vkey={e}>关闭右侧</a-menu-item>
+          <a-menu-item key="close-left" data-vkey={e}>关闭左侧</a-menu-item>
+          <a-menu-item key="close-all" data-vkey={e}>关闭全部</a-menu-item>
+        </a-menu>
+      )
+    },
+    // render
+    renderTabPane (title, keyPath) {
+      const menu = this.renderTabPaneMenu(keyPath)
+
+      return (
+        <a-dropdown overlay={menu} trigger={['contextmenu']}>
+          <span style={{ userSelect: 'none' }}>{ title }</span>
+        </a-dropdown>
+      )
+    }
+  },
+  watch: {
+    $route: function (newVal) {
+      this.activeKey = newVal.fullPath
+      if (this.fullPathList.indexOf(newVal.fullPath) < 0) {
+        this.fullPathList.push(newVal.fullPath)
+        this.pages.push(newVal)
+      }
+    },
+    activeKey: function (newPathKey) {
+      this.$router.push({ path: newPathKey })
+    }
+  },
+  render () {
+    const { onEdit, $data: { pages } } = this
+    const panes = pages.map(page => {
+      return (
+        <a-tab-pane
+          style={{ height: 0 }}
+          tab={this.renderTabPane(page.meta.title, page.fullPath)}
+          key={page.fullPath} closable={pages.length > 1}
+        >
+        </a-tab-pane>)
+    })
+
+    return (
+      <div class="multi-tab">
+        <div class="multi-tab-wrapper">
+          <a-tabs
+            hideAdd
+            type={'editable-card'}
+            v-model={this.activeKey}
+            tabBarStyle={{ background: '#FFF', margin: 0, paddingLeft: '16px', paddingTop: '1px' }}
+            {...{ on: { edit: onEdit } }}>
+            {panes}
+          </a-tabs>
+        </div>
+      </div>
+    )
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .multi-tab {
+    margin: -23px -24px 24px -24px;
+    background: #fff;
+  }
+
+  .topmenu .multi-tab-wrapper {
+    max-width: 1200px;
+    margin: 0 auto;
+  }
+</style>
diff --git a/ui/src/components/multitab/index.js b/ui/src/components/multitab/index.js
new file mode 100644
index 0000000..54e558b
--- /dev/null
+++ b/ui/src/components/multitab/index.js
@@ -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.
+
+import MultiTab from './MultiTab'
+import './index.less'
+
+export default MultiTab
diff --git a/ui/src/components/multitab/index.less b/ui/src/components/multitab/index.less
new file mode 100644
index 0000000..917d40d
--- /dev/null
+++ b/ui/src/components/multitab/index.less
@@ -0,0 +1,31 @@
+// 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 '../../style/variables/prefixes';
+
+@multi-tab-prefix-cls: ~"@{ant-pro-prefix}-multi-tab";
+@multi-tab-wrapper-prefix-cls: ~"@{ant-pro-prefix}-multi-tab-wrapper";
+
+.@{multi-tab-prefix-cls} {
+  margin: -23px -24px 24px -24px;
+  background: #fff;
+}
+
+.topmenu .@{multi-tab-wrapper-prefix-cls} {
+  max-width: 1200px;
+  margin: 0 auto;
+}
\ No newline at end of file
diff --git a/ui/src/components/page/GlobalFooter.vue b/ui/src/components/page/GlobalFooter.vue
new file mode 100644
index 0000000..c19f825
--- /dev/null
+++ b/ui/src/components/page/GlobalFooter.vue
@@ -0,0 +1,67 @@
+// 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="footer">
+    <div class="line">
+      <span v-html="$config.footer" />
+    </div>
+    <div class="line" v-if="$store.getters.userInfo.roletype === 'Admin'">
+      CloudStack {{ $store.getters.features.cloudstackversion }}
+      <a-divider type="vertical" />
+      <a href="https://github.com/apache/cloudstack/issues/new" target="_blank">
+        <a-icon type="github"/>
+        {{ $t('label.report.bug') }}
+      </a>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'LayoutFooter',
+  data () {
+    return {
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .footer {
+    padding: 0 16px;
+    margin: 48px 0 24px;
+    text-align: center;
+
+    .line {
+      margin-bottom: 8px;
+
+      a {
+        color: rgba(0, 0, 0, .45);
+
+        &:hover {
+          color: rgba(0, 0, 0, .65);
+        }
+
+      }
+    }
+    .copyright {
+      color: rgba(0, 0, 0, .45);
+      font-size: 14px;
+    }
+  }
+</style>
diff --git a/ui/src/components/page/GlobalHeader.vue b/ui/src/components/page/GlobalHeader.vue
new file mode 100644
index 0000000..c06651a
--- /dev/null
+++ b/ui/src/components/page/GlobalHeader.vue
@@ -0,0 +1,147 @@
+// 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>
+  <a-layout-header v-if="!headerBarFixed" :class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', theme ]" :style="{ padding: '0' }">
+    <div v-if="mode === 'sidemenu'" class="header">
+      <a-icon
+        v-if="device==='mobile'"
+        class="trigger"
+        :type="collapsed ? 'menu-fold' : 'menu-unfold'"
+        @click="toggle"></a-icon>
+      <a-icon
+        v-else
+        class="trigger"
+        :type="collapsed ? 'menu-unfold' : 'menu-fold'"
+        @click="toggle"/>
+      <project-menu v-if="device !== 'mobile'" />
+      <saml-domain-switcher style="margin-left: 20px" />
+      <user-menu></user-menu>
+    </div>
+    <div v-else :class="['top-nav-header-index', theme]">
+      <div class="header-index-wide">
+        <div class="header-index-left">
+          <logo class="top-nav-header" :show-title="device !== 'mobile'" />
+          <s-menu
+            v-if="device !== 'mobile'"
+            mode="horizontal"
+            :menu="menus"
+            :theme="theme"
+          ></s-menu>
+          <a-icon
+            v-else
+            class="trigger"
+            :type="collapsed ? 'menu-fold' : 'menu-unfold'"
+            @click="toggle"></a-icon>
+        </div>
+        <project-menu v-if="device !== 'mobile'" />
+        <saml-domain-switcher style="margin-left: 20px" />
+        <user-menu></user-menu>
+      </div>
+    </div>
+
+  </a-layout-header>
+</template>
+
+<script>
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+import Logo from '../header/Logo'
+import SMenu from '../menu/'
+import ProjectMenu from '../header/ProjectMenu'
+import SamlDomainSwitcher from '../header/SamlDomainSwitcher'
+import UserMenu from '../header/UserMenu'
+
+import { mixin } from '@/utils/mixin.js'
+
+export default {
+  name: 'GlobalHeader',
+  components: {
+    Breadcrumb,
+    Logo,
+    SMenu,
+    ProjectMenu,
+    SamlDomainSwitcher,
+    UserMenu
+  },
+  mixins: [mixin],
+  props: {
+    mode: {
+      type: String,
+      // sidemenu, topmenu
+      default: 'sidemenu'
+    },
+    menus: {
+      type: Array,
+      required: true
+    },
+    theme: {
+      type: String,
+      required: false,
+      default: 'dark'
+    },
+    collapsed: {
+      type: Boolean,
+      required: false,
+      default: false
+    },
+    device: {
+      type: String,
+      required: false,
+      default: 'desktop'
+    }
+  },
+  data () {
+    return {
+      headerBarFixed: false
+    }
+  },
+  mounted () {
+    window.addEventListener('scroll', this.handleScroll)
+  },
+  methods: {
+    handleScroll () {
+      if (this.autoHideHeader) {
+        const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
+        if (scrollTop > 100) {
+          this.headerBarFixed = true
+        } else {
+          this.headerBarFixed = false
+        }
+      } else {
+        this.headerBarFixed = false
+      }
+    },
+    toggle () {
+      this.$emit('toggle')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.ant-layout-header {
+  .anticon-menu-fold {
+    font-size: 18px;
+    line-height: 1;
+  }
+
+  .ant-breadcrumb {
+    display: inline;
+    vertical-align: middle;
+  }
+}
+</style>
diff --git a/ui/src/components/page/GlobalLayout.vue b/ui/src/components/page/GlobalLayout.vue
new file mode 100644
index 0000000..0ddf934
--- /dev/null
+++ b/ui/src/components/page/GlobalLayout.vue
@@ -0,0 +1,205 @@
+// 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>
+  <a-layout class="layout" :class="[device]">
+
+    <template v-if="isSideMenu()">
+      <a-drawer
+        v-if="isMobile()"
+        :wrapClassName="'drawer-sider ' + navTheme"
+        :closable="false"
+        :visible="collapsed"
+        placement="left"
+        @close="() => this.collapsed = false"
+      >
+        <side-menu
+          :menus="menus"
+          :theme="navTheme"
+          :collapsed="false"
+          :collapsible="true"
+          mode="inline"
+          @menuSelect="menuSelect"></side-menu>
+      </a-drawer>
+
+      <side-menu
+        v-else
+        mode="inline"
+        :menus="menus"
+        :theme="navTheme"
+        :collapsed="collapsed"
+        :collapsible="true"></side-menu>
+    </template>
+    <template v-else>
+      <a-drawer
+        v-if="isMobile()"
+        :wrapClassName="'drawer-sider ' + navTheme"
+        placement="left"
+        @close="() => this.collapsed = false"
+        :closable="false"
+        :visible="collapsed"
+      >
+        <side-menu
+          :menus="menus"
+          :theme="navTheme"
+          :collapsed="false"
+          :collapsible="true"
+          mode="inline"
+          @menuSelect="menuSelect"></side-menu>
+      </a-drawer>
+    </template>
+
+    <a-layout :class="[layoutMode, `content-width-${contentWidth}`]" :style="{ paddingLeft: contentPaddingLeft, minHeight: '100vh' }">
+      <!-- layout header -->
+      <global-header
+        :mode="layoutMode"
+        :menus="menus"
+        :theme="navTheme"
+        :collapsed="collapsed"
+        :device="device"
+        @toggle="toggle"
+      />
+
+      <!-- layout content -->
+      <a-layout-content class="layout-content" :class="{'is-header-fixed': fixedHeader}">
+        <slot></slot>
+      </a-layout-content>
+
+      <!-- layout footer -->
+      <a-layout-footer style="padding: 0">
+        <global-footer />
+      </a-layout-footer>
+    </a-layout>
+  </a-layout>
+</template>
+
+<script>
+import SideMenu from '@/components/menu/SideMenu'
+import GlobalHeader from '@/components/page/GlobalHeader'
+import GlobalFooter from '@/components/page/GlobalFooter'
+import { triggerWindowResizeEvent } from '@/utils/util'
+import { mapState, mapActions } from 'vuex'
+import { mixin, mixinDevice } from '@/utils/mixin.js'
+
+export default {
+  name: 'GlobalLayout',
+  components: {
+    SideMenu,
+    GlobalHeader,
+    GlobalFooter
+  },
+  mixins: [mixin, mixinDevice],
+  data () {
+    return {
+      collapsed: false,
+      menus: []
+    }
+  },
+  computed: {
+    ...mapState({
+      mainMenu: state => state.permission.addRouters
+    }),
+    contentPaddingLeft () {
+      if (!this.fixSidebar || this.isMobile()) {
+        return '0'
+      }
+      if (this.sidebarOpened) {
+        return '256px'
+      }
+      return '80px'
+    }
+  },
+  watch: {
+    sidebarOpened (val) {
+      this.collapsed = !val
+    },
+    mainMenu (newMenu) {
+      this.menus = newMenu.find((item) => item.path === '/').children
+    }
+  },
+  created () {
+    this.menus = this.mainMenu.find((item) => item.path === '/').children
+    this.collapsed = !this.sidebarOpened
+  },
+  mounted () {
+    const userAgent = navigator.userAgent
+    if (userAgent.indexOf('Edge') > -1) {
+      this.$nextTick(() => {
+        this.collapsed = !this.collapsed
+        setTimeout(() => {
+          this.collapsed = !this.collapsed
+        }, 16)
+      })
+    }
+  },
+  methods: {
+    ...mapActions(['setSidebar']),
+    toggle () {
+      this.collapsed = !this.collapsed
+      this.setSidebar(!this.collapsed)
+      triggerWindowResizeEvent()
+    },
+    paddingCalc () {
+      let left = ''
+      if (this.sidebarOpened) {
+        left = this.isDesktop() ? '256px' : '80px'
+      } else {
+        left = this.isMobile() && '0' || (this.fixSidebar && '80px' || '0')
+      }
+      return left
+    },
+    menuSelect () {
+      if (!this.isDesktop()) {
+        this.collapsed = false
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.layout-content {
+  &.is-header-fixed {
+    margin: 78px 12px 0;
+  }
+}
+
+// Todo try to get this rules scoped
+.ant-drawer.drawer-sider {
+  .sider {
+    box-shadow: none;
+  }
+
+  &.dark {
+    .ant-drawer-content {
+      background-color: rgb(0, 21, 41);
+    }
+  }
+
+  &.light {
+    box-shadow: none;
+
+    .ant-drawer-content {
+      background-color: #fff;
+    }
+  }
+
+  .ant-drawer-body {
+    padding: 0
+  }
+}
+</style>
diff --git a/ui/src/components/page/PageHeader.vue b/ui/src/components/page/PageHeader.vue
new file mode 100644
index 0000000..867c040
--- /dev/null
+++ b/ui/src/components/page/PageHeader.vue
@@ -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.
+
+<template>
+  <div class="page-header">
+    <div class="page-header-index-wide">
+      <a-breadcrumb class="breadcrumb">
+        <a-breadcrumb-item v-for="(item, index) in breadList" :key="index">
+          <router-link
+            v-if="item.name"
+            :to="{ path: item.path === '' ? '/' : item.path }"
+          >
+            <a-icon v-if="index == 0" :type="item.meta.icon" />
+            {{ item.meta.title }}
+          </router-link>
+          <span v-else-if="$route.params.id">{{ $route.params.id }}</span>
+          <span v-else>{{ item.meta.title }}</span>
+        </a-breadcrumb-item>
+      </a-breadcrumb>
+
+      <div class="detail">
+        <div class="main" v-if="!$route.meta.hiddenHeaderContent">
+          <div class="row">
+            <img v-if="logo" :src="logo" class="logo"/>
+            <h1 v-if="title" class="title">{{ title }}</h1>
+            <div class="action">
+              <slot name="action"></slot>
+            </div>
+          </div>
+          <div>
+            <slot name="pageMenu"></slot>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+
+export default {
+  name: 'PageHeader',
+  components: {
+    's-breadcrumb': Breadcrumb
+  },
+  props: {
+    title: {
+      type: String,
+      default: '',
+      required: false
+    },
+    breadcrumb: {
+      type: Array,
+      default: null,
+      required: false
+    },
+    logo: {
+      type: String,
+      default: '',
+      required: false
+    },
+    avatar: {
+      type: String,
+      default: '',
+      required: false
+    }
+  },
+  data () {
+    return {
+      name: '',
+      breadList: []
+    }
+  },
+  created () {
+    this.getBreadcrumb()
+  },
+  methods: {
+    getBreadcrumb () {
+      this.breadList = []
+
+      this.name = this.$route.name
+      this.$route.matched.forEach((item) => {
+        // item.name !== 'index' && this.breadList.push(item)
+        this.breadList.push(item)
+      })
+    }
+  },
+  watch: {
+    $route () {
+      this.getBreadcrumb()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+.page-header {
+  background: #fff;
+  padding: 16px 32px 0;
+  border-bottom: 1px solid #e8e8e8;
+
+  .breadcrumb {
+    margin-bottom: 16px;
+  }
+
+  .detail {
+    display: flex;
+    /*margin-bottom: 16px;*/
+
+    .avatar {
+      flex: 0 1 72px;
+      margin: 0 24px 8px 0;
+
+      & > span {
+        border-radius: 72px;
+        display: block;
+        width: 72px;
+        height: 72px;
+      }
+    }
+
+    .main {
+      width: 100%;
+      flex: 0 1 auto;
+
+      .row {
+        display: flex;
+        width: 100%;
+
+        .avatar {
+          margin-bottom: 16px;
+        }
+      }
+
+      .title {
+        font-size: 20px;
+        font-weight: 500;
+
+        font-size: 20px;
+        line-height: 28px;
+        font-weight: 500;
+        color: rgba(0,0,0,.85);
+        margin-bottom: 16px;
+        flex: auto;
+
+      }
+      .logo {
+        width: 28px;
+        height: 28px;
+        border-radius: 4px;
+        margin-right: 16px;
+      }
+      .content, .headerContent {
+        flex: auto;
+        color: rgba(0,0,0,.45);
+        line-height: 22px;
+
+        .link {
+          margin-top: 16px;
+          line-height: 24px;
+
+          a {
+            font-size: 14px;
+            margin-right: 32px;
+          }
+        }
+      }
+      .extra {
+        flex: 0 1 auto;
+        margin-left: 88px;
+        min-width: 242px;
+        text-align: right;
+      }
+      .action {
+        margin-left: 56px;
+        min-width: 266px;
+        flex: 0 1 auto;
+        text-align: right;
+        &:empty {
+          display: none;
+        }
+      }
+    }
+  }
+}
+
+.mobile .page-header {
+
+  .main {
+
+    .row {
+      flex-wrap: wrap;
+
+      .avatar {
+        flex: 0 1 25%;
+        margin: 0 2% 8px 0;
+      }
+
+      .content, .headerContent {
+        flex: 0 1 70%;
+
+        .link {
+          margin-top: 16px;
+          line-height: 24px;
+
+          a {
+            font-size: 14px;
+            margin-right: 10px;
+          }
+        }
+      }
+
+      .extra {
+        flex: 1 1 auto;
+        margin-left: 0;
+        min-width: 0;
+        text-align: right;
+      }
+
+      .action {
+        margin-left: unset;
+        min-width: 266px;
+        flex: 0 1 auto;
+        text-align: left;
+        margin-bottom: 12px;
+
+        &:empty {
+          display: none;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/ui/src/components/page/PageLayout.vue b/ui/src/components/page/PageLayout.vue
new file mode 100644
index 0000000..5777212
--- /dev/null
+++ b/ui/src/components/page/PageLayout.vue
@@ -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.
+
+<template>
+  <div :style="!$route.meta.pageHeader ? 'margin: -24px -24px 0px;' : null">
+    <!-- pageHeader , route meta hideHeader:true on hide -->
+    <page-header v-if="!$route.meta.pageHeader" :title="title" :logo="logo" :avatar="avatar">
+      <slot slot="action" name="action"></slot>
+      <slot slot="content" name="headerContent"></slot>
+      <div slot="content" v-if="!this.$slots.headerContent && desc">
+        <p style="font-size: 14px;color: rgba(0,0,0,.65)">{{ desc }}</p>
+        <div class="link">
+          <template v-for="(link, index) in linkList">
+            <a :key="index" :href="link.href">
+              <a-icon :type="link.icon"/>
+              <span>{{ link.title }}</span>
+            </a>
+          </template>
+        </div>
+      </div>
+      <slot slot="extra" name="extra"></slot>
+      <div slot="pageMenu">
+        <div class="page-menu-search" v-if="search">
+          <a-input-search style="width: 80%; max-width: 522px;" placeholder="请输入..." size="large" enterButton="搜索" />
+        </div>
+        <div class="page-menu-tabs" v-if="tabs && tabs.items">
+          <!-- @change="callback" :activeKey="activeKey" -->
+          <a-tabs :tabBarStyle="{margin: 0}" @change="tabs.callback" :activeKey="tabs.active()">
+            <a-tab-pane v-for="item in tabs.items" :tab="item.title" :key="item.key"></a-tab-pane>
+          </a-tabs>
+        </div>
+      </div>
+    </page-header>
+    <div class="content">
+      <div :class="['page-header-index-wide']">
+        <slot></slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import PageHeader from './PageHeader'
+
+export default {
+  name: 'LayoutContent',
+  components: {
+    PageHeader
+  },
+  // ['desc', 'logo', 'title', 'avatar', 'linkList', 'extraImage']
+  props: {
+    desc: {
+      type: String,
+      default: null
+    },
+    logo: {
+      type: String,
+      default: null
+    },
+    title: {
+      type: String,
+      default: null
+    },
+    avatar: {
+      type: String,
+      default: null
+    },
+    linkList: {
+      type: Array,
+      default: null
+    },
+    extraImage: {
+      type: String,
+      default: null
+    },
+    search: {
+      type: Boolean,
+      default: false
+    },
+    tabs: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  methods: {
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .content {
+    margin: 24px 24px 0;
+
+    .link {
+      margin-top: 16px;
+
+      &:not(:empty) {
+        margin-bottom: 16px;
+      }
+      a {
+        margin-right: 32px;
+        height: 24px;
+        line-height: 24px;
+        display: inline-block;
+
+        i {
+          font-size: 24px;
+          margin-right: 8px;
+          vertical-align: middle;
+        }
+        span {
+          height: 24px;
+          line-height: 24px;
+          display: inline-block;
+          vertical-align: middle;
+        }
+      }
+    }
+  }
+  .page-menu-search {
+    text-align: center;
+    margin-bottom: 16px;
+  }
+  .page-menu-tabs {
+    margin-top: 48px;
+  }
+</style>
diff --git a/ui/src/components/page/SHeaderNotice.vue b/ui/src/components/page/SHeaderNotice.vue
new file mode 100644
index 0000000..bcf1c3b
--- /dev/null
+++ b/ui/src/components/page/SHeaderNotice.vue
@@ -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.
+
+<template>
+  <a-popover trigger="click" placement="bottomRight" :overlayStyle="{ width: '300px' }">
+    <template slot="content">
+      <a-spin :spinning="loadding">
+        <a-tabs>
+          <a-tab-pane v-for="(tab, k) in tabs" :tab="tab.title" :key="k">
+
+          </a-tab-pane>
+        </a-tabs>
+      </a-spin>
+    </template>
+    <span @click="fetchNotice" class="header-notice">
+      <a-badge count="12">
+        <a-icon style="font-size: 16px; padding: 4px" type="bell" />
+      </a-badge>
+    </span>
+  </a-popover>
+</template>
+
+<script>
+export default {
+  name: 'HeaderNotice',
+  props: {
+    tabs: {
+      type: Array,
+      default: null,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loadding: false
+    }
+  },
+  methods: {
+    fetchNotice () {
+      if (this.loadding) {
+        this.loadding = false
+        return
+      }
+      this.loadding = true
+      setTimeout(() => {
+        this.loadding = false
+      }, 2000)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .header-notice {
+    display: inline-block;
+    transition: all 0.3s;
+
+    span {
+      vertical-align: initial;
+    }
+  }
+</style>
diff --git a/ui/src/components/view/ActionButton.vue b/ui/src/components/view/ActionButton.vue
new file mode 100644
index 0000000..570dae1
--- /dev/null
+++ b/ui/src/components/view/ActionButton.vue
@@ -0,0 +1,192 @@
+// 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>
+  <span class="row-action-button">
+    <console :resource="resource" :size="size" v-if="resource && resource.id && dataView" />
+    <a-tooltip
+      v-for="(action, actionIndex) in actions"
+      :key="actionIndex"
+      arrowPointAtCenter
+      placement="bottomRight">
+      <template slot="title">
+        {{ $t(action.label) }}
+      </template>
+      <a-badge
+        class="button-action-badge"
+        :overflowCount="9"
+        :count="actionBadge[action.api] ? actionBadge[action.api].badgeNum : 0"
+        v-if="action.api in $store.getters.apis &&
+          action.showBadge && (
+            (!dataView && ((action.listView && ('show' in action ? action.show(resource, $store.getters) : true)) || (action.groupAction && selectedRowKeys.length > 0 && ('groupShow' in action ? action.show(resource, $store.getters) : true)))) ||
+            (dataView && action.dataView && ('show' in action ? action.show(resource, $store.getters) : true))
+          )" >
+        <a-button
+          :type="action.icon === 'delete' ? 'danger' : (action.icon === 'plus' ? 'primary' : 'default')"
+          :shape="!dataView && action.icon === 'plus' ? 'round' : 'circle'"
+          style="margin-left: 5px"
+          :size="size"
+          @click="execAction(action)">
+          <span v-if="!dataView && action.icon === 'plus'">
+            {{ $t(action.label) }}
+          </span>
+          <a-icon v-if="(typeof action.icon === 'string')" :type="action.icon" />
+          <font-awesome-icon v-else :icon="action.icon" />
+        </a-button>
+      </a-badge>
+      <a-button
+        v-if="action.api in $store.getters.apis &&
+          !action.showBadge && (
+            (!dataView && ((action.listView && ('show' in action ? action.show(resource, $store.getters) : true)) || (action.groupAction && selectedRowKeys.length > 0 && ('groupShow' in action ? action.show(resource, $store.getters) : true)))) ||
+            (dataView && action.dataView && ('show' in action ? action.show(resource, $store.getters) : true))
+          )"
+        :type="action.icon === 'delete' ? 'danger' : (action.icon === 'plus' ? 'primary' : 'default')"
+        :shape="!dataView && ['plus', 'user-add'].includes(action.icon) ? 'round' : 'circle'"
+        style="margin-left: 5px"
+        :size="size"
+        @click="execAction(action)">
+        <span v-if="!dataView && ['plus', 'user-add'].includes(action.icon)">
+          {{ $t(action.label) }}
+        </span>
+        <a-icon v-if="(typeof action.icon === 'string')" :type="action.icon" />
+        <font-awesome-icon v-else :icon="action.icon" />
+      </a-button>
+    </a-tooltip>
+  </span>
+</template>
+
+<script>
+import { api } from '@/api'
+import Console from '@/components/widgets/Console'
+
+export default {
+  name: 'ActionButton',
+  components: {
+    Console
+  },
+  data () {
+    return {
+      actionBadge: {}
+    }
+  },
+  mounted () {
+    this.handleShowBadge()
+  },
+  props: {
+    actions: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    resource: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    dataView: {
+      type: Boolean,
+      default: false
+    },
+    selectedRowKeys: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    size: {
+      type: String,
+      default: 'default'
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.handleShowBadge()
+    }
+  },
+  methods: {
+    execAction (action) {
+      action.resource = this.resource
+      this.$emit('exec-action', action)
+    },
+    handleShowBadge () {
+      this.actionBadge = {}
+      const arrAsync = []
+      const actionBadge = this.actions.filter(action => action.showBadge === true)
+
+      if (actionBadge && actionBadge.length > 0) {
+        const dataLength = actionBadge.length
+
+        for (let i = 0; i < dataLength; i++) {
+          const action = actionBadge[i]
+
+          arrAsync.push(new Promise((resolve, reject) => {
+            api(action.api, action.param).then(json => {
+              let responseJsonName
+              const response = {}
+
+              response.api = action.api
+              response.count = 0
+
+              for (const key in json) {
+                if (key.includes('response')) {
+                  responseJsonName = key
+                  break
+                }
+              }
+
+              if (json[responseJsonName] && json[responseJsonName].count && json[responseJsonName].count > 0) {
+                response.count = json[responseJsonName].count
+              }
+
+              resolve(response)
+            }).catch(error => {
+              reject(error)
+            })
+          }))
+        }
+
+        Promise.all(arrAsync).then(response => {
+          for (let j = 0; j < response.length; j++) {
+            this.$set(this.actionBadge, response[j].api, {})
+            this.$set(this.actionBadge[response[j].api], 'badgeNum', response[j].count)
+          }
+        }).catch(() => {})
+      }
+    }
+  }
+}
+</script>
+
+<style scoped >
+.button-action-badge {
+  margin-left: 5px;
+}
+
+/deep/.button-action-badge .ant-badge-count {
+  right: 10px;
+  z-index: 8;
+}
+</style>
diff --git a/ui/src/components/view/DedicateData.vue b/ui/src/components/view/DedicateData.vue
new file mode 100644
index 0000000..af50eac
--- /dev/null
+++ b/ui/src/components/view/DedicateData.vue
@@ -0,0 +1,309 @@
+// 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>
+  <a-list-item v-if="dedicatedDomainId">
+    <div>
+      <div style="margin-bottom: 10px;">
+        <strong>{{ $t('label.dedicated') }}</strong>
+        <div>{{ $t('label.yes') }}</div>
+      </div>
+      <p>
+        <strong>{{ $t('label.domainid') }}</strong><br/>
+        <router-link :to="{ path: '/domain/' + dedicatedDomainId }">{{ dedicatedDomainId }}</router-link>
+      </p>
+      <p v-if="dedicatedAccountId">
+        <strong>{{ $t('label.account') }}</strong><br/>
+        <router-link :to="{ path: '/account/' + dedicatedAccountId }">{{ dedicatedAccountId }}</router-link>
+      </p>
+      <a-button style="margin-top: 10px; margin-bottom: 10px;" type="danger" @click="handleRelease">
+        {{ releaseButtonLabel }}
+      </a-button>
+    </div>
+  </a-list-item>
+  <a-list-item v-else>
+    <div>
+      <strong>{{ $t('label.dedicated') }}</strong>
+      <div>{{ $t('label.no') }}</div>
+      <a-button type="primary" style="margin-top: 10px; margin-bottom: 10px;" @click="modalActive = true" :disabled="!dedicateButtonAvailable">
+        {{ dedicatedButtonLabel }}
+      </a-button>
+    </div>
+    <DedicateModal
+      :resource="resource"
+      :active="modalActive"
+      :label="dedicatedModalLabel"
+      @close="modalActive = false"
+      :fetchData="fetchData" />
+  </a-list-item>
+</template>
+
+<script>
+import { api } from '@/api'
+import DedicateModal from './DedicateModal'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+    DedicateModal
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      modalActive: false,
+      dedicateButtonAvailable: true,
+      dedicatedButtonLabel: this.$t('label.dedicate'),
+      releaseButtonLabel: this.$t('label.release'),
+      dedicatedModalLabel: this.$t('label.dedicate'),
+      dedicatedDomainId: null,
+      dedicatedAccountId: null
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (this.resource && this.resource.id && newItem && newItem.id !== oldItem.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.dedicateButtonAvailable = true
+      if (this.$route.meta.name === 'zone') {
+        this.fetchDedicatedZones()
+        this.releaseButtonLabel = this.$t('label.release.dedicated.zone')
+        this.dedicateButtonAvailable = ('dedicateZone' in this.$store.getters.apis)
+        this.dedicatedButtonLabel = this.$t('label.dedicate.zone')
+        this.dedicatedModalLabel = this.$t('label.dedicate.zone')
+      }
+      if (this.$route.meta.name === 'pod') {
+        this.fetchDedicatedPods()
+        this.releaseButtonLabel = this.$t('label.release.dedicated.pod')
+        this.dedicateButtonAvailable = ('dedicatePod' in this.$store.getters.apis)
+        this.dedicatedButtonLabel = this.$t('label.dedicate.pod')
+        this.dedicatedModalLabel = this.$t('label.dedicate.pod')
+      }
+      if (this.$route.meta.name === 'cluster') {
+        this.fetchDedicatedClusters()
+        this.releaseButtonLabel = this.$t('label.release.dedicated.cluster')
+        this.dedicateButtonAvailable = ('dedicateCluster' in this.$store.getters.apis)
+        this.dedicatedButtonLabel = this.$t('label.dedicate.cluster')
+        this.dedicatedModalLabel = this.$t('label.dedicate.cluster')
+      }
+      if (this.$route.meta.name === 'host') {
+        this.fetchDedicatedHosts()
+        this.releaseButtonLabel = this.$t('label.release.dedicated.host')
+        this.dedicateButtonAvailable = ('dedicateHost' in this.$store.getters.apis)
+        this.dedicatedButtonLabel = this.$t('label.dedicate.host')
+        this.dedicatedModalLabel = this.$t('label.dedicate.host')
+      }
+    },
+    fetchDedicatedZones () {
+      api('listDedicatedZones', {
+        zoneid: this.resource.id
+      }).then(response => {
+        if (response.listdedicatedzonesresponse.dedicatedzone &&
+            response.listdedicatedzonesresponse.dedicatedzone.length > 0) {
+          this.dedicatedDomainId = response.listdedicatedzonesresponse.dedicatedzone[0].domainid
+          this.dedicatedAccountId = response.listdedicatedzonesresponse.dedicatedzone[0].accountid
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    fetchDedicatedPods () {
+      api('listDedicatedPods', {
+        podid: this.resource.id
+      }).then(response => {
+        if (response.listdedicatedpodsresponse.dedicatedpod &&
+            response.listdedicatedpodsresponse.dedicatedpod.length > 0) {
+          this.dedicatedDomainId = response.listdedicatedpodsresponse.dedicatedpod[0].domainid
+          this.dedicatedAccountId = response.listdedicatedpodsresponse.dedicatedpod[0].accountid
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    fetchDedicatedClusters () {
+      api('listDedicatedClusters', {
+        clusterid: this.resource.id
+      }).then(response => {
+        if (response.listdedicatedclustersresponse.dedicatedcluster &&
+            response.listdedicatedclustersresponse.dedicatedcluster.length > 0) {
+          this.dedicatedDomainId = response.listdedicatedclustersresponse.dedicatedcluster[0].domainid
+          this.dedicatedAccountId = response.listdedicatedclustersresponse.dedicatedcluster[0].accountid
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    fetchDedicatedHosts () {
+      api('listDedicatedHosts', {
+        hostid: this.resource.id
+      }).then(response => {
+        if (response.listdedicatedhostsresponse.dedicatedhost &&
+            response.listdedicatedhostsresponse.dedicatedhost.length > 0) {
+          this.dedicatedDomainId = response.listdedicatedhostsresponse.dedicatedhost[0].domainid
+          this.dedicatedAccountId = response.listdedicatedhostsresponse.dedicatedhost[0].accountid
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    releaseDedidcatedZone () {
+      api('releaseDedicatedZone', {
+        zoneid: this.resource.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.releasededicatedzoneresponse.jobid,
+          successMessage: this.$t('message.dedicated.zone.released'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.dedicatedDomainId = null
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.dedicated.zone.released'),
+              jobid: response.releasededicatedzoneresponse.jobid,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.release.dedicate.zone'),
+          errorMethod: () => {
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.releasing.dedicated.zone'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    releaseDedidcatedPod () {
+      api('releaseDedicatedPod', {
+        podid: this.resource.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.releasededicatedpodresponse.jobid,
+          successMessage: this.$t('message.pod.dedication.released'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.dedicatedDomainId = null
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.pod.dedication.released'),
+              jobid: response.releasededicatedpodresponse.jobid,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.release.dedicate.pod'),
+          errorMethod: () => {
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.releasing.dedicated.pod'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    releaseDedidcatedCluster () {
+      api('releaseDedicatedCluster', {
+        clusterid: this.resource.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.releasededicatedclusterresponse.jobid,
+          successMessage: this.$t('message.cluster.dedication.released'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.dedicatedDomainId = null
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.cluster.dedication.released'),
+              jobid: response.releasededicatedclusterresponse.jobid,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.release.dedicate.cluster'),
+          errorMethod: () => {
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.releasing.dedicated.cluster'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    releaseDedidcatedHost () {
+      api('releaseDedicatedHost', {
+        hostid: this.resource.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.releasededicatedhostresponse.jobid,
+          successMessage: this.$t('message.host.dedication.released'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.dedicatedDomainId = null
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.host.dedication.released'),
+              jobid: response.releasededicatedhostresponse.jobid,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.release.dedicate.host'),
+          errorMethod: () => {
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.releasing.dedicated.host'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleRelease () {
+      this.modalActive = false
+      if (this.$route.meta.name === 'zone') {
+        this.releaseDedidcatedZone()
+      }
+      if (this.$route.meta.name === 'pod') {
+        this.releaseDedidcatedPod()
+      }
+      if (this.$route.meta.name === 'cluster') {
+        this.releaseDedidcatedCluster()
+      }
+      if (this.$route.meta.name === 'host') {
+        this.releaseDedidcatedHost()
+      }
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/view/DedicateDomain.vue b/ui/src/components/view/DedicateDomain.vue
new file mode 100644
index 0000000..555a55e
--- /dev/null
+++ b/ui/src/components/view/DedicateDomain.vue
@@ -0,0 +1,139 @@
+// 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">
+    <div class="form__item" :class="{'error': domainError}">
+      <a-spin :spinning="domainsLoading">
+        <p class="form__label">{{ $t('label.domain') }}<span class="required">*</span></p>
+        <p class="required required-label">{{ $t('label.required') }}</p>
+        <a-select style="width: 100%" @change="handleChangeDomain" v-model="domainId">
+          <a-select-option v-for="(domain, index) in domainsList" :value="domain.id" :key="index">
+            {{ domain.name }}
+          </a-select-option>
+        </a-select>
+      </a-spin>
+    </div>
+    <div class="form__item" v-if="accountsList">
+      <p class="form__label">{{ $t('label.account') }}</p>
+      <a-select style="width: 100%" @change="handleChangeAccount">
+        <a-select-option v-for="(account, index) in accountsList" :value="account.name" :key="index">
+          {{ account.name }}
+        </a-select-option>
+      </a-select>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'DedicateDomain',
+  props: {
+    error: {
+      type: Boolean,
+      requried: true
+    }
+  },
+  data () {
+    return {
+      domainsLoading: false,
+      domainId: null,
+      accountsList: null,
+      domainsList: null,
+      domainError: false
+    }
+  },
+  watch: {
+    error () {
+      this.domainError = this.error
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.domainsLoading = true
+      api('listDomains', {
+        listAll: true,
+        details: 'min'
+      }).then(response => {
+        this.domainsList = response.listdomainsresponse.domain
+
+        if (this.domainsList[0]) {
+          this.domainId = this.domainsList[0].id
+          this.handleChangeDomain(this.domainId)
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.domainsLoading = false
+      })
+    },
+    fetchAccounts () {
+      api('listAccounts', {
+        domainid: this.domainId
+      }).then(response => {
+        this.accountsList = response.listaccountsresponse.account || []
+        if (this.accountsList && this.accountsList.length === 0) {
+          this.handleChangeAccount(null)
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleChangeDomain (e) {
+      this.$emit('domainChange', e)
+      this.domainError = false
+      this.fetchAccounts()
+    },
+    handleChangeAccount (e) {
+      this.$emit('accountChange', e)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+    &__item {
+      margin-bottom: 20px;
+    }
+
+    &__label {
+      font-weight: bold;
+      margin-bottom: 5px;
+    }
+  }
+
+  .required {
+    color: #ff0000;
+    font-size: 12px;
+
+    &-label {
+      display: none;
+    }
+  }
+
+  .error {
+    .required-label {
+      display: block;
+    }
+  }
+</style>
diff --git a/ui/src/components/view/DedicateModal.vue b/ui/src/components/view/DedicateModal.vue
new file mode 100644
index 0000000..9443e42
--- /dev/null
+++ b/ui/src/components/view/DedicateModal.vue
@@ -0,0 +1,277 @@
+// 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>
+  <a-modal
+    v-model="dedicatedDomainModal"
+    :title="label"
+    :maskClosable="false"
+    :okText="$t('label.ok')"
+    :cancelText="$t('label.cancel')"
+    @cancel="closeModal"
+    @ok="handleDedicateForm">
+    <DedicateDomain
+      @domainChange="id => domainId = id"
+      @accountChange="id => dedicatedAccount = id"
+      :error="domainError" />
+  </a-modal>
+</template>
+
+<script>
+import { api } from '@/api'
+import DedicateDomain from './DedicateDomain'
+
+export default {
+  components: {
+    DedicateDomain
+  },
+  inject: ['parentFetchData'],
+  props: {
+    active: {
+      type: Boolean,
+      required: true
+    },
+    label: {
+      type: String,
+      required: true
+    },
+    resource: {
+      type: Object,
+      required: true
+    },
+    fetchData: {
+      type: Function,
+      required: true
+    }
+  },
+  data () {
+    return {
+      dedicatedDomainModal: false,
+      domainId: null,
+      dedicatedAccount: null,
+      domainError: false
+    }
+  },
+  watch: {
+    active () {
+      this.dedicatedDomainModal = this.active
+    }
+  },
+  mounted () {
+    this.dedicatedDomainModal = this.active
+  },
+  methods: {
+    fetchParentData () {
+      this.fetchData()
+    },
+    closeModal () {
+      this.$emit('close')
+    },
+    dedicateZone () {
+      if (!this.domainId) {
+        this.domainError = true
+        return
+      }
+      api('dedicateZone', {
+        zoneId: this.resource.id,
+        domainId: this.domainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicatezoneresponse.jobid,
+          successMessage: this.$t('label.zone.dedicated'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainId = this.domainId
+            this.dedicatedDomainModal = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('label.zone.dedicated'),
+              jobid: response.dedicatezoneresponse.jobid,
+              description: `${this.$t('label.domain.id')} : ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.zone.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          },
+          loadingMessage: this.$t('message.dedicating.zone'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.dedicatedDomainModal = false
+      })
+    },
+    dedicatePod () {
+      if (!this.domainId) {
+        this.domainError = true
+        return
+      }
+      api('dedicatePod', {
+        podId: this.resource.id,
+        domainId: this.domainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicatepodresponse.jobid,
+          successMessage: this.$t('label.pod.dedicated'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainId = this.domainId
+            this.dedicatedDomainModal = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('label.pod.dedicated'),
+              jobid: response.dedicatepodresponse.jobid,
+              description: `${this.$t('label.domainid')}: ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.pod.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          },
+          loadingMessage: this.$t('message.dedicating.pod'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.dedicatedDomainModal = false
+      })
+    },
+    dedicateCluster () {
+      if (!this.domainId) {
+        this.domainError = true
+        return
+      }
+      api('dedicateCluster', {
+        clusterId: this.resource.id,
+        domainId: this.domainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicateclusterresponse.jobid,
+          successMessage: this.$t('message.cluster.dedicated'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainId = this.domainId
+            this.dedicatedDomainModal = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.cluster.dedicated'),
+              jobid: response.dedicateclusterresponse.jobid,
+              description: `${this.$t('label.domainid')}: ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.cluster.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          },
+          loadingMessage: this.$t('message.dedicating.cluster'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.dedicatedDomainModal = false
+      })
+    },
+    dedicateHost () {
+      if (!this.domainId) {
+        this.domainError = true
+        return
+      }
+      api('dedicateHost', {
+        hostId: this.resource.id,
+        domainId: this.domainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicatehostresponse.jobid,
+          successMessage: this.$t('message.host.dedicated'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainId = this.domainId
+            this.dedicatedDomainModal = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.host.dedicated'),
+              jobid: response.dedicatehostresponse.jobid,
+              description: `${this.$t('label.domainid')}: ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.host.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          },
+          loadingMessage: this.$t('message.dedicating.host'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.fetchParentData()
+            this.dedicatedDomainModal = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.dedicatedDomainModal = false
+      })
+    },
+    handleDedicateForm () {
+      if (this.$route.meta.name === 'zone') {
+        this.dedicateZone()
+      }
+      if (this.$route.meta.name === 'pod') {
+        this.dedicatePod()
+      }
+      if (this.$route.meta.name === 'cluster') {
+        this.dedicateCluster()
+      }
+      if (this.$route.meta.name === 'host') {
+        this.dedicateHost()
+      }
+    }
+  }
+}
+
+</script>
diff --git a/ui/src/components/view/DetailSettings.vue b/ui/src/components/view/DetailSettings.vue
new file mode 100644
index 0000000..eaa446c
--- /dev/null
+++ b/ui/src/components/view/DetailSettings.vue
@@ -0,0 +1,293 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-alert
+      v-if="disableSettings"
+      banner
+      :message="$t('message.action.settings.warning.vm.running')" />
+    <div v-else>
+      <div v-show="!showAddDetail">
+        <a-button
+          type="dashed"
+          style="width: 100%"
+          icon="plus"
+          :disabled="!('updateTemplate' in $store.getters.apis && 'updateVirtualMachine' in $store.getters.apis && isAdminOrOwner())"
+          @click="onShowAddDetail">
+          {{ $t('label.add.setting') }}
+        </a-button>
+      </div>
+      <div v-show="showAddDetail">
+        <a-input-group
+          type="text"
+          compact>
+          <a-auto-complete
+            class="detail-input"
+            ref="keyElm"
+            :filterOption="filterOption"
+            :value="newKey"
+            :dataSource="Object.keys(detailOptions)"
+            :placeholder="$t('label.name')"
+            @change="e => onAddInputChange(e, 'newKey')" />
+          <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled />
+          <a-auto-complete
+            class="detail-input"
+            :filterOption="filterOption"
+            :value="newValue"
+            :dataSource="detailOptions[newKey]"
+            :placeholder="$t('label.value')"
+            @change="e => onAddInputChange(e, 'newValue')" />
+          <a-tooltip arrowPointAtCenter placement="topRight">
+            <template slot="title">
+              {{ $t('label.add.setting') }}
+            </template>
+            <a-button icon="check" @click="addDetail" class="detail-button"></a-button>
+          </a-tooltip>
+          <a-tooltip arrowPointAtCenter placement="topRight">
+            <template slot="title">
+              {{ $t('label.cancel') }}
+            </template>
+            <a-button icon="close" @click="closeDetail" class="detail-button"></a-button>
+          </a-tooltip>
+        </a-input-group>
+        <p v-if="error" style="color: red"> {{ $t(error) }} </p>
+      </div>
+    </div>
+    <a-list size="large">
+      <a-list-item :key="index" v-for="(item, index) in details">
+        <a-list-item-meta>
+          <span slot="title">
+            {{ item.name }}
+          </span>
+          <span slot="description" style="word-break: break-all">
+            <span v-if="item.edit" style="display: flex">
+              <a-auto-complete
+                style="width: 100%"
+                :value="item.value"
+                :dataSource="detailOptions[item.name]"
+                @change="val => handleInputChange(val, index)"
+                @pressEnter="e => updateDetail(index)" />
+            </span>
+            <span v-else>{{ item.value }}</span>
+          </span>
+        </a-list-item-meta>
+        <div
+          slot="actions"
+          v-if="!disableSettings && 'updateTemplate' in $store.getters.apis &&
+            'updateVirtualMachine' in $store.getters.apis && isAdminOrOwner() && allowEditOfDetail(item.name)">
+          <a-button shape="circle" size="default" @click="updateDetail(index)" v-if="item.edit">
+            <a-icon type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+          </a-button>
+          <a-button shape="circle" size="default" @click="hideEditDetail(index)" v-if="item.edit">
+            <a-icon type="close-circle" theme="twoTone" twoToneColor="#f5222d" />
+          </a-button>
+          <a-button
+            shape="circle"
+            icon="edit"
+            v-if="!item.edit"
+            @click="showEditDetail(index)" />
+        </div>
+        <div
+          slot="actions"
+          v-if="!disableSettings && 'updateTemplate' in $store.getters.apis &&
+            'updateVirtualMachine' in $store.getters.apis && isAdminOrOwner() && allowEditOfDetail(item.name)">
+          <a-popconfirm
+            :title="`${$t('label.delete.setting')}?`"
+            @confirm="deleteDetail(index)"
+            :okText="$t('label.yes')"
+            :cancelText="$t('label.no')"
+            placement="left"
+          >
+            <a-button shape="circle" type="danger" icon="delete" />
+          </a-popconfirm>
+        </div>
+      </a-list-item>
+    </a-list>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'DetailSettings',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      details: [],
+      detailOptions: {},
+      showAddDetail: false,
+      disableSettings: false,
+      newKey: '',
+      newValue: '',
+      loading: false,
+      resourceType: 'UserVm',
+      error: false
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.updateResource(newItem)
+    }
+  },
+  mounted () {
+    this.updateResource(this.resource)
+  },
+  methods: {
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
+      )
+    },
+    updateResource (resource) {
+      this.details = []
+      if (!resource) {
+        return
+      }
+      this.resource = resource
+      this.resourceType = this.$route.meta.resourceType
+      if (resource.details) {
+        this.details = Object.keys(this.resource.details).map(k => {
+          return { name: k, value: this.resource.details[k], edit: false }
+        })
+      }
+      api('listDetailOptions', { resourcetype: this.resourceType, resourceid: this.resource.id }).then(json => {
+        this.detailOptions = json.listdetailoptionsresponse.detailoptions.details
+      })
+      this.disableSettings = (this.$route.meta.name === 'vm' && this.resource.state !== 'Stopped')
+    },
+    allowEditOfDetail (name) {
+      if (this.resource.readonlyuidetails) {
+        if (this.resource.readonlyuidetails.split(',').map(item => item.trim()).includes(name)) {
+          return false
+        }
+      }
+      return true
+    },
+    showEditDetail (index) {
+      this.details[index].edit = true
+      this.details[index].originalValue = this.details[index].value
+      this.$set(this.details, index, this.details[index])
+    },
+    hideEditDetail (index) {
+      this.details[index].edit = false
+      this.details[index].value = this.details[index].originalValue
+      this.$set(this.details, index, this.details[index])
+    },
+    handleInputChange (val, index) {
+      this.details[index].value = val
+      this.$set(this.details, index, this.details[index])
+    },
+    onAddInputChange (val, obj) {
+      this.error = false
+      this[obj] = val
+    },
+    isAdminOrOwner () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype) ||
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.account === this.$store.getters.userInfo.account) ||
+        this.resource.project && this.resource.projectid === this.$store.getters.project.id
+    },
+    runApi () {
+      var apiName = ''
+      if (this.resourceType === 'UserVm') {
+        apiName = 'updateVirtualMachine'
+      } else if (this.resourceType === 'Template') {
+        apiName = 'updateTemplate'
+      }
+      if (!(apiName in this.$store.getters.apis)) {
+        this.$notification.error({
+          message: this.$t('error.execute.api.failed') + ' ' + apiName,
+          description: this.$t('message.user.not.permitted.api')
+        })
+        return
+      }
+
+      const params = { id: this.resource.id }
+      if (this.details.length === 0) {
+        params.cleanupdetails = true
+      } else {
+        this.details.forEach(function (item, index) {
+          params['details[0].' + item.name] = item.value
+        })
+      }
+      this.loading = true
+      api(apiName, params).then(json => {
+        var details = {}
+        if (this.resourceType === 'UserVm' && json.updatevirtualmachineresponse.virtualmachine.details) {
+          details = json.updatevirtualmachineresponse.virtualmachine.details
+        } else if (this.resourceType === 'Template' && json.updatetemplateresponse.template.details) {
+          details = json.updatetemplateresponse.template.details
+        }
+        this.details = Object.keys(details).map(k => {
+          return { name: k, value: details[k], edit: false }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(f => {
+        this.loading = false
+        this.showAddDetail = false
+        this.newKey = ''
+        this.newValue = ''
+      })
+    },
+    addDetail () {
+      if (this.newKey === '' || this.newValue === '') {
+        this.error = this.$t('message.error.provide.setting')
+        return
+      }
+      this.error = false
+      this.details.push({ name: this.newKey, value: this.newValue })
+      this.runApi()
+    },
+    updateDetail (index) {
+      this.runApi()
+    },
+    deleteDetail (index) {
+      this.details.splice(index, 1)
+      this.runApi()
+    },
+    onShowAddDetail () {
+      this.showAddDetail = true
+      setTimeout(() => {
+        this.$refs.keyElm.focus()
+      })
+    },
+    closeDetail () {
+      this.newKey = ''
+      this.newValue = ''
+      this.error = false
+      this.showAddDetail = false
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.detail-input {
+  width: calc(calc(100% / 2) - 45px);
+}
+
+.detail-button {
+  width: 30px;
+}
+</style>
diff --git a/ui/src/components/view/DetailsTab.vue b/ui/src/components/view/DetailsTab.vue
new file mode 100644
index 0000000..64809b2
--- /dev/null
+++ b/ui/src/components/view/DetailsTab.vue
@@ -0,0 +1,124 @@
+// 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>
+  <a-list
+    size="small"
+    :dataSource="fetchDetails()">
+    <a-list-item slot="renderItem" slot-scope="item" v-if="item in resource">
+      <div>
+        <strong>{{ item === 'service' ? $t('label.supportedservices') : $t('label.' + String(item).toLowerCase()) }}</strong>
+        <br/>
+        <div v-if="Array.isArray(resource[item]) && item === 'service'">
+          <div v-for="(service, idx) in resource[item]" :key="idx">
+            {{ service.name }} : {{ service.provider[0].name }}
+          </div>
+        </div>
+        <div v-else-if="$route.meta.name === 'backup' && item === 'volumes'">
+          <div v-for="(volume, idx) in JSON.parse(resource[item])" :key="idx">
+            <router-link :to="{ path: '/volume/' + volume.uuid }">{{ volume.type }} - {{ volume.path }}</router-link> ({{ parseFloat(volume.size / (1024.0 * 1024.0 * 1024.0)).toFixed(1) }} GB)
+          </div>
+        </div>
+        <div v-else-if="['name', 'type'].includes(item)">
+          <span v-if="['USER.LOGIN', 'USER.LOGOUT', 'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE', 'ALERT.SERVICE.DOMAINROUTER'].includes(resource[item])">{{ $t(resource[item].toLowerCase()) }}</span>
+          <span v-else>{{ resource[item] }}</span>
+        </div>
+        <div v-else-if="['created', 'sent', 'lastannotated'].includes(item)">
+          {{ $toLocaleDate(resource[item]) }}
+        </div>
+        <div v-else>
+          {{ resource[item] }}
+        </div>
+      </div>
+    </a-list-item>
+    <HostInfo :resource="resource" v-if="$route.meta.name === 'host' && 'listHosts' in $store.getters.apis" />
+    <DedicateData :resource="resource" v-if="dedicatedSectionActive" />
+    <VmwareData :resource="resource" v-if="$route.meta.name === 'zone' && 'listVmwareDcs' in $store.getters.apis" />
+  </a-list>
+</template>
+
+<script>
+import DedicateData from './DedicateData'
+import HostInfo from '@/views/infra/HostInfo'
+import VmwareData from './VmwareData'
+
+export default {
+  name: 'DetailsTab',
+  components: {
+    DedicateData,
+    HostInfo,
+    VmwareData
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      dedicatedRoutes: ['zone', 'pod', 'cluster', 'host'],
+      dedicatedSectionActive: false,
+      projectname: ''
+    }
+  },
+  mounted () {
+    this.dedicatedSectionActive = this.dedicatedRoutes.includes(this.$route.meta.name)
+  },
+  created () {
+    this.dedicatedSectionActive = this.dedicatedRoutes.includes(this.$route.meta.name)
+  },
+  watch: {
+    resource (newItem) {
+      this.resource = newItem
+      if ('account' in this.resource && this.resource.account.startsWith('PrjAcct-')) {
+        this.projectname = this.resource.account.substring(this.resource.account.indexOf('-') + 1, this.resource.account.lastIndexOf('-'))
+        this.resource.projectname = this.projectname
+      }
+    },
+    $route () {
+      this.dedicatedSectionActive = this.dedicatedRoutes.includes(this.$route.meta.name)
+      this.fetchProjectAdmins()
+    }
+  },
+  methods: {
+    fetchProjectAdmins () {
+      if (!this.resource.owner) {
+        return false
+      }
+      var owners = this.resource.owner
+      var projectAdmins = []
+      for (var owner of owners) {
+        projectAdmins.push(Object.keys(owner).includes('user') ? owner.account + '(' + owner.user + ')' : owner.account)
+      }
+      this.resource.account = projectAdmins.join()
+    },
+    fetchDetails () {
+      var details = this.$route.meta.details
+      if (typeof details === 'function') {
+        details = details()
+      }
+      details = this.projectname ? [...details.filter(x => x !== 'account'), 'projectname'] : details
+      return details
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/view/FormView.vue b/ui/src/components/view/FormView.vue
new file mode 100644
index 0000000..60566aa
--- /dev/null
+++ b/ui/src/components/view/FormView.vue
@@ -0,0 +1,131 @@
+// 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>
+  <a-modal
+    :title="$t(currentAction.label)"
+    :visible="showForm"
+    :closable="true"
+    :confirmLoading="currentAction.loading"
+    :okText="$t('label.ok')"
+    :cancelText="$t('label.cancel')"
+    style="top: 20px;"
+    @ok="handleSubmit"
+    @cancel="close"
+    centered
+  >
+    <a-spin :spinning="currentAction.loading">
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical" >
+        <a-form-item
+          v-for="(field, fieldIndex) in currentAction.params"
+          :key="fieldIndex"
+          :label="$t(field.name)"
+          :v-bind="field.name"
+          v-if="field.name !== 'id'"
+        >
+          <span v-if="field.type==='boolean'">
+            <a-switch
+              v-decorator="[field.name, {
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
+              }]"
+              :placeholder="field.description"
+            />
+          </span>
+          <span v-else-if="field.type==='uuid' || field.name==='account'">
+            <a-select
+              :loading="field.loading"
+              v-decorator="[field.name, {
+                rules: [{ required: field.required, message: `${this.$t('message.error.select')}` }]
+              }]"
+              :placeholder="field.description"
+
+            >
+              <a-select-option v-for="(opt, optIndex) in field.opts" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </span>
+          <span v-else-if="field.type==='long'">
+            <a-input-number
+              v-decorator="[field.name, {
+                rules: [{ required: field.required, message: `${this.$t('message.validate.number')}` }]
+              }]"
+              :placeholder="field.description"
+            />
+          </span>
+          <span v-else-if="field.name==='password'">
+            <a-input-password
+              v-decorator="[field.name, {
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
+              }]"
+              :placeholder="field.description"
+            />
+          </span>
+          <span v-else>
+            <a-input
+              v-decorator="[field.name, {
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
+              }]"
+              :placeholder="field.description"
+            />
+          </span>
+        </a-form-item>
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+
+import ChartCard from '@/components/widgets/ChartCard'
+
+export default {
+  name: 'FormView',
+  components: {
+    ChartCard
+  },
+  props: {
+    currentAction: {
+      type: Object,
+      required: true
+    },
+    showForm: {
+      type: Boolean,
+      default: false
+    },
+    handleSubmit: {
+      type: Function,
+      default: () => {}
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  methods: {
+    close () {
+      this.currentAction.loading = false
+      this.showForm = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/components/view/InfoCard.vue b/ui/src/components/view/InfoCard.vue
new file mode 100644
index 0000000..8200b81
--- /dev/null
+++ b/ui/src/components/view/InfoCard.vue
@@ -0,0 +1,1052 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-card class="spin-content" :bordered="bordered" :title="title">
+      <div>
+        <div class="resource-details">
+          <div class="resource-details__name">
+            <div
+              class="avatar"
+              @click="$message.success(`${$t('label.copied.clipboard')} : ${name}`)"
+              v-clipboard:copy="name" >
+              <slot name="avatar">
+                <os-logo v-if="resource.ostypeid || resource.ostypename" :osId="resource.ostypeid" :osName="resource.ostypename" size="4x" @update-osname="(name) => this.resource.ostypename = name"/>
+                <a-icon v-else-if="typeof $route.meta.icon ==='string'" style="font-size: 36px" :type="$route.meta.icon" />
+                <a-icon v-else style="font-size: 36px" :component="$route.meta.icon" />
+              </slot>
+            </div>
+            <slot name="name">
+              <div v-if="['USER.LOGIN', 'USER.LOGOUT', 'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE', 'ALERT.SERVICE.DOMAINROUTER'].includes(resource.name)">{{ $t(resource.name.toLowerCase()) }}</div>
+              <div v-else>
+                <h4 class="name">
+                  {{ name }}
+                </h4>
+              </div>
+            </slot>
+          </div>
+          <slot name="actions">
+            <div class="tags">
+              <a-tag v-if="resource.instancename">
+                {{ resource.instancename }}
+              </a-tag>
+              <a-tag v-if="resource.type">
+                <span v-if="['USER.LOGIN', 'USER.LOGOUT', 'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE', 'ALERT.SERVICE.DOMAINROUTER'].includes(resource.type)">{{ $t(resource.type.toLowerCase()) }}</span>
+                <span v-else>
+                  {{ resource.type }}
+                </span>
+              </a-tag>
+              <a-tag v-if="resource.issourcenat">
+                {{ $t('label.issourcenat') }}
+              </a-tag>
+              <a-tag v-if="resource.broadcasturi">
+                {{ resource.broadcasturi }}
+              </a-tag>
+              <a-tag v-if="resource.hypervisor">
+                {{ resource.hypervisor }}
+              </a-tag>
+              <a-tag v-if="resource.haenable">
+                {{ $t('label.haenable') }}
+              </a-tag>
+              <a-tag v-if="resource.isdynamicallyscalable">
+                {{ $t('label.isdynamicallyscalable') }}
+              </a-tag>
+              <a-tag v-if="resource.scope">
+                {{ resource.scope }}
+              </a-tag>
+              <a-tag v-if="resource.version">
+                {{ resource.version }}
+              </a-tag>
+              <a-tooltip placement="right" >
+                <template slot="title">
+                  <span>{{ $t('label.view.console') }}</span>
+                </template>
+                <console style="margin-top: -5px;" :resource="resource" size="default" v-if="resource.id" />
+              </a-tooltip>
+            </div>
+          </slot>
+        </div>
+
+        <a-divider/>
+
+        <div class="resource-detail-item" v-if="(resource.state || resource.status) && $route.meta.name !== 'zone'">
+          <div class="resource-detail-item__label">{{ $t('label.status') }}</div>
+          <div class="resource-detail-item__details">
+            <status class="status" :text="resource.state || resource.status" displayText/>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.allocationstate">
+          <div class="resource-detail-item__label">{{ $t('label.allocationstate') }}</div>
+          <div class="resource-detail-item__details">
+            <status class="status" :text="resource.allocationstate" displayText/>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.resourcestate">
+          <div class="resource-detail-item__label">{{ $t('label.resourcestate') }}</div>
+          <div class="resource-detail-item__details">
+            <status class="status" :text="resource.resourcestate" displayText/>
+          </div>
+        </div>
+
+        <div class="resource-detail-item" v-if="resource.id">
+          <div class="resource-detail-item__label">{{ $t('label.id') }}</div>
+          <div class="resource-detail-item__details">
+            <a-tooltip placement="right" >
+              <template slot="title">
+                <span>{{ $t('label.copyid') }}</span>
+              </template>
+              <a-button
+                style="margin-left: -5px"
+                shape="circle"
+                icon="barcode"
+                type="dashed"
+                size="small"
+                @click="$message.success($t('label.copied.clipboard'))"
+                v-clipboard:copy="resource.id" />
+            </a-tooltip>
+            <span style="margin-left: 10px;">{{ resource.id }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.ostypename && resource.ostypeid">
+          <div class="resource-detail-item__label">{{ $t('label.ostypename') }}</div>
+          <div class="resource-detail-item__details">
+            <os-logo :osId="resource.ostypeid" :osName="resource.ostypename" size="lg" style="margin-left: -1px" />
+            <span style="margin-left: 8px">{{ resource.ostypename }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="('cpunumber' in resource && 'cpuspeed' in resource) || resource.cputotal">
+          <div class="resource-detail-item__label">{{ $t('label.cpu') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="appstore" />
+            <span v-if="resource.cputotal">{{ resource.cputotal }}</span>
+            <span v-else>{{ resource.cpunumber }} CPU x {{ parseFloat(resource.cpuspeed / 1000.0).toFixed(2) }} Ghz</span>
+          </div>
+          <div>
+            <span v-if="resource.cpuused">
+              <a-progress
+                v-if="resource.cpuused"
+                class="progress-bar"
+                size="small"
+                status="active"
+                :percent="parseFloat(resource.cpuused)"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
+              />
+            </span>
+            <span v-if="resource.cpuallocated">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                :percent="parseFloat(resource.cpuallocated)"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.allocated')"
+              />
+            </span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="'memory' in resource">
+          <div class="resource-detail-item__label">{{ $t('label.memory') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="bulb" />{{ resource.memory + ' ' + $t('label.mb.memory') }}
+          </div>
+          <div>
+            <span v-if="resource.memorykbs && resource.memoryintfreekbs">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                status="active"
+                :percent="Number(parseFloat(100.0 * (resource.memorykbs - resource.memoryintfreekbs) / resource.memorykbs).toFixed(2))"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
+              />
+            </span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-else-if="resource.memorytotalgb">
+          <div class="resource-detail-item__label">{{ $t('label.memory') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="bulb" />{{ resource.memorytotalgb + ' ' + $t('label.memory') }}
+          </div>
+          <div>
+            <span v-if="resource.memoryusedgb">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                status="active"
+                :percent="Number(parseFloat(100.0 * parseFloat(resource.memoryusedgb) / parseFloat(resource.memorytotalgb)).toFixed(2))"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.used')"
+              />
+            </span>
+            <span v-if="resource.memoryallocatedgb">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                :percent="Number(parseFloat(100.0 * parseFloat(resource.memoryallocatedgb) / parseFloat(resource.memorytotalgb)).toFixed(2))"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.allocated')"
+              />
+            </span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-else-if="resource.memorytotal">
+          <div class="resource-detail-item__label">{{ $t('label.memory') }}</div>
+          <div class="resource-detail-item__details">
+
+            <div style="display: flex; flex-direction: column; width: 100%;">
+              <div>
+                <a-icon type="bulb" />{{ resource.memorytotal + ' ' + $t('label.memory') }}
+              </div>
+              <div>
+                <span
+                  v-if="resource.memoryused">
+                  <a-progress
+                    class="progress-bar"
+                    size="small"
+                    status="active"
+                    :percent="parseFloat(resource.memoryused)"
+                    :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.used')" />
+                </span>
+                <span
+                  v-if="resource.memoryallocated">
+                  <a-progress
+                    class="progress-bar"
+                    size="small"
+                    :percent="parseFloat(resource.memoryallocated)"
+                    :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.allocated')" />
+                </span>
+              </div>
+            </div>
+
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.volumes || resource.sizegb">
+          <div class="resource-detail-item__label">{{ $t('label.disksize') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="hdd" />
+            <span style="width: 100%;" v-if="$route.meta.name === 'vm' && resource.volumes">{{ (resource.volumes.reduce((total, item) => total += item.size, 0) / (1024 * 1024 * 1024.0)).toFixed(2) }} GB Storage</span>
+            <span style="width: 100%;" v-else-if="resource.sizegb || resource.size">{{ resource.sizegb || (resource.size/1024.0) }}</span>
+          </div>
+          <div style="margin-left: 25px; margin-top: 5px" v-if="resource.diskkbsread && resource.diskkbswrite && resource.diskioread && resource.diskiowrite">
+            <a-tag style="margin-bottom: 5px;">{{ $t('label.read') + ' ' + toSize(resource.diskkbsread) }}</a-tag>
+            <a-tag style="margin-bottom: 5px;">{{ $t('label.write') + ' ' + toSize(resource.diskkbswrite) }}</a-tag><br/>
+            <a-tag style="margin-bottom: 5px;">{{ $t('label.read.io') + ' ' + resource.diskioread }}</a-tag>
+            <a-tag>{{ $t('label.writeio') + ' ' + resource.diskiowrite }}</a-tag>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-else-if="resource.disksizetotalgb">
+          <div class="resource-detail-item__label">{{ $t('label.disksize') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="database" />{{ resource.disksizetotalgb }}
+          </div>
+          <div>
+            <span v-if="resource.disksizeusedgb">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                status="active"
+                :percent="Number(parseFloat(100.0 * parseFloat(resource.disksizeusedgb) / parseFloat(resource.disksizetotalgb)).toFixed(2))"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.disksizeusedgb')" />
+            </span>
+            <span v-if="resource.disksizeallocatedgb">
+              <a-progress
+                class="progress-bar"
+                size="small"
+                :percent="Number(parseFloat(100.0 * parseFloat(resource.disksizeallocatedgb) / parseFloat(resource.disksizetotalgb)).toFixed(2))"
+                :format="(percent, successPercent) => parseFloat(percent).toFixed(2) + '% ' + $t('label.disksizeallocatedgb')" />
+            </span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.nic || ('networkkbsread' in resource && 'networkkbswrite' in resource)">
+          <div class="resource-detail-item__label">{{ $t('label.network') }}</div>
+          <div class="resource-detail-item__details resource-detail-item__details--start">
+            <a-icon type="wifi" />
+            <div>
+              <div v-if="'networkkbsread' in resource && 'networkkbswrite' in resource">
+                <a-tag><a-icon type="arrow-down" />RX {{ toSize(resource.networkkbsread) }}</a-tag>
+                <a-tag><a-icon type="arrow-up" />TX {{ toSize(resource.networkkbswrite) }}</a-tag>
+              </div>
+              <div v-else>{{ resource.nic.length }} NIC(s)</div>
+              <div
+                v-if="resource.nic"
+                v-for="(eth, index) in resource.nic"
+                :key="eth.id"
+                style="margin-left: -24px; margin-top: 5px;">
+                <a-icon type="api" />eth{{ index }} {{ eth.ipaddress }}
+                <router-link v-if="eth.networkname && eth.networkid" :to="{ path: '/guestnetwork/' + eth.networkid }">({{ eth.networkname }})</router-link>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.networks && resource.networks.length > 0">
+          <div class="resource-detail-item__label">{{ $t('label.networks') }}</div>
+          <div class="resource-detail-item__details resource-detail-item__details--start">
+            <div>
+              <div
+                v-for="network in resource.networks"
+                :key="network.id"
+                style="margin-top: 5px;">
+                <a-icon type="api" />{{ network.name }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.ipaddress">
+          <div class="resource-detail-item__label">{{ $t('label.ip') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon
+              type="environment"
+              @click="$message.success(`${$t('label.copied.clipboard')} : ${ ipaddress }`)"
+              v-clipboard:copy="ipaddress" />
+            <router-link v-if="resource.ipaddressid" :to="{ path: '/publicip/' + resource.ipaddressid }">{{ ipaddress }}</router-link>
+            <span v-else>{{ ipaddress }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.projectid || resource.projectname">
+          <div class="resource-detail-item__label">{{ $t('label.project') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="project" />
+            <router-link v-if="resource.projectid" :to="{ path: '/project/' + resource.projectid }">{{ resource.project || resource.projectname || resource.projectid }}</router-link>
+            <router-link v-else :to="{ path: '/project', query: { name: resource.projectname }}">{{ resource.projectname }}</router-link>
+          </div>
+        </div>
+
+        <div class="resource-detail-item">
+          <slot name="details">
+          </slot>
+        </div>
+
+        <div class="resource-detail-item" v-if="resource.groupid">
+          <div class="resource-detail-item__label">{{ $t('label.group') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="gold" />
+            <router-link :to="{ path: '/vmgroup/' + resource.groupid }">{{ resource.group || resource.groupid }}</router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.keypair">
+          <div class="resource-detail-item__label">{{ $t('label.keypair') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="key" />
+            <router-link :to="{ path: '/ssh/' + resource.keypair }">{{ resource.keypair }}</router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.virtualmachineid">
+          <div class="resource-detail-item__label">{{ $t('label.vmname') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="desktop" />
+            <router-link :to="{ path: '/vm/' + resource.virtualmachineid }">{{ resource.vmname || resource.vm || resource.virtualmachinename || resource.virtualmachineid }} </router-link>
+            <status class="status status--end" :text="resource.vmstate" v-if="resource.vmstate"/>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.volumeid">
+          <div class="resource-detail-item__label">{{ $t('label.volume') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="hdd" />
+            <router-link :to="{ path: '/volume/' + resource.volumeid }">{{ resource.volumename || resource.volume || resource.volumeid }} </router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.associatednetworkid">
+          <div class="resource-detail-item__label">{{ $t('label.associatednetwork') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="wifi" />
+            <router-link :to="{ path: '/guestnetwork/' + resource.associatednetworkid }">{{ resource.associatednetworkname || resource.associatednetworkid }} </router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.sourceipaddressnetworkid">
+          <div class="resource-detail-item__label">{{ $t('label.network') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="wifi" />
+            <router-link :to="{ path: '/guestnetwork/' + resource.sourceipaddressnetworkid }">{{ resource.sourceipaddressnetworkname || resource.sourceipaddressnetworkid }} </router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.guestnetworkid">
+          <div class="resource-detail-item__label">{{ $t('label.guestnetwork') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="gateway" />
+            <router-link :to="{ path: '/guestnetwork/' + resource.guestnetworkid }">{{ resource.guestnetworkname || resource.guestnetworkid }} </router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.vpcid">
+          <div class="resource-detail-item__label">{{ $t('label.vpcname') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="deployment-unit" />
+            <router-link :to="{ path: '/vpc/' + resource.vpcid }">{{ resource.vpcname || resource.vpcid }}</router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.affinitygroup && resource.affinitygroup.length > 0">
+          <div class="resource-detail-item__label">{{ $t('label.affinitygroup') }}</div>
+          <a-icon type="swap" />
+          <span
+            v-for="(group, index) in resource.affinitygroup"
+            :key="group.id"
+          >
+            <router-link :to="{ path: '/affinitygroup/' + group.id }">{{ group.name }}</router-link>
+            <span v-if="index + 1 < resource.affinitygroup.length">, </span>
+          </span>
+        </div>
+        <div class="resource-detail-item" v-if="resource.templateid">
+          <div class="resource-detail-item__label">{{ $t('label.templatename') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="picture" />
+            <router-link :to="{ path: '/template/' + resource.templateid }">{{ resource.templatename || resource.templateid }} </router-link>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.serviceofferingname && resource.serviceofferingid">
+          <div class="resource-detail-item__label">{{ $t('label.serviceofferingname') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="cloud" />
+            <router-link v-if="$route.meta.name === 'router'" :to="{ path: '/computeoffering/' + resource.serviceofferingid, query: { issystem: true } }">{{ resource.serviceofferingname || resource.serviceofferingid }} </router-link>
+            <router-link v-else-if="$router.resolve('/computeoffering/' + resource.serviceofferingid).route.name !== '404'" :to="{ path: '/computeoffering/' + resource.serviceofferingid }">{{ resource.serviceofferingname || resource.serviceofferingid }} </router-link>
+            <span v-else>{{ resource.serviceofferingname || resource.serviceofferingid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.diskofferingname && resource.diskofferingid">
+          <div class="resource-detail-item__label">{{ $t('label.diskoffering') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="hdd" />
+            <router-link v-if="$router.resolve('/diskoffering/' + resource.diskofferingid).route.name !== '404'" :to="{ path: '/diskoffering/' + resource.diskofferingid }">{{ resource.diskofferingname || resource.diskofferingid }} </router-link>
+            <span v-else>{{ resource.diskofferingname || resource.diskofferingid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.backupofferingid">
+          <div class="resource-detail-item__label">{{ $t('label.backupofferingid') }}</div>
+          <a-icon type="cloud-upload" />
+          <router-link v-if="$router.resolve('/backupoffering/' + resource.backupofferingid).route.name !== '404'" :to="{ path: '/backupoffering/' + resource.backupofferingid }">{{ resource.backupofferingname || resource.backupofferingid }} </router-link>
+          <span v-else>{{ resource.backupofferingname || resource.backupofferingid }}</span>
+        </div>
+        <div class="resource-detail-item" v-if="resource.networkofferingid">
+          <div class="resource-detail-item__label">{{ $t('label.networkofferingid') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="wifi" />
+            <router-link v-if="$router.resolve('/networkoffering/' + resource.networkofferingid).route.name !== '404'" :to="{ path: '/networkoffering/' + resource.networkofferingid }">{{ resource.networkofferingname || resource.networkofferingid }} </router-link>
+            <span v-else>{{ resource.networkofferingname || resource.networkofferingid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.vpcofferingid">
+          <div class="resource-detail-item__label">{{ $t('label.vpcoffering') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="deployment-unit" />
+            <router-link v-if="$router.resolve('/vpcoffering/' + resource.vpcofferingid).route.name !== '404'" :to="{ path: '/vpcoffering/' + resource.vpcofferingid }">{{ resource.vpcofferingname || resource.vpcofferingid }} </router-link>
+            <span v-else>{{ resource.vpcofferingname || resource.vpcofferingid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.storageid">
+          <div class="resource-detail-item__label">{{ $t('label.storagepool') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="database" />
+            <router-link v-if="$router.resolve('/storagepool/' + resource.storageid).route.name !== '404'" :to="{ path: '/storagepool/' + resource.storageid }">{{ resource.storage || resource.storageid }} </router-link>
+            <span v-else>{{ resource.storage || resource.storageid }}</span>
+            <a-tag style="margin-left: 5px;" v-if="resource.storagetype">
+              {{ resource.storagetype }}
+            </a-tag>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.hostid">
+          <div class="resource-detail-item__label">{{ $t('label.hostname') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="desktop" />
+            <router-link v-if="$router.resolve('/host/' + resource.hostid).route.name !== '404'" :to="{ path: '/host/' + resource.hostid }">{{ resource.hostname || resource.hostid }} </router-link>
+            <span v-else>{{ resource.hostname || resource.hostid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.clusterid">
+          <div class="resource-detail-item__label">{{ $t('label.clusterid') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="cluster" />
+            <router-link v-if="$router.resolve('/cluster/' + resource.clusterid).route.name !== '404'" :to="{ path: '/cluster/' + resource.clusterid }">{{ resource.clustername || resource.cluster || resource.clusterid }}</router-link>
+            <span v-else>{{ resource.clustername || resource.cluster || resource.clusterid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.podid">
+          <div class="resource-detail-item__label">{{ $t('label.podid') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="appstore" />
+            <router-link v-if="$router.resolve('/pod/' + resource.podid).route.name !== '404'" :to="{ path: '/pod/' + resource.podid }">{{ resource.podname || resource.pod || resource.podid }}</router-link>
+            <span v-else>{{ resource.podname || resource.pod || resource.podid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.zoneid">
+          <div class="resource-detail-item__label">{{ $t('label.zone') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="global" />
+            <router-link v-if="$router.resolve('/zone/' + resource.zoneid).route.name !== '404'" :to="{ path: '/zone/' + resource.zoneid }">{{ resource.zone || resource.zonename || resource.zoneid }}</router-link>
+            <span v-else>{{ resource.zone || resource.zonename || resource.zoneid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.owner">
+          <div class="resource-detail-item__label">{{ $t('label.owners') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="user" />
+            <template v-for="(item,idx) in resource.owner">
+              <span style="margin-right:5px" :key="idx">
+                <span v-if="$store.getters.userInfo.roletype !== 'User'">
+                  <router-link v-if="'user' in item" :to="{ path: '/accountuser', query: { username: item.user, domainid: resource.domainid }}">{{ item.account + '(' + item.user + ')' }}</router-link>
+                  <router-link v-else :to="{ path: '/account', query: { name: item.account, domainid: resource.domainid } }">{{ item.account }}</router-link>
+                </span>
+                <span v-else>{{ item.user ? item.account + '(' + item.user + ')' : item.account }}</span>
+              </span>
+            </template>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.account && !resource.account.startsWith('PrjAcct-')">
+          <div class="resource-detail-item__label">{{ $t('label.account') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="user" />
+            <router-link v-if="$store.getters.userInfo.roletype !== 'User'" :to="{ path: '/account', query: { name: resource.account, domainid: resource.domainid } }">{{ resource.account }}</router-link>
+            <span v-else>{{ resource.account }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.roleid">
+          <div class="resource-detail-item__label">{{ $t('label.role') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="idcard" />
+            <router-link v-if="$router.resolve('/role/' + resource.roleid).route.name !== '404'" :to="{ path: '/role/' + resource.roleid }">{{ resource.rolename || resource.role || resource.roleid }}</router-link>
+            <span v-else>{{ resource.rolename || resource.role || resource.roleid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.domainid">
+          <div class="resource-detail-item__label">{{ $t('label.domain') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="block" />
+            <router-link v-if="$store.getters.userInfo.roletype !== 'User'" :to="{ path: '/domain/' + resource.domainid }">{{ resource.domain || resource.domainid }}</router-link>
+            <span v-else>{{ resource.domain || resource.domainid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.managementserverid">
+          <div class="resource-detail-item__label">{{ $t('label.management.servers') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="rocket" />
+            <router-link v-if="$router.resolve('/managementserver/' + resource.managementserverid).route.name !== '404'" :to="{ path: '/managementserver/' + resource.managementserverid }">{{ resource.managementserver || resource.managementserverid }}</router-link>
+            <span v-else>{{ resource.managementserver || resource.managementserverid }}</span>
+          </div>
+        </div>
+        <div class="resource-detail-item" v-if="resource.created">
+          <div class="resource-detail-item__label">{{ $t('label.created') }}</div>
+          <div class="resource-detail-item__details">
+            <a-icon type="calendar" />{{ $toLocaleDate(resource.created) }}
+          </div>
+        </div>
+      </div>
+
+      <div class="account-center-tags" v-if="$route.meta.related">
+        <a-divider/>
+        <div v-for="item in $route.meta.related" :key="item.path">
+          <router-link
+            v-if="$router.resolve('/' + item.name).route.name !== '404'"
+            :to="{ path: '/' + item.name + '?' + item.param + '=' + (item.value ? resource[item.value] : item.param === 'account' ? resource.name + '&domainid=' + resource.domainid : resource.id) }">
+            <a-button style="margin-right: 10px" :icon="$router.resolve('/' + item.name).route.meta.icon" >
+              {{ $t('label.view') + ' ' + $t(item.title) }}
+            </a-button>
+          </router-link>
+        </div>
+      </div>
+
+      <div class="account-center-tags" v-if="showKeys">
+        <a-divider/>
+        <div class="user-keys">
+          <a-icon type="key" />
+          <strong>
+            {{ $t('label.apikey') }}
+            <a-tooltip placement="right" >
+              <template slot="title">
+                <span>{{ $t('label.copy') + ' ' + $t('label.apikey') }}</span>
+              </template>
+              <a-button shape="circle" type="dashed" size="small" @click="$message.success($t('label.copied.clipboard'))" v-clipboard:copy="resource.apikey">
+                <a-icon type="copy"/>
+              </a-button>
+            </a-tooltip>
+          </strong>
+          <div>
+            {{ resource.apikey.substring(0, 20) }}...
+          </div>
+        </div> <br/>
+        <div class="user-keys">
+          <a-icon type="lock" />
+          <strong>
+            {{ $t('label.secretkey') }}
+            <a-tooltip placement="right" >
+              <template slot="title">
+                <span>{{ $t('label.copy') + ' ' + $t('label.secretkey') }}</span>
+              </template>
+              <a-button shape="circle" type="dashed" size="small" @click="$message.success($t('label.copied.clipboard'))" v-clipboard:copy="resource.secretkey">
+                <a-icon type="copy"/>
+              </a-button>
+            </a-tooltip>
+          </strong>
+          <div>
+            {{ resource.secretkey.substring(0, 20) }}...
+          </div>
+        </div>
+      </div>
+
+      <div class="account-center-tags" v-if="resourceType && 'listTags' in $store.getters.apis">
+        <a-divider/>
+        <a-spin :spinning="loadingTags">
+          <div class="title">{{ $t('label.tags') }}</div>
+          <div>
+            <template v-for="(tag, index) in tags">
+              <a-tag :key="index" :closable="isAdminOrOwner() && 'deleteTags' in $store.getters.apis" :afterClose="() => handleDeleteTag(tag)">
+                {{ tag.key }} = {{ tag.value }}
+              </a-tag>
+            </template>
+
+            <div v-if="inputVisible">
+              <a-input-group
+                type="text"
+                size="small"
+                @blur="handleInputConfirm"
+                @keyup.enter="handleInputConfirm"
+                compact>
+                <a-input ref="input" :value="inputKey" @change="handleKeyChange" style="width: 30%; text-align: center" :placeholder="$t('label.key')" />
+                <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled />
+                <a-input :value="inputValue" @change="handleValueChange" style="width: 30%; text-align: center; border-left: 0" :placeholder="$t('label.value')" />
+                <a-button shape="circle" size="small" @click="handleInputConfirm">
+                  <a-icon type="check"/>
+                </a-button>
+                <a-button shape="circle" size="small" @click="inputVisible=false">
+                  <a-icon type="close"/>
+                </a-button>
+              </a-input-group>
+            </div>
+            <a-tag @click="showInput" style="background: #fff; borderStyle: dashed;" v-else-if="isAdminOrOwner() && 'createTags' in $store.getters.apis">
+              <a-icon type="plus" /> {{ $t('label.new.tag') }}
+            </a-tag>
+          </div>
+        </a-spin>
+      </div>
+
+      <div class="account-center-team" v-if="annotationType && 'listAnnotations' in $store.getters.apis">
+        <a-divider :dashed="true"/>
+        <a-spin :spinning="loadingAnnotations">
+          <div class="title">
+            {{ $t('label.comments') }} ({{ notes.length }})
+          </div>
+          <a-list
+            v-if="notes.length"
+            :dataSource="notes"
+            itemLayout="horizontal"
+            size="small" >
+            <a-list-item slot="renderItem" slot-scope="item">
+              <a-comment
+                :content="item.annotation"
+                :datetime="$toLocaleDate(item.created)" >
+                <a-button
+                  v-if="'removeAnnotation' in $store.getters.apis"
+                  slot="avatar"
+                  type="danger"
+                  shape="circle"
+                  size="small"
+                  @click="deleteNote(item)">
+                  <a-icon type="delete"/>
+                </a-button>
+              </a-comment>
+            </a-list-item>
+          </a-list>
+
+          <a-comment v-if="'addAnnotation' in $store.getters.apis">
+            <a-avatar
+              slot="avatar"
+              icon="edit"
+              @click="showNotesInput = true" />
+            <div slot="content">
+              <a-textarea
+                rows="4"
+                @change="handleNoteChange"
+                :value="annotation"
+                :placeholder="$t('label.add.note')" />
+              <a-button
+                style="margin-top: 10px"
+                @click="saveNote"
+                type="primary"
+              >
+                {{ $t('label.save') }}
+              </a-button>
+            </div>
+          </a-comment>
+        </a-spin>
+      </div>
+    </a-card>
+  </a-spin>
+</template>
+
+<script>
+
+import { api } from '@/api'
+import Console from '@/components/widgets/Console'
+import OsLogo from '@/components/widgets/OsLogo'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'InfoCard',
+  components: {
+    Console,
+    OsLogo,
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    bordered: {
+      type: Boolean,
+      default: true
+    }
+  },
+  data () {
+    return {
+      name: '',
+      ipaddress: '',
+      resourceType: '',
+      annotationType: '',
+      inputVisible: false,
+      inputKey: '',
+      inputValue: '',
+      tags: [],
+      notes: [],
+      annotation: '',
+      showKeys: false,
+      showNotesInput: false,
+      loadingTags: false,
+      loadingAnnotations: false
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.resource = newItem
+      this.resourceType = this.$route.meta.resourceType
+      this.annotationType = ''
+      this.showKeys = false
+      this.setData()
+
+      switch (this.resourceType) {
+        case 'UserVm':
+          this.annotationType = 'VM'
+          break
+        case 'Domain':
+          this.annotationType = 'DOMAIN'
+          // Domain resource type is not supported for tags
+          this.resourceType = ''
+          break
+        case 'Host':
+          this.annotationType = 'HOST'
+          // Host resource type is not supported for tags
+          this.resourceType = ''
+          break
+      }
+
+      if ('tags' in this.resource) {
+        this.tags = this.resource.tags
+      } else if (this.resourceType) {
+        this.getTags()
+      }
+      if (this.annotationType) {
+        this.getNotes()
+      }
+      if ('apikey' in this.resource) {
+        this.getUserKeys()
+      }
+    }
+  },
+  created () {
+    this.setData()
+  },
+  methods: {
+    setData () {
+      this.name = this.resource.displayname || this.resource.displaytext || this.resource.name || this.resource.username ||
+        this.resource.ipaddress || this.resource.virtualmachinename || this.resource.templatetype
+      if (this.resource.nic && this.resource.nic.length > 0) {
+        this.ipaddress = this.resource.nic.filter(e => { return e.ipaddress }).map(e => { return e.ipaddress }).join(', ')
+      } else {
+        this.ipaddress = this.resource.ipaddress
+      }
+    },
+    toSize (kb) {
+      if (!kb) {
+        return '0 KB'
+      }
+      if (kb < 1024) {
+        return kb + ' KB'
+      }
+      if (kb < 1024 * 1024) {
+        return parseFloat(kb / 1024.0).toFixed(2) + ' MB'
+      }
+      return parseFloat(kb / (1024.0 * 1024.0)).toFixed(2) + ' GB'
+    },
+    getUserKeys () {
+      if (!('getUserKeys' in this.$store.getters.apis)) {
+        return
+      }
+      api('getUserKeys', { id: this.resource.id }).then(json => {
+        this.showKeys = true
+        this.resource.secretkey = json.getuserkeysresponse.userkeys.secretkey
+      })
+    },
+    getTags () {
+      if (!('listTags' in this.$store.getters.apis) || !this.resource || !this.resource.id) {
+        return
+      }
+      this.loadingTags = true
+      this.tags = []
+      const params = {
+        listall: true,
+        resourceid: this.resource.id,
+        resourcetype: this.resourceType
+      }
+      if (this.$route.meta.name === 'project') {
+        params.projectid = this.resource.id
+      }
+      api('listTags', params).then(json => {
+        if (json.listtagsresponse && json.listtagsresponse.tag) {
+          this.tags = json.listtagsresponse.tag
+        }
+      }).finally(() => {
+        this.loadingTags = false
+      })
+    },
+    getNotes () {
+      if (!('listAnnotations' in this.$store.getters.apis)) {
+        return
+      }
+      this.loadingAnnotations = true
+      this.notes = []
+      api('listAnnotations', { entityid: this.resource.id, entitytype: this.annotationType }).then(json => {
+        if (json.listannotationsresponse && json.listannotationsresponse.annotation) {
+          this.notes = json.listannotationsresponse.annotation
+        }
+      }).finally(() => {
+        this.loadingAnnotations = false
+      })
+    },
+    isAdminOrOwner () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype) ||
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.account === this.$store.getters.userInfo.account) ||
+        this.resource.project && this.resource.projectid === this.$store.getters.project.id
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    handleKeyChange (e) {
+      this.inputKey = e.target.value
+    },
+    handleValueChange (e) {
+      this.inputValue = e.target.value
+    },
+    handleInputConfirm () {
+      const args = {}
+      this.loadingTags = true
+      args.resourceids = this.resource.id
+      args.resourcetype = this.resourceType
+      args['tags[0].key'] = this.inputKey
+      args['tags[0].value'] = this.inputValue
+      api('createTags', args).then(json => {
+      }).finally(e => {
+        this.getTags()
+      })
+
+      this.inputVisible = false
+      this.inputKey = ''
+      this.inputValue = ''
+    },
+    handleDeleteTag (tag) {
+      const args = {}
+      this.loadingTags = true
+      args.resourceids = this.resource.id
+      args.resourcetype = this.resourceType
+      args['tags[0].key'] = tag.key
+      args['tags[0].value'] = tag.value
+      api('deleteTags', args).then(json => {
+      }).finally(e => {
+        this.getTags()
+      })
+    },
+    handleNoteChange (e) {
+      this.annotation = e.target.value
+    },
+    saveNote () {
+      if (this.annotation.length < 1) {
+        return
+      }
+      this.loadingAnnotations = true
+      this.showNotesInput = false
+      const args = {}
+      args.entityid = this.resource.id
+      args.entitytype = this.annotationType
+      args.annotation = this.annotation
+      api('addAnnotation', args).then(json => {
+      }).finally(e => {
+        this.getNotes()
+      })
+      this.annotation = ''
+    },
+    deleteNote (annotation) {
+      this.loadingAnnotations = true
+      const args = {}
+      args.id = annotation.id
+      api('removeAnnotation', args).then(json => {
+      }).finally(e => {
+        this.getNotes()
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+/deep/ .ant-card-body {
+  padding: 30px;
+}
+
+.resource-details {
+  text-align: center;
+  margin-bottom: 20px;
+
+  &__name {
+    display: flex;
+    align-items: center;
+
+    .avatar {
+      margin-right: 20px;
+      overflow: hidden;
+      min-width: 50px;
+      cursor: pointer;
+
+      img {
+        height: 100%;
+        width: 100%;
+      }
+    }
+
+    .name {
+      margin-bottom: 0;
+      font-size: 18px;
+      line-height: 1;
+      word-break: break-all;
+      text-align: left;
+    }
+
+  }
+}
+.resource-detail-item {
+  margin-bottom: 20px;
+  word-break: break-all;
+
+  &__details {
+    display: flex;
+    align-items: center;
+
+    &--start {
+      align-items: flex-start;
+
+      i {
+        margin-top: 4px;
+      }
+
+    }
+
+  }
+
+  .anticon {
+    margin-right: 10px;
+  }
+
+  &__label {
+    margin-bottom: 5px;
+    font-weight: bold;
+  }
+
+}
+.user-keys {
+  word-wrap: break-word;
+}
+.account-center-tags {
+  .ant-tag {
+    margin-bottom: 8px;
+  }
+
+  a {
+    display: block;
+    margin-bottom: 10px;
+  }
+
+}
+.account-center-team {
+  .members {
+    a {
+      display: block;
+      margin: 12px 0;
+      line-height: 24px;
+      height: 24px;
+      .member {
+        font-size: 14px;
+        color: rgba(0, 0, 0, 0.65);
+        line-height: 24px;
+        max-width: 100px;
+        vertical-align: top;
+        margin-left: 12px;
+        transition: all 0.3s;
+        display: inline-block;
+      }
+      &:hover {
+        span {
+          color: #1890ff;
+        }
+      }
+    }
+  }
+}
+.title {
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+
+.tags {
+  display: flex;
+  flex-wrap: wrap;
+  margin-top: 20px;
+  margin-bottom: -10px;
+
+  .ant-tag {
+    margin-right: 10px;
+    margin-bottom: 10px;
+    height: auto;
+  }
+
+}
+
+.progress-bar {
+  padding-right: 60px;
+  width: 100%;
+}
+
+.status {
+  margin-top: -5px;
+
+  &--end {
+    margin-left: 5px;
+  }
+
+}
+</style>
diff --git a/ui/src/components/view/ListResourceTable.vue b/ui/src/components/view/ListResourceTable.vue
new file mode 100644
index 0000000..c498d16
--- /dev/null
+++ b/ui/src/components/view/ListResourceTable.vue
@@ -0,0 +1,218 @@
+// 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>
+    <a-input-search
+      v-if="showSearch"
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+
+    <a-table
+      size="small"
+      :columns="fetchColumns()"
+      :dataSource="dataSource"
+      :rowKey="item => item.id"
+      :loading="loading"
+      :pagination="defaultPagination"
+      @change="handleTableChange"
+      @handle-search-filter="handleTableChange" >
+
+      <template v-for="(column, index) in Object.keys(routerlinks({}))" :slot="column" slot-scope="text, item" >
+        <span :key="index">
+          <router-link :set="routerlink = routerlinks(item)" :to="{ path: routerlink[column] }" >{{ text }}</router-link>
+        </span>
+      </template>
+
+      <template slot="state" slot-scope="text">
+        <status :text="text ? text : ''" />{{ text }}
+      </template>
+
+      <template slot="status" slot-scope="text">
+        <status :text="text ? text : ''" />{{ text }}
+      </template>
+
+    </a-table>
+
+    <div v-if="!defaultPagination" style="display: block; text-align: right; margin-top: 10px;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="total"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="device === 'desktop' ? ['20', '50', '100', '200'] : ['10', '20', '50', '100', '200']"
+        @change="handleTableChange"
+        @showSizeChange="handlePageSizeChange"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'ListResourceTable',
+  components: {
+    Status
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    apiName: {
+      type: String,
+      default: ''
+    },
+    routerlinks: {
+      type: Function,
+      default: () => { return {} }
+    },
+    params: {
+      type: Object,
+      default: () => {}
+    },
+    columns: {
+      type: Array,
+      required: true
+    },
+    showSearch: {
+      type: Boolean,
+      default: true
+    },
+    items: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      dataSource: [],
+      total: 0,
+      filter: '',
+      defaultPagination: false,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (newItem !== oldItem) {
+        this.fetchData()
+      }
+    },
+    items (newItem, oldItem) {
+      if (newItem) {
+        this.dataSource = newItem
+      }
+    },
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchData()
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.items && this.items.length > 0) {
+        this.dataSource = this.items
+        this.defaultPagination = {
+          showSizeChanger: true,
+          pageSizeOptions: this.mixinDevice === 'desktop' ? ['20', '50', '100', '200'] : ['10', '20', '50', '100', '200']
+        }
+        return
+      }
+      this.loading = true
+      var params = { ...this.params, ...this.options }
+      params.listall = true
+      params.response = 'json'
+      params.details = 'min'
+      api(this.apiName, params).then(json => {
+        var responseName
+        var objectName
+        for (const key in json) {
+          if (key.includes('response')) {
+            responseName = key
+            break
+          }
+        }
+        for (const key in json[responseName]) {
+          if (key === 'count') {
+            this.total = json[responseName][key]
+            continue
+          }
+          objectName = key
+          break
+        }
+        this.dataSource = json[responseName][objectName]
+        if (!this.dataSource || this.dataSource.length === 0) {
+          this.dataSource = []
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchColumns () {
+      var columns = []
+      for (const col of this.columns) {
+        columns.push({
+          dataIndex: col,
+          title: this.$t('label.' + col),
+          scopedSlots: { customRender: col }
+        })
+      }
+      return columns
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.fetchData()
+    },
+    handleTableChange (page, pagesize) {
+      this.options.page = page
+      this.options.pageSize = pagesize
+      this.fetchData()
+    },
+    handlePageSizeChange (page, pagesize) {
+      this.options.page = 1
+      this.options.pageSize = pagesize
+      this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue
new file mode 100644
index 0000000..35f68b5
--- /dev/null
+++ b/ui/src/components/view/ListView.vue
@@ -0,0 +1,624 @@
+// 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>
+  <a-table
+    size="middle"
+    :loading="loading"
+    :columns="isOrderUpdatable() ? columns : columns.filter(x => x.dataIndex !== 'order')"
+    :dataSource="items"
+    :rowKey="(record, idx) => record.id || record.name || record.usageType || idx + '-' + Math.random()"
+    :pagination="false"
+    :rowSelection="['vm', 'alert'].includes($route.name) || $route.name === 'event' && $store.getters.userInfo.roletype === 'Admin'
+      ? {selectedRowKeys: selectedRowKeys, onChange: onSelectChange} : null"
+    :rowClassName="getRowClassName"
+    style="overflow-y: auto"
+  >
+    <template slot="footer">
+      <span v-if="hasSelected">
+        {{ `Selected ${selectedRowKeys.length} items` }}
+      </span>
+    </template>
+
+    <!--
+    <div slot="expandedRowRender" slot-scope="resource">
+      <info-card :resource="resource" style="margin-left: 0px; width: 50%">
+        <div slot="actions" style="padding-top: 12px">
+          <a-tooltip
+            v-for="(action, actionIndex) in $route.meta.actions"
+            :key="actionIndex"
+            placement="bottom">
+            <template slot="title">
+              {{ $t(action.label) }}
+            </template>
+            <a-button
+              v-if="action.api in $store.getters.apis && action.dataView &&
+                ('show' in action ? action.show(resource, $store.getters.userInfo) : true)"
+              :icon="action.icon"
+              :type="action.icon === 'delete' ? 'danger' : (action.icon === 'plus' ? 'primary' : 'default')"
+              shape="circle"
+              style="margin-right: 5px; margin-top: 12px"
+              @click="$parent.execAction(action)"
+            >
+            </a-button>
+          </a-tooltip>
+        </div>
+      </info-card>
+    </div>
+    -->
+
+    <span slot="name" slot-scope="text, record">
+      <div style="min-width: 120px" >
+        <QuickView
+          style="margin-left: 5px"
+          :actions="actions"
+          :resource="record"
+          :enabled="quickViewEnabled() && actions.length > 0 && columns && columns[0].dataIndex === 'name' "
+          @exec-action="$parent.execAction"/>
+        <span v-if="$route.path.startsWith('/project')" style="margin-right: 5px">
+          <a-button type="dashed" size="small" shape="circle" icon="login" @click="changeProject(record)" />
+        </span>
+        <os-logo v-if="record.ostypename" :osName="record.ostypename" size="1x" style="margin-right: 5px" />
+
+        <span v-if="$route.path.startsWith('/globalsetting')">{{ text }}</span>
+        <span v-else-if="$route.path.startsWith('/alert')">
+          <router-link :to="{ path: $route.path + '/' + record.id }" v-if="record.id">{{ $t(text.toLowerCase()) }}</router-link>
+          <router-link :to="{ path: $route.path + '/' + record.name }" v-else>{{ $t(text.toLowerCase()) }}</router-link>
+        </span>
+        <span v-else>
+          <router-link :to="{ path: $route.path + '/' + record.id }" v-if="record.id">{{ text }}</router-link>
+          <router-link :to="{ path: $route.path + '/' + record.name }" v-else>{{ text }}</router-link>
+        </span>
+      </div>
+    </span>
+    <a slot="templatetype" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: $route.path + '/' + record.templatetype }">{{ text }}</router-link>
+    </a>
+    <template slot="type" slot-scope="text">
+      <span v-if="['USER.LOGIN', 'USER.LOGOUT', 'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE', 'ALERT.SERVICE.DOMAINROUTER'].includes(text)">{{ $t(text.toLowerCase()) }}</span>
+      <span v-else>{{ text }}</span>
+    </template>
+    <a slot="displayname" slot-scope="text, record" href="javascript:;">
+      <QuickView
+        style="margin-left: 5px"
+        :actions="actions"
+        :resource="record"
+        :enabled="quickViewEnabled() && actions.length > 0 && columns && columns[0].dataIndex === 'displayname' "
+        @exec-action="$parent.execAction"/>
+      <router-link :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+    </a>
+    <span slot="username" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: $route.path + '/' + record.id }" v-if="['/accountuser', '/vpnuser'].includes($route.path)">{{ text }}</router-link>
+      <router-link :to="{ path: '/accountuser', query: { username: record.username, domainid: record.domainid } }" v-else-if="$store.getters.userInfo.roletype !== 'User'">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </span>
+    <span slot="ipaddress" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="['/publicip', '/privategw'].includes($route.path)" :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+      <span v-if="record.issourcenat">
+        &nbsp;
+        <a-tag>source-nat</a-tag>
+      </span>
+    </span>
+    <a slot="publicip" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+    </a>
+    <span slot="traffictype" slot-scope="text" href="javascript:;">
+      {{ text }}
+    </span>
+    <a slot="vmname" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/vm/' + record.virtualmachineid }">{{ text }}</router-link>
+    </a>
+    <a slot="virtualmachinename" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/vm/' + record.virtualmachineid }">{{ text }}</router-link>
+    </a>
+    <span slot="hypervisor" slot-scope="text, record">
+      <span v-if="$route.name === 'hypervisorcapability'">
+        <router-link :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+      </span>
+      <span v-else>{{ text }}</span>
+    </span>
+    <template slot="state" slot-scope="text">
+      <status :text="text ? text : ''" displayText />
+    </template>
+    <template slot="allocationstate" slot-scope="text">
+      <status :text="text ? text : ''" displayText />
+    </template>
+    <template slot="resourcestate" slot-scope="text">
+      <status :text="text ? text : ''" displayText />
+    </template>
+    <template slot="powerstate" slot-scope="text">
+      <status :text="text ? text : ''" displayText />
+    </template>
+    <template slot="agentstate" slot-scope="text">
+      <status :text="text ? text : ''" displayText />
+    </template>
+    <a slot="guestnetworkname" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/guestnetwork/' + record.guestnetworkid }">{{ text }}</router-link>
+    </a>
+    <a slot="associatednetworkname" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/guestnetwork/' + record.associatednetworkid }">{{ text }}</router-link>
+    </a>
+    <a slot="vpcname" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/vpc/' + record.vpcid }">{{ text }}</router-link>
+    </a>
+    <a slot="hostname" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="record.hostid" :to="{ path: '/host/' + record.hostid }">{{ text }}</router-link>
+      <router-link v-else-if="record.hostname" :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </a>
+    <a slot="storage" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="record.storageid" :to="{ path: '/storagepool/' + record.storageid }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </a>
+
+    <template v-for="(value, name) in thresholdMapping" :slot="name" slot-scope="text, record" href="javascript:;">
+      <span :key="name">
+        <span v-if="record[value.disable]" class="alert-disable-threshold">
+          {{ text }}
+        </span>
+        <span v-else-if="record[value.notification]" class="alert-notification-threshold">
+          {{ text }}
+        </span>
+        <span style="padding: 10%;" v-else>
+          {{ text }}
+        </span>
+      </span>
+    </template>
+
+    <a slot="level" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/event/' + record.id }">{{ text }}</router-link>
+    </a>
+
+    <a slot="clustername" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/cluster/' + record.clusterid }">{{ text }}</router-link>
+    </a>
+    <a slot="podname" slot-scope="text, record" href="javascript:;">
+      <router-link :to="{ path: '/pod/' + record.podid }">{{ text }}</router-link>
+    </a>
+    <span slot="account" slot-scope="text, record">
+      <template v-if="record.owner">
+        <template v-for="(item,idx) in record.owner">
+          <span style="margin-right:5px" :key="idx">
+            <span v-if="$store.getters.userInfo.roletype !== 'User'">
+              <router-link v-if="'user' in item" :to="{ path: '/accountuser', query: { username: item.user, domainid: record.domainid }}">{{ item.account + '(' + item.user + ')' }}</router-link>
+              <router-link v-else :to="{ path: '/account', query: { name: item.account, domainid: record.domainid } }">{{ item.account }}</router-link>
+            </span>
+            <span v-else>{{ item.user ? item.account + '(' + item.user + ')' : item.account }}</span>
+          </span>
+        </template>
+      </template>
+      <template v-if="text && !text.startsWith('PrjAcct-')">
+        <router-link
+          v-if="'quota' in record && $router.resolve(`${$route.path}/${record.account}`) !== '404'"
+          :to="{ path: `${$route.path}/${record.account}`, query: { account: record.account, domainid: record.domainid, quota: true } }">{{ text }}</router-link>
+        <router-link :to="{ path: '/account/' + record.accountid }" v-else-if="record.accountid">{{ text }}</router-link>
+        <router-link :to="{ path: '/account', query: { name: record.account, domainid: record.domainid } }" v-else-if="$store.getters.userInfo.roletype !== 'User'">{{ text }}</router-link>
+        <span v-else>{{ text }}</span>
+      </template>
+    </span>
+    <span slot="domain" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="record.domainid && !record.domainid.toString().includes(',') && $store.getters.userInfo.roletype !== 'User'" :to="{ path: '/domain/' + record.domainid }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </span>
+    <span slot="domainpath" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="record.domainid && !record.domainid.includes(',') && $router.resolve('/domain/' + record.domainid).route.name !== '404'" :to="{ path: '/domain/' + record.domainid }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </span>
+    <a slot="zone" slot-scope="text, record" href="javascript:;">
+      <router-link v-if="record.zoneid && !record.zoneid.includes(',') && $router.resolve('/zone/' + record.zoneid).route.name !== '404'" :to="{ path: '/zone/' + record.zoneid }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </a>
+    <span slot="zonename" slot-scope="text, record">
+      <router-link v-if="$router.resolve('/zone/' + record.zoneid).route.name !== '404'" :to="{ path: '/zone/' + record.zoneid }">{{ text }}</router-link>
+      <span v-else>{{ text }}</span>
+    </span>
+    <a slot="readonly" slot-scope="text, record">
+      <status :text="record.readonly ? 'ReadOnly' : 'ReadWrite'" />
+    </a>
+    <span slot="created" slot-scope="text">
+      {{ $toLocaleDate(text) }}
+    </span>
+    <span slot="sent" slot-scope="text">
+      {{ $toLocaleDate(text) }}
+    </span>
+    <div slot="order" slot-scope="text, record" class="shift-btns">
+      <a-tooltip placement="top">
+        <template slot="title">{{ $t('label.move.to.top') }}</template>
+        <a-button
+          shape="round"
+          @click="moveItemTop(record)"
+          class="shift-btn">
+          <a-icon type="double-left" class="shift-btn shift-btn--rotated" />
+        </a-button>
+      </a-tooltip>
+      <a-tooltip placement="top">
+        <template slot="title">{{ $t('label.move.to.bottom') }}</template>
+        <a-button
+          shape="round"
+          @click="moveItemBottom(record)"
+          class="shift-btn">
+          <a-icon type="double-right" class="shift-btn shift-btn--rotated" />
+        </a-button>
+      </a-tooltip>
+      <a-tooltip placement="top">
+        <template slot="title">{{ $t('label.move.up.row') }}</template>
+        <a-button shape="round" @click="moveItemUp(record)" class="shift-btn">
+          <a-icon type="caret-up" class="shift-btn" />
+        </a-button>
+      </a-tooltip>
+      <a-tooltip placement="top">
+        <template slot="title">{{ $t('label.move.down.row') }}</template>
+        <a-button shape="round" @click="moveItemDown(record)" class="shift-btn">
+          <a-icon type="caret-down" class="shift-btn" />
+        </a-button>
+      </a-tooltip>
+    </div>
+
+    <template slot="value" slot-scope="text, record">
+      <a-input
+        v-if="editableValueKey === record.key"
+        :autoFocus="true"
+        :defaultValue="record.value"
+        :disabled="!('updateConfiguration' in $store.getters.apis)"
+        v-model="editableValue"
+        @keydown.esc="editableValueKey = null"
+        @pressEnter="saveValue(record)">
+      </a-input>
+      <div v-else style="width: 200px; word-break: break-all">
+        {{ text }}
+      </div>
+    </template>
+    <template slot="actions" slot-scope="text, record">
+      <a-button
+        shape="circle"
+        :disabled="!('updateConfiguration' in $store.getters.apis)"
+        v-if="editableValueKey !== record.key"
+        icon="edit"
+        @click="editValue(record)" />
+      <a-button
+        shape="circle"
+        :disabled="!('updateConfiguration' in $store.getters.apis)"
+        @click="saveValue(record)"
+        v-if="editableValueKey === record.key" >
+        <a-icon type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+      </a-button>
+      <a-button
+        shape="circle"
+        size="default"
+        @click="editableValueKey = null"
+        v-if="editableValueKey === record.key" >
+        <a-icon type="close-circle" theme="twoTone" twoToneColor="#f5222d" />
+      </a-button>
+    </template>
+    <template slot="tariffActions" slot-scope="text, record">
+      <a-button
+        shape="circle"
+        v-if="editableValueKey !== record.key"
+        :disabled="!('quotaTariffUpdate' in $store.getters.apis)"
+        icon="edit"
+        @click="editTariffValue(record)" />
+      <slot></slot>
+    </template>
+  </a-table>
+</template>
+
+<script>
+import { api } from '@/api'
+import Console from '@/components/widgets/Console'
+import OsLogo from '@/components/widgets/OsLogo'
+import Status from '@/components/widgets/Status'
+import InfoCard from '@/components/view/InfoCard'
+import QuickView from '@/components/view/QuickView'
+
+export default {
+  name: 'ListView',
+  components: {
+    Console,
+    OsLogo,
+    Status,
+    InfoCard,
+    QuickView
+  },
+  props: {
+    columns: {
+      type: Array,
+      required: true
+    },
+    items: {
+      type: Array,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    actions: {
+      type: Array,
+      default: () => []
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading', 'parentEditTariffAction'],
+  data () {
+    return {
+      selectedRowKeys: [],
+      editableValueKey: null,
+      editableValue: '',
+      thresholdMapping: {
+        cpuused: {
+          notification: 'cputhreshold',
+          disable: 'cpudisablethreshold'
+        },
+        cpuallocated: {
+          notification: 'cpuallocatedthreshold',
+          disable: 'cpuallocateddisablethreshold'
+        },
+        memoryused: {
+          notification: 'memorythreshold',
+          disable: 'memorydisablethreshold'
+        },
+        memoryallocated: {
+          notification: 'memoryallocatedthreshold',
+          disable: 'memoryallocateddisablethreshold'
+        },
+        cpuusedghz: {
+          notification: 'cputhreshold',
+          disable: 'cpudisablethreshold'
+        },
+        cpuallocatedghz: {
+          notification: 'cpuallocatedthreshold',
+          disable: 'cpuallocateddisablethreshold'
+        },
+        memoryusedgb: {
+          notification: 'memorythreshold',
+          disable: 'memorydisablethreshold'
+        },
+        memoryallocatedgb: {
+          notification: 'memoryallocatedthreshold',
+          disable: 'memoryallocateddisablethreshold'
+        },
+        disksizeusedgb: {
+          notification: 'storageusagethreshold',
+          disable: 'storageusagedisablethreshold'
+        },
+        disksizeallocatedgb: {
+          notification: 'storageallocatedthreshold',
+          disable: 'storageallocateddisablethreshold'
+        }
+      }
+    }
+  },
+  computed: {
+    hasSelected () {
+      return this.selectedRowKeys.length > 0
+    }
+  },
+  methods: {
+    quickViewEnabled () {
+      return new RegExp(['/vm', '/kubernetes', '/ssh', '/vmgroup', '/affinitygroup',
+        '/volume', '/snapshot', '/vmsnapshot', '/backup',
+        '/guestnetwork', '/vpc', '/vpncustomergateway',
+        '/template', '/iso',
+        '/project', '/account',
+        '/zone', '/pod', '/cluster', '/host', '/storagepool', '/imagestore', '/systemvm', '/router', '/ilbvm',
+        '/computeoffering', '/systemoffering', '/diskoffering', '/backupoffering', '/networkoffering', '/vpcoffering'].join('|'))
+        .test(this.$route.path)
+    },
+    fetchColumns () {
+      if (this.isOrderUpdatable()) {
+        return this.columns
+      }
+      return this.columns.filter(x => x.dataIndex !== 'order')
+    },
+    getRowClassName (record, index) {
+      if (index % 2 === 0) {
+        return 'light-row'
+      }
+      return 'dark-row'
+    },
+    setSelection (selection) {
+      this.selectedRowKeys = selection
+      this.$emit('selection-change', this.selectedRowKeys)
+    },
+    resetSelection () {
+      this.setSelection([])
+    },
+    onSelectChange (selectedRowKeys, selectedRows) {
+      this.setSelection(selectedRowKeys)
+    },
+    changeProject (project) {
+      this.$store.dispatch('SetProject', project)
+      this.$store.dispatch('ToggleTheme', project.id === undefined ? 'light' : 'dark')
+      this.$message.success(this.$t('message.switch.to') + ' ' + project.name)
+      this.$router.push({ name: 'dashboard' })
+    },
+    saveValue (record) {
+      api('updateConfiguration', {
+        name: record.name,
+        value: this.editableValue
+      }).then(json => {
+        this.editableValueKey = null
+        this.$store.dispatch('RefreshFeatures')
+        this.$message.success(`${this.$t('message.setting.updated')} ${record.name}`)
+        if (json.updateconfigurationresponse &&
+          json.updateconfigurationresponse.configuration &&
+          !json.updateconfigurationresponse.configuration.isdynamic &&
+          ['Admin'].includes(this.$store.getters.userInfo.roletype)) {
+          this.$notification.warning({
+            message: this.$t('label.status'),
+            description: this.$t('message.restart.mgmt.server')
+          })
+        }
+      }).catch(error => {
+        console.error(error)
+        this.$message.error(this.$t('message.error.save.setting'))
+      }).finally(() => {
+        this.$emit('refresh')
+      })
+    },
+    editValue (record) {
+      this.editableValueKey = record.key
+      this.editableValue = record.value
+    },
+    getUpdateApi () {
+      let apiString = ''
+      switch (this.$route.name) {
+        case 'template':
+          apiString = 'updateTemplate'
+          break
+        case 'iso':
+          apiString = 'updateIso'
+          break
+        case 'zone':
+          apiString = 'updateZone'
+          break
+        case 'computeoffering':
+        case 'systemoffering':
+          apiString = 'updateServiceOffering'
+          break
+        case 'diskoffering':
+          apiString = 'updateDiskOffering'
+          break
+        case 'networkoffering':
+          apiString = 'updateNetworkOffering'
+          break
+        case 'vpcoffering':
+          apiString = 'updateVPCOffering'
+          break
+        default:
+          apiString = 'updateTemplate'
+      }
+      return apiString
+    },
+    isOrderUpdatable () {
+      return this.getUpdateApi() in this.$store.getters.apis
+    },
+    handleUpdateOrder (id, index) {
+      this.parentToggleLoading()
+      const apiString = this.getUpdateApi()
+
+      return new Promise((resolve, reject) => {
+        api(apiString, {
+          id,
+          sortKey: index
+        }).then((response) => {
+          resolve(response)
+        }).catch((reason) => {
+          reject(reason)
+        })
+      })
+    },
+    updateOrder (data) {
+      const promises = []
+      data.forEach((item, index) => {
+        promises.push(this.handleUpdateOrder(item.id, index + 1))
+      })
+      Promise.all(promises).catch((reason) => {
+        console.log(reason)
+      }).finally(() => {
+        this.parentToggleLoading()
+        this.parentFetchData()
+      })
+    },
+    moveItemUp (record) {
+      const data = this.items
+      const index = data.findIndex(item => item.id === record.id)
+      if (index === 0) return
+      data.splice(index - 1, 0, data.splice(index, 1)[0])
+      this.updateOrder(data)
+    },
+    moveItemDown (record) {
+      const data = this.items
+      const index = data.findIndex(item => item.id === record.id)
+      if (index === data.length - 1) return
+      data.splice(index + 1, 0, data.splice(index, 1)[0])
+      this.updateOrder(data)
+    },
+    moveItemTop (record) {
+      const data = this.items
+      const index = data.findIndex(item => item.id === record.id)
+      if (index === 0) return
+      data.unshift(data.splice(index, 1)[0])
+      this.updateOrder(data)
+    },
+    moveItemBottom (record) {
+      const data = this.items
+      const index = data.findIndex(item => item.id === record.id)
+      if (index === data.length - 1) return
+      data.push(data.splice(index, 1)[0])
+      this.updateOrder(data)
+    },
+    editTariffValue (record) {
+      this.parentEditTariffAction(true, record)
+    }
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .ant-table-thead {
+  background-color: #f9f9f9;
+}
+
+/deep/ .ant-table-small > .ant-table-content > .ant-table-body {
+  margin: 0;
+}
+
+/deep/ .light-row {
+  background-color: #fff;
+}
+
+/deep/ .dark-row {
+  background-color: #f9f9f9;
+}
+</style>
+
+<style scoped lang="scss">
+  .shift-btns {
+    display: flex;
+  }
+  .shift-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 20px;
+    height: 20px;
+    font-size: 12px;
+
+    &:not(:last-child) {
+      margin-right: 5px;
+    }
+
+    &--rotated {
+      font-size: 10px;
+      transform: rotate(90deg);
+    }
+
+  }
+
+  .alert-notification-threshold {
+    background-color: rgba(255, 231, 175, 0.75);
+    color: #e87900;
+    padding: 10%;
+  }
+
+  .alert-disable-threshold {
+    background-color: rgba(255, 190, 190, 0.75);
+    color: #f50000;
+    padding: 10%;
+  }
+</style>
diff --git a/ui/src/components/view/QuickView.vue b/ui/src/components/view/QuickView.vue
new file mode 100644
index 0000000..05ffe3d
--- /dev/null
+++ b/ui/src/components/view/QuickView.vue
@@ -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.
+
+<template>
+  <a-popover v-if="enabled && actionsExist" triggers="hover" placement="topLeft">
+    <template slot="content">
+      <action-button
+        :size="size"
+        :actions="actions"
+        :dataView="true"
+        :resource="resource"
+        @exec-action="execAction" />
+    </template>
+    <a-button shape="circle" size="small" icon="more" style="float: right; background-color: transparent; border-color: transparent"/>
+  </a-popover>
+</template>
+
+<script>
+import ActionButton from '@/components/view/ActionButton'
+
+export default {
+  name: 'QuickView',
+  components: {
+    ActionButton
+  },
+  props: {
+    actions: {
+      type: Array,
+      default: () => []
+    },
+    enabled: {
+      type: Boolean,
+      default: true
+    },
+    size: {
+      type: String,
+      default: 'default'
+    },
+    resource: {
+      type: Object,
+      default () {
+        return {}
+      }
+    }
+  },
+  watch: {
+    actions (item) {
+      this.actionsExist = this.doActionsExist()
+    }
+  },
+  data () {
+    return {
+      actionsExist: false
+    }
+  },
+  mounted () {
+    this.actionsExist = this.doActionsExist()
+  },
+  methods: {
+    execAction (action) {
+      this.$emit('exec-action', action)
+    },
+    doActionsExist () {
+      return this.actions.filter(x =>
+        x.api in this.$store.getters.apis &&
+        ('show' in x ? x.show(this.resource, this.$store.getters) : true) &&
+        x.dataView).length > 0
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/view/ResourceCountUsage.vue b/ui/src/components/view/ResourceCountUsage.vue
new file mode 100644
index 0000000..4c63179
--- /dev/null
+++ b/ui/src/components/view/ResourceCountUsage.vue
@@ -0,0 +1,108 @@
+// 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>
+  <a-list
+    size="small"
+    :loading="loading"
+    :dataSource="usageList" >
+    <a-list-item slot="renderItem" slot-scope="item" class="list-item" v-if="!($route.meta.name === 'project' && item === 'project')">
+      <div class="list-item__container">
+        <strong>
+          {{ $t('label.' + item + 'limit') }}
+        </strong>
+        ({{ resource[item + 'available'] === '-1' ? $t('label.unlimited') : resource[item + 'available'] }} {{ $t('label.available') }})
+        <div class="list-item__vals">
+          <div class="list-item__data">
+            {{ $t('label.used') }} / {{ $t('label.limit') }} : {{ resource[item + 'total'] }} / {{ resource[item + 'limit'] === '-1' ? $t('label.unlimited') : resource[item + 'limit'] }}
+          </div>
+          <a-progress
+            status="normal"
+            :percent="parseFloat(getPercentUsed(resource[item + 'total'], resource[item + 'limit']))"
+            :format="p => resource[item + 'limit'] !== '-1' && resource[item + 'limit'] !== 'Unlimited' ? p.toFixed(2) + '%' : ''" />
+        </div>
+      </div>
+    </a-list-item>
+  </a-list>
+</template>
+
+<script>
+export default {
+  name: 'ResourceCountUsageTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      usageList: [
+        'vm', 'cpu', 'memory', 'primarystorage', 'volume', 'ip', 'network',
+        'vpc', 'secondarystorage', 'snapshot', 'template', 'project'
+      ]
+    }
+  },
+  watch: {
+    resource (newData, oldData) {
+      if (!newData || !newData.id) {
+        return
+      }
+      this.resource = newData
+    }
+  },
+  methods: {
+    getPercentUsed (total, limit) {
+      return (limit === 'Unlimited') ? 0 : (total / limit) * 100
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .list-item {
+
+    &__container {
+      max-width: 90%;
+      width: 100%;
+
+      @media (min-width: 760px) {
+        max-width: 95%;
+      }
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__data {
+      margin-right: 20px;
+      white-space: nowrap;
+    }
+
+    &__vals {
+      margin-top: 10px;
+      @media (min-width: 760px) {
+        display: flex;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/components/view/ResourceLimitTab.vue b/ui/src/components/view/ResourceLimitTab.vue
new file mode 100644
index 0000000..3a9b41a
--- /dev/null
+++ b/ui/src/components/view/ResourceLimitTab.vue
@@ -0,0 +1,179 @@
+// 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>
+  <a-spin :spinning="formLoading">
+    <a-form
+      :form="form"
+      @submit="handleSubmit"
+      layout="vertical"
+    >
+      <a-form-item
+        v-for="(item, index) in dataResource"
+        :key="index"
+        v-if="item.resourcetypename !== 'project'"
+        :v-bind="item.resourcetypename"
+        :label="$t('label.max' + item.resourcetypename.replace('_', ''))">
+        <a-input-number
+          :disabled="!('updateResourceLimit' in $store.getters.apis)"
+          style="width: 100%;"
+          v-decorator="[item.resourcetype, {
+            initialValue: item.max
+          }]"
+        />
+      </a-form-item>
+      <div class="card-footer">
+        <a-button
+          :disabled="!('updateResourceLimit' in $store.getters.apis)"
+          v-if="!($route.meta.name === 'domain' && resource.level === 0)"
+          :loading="formLoading"
+          type="primary"
+          @click="handleSubmit">{{ $t('label.submit') }}</a-button>
+      </div>
+    </a-form>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'ResourceLimitTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      formLoading: false,
+      dataResource: []
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newData, oldData) {
+      if (!newData || !newData.id) {
+        return
+      }
+      this.resource = newData
+      this.fetchData()
+    }
+  },
+  methods: {
+    getParams () {
+      const params = {}
+      if (this.$route.meta.name === 'account') {
+        params.account = this.resource.name
+        params.domainid = this.resource.domainid
+      } else if (this.$route.meta.name === 'domain') {
+        params.domainid = this.resource.id
+      } else { // project
+        params.projectid = this.resource.id
+      }
+      return params
+    },
+    async fetchData () {
+      const params = this.getParams()
+      try {
+        this.formLoading = true
+        this.dataResource = await this.listResourceLimits(params)
+        this.formLoading = false
+      } catch (e) {
+        this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: e
+        })
+        this.formLoading = false
+      }
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const arrAsync = []
+        const params = this.getParams()
+        for (const key in values) {
+          const input = values[key]
+
+          if (input === undefined) {
+            continue
+          }
+          params.resourcetype = key
+          params.max = input
+          arrAsync.push(this.updateResourceLimit(params))
+        }
+
+        this.formLoading = true
+
+        Promise.all(arrAsync).then(() => {
+          this.$message.success(this.$t('message.apply.success'))
+          this.fetchData()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.formLoading = false
+        })
+      })
+    },
+    listResourceLimits (params) {
+      return new Promise((resolve, reject) => {
+        let dataResource = []
+        api('listResourceLimits', params).then(json => {
+          if (json.listresourcelimitsresponse.resourcelimit) {
+            dataResource = json.listresourcelimitsresponse.resourcelimit
+            dataResource.sort((a, b) => a.resourcetype - b.resourcetype)
+          }
+          resolve(dataResource)
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
+    updateResourceLimit (params) {
+      return new Promise((resolve, reject) => {
+        api('updateResourceLimit', params).then(json => {
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .card-footer {
+    button + button {
+      margin-left: 8px;
+    }
+  }
+</style>
diff --git a/ui/src/components/view/ResourceView.vue b/ui/src/components/view/ResourceView.vue
new file mode 100644
index 0000000..333f582
--- /dev/null
+++ b/ui/src/components/view/ResourceView.vue
@@ -0,0 +1,168 @@
+// 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>
+  <resource-layout>
+    <div slot="left">
+      <slot name="info-card">
+        <info-card :resource="resource" :loading="loading" />
+      </slot>
+    </div>
+    <a-spin :spinning="loading" slot="right">
+      <a-card
+        class="spin-content"
+        :bordered="true"
+        style="width:100%">
+        <component
+          v-if="tabs.length === 1"
+          :is="tabs[0].component"
+          :resource="resource"
+          :loading="loading"
+          :tab="tabs[0].name" />
+        <a-tabs
+          v-else
+          style="width: 100%"
+          :animated="false"
+          :activeKey="activeTab || tabs[0].name"
+          @change="onTabChange" >
+          <a-tab-pane
+            v-for="tab in tabs"
+            :tab="$t('label.' + tab.name)"
+            :key="tab.name"
+            v-if="showTab(tab)">
+            <component :is="tab.component" :resource="resource" :loading="loading" :tab="activeTab" />
+          </a-tab-pane>
+        </a-tabs>
+      </a-card>
+    </a-spin>
+  </resource-layout>
+</template>
+
+<script>
+import DetailsTab from '@/components/view/DetailsTab'
+import InfoCard from '@/components/view/InfoCard'
+import ResourceLayout from '@/layouts/ResourceLayout'
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+
+export default {
+  name: 'ResourceView',
+  components: {
+    InfoCard,
+    ResourceLayout
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    tabs: {
+      type: Array,
+      default: function () {
+        return [{
+          name: 'details',
+          component: DetailsTab
+        }]
+      }
+    }
+  },
+  data () {
+    return {
+      activeTab: '',
+      networkService: null,
+      projectAccount: null
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.resource = newItem
+      if (newItem.id === oldItem.id) return
+
+      if (this.resource.associatednetworkid) {
+        api('listNetworks', { id: this.resource.associatednetworkid, listall: true }).then(response => {
+          if (response && response.listnetworksresponse && response.listnetworksresponse.network) {
+            this.networkService = response.listnetworksresponse.network[0]
+          } else {
+            this.networkService = {}
+          }
+        })
+      }
+    },
+    $route: function (newItem, oldItem) {
+      this.setActiveTab()
+    }
+  },
+  mounted () {
+    this.setActiveTab()
+  },
+  methods: {
+    onTabChange (key) {
+      this.activeTab = key
+      const query = Object.assign({}, this.$route.query)
+      query.tab = key
+      history.replaceState(
+        {},
+        null,
+        '#' + this.$route.path + '?' + Object.keys(query).map(key => {
+          return (
+            encodeURIComponent(key) + '=' + encodeURIComponent(query[key])
+          )
+        }).join('&')
+      )
+    },
+    showTab (tab) {
+      if ('networkServiceFilter' in tab) {
+        if (this.resource && this.resource.virtualmachineid && !this.resource.vpcid && tab.name !== 'firewall') {
+          return false
+        }
+        if (this.resource && this.resource.virtualmachineid && this.resource.vpcid) {
+          return false
+        }
+        // dont display any option for source NAT IP of VPC
+        if (this.resource && this.resource.vpcid && !this.resource.issourcenat && tab.name !== 'firewall') {
+          return true
+        }
+        // display LB and PF options for isolated networks if static nat is disabled
+        if (this.resource && !this.resource.vpcid) {
+          if (!this.resource.isstaticnat) {
+            return true
+          } else if (tab.name === 'firewall') {
+            return true
+          }
+        }
+        return this.networkService && this.networkService.service &&
+          tab.networkServiceFilter(this.networkService.service)
+      } else if ('show' in tab) {
+        return tab.show(this.resource, this.$route, this.$store.getters.userInfo)
+      } else {
+        return true
+      }
+    },
+    setActiveTab () {
+      this.activeTab = this.$route.query.tab ? this.$route.query.tab : this.tabs[0].name
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+</style>
diff --git a/ui/src/components/view/SearchView.vue b/ui/src/components/view/SearchView.vue
new file mode 100644
index 0000000..d7084e5
--- /dev/null
+++ b/ui/src/components/view/SearchView.vue
@@ -0,0 +1,494 @@
+// 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>
+  <span :style="styleSearch">
+    <span v-if="!searchFilters || searchFilters.length === 0" style="display: flex;">
+      <a-input-search
+        style="width: 100%; display: table-cell"
+        :placeholder="$t('label.search')"
+        v-model="searchQuery"
+        allowClear
+        @search="onSearch" />
+    </span>
+
+    <span
+      v-else
+      class="filter-group">
+      <a-input-search
+        allowClear
+        class="input-search"
+        :placeholder="$t('label.search')"
+        v-model="searchQuery"
+        @search="onSearch">
+        <a-popover
+          placement="bottomRight"
+          slot="addonBefore"
+          trigger="click"
+          v-model="visibleFilter">
+          <template slot="content">
+            <a-form
+              style="min-width: 170px"
+              :form="form"
+              layout="vertical"
+              @submit="handleSubmit">
+              <a-form-item
+                v-for="(field, index) in fields"
+                :key="index"
+                :label="field.name==='keyword' ? $t('label.name') : $t('label.' + field.name)">
+                <a-select
+                  allowClear
+                  v-if="field.type==='list'"
+                  v-decorator="[field.name]"
+                  :loading="field.loading">
+                  <a-select-option
+                    v-for="(opt, idx) in field.opts"
+                    :key="idx"
+                    :value="opt.id">{{ $t(opt.name) }}</a-select-option>
+                </a-select>
+                <a-input
+                  v-else-if="field.type==='input'"
+                  v-decorator="[field.name]" />
+                <div v-else-if="field.type==='tag'">
+                  <div>
+                    <a-input-group
+                      type="text"
+                      size="small"
+                      compact>
+                      <a-input ref="input" :value="inputKey" @change="e => inputKey = e.target.value" style="width: 50px; text-align: center" :placeholder="$t('label.key')" />
+                      <a-input style=" width: 20px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled />
+                      <a-input :value="inputValue" @change="handleValueChange" style="width: 50px; text-align: center; border-left: 0" :placeholder="$t('label.value')" />
+                      <a-button shape="circle" size="small" @click="inputKey = inputValue = ''">
+                        <a-icon type="close"/>
+                      </a-button>
+                    </a-input-group>
+                  </div>
+                </div>
+              </a-form-item>
+              <div class="filter-group-button">
+                <a-button
+                  class="filter-group-button-clear"
+                  type="default"
+                  size="small"
+                  icon="stop"
+                  @click="onClear">{{ $t('label.reset') }}</a-button>
+                <a-button
+                  class="filter-group-button-search"
+                  type="primary"
+                  size="small"
+                  icon="search"
+                  html-type="submit"
+                  @click="handleSubmit">{{ $t('label.search') }}</a-button>
+              </div>
+            </a-form>
+          </template>
+          <a-button
+            class="filter-button"
+            size="small"
+            @click="() => { searchQuery = null }">
+            <a-icon type="filter" :theme="Object.keys(searchParams).length > 0 ? 'twoTone' : 'outlined'" />
+          </a-button>
+        </a-popover>
+      </a-input-search>
+    </span>
+  </span>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'SearchView',
+  props: {
+    searchFilters: {
+      type: Array,
+      default: () => []
+    },
+    apiName: {
+      type: String,
+      default: () => ''
+    },
+    searchParams: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  inject: ['parentSearch', 'parentChangeFilter'],
+  data () {
+    return {
+      searchQuery: null,
+      paramsFilter: {},
+      visibleFilter: false,
+      fields: [],
+      inputKey: null,
+      inputValue: null
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  watch: {
+    visibleFilter (newValue, oldValue) {
+      if (newValue) {
+        this.initFormFieldData()
+      }
+    },
+    '$route' (to, from) {
+      this.searchQuery = ''
+      if (to && to.query && 'q' in to.query) {
+        this.searchQuery = to.query.q
+      }
+    }
+  },
+  mounted () {
+    this.searchQuery = ''
+    if (this.$route && this.$route.query && 'q' in this.$route.query) {
+      this.searchQuery = this.$route.query.q
+    }
+  },
+  computed: {
+    styleSearch () {
+      if (!this.searchFilters || this.searchFilters.length === 0) {
+        return {
+          width: '100%',
+          display: 'table-cell'
+        }
+      }
+
+      return {
+        width: '100%',
+        display: 'table-cell',
+        lineHeight: '31px'
+      }
+    }
+  },
+  methods: {
+    async initFormFieldData () {
+      const arrayField = []
+      this.fields = []
+      this.searchFilters.forEach(item => {
+        let type = 'input'
+
+        if (item === 'domainid' && !('listDomains' in this.$store.getters.apis)) {
+          return true
+        }
+        if (item === 'account' && !('addAccountToProject' in this.$store.getters.apis || 'createAccount' in this.$store.getters.apis)) {
+          return true
+        }
+        if (item === 'podid' && !('listPods' in this.$store.getters.apis)) {
+          return true
+        }
+        if (item === 'clusterid' && !('listClusters' in this.$store.getters.apis)) {
+          return true
+        }
+        if (['zoneid', 'domainid', 'state', 'level', 'clusterid', 'podid'].includes(item)) {
+          type = 'list'
+        } else if (item === 'tags') {
+          type = 'tag'
+        }
+
+        this.fields.push({
+          type: type,
+          name: item,
+          opts: [],
+          loading: false
+        })
+        arrayField.push(item)
+      })
+
+      const promises = []
+      let zoneIndex = -1
+      let domainIndex = -1
+      let podIndex = -1
+      let clusterIndex = -1
+
+      if (arrayField.includes('state')) {
+        const stateIndex = this.fields.findIndex(item => item.name === 'state')
+        this.fields[stateIndex].loading = true
+        this.fields[stateIndex].opts = this.fetchState()
+        this.fields[stateIndex].loading = false
+      }
+
+      if (arrayField.includes('level')) {
+        const levelIndex = this.fields.findIndex(item => item.name === 'level')
+        this.fields[levelIndex].loading = true
+        this.fields[levelIndex].opts = this.fetchLevel()
+        this.fields[levelIndex].loading = false
+      }
+
+      if (arrayField.includes('zoneid')) {
+        zoneIndex = this.fields.findIndex(item => item.name === 'zoneid')
+        this.fields[zoneIndex].loading = true
+        promises.push(await this.fetchZones())
+      }
+
+      if (arrayField.includes('domainid')) {
+        domainIndex = this.fields.findIndex(item => item.name === 'domainid')
+        this.fields[domainIndex].loading = true
+        promises.push(await this.fetchDomains())
+      }
+
+      if (arrayField.includes('podid')) {
+        podIndex = this.fields.findIndex(item => item.name === 'podid')
+        this.fields[podIndex].loading = true
+        promises.push(await this.fetchPods())
+      }
+
+      if (arrayField.includes('clusterid')) {
+        clusterIndex = this.fields.findIndex(item => item.name === 'clusterid')
+        this.fields[clusterIndex].loading = true
+        promises.push(await this.fetchClusters())
+      }
+
+      Promise.all(promises).then(response => {
+        if (zoneIndex > -1) {
+          const zones = response.filter(item => item.type === 'zoneid')
+          if (zones && zones.length > 0) {
+            this.fields[zoneIndex].opts = zones[0].data
+          }
+        }
+        if (domainIndex > -1) {
+          const domain = response.filter(item => item.type === 'domainid')
+          if (domain && domain.length > 0) {
+            this.fields[domainIndex].opts = domain[0].data
+          }
+        }
+        if (podIndex > -1) {
+          const pod = response.filter(item => item.type === 'podid')
+          if (pod && pod.length > 0) {
+            this.fields[podIndex].opts = pod[0].data
+          }
+        }
+        if (clusterIndex > -1) {
+          const cluster = response.filter(item => item.type === 'clusterid')
+          console.log(cluster)
+          if (cluster && cluster.length > 0) {
+            this.fields[clusterIndex].opts = cluster[0].data
+          }
+        }
+        this.$forceUpdate()
+      }).finally(() => {
+        if (zoneIndex > -1) {
+          this.fields[zoneIndex].loading = false
+        }
+        if (domainIndex > -1) {
+          this.fields[domainIndex].loading = false
+        }
+        if (podIndex > -1) {
+          this.fields[podIndex].loading = false
+        }
+        if (clusterIndex > -1) {
+          this.fields[clusterIndex].loading = false
+        }
+      })
+    },
+    fetchZones () {
+      return new Promise((resolve, reject) => {
+        api('listZones', { listAll: true }).then(json => {
+          const zones = json.listzonesresponse.zone
+          resolve({
+            type: 'zoneid',
+            data: zones
+          })
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
+    fetchDomains () {
+      return new Promise((resolve, reject) => {
+        api('listDomains', { listAll: true }).then(json => {
+          const domain = json.listdomainsresponse.domain
+          resolve({
+            type: 'domainid',
+            data: domain
+          })
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
+    fetchPods () {
+      return new Promise((resolve, reject) => {
+        api('listPods', { listAll: true }).then(json => {
+          const pods = json.listpodsresponse.pod
+          resolve({
+            type: 'podid',
+            data: pods
+          })
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
+    fetchClusters () {
+      return new Promise((resolve, reject) => {
+        api('listClusters', { listAll: true }).then(json => {
+          const clusters = json.listclustersresponse.cluster
+          resolve({
+            type: 'clusterid',
+            data: clusters
+          })
+        }).catch(error => {
+          reject(error.response.headers['x-description'])
+        })
+      })
+    },
+    fetchState () {
+      const state = []
+      if (this.apiName.indexOf('listVolumes') > -1) {
+        state.push({
+          id: 'Allocated',
+          name: 'label.allocated'
+        })
+        state.push({
+          id: 'Ready',
+          name: 'label.isready'
+        })
+        state.push({
+          id: 'Destroy',
+          name: 'label.destroy'
+        })
+        state.push({
+          id: 'Expunging',
+          name: 'label.expunging'
+        })
+        state.push({
+          id: 'Expunged',
+          name: 'label.expunged'
+        })
+      }
+      return state
+    },
+    fetchLevel () {
+      const levels = []
+      levels.push({
+        id: 'INFO',
+        name: 'label.info.upper'
+      })
+      levels.push({
+        id: 'WARN',
+        name: 'label.warn.upper'
+      })
+      levels.push({
+        id: 'ERROR',
+        name: 'label.error.upper'
+      })
+      return levels
+    },
+    onSearch (value) {
+      this.paramsFilter = {}
+      this.searchQuery = value
+      this.parentSearch({ searchQuery: this.searchQuery })
+    },
+    onClear () {
+      this.searchFilters.map(item => {
+        const field = {}
+        field[item] = undefined
+        this.form.setFieldsValue(field)
+      })
+      this.inputKey = null
+      this.inputValue = null
+      this.searchQuery = null
+      this.paramsFilter = {}
+      this.parentSearch(this.paramsFilter)
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.paramsFilter = {}
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        for (const key in values) {
+          const input = values[key]
+          if (input === '' || input === null || input === undefined) {
+            continue
+          }
+          this.paramsFilter[key] = input
+        }
+        if (this.searchFilters.includes('tags')) {
+          if (this.inputKey) {
+            this.paramsFilter['tags[0].key'] = this.inputKey
+            this.paramsFilter['tags[0].value'] = this.inputValue
+          }
+        }
+        this.parentSearch(this.paramsFilter)
+      })
+    },
+    handleKeyChange (e) {
+      this.inputKey = e.target.value
+    },
+    handleValueChange (e) {
+      this.inputValue = e.target.value
+    },
+    changeFilter (filter) {
+      this.parentChangeFilter(filter)
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.input-search {
+  margin-left: 10px;
+}
+
+.filter-group {
+  /deep/.ant-input-group-addon {
+    padding: 0 5px;
+  }
+
+  &-button {
+    background: inherit;
+    border: 0;
+    padding: 0;
+  }
+
+  &-button {
+    position: relative;
+    display: block;
+    min-height: 25px;
+
+    &-clear {
+      position: absolute;
+      left: 0;
+    }
+
+    &-search {
+      position: absolute;
+      right: 0;
+    }
+  }
+
+  /deep/.ant-input-group {
+    .ant-input-affix-wrapper {
+      width: calc(100% - 10px);
+    }
+  }
+}
+
+.filter-button {
+  background: inherit;
+  border: 0;
+  padding: 0;
+  position: relative;
+  display: block;
+  min-height: 25px;
+  width: 20px;
+}
+</style>
diff --git a/ui/src/components/view/SettingsTab.vue b/ui/src/components/view/SettingsTab.vue
new file mode 100644
index 0000000..5ee0199
--- /dev/null
+++ b/ui/src/components/view/SettingsTab.vue
@@ -0,0 +1,247 @@
+// 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>
+    <a-input-search
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8;"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+
+    <a-list size="large" class="list" :loading="loading || tabLoading">
+      <a-list-item :key="index" v-for="(item, index) in items" class="item">
+        <a-list-item-meta>
+          <span slot="title" style="word-break: break-all">{{ item.name }}</span>
+          <span slot="description" style="word-break: break-all">{{ item.description }}</span>
+        </a-list-item-meta>
+
+        <div class="item__content">
+          <a-input
+            :autoFocus="editableValueKey === index"
+            v-if="editableValueKey === index"
+            class="editable-value value"
+            :defaultValue="item.value"
+            v-model="editableValue"
+            @keydown.esc="editableValueKey = null"
+            @pressEnter="updateData(item)">
+          </a-input>
+          <span v-else class="value">
+            {{ item.value }}
+          </span>
+        </div>
+
+        <div slot="actions" class="action">
+          <a-button
+            shape="circle"
+            :disabled="!('updateConfiguration' in $store.getters.apis)"
+            v-if="editableValueKey !== index"
+            icon="edit"
+            @click="setEditableSetting(item, index)" />
+          <a-button
+            shape="circle"
+            size="default"
+            @click="editableValueKey = null"
+            v-if="editableValueKey === index" >
+            <a-icon type="close-circle" theme="twoTone" twoToneColor="#f5222d" />
+          </a-button>
+          <a-button
+            shape="circle"
+            @click="updateData(item)"
+            v-if="editableValueKey === index" >
+            <a-icon type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+          </a-button>
+        </div>
+      </a-list-item>
+    </a-list>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'SettingsTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      required: true
+    }
+  },
+  data () {
+    return {
+      items: [],
+      scopeKey: '',
+      editableValueKey: null,
+      editableValue: '',
+      tabLoading: false,
+      filter: ''
+    }
+  },
+  beforeMount () {
+    switch (this.$route.meta.name) {
+      case 'account':
+        this.scopeKey = 'accountid'
+        break
+      case 'domain':
+        this.scopeKey = 'domainid'
+        break
+      case 'zone':
+        this.scopeKey = 'zoneid'
+        break
+      case 'cluster':
+        this.scopeKey = 'clusterid'
+        break
+      case 'storagepool':
+        this.scopeKey = 'storageid'
+        break
+      case 'imagestore':
+        this.scopeKey = 'imagestoreuuid'
+        break
+      default:
+        this.scopeKey = ''
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem.id) return
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData (callback) {
+      this.tabLoading = true
+      const params = {
+        [this.scopeKey]: this.resource.id,
+        listAll: true
+      }
+      if (this.filter) {
+        params.keyword = this.filter
+      }
+      api('listConfigurations', params).then(response => {
+        this.items = response.listconfigurationsresponse.configuration
+      }).catch(error => {
+        console.error(error)
+        this.$message.error(this.$t('message.error.loading.setting'))
+      }).finally(() => {
+        this.tabLoading = false
+        if (!callback) return
+        callback()
+      })
+    },
+    updateData (item) {
+      this.tabLoading = true
+      api('updateConfiguration', {
+        [this.scopeKey]: this.resource.id,
+        name: item.name,
+        value: this.editableValue
+      }).then(() => {
+        const message = `${this.$t('label.setting')} ${item.name} ${this.$t('label.update.to')} ${this.editableValue}`
+        this.$message.success(message)
+      }).catch(error => {
+        console.error(error)
+        this.$message.error(this.$t('message.error.save.setting'))
+        this.$notification.error({
+          message: this.$t('label.error'),
+          description: this.$t('message.error.try.save.setting')
+        })
+      }).finally(() => {
+        this.tabLoading = false
+        this.fetchData(() => {
+          this.editableValueKey = null
+        })
+      })
+    },
+    setEditableSetting (item, index) {
+      this.editableValueKey = index
+      this.editableValue = item.value
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .list {
+    clear:both;
+  }
+  .editable-value {
+
+    @media (min-width: 760px) {
+      text-align: right;
+      margin-left: 40px;
+      margin-right: -40px;
+    }
+
+  }
+  .item {
+    display: flex;
+    flex-direction: column;
+    align-items: stretch;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+
+    &__content {
+      width: 100%;
+      display: flex;
+      word-break: break-all;
+
+      @media (min-width: 760px) {
+        width: auto;
+      }
+
+    }
+
+  }
+  .action {
+    margin-top: 20px;
+    margin-left: -12px;
+
+    @media (min-width: 480px) {
+      margin-left: -24px;
+    }
+
+    @media (min-width: 760px) {
+      margin-top: 0;
+      margin-left: 0;
+    }
+
+  }
+
+  .value {
+    margin-top: 20px;
+
+    @media (min-width: 760px) {
+      margin-top: 0;
+    }
+
+  }
+
+</style>
diff --git a/ui/src/components/view/TreeView.vue b/ui/src/components/view/TreeView.vue
new file mode 100644
index 0000000..4c0bcce
--- /dev/null
+++ b/ui/src/components/view/TreeView.vue
@@ -0,0 +1,615 @@
+// 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>
+  <resource-layout>
+    <a-spin :spinning="loading" slot="left">
+      <a-card :bordered="false">
+        <a-input-search
+          size="default"
+          :placeholder="$t('label.search')"
+          v-model="searchQuery"
+          @search="onSearch"
+        >
+          <a-icon slot="prefix" type="search" />
+        </a-input-search>
+        <a-spin :spinning="loadingSearch">
+          <a-tree
+            showLine
+            v-if="treeViewData.length > 0"
+            class="list-tree-view"
+            :treeData="treeViewData"
+            :loadData="onLoadData"
+            :expandAction="false"
+            :showIcon="true"
+            :defaultSelectedKeys="defaultSelected"
+            :checkStrictly="true"
+            @select="onSelect"
+            @expand="onExpand"
+            :defaultExpandedKeys="arrExpand">
+            <a-icon slot="parent" type="folder" />
+            <a-icon slot="leaf" type="block" />
+          </a-tree>
+        </a-spin>
+      </a-card>
+    </a-spin>
+    <a-spin :spinning="detailLoading" slot="right">
+      <a-card
+        class="spin-content"
+        :bordered="true"
+        style="width:100%">
+        <a-tabs
+          style="width: 100%"
+          :animated="false"
+          :defaultActiveKey="tabs[0].name"
+          @change="onTabChange" >
+          <a-tab-pane
+            v-for="tab in tabs"
+            :tab="$t('label.' + tab.name)"
+            :key="tab.name"
+            v-if="checkShowTabDetail(tab)">
+            <component
+              :is="tab.component"
+              :resource="resource"
+              :items="items"
+              :tab="tabActive"
+              :loading="loading"
+              :bordered="false" />
+          </a-tab-pane>
+        </a-tabs>
+      </a-card>
+    </a-spin>
+  </resource-layout>
+</template>
+
+<script>
+import store from '@/store'
+import { api } from '@/api'
+import DetailsTab from '@/components/view/DetailsTab'
+import ResourceView from '@/components/view/ResourceView'
+import ResourceLayout from '@/layouts/ResourceLayout'
+
+export default {
+  name: 'TreeView',
+  components: {
+    ResourceLayout,
+    ResourceView
+  },
+  props: {
+    treeData: {
+      type: Array,
+      required: true
+    },
+    treeSelected: {
+      type: Object,
+      required: true
+    },
+    tabs: {
+      type: Array,
+      default () {
+        return [{
+          name: 'details',
+          component: DetailsTab
+        }]
+      }
+    },
+    loadedKeys: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    actionData: {
+      type: Array,
+      default () {
+        return []
+      }
+    }
+  },
+  data () {
+    return {
+      detailLoading: false,
+      loadingSearch: false,
+      tabActive: 'details',
+      selectedTreeKey: '',
+      resource: {},
+      defaultSelected: [],
+      treeVerticalData: [],
+      treeViewData: [],
+      oldTreeViewData: [],
+      apiList: '',
+      apiChildren: '',
+      apiDetail: '',
+      metaName: '',
+      page: 1,
+      pageSize: 20,
+      items: [],
+      showSetting: false,
+      oldSearchQuery: '',
+      searchQuery: '',
+      arrExpand: [],
+      rootKey: ''
+    }
+  },
+  created: function () {
+    this.metaName = this.$route.meta.name
+    this.apiList = this.$route.meta.permission[0] ? this.$route.meta.permission[0] : ''
+    this.apiChildren = this.$route.meta.permission[1] ? this.$route.meta.permission[1] : ''
+  },
+  watch: {
+    loading () {
+      this.detailLoading = this.loading
+    },
+    treeData () {
+      if (this.oldTreeViewData.length === 0) {
+        this.treeViewData = this.treeData
+        this.treeVerticalData = this.treeData
+      }
+
+      if (this.treeViewData.length > 0) {
+        this.oldTreeViewData = this.treeViewData
+        this.rootKey = this.treeViewData[0].key
+      }
+
+      if (Object.keys(this.resource).length > 0) {
+        const resourceIndex = this.treeVerticalData.findIndex(item => item.id === this.resource.id)
+        if (resourceIndex === -1) {
+          this.$el.querySelector(`[title=${this.resource.parentdomainname}]`).click()
+        }
+      }
+    },
+    treeSelected () {
+      if (Object.keys(this.treeSelected).length === 0) {
+        return
+      }
+
+      if (Object.keys(this.resource).length > 0) {
+        this.selectedTreeKey = this.resource.key
+        this.$emit('change-resource', this.resource)
+
+        // set default expand
+        if (this.defaultSelected.length > 1) {
+          const arrSelected = this.defaultSelected
+          this.defaultSelected = []
+          this.defaultSelected.push(arrSelected[0])
+        }
+
+        return
+      }
+
+      this.resource = this.treeSelected
+      this.resource = this.createResourceData(this.resource)
+      this.selectedTreeKey = this.treeSelected.key
+      this.defaultSelected.push(this.selectedTreeKey)
+
+      // set default expand
+      if (this.defaultSelected.length > 1) {
+        const arrSelected = this.defaultSelected
+        this.defaultSelected = []
+        this.defaultSelected.push(arrSelected[0])
+      }
+    },
+    actionData (newData, oldData) {
+      if (!newData || newData.length === 0) {
+        return
+      }
+
+      this.reloadTreeData(newData)
+    }
+  },
+  methods: {
+    onLoadData (treeNode) {
+      if (this.searchQuery !== '' && treeNode.eventKey !== this.rootKey) {
+        return new Promise(resolve => {
+          resolve()
+        })
+      }
+
+      const params = {
+        listAll: true,
+        id: treeNode.eventKey
+      }
+
+      return new Promise(resolve => {
+        api(this.apiChildren, params).then(json => {
+          const dataResponse = this.getResponseJsonData(json)
+          const dataGenerate = this.generateTreeData(dataResponse)
+          treeNode.dataRef.children = dataGenerate
+
+          if (this.treeVerticalData.length === 0) {
+            this.treeVerticalData = this.treeViewData
+          }
+
+          this.treeViewData = [...this.treeViewData]
+          this.oldTreeViewData = this.treeViewData
+
+          for (let i = 0; i < dataGenerate.length; i++) {
+            const resource = this.treeVerticalData.filter(item => item.id === dataGenerate[i].id)
+
+            if (!resource || resource.length === 0) {
+              this.treeVerticalData.push(dataGenerate[i])
+            } else {
+              this.treeVerticalData.filter((item, index) => {
+                if (item.id === dataGenerate[i].id) {
+                  // replace all value of tree data
+                  Object.keys(dataGenerate[i]).forEach((value, idx) => {
+                    this.$set(this.treeVerticalData[index], value, dataGenerate[i][value])
+                  })
+                }
+              })
+            }
+          }
+
+          resolve()
+        })
+      })
+    },
+    onSelect (selectedKeys, event) {
+      if (!event.selected) {
+        setTimeout(() => { event.node.$refs.selectHandle.click() })
+        return
+      }
+
+      // check item tree selected, set selectedTreeKey
+      if (selectedKeys && selectedKeys[0]) {
+        this.selectedTreeKey = selectedKeys[0]
+      }
+
+      this.getDetailResource(this.selectedTreeKey)
+    },
+    onExpand (treeExpand) {
+      this.arrExpand = treeExpand
+    },
+    onSearch (value) {
+      if (this.searchQuery === '' && this.oldSearchQuery === '') {
+        return
+      }
+
+      this.searchQuery = value
+      this.newTreeData = this.treeViewData
+      this.treeVerticalData = this.newTreeData
+
+      // set parameter for the request
+      const params = {}
+      params.listall = true
+
+      // Check the search query to set params and variables using reset data
+      if (this.searchQuery !== '') {
+        this.oldSearchQuery = this.searchQuery
+        params.keyword = this.searchQuery
+      } else if (this.metaName === 'domain') {
+        this.oldSearchQuery = ''
+        params.id = this.$store.getters.userInfo.domainid
+      }
+
+      this.arrExpand = []
+      this.treeViewData = []
+      this.loadingSearch = true
+
+      api(this.apiList, params).then(json => {
+        const listDomains = this.getResponseJsonData(json)
+        this.treeVerticalData = this.treeVerticalData.concat(listDomains)
+
+        if (!listDomains || listDomains.length === 0) {
+          return
+        }
+
+        if (listDomains[0].id === this.rootKey) {
+          const rootDomain = this.generateTreeData(listDomains)
+          this.treeViewData = rootDomain
+          this.defaultSelected = []
+          this.defaultSelected.push(this.treeViewData[0].key)
+          this.resource = this.treeViewData[0]
+          this.$emit('change-resource', this.resource)
+
+          return
+        }
+
+        this.recursiveTreeData(listDomains)
+
+        if (this.treeViewData && this.treeViewData[0]) {
+          this.defaultSelected = []
+          this.defaultSelected.push(this.treeViewData[0].key)
+          this.resource = this.treeViewData[0]
+          this.$emit('change-resource', this.resource)
+        }
+
+        // check treeViewData, set to expand first children
+        if (this.treeViewData &&
+            this.treeViewData[0] &&
+            this.treeViewData[0].children &&
+            this.treeViewData[0].children.length > 0
+        ) {
+          this.arrExpand.push(this.treeViewData[0].children[0].key)
+        }
+      }).finally(() => {
+        this.loadingSearch = false
+      })
+    },
+    onTabChange (key) {
+      this.tabActive = key
+    },
+    reloadTreeData (objData) {
+      if (objData && objData[0].isDel) {
+        this.treeVerticalData = this.treeVerticalData.filter(item => item.id !== objData[0].id)
+        this.treeVerticalData = this.treeVerticalData.filter(item => item.parentdomainid !== objData[0].id)
+      } else {
+        // data response from action
+        let jsonResponse = this.getResponseJsonData(objData[0])
+        jsonResponse = this.createResourceData(jsonResponse)
+
+        // resource for check create or edit
+        const resource = this.treeVerticalData.filter(item => item.id === jsonResponse.id)
+
+        // when edit
+        if (resource && resource[0]) {
+          this.treeVerticalData.filter((item, index) => {
+            if (item.id === jsonResponse.id) {
+              // replace all value of tree data
+              Object.keys(jsonResponse).forEach((value, idx) => {
+                this.$set(this.treeVerticalData[index], value, jsonResponse[value])
+              })
+            }
+          })
+        } else {
+          // when create
+          let resourceExists = true
+
+          // check is searching data
+          if (this.searchQuery !== '') {
+            resourceExists = jsonResponse.title.indexOf(this.searchQuery) > -1
+          }
+
+          // push new resource to tree data
+          if (this.resource.haschild && resourceExists) {
+            this.treeVerticalData.push(jsonResponse)
+          }
+
+          // set resource is currently active as a parent
+          this.treeVerticalData.filter((item, index) => {
+            if (item.id === this.resource.id) {
+              this.$set(this.treeVerticalData[index], 'isLeaf', false)
+              this.$set(this.treeVerticalData[index], 'haschild', true)
+            }
+          })
+        }
+      }
+      this.recursiveTreeData(this.treeVerticalData)
+    },
+    getDetailResource (selectedKey) {
+      // set api name and parameter
+      const apiName = this.$route.meta.permission[0]
+      const params = {}
+
+      // set id to parameter
+      params.id = selectedKey
+      params.listAll = true
+      params.page = 1
+      params.pageSize = 1
+
+      this.detailLoading = true
+
+      api(apiName, params).then(json => {
+        const jsonResponse = this.getResponseJsonData(json)
+
+        // check json response is empty
+        if (!jsonResponse || jsonResponse.length === 0) {
+          this.resource = []
+        } else {
+          this.resource = jsonResponse[0]
+          this.resource = this.createResourceData(this.resource)
+          // set all value of resource tree data
+          this.treeVerticalData.filter((item, index) => {
+            if (item.id === this.resource.id) {
+              this.treeVerticalData[index] = this.resource
+            }
+          })
+        }
+
+        // emit change resource to parent
+        this.$emit('change-resource', this.resource)
+      }).finally(() => {
+        this.detailLoading = false
+      })
+    },
+    getResponseJsonData (json) {
+      let responseName
+      let objectName
+      let hasJobId = false
+      for (const key in json) {
+        if (key.includes('response')) {
+          for (const res in json[key]) {
+            if (res === 'jobid') {
+              hasJobId = true
+              break
+            }
+          }
+          responseName = key
+          break
+        }
+      }
+
+      for (const key in json[responseName]) {
+        if (key === 'count') {
+          continue
+        }
+
+        objectName = key
+        break
+      }
+      if (hasJobId) {
+        return {}
+      }
+      return json[responseName][objectName]
+    },
+    checkShowTabDetail (tab) {
+      if ('show' in tab) {
+        return tab.show(this.resource, this.$route, store.getters.userInfo)
+      }
+      // get permission from the route
+      const permission = tab.permission ? tab.permission[0] : ''
+
+      // check permission not exists
+      if (!permission || permission === '') {
+        return true
+      }
+
+      // Check the permissions to see the tab for a user
+      if (!Object.prototype.hasOwnProperty.call(store.getters.apis, permission)) {
+        return false
+      }
+
+      return true
+    },
+    generateTreeData (jsonData) {
+      if (!jsonData || jsonData.length === 0) {
+        return []
+      }
+
+      for (let i = 0; i < jsonData.length; i++) {
+        jsonData[i] = this.createResourceData(jsonData[i])
+      }
+
+      return jsonData
+    },
+    createResourceData (resource) {
+      if (!resource || Object.keys(resource) === 0) {
+        return {}
+      }
+
+      Object.keys(resource).forEach((value, idx) => {
+        if (resource[value] === 'Unlimited') {
+          this.$set(resource, value, '-1')
+        }
+      })
+      this.$set(resource, 'title', resource.name)
+      this.$set(resource, 'key', resource.id)
+      resource.slots = {
+        icon: 'parent'
+      }
+
+      if (!resource.haschild) {
+        this.$set(resource, 'isLeaf', true)
+        resource.slots = {
+          icon: 'leaf'
+        }
+      }
+
+      return resource
+    },
+    recursiveTreeData (treeData) {
+      const maxLevel = Math.max.apply(Math, treeData.map((o) => { return o.level }))
+      const items = treeData.filter(item => item.level <= maxLevel)
+      this.treeViewData = this.getNestedChildren(items, 0, maxLevel)
+      this.oldTreeViewData = this.treeViewData
+    },
+    getNestedChildren (dataItems, level, maxLevel, id) {
+      if (level > maxLevel) {
+        return
+      }
+
+      let items = []
+
+      if (!id || id === '') {
+        items = dataItems.filter(item => item.level === level)
+      } else {
+        items = dataItems.filter(item => {
+          let parentKey = ''
+          const arrKeys = Object.keys(item)
+          for (let i = 0; i < arrKeys.length; i++) {
+            if (arrKeys[i].indexOf('parent') > -1 && arrKeys[i].indexOf('id') > -1) {
+              parentKey = arrKeys[i]
+              break
+            }
+          }
+
+          return parentKey ? item[parentKey] === id : item.level === level
+        })
+      }
+
+      if (items.length === 0) {
+        return this.getNestedChildren(dataItems, (level + 1), maxLevel)
+      }
+
+      for (let i = 0; i < items.length; i++) {
+        items[i] = this.createResourceData(items[i])
+
+        if (items[i].haschild) {
+          items[i].children = this.getNestedChildren(dataItems, (level + 1), maxLevel, items[i].key)
+        }
+      }
+
+      return items
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.list-tree-view {
+  overflow-y: hidden;
+}
+/deep/.ant-tree.ant-tree-directory {
+  li.ant-tree-treenode-selected {
+    span.ant-tree-switcher {
+      color: rgba(0, 0, 0, 0.65);
+    }
+    span.ant-tree-node-content-wrapper.ant-tree-node-selected > span {
+      color: rgba(0, 0, 0, 0.65);
+      background-color: #bae7ff;
+    }
+    span.ant-tree-node-content-wrapper::before {
+      background: #ffffff;
+    }
+  }
+
+  .ant-tree-child-tree {
+    li.ant-tree-treenode-selected {
+      span.ant-tree-switcher {
+        color: rgba(0, 0, 0, 0.65);
+      }
+      span.ant-tree-node-content-wrapper::before {
+        background: #ffffff;
+      }
+    }
+  }
+}
+
+/deep/.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop {
+  display: none;
+}
+
+/deep/.ant-tree-node-content-wrapper-open > span:first-child,
+/deep/.ant-tree-node-content-wrapper-close > span:first-child {
+  display: none;
+}
+
+/deep/.ant-tree-icon__customize {
+  color: rgba(0, 0, 0, 0.45);
+  background: #fff;
+  padding-right: 5px;
+}
+
+/deep/.ant-tree li .ant-tree-node-content-wrapper {
+  padding-left: 0;
+  margin-left: 3px;
+}
+</style>
diff --git a/ui/src/components/view/VmwareData.vue b/ui/src/components/view/VmwareData.vue
new file mode 100644
index 0000000..b5144c1
--- /dev/null
+++ b/ui/src/components/view/VmwareData.vue
@@ -0,0 +1,79 @@
+// 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>
+  <a-list-item v-if="vmwaredc">
+    <div>
+      <div style="margin-bottom: 10px;">
+        <div><strong>{{ $t('label.vmwaredcname') }}</strong></div>
+        <div>{{ vmwaredc.name }}</div>
+      </div>
+      <div style="margin-bottom: 10px;">
+        <div><strong>{{ $t('label.vmwaredcvcenter') }}</strong></div>
+        <div>{{ vmwaredc.vcenter }}</div>
+      </div>
+      <div style="margin-bottom: 10px;">
+        <div><strong>{{ $t('label.vmwaredcid') }}</strong></div>
+        <div>{{ vmwaredc.id }}</div>
+      </div>
+    </div>
+  </a-list-item>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      vmwaredc: null
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (this.resource && this.resource.id && newItem && newItem.id !== oldItem.id) {
+        this.fetchData()
+      }
+    }
+  },
+  created () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (!this.resource.id) return
+      this.$set(this.resource, 'vmwaredc', null)
+      api('listVmwareDcs', {
+        zoneid: this.resource.id
+      }).then(response => {
+        if (response.listvmwaredcsresponse.VMwareDC && response.listvmwaredcsresponse.VMwareDC.length > 0) {
+          this.vmwaredc = response.listvmwaredcsresponse.VMwareDC[0]
+        }
+        this.$set(this.resource, 'vmwaredc', this.vmwaredc)
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/widgets/Breadcrumb.vue b/ui/src/components/widgets/Breadcrumb.vue
new file mode 100644
index 0000000..fdcb304
--- /dev/null
+++ b/ui/src/components/widgets/Breadcrumb.vue
@@ -0,0 +1,113 @@
+// 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>
+  <a-breadcrumb class="breadcrumb">
+    <a-breadcrumb-item v-for="(item, index) in breadList" :key="index">
+      <router-link
+        v-if="item && item.name"
+        :to="{ path: item.path === '' ? '/' : item.path }"
+      >
+        <a-icon v-if="index == 0" :type="item.meta.icon" style="font-size: 16px" @click="resetToMainView" />
+        {{ $t(item.meta.title) }}
+      </router-link>
+      <span v-else-if="$route.params.id">
+        <label v-if="'name' in resource">
+          <span v-if="['USER.LOGIN', 'USER.LOGOUT', 'ROUTER.HEALTH.CHECKS', 'FIREWALL.CLOSE', 'ALERT.SERVICE.DOMAINROUTER'].includes(resource.name)">{{ $t(resource.name.toLowerCase()) }}</span>
+          <span v-else>{{ resource.name }}</span>
+        </label>
+        <label v-else>
+          {{ resource.name || resource.displayname || resource.displaytext || resource.hostname || resource.username || resource.ipaddress || $route.params.id }}
+        </label>
+      </span>
+      <span v-else>
+        {{ $t(item.meta.title) }}
+      </span>
+      <span v-if="index === (breadList.length - 1)" style="margin-left: 5px">
+        <a-tooltip placement="bottom">
+          <template slot="title">
+            {{ $t('label.open.documentation') }}
+          </template>
+          <a
+            v-if="item.meta.docHelp"
+            style="margin-right: 12px"
+            :href="$config.docBase + '/' + $route.meta.docHelp"
+            target="_blank">
+            <a-icon type="question-circle-o"></a-icon>
+          </a>
+        </a-tooltip>
+        <slot name="end">
+        </slot>
+      </span>
+    </a-breadcrumb-item>
+  </a-breadcrumb>
+</template>
+
+<script>
+
+export default {
+  name: 'Breadcrumb',
+  props: {
+    resource: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      name: '',
+      breadList: []
+    }
+  },
+  created () {
+    this.getBreadcrumb()
+  },
+  watch: {
+    $route () {
+      this.getBreadcrumb()
+    }
+  },
+  methods: {
+    getBreadcrumb () {
+      this.name = this.$route.name
+      this.breadList = []
+      this.$route.matched.forEach((item) => {
+        if (item && item.parent && item.parent.name !== 'index' && !item.path.endsWith(':id')) {
+          this.breadList.pop()
+        }
+        this.breadList.push(item)
+      })
+    },
+    resetToMainView () {
+      this.$store.dispatch('SetProject', {})
+      this.$store.dispatch('ToggleTheme', 'light')
+    }
+  }
+}
+</script>
+
+<style>
+.ant-breadcrumb {
+  vertical-align: text-bottom;
+}
+
+.ant-breadcrumb .anticon {
+  vertical-align: text-bottom;
+}
+</style>
diff --git a/ui/src/components/widgets/ChartCard.vue b/ui/src/components/widgets/ChartCard.vue
new file mode 100644
index 0000000..8d5e413
--- /dev/null
+++ b/ui/src/components/widgets/ChartCard.vue
@@ -0,0 +1,137 @@
+// 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>
+  <a-card :loading="loading" :body-style="{ padding: '20px 24px 8px' }" :bordered="false">
+    <div class="chart-card-header">
+      <div class="chart-card-meta">
+        <span class="chart-card-title">
+          <slot name="title">
+            {{ title }}
+          </slot>
+        </span>
+        <span class="chart-card-action">
+          <slot name="action"></slot>
+        </span>
+      </div>
+      <div class="chart-card-total">
+        <slot name="total">
+          <span>{{ typeof total === 'function' && total() || total }}</span>
+        </slot>
+      </div>
+    </div>
+    <div class="chart-card-content">
+      <div class="chart-card-content-fix">
+        <slot></slot>
+      </div>
+    </div>
+    <div class="chart-card-footer">
+      <div class="chart-card-field">
+        <slot name="footer"></slot>
+      </div>
+    </div>
+  </a-card>
+</template>
+
+<script>
+export default {
+  name: 'ChartCard',
+  props: {
+    title: {
+      type: String,
+      default: ''
+    },
+    total: {
+      type: [Function, Number, String],
+      required: false,
+      default: null
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.chart-card {
+  &-header {
+    position: relative;
+    overflow: hidden;
+    width: 100%;
+  }
+
+  &-meta {
+    position: relative;
+    overflow: hidden;
+    width: 100%;
+    color: rgba(0, 0, 0, .45);
+    font-size: 14px;
+    line-height: 22px;
+  }
+
+  &-action {
+    cursor: pointer;
+    position: absolute;
+    top: 0;
+    right: 0;
+  }
+
+  &-footer {
+    border-top: 1px solid #e8e8e8;
+    padding-top: 9px;
+    margin-top: 8px;
+  }
+
+  &-field {
+    position: relative;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    margin: 0;
+  }
+
+  &-content {
+    margin-top: -42px;
+    margin-bottom: 12px;
+    position: relative;
+    height: 100%;
+    width: 100%;
+  }
+
+  &-content-fix {
+      position: relative;
+    left: 0;
+    bottom: 0;
+    width: 100%;
+  }
+
+  &-total {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+    color: #000;
+    margin-top: 4px;
+    margin-bottom: 0;
+    font-size: 30px;
+    line-height: 38px;
+    height: 38px;
+  }
+}
+</style>
diff --git a/ui/src/components/widgets/Console.vue b/ui/src/components/widgets/Console.vue
new file mode 100644
index 0000000..3064d8f
--- /dev/null
+++ b/ui/src/components/widgets/Console.vue
@@ -0,0 +1,43 @@
+// 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>
+  <a
+    v-if="['vm', 'systemvm', 'router', 'ilbvm'].includes($route.meta.name) && 'updateVirtualMachine' in $store.getters.apis"
+    :href="'/client/console?cmd=access&vm=' + resource.id"
+    target="_blank">
+    <a-button style="margin-left: 5px" shape="circle" type="dashed" :size="size" :disabled="['Stopped', 'Error', 'Destroyed'].includes(resource.state)" >
+      <a-icon type="code" />
+    </a-button>
+  </a>
+</template>
+
+<script>
+export default {
+  name: 'Console',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    size: {
+      type: String,
+      default: 'small'
+    }
+  }
+}
+</script>
diff --git a/ui/src/components/widgets/OsLogo.vue b/ui/src/components/widgets/OsLogo.vue
new file mode 100644
index 0000000..edbb3a4
--- /dev/null
+++ b/ui/src/components/widgets/OsLogo.vue
@@ -0,0 +1,127 @@
+// 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>
+  <a-tooltip placement="bottom">
+    <template slot="title">
+      {{ name }}
+    </template>
+    <font-awesome-icon :icon="['fab', logo]" :size="size" style="color: #666;" v-if="logo !== 'debian'" />
+    <debian-icon v-else-if="logo === 'debian'" :style="{ height: size === '4x' ? '56px' : '16px', width: size === '4x' ? '56px' : '16px', marginBottom: '-4px' }" />
+  </a-tooltip>
+</template>
+
+<script>
+import { api } from '@/api'
+import DebianIcon from '@/assets/icons/debian.svg?inline'
+
+export default {
+  name: 'OsLogo',
+  components: {
+    DebianIcon
+  },
+  props: {
+    osId: {
+      type: String,
+      default: ''
+    },
+    osName: {
+      type: String,
+      default: ''
+    },
+    size: {
+      type: String,
+      default: 'lg'
+    }
+  },
+  data () {
+    return {
+      name: '',
+      osLogo: 'linux'
+    }
+  },
+  computed: {
+    logo: function () {
+      if (!this.name) {
+        this.fetchData()
+      }
+      return this.osLogo
+    }
+  },
+  watch: {
+    osId: function (newItem, oldItem) {
+      this.osId = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      if (this.osName) {
+        this.discoverOsLogo(this.osName)
+      } else if (this.osId) {
+        this.findOsName(this.osId)
+      }
+    },
+    findOsName (osId) {
+      if (!('listOsTypes' in this.$store.getters.apis)) {
+        return
+      }
+      this.name = 'linux'
+      api('listOsTypes', { id: osId }).then(json => {
+        if (json && json.listostypesresponse && json.listostypesresponse.ostype && json.listostypesresponse.ostype.length > 0) {
+          this.discoverOsLogo(json.listostypesresponse.ostype[0].description)
+        } else {
+          this.discoverOsLogo('Linux')
+        }
+      })
+    },
+    discoverOsLogo (name) {
+      this.name = name
+      const osname = name.toLowerCase()
+      if (osname.includes('centos')) {
+        this.osLogo = 'centos'
+      } else if (osname.includes('debian')) {
+        this.osLogo = 'debian'
+      } else if (osname.includes('ubuntu')) {
+        this.osLogo = 'ubuntu'
+      } else if (osname.includes('suse')) {
+        this.osLogo = 'suse'
+      } else if (osname.includes('redhat')) {
+        this.osLogo = 'redhat'
+      } else if (osname.includes('fedora')) {
+        this.osLogo = 'fedora'
+      } else if (osname.includes('linux')) {
+        this.osLogo = 'linux'
+      } else if (osname.includes('bsd')) {
+        this.osLogo = 'freebsd'
+      } else if (osname.includes('apple')) {
+        this.osLogo = 'apple'
+      } else if (osname.includes('window') || osname.includes('dos')) {
+        this.osLogo = 'windows'
+      } else if (osname.includes('oracle')) {
+        this.osLogo = 'java'
+      } else {
+        this.osLogo = 'linux'
+      }
+      this.$emit('update-osname', this.name)
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/components/widgets/Status.vue b/ui/src/components/widgets/Status.vue
new file mode 100644
index 0000000..fa8fe1a
--- /dev/null
+++ b/ui/src/components/widgets/Status.vue
@@ -0,0 +1,173 @@
+// 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>
+  <a-tooltip placement="bottom" :title="$t(getTooltip(text))">
+    <a-badge
+      style="display: inline-flex"
+      :title="text"
+      :color="getStatusColor(text)"
+      :status="getBadgeStatus(text)"
+      :text="getText()" />
+  </a-tooltip>
+</template>
+
+<script>
+
+export default {
+  name: 'Status',
+  props: {
+    text: {
+      type: String,
+      required: true
+    },
+    displayText: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    getText () {
+      if (this.displayText && this.text) {
+        var state = this.text
+        switch (state) {
+          case 'Running':
+            state = this.$t('state.running')
+            break
+          case 'Stopped':
+            state = this.$t('state.stopped')
+            break
+          case 'Starting':
+            state = this.$t('state.starting')
+            break
+          case 'Stopping':
+            state = this.$t('state.stopping')
+            break
+          case 'Suspended':
+            state = this.$t('state.suspended')
+            break
+          case 'Pending':
+            state = this.$t('state.pending')
+            break
+          case 'Migrating':
+            state = this.$t('state.migrating')
+            break
+          case 'Expunging':
+            state = this.$t('state.expunging')
+            break
+          case 'Error':
+            state = this.$t('state.error')
+            break
+        }
+        return state.charAt(0).toUpperCase() + state.slice(1)
+      }
+      return ''
+    },
+    getBadgeStatus (state) {
+      var status = 'default'
+      switch (state) {
+        case 'Active':
+        case 'BackedUp':
+        case 'Completed':
+        case 'Connected':
+        case 'Download Complete':
+        case 'Enabled':
+        case 'Implemented':
+        case 'Ready':
+        case 'Running':
+        case 'Setup':
+        case 'Started':
+        case 'Successfully Installed':
+        case 'ReadWrite':
+        case 'True':
+        case 'Up':
+        case 'enabled':
+          status = 'success'
+          break
+        case 'Alert':
+        case 'Declined':
+        case 'Disabled':
+        case 'Disconnected':
+        case 'Down':
+        case 'Error':
+        case 'False':
+        case 'Stopped':
+        case 'ReadOnly':
+          status = 'error'
+          break
+        case 'Migrating':
+        case 'Scaling':
+        case 'Starting':
+        case 'Stopping':
+        case 'Upgrading':
+          status = 'processing'
+          break
+        case 'Allocated':
+          if (this.$route.path.startsWith('/publicip')) {
+            status = 'success'
+          } else {
+            status = 'warning'
+          }
+          break
+        case 'Created':
+        case 'Maintenance':
+        case 'Pending':
+          status = 'warning'
+          break
+      }
+      return status
+    },
+    getStatusColor (state) {
+      if (state === 'Scheduled') {
+        return 'blue'
+      }
+
+      return null
+    },
+    getTooltip (state) {
+      if (!(state && this.displayText)) {
+        return
+      }
+      if (this.$route.path === '/vmsnapshot' || this.$route.path.includes('/vmsnapshot/')) {
+        return 'message.vmsnapshot.state.' + state.toLowerCase()
+      }
+      if (this.$route.path === '/vm' || this.$route.path.includes('/vm/')) {
+        return 'message.vm.state.' + state.toLowerCase()
+      }
+      if (this.$route.path === '/volume' || this.$route.path.includes('/volume/')) {
+        return 'message.volume.state.' + state.toLowerCase()
+      }
+      if (this.$route.path === '/guestnetwork' || this.$route.path.includes('/guestnetwork/')) {
+        return 'message.guestnetwork.state.' + state.toLowerCase()
+      }
+      if (this.$route.path === '/publicip' || this.$route.path.includes('/publicip/')) {
+        return 'message.publicip.state.' + state.toLowerCase()
+      }
+      // Nothing for snapshots, vpcs, gateways, vnpnconn, vpnuser, kubectl, event, project, account, infra. They're all self explanatory
+      return state
+    }
+  }
+}
+</script>
+
+<style scoped>
+/deep/ .ant-badge-status-dot {
+  width: 12px;
+  height: 12px;
+  margin-top: 5px;
+}
+</style>
diff --git a/ui/src/config/eventBus.js b/ui/src/config/eventBus.js
new file mode 100644
index 0000000..ed61648
--- /dev/null
+++ b/ui/src/config/eventBus.js
@@ -0,0 +1,19 @@
+// 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 Vue from 'vue'
+export default new Vue()
diff --git a/ui/src/config/router.js b/ui/src/config/router.js
new file mode 100644
index 0000000..43a2da5
--- /dev/null
+++ b/ui/src/config/router.js
@@ -0,0 +1,308 @@
+// 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.
+
+// eslint-disable-next-line
+import { UserLayout, BasicLayout, RouteView, BlankLayout, PageView } from '@/layouts'
+import AutogenView from '@/views/AutogenView.vue'
+import IFramePlugin from '@/views/plugins/IFramePlugin.vue'
+import Vue from 'vue'
+
+import compute from '@/config/section/compute'
+import storage from '@/config/section/storage'
+import network from '@/config/section/network'
+import image from '@/config/section/image'
+import project from '@/config/section/project'
+import event from '@/config/section/event'
+import user from '@/config/section/user'
+import account from '@/config/section/account'
+import domain from '@/config/section/domain'
+import role from '@/config/section/role'
+import infra from '@/config/section/infra'
+import offering from '@/config/section/offering'
+import config from '@/config/section/config'
+import quota from '@/config/section/plugin/quota'
+import cloudian from '@/config/section/plugin/cloudian'
+
+function generateRouterMap (section) {
+  var map = {
+    name: section.name,
+    path: '/' + section.name,
+    hidden: section.hidden,
+    meta: { title: section.title, icon: section.icon, docHelp: section.docHelp, searchFilters: section.searchFilters },
+    component: RouteView
+  }
+
+  if (section.children && section.children.length > 0) {
+    map.redirect = '/' + section.children[0].name
+    map.meta.permission = section.children[0].permission
+    map.children = []
+    for (const child of section.children) {
+      if ('show' in child && !child.show()) {
+        continue
+      }
+      var component = child.component ? child.component : AutogenView
+      var route = {
+        name: child.name,
+        path: '/' + child.name,
+        hidden: child.hidden,
+        meta: {
+          title: child.title,
+          name: child.name,
+          icon: child.icon,
+          docHelp: child.docHelp,
+          permission: child.permission,
+          resourceType: child.resourceType,
+          filters: child.filters,
+          params: child.params ? child.params : {},
+          columns: child.columns,
+          details: child.details,
+          searchFilters: child.searchFilters,
+          related: child.related,
+          actions: child.actions,
+          tabs: child.tabs
+        },
+        component: component,
+        hideChildrenInMenu: true,
+        children: [
+          {
+            path: '/' + child.name + '/:id',
+            hidden: child.hidden,
+            meta: {
+              title: child.title,
+              name: child.name,
+              icon: child.icon,
+              docHelp: child.docHelp,
+              permission: child.permission,
+              resourceType: child.resourceType,
+              params: child.params ? child.params : {},
+              details: child.details,
+              searchFilters: child.searchFilters,
+              related: child.related,
+              tabs: child.tabs,
+              actions: child.actions ? child.actions : []
+            },
+            component: component
+          }
+        ]
+      }
+      if (child.actions) {
+        child.actions.forEach(function (action) {
+          if (!action.component || !action.api) {
+            return
+          }
+          map.children.push({
+            name: action.api,
+            icon: child.icon,
+            hidden: true,
+            path: '/action/' + action.api,
+            meta: {
+              title: child.title,
+              name: child.name,
+              permission: [action.api]
+            },
+            component: action.component
+          })
+        })
+      }
+      map.children.push(route)
+    }
+  } else {
+    map.component = section.component ? section.component : AutogenView
+    map.hideChildrenInMenu = true
+
+    map.meta.name = section.name
+    map.meta.permission = section.permission
+    map.meta.resourceType = section.resourceType
+    map.meta.details = section.details
+    map.meta.actions = section.actions
+    map.meta.filters = section.filters
+    map.meta.treeView = section.treeView ? section.treeView : false
+    map.meta.tabs = section.treeView ? section.tabs : {}
+
+    map.children = [{
+      path: '/' + section.name + '/:id',
+      actions: section.actions ? section.actions : [],
+      meta: {
+        title: section.title,
+        name: section.name,
+        icon: section.icon,
+        docHelp: section.docHelp,
+        hidden: section.hidden,
+        permission: section.permission,
+        resourceType: section.resourceType,
+        params: section.params ? section.params : {},
+        details: section.details,
+        related: section.related,
+        searchFilters: section.searchFilters,
+        tabs: section.tabs,
+        actions: section.actions ? section.actions : []
+      },
+      component: section.component ? section.component : AutogenView
+    }]
+  }
+
+  if (section.component) {
+    map.component = section.component
+  }
+
+  if (section.permission) {
+    map.meta.permission = section.permission
+  }
+
+  if (section.columns) {
+    map.meta.columns = section.columns
+  }
+
+  if (section.actions) {
+    map.meta.actions = section.actions
+  }
+
+  return map
+}
+
+export function asyncRouterMap () {
+  const routerMap = [{
+    path: '/',
+    name: 'index',
+    component: BasicLayout,
+    meta: { icon: 'home' },
+    redirect: '/dashboard',
+    children: [
+      {
+        path: '/dashboard',
+        name: 'dashboard',
+        meta: {
+          title: 'label.dashboard',
+          icon: 'dashboard',
+          tabs: [
+            {
+              name: 'dashboard',
+              component: () => import('@/views/dashboard/UsageDashboardChart')
+            },
+            {
+              name: 'accounts',
+              show: (record, route, user) => { return record.account === user.account || ['Admin', 'DomainAdmin'].includes(user.roletype) },
+              component: () => import('@/views/project/AccountsTab')
+            },
+            {
+              name: 'limits',
+              params: {
+                projectid: 'id'
+              },
+              show: (record, route, user) => { return ['Admin'].includes(user.roletype) },
+              component: () => import('@/components/view/ResourceLimitTab.vue')
+            }
+          ]
+        },
+        component: () => import('@/views/dashboard/Dashboard')
+      },
+
+      generateRouterMap(compute),
+      generateRouterMap(storage),
+      generateRouterMap(network),
+      generateRouterMap(image),
+      generateRouterMap(event),
+      generateRouterMap(project),
+      generateRouterMap(user),
+      generateRouterMap(role),
+      generateRouterMap(account),
+      generateRouterMap(domain),
+      generateRouterMap(infra),
+      generateRouterMap(offering),
+      generateRouterMap(config),
+      generateRouterMap(quota),
+      generateRouterMap(cloudian),
+
+      {
+        path: '/exception',
+        name: 'exception',
+        component: RouteView,
+        hidden: true,
+        redirect: '/exception/404',
+        meta: { title: 'Exception', icon: 'warning' },
+        children: [
+          {
+            path: '/exception/403',
+            name: '403',
+            hidden: true,
+            component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/403'),
+            meta: { title: '403' }
+          },
+          {
+            path: '/exception/404',
+            name: '404',
+            hidden: true,
+            component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404'),
+            meta: { title: '404' }
+          },
+          {
+            path: '/exception/500',
+            name: '500',
+            hidden: true,
+            component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/500'),
+            meta: { title: '500' }
+          }
+        ]
+      }
+    ]
+  },
+  {
+    path: '*', redirect: '/exception/404', hidden: true
+  }]
+
+  const plugins = Vue.prototype.$config.plugins
+  if (plugins && plugins.length > 0) {
+    plugins.map(plugin => {
+      routerMap[0].children.push({
+        path: '/plugins/' + plugin.name,
+        name: plugin.name,
+        component: IFramePlugin,
+        meta: { title: plugin.name, icon: plugin.icon, path: plugin.path }
+      })
+    })
+  }
+
+  return routerMap
+}
+
+export const constantRouterMap = [
+  {
+    path: '/user',
+    component: UserLayout,
+    redirect: '/user/login',
+    hidden: true,
+    children: [
+      {
+        path: 'login',
+        name: 'login',
+        component: () => import(/* webpackChunkName: "auth" */ '@/views/auth/Login')
+      }
+    ]
+  },
+  {
+    path: '/403',
+    component: () => import(/* webpackChunkName: "forbidden" */ '@/views/exception/403')
+  },
+  {
+    path: '/404',
+    component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
+  },
+  {
+    path: '/500',
+    component: () => import(/* webpackChunkName: "error" */ '@/views/exception/500')
+  }
+]
diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js
new file mode 100644
index 0000000..1fce57a
--- /dev/null
+++ b/ui/src/config/section/account.js
@@ -0,0 +1,186 @@
+// 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.
+
+export default {
+  name: 'account',
+  title: 'label.accounts',
+  icon: 'team',
+  docHelp: 'adminguide/accounts.html',
+  permission: ['listAccounts'],
+  columns: ['name', 'state', 'rolename', 'roletype', 'domainpath'],
+  details: ['name', 'id', 'rolename', 'roletype', 'domainpath', 'networkdomain', 'iptotal', 'vmtotal', 'volumetotal', 'receivedbytes', 'sentbytes'],
+  related: [{
+    name: 'accountuser',
+    title: 'label.users',
+    param: 'account'
+  }],
+  tabs: [
+    {
+      name: 'details',
+      component: () => import('@/components/view/DetailsTab.vue')
+    },
+    {
+      name: 'resources',
+      component: () => import('@/components/view/ResourceCountUsage.vue')
+    },
+    {
+      name: 'limits',
+      show: (record, route, user) => { return ['Admin'].includes(user.roletype) },
+      component: () => import('@/components/view/ResourceLimitTab.vue')
+    },
+    {
+      name: 'certificate',
+      component: () => import('@/views/iam/SSLCertificateTab.vue')
+    },
+    {
+      name: 'settings',
+      component: () => import('@/components/view/SettingsTab.vue'),
+      show: (record, route, user) => { return ['Admin'].includes(user.roletype) }
+    }
+  ],
+  actions: [
+    {
+      api: 'createAccount',
+      icon: 'plus',
+      label: 'label.add.account',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/iam/AddAccount.vue')
+    },
+    {
+      api: 'ldapCreateAccount',
+      icon: 'user-add',
+      label: 'label.add.ldap.account',
+      docHelp: 'adminguide/accounts.html#using-an-ldap-server-for-user-authentication',
+      listView: true,
+      popup: true,
+      show: (record, store) => {
+        return store.isLdapEnabled
+      },
+      component: () => import('@/views/iam/AddLdapAccount.vue')
+    },
+    {
+      api: 'updateAccount',
+      icon: 'edit',
+      label: 'label.action.edit.account',
+      dataView: true,
+      args: ['newname', 'account', 'domainid', 'networkdomain'],
+      mapping: {
+        account: {
+          value: (record) => { return record.name }
+        },
+        domainid: {
+          value: (record) => { return record.domainid }
+        }
+      }
+    },
+    {
+      api: 'updateResourceCount',
+      icon: 'sync',
+      label: 'label.action.update.resource.count',
+      message: 'message.update.resource.count',
+      dataView: true,
+      show: (record, store) => { return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) },
+      args: ['account', 'domainid'],
+      mapping: {
+        account: {
+          value: (record) => { return record.name }
+        },
+        domainid: {
+          value: (record) => { return record.domainid }
+        }
+      }
+    },
+    {
+      api: 'enableAccount',
+      icon: 'play-circle',
+      label: 'label.action.enable.account',
+      message: 'message.enable.account',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1) &&
+          (record.state === 'disabled' || record.state === 'locked')
+      },
+      params: { lock: 'false' }
+    },
+    {
+      api: 'disableAccount',
+      icon: 'pause-circle',
+      label: 'label.action.disable.account',
+      message: 'message.disable.account',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1) &&
+          record.state === 'enabled'
+      },
+      args: ['lock'],
+      mapping: {
+        lock: {
+          value: (record) => { return false }
+        }
+      }
+    },
+    {
+      api: 'disableAccount',
+      icon: 'lock',
+      label: 'label.action.lock.account',
+      message: 'message.lock.account',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1) &&
+          record.state === 'enabled'
+      },
+      args: ['lock'],
+      mapping: {
+        lock: {
+          value: (record) => { return true }
+        }
+      }
+    },
+    {
+      api: 'uploadSslCert',
+      icon: 'safety-certificate',
+      label: 'label.add.certificate',
+      dataView: true,
+      args: ['name', 'certificate', 'privatekey', 'certchain', 'password', 'account', 'domainid'],
+      post: true,
+      show: (record) => { return record.state === 'enabled' },
+      mapping: {
+        account: {
+          value: (record) => { return record.name }
+        },
+        domainid: {
+          value: (record) => { return record.domainid }
+        }
+      }
+    },
+    {
+      api: 'deleteAccount',
+      icon: 'delete',
+      label: 'label.action.delete.account',
+      message: 'message.delete.account',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1)
+      }
+    }
+  ]
+}
diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js
new file mode 100644
index 0000000..8950140
--- /dev/null
+++ b/ui/src/config/section/compute.js
@@ -0,0 +1,606 @@
+// 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 kubernetes from '@/assets/icons/kubernetes.svg?inline'
+import store from '@/store'
+
+export default {
+  name: 'compute',
+  title: 'label.compute',
+  icon: 'cloud',
+  children: [
+    {
+      name: 'vm',
+      title: 'label.instances',
+      icon: 'desktop',
+      docHelp: 'adminguide/virtual_machines.html',
+      permission: ['listVirtualMachinesMetrics'],
+      resourceType: 'UserVm',
+      filters: () => {
+        const filters = ['running', 'stopped']
+        if (!(store.getters.project && store.getters.project.id)) {
+          filters.unshift('self')
+        }
+        return filters
+      },
+      columns: () => {
+        const fields = ['name', 'state', 'ipaddress']
+        const metricsFields = ['cpunumber', 'cpuused', 'cputotal',
+          {
+            memoryused: (record) => {
+              return record.memorykbs && record.memoryintfreekbs ? parseFloat(100.0 * (record.memorykbs - record.memoryintfreekbs) / record.memorykbs).toFixed(2) + '%' : '0.0%'
+            }
+          },
+          'memorytotal', 'networkread', 'networkwrite', 'diskkbsread', 'diskkbswrite', 'diskiopstotal'
+        ]
+
+        if (store.getters.metrics) {
+          fields.push(...metricsFields)
+        }
+
+        if (store.getters.userInfo.roletype === 'Admin') {
+          fields.splice(2, 0, 'instancename')
+          fields.push('account')
+          fields.push('hostname')
+          fields.push('zonename')
+        } else if (store.getters.userInfo.roletype === 'DomainAdmin') {
+          fields.splice(2, 0, 'displayname')
+          fields.push('account')
+          fields.push('zonename')
+        } else {
+          fields.splice(2, 0, 'displayname')
+          fields.push('zonename')
+        }
+        return fields
+      },
+      searchFilters: ['name', 'zoneid', 'domainid', 'account', 'tags'],
+      details: ['displayname', 'name', 'id', 'state', 'ipaddress', 'templatename', 'ostypename', 'serviceofferingname', 'isdynamicallyscalable', 'haenable', 'hypervisor', 'boottype', 'bootmode', 'account', 'domain', 'zonename'],
+      tabs: [{
+        component: () => import('@/views/compute/InstanceTab.vue')
+      }],
+      actions: [
+        {
+          api: 'deployVirtualMachine',
+          icon: 'plus',
+          label: 'label.vm.add',
+          docHelp: 'adminguide/virtual_machines.html#creating-vms',
+          listView: true,
+          component: () => import('@/views/compute/DeployVM.vue')
+        },
+        {
+          api: 'updateVirtualMachine',
+          icon: 'edit',
+          label: 'label.action.edit.instance',
+          docHelp: 'adminguide/virtual_machines.html#changing-the-vm-name-os-or-group',
+          dataView: true,
+          args: ['name', 'displayname', 'ostypeid', 'isdynamicallyscalable', 'haenable', 'group'],
+          show: (record) => { return ['Stopped'].includes(record.state) }
+        },
+        {
+          api: 'startVirtualMachine',
+          icon: 'caret-right',
+          label: 'label.action.start.instance',
+          message: 'message.action.start.instance',
+          docHelp: 'adminguide/virtual_machines.html#stopping-and-starting-vms',
+          dataView: true,
+          groupAction: true,
+          popup: true,
+          groupMap: (selection) => { return selection.map(x => { return { id: x } }) },
+          show: (record) => { return ['Stopped'].includes(record.state) },
+          component: () => import('@/views/compute/StartVirtualMachine.vue')
+        },
+        {
+          api: 'stopVirtualMachine',
+          icon: 'poweroff',
+          label: 'label.action.stop.instance',
+          message: 'message.action.stop.instance',
+          docHelp: 'adminguide/virtual_machines.html#stopping-and-starting-vms',
+          dataView: true,
+          groupAction: true,
+          groupMap: (selection, values) => { return selection.map(x => { return { id: x, forced: values.forced } }) },
+          args: ['forced'],
+          show: (record) => { return ['Running'].includes(record.state) }
+        },
+        {
+          api: 'rebootVirtualMachine',
+          icon: 'reload',
+          label: 'label.action.reboot.instance',
+          message: 'message.action.reboot.instance',
+          docHelp: 'adminguide/virtual_machines.html#stopping-and-starting-vms',
+          dataView: true,
+          show: (record) => { return ['Running'].includes(record.state) },
+          args: (record, store) => {
+            var fields = []
+            if (record.hypervisor === 'VMware') {
+              if (store.apis.rebootVirtualMachine.params.filter(x => x.name === 'bootintosetup').length > 0) {
+                fields.push('bootintosetup')
+              }
+            }
+            return fields
+          }
+        },
+        {
+          api: 'restoreVirtualMachine',
+          icon: 'sync',
+          label: 'label.reinstall.vm',
+          message: 'message.reinstall.vm',
+          dataView: true,
+          args: ['virtualmachineid', 'templateid'],
+          show: (record) => { return ['Running', 'Stopped'].includes(record.state) },
+          mapping: {
+            virtualmachineid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'createVMSnapshot',
+          icon: 'camera',
+          label: 'label.action.vmsnapshot.create',
+          docHelp: 'adminguide/virtual_machines.html#virtual-machine-snapshots',
+          dataView: true,
+          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'))
+          },
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'createSnapshot',
+          icon: ['fas', 'camera-retro'],
+          label: 'label.action.vmstoragesnapshot.create',
+          docHelp: 'adminguide/virtual_machines.html#virtual-machine-snapshots',
+          dataView: true,
+          popup: true,
+          component: () => import('@/views/compute/CreateSnapshotWizard.vue')
+        },
+        {
+          api: 'assignVirtualMachineToBackupOffering',
+          icon: 'folder-add',
+          label: 'label.backup.offering.assign',
+          message: 'label.backup.offering.assign',
+          docHelp: 'adminguide/virtual_machines.html#backup-offerings',
+          dataView: true,
+          args: ['virtualmachineid', 'backupofferingid'],
+          show: (record) => { return !record.backupofferingid },
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'createBackup',
+          icon: 'cloud-upload',
+          label: 'label.create.backup',
+          message: 'message.backup.create',
+          docHelp: 'adminguide/virtual_machines.html#creating-vm-backups',
+          dataView: true,
+          args: ['virtualmachineid'],
+          show: (record) => { return record.backupofferingid },
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'createBackupSchedule',
+          icon: 'schedule',
+          label: 'Configure Backup Schedule',
+          docHelp: 'adminguide/virtual_machines.html#creating-vm-backups',
+          dataView: true,
+          popup: true,
+          show: (record) => { return record.backupofferingid },
+          component: () => import('@/views/compute/BackupScheduleWizard.vue'),
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            },
+            intervaltype: {
+              options: ['HOURLY', 'DAILY', 'WEEKLY', 'MONTHLY']
+            }
+          }
+        },
+        {
+          api: 'removeVirtualMachineFromBackupOffering',
+          icon: 'scissor',
+          label: 'label.backup.offering.remove',
+          message: 'label.backup.offering.remove',
+          docHelp: 'adminguide/virtual_machines.html#restoring-vm-backups',
+          dataView: true,
+          args: ['virtualmachineid', 'forced'],
+          show: (record) => { return record.backupofferingid },
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'attachIso',
+          icon: 'paper-clip',
+          label: 'label.action.attach.iso',
+          docHelp: 'adminguide/templates.html#attaching-an-iso-to-a-vm',
+          dataView: true,
+          popup: true,
+          show: (record) => { return ['Running', 'Stopped'].includes(record.state) && !record.isoid },
+          component: () => import('@/views/compute/AttachIso.vue')
+        },
+        {
+          api: 'detachIso',
+          icon: 'link',
+          label: 'label.action.detach.iso',
+          message: 'message.detach.iso.confirm',
+          dataView: true,
+          args: ['virtualmachineid'],
+          show: (record) => { return ['Running', 'Stopped'].includes(record.state) && 'isoid' in record && record.isoid },
+          mapping: {
+            virtualmachineid: {
+              value: (record, params) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'updateVMAffinityGroup',
+          icon: 'swap',
+          label: 'label.change.affinity',
+          docHelp: 'adminguide/virtual_machines.html#change-affinity-group-for-an-existing-vm',
+          dataView: true,
+          args: ['affinitygroupids'],
+          show: (record) => { return ['Stopped'].includes(record.state) },
+          component: () => import('@/views/compute/ChangeAffinity'),
+          popup: true
+        },
+        {
+          api: 'scaleVirtualMachine',
+          icon: 'arrows-alt',
+          label: 'label.scale.vm',
+          docHelp: 'adminguide/virtual_machines.html#how-to-dynamically-scale-cpu-and-ram',
+          dataView: true,
+          show: (record) => { return ['Stopped'].includes(record.state) || (['Running'].includes(record.state) && record.hypervisor !== 'KVM' && record.hypervisor !== 'LXC') },
+          popup: true,
+          component: () => import('@/views/compute/ScaleVM.vue')
+        },
+        {
+          api: 'migrateVirtualMachine',
+          icon: 'drag',
+          label: 'label.migrate.instance.to.host',
+          docHelp: 'adminguide/virtual_machines.html#moving-vms-between-hosts-manual-live-migration',
+          dataView: true,
+          show: (record, store) => { return ['Running'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
+          popup: true,
+          component: () => import('@/views/compute/MigrateWizard')
+        },
+        {
+          api: 'migrateVirtualMachine',
+          icon: 'drag',
+          label: 'label.migrate.instance.to.ps',
+          message: 'message.migrate.instance.to.ps',
+          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 }
+            }
+          }
+        },
+        {
+          api: 'resetPasswordForVirtualMachine',
+          icon: 'key',
+          label: 'label.action.reset.password',
+          message: 'message.action.instance.reset.password',
+          dataView: true,
+          show: (record) => { return ['Running', 'Stopped'].includes(record.state) && record.passwordenabled },
+          response: (result) => { return result.virtualmachine && result.virtualmachine.password ? `Password of the VM is ${result.virtualmachine.password}` : null }
+        },
+        {
+          api: 'resetSSHKeyForVirtualMachine',
+          icon: 'lock',
+          label: 'label.reset.ssh.key.pair',
+          message: 'message.desc.reset.ssh.key.pair',
+          docHelp: 'adminguide/virtual_machines.html#resetting-ssh-keys',
+          dataView: true,
+          args: ['keypair', 'account', 'domainid'],
+          show: (record) => { return ['Stopped'].includes(record.state) },
+          mapping: {
+            keypair: {
+              api: 'listSSHKeyPairs',
+              params: (record) => { return { account: record.account, domainid: record.domainid } }
+            },
+            account: {
+              value: (record) => { return record.account }
+            },
+            domainid: {
+              value: (record) => { return record.domainid }
+            }
+          }
+        },
+        {
+          api: 'assignVirtualMachine',
+          icon: 'user-add',
+          label: 'label.assign.instance.another',
+          dataView: true,
+          component: () => import('@/views/compute/AssignInstance'),
+          popup: true,
+          show: (record) => { return ['Stopped'].includes(record.state) }
+        },
+        {
+          api: 'recoverVirtualMachine',
+          icon: 'medicine-box',
+          label: 'label.recover.vm',
+          message: 'message.recover.vm',
+          dataView: true,
+          show: (record, store) => { return ['Destroyed'].includes(record.state) && store.features.allowuserexpungerecovervm }
+        },
+        {
+          api: 'unmanageVirtualMachine',
+          icon: 'disconnect',
+          label: 'label.action.unmanage.virtualmachine',
+          message: 'message.action.unmanage.virtualmachine',
+          dataView: true,
+          show: (record) => { return ['Running', 'Stopped'].includes(record.state) && record.hypervisor === 'VMware' }
+        },
+        {
+          api: 'expungeVirtualMachine',
+          icon: 'delete',
+          label: 'label.action.expunge.instance',
+          message: 'message.action.expunge.instance',
+          docHelp: 'adminguide/virtual_machines.html#deleting-vms',
+          dataView: true,
+          show: (record, store) => { return ['Destroyed', 'Expunging'].includes(record.state) && store.features.allowuserexpungerecovervm }
+        },
+        {
+          api: 'destroyVirtualMachine',
+          icon: 'delete',
+          label: 'label.action.destroy.instance',
+          message: 'message.action.destroy.instance',
+          docHelp: 'adminguide/virtual_machines.html#deleting-vms',
+          dataView: true,
+          groupAction: true,
+          args: (record, store, group) => {
+            return (['Admin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervm)
+              ? ['expunge'] : []
+          },
+          popup: true,
+          groupMap: (selection, values) => { return selection.map(x => { return { id: x, expunge: values.expunge } }) },
+          show: (record) => { return ['Running', 'Stopped', 'Error'].includes(record.state) },
+          component: () => import('@/views/compute/DestroyVM.vue')
+        }
+      ]
+    },
+    {
+      name: 'kubernetes',
+      title: 'label.kubernetes',
+      icon: kubernetes,
+      docHelp: 'plugins/cloudstack-kubernetes-service.html',
+      permission: ['listKubernetesClusters'],
+      columns: () => {
+        var fields = ['name', 'state', 'size', 'cpunumber', 'memory']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        fields.push('zonename')
+        return fields
+      },
+      details: ['name', 'description', 'zonename', 'kubernetesversionname', 'size', 'masternodes', 'cpunumber', 'memory', 'keypair', 'associatednetworkname', 'account', 'domain', 'zonename'],
+      tabs: [{
+        name: 'k8s',
+        component: () => import('@/views/compute/KubernetesServiceTab.vue')
+      }],
+      actions: [
+        {
+          api: 'createKubernetesCluster',
+          icon: 'plus',
+          label: 'label.kubernetes.cluster.create',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#creating-a-new-kubernetes-cluster',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/compute/CreateKubernetesCluster.vue')
+        },
+        {
+          api: 'startKubernetesCluster',
+          icon: 'caret-right',
+          label: 'label.kubernetes.cluster.start',
+          message: 'message.kubernetes.cluster.start',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#starting-a-stopped-kubernetes-cluster',
+          dataView: true,
+          show: (record) => { return ['Stopped'].includes(record.state) }
+        },
+        {
+          api: 'stopKubernetesCluster',
+          icon: 'poweroff',
+          label: 'label.kubernetes.cluster.stop',
+          message: 'message.kubernetes.cluster.stop',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#stopping-kubernetes-cluster',
+          dataView: true,
+          show: (record) => { return !['Stopped', 'Destroyed', 'Destroying'].includes(record.state) }
+        },
+        {
+          api: 'scaleKubernetesCluster',
+          icon: 'swap',
+          label: 'label.kubernetes.cluster.scale',
+          message: 'message.kubernetes.cluster.scale',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#scaling-kubernetes-cluster',
+          dataView: true,
+          show: (record) => { return ['Created', 'Running'].includes(record.state) },
+          popup: true,
+          component: () => import('@/views/compute/ScaleKubernetesCluster.vue')
+        },
+        {
+          api: 'upgradeKubernetesCluster',
+          icon: 'plus-circle',
+          label: 'label.kubernetes.cluster.upgrade',
+          message: 'message.kubernetes.cluster.upgrade',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#upgrading-kubernetes-cluster',
+          dataView: true,
+          show: (record) => { return ['Created', 'Running'].includes(record.state) },
+          popup: true,
+          component: () => import('@/views/compute/UpgradeKubernetesCluster.vue')
+        },
+        {
+          api: 'deleteKubernetesCluster',
+          icon: 'delete',
+          label: 'label.kubernetes.cluster.delete',
+          message: 'message.kubernetes.cluster.delete',
+          docHelp: 'plugins/cloudstack-kubernetes-service.html#deleting-kubernetes-cluster',
+          dataView: true,
+          show: (record) => { return !['Destroyed', 'Destroying'].includes(record.state) }
+        }
+      ]
+    },
+    {
+      name: 'vmgroup',
+      title: 'label.instance.groups',
+      icon: 'gold',
+      docHelp: 'adminguide/virtual_machines.html#changing-the-vm-name-os-or-group',
+      permission: ['listInstanceGroups'],
+      columns: ['name', 'account'],
+      details: ['name', 'id', 'account', 'domain', 'created'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'groupid'
+      }],
+      actions: [
+        {
+          api: 'createInstanceGroup',
+          icon: 'plus',
+          label: 'label.new.instance.group',
+          listView: true,
+          args: ['name']
+        },
+        {
+          api: 'updateInstanceGroup',
+          icon: 'edit',
+          label: 'label.update.instance.group',
+          dataView: true,
+          args: ['name']
+        },
+        {
+          api: 'deleteInstanceGroup',
+          icon: 'delete',
+          label: 'label.delete.instance.group',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'ssh',
+      title: 'label.ssh.key.pairs',
+      icon: 'key',
+      docHelp: 'adminguide/virtual_machines.html#using-ssh-keys-for-authentication',
+      permission: ['listSSHKeyPairs'],
+      columns: () => {
+        var fields = ['name', 'fingerprint']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        return fields
+      },
+      details: ['name', 'fingerprint', 'account', 'domain'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'keypair'
+      }],
+      actions: [
+        {
+          api: 'createSSHKeyPair',
+          icon: 'plus',
+          label: 'label.create.ssh.key.pair',
+          docHelp: 'adminguide/virtual_machines.html#creating-the-ssh-keypair',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/compute/CreateSSHKeyPair.vue')
+        },
+        {
+          api: 'deleteSSHKeyPair',
+          icon: 'delete',
+          label: 'label.remove.ssh.key.pair',
+          dataView: true,
+          args: ['name', 'account', 'domainid'],
+          mapping: {
+            name: {
+              value: (record, params) => { return record.name }
+            },
+            account: {
+              value: (record, params) => { return record.account }
+            },
+            domainid: {
+              value: (record, params) => { return record.domainid }
+            }
+          }
+        }
+      ]
+    },
+    {
+      name: 'affinitygroup',
+      title: 'label.affinity.groups',
+      icon: 'swap',
+      docHelp: 'adminguide/virtual_machines.html#affinity-groups',
+      permission: ['listAffinityGroups'],
+      columns: () => {
+        var fields = ['name', 'type', 'description']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        return fields
+      },
+      details: ['name', 'id', 'description', 'type', 'account', 'domain'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'affinitygroupid'
+      }],
+      actions: [
+        {
+          api: 'createAffinityGroup',
+          icon: 'plus',
+          label: 'label.add.affinity.group',
+          docHelp: 'adminguide/virtual_machines.html#creating-a-new-affinity-group',
+          listView: true,
+          args: ['name', 'description', 'type'],
+          mapping: {
+            type: {
+              options: ['host anti-affinity', 'host affinity']
+            }
+          }
+        },
+        {
+          api: 'deleteAffinityGroup',
+          icon: 'delete',
+          label: 'label.delete.affinity.group',
+          docHelp: 'adminguide/virtual_machines.html#delete-an-affinity-group',
+          message: 'message.delete.affinity.group',
+          dataView: true
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/config.js b/ui/src/config/section/config.js
new file mode 100644
index 0000000..8b77c65
--- /dev/null
+++ b/ui/src/config/section/config.js
@@ -0,0 +1,81 @@
+// 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.
+
+export default {
+  name: 'config',
+  title: 'label.configuration',
+  icon: 'setting',
+  permission: ['listConfigurations'],
+  children: [
+    {
+      name: 'globalsetting',
+      title: 'label.global.settings',
+      icon: 'setting',
+      permission: ['listConfigurations'],
+      columns: ['name', 'description', 'category', 'value', 'actions']
+    },
+    {
+      name: 'ldapsetting',
+      title: 'label.ldap.configuration',
+      icon: 'team',
+      permission: ['listLdapConfigurations'],
+      columns: ['hostname', 'port', 'domainid'],
+      details: ['hostname', 'port', 'domainid'],
+      actions: [
+        {
+          api: 'addLdapConfiguration',
+          icon: 'plus',
+          label: 'label.configure.ldap',
+          listView: true,
+          args: [
+            'hostname', 'port', 'domainid'
+          ]
+        },
+        {
+          api: 'deleteLdapConfiguration',
+          icon: 'delete',
+          label: 'label.remove.ldap',
+          message: 'message.remove.ldap',
+          dataView: true,
+          args: ['hostname'],
+          mapping: {
+            hostname: {
+              value: (record) => { return record.hostname }
+            }
+          }
+        }
+      ]
+    },
+    {
+      name: 'hypervisorcapability',
+      title: 'label.hypervisor.capabilities',
+      icon: 'database',
+      permission: ['listHypervisorCapabilities'],
+      columns: ['hypervisor', 'hypervisorversion', 'maxguestslimit', 'maxhostspercluster'],
+      details: ['hypervisor', 'hypervisorversion', 'maxguestslimit', 'maxdatavolumeslimit', 'maxhostspercluster', 'securitygroupenabled', 'storagemotionenabled'],
+      actions: [
+        {
+          api: 'updateHypervisorCapabilities',
+          icon: 'edit',
+          label: 'label.edit',
+          dataView: true,
+          args: ['maxguestslimit']
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/domain.js b/ui/src/config/section/domain.js
new file mode 100644
index 0000000..7fbd263
--- /dev/null
+++ b/ui/src/config/section/domain.js
@@ -0,0 +1,139 @@
+// 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.
+
+export default {
+  name: 'domain',
+  title: 'label.domains',
+  icon: 'block',
+  docHelp: 'adminguide/accounts.html#domains',
+  permission: ['listDomains', 'listDomainChildren'],
+  resourceType: 'Domain',
+  columns: ['name', 'state', 'path', 'parentdomainname', 'level'],
+  details: ['name', 'id', 'path', 'parentdomainname', 'level', 'networkdomain'],
+  component: () => import('@/views/iam/DomainView.vue'),
+  related: [{
+    name: 'account',
+    title: 'label.accounts',
+    param: 'domainid'
+  }],
+  tabs: [
+    {
+      name: 'domain',
+      component: () => import('@/components/view/InfoCard.vue'),
+      show: (record, route) => { return route.path === '/domain' }
+    },
+    {
+      name: 'details',
+      component: () => import('@/components/view/DetailsTab.vue')
+    },
+    {
+      name: 'resources',
+      show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) },
+      component: () => import('@/components/view/ResourceCountUsage.vue')
+    },
+    {
+      name: 'limits',
+      show: (record, route, user) => { return ['Admin'].includes(user.roletype) },
+      component: () => import('@/components/view/ResourceLimitTab.vue')
+    },
+    {
+      name: 'settings',
+      component: () => import('@/components/view/SettingsTab.vue'),
+      show: (record, route, user) => { return ['Admin'].includes(user.roletype) }
+    }
+  ],
+  treeView: true,
+  actions: [
+    {
+      api: 'createDomain',
+      icon: 'plus',
+      label: 'label.add.domain',
+      listView: true,
+      dataView: false,
+      args: ['parentdomainid', 'name', 'networkdomain', 'domainid'],
+      mapping: {
+        parentdomainid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'updateDomain',
+      icon: 'edit',
+      label: 'label.action.edit.domain',
+      listView: true,
+      dataView: true,
+      args: (record) => {
+        var fields = ['networkdomain']
+        if (record.name !== 'ROOT') {
+          fields.unshift('name')
+        }
+        return fields
+      },
+      show: (record, store) => {
+        return ['Admin'].includes(store.userInfo.roletype) ||
+          ['DomainAdmin'].includes(store.userInfo.roletype) && record.domainid !== store.userInfo.domainid
+      }
+    },
+    {
+      api: 'updateResourceCount',
+      icon: 'sync',
+      label: 'label.action.update.resource.count',
+      message: 'message.update.resource.count',
+      listView: true,
+      dataView: true,
+      args: ['domainid'],
+      mapping: {
+        domainid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'linkDomainToLdap',
+      icon: 'link',
+      label: 'label.link.domain.to.ldap',
+      docHelp: 'adminguide/accounts.html#using-an-ldap-server-for-user-authentication',
+      listView: true,
+      dataView: true,
+      args: ['type', 'domainid', 'name', 'accounttype', 'admin'],
+      mapping: {
+        type: {
+          options: ['GROUP', 'OU']
+        },
+        accounttype: {
+          options: ['0', '2']
+        },
+        domainid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'deleteDomain',
+      icon: 'delete',
+      label: 'label.action.delete.domain',
+      listView: true,
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin'].includes(store.userInfo.roletype) && record.level !== 0 ||
+          ['DomainAdmin'].includes(store.userInfo.roletype) && record.domainid !== store.userInfo.domainid
+      },
+      args: ['cleanup']
+    }
+  ]
+}
diff --git a/ui/src/config/section/event.js b/ui/src/config/section/event.js
new file mode 100644
index 0000000..9dab696
--- /dev/null
+++ b/ui/src/config/section/event.js
@@ -0,0 +1,72 @@
+// 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.
+
+export default {
+  name: 'event',
+  title: 'label.events',
+  icon: 'schedule',
+  docHelp: 'adminguide/events.html',
+  permission: ['listEvents'],
+  columns: ['level', 'type', 'state', 'description', 'username', 'account', 'domain', 'created'],
+  details: ['username', 'id', 'description', 'state', 'level', 'type', 'account', 'domain', 'created'],
+  searchFilters: ['level', 'domainid', 'account', 'keyword'],
+  related: [{
+    name: 'event',
+    title: 'label.event.timeline',
+    param: 'startid'
+  }],
+  actions: [
+    {
+      api: 'archiveEvents',
+      icon: 'book',
+      label: 'label.archive.events',
+      message: 'message.confirm.archive.selected.events',
+      docHelp: 'adminguide/events.html#deleting-and-archiving-events-and-alerts',
+      dataView: true,
+      successMessage: 'label.event.archived',
+      groupAction: true,
+      groupMap: (selection) => { return [{ ids: selection.join(',') }] },
+      args: ['ids'],
+      mapping: {
+        ids: {
+          value: (record) => { return record.id }
+        }
+      },
+      show: (record, store) => { return !['User'].includes(store.userInfo.roletype) },
+      groupShow: (record, store) => { return !['User'].includes(store.userInfo.roletype) }
+    },
+    {
+      api: 'deleteEvents',
+      icon: 'delete',
+      label: 'label.delete.events',
+      message: 'message.confirm.remove.selected.events',
+      docHelp: 'adminguide/events.html#deleting-and-archiving-events-and-alerts',
+      dataView: true,
+      successMessage: 'label.event.deleted',
+      groupAction: true,
+      groupMap: (selection) => { return [{ ids: selection.join(',') }] },
+      args: ['ids'],
+      mapping: {
+        ids: {
+          value: (record) => { return record.id }
+        }
+      },
+      show: (record, store) => { return !['User'].includes(store.userInfo.roletype) },
+      groupShow: (record, store) => { return !['User'].includes(store.userInfo.roletype) }
+    }
+  ]
+}
diff --git a/ui/src/config/section/image.js b/ui/src/config/section/image.js
new file mode 100644
index 0000000..6f08b9e
--- /dev/null
+++ b/ui/src/config/section/image.js
@@ -0,0 +1,341 @@
+// 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 kubernetes from '@/assets/icons/kubernetes.svg?inline'
+import store from '@/store'
+
+export default {
+  name: 'image',
+  title: 'label.images',
+  icon: 'picture',
+  docHelp: 'adminguide/templates.html',
+  children: [
+    {
+      name: 'template',
+      title: 'label.templates',
+      icon: 'save',
+      docHelp: 'adminguide/templates.html',
+      permission: ['listTemplates'],
+      params: { templatefilter: 'self', showunique: 'true' },
+      resourceType: 'Template',
+      filters: ['self', 'shared', 'featured', 'community'],
+      columns: () => {
+        var fields = ['name', 'hypervisor', 'ostypename']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        if (['Admin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('order')
+        }
+        return fields
+      },
+      details: () => {
+        var fields = ['name', 'id', 'displaytext', 'checksum', 'hypervisor', 'format', 'ostypename', 'size', 'isready', 'passwordenabled',
+          'directdownload', 'deployasis', 'ispublic', 'isfeatured', 'isextractable', 'isdynamicallyscalable', 'crosszones', 'type',
+          'account', 'domain', 'created']
+        if (['Admin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('templatetype', 'url')
+        }
+        return fields
+      },
+      searchFilters: ['name', 'zoneid', 'tags'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'templateid'
+      }],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'zones',
+        component: () => import('@/views/image/TemplateZones.vue')
+      }, {
+        name: 'settings',
+        component: () => import('@/components/view/DetailSettings')
+      }],
+      actions: [
+        {
+          api: 'registerTemplate',
+          icon: 'plus',
+          label: 'label.action.register.template',
+          docHelp: 'adminguide/templates.html#uploading-templates-from-a-remote-http-server',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/image/RegisterOrUploadTemplate.vue')
+        },
+        {
+          api: 'registerTemplate',
+          icon: 'cloud-upload',
+          label: 'label.upload.template.from.local',
+          docHelp: 'adminguide/templates.html#uploading-templates-and-isos-from-a-local-computer',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/image/RegisterOrUploadTemplate.vue')
+        },
+        {
+          api: 'updateTemplate',
+          icon: 'edit',
+          label: 'label.edit',
+          dataView: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              record.templatetype !== 'SYSTEM' &&
+              record.isready
+          },
+          args: (record, store) => {
+            var fields = ['name', 'displaytext', 'passwordenabled', 'ostypeid', 'isdynamicallyscalable']
+            if (['Admin'].includes(store.userInfo.roletype)) {
+              fields.push('templatetype')
+            }
+            return fields
+          },
+          mapping: {
+            templatetype: {
+              options: ['BUILTIN', 'USER', 'SYSTEM', 'ROUTING']
+            }
+          }
+        },
+        {
+          api: 'updateTemplatePermissions',
+          icon: 'share-alt',
+          label: 'label.action.template.share',
+          dataView: true,
+          args: (record, store) => {
+            const fields = ['isfeatured', 'isextractable']
+            if (['Admin'].includes(store.userInfo.roletype) || store.features.userpublictemplateenabled) {
+              fields.unshift('ispublic')
+            }
+            return fields
+          },
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              record.templatetype !== 'SYSTEM' &&
+              record.isready
+          }
+        },
+        {
+          api: 'extractTemplate',
+          icon: 'cloud-download',
+          label: 'label.action.download.template',
+          message: 'message.action.download.template',
+          docHelp: 'adminguide/templates.html#exporting-templates',
+          dataView: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              record.templatetype !== 'SYSTEM' &&
+              record.isready &&
+              record.isextractable
+          },
+          args: ['zoneid', 'mode'],
+          mapping: {
+            zoneid: {
+              value: (record) => { return record.zoneid }
+            },
+            mode: {
+              value: (record) => { return 'HTTP_DOWNLOAD' }
+            }
+          },
+          response: (result) => { return `Please click <a href="${result.template.url}" target="_blank">${result.template.url}</a> to download.` }
+        },
+        {
+          api: 'updateTemplatePermissions',
+          icon: 'reconciliation',
+          label: 'label.action.template.permission',
+          docHelp: 'adminguide/templates.html#sharing-templates-with-other-accounts-projects',
+          dataView: true,
+          popup: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              record.templatetype !== 'SYSTEM' &&
+              record.isready
+          },
+          component: () => import('@/views/image/UpdateTemplateIsoPermissions')
+        }
+      ]
+    },
+    {
+      name: 'iso',
+      title: 'label.isos',
+      icon: 'usb',
+      docHelp: 'adminguide/templates.html#working-with-isos',
+      permission: ['listIsos'],
+      params: { isofilter: 'self', showunique: 'true' },
+      resourceType: 'ISO',
+      filters: ['self', 'shared', 'featured', 'community'],
+      columns: () => {
+        var fields = ['name', 'ostypename']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('account')
+        }
+        return fields
+      },
+      details: ['name', 'id', 'displaytext', 'checksum', 'ostypename', 'size', 'bootable', 'isready', 'directdownload', 'isextractable', 'ispublic', 'isfeatured', 'crosszones', 'account', 'domain', 'created'],
+      searchFilters: ['name', 'zoneid', 'tags'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'isoid'
+      }],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'zones',
+        component: () => import('@/views/image/IsoZones.vue')
+      }],
+      actions: [
+        {
+          api: 'registerIso',
+          icon: 'plus',
+          label: 'label.action.register.iso',
+          docHelp: 'adminguide/templates.html#id10',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/image/RegisterOrUploadIso.vue')
+        },
+        {
+          api: 'registerIso',
+          icon: 'cloud-upload',
+          label: 'label.upload.iso.from.local',
+          docHelp: 'adminguide/templates.html#id10',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/image/RegisterOrUploadIso.vue')
+        },
+        {
+          api: 'updateIso',
+          icon: 'edit',
+          label: 'label.action.edit.iso',
+          dataView: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              !(record.account === 'system' && record.domainid === 1) &&
+              record.isready
+          },
+          args: ['name', 'displaytext', 'bootable', 'ostypeid']
+        },
+        {
+          api: 'updateIsoPermissions',
+          icon: 'share-alt',
+          label: 'label.action.iso.share',
+          dataView: true,
+          args: (record, store) => {
+            const fields = ['isfeatured', 'isextractable']
+            if (['Admin'].includes(store.userInfo.roletype) || store.features.userpublictemplateenabled) {
+              fields.unshift('ispublic')
+            }
+            return fields
+          },
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              !(record.account === 'system' && record.domainid === 1) &&
+              record.isready
+          }
+        },
+        {
+          api: 'extractIso',
+          icon: 'cloud-download',
+          label: 'label.action.download.iso',
+          message: 'message.action.download.iso',
+          docHelp: 'adminguide/templates.html#exporting-templates',
+          dataView: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              !(record.account === 'system' && record.domainid === 1) &&
+              record.isready
+          },
+          args: ['zoneid', 'mode'],
+          mapping: {
+            zoneid: {
+              value: (record) => { return record.zoneid }
+            },
+            mode: {
+              value: (record) => { return 'HTTP_DOWNLOAD' }
+            }
+          },
+          response: (result) => { return `Please click <a href="${result.iso.url}" target="_blank">${result.iso.url}</a> to download.` }
+        },
+        {
+          api: 'updateIsoPermissions',
+          icon: 'reconciliation',
+          label: 'label.action.iso.permission',
+          docHelp: 'adminguide/templates.html#sharing-templates-with-other-accounts-projects',
+          dataView: true,
+          args: ['op', 'accounts', 'projectids'],
+          popup: true,
+          show: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || // If admin or owner or belongs to current project
+              (record.domainid === store.userInfo.domainid && record.account === store.userInfo.account) ||
+              (record.domainid === store.userInfo.domainid && record.projectid && store.project && store.project.id && record.projectid === store.project.id)) &&
+              !(record.account === 'system' && record.domainid === 1) &&
+              record.isready
+          },
+          component: () => import('@/views/image/UpdateTemplateIsoPermissions')
+        }
+      ]
+    },
+    {
+      name: 'kubernetesiso',
+      title: 'label.kubernetes.isos',
+      icon: kubernetes,
+      docHelp: 'plugins/cloudstack-kubernetes-service.html#kubernetes-supported-versions',
+      permission: ['listKubernetesSupportedVersions'],
+      columns: ['name', 'state', 'semanticversion', 'isostate', 'mincpunumber', 'minmemory', 'zonename'],
+      details: ['name', 'semanticversion', 'zoneid', 'zonename', 'isoid', 'isoname', 'isostate', 'mincpunumber', 'minmemory', 'supportsha', 'state'],
+      actions: [
+        {
+          api: 'addKubernetesSupportedVersion',
+          icon: 'plus',
+          label: 'label.kubernetes.version.add',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/image/AddKubernetesSupportedVersion.vue')
+        },
+        {
+          api: 'updateKubernetesSupportedVersion',
+          icon: 'edit',
+          label: 'label.kubernetes.version.update',
+          dataView: true,
+          popup: true,
+          component: () => import('@/views/image/UpdateKubernetesSupportedVersion.vue')
+        },
+        {
+          api: 'deleteKubernetesSupportedVersion',
+          icon: 'delete',
+          label: 'label.kubernetes.version.delete',
+          message: 'message.kubernetes.version.delete',
+          dataView: true
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra.js b/ui/src/config/section/infra.js
new file mode 100644
index 0000000..715f217
--- /dev/null
+++ b/ui/src/config/section/infra.js
@@ -0,0 +1,113 @@
+// 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 zones from '@/config/section/infra/zones'
+import phynetworks from '@/config/section/infra/phynetworks'
+import nsp from '@/config/section/infra/nsp'
+import pods from '@/config/section/infra/pods'
+import clusters from '@/config/section/infra/clusters'
+import hosts from '@/config/section/infra/hosts'
+import primaryStorages from '@/config/section/infra/primaryStorages'
+import secondaryStorages from '@/config/section/infra/secondaryStorages'
+import systemVms from '@/config/section/infra/systemVms'
+import routers from '@/config/section/infra/routers'
+import ilbvms from '@/config/section/infra/ilbvms'
+
+export default {
+  name: 'infra',
+  title: 'label.infrastructure',
+  icon: 'bank',
+  permission: ['listInfrastructure'],
+  children: [
+    {
+      name: 'infrasummary',
+      title: 'label.summary',
+      icon: 'read',
+      permission: ['listInfrastructure'],
+      component: () => import('@/views/infra/InfraSummary.vue')
+    },
+    zones,
+    phynetworks,
+    nsp,
+    pods,
+    clusters,
+    hosts,
+    primaryStorages,
+    secondaryStorages,
+    systemVms,
+    routers,
+    ilbvms,
+    {
+      name: 'cpusocket',
+      title: 'label.cpu.sockets',
+      icon: 'inbox',
+      docHelp: 'adminguide/management.html#reporting-cpu-sockets',
+      permission: ['listHosts'],
+      component: () => import('@/views/infra/CpuSockets.vue')
+    },
+    {
+      name: 'managementserver',
+      title: 'label.management.servers',
+      icon: 'rocket',
+      permission: ['listManagementServers'],
+      columns: ['name', 'state', 'version']
+    },
+    {
+      name: 'alert',
+      title: 'label.alerts',
+      icon: 'flag',
+      docHelp: 'adminguide/management.html#administrator-alerts',
+      permission: ['listAlerts'],
+      columns: ['name', 'description', 'type', 'sent'],
+      details: ['name', 'id', 'type', 'sent', 'description'],
+      actions: [
+        {
+          api: 'archiveAlerts',
+          icon: 'book',
+          label: 'label.archive.alerts',
+          message: 'message.confirm.archive.selected.alerts',
+          docHelp: 'adminguide/events.html#deleting-and-archiving-events-and-alerts',
+          dataView: true,
+          groupAction: true,
+          groupMap: (selection) => { return [{ ids: selection.join(',') }] },
+          args: ['ids'],
+          mapping: {
+            ids: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'deleteAlerts',
+          icon: 'delete',
+          label: 'label.delete.alerts',
+          message: 'message.confirm.remove.selected.alerts',
+          docHelp: 'adminguide/events.html#deleting-and-archiving-events-and-alerts',
+          dataView: true,
+          groupAction: true,
+          groupMap: (selection) => { return [{ ids: selection.join(',') }] },
+          args: ['ids'],
+          mapping: {
+            ids: {
+              value: (record) => { return record.id }
+            }
+          }
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/clusters.js b/ui/src/config/section/infra/clusters.js
new file mode 100644
index 0000000..96c3c0a
--- /dev/null
+++ b/ui/src/config/section/infra/clusters.js
@@ -0,0 +1,195 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'cluster',
+  title: 'label.clusters',
+  icon: 'cluster',
+  permission: ['listClustersMetrics'],
+  columns: () => {
+    const fields = ['name', 'state', 'allocationstate', 'clustertype', 'hypervisortype', 'hosts']
+    const metricsFields = ['cpuused', 'cpumaxdeviation', 'cpuallocated', 'cputotal', 'memoryused', 'memorymaxdeviation', 'memoryallocated', 'memorytotal']
+    if (store.getters.metrics) {
+      fields.push(...metricsFields)
+    }
+    fields.push('podname')
+    fields.push('zonename')
+    return fields
+  },
+  details: ['name', 'id', 'allocationstate', 'clustertype', 'managedstate', 'hypervisortype', 'podname', 'zonename'],
+  related: [{
+    name: 'host',
+    title: 'label.hosts',
+    param: 'clusterid'
+  }],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'resources',
+    component: () => import('@/views/infra/Resources.vue')
+  }, {
+    name: 'settings',
+    component: () => import('@/components/view/SettingsTab.vue')
+  }],
+  actions: [
+    {
+      api: 'addCluster',
+      icon: 'plus',
+      label: 'label.add.cluster',
+      docHelp: 'adminguide/installguide/configuration.html#adding-a-cluster',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/ClusterAdd.vue')
+    },
+    {
+      api: 'updateCluster',
+      icon: 'edit',
+      label: 'label.edit',
+      dataView: true,
+      args: ['clustername']
+    },
+    {
+      api: 'updateCluster',
+      icon: 'play-circle',
+      label: 'label.action.enable.cluster',
+      message: 'message.action.enable.cluster',
+      docHelp: 'adminguide/installguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Enabled' },
+      show: (record) => { return record.allocationstate === 'Disabled' }
+    },
+    {
+      api: 'updateCluster',
+      icon: 'pause-circle',
+      label: 'label.action.disable.cluster',
+      message: 'message.action.disable.cluster',
+      docHelp: 'adminguide/installguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Disabled' },
+      show: (record) => { return record.allocationstate === 'Enabled' }
+    },
+    {
+      api: 'updateCluster',
+      icon: 'plus-square',
+      label: 'label.action.manage.cluster',
+      message: 'message.action.manage.cluster',
+      dataView: true,
+      defaultArgs: { managedstate: 'Managed' },
+      show: (record) => { return record.managedstate !== 'Managed' }
+    },
+    {
+      api: 'updateCluster',
+      icon: 'minus-square',
+      label: 'label.action.unmanage.cluster',
+      message: 'message.action.unmanage.cluster',
+      dataView: true,
+      defaultArgs: { managedstate: 'Unmanaged' },
+      show: (record) => { return record.managedstate === 'Managed' }
+    },
+    {
+      api: 'enableOutOfBandManagementForCluster',
+      icon: 'plus-circle',
+      label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
+      dataView: true,
+      show: (record) => {
+        return record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
+          record.resourcedetails.outOfBandManagementEnabled === 'false'
+      },
+      args: ['clusterid'],
+      mapping: {
+        clusterid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableOutOfBandManagementForCluster',
+      icon: 'minus-circle',
+      label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
+      dataView: true,
+      show: (record) => {
+        return !(record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
+          record.resourcedetails.outOfBandManagementEnabled === 'false')
+      },
+      args: ['clusterid'],
+      mapping: {
+        clusterid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'enableHAForCluster',
+      icon: 'eye',
+      label: 'label.ha.enable',
+      message: 'label.ha.enable',
+      dataView: true,
+      show: (record) => {
+        return record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
+          record.resourcedetails.resourceHAEnabled === 'false'
+      },
+      args: ['clusterid'],
+      mapping: {
+        clusterid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableHAForCluster',
+      icon: 'eye-invisible',
+      label: 'label.ha.disable',
+      message: 'label.ha.disable',
+      dataView: true,
+      show: (record) => {
+        return !(record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
+          record.resourcedetails.resourceHAEnabled === 'false')
+      },
+      args: ['clusterid'],
+      mapping: {
+        clusterid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'startRollingMaintenance',
+      icon: 'setting',
+      label: 'label.start.rolling.maintenance',
+      message: 'label.start.rolling.maintenance',
+      dataView: true,
+      args: ['timeout', 'payload', 'forced', 'clusterids'],
+      mapping: {
+        clusterids: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'deleteCluster',
+      icon: 'delete',
+      label: 'label.action.delete.cluster',
+      message: 'message.action.delete.cluster',
+      dataView: true
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/hosts.js b/ui/src/config/section/infra/hosts.js
new file mode 100644
index 0000000..824cff6
--- /dev/null
+++ b/ui/src/config/section/infra/hosts.js
@@ -0,0 +1,300 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'host',
+  title: 'label.hosts',
+  icon: 'desktop',
+  permission: ['listHostsMetrics'],
+  resourceType: 'Host',
+  params: { type: 'routing' },
+  columns: () => {
+    const fields = ['name', 'state', 'resourcestate', 'ipaddress', 'hypervisor', 'instances', 'powerstate']
+    const metricsFields = ['cpunumber', 'cputotalghz', 'cpuusedghz', 'cpuallocatedghz', 'memorytotalgb', 'memoryusedgb', 'memoryallocatedgb', 'networkread', 'networkwrite']
+    if (store.getters.metrics) {
+      fields.push(...metricsFields)
+    }
+    fields.push('clustername')
+    fields.push('zonename')
+    return fields
+  },
+  details: ['name', 'id', 'resourcestate', 'ipaddress', 'hypervisor', 'type', 'clustername', 'podname', 'zonename', 'disconnected', 'created'],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }],
+  related: [{
+    name: 'vm',
+    title: 'label.instances',
+    param: 'hostid'
+  }],
+  actions: [
+    {
+      api: 'addHost',
+      icon: 'plus',
+      label: 'label.add.host',
+      docHelp: 'adminguide/installguide/configuration.html#adding-a-host',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/HostAdd.vue')
+    },
+    {
+      api: 'updateHost',
+      icon: 'edit',
+      label: 'label.edit',
+      dataView: true,
+      args: ['name', 'hosttags', 'oscategoryid'],
+      mapping: {
+        oscategoryid: {
+          api: 'listOsCategories'
+        }
+      }
+    },
+    {
+      api: 'provisionCertificate',
+      icon: 'safety-certificate',
+      label: 'label.action.secure.host',
+      message: 'message.action.secure.host',
+      dataView: true,
+      show: (record) => { return record.hypervisor === 'KVM' },
+      args: ['hostid'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'reconnectHost',
+      icon: 'forward',
+      label: 'label.action.force.reconnect',
+      message: 'message.confirm.action.force.reconnect',
+      dataView: true,
+      show: (record) => { return ['Disconnected', 'Up'].includes(record.state) }
+    },
+    {
+      api: 'updateHost',
+      icon: 'pause-circle',
+      label: 'label.disable.host',
+      message: 'message.confirm.disable.host',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Disable' },
+      show: (record) => { return record.resourcestate === 'Enabled' }
+    },
+    {
+      api: 'updateHost',
+      icon: 'play-circle',
+      label: 'label.enable.host',
+      message: 'message.confirm.enable.host',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Enable' },
+      show: (record) => { return record.resourcestate === 'Disabled' }
+    },
+    {
+      api: 'prepareHostForMaintenance',
+      icon: 'plus-square',
+      label: 'label.action.enable.maintenance.mode',
+      message: 'message.action.host.enable.maintenance.mode',
+      docHelp: 'adminguide/hosts.html#maintaining-hypervisors-on-hosts',
+      dataView: true,
+      show: (record) => { return record.resourcestate === 'Enabled' }
+    },
+    {
+      api: 'cancelHostMaintenance',
+      icon: 'minus-square',
+      label: 'label.action.cancel.maintenance.mode',
+      message: 'message.action.cancel.maintenance.mode',
+      docHelp: 'adminguide/hosts.html#maintaining-hypervisors-on-hosts',
+      dataView: true,
+      show: (record) => { return record.resourcestate === 'Maintenance' || record.resourcestate === 'ErrorInMaintenance' || record.resourcestate === 'PrepareForMaintenance' }
+    },
+    {
+      api: 'configureOutOfBandManagement',
+      icon: 'setting',
+      label: 'label.outofbandmanagement.configure',
+      message: 'label.outofbandmanagement.configure',
+      docHelp: 'adminguide/hosts.html#out-of-band-management',
+      dataView: true,
+      args: ['hostid', 'address', 'port', 'username', 'password', 'driver'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        },
+        driver: {
+          options: ['ipmitool', 'nestedcloudstack', 'redfish']
+        }
+      }
+    },
+    {
+      api: 'enableOutOfBandManagementForHost',
+      icon: 'plus-circle',
+      label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
+      docHelp: 'adminguide/hosts.html#out-of-band-management',
+      dataView: true,
+      show: (record) => {
+        return !(record.outofbandmanagement && record.outofbandmanagement.enabled &&
+          record.outofbandmanagement.enabled === true)
+      },
+      args: ['hostid'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableOutOfBandManagementForHost',
+      icon: 'minus-circle',
+      label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
+      docHelp: 'adminguide/hosts.html#out-of-band-management',
+      dataView: true,
+      show: (record) => {
+        return record.outofbandmanagement && record.outofbandmanagement.enabled &&
+          record.outofbandmanagement.enabled === true
+      },
+      args: ['hostid'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'issueOutOfBandManagementPowerAction',
+      icon: 'login',
+      label: 'label.outofbandmanagement.action.issue',
+      message: 'label.outofbandmanagement.action.issue',
+      docHelp: 'adminguide/hosts.html#out-of-band-management',
+      dataView: true,
+      show: (record) => {
+        return record.outofbandmanagement && record.outofbandmanagement.enabled &&
+          record.outofbandmanagement.enabled === true
+      },
+      args: ['hostid', 'action'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        },
+        action: {
+          options: ['ON', 'OFF', 'CYCLE', 'RESET', 'SOFT', 'STATUS']
+        }
+      }
+    },
+    {
+      api: 'changeOutOfBandManagementPassword',
+      icon: 'key',
+      label: 'label.outofbandmanagement.changepassword',
+      message: 'label.outofbandmanagement.changepassword',
+      docHelp: 'adminguide/hosts.html#out-of-band-management',
+      dataView: true,
+      show: (record) => {
+        return record.outofbandmanagement && record.outofbandmanagement.enabled &&
+          record.outofbandmanagement.enabled === true
+      },
+      args: ['hostid', 'password'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'configureHAForHost',
+      icon: 'tool',
+      label: 'label.ha.configure',
+      message: 'label.ha.configure',
+      docHelp: 'adminguide/reliability.html#ha-for-hosts',
+      dataView: true,
+      show: (record) => { return ['KVM', 'Simulator'].includes(record.hypervisor) },
+      args: ['hostid', 'provider'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        },
+        provider: {
+          options: ['KVMHAProvider']
+        }
+      }
+    },
+    {
+      api: 'enableHAForHost',
+      icon: 'eye',
+      label: 'label.ha.enable',
+      message: 'label.ha.enable',
+      docHelp: 'adminguide/reliability.html#ha-for-hosts',
+      dataView: true,
+      show: (record) => {
+        return !(record.hostha && record.hostha.haenable &&
+          record.hostha.haenable === true)
+      },
+      args: ['hostid'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableHAForHost',
+      icon: 'eye-invisible',
+      label: 'label.ha.disable',
+      message: 'label.ha.disable',
+      docHelp: 'adminguide/reliability.html#ha-for-hosts',
+      dataView: true,
+      show: (record) => {
+        return record.hostha && record.hostha.haenable &&
+        record.hostha.haenable === true
+      },
+      args: ['hostid'],
+      mapping: {
+        hostid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'startRollingMaintenance',
+      icon: 'setting',
+      label: 'label.start.rolling.maintenance',
+      message: 'label.start.rolling.maintenance',
+      docHelp: 'adminguide/hosts.html#kvm-rolling-maintenance',
+      dataView: true,
+      show: (record) => {
+        return record.hypervisor === 'KVM' && (record.resourcestate === 'Enabled' || record.resourcestate === 'ErrorInMaintenance')
+      },
+      args: ['timeout', 'payload', 'forced', 'hostids'],
+      mapping: {
+        hostids: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'deleteHost',
+      icon: 'delete',
+      label: 'label.action.remove.host',
+      docHelp: 'adminguide/hosts.html#removing-hosts',
+      dataView: true,
+      args: ['forced'],
+      show: (record) => { return ['Maintenance', 'Disabled', 'Down', 'Alert', 'Disconnected'].includes(record.resourcestate) }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/ilbvms.js b/ui/src/config/section/infra/ilbvms.js
new file mode 100644
index 0000000..8b2434e
--- /dev/null
+++ b/ui/src/config/section/infra/ilbvms.js
@@ -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.
+
+export default {
+  name: 'ilbvm',
+  title: 'label.internal.lb',
+  icon: 'share-alt',
+  permission: ['listInternalLoadBalancerVMs'],
+  params: { projectid: '-1' },
+  columns: ['name', 'state', 'publicip', 'guestnetworkname', 'vpcname', 'version', 'hostname', 'account', 'zonename', 'requiresupgrade'],
+  details: ['name', 'id', 'version', 'requiresupgrade', 'guestnetworkname', 'vpcname', 'publicip', 'guestipaddress', 'linklocalip', 'serviceofferingname', 'networkdomain', 'isredundantrouter', 'redundantstate', 'hostname', 'account', 'zonename', 'created'],
+  actions: [
+    {
+      api: 'startInternalLoadBalancerVM',
+      icon: 'caret-right',
+      label: 'label.action.start.router',
+      message: 'message.confirm.start.lb.vm',
+      dataView: true,
+      show: (record) => { return record.state === 'Stopped' }
+    },
+    {
+      api: 'stopInternalLoadBalancerVM',
+      icon: 'poweroff',
+      label: 'label.action.stop.router',
+      dataView: true,
+      args: ['forced'],
+      show: (record) => { return record.state === 'Running' }
+    },
+    {
+      api: 'migrateSystemVm',
+      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 }
+        }
+      }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/nsp.js b/ui/src/config/section/infra/nsp.js
new file mode 100644
index 0000000..548c028
--- /dev/null
+++ b/ui/src/config/section/infra/nsp.js
@@ -0,0 +1,61 @@
+// 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.
+
+export default {
+  name: 'nsp',
+  title: 'label.network.service.providers',
+  icon: 'compass',
+  docHelp: 'adminguide/networking.html#network-service-providers',
+  hidden: true,
+  permission: ['listNetworkServiceProviders'],
+  columns: ['name', 'state', 'physicalnetworkid'],
+  details: ['name', 'state', 'servicelist', 'canenableindividualservice', 'physicalnetworkid'],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }],
+  actions: [
+    {
+      api: 'updateNetworkServiceProvider',
+      icon: 'stop',
+      label: 'label.disable.provider',
+      message: 'message.confirm.disable.provider',
+      dataView: true,
+      args: ['state'],
+      show: (record) => { return record.state === 'Enabled' },
+      mapping: {
+        state: {
+          value: (record) => { return 'Disabled' }
+        }
+      }
+    },
+    {
+      api: 'updateNetworkServiceProvider',
+      icon: 'right-circle',
+      label: 'label.enable.provider',
+      message: 'message.confirm.enable.provider',
+      dataView: true,
+      args: ['state'],
+      show: (record) => { return record.state === 'Disabled' },
+      mapping: {
+        state: {
+          value: (record) => { return 'Enabled' }
+        }
+      }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/phynetworks.js b/ui/src/config/section/infra/phynetworks.js
new file mode 100644
index 0000000..7545815
--- /dev/null
+++ b/ui/src/config/section/infra/phynetworks.js
@@ -0,0 +1,125 @@
+// 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.
+
+export default {
+  name: 'physicalnetwork',
+  title: 'label.physical.network',
+  docHelp: 'adminguide/networking_and_traffic.html#basic-zone-physical-network-configuration',
+  icon: 'api',
+  hidden: true,
+  permission: ['listPhysicalNetworks'],
+  columns: ['name', 'state', 'isolationmethods', 'vlan', 'broadcastdomainrange', 'zonename', 'tags'],
+  details: ['name', 'state', 'isolationmethods', 'vlan', 'broadcastdomainrange', 'zonename', 'tags'],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'traffic.types',
+    component: () => import('@/views/infra/network/TrafficTypesTab.vue')
+  }, {
+    name: 'network.service.providers',
+    component: () => import('@/views/infra/network/ServiceProvidersTab.vue')
+  }, {
+    name: 'dedicated.vlan.vni.ranges',
+    component: () => import('@/views/infra/network/DedicatedVLANTab.vue')
+  }],
+  related: [{
+    name: 'guestnetwork',
+    title: 'label.guest.networks',
+    param: 'physicalnetworkid'
+  }],
+  actions: [
+    {
+      api: 'createPhysicalNetwork',
+      icon: 'plus',
+      label: 'label.add.physical.network',
+      listView: true,
+      args: ['name', 'zoneid', 'isolationmethods', 'vlan', 'tags', 'networkspeed', 'broadcastdomainrange'],
+      mapping: {
+        isolationmethods: {
+          options: ['VLAN', 'VXLAN', 'GRE', 'STT', 'BCF_SEGMENT', 'SSP', 'ODL', 'L3VPN', 'VCS']
+        }
+      }
+    },
+    {
+      api: 'updatePhysicalNetwork',
+      icon: 'play-circle',
+      label: 'label.action.enable.physical.network',
+      dataView: true,
+      args: ['state'],
+      show: (record) => { return record.state === 'Disabled' },
+      mapping: {
+        state: {
+          value: (record) => { return 'Enabled' }
+        }
+      }
+    },
+    {
+      api: 'updatePhysicalNetwork',
+      icon: 'stop',
+      label: 'label.action.disable.physical.network',
+      dataView: true,
+      args: ['state'],
+      show: (record) => { return record.state === 'Enabled' },
+      mapping: {
+        state: {
+          value: (record) => { return 'Disabled' }
+        }
+      }
+    },
+    {
+      api: 'updatePhysicalNetwork',
+      icon: 'edit',
+      label: 'label.update.physical.network',
+      dataView: true,
+      args: ['vlan', 'tags']
+    },
+    {
+      api: 'addTrafficType',
+      icon: 'plus-square',
+      label: 'label.add.traffic.type',
+      dataView: true,
+      args: ['traffictype', 'physicalnetworkid', 'isolationmethod'],
+      mapping: {
+        traffictype: {
+          options: ['Public', 'Guest', 'Management', 'Storage']
+        },
+        physicalnetworkid: {
+          value: (record) => { return record.id }
+        },
+        isolationmethod: {
+          options: ['', 'vlan', 'vxlan']
+        }
+      }
+    },
+    {
+      api: 'updateTrafficType',
+      icon: 'branches',
+      label: 'label.update.traffic.label',
+      dataView: true,
+      popup: true,
+      component: () => import('@/views/infra/network/EditTrafficLabel.vue')
+    },
+    {
+      api: 'deletePhysicalNetwork',
+      icon: 'delete',
+      label: 'label.action.delete.physical.network',
+      message: 'message.action.delete.physical.network',
+      dataView: true
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/pods.js b/ui/src/config/section/infra/pods.js
new file mode 100644
index 0000000..dbc9791
--- /dev/null
+++ b/ui/src/config/section/infra/pods.js
@@ -0,0 +1,109 @@
+// 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.
+
+export default {
+  name: 'pod',
+  title: 'label.pods',
+  icon: 'appstore',
+  permission: ['listPods'],
+  columns: ['name', 'allocationstate', 'gateway', 'netmask', 'zonename'],
+  details: ['name', 'id', 'allocationstate', 'netmask', 'gateway', 'zonename'],
+  related: [{
+    name: 'cluster',
+    title: 'label.clusters',
+    param: 'podid'
+  }, {
+    name: 'host',
+    title: 'label.hosts',
+    param: 'podid'
+  }],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'resources',
+    component: () => import('@/views/infra/Resources.vue')
+  }],
+  actions: [
+    {
+      api: 'createPod',
+      icon: 'plus',
+      label: 'label.add.pod',
+      docHelp: 'installguide/configuration.html#adding-a-pod',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/PodAdd.vue')
+    },
+    {
+      api: 'updatePod',
+      icon: 'edit',
+      label: 'label.edit',
+      dataView: true,
+      args: ['name', 'netmask', 'gateway']
+    },
+    {
+      api: 'updatePod',
+      icon: 'play-circle',
+      label: 'label.action.enable.pod',
+      message: 'message.action.enable.pod',
+      docHelp: 'adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      show: (record) => { return record.allocationstate === 'Disabled' },
+      args: ['allocationstate'],
+      mapping: {
+        allocationstate: {
+          value: (record) => 'Enabled'
+        }
+      }
+    },
+    {
+      api: 'updatePod',
+      icon: 'pause-circle',
+      label: 'label.action.disable.pod',
+      message: 'message.action.disable.pod',
+      docHelp: 'adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      show: (record) => { return record.allocationstate === 'Enabled' },
+      args: ['allocationstate'],
+      mapping: {
+        allocationstate: {
+          value: (record) => 'Disabled'
+        }
+      }
+    },
+    {
+      api: 'startRollingMaintenance',
+      icon: 'setting',
+      label: 'label.start.rolling.maintenance',
+      message: 'label.start.rolling.maintenance',
+      dataView: true,
+      args: ['timeout', 'payload', 'forced', 'podids'],
+      mapping: {
+        podids: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'deletePod',
+      icon: 'delete',
+      label: 'label.action.delete.pod',
+      message: 'message.action.delete.pod',
+      dataView: true
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/primaryStorages.js b/ui/src/config/section/infra/primaryStorages.js
new file mode 100644
index 0000000..9f78ab9
--- /dev/null
+++ b/ui/src/config/section/infra/primaryStorages.js
@@ -0,0 +1,109 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'storagepool',
+  title: 'label.primary.storage',
+  icon: 'database',
+  docHelp: 'adminguide/storage.html#primary-storage',
+  permission: ['listStoragePoolsMetrics'],
+  columns: () => {
+    const fields = ['name', 'state', 'ipaddress', 'scope', 'type', 'path']
+    const metricsFields = ['disksizeusedgb', 'disksizetotalgb', 'disksizeallocatedgb', 'disksizeunallocatedgb']
+    if (store.getters.metrics) {
+      fields.push(...metricsFields)
+    }
+    fields.push('clustername')
+    fields.push('zonename')
+    return fields
+  },
+  details: ['name', 'id', 'ipaddress', 'type', 'scope', 'tags', 'path', 'provider', 'hypervisor', 'overprovisionfactor', 'disksizetotal', 'disksizeallocated', 'disksizeused', 'clustername', 'podname', 'zonename', 'created'],
+  related: [{
+    name: 'volume',
+    title: 'label.volumes',
+    param: 'storageid'
+  }],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'settings',
+    component: () => import('@/components/view/SettingsTab.vue')
+  }],
+  actions: [
+    {
+      api: 'createStoragePool',
+      icon: 'plus',
+      docHelp: 'installguide/configuration.html#add-primary-storage',
+      label: 'label.add.primary.storage',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/AddPrimaryStorage.vue')
+    },
+    {
+      api: 'updateStoragePool',
+      icon: 'edit',
+      label: 'label.edit',
+      dataView: true,
+      args: ['name', 'tags', 'capacitybytes', 'capacityiops']
+    },
+    {
+      api: 'updateStoragePool',
+      icon: 'pause-circle',
+      label: 'label.disable.storage',
+      message: 'message.confirm.disable.storage',
+      dataView: true,
+      defaultArgs: { enabled: false },
+      show: (record) => { return record.state === 'Up' }
+    },
+    {
+      api: 'updateStoragePool',
+      icon: 'play-circle',
+      label: 'label.enable.storage',
+      message: 'message.confirm.enable.storage',
+      dataView: true,
+      defaultArgs: { enabled: true },
+      show: (record) => { return record.state === 'Disabled' }
+    },
+    {
+      api: 'enableStorageMaintenance',
+      icon: 'plus-square',
+      label: 'label.action.enable.maintenance.mode',
+      message: 'message.action.primarystorage.enable.maintenance.mode',
+      dataView: true,
+      show: (record) => { return ['Up', 'Connecting', 'Down', 'ErrorInMaintenance'].includes(record.state) }
+    },
+    {
+      api: 'cancelStorageMaintenance',
+      icon: 'minus-square',
+      label: 'label.action.cancel.maintenance.mode',
+      message: 'message.action.cancel.maintenance.mode',
+      dataView: true,
+      show: (record) => { return ['Maintenance', 'PrepareForMaintenance', 'ErrorInMaintenance'].includes(record.state) }
+    },
+    {
+      api: 'deleteStoragePool',
+      icon: 'delete',
+      label: 'label.action.delete.primary.storage',
+      dataView: true,
+      args: ['forced'],
+      show: (record) => { return (record.state === 'Down' || record.state === 'Maintenance' || record.state === 'Disconnected') }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/routers.js b/ui/src/config/section/infra/routers.js
new file mode 100644
index 0000000..b109914
--- /dev/null
+++ b/ui/src/config/section/infra/routers.js
@@ -0,0 +1,159 @@
+// 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.
+
+export default {
+  name: 'router',
+  title: 'label.virtual.routers',
+  icon: 'fork',
+  docHelp: 'adminguide/systemvm.html#virtual-router',
+  permission: ['listRouters'],
+  params: { projectid: '-1' },
+  columns: ['name', 'state', 'publicip', 'guestnetworkname', 'vpcname', 'redundantstate', 'version', 'hostname', 'account', 'zonename', 'requiresupgrade'],
+  searchFilters: ['name', 'zoneid', 'podid', 'clusterid'],
+  details: ['name', 'id', 'version', 'requiresupgrade', 'guestnetworkname', 'vpcname', 'publicip', 'guestipaddress', 'linklocalip', 'serviceofferingname', 'networkdomain', 'isredundantrouter', 'redundantstate', 'hostname', 'account', 'zonename', 'created'],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'nics',
+    component: () => import('@/views/network/NicsTable.vue')
+  }, {
+    name: 'router.health.checks',
+    show: (record, route, user) => { return ['Running'].includes(record.state) && ['Admin'].includes(user.roletype) },
+    component: () => import('@views/infra/routers/RouterHealthCheck.vue')
+  }],
+  related: [{
+    name: 'vm',
+    title: 'label.instances',
+    param: 'networkid',
+    value: 'guestnetworkid'
+  }],
+  actions: [
+    {
+      api: 'startRouter',
+      icon: 'caret-right',
+      label: 'label.action.start.router',
+      message: 'message.action.start.router',
+      dataView: true,
+      show: (record) => { return record.state === 'Stopped' }
+    },
+    {
+      api: 'stopRouter',
+      icon: 'poweroff',
+      label: 'label.action.stop.router',
+      message: 'message.action.stop.router',
+      dataView: true,
+      args: ['forced'],
+      show: (record) => { return record.state === 'Running' }
+    },
+    {
+      api: 'rebootRouter',
+      icon: 'sync',
+      label: 'label.action.reboot.router',
+      message: 'message.action.reboot.router',
+      dataView: true,
+      hidden: (record) => { return record.state === 'Running' }
+    },
+    {
+      api: 'scaleSystemVm',
+      icon: 'arrows-alt',
+      label: 'label.change.service.offering',
+      message: 'message.confirm.scale.up.router.vm',
+      dataView: true,
+      args: ['serviceofferingid'],
+      show: (record) => { return record.hypervisor !== 'KVM' },
+      mapping: {
+        serviceofferingid: {
+          api: 'listServiceOfferings',
+          params: (record) => {
+            return {
+              virtualmachineid: record.id,
+              issystem: true,
+              systemvmtype: 'domainrouter'
+            }
+          }
+        }
+      }
+    },
+    {
+      api: 'upgradeRouterTemplate',
+      icon: 'fullscreen',
+      label: 'label.upgrade.router.newer.template',
+      message: 'message.confirm.upgrade.router.newer.template',
+      docHelp: 'adminguide/systemvm.html#upgrading-virtual-routers',
+      dataView: true,
+      groupAction: true,
+      show: (record) => { return record.requiresupgrade }
+    },
+    {
+      api: 'migrateSystemVm',
+      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 } }
+        }
+      }
+    },
+    {
+      api: 'runDiagnostics',
+      icon: 'reconciliation',
+      label: 'label.action.run.diagnostics',
+      dataView: true,
+      show: (record, store) => { return ['Running'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
+      args: ['targetid', 'type', 'ipaddress', 'params'],
+      mapping: {
+        targetid: {
+          value: (record) => { return record.id }
+        },
+        type: {
+          options: ['ping', 'traceroute', 'arping']
+        }
+      },
+      response: (result) => { return result && result.diagnostics ? `<strong>Output</strong>:<br/>${result.diagnostics.stdout}<br/><strong>Error</strong>: ${result.diagnostics.stderr}<br/><strong>Exit Code</strong>: ${result.diagnostics.exitcode}` : 'Invalid response' }
+    },
+    {
+      api: 'getDiagnosticsData',
+      icon: 'download',
+      label: 'label.action.get.diagnostics',
+      dataView: true,
+      show: (record, store) => { return ['Running'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
+      args: ['targetid', 'files'],
+      mapping: {
+        targetid: {
+          value: (record) => { return record.id }
+        }
+      },
+      response: (result) => { return result && result.diagnostics && result.diagnostics.url ? `Please click the link to download the retrieved diagnostics: <p><a href='${result.diagnostics.url}'>${result.diagnostics.url}</a></p>` : 'Invalid response' }
+    },
+    {
+      api: 'destroyRouter',
+      icon: 'delete',
+      label: 'label.destroy.router',
+      message: 'message.confirm.destroy.router',
+      dataView: true,
+      show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/secondaryStorages.js b/ui/src/config/section/infra/secondaryStorages.js
new file mode 100644
index 0000000..7395ff9
--- /dev/null
+++ b/ui/src/config/section/infra/secondaryStorages.js
@@ -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.
+import store from '@/store'
+
+export default {
+  name: 'imagestore',
+  title: 'label.secondary.storage',
+  icon: 'picture',
+  docHelp: 'adminguide/storage.html#secondary-storage',
+  permission: ['listImageStores'],
+  columns: () => {
+    var fields = ['name', 'url', 'protocol', 'scope', 'zonename']
+    if (store.getters.apis.listImageStores.params.filter(x => x.name === 'readonly').length > 0) {
+      fields.push('readonly')
+    }
+    return fields
+  },
+  details: () => {
+    var fields = ['name', 'id', 'url', 'protocol', 'provider', 'scope', 'zonename']
+    if (store.getters.apis.listImageStores.params.filter(x => x.name === 'readonly').length > 0) {
+      fields.push('readonly')
+    }
+    return fields
+  },
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'settings',
+    component: () => import('@/components/view/SettingsTab.vue')
+  }],
+  actions: [
+    {
+      api: 'migrateSecondaryStorageData',
+      icon: 'drag',
+      label: 'label.migrate.data.from.image.store',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/MigrateData.vue')
+    },
+    {
+      api: 'addImageStore',
+      icon: 'plus',
+      docHelp: 'installguide/configuration.html#add-secondary-storage',
+      label: 'label.add.secondary.storage',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/AddSecondaryStorage.vue')
+    },
+    {
+      api: 'deleteImageStore',
+      icon: 'delete',
+      label: 'label.action.delete.secondary.storage',
+      message: 'message.action.delete.secondary.storage',
+      dataView: true
+    },
+    {
+      api: 'updateImageStore',
+      icon: 'stop',
+      label: 'Make Image store read-only',
+      dataView: true,
+      defaultArgs: { readonly: true },
+      show: (record) => { return record.readonly === false }
+    },
+    {
+      api: 'updateImageStore',
+      icon: 'check-circle',
+      label: 'Make Image store read-write',
+      dataView: true,
+      defaultArgs: { readonly: false },
+      show: (record) => { return record.readonly === true }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/systemVms.js b/ui/src/config/section/infra/systemVms.js
new file mode 100644
index 0000000..8b3c66a
--- /dev/null
+++ b/ui/src/config/section/infra/systemVms.js
@@ -0,0 +1,124 @@
+// 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.
+
+export default {
+  name: 'systemvm',
+  title: 'label.system.vms',
+  icon: 'thunderbolt',
+  docHelp: 'adminguide/systemvm.html',
+  permission: ['listSystemVms'],
+  columns: ['name', 'state', 'agentstate', 'systemvmtype', 'publicip', 'privateip', 'linklocalip', 'hostname', 'zonename'],
+  details: ['name', 'id', 'agentstate', 'systemvmtype', 'publicip', 'privateip', 'linklocalip', 'gateway', 'hostname', 'zonename', 'created', 'activeviewersessions'],
+  actions: [
+    {
+      api: 'startSystemVm',
+      icon: 'caret-right',
+      label: 'label.action.start.systemvm',
+      message: 'message.action.start.systemvm',
+      dataView: true,
+      show: (record) => { return record.state === 'Stopped' }
+    },
+    {
+      api: 'stopSystemVm',
+      icon: 'poweroff',
+      label: 'label.action.stop.systemvm',
+      message: 'message.action.stop.systemvm',
+      dataView: true,
+      show: (record) => { return record.state === 'Running' },
+      args: ['forced']
+    },
+    {
+      api: 'rebootSystemVm',
+      icon: 'sync',
+      label: 'label.action.reboot.systemvm',
+      message: 'message.action.reboot.systemvm',
+      dataView: true,
+      show: (record) => { return record.state === 'Running' }
+    },
+    {
+      api: 'scaleSystemVm',
+      icon: 'arrows-alt',
+      label: 'label.change.service.offering',
+      message: 'message.confirm.scale.up.system.vm',
+      dataView: true,
+      show: (record) => { return record.state === 'Running' && record.hypervisor === 'VMware' || record.state === 'Stopped' },
+      args: ['serviceofferingid'],
+      mapping: {
+        serviceofferingid: {
+          api: 'listServiceOfferings',
+          params: (record) => { return { virtualmachineid: record.id, issystem: true, systemvmtype: record.systemvmtype } }
+        }
+      }
+    },
+    {
+      api: 'migrateSystemVm',
+      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 } }
+        }
+      }
+    },
+    {
+      api: 'runDiagnostics',
+      icon: 'reconciliation',
+      label: 'label.action.run.diagnostics',
+      dataView: true,
+      show: (record) => { return record.state === 'Running' },
+      args: ['targetid', 'type', 'ipaddress', 'params'],
+      mapping: {
+        targetid: {
+          value: (record) => { return record.id }
+        },
+        type: {
+          options: ['ping', 'traceroute', 'arping']
+        }
+      },
+      response: (result) => { return result && result.diagnostics ? `<strong>Output</strong>:<br/>${result.diagnostics.stdout}<br/><strong>Error</strong>: ${result.diagnostics.stderr}<br/><strong>Exit Code</strong>: ${result.diagnostics.exitcode}` : 'Invalid response' }
+    },
+    {
+      api: 'getDiagnosticsData',
+      icon: 'download',
+      label: 'label.action.get.diagnostics',
+      dataView: true,
+      show: (record) => { return record.state === 'Running' },
+      args: ['targetid', 'files'],
+      mapping: {
+        targetid: {
+          value: (record) => { return record.id }
+        }
+      },
+      response: (result) => { return result && result.diagnostics && result.diagnostics.url ? `Please click the link to download the retrieved diagnostics: <p><a href='${result.diagnostics.url}'>${result.diagnostics.url}</a></p>` : 'Invalid response' }
+    },
+    {
+      api: 'destroySystemVm',
+      icon: 'delete',
+      label: 'label.action.destroy.systemvm',
+      message: 'message.action.destroy.systemvm',
+      dataView: true,
+      show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }
+    }
+  ]
+}
diff --git a/ui/src/config/section/infra/zones.js b/ui/src/config/section/infra/zones.js
new file mode 100644
index 0000000..7254155
--- /dev/null
+++ b/ui/src/config/section/infra/zones.js
@@ -0,0 +1,249 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'zone',
+  title: 'label.zones',
+  icon: 'global',
+  permission: ['listZonesMetrics'],
+  columns: () => {
+    const fields = ['name', 'allocationstate', 'networktype', 'clusters']
+    const metricsFields = ['cpuused', 'cpumaxdeviation', 'cpuallocated', 'cputotal', 'memoryused', 'memorymaxdeviation', 'memoryallocated', 'memorytotal']
+    if (store.getters.metrics) {
+      fields.push(...metricsFields)
+    }
+    fields.push('order')
+    return fields
+  },
+  details: ['name', 'id', 'allocationstate', 'networktype', 'guestcidraddress', 'localstorageenabled', 'securitygroupsenabled', 'dns1', 'dns2', 'internaldns1', 'internaldns2'],
+  related: [{
+    name: 'pod',
+    title: 'label.pods',
+    param: 'zoneid'
+  }, {
+    name: 'cluster',
+    title: 'label.clusters',
+    param: 'zoneid'
+  }, {
+    name: 'host',
+    title: 'label.hosts',
+    param: 'zoneid'
+  }, {
+    name: 'storagepool',
+    title: 'label.primary.storage',
+    param: 'zoneid'
+  }, {
+    name: 'imagestore',
+    title: 'label.secondary.storage',
+    param: 'zoneid'
+  }],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'physical.network',
+    component: () => import('@/views/infra/zone/PhysicalNetworksTab.vue')
+  }, {
+    name: 'system.vms',
+    component: () => import('@/views/infra/zone/SystemVmsTab.vue')
+  }, {
+    name: 'resources',
+    component: () => import('@/views/infra/Resources.vue')
+  }, {
+    name: 'settings',
+    component: () => import('@/components/view/SettingsTab.vue')
+  }],
+  actions: [
+    {
+      api: 'createZone',
+      icon: 'plus',
+      label: 'label.add.zone',
+      docHelp: 'installguide/configuration.html#adding-a-zone',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/infra/zone/ZoneWizard.vue')
+    },
+    {
+      api: 'updateZone',
+      icon: 'edit',
+      label: 'label.action.edit.zone',
+      dataView: true,
+      args: ['name', 'dns1', 'dns2', 'ip6dns1', 'ip6dns2', 'internaldns1', 'internaldns2', 'guestcidraddress', 'domain', 'localstorageenabled'],
+      show: (record) => { return record.networktype === 'Advanced' }
+    },
+    {
+      api: 'updateZone',
+      icon: 'edit',
+      label: 'label.action.edit.zone',
+      dataView: true,
+      args: ['name', 'dns1', 'dns2', 'ip6dns1', 'ip6dns2', 'internaldns1', 'internaldns2', 'domain', 'localstorageenabled'],
+      show: (record) => { return record.networktype === 'Basic' }
+    },
+    {
+      api: 'updateZone',
+      icon: 'pause-circle',
+      label: 'label.action.disable.zone',
+      message: 'message.action.disable.zone',
+      docHelp: 'adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Disabled' },
+      show: (record) => { return record.allocationstate === 'Enabled' }
+    },
+    {
+      api: 'updateZone',
+      icon: 'play-circle',
+      label: 'label.action.enable.zone',
+      message: 'message.action.enable.zone',
+      docHelp: 'adminguide/hosts.html#disabling-and-enabling-zones-pods-and-clusters',
+      dataView: true,
+      defaultArgs: { allocationstate: 'Enabled' },
+      show: (record) => { return record.allocationstate === 'Disabled' }
+    },
+    {
+      api: 'enableOutOfBandManagementForZone',
+      icon: 'plus-circle',
+      label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
+      dataView: true,
+      show: (record) => {
+        return record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
+          record.resourcedetails.outOfBandManagementEnabled === 'false'
+      },
+      args: ['zoneid'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableOutOfBandManagementForZone',
+      icon: 'minus-circle',
+      label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
+      dataView: true,
+      show: (record) => {
+        return !(record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
+          record.resourcedetails.outOfBandManagementEnabled === 'false')
+      },
+      args: ['zoneid'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'enableHAForZone',
+      icon: 'eye',
+      label: 'label.ha.enable',
+      message: 'label.ha.enable',
+      dataView: true,
+      show: (record) => {
+        return record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
+          record.resourcedetails.resourceHAEnabled === 'false'
+      },
+      args: ['zoneid'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'disableHAForZone',
+      icon: 'eye-invisible',
+      label: 'label.ha.disable',
+      message: 'label.ha.disable',
+      dataView: true,
+      show: (record) => {
+        return !(record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
+          record.resourcedetails.resourceHAEnabled === 'false')
+      },
+      args: ['zoneid'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'addVmwareDc',
+      icon: 'block',
+      label: 'label.add.vmware.datacenter',
+      dataView: true,
+      show: record => !record.vmwaredc,
+      args: ['zoneid', 'name', 'vcenter', 'username', 'password'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'updateVmwareDc',
+      icon: 'block',
+      label: 'label.update.vmware.datacenter',
+      message: 'message.restart.mgmt.server',
+      additionalMessage: 'message.restart.mgmt.server',
+      dataView: true,
+      show: record => record.vmwaredc,
+      args: ['zoneid', 'name', 'vcenter', 'username', 'password'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'removeVmwareDc',
+      icon: 'minus-square',
+      label: 'label.remove.vmware.datacenter',
+      message: 'message.confirm.remove.vmware.datacenter',
+      dataView: true,
+      show: record => record.vmwaredc,
+      args: ['zoneid'],
+      mapping: {
+        zoneid: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'startRollingMaintenance',
+      icon: 'setting',
+      label: 'label.start.rolling.maintenance',
+      message: 'label.start.rolling.maintenance',
+      dataView: true,
+      args: ['timeout', 'payload', 'forced', 'zoneids'],
+      mapping: {
+        zoneids: {
+          value: (record) => { return record.id }
+        }
+      }
+    },
+    {
+      api: 'deleteZone',
+      icon: 'delete',
+      label: 'label.action.delete.zone',
+      message: 'message.action.delete.zone',
+      dataView: true
+    }
+  ]
+}
diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js
new file mode 100644
index 0000000..e3fc40f
--- /dev/null
+++ b/ui/src/config/section/network.js
@@ -0,0 +1,626 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'network',
+  title: 'label.network',
+  icon: 'wifi',
+  docHelp: 'adminguide/networking_and_traffic.html#advanced-zone-physical-network-configuration',
+  children: [
+    {
+      name: 'guestnetwork',
+      title: 'label.guest.networks',
+      icon: 'apartment',
+      permission: ['listNetworks'],
+      resourceType: 'Network',
+      columns: ['name', 'state', 'type', 'vpcname', 'cidr', 'ip6cidr', 'broadcasturi', 'domain', 'account', 'zonename'],
+      details: ['name', 'id', 'description', 'type', 'traffictype', 'vpcid', 'vlan', 'broadcasturi', 'cidr', 'ip6cidr', 'netmask', 'gateway', 'aclname', 'ispersistent', 'restartrequired', 'reservediprange', 'redundantrouter', 'networkdomain', 'zonename', 'account', 'domain'],
+      filters: ['all', 'isolated', 'shared', 'l2'],
+      searchFilters: ['keyword', 'zoneid', 'domainid', 'account', 'tags'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'networkid'
+      }],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'egress.rules',
+        component: () => import('@/views/network/EgressRulesTab.vue'),
+        show: (record) => { return record.type === 'Isolated' && !('vpcid' in record) && 'listEgressFirewallRules' in store.getters.apis }
+      }, {
+        name: 'public.ip.addresses',
+        component: () => import('@/views/network/IpAddressesTab.vue'),
+        show: (record) => { return record.type === 'Isolated' && !('vpcid' in record) && 'listPublicIpAddresses' in store.getters.apis }
+      }, {
+        name: 'virtual.routers',
+        component: () => import('@/views/network/RoutersTab.vue'),
+        show: (record) => { return (record.type === 'Isolated' || record.type === 'Shared') && 'listRouters' in store.getters.apis }
+      }, {
+        name: 'guest.ip.range',
+        component: () => import('@/views/network/GuestIpRanges.vue'),
+        show: (record) => { return 'listVlanIpRanges' in store.getters.apis && (record.type === 'Shared' || (record.service && record.service.filter(x => x.name === 'SourceNat').count === 0)) }
+      }],
+      actions: [
+        {
+          api: 'createNetwork',
+          icon: 'plus',
+          label: 'label.add.network',
+          docHelp: 'adminguide/networking_and_traffic.html#configure-guest-traffic-in-an-advanced-zone',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/network/CreateNetwork.vue')
+        },
+        {
+          api: 'updateNetwork',
+          icon: 'edit',
+          label: 'label.edit',
+          dataView: true,
+          args: (record) => {
+            var fields = ['name', 'displaytext', 'guestvmcidr']
+            if (record.type === 'Isolated') {
+              fields.push(...['networkofferingid', 'networkdomain'])
+            }
+            return fields
+          }
+        },
+        {
+          api: 'restartNetwork',
+          icon: 'sync',
+          label: 'label.restart.network',
+          dataView: true,
+          args: ['cleanup', 'makeredundant'],
+          show: (record) => record.type !== 'L2'
+        },
+        {
+          api: 'replaceNetworkACLList',
+          icon: 'swap',
+          label: 'label.replace.acl.list',
+          message: 'message.confirm.replace.acl.new.one',
+          docHelp: 'adminguide/networking_and_traffic.html#configuring-network-access-control-list',
+          dataView: true,
+          show: (record) => { return record.vpcid },
+          args: ['aclid', 'networkid'],
+          mapping: {
+            aclid: {
+              api: 'listNetworkACLLists',
+              params: (record) => { return { vpcid: record.vpcid } }
+            },
+            networkid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'deleteNetwork',
+          icon: 'delete',
+          label: 'label.action.delete.network',
+          message: 'message.action.delete.network',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'vpc',
+      title: 'label.vpc',
+      icon: 'deployment-unit',
+      docHelp: 'adminguide/networking_and_traffic.html#configuring-a-virtual-private-cloud',
+      permission: ['listVPCs'],
+      resourceType: 'Vpc',
+      columns: ['name', 'state', 'displaytext', 'cidr', 'account', 'zonename'],
+      details: ['name', 'id', 'displaytext', 'cidr', 'networkdomain', 'ispersistent', 'redundantvpcrouter', 'restartrequired', 'zonename', 'account', 'domain'],
+      searchFilters: ['name', 'zoneid', 'domainid', 'account', 'tags'],
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'vpcid'
+      }, {
+        name: 'router',
+        title: 'label.virtual.routers',
+        param: 'vpcid'
+      }, {
+        name: 'ilbvm',
+        title: 'label.internal.lb',
+        param: 'vpcid'
+      }],
+      tabs: [{
+        name: 'vpc',
+        component: () => import('@/views/network/VpcTab.vue')
+      }],
+      actions: [
+        {
+          api: 'createVPC',
+          icon: 'plus',
+          label: 'label.add.vpc',
+          docHelp: 'adminguide/networking_and_traffic.html#adding-a-virtual-private-cloud',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/network/CreateVpc.vue')
+        },
+        {
+          api: 'updateVPC',
+          icon: 'edit',
+          label: 'label.edit',
+          dataView: true,
+          args: ['name', 'displaytext']
+        },
+        {
+          api: 'restartVPC',
+          icon: 'sync',
+          label: 'label.restart.vpc',
+          message: 'message.restart.vpc',
+          dataView: true,
+          args: (record) => {
+            var fields = ['cleanup']
+            if (!record.redundantvpcrouter) {
+              fields.push('makeredundant')
+            }
+            return fields
+          }
+        },
+        {
+          api: 'deleteVPC',
+          icon: 'delete',
+          label: 'label.remove.vpc',
+          message: 'message.remove.vpc',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'securitygroups',
+      title: 'label.security.groups',
+      icon: 'fire',
+      docHelp: 'adminguide/networking_and_traffic.html#security-groups',
+      permission: ['listSecurityGroups'],
+      resourceType: 'SecurityGroup',
+      columns: ['name', 'description', 'account', 'domain'],
+      details: ['name', 'id', 'description', 'account', 'domain'],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'ingress.rule',
+        component: () => import('@/views/network/IngressEgressRuleConfigure.vue')
+      }, {
+        name: 'egress.rule',
+        component: () => import('@/views/network/IngressEgressRuleConfigure.vue')
+      }],
+      show: () => {
+        if (!store.getters.zones || store.getters.zones.length === 0) {
+          return false
+        }
+        const listZoneHaveSGEnabled = store.getters.zones.filter(zone => zone.securitygroupsenabled === true)
+        if (!listZoneHaveSGEnabled || listZoneHaveSGEnabled.length === 0) {
+          return false
+        }
+        return true
+      },
+      actions: [
+        {
+          api: 'createSecurityGroup',
+          icon: 'plus',
+          label: 'label.add.security.group',
+          docHelp: 'adminguide/networking_and_traffic.html#adding-a-security-group',
+          listView: true,
+          args: ['name', 'description']
+        },
+        {
+          api: 'updateSecurityGroup',
+          icon: 'edit',
+          label: 'label.edit',
+          dataView: true,
+          args: ['name'],
+          show: (record) => { return record.name !== 'default' }
+        },
+        {
+          api: 'deleteSecurityGroup',
+          icon: 'delete',
+          label: 'label.action.delete.security.group',
+          message: 'message.action.delete.security.group',
+          dataView: true,
+          show: (record) => { return record.name !== 'default' }
+        }
+      ]
+    },
+    {
+      name: 'publicip',
+      title: 'label.public.ip.addresses',
+      icon: 'environment',
+      docHelp: 'adminguide/networking_and_traffic.html#reserving-public-ip-addresses-and-vlans-for-accounts',
+      permission: ['listPublicIpAddresses'],
+      resourceType: 'PublicIpAddress',
+      columns: ['ipaddress', 'state', 'associatednetworkname', 'virtualmachinename', 'allocated', 'account', 'zonename'],
+      details: ['ipaddress', 'id', 'associatednetworkname', 'virtualmachinename', 'networkid', 'issourcenat', 'isstaticnat', 'virtualmachinename', 'vmipaddress', 'vlan', 'allocated', 'account', 'zonename'],
+      component: () => import('@/views/network/PublicIpResource.vue'),
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'firewall',
+        component: () => import('@/views/network/FirewallRules.vue'),
+        networkServiceFilter: networkService => networkService.filter(x => x.name === 'Firewall').length > 0
+      },
+      {
+        name: 'portforwarding',
+        component: () => import('@/views/network/PortForwarding.vue'),
+        networkServiceFilter: networkService => networkService.filter(x => x.name === 'PortForwarding').length > 0
+      }, {
+        name: 'loadbalancing',
+        component: () => import('@/views/network/LoadBalancing.vue'),
+        networkServiceFilter: networkService => networkService.filter(x => x.name === 'Lb').length > 0
+      }, {
+        name: 'vpn',
+        component: () => import('@/views/network/VpnDetails.vue'),
+        show: (record) => { return record.issourcenat }
+      }],
+      actions: [
+        {
+          api: 'enableStaticNat',
+          icon: 'plus-circle',
+          label: 'label.action.enable.static.nat',
+          docHelp: 'adminguide/networking_and_traffic.html#enabling-or-disabling-static-nat',
+          dataView: true,
+          show: (record) => { return !record.virtualmachineid && !record.issourcenat },
+          popup: true,
+          component: () => import('@/views/network/EnableStaticNat.vue')
+        },
+        {
+          api: 'disableStaticNat',
+          icon: 'minus-circle',
+          label: 'label.action.disable.static.nat',
+          message: 'message.action.disable.static.nat',
+          docHelp: 'adminguide/networking_and_traffic.html#enabling-or-disabling-static-nat',
+          dataView: true,
+          show: (record) => { return record.virtualmachineid },
+          args: ['ipaddressid'],
+          mapping: {
+            ipaddressid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'disassociateIpAddress',
+          icon: 'delete',
+          label: 'label.action.release.ip',
+          message: 'message.action.release.ip',
+          docHelp: 'adminguide/networking_and_traffic.html#releasing-an-ip-address-alloted-to-a-vpc',
+          dataView: true,
+          show: (record) => { return !record.issourcenat }
+        }
+      ]
+    },
+    {
+      name: 'privategw',
+      title: 'label.private.gateway',
+      icon: 'gateway',
+      hidden: true,
+      permission: ['listPrivateGateways'],
+      columns: ['ipaddress', 'state', 'gateway', 'netmask', 'account'],
+      details: ['ipaddress', 'gateway', 'netmask', 'vlan', 'sourcenatsupported', 'aclname', 'account', 'domain', 'zone'],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'static.routes',
+        component: () => import('@/views/network/StaticRoutesTab.vue'),
+        show: () => true
+      }],
+      actions: [
+        {
+          api: 'createPrivateGateway',
+          icon: 'plus',
+          label: 'label.add.private.gateway',
+          docHelp: 'adminguide/networking_and_traffic.html#adding-a-private-gateway-to-a-vpc',
+          listView: true,
+          args: (record, store) => {
+            var fields = ['vpcid', 'physicalnetworkid', 'vlan', 'ipaddress', 'gateway', 'netmask', 'sourcenatsupported', 'aclid']
+            if (store.apis.createPrivateGateway.params.filter(x => x.name === 'bypassvlanoverlapcheck').length > 0) {
+              fields.push('bypassvlanoverlapcheck')
+            }
+            return fields
+          },
+          mapping: {
+            aclid: {
+              api: 'listNetworkACLLists'
+            }
+          }
+        },
+        {
+          api: 'replaceNetworkACLList',
+          icon: 'swap',
+          label: 'label.replace.acl.list',
+          message: 'message.confirm.replace.acl.new.one',
+          docHelp: 'adminguide/networking_and_traffic.html#acl-on-private-gateway',
+          dataView: true,
+          args: ['aclid', 'gatewayid'],
+          mapping: {
+            aclid: {
+              api: 'listNetworkACLLists',
+              params: (record) => { return { vpcid: record.vpcid } }
+            },
+            gatewayid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'deletePrivateGateway',
+          icon: 'delete',
+          label: 'label.delete.gateway',
+          message: 'message.delete.gateway',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 's2svpn',
+      title: 'label.site.to.site.vpn',
+      icon: 'lock',
+      hidden: true,
+      permission: ['listVpnGateways'],
+      columns: ['publicip', 'account', 'domain'],
+      details: ['publicip', 'account', 'domain'],
+      actions: [
+        {
+          api: 'createVpnGateway',
+          icon: 'plus',
+          label: 'label.add.vpn.gateway',
+          docHelp: 'adminguide/networking_and_traffic.html#creating-a-vpn-gateway-for-the-vpc',
+          listView: true,
+          args: ['vpcid']
+        },
+        {
+          api: 'deleteVpnGateway',
+          icon: 'delete',
+          label: 'label.delete.vpn.gateway',
+          message: 'message.delete.vpn.gateway',
+          docHelp: 'adminguide/networking_and_traffic.html#restarting-and-removing-a-vpn-connection',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 's2svpnconn',
+      title: 'label.site.to.site.vpn.connections',
+      docHelp: 'adminguide/networking_and_traffic.html#setting-up-a-site-to-site-vpn-connection',
+      icon: 'sync',
+      hidden: true,
+      permission: ['listVpnConnections'],
+      columns: ['publicip', 'state', 'gateway', 'ipsecpsk', 'ikepolicy', 'esppolicy'],
+      details: ['publicip', 'gateway', 'passive', 'cidrlist', 'ipsecpsk', 'ikepolicy', 'esppolicy', 'ikelifetime', 'esplifetime', 'dpd', 'forceencap', 'created'],
+      actions: [
+        {
+          api: 'createVpnConnection',
+          icon: 'plus',
+          label: 'label.create.vpn.connection',
+          docHelp: 'adminguide/networking_and_traffic.html#creating-a-vpn-connection',
+          listView: true,
+          args: ['s2scustomergatewayid', 's2svpngatewayid', 'passive'],
+          mapping: {
+            s2scustomergatewayid: {
+              api: 'listVpnCustomerGateways'
+            },
+            s2svpngatewayid: {
+              api: 'listVpnGateways'
+            }
+          }
+        },
+        {
+          api: 'resetVpnConnection',
+          icon: 'reload',
+          label: 'label.reset.vpn.connection',
+          message: 'message.reset.vpn.connection',
+          docHelp: 'adminguide/networking_and_traffic.html#restarting-and-removing-a-vpn-connection',
+          dataView: true
+        },
+        {
+          api: 'deleteVpnConnection',
+          icon: 'delete',
+          label: 'label.delete.vpn.connection',
+          message: 'message.delete.vpn.connection',
+          docHelp: 'adminguide/networking_and_traffic.html#restarting-and-removing-a-vpn-connection',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'acllist',
+      title: 'label.network.acl.lists',
+      icon: 'bars',
+      docHelp: 'adminguide/networking_and_traffic.html#configuring-network-access-control-list',
+      hidden: true,
+      permission: ['listNetworkACLLists'],
+      columns: ['name', 'description', 'id'],
+      details: ['name', 'description', 'id'],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'acl.list.rules',
+        component: () => import('@/views/network/AclListRulesTab.vue'),
+        show: () => true
+      }],
+      actions: [
+        {
+          api: 'createNetworkACLList',
+          icon: 'plus',
+          label: 'label.add.acl.list',
+          docHelp: 'adminguide/networking_and_traffic.html#creating-acl-lists',
+          listView: true,
+          args: ['name', 'description', 'vpcid']
+        },
+        {
+          api: 'updateNetworkACLList',
+          icon: 'edit',
+          label: 'label.edit.acl.list',
+          dataView: true,
+          args: ['name', 'description']
+        },
+        {
+          api: 'deleteNetworkACLList',
+          icon: 'delete',
+          label: 'label.delete.acl.list',
+          message: 'message.confirm.delete.acl.list',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'ilb',
+      title: 'label.internal.lb',
+      docHelp: 'adminguide/networking_and_traffic.html#load-balancing-across-tiers',
+      icon: 'share-alt',
+      hidden: true,
+      permission: ['listLoadBalancers'],
+      columns: ['name', 'sourceipaddress', 'loadbalancerrule', 'algorithm', 'account', 'domain'],
+      details: ['name', 'sourceipaddress', 'loadbalancerrule', 'algorithm', 'account', 'domain'],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }, {
+        name: 'loadbalancerinstance',
+        component: () => import('@/views/network/InternalLBAssignedVmTab.vue'),
+        show: () => true
+      }],
+      actions: [
+        {
+          api: 'createLoadBalancer',
+          icon: 'plus',
+          label: 'label.add.internal.lb',
+          docHelp: 'adminguide/networking_and_traffic.html#creating-an-internal-lb-rule',
+          listView: true,
+          args: ['name', 'description', 'sourceipaddress', 'sourceport', 'instanceport', 'algorithm', 'networkid', 'sourceipaddressnetworkid', 'scheme'],
+          mapping: {
+            algorithm: {
+              options: ['source', 'roundrobin', 'leastconn']
+            },
+            scheme: {
+              value: (record) => { return 'Internal' }
+            },
+            networkid: {
+              api: 'listNetworks',
+              params: (record) => { return { forvpc: true } }
+            },
+            sourceipaddressnetworkid: {
+              api: 'listNetworks',
+              params: (record) => { return { forvpc: true } }
+            }
+          }
+        },
+        {
+          api: 'assignToLoadBalancerRule',
+          icon: 'plus',
+          label: 'label.assign.vms',
+          dataView: true,
+          popup: true,
+          component: () => import('@/views/network/InternalLBAssignVmForm.vue')
+        },
+        {
+          api: 'deleteLoadBalancer',
+          icon: 'delete',
+          label: 'label.delete.internal.lb',
+          message: 'message.confirm.delete.internal.lb',
+          dataView: true
+        }
+      ]
+    },
+    {
+      name: 'vpnuser',
+      title: 'label.vpn.users',
+      icon: 'user',
+      permission: ['listVpnUsers'],
+      hidden: true,
+      columns: ['username', 'state', 'account', 'domain'],
+      details: ['username', 'state', 'account', 'domain'],
+      actions: [
+        {
+          api: 'addVpnUser',
+          icon: 'plus',
+          label: 'label.add.vpn.user',
+          listView: true,
+          args: (record, store) => {
+            if (store.userInfo.roletype === 'User') {
+              return ['username', 'password']
+            }
+
+            return ['username', 'password', 'domainid', 'account']
+          }
+        },
+        {
+          api: 'removeVpnUser',
+          icon: 'delete',
+          label: 'label.delete.vpn.user',
+          message: 'message.action.delete.vpn.user',
+          dataView: true,
+          args: ['username', 'domainid', 'account'],
+          mapping: {
+            username: {
+              value: (record) => { return record.username }
+            },
+            domainid: {
+              value: (record) => { return record.domainid }
+            },
+            account: {
+              value: (record) => { return record.account }
+            }
+          }
+        }
+      ]
+    },
+    {
+      name: 'vpncustomergateway',
+      title: 'label.vpncustomergatewayid',
+      icon: 'lock',
+      permission: ['listVpnCustomerGateways'],
+      columns: ['name', 'gateway', 'cidrlist', 'ipsecpsk', 'account'],
+      details: ['name', 'id', 'gateway', 'cidrlist', 'ipsecpsk', 'ikepolicy', 'ikelifetime', 'esppolicy', 'esplifetime', 'dpd', 'forceencap', 'account', 'domain'],
+      searchFilters: ['keyword', 'domainid', 'account'],
+      actions: [
+        {
+          api: 'createVpnCustomerGateway',
+          icon: 'plus',
+          label: 'label.add.vpn.customer.gateway',
+          docHelp: 'adminguide/networking_and_traffic.html#creating-and-updating-a-vpn-customer-gateway',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/network/CreateVpnCustomerGateway.vue')
+        },
+        {
+          api: 'updateVpnCustomerGateway',
+          icon: 'edit',
+          label: 'label.edit',
+          docHelp: 'adminguide/networking_and_traffic.html#updating-and-removing-a-vpn-customer-gateway',
+          dataView: true,
+          args: ['name', 'gateway', 'cidrlist', 'ipsecpsk', 'ikepolicy', 'ikelifetime', 'esppolicy', 'esplifetime', 'dpd', 'forceencap']
+        },
+        {
+          api: 'deleteVpnCustomerGateway',
+          icon: 'delete',
+          label: 'label.delete.vpn.customer.gateway',
+          message: 'message.delete.vpn.customer.gateway',
+          docHelp: 'adminguide/networking_and_traffic.html#updating-and-removing-a-vpn-customer-gateway',
+          dataView: true
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/offering.js b/ui/src/config/section/offering.js
new file mode 100644
index 0000000..085d859
--- /dev/null
+++ b/ui/src/config/section/offering.js
@@ -0,0 +1,335 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'offering',
+  title: 'label.menu.service.offerings',
+  icon: 'shopping',
+  permission: ['listServiceOfferings', 'listDiskOfferings', 'listDomains'],
+  children: [
+    {
+      name: 'computeoffering',
+      title: 'label.compute.offerings',
+      docHelp: 'adminguide/service_offerings.html#compute-and-disk-service-offerings',
+      icon: 'cloud',
+      permission: ['listServiceOfferings', 'listDomains'],
+      params: { isrecursive: 'true' },
+      columns: ['name', 'displaytext', 'cpunumber', 'cpuspeed', 'memory', 'domain', 'zone', 'order'],
+      details: () => {
+        var fields = ['name', 'id', 'displaytext', 'offerha', 'provisioningtype', 'storagetype', 'iscustomized', 'limitcpuuse', 'cpunumber', 'cpuspeed', 'memory', 'hosttags', 'tags', 'domain', 'zone', 'created']
+        if (store.getters.apis.createServiceOffering &&
+          store.getters.apis.createServiceOffering.params.filter(x => x.name === 'storagepolicy').length > 0) {
+          fields.splice(6, 0, 'vspherestoragepolicy')
+        }
+        return fields
+      },
+      related: [{
+        name: 'vm',
+        title: 'label.instances',
+        param: 'serviceofferingid'
+      }],
+      actions: [{
+        api: 'createServiceOffering',
+        icon: 'plus',
+        label: 'label.add.compute.offering',
+        docHelp: 'adminguide/service_offerings.html#creating-a-new-compute-offering',
+        listView: true,
+        popup: true,
+        component: () => import('@/views/offering/AddComputeOffering.vue')
+      }, {
+        api: 'updateServiceOffering',
+        icon: 'edit',
+        label: 'label.edit',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        args: ['name', 'displaytext']
+      }, {
+        api: 'updateServiceOffering',
+        icon: 'lock',
+        label: 'label.action.update.offering.access',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        popup: true,
+        component: () => import('@/views/offering/UpdateOfferingAccess.vue')
+      }, {
+        api: 'deleteServiceOffering',
+        icon: 'delete',
+        label: 'label.action.delete.service.offering',
+        message: 'message.action.delete.service.offering',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true
+      }]
+    },
+    {
+      name: 'systemoffering',
+      title: 'label.system.offerings',
+      icon: 'setting',
+      docHelp: 'adminguide/service_offerings.html#system-service-offerings',
+      permission: ['listServiceOfferings', 'listInfrastructure'],
+      params: { issystem: 'true', isrecursive: 'true' },
+      columns: ['name', 'systemvmtype', 'cpunumber', 'cpuspeed', 'memory', 'storagetype', 'order'],
+      details: ['name', 'id', 'displaytext', 'systemvmtype', 'provisioningtype', 'storagetype', 'iscustomized', 'limitcpuuse', 'cpunumber', 'cpuspeed', 'memory', 'hosttags', 'tags', 'domain', 'zone', 'created'],
+      actions: [{
+        api: 'createServiceOffering',
+        icon: 'plus',
+        label: 'label.add.system.service.offering',
+        docHelp: 'adminguide/service_offerings.html#creating-a-new-system-service-offering',
+        listView: true,
+        params: { issystem: 'true' },
+        popup: true,
+        component: () => import('@/views/offering/AddComputeOffering.vue')
+      }, {
+        api: 'updateServiceOffering',
+        icon: 'edit',
+        label: 'label.edit',
+        dataView: true,
+        params: { issystem: 'true' },
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        args: ['name', 'displaytext']
+      }, {
+        api: 'deleteServiceOffering',
+        icon: 'delete',
+        label: 'label.action.delete.system.service.offering',
+        message: 'message.action.delete.system.service.offering',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        params: { issystem: 'true' }
+      }]
+    },
+    {
+      name: 'diskoffering',
+      title: 'label.disk.offerings',
+      icon: 'hdd',
+      docHelp: 'adminguide/service_offerings.html#compute-and-disk-service-offerings',
+      permission: ['listDiskOfferings', 'listDomains'],
+      params: { isrecursive: 'true' },
+      columns: ['name', 'displaytext', 'disksize', 'domain', 'zone', 'order'],
+      details: () => {
+        var fields = ['name', 'id', 'displaytext', 'disksize', 'provisioningtype', 'storagetype', 'iscustomized', 'tags', 'domain', 'zone', 'created']
+        if (store.getters.apis.createDiskOffering &&
+          store.getters.apis.createDiskOffering.params.filter(x => x.name === 'storagepolicy').length > 0) {
+          fields.splice(6, 0, 'vspherestoragepolicy')
+        }
+        return fields
+      },
+      related: [{
+        name: 'volume',
+        title: 'label.volumes',
+        param: 'diskofferingid'
+      }],
+      actions: [{
+        api: 'createDiskOffering',
+        icon: 'plus',
+        label: 'label.add.disk.offering',
+        docHelp: 'adminguide/service_offerings.html#creating-a-new-disk-offering',
+        listView: true,
+        popup: true,
+        component: () => import('@/views/offering/AddDiskOffering.vue')
+      }, {
+        api: 'updateDiskOffering',
+        icon: 'edit',
+        label: 'label.edit',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        args: ['name', 'displaytext']
+      }, {
+        api: 'updateDiskOffering',
+        icon: 'lock',
+        label: 'label.action.update.offering.access',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        popup: true,
+        component: () => import('@/views/offering/UpdateOfferingAccess.vue')
+      }, {
+        api: 'deleteDiskOffering',
+        icon: 'delete',
+        label: 'label.action.delete.disk.offering',
+        message: 'message.action.delete.disk.offering',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true
+      }]
+    },
+    {
+      name: 'backupoffering',
+      title: 'label.backup.offerings',
+      icon: 'cloud-upload',
+      docHelp: 'adminguide/virtual_machines.html#backup-offerings',
+      permission: ['listBackupOfferings', 'listInfrastructure'],
+      columns: ['name', 'description', 'zoneid'],
+      details: ['name', 'id', 'description', 'externalid', 'zone', 'created'],
+      actions: [{
+        api: 'importBackupOffering',
+        icon: 'plus',
+        label: 'label.import.backup.offering',
+        docHelp: 'adminguide/virtual_machines.html#importing-backup-offerings',
+        listView: true,
+        popup: true,
+        component: () => import('@/views/offering/ImportBackupOffering.vue')
+      }, {
+        api: 'deleteBackupOffering',
+        icon: 'delete',
+        label: 'label.action.delete.backup.offering',
+        message: 'message.action.delete.backup.offering',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true
+      }]
+    },
+    {
+      name: 'networkoffering',
+      title: 'label.network.offerings',
+      icon: 'wifi',
+      docHelp: 'adminguide/networking.html#network-offerings',
+      permission: ['listNetworkOfferings', 'listInfrastructure'],
+      params: { isrecursive: 'true' },
+      columns: ['name', 'state', 'guestiptype', 'traffictype', 'networkrate', 'domain', 'zone', 'order'],
+      details: ['name', 'id', 'displaytext', 'guestiptype', 'traffictype', 'networkrate', 'ispersistent', 'egressdefaultpolicy', 'availability', 'conservemode', 'specifyvlan', 'specifyipranges', 'supportspublicaccess', 'supportsstrechedl2subnet', 'service', 'tags', 'domain', 'zone'],
+      actions: [{
+        api: 'createNetworkOffering',
+        icon: 'plus',
+        label: 'label.add.network.offering',
+        docHelp: 'adminguide/networking.html#creating-a-new-network-offering',
+        listView: true,
+        popup: true,
+        component: () => import('@/views/offering/AddNetworkOffering.vue')
+      }, {
+        api: 'updateNetworkOffering',
+        icon: 'edit',
+        label: 'label.edit',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        args: ['name', 'displaytext', 'availability'],
+        mapping: {
+          availability: {
+            options: ['Optional', 'Required']
+          }
+        }
+      }, {
+        api: 'updateNetworkOffering',
+        icon: 'play-circle',
+        label: 'label.enable.network.offering',
+        message: 'message.confirm.enable.network.offering',
+        dataView: true,
+        show: (record) => { return record.state === 'Disabled' },
+        args: ['state'],
+        mapping: {
+          state: {
+            value: (record) => { return 'Enabled' }
+          }
+        }
+      }, {
+        api: 'updateNetworkOffering',
+        icon: 'pause-circle',
+        label: 'label.disable.network.offering',
+        message: 'message.confirm.disable.network.offering',
+        dataView: true,
+        show: (record) => { return record.state === 'Enabled' },
+        args: ['state'],
+        mapping: {
+          state: {
+            value: (record) => { return 'Disabled' }
+          }
+        }
+      }, {
+        api: 'updateNetworkOffering',
+        icon: 'lock',
+        label: 'label.action.update.offering.access',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true,
+        popup: true,
+        component: () => import('@/views/offering/UpdateOfferingAccess.vue')
+      }, {
+        api: 'deleteNetworkOffering',
+        icon: 'delete',
+        label: 'label.remove.network.offering',
+        message: 'message.confirm.remove.network.offering',
+        docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering',
+        dataView: true
+      }]
+    },
+    {
+      name: 'vpcoffering',
+      title: 'label.vpc.offerings',
+      icon: 'deployment-unit',
+      docHelp: 'plugins/nuage-plugin.html?#vpc-offerings',
+      permission: ['listVPCOfferings', 'listInfrastructure'],
+      params: { isrecursive: 'true' },
+      resourceType: 'VpcOffering',
+      columns: ['name', 'state', 'displaytext', 'domain', 'zone', 'order'],
+      details: ['name', 'id', 'displaytext', 'distributedvpcrouter', 'tags', 'service', 'domain', 'zone', 'created'],
+      related: [{
+        name: 'vpc',
+        title: 'label.vpc',
+        param: 'vpcofferingid'
+      }],
+      actions: [{
+        api: 'createVPCOffering',
+        icon: 'plus',
+        docHelp: 'plugins/nuage-plugin.html?#optional-create-and-enable-vpc-offering',
+        label: 'label.add.vpc.offering',
+        listView: true,
+        popup: true,
+        component: () => import('@/views/offering/AddVpcOffering.vue')
+      }, {
+        api: 'updateVPCOffering',
+        icon: 'edit',
+        label: 'label.edit',
+        dataView: true,
+        args: ['name', 'displaytext']
+      }, {
+        api: 'updateVPCOffering',
+        icon: 'play-circle',
+        label: 'label.enable.vpc.offering',
+        message: 'message.confirm.enable.vpc.offering',
+        dataView: true,
+        show: (record) => { return record.state === 'Disabled' },
+        args: ['state'],
+        mapping: {
+          state: {
+            value: (record) => { return 'Enabled' }
+          }
+        }
+      }, {
+        api: 'updateVPCOffering',
+        icon: 'pause-circle',
+        label: 'label.disable.vpc.offering',
+        message: 'message.confirm.disable.vpc.offering',
+        dataView: true,
+        show: (record) => { return record.state === 'Enabled' },
+        args: ['state'],
+        mapping: {
+          state: {
+            value: (record) => { return 'Disabled' }
+          }
+        }
+      }, {
+        api: 'updateVPCOffering',
+        icon: 'lock',
+        label: 'label.action.update.offering.access',
+        dataView: true,
+        popup: true,
+        component: () => import('@/views/offering/UpdateOfferingAccess.vue')
+      }, {
+        api: 'deleteVPCOffering',
+        icon: 'delete',
+        label: 'label.remove.vpc.offering',
+        message: 'message.confirm.remove.vpc.offering',
+        dataView: true
+      }]
+    }
+  ]
+}
diff --git a/ui/src/config/section/plugin/cloudian.js b/ui/src/config/section/plugin/cloudian.js
new file mode 100644
index 0000000..1e6ab98
--- /dev/null
+++ b/ui/src/config/section/plugin/cloudian.js
@@ -0,0 +1,27 @@
+// 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 cloudian from '@/assets/icons/cloudian.svg?inline'
+
+export default {
+  name: 'cloudian',
+  title: 'label.cloudian.storage',
+  docHelp: 'plugins/cloudian-connector.html',
+  icon: cloudian,
+  permission: ['cloudianSsoLogin'],
+  component: () => import('@/views/plugins/CloudianPlugin.vue')
+}
diff --git a/ui/src/config/section/plugin/quota.js b/ui/src/config/section/plugin/quota.js
new file mode 100644
index 0000000..6a99716
--- /dev/null
+++ b/ui/src/config/section/plugin/quota.js
@@ -0,0 +1,89 @@
+// 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.
+
+export default {
+  name: 'quota',
+  title: 'label.quota',
+  icon: 'pie-chart',
+  docHelp: 'plugins/quota.html',
+  permission: ['quotaSummary'],
+  children: [
+    {
+      name: 'quotasummary',
+      title: 'label.summary',
+      icon: 'bars',
+      permission: ['quotaSummary'],
+      columns: ['account', 'domain', 'state', 'currency', 'balance', 'quota'],
+      details: ['account', 'domain', 'state', 'currency', 'balance', 'quota', 'startdate', 'enddate'],
+      component: () => import('@/views/plugins/quota/QuotaSummary.vue'),
+      tabs: [
+        {
+          name: 'details',
+          component: () => import('@/components/view/DetailsTab.vue')
+        },
+        {
+          name: 'quota.statement.quota',
+          component: () => import('@/views/plugins/quota/QuotaUsage.vue')
+        },
+        {
+          name: 'quota.statement.balance',
+          component: () => import('@/views/plugins/quota/QuotaBalance.vue')
+        }
+      ],
+      actions: [
+        {
+          api: 'quotaCredits',
+          icon: 'plus',
+          docHelp: 'plugins/quota.html#quota-credits',
+          label: 'label.quota.add.credits',
+          dataView: true,
+          args: ['value', 'min_balance', 'quota_enforce'],
+          mapping: {
+            account: {
+              value: (record) => { return record.account }
+            },
+            domainid: {
+              value: (record) => { return record.domainid }
+            }
+          }
+        }
+      ]
+    },
+    {
+      name: 'quotatariff',
+      title: 'label.quota.tariff',
+      icon: 'credit-card',
+      docHelp: 'plugins/quota.html#quota-tariff',
+      permission: ['quotaTariffList'],
+      columns: ['usageName', 'description', 'usageUnit', 'tariffValue', 'tariffActions'],
+      details: ['usageName', 'description', 'usageUnit', 'tariffValue'],
+      component: () => import('@/views/plugins/quota/QuotaTariff.vue')
+    },
+    {
+      name: 'quotaemailtemplate',
+      title: 'label.templatetype',
+      icon: 'mail',
+      permission: ['quotaEmailTemplateList'],
+      columns: ['templatetype', 'templatesubject', 'templatebody'],
+      details: ['templatetype', 'templatesubject', 'templatebody'],
+      tabs: [{
+        name: 'details',
+        component: () => import('@/views/plugins/quota/EmailTemplateDetails.vue')
+      }]
+    }
+  ]
+}
diff --git a/ui/src/config/section/project.js b/ui/src/config/section/project.js
new file mode 100644
index 0000000..72cdd71
--- /dev/null
+++ b/ui/src/config/section/project.js
@@ -0,0 +1,145 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'project',
+  title: 'label.projects',
+  icon: 'project',
+  docHelp: 'adminguide/projects.html',
+  permission: ['listProjects'],
+  resourceType: 'Project',
+  columns: ['name', 'state', 'displaytext', 'account', 'domain'],
+  searchFilters: ['name', 'displaytext', 'domainid', 'account'],
+  details: ['name', 'id', 'displaytext', 'projectaccountname', 'account', 'domain'],
+  tabs: [
+    {
+      name: 'details',
+      component: () => import('@/views/project/ProjectDetailsTab.vue')
+    },
+    {
+      name: 'accounts',
+      component: () => import('@/views/project/AccountsTab.vue'),
+      show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) || record.isCurrentUserProjectAdmin }
+    },
+    {
+      name: 'project.roles',
+      component: () => import('@/views/project/iam/ProjectRoleTab.vue'),
+      show: (record, route, user) => {
+        return (['Admin', 'DomainAdmin'].includes(user.roletype) || record.isCurrentUserProjectAdmin) &&
+        'listProjectRoles' in store.getters.apis
+      }
+    },
+    {
+      name: 'resources',
+      component: () => import('@/components/view/ResourceCountUsage.vue')
+    },
+    {
+      name: 'limits',
+      show: (record, route, user) => { return ['Admin', 'DomainAdmin'].includes(user.roletype) || record.isCurrentUserProjectAdmin },
+      component: () => import('@/components/view/ResourceLimitTab.vue')
+    }
+  ],
+  actions: [
+    {
+      api: 'createProject',
+      icon: 'plus',
+      label: 'label.new.project',
+      docHelp: 'adminguide/projects.html#creating-a-new-project',
+      listView: true,
+      args: ['name', 'displaytext']
+    },
+    {
+      api: 'updateProjectInvitation',
+      icon: 'key',
+      label: 'label.enter.token',
+      docHelp: 'adminguide/projects.html#accepting-a-membership-invitation',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/project/InvitationTokenTemplate.vue')
+    },
+    {
+      api: 'listProjectInvitations',
+      icon: 'team',
+      label: 'label.project.invitation',
+      docHelp: 'adminguide/projects.html#accepting-a-membership-invitation',
+      listView: true,
+      popup: true,
+      showBadge: true,
+      badgeNum: 0,
+      param: {
+        state: 'Pending'
+      },
+      component: () => import('@/views/project/InvitationsTemplate.vue')
+    },
+    {
+      api: 'updateProject',
+      icon: 'edit',
+      label: 'label.edit.project.details',
+      dataView: true,
+      args: ['displaytext'],
+      show: (record, store) => {
+        return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin
+      }
+    },
+    {
+      api: 'activateProject',
+      icon: 'play-circle',
+      label: 'label.activate.project',
+      message: 'message.activate.project',
+      dataView: true,
+      show: (record, store) => {
+        return ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin) && record.state === 'Suspended'
+      }
+    },
+    {
+      api: 'suspendProject',
+      icon: 'pause-circle',
+      label: 'label.suspend.project',
+      message: 'message.suspend.project',
+      docHelp: 'adminguide/projects.html#sending-project-membership-invitations',
+      dataView: true,
+      show: (record, store) => {
+        return ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) ||
+        record.isCurrentUserProjectAdmin) && record.state !== 'Suspended'
+      }
+    },
+    {
+      api: 'addAccountToProject',
+      icon: 'user-add',
+      label: 'label.action.project.add.account',
+      docHelp: 'adminguide/projects.html#adding-project-members-from-the-ui',
+      dataView: true,
+      popup: true,
+      show: (record, store) => {
+        return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin
+      },
+      component: () => import('@/views/project/AddAccountOrUserToProject.vue')
+    },
+    {
+      api: 'deleteProject',
+      icon: 'delete',
+      label: 'label.delete.project',
+      message: 'message.delete.project',
+      docHelp: 'adminguide/projects.html#suspending-or-deleting-a-project',
+      dataView: true,
+      show: (record, store) => {
+        return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin
+      }
+    }
+  ]
+}
diff --git a/ui/src/config/section/role.js b/ui/src/config/section/role.js
new file mode 100644
index 0000000..cefe1e1
--- /dev/null
+++ b/ui/src/config/section/role.js
@@ -0,0 +1,70 @@
+// 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.
+
+export default {
+  name: 'role',
+  title: 'label.roles',
+  icon: 'idcard',
+  docHelp: 'adminguide/accounts.html#roles',
+  permission: ['listRoles', 'listRolePermissions'],
+  columns: ['name', 'type', 'description'],
+  details: ['name', 'id', 'type', 'description'],
+  tabs: [{
+    name: 'details',
+    component: () => import('@/components/view/DetailsTab.vue')
+  }, {
+    name: 'rules',
+    component: () => import('@/views/iam/RolePermissionTab.vue')
+  }],
+  actions: [
+    {
+      api: 'createRole',
+      icon: 'plus',
+      label: 'label.add.role',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/iam/CreateRole.vue')
+    },
+    {
+      api: 'importRole',
+      icon: 'cloud-upload',
+      label: 'label.import.role',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/iam/ImportRole.vue')
+    },
+    {
+      api: 'updateRole',
+      icon: 'edit',
+      label: 'label.edit.role',
+      dataView: true,
+      args: ['name', 'description', 'type'],
+      mapping: {
+        type: {
+          options: ['Admin', 'DomainAdmin', 'User']
+        }
+      }
+    },
+    {
+      api: 'deleteRole',
+      icon: 'delete',
+      label: 'label.delete.role',
+      message: 'label.delete.role',
+      dataView: true
+    }
+  ]
+}
diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js
new file mode 100644
index 0000000..c907079
--- /dev/null
+++ b/ui/src/config/section/storage.js
@@ -0,0 +1,425 @@
+// 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 store from '@/store'
+
+export default {
+  name: 'storage',
+  title: 'label.storage',
+  icon: 'database',
+  children: [
+    {
+      name: 'volume',
+      title: 'label.volumes',
+      icon: 'hdd',
+      docHelp: 'adminguide/storage.html#working-with-volumes',
+      permission: ['listVolumesMetrics'],
+      resourceType: 'Volume',
+      columns: () => {
+        const fields = ['name', 'state', 'type', 'vmname', 'sizegb']
+        const metricsFields = ['diskkbsread', 'diskkbswrite', 'diskiopstotal']
+
+        if (store.getters.userInfo.roletype === 'Admin') {
+          metricsFields.push({
+            physicalsize: (record) => {
+              return record.physicalsize ? parseFloat(record.physicalsize / (1024.0 * 1024.0 * 1024.0)).toFixed(2) + 'GB' : ''
+            }
+          })
+        }
+        metricsFields.push('utilization')
+
+        if (store.getters.metrics) {
+          fields.push(...metricsFields)
+        }
+
+        if (store.getters.userInfo.roletype === 'Admin') {
+          fields.push('account')
+          fields.push('storage')
+        } else if (store.getters.userInfo.roletype === 'DomainAdmin') {
+          fields.push('account')
+        }
+        fields.push('zonename')
+
+        return fields
+      },
+      details: ['name', 'id', 'type', 'storagetype', 'diskofferingdisplaytext', 'deviceid', 'sizegb', 'physicalsize', 'provisioningtype', 'utilization', 'diskkbsread', 'diskkbswrite', 'diskioread', 'diskiowrite', 'diskiopstotal', 'miniops', 'maxiops', 'path'],
+      related: [{
+        name: 'snapshot',
+        title: 'label.snapshots',
+        param: 'volumeid'
+      }],
+      searchFilters: ['name', 'zoneid', 'domainid', 'account', 'state', 'tags'],
+      actions: [
+        {
+          api: 'createVolume',
+          icon: 'plus',
+          docHelp: 'adminguide/storage.html#creating-a-new-volume',
+          label: 'label.action.create.volume',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/storage/CreateVolume.vue')
+        },
+        {
+          api: 'createVolume',
+          icon: 'cloud-upload',
+          docHelp: 'adminguide/storage.html#uploading-an-existing-volume-to-a-virtual-machine',
+          label: 'label.upload.volume.from.local',
+          listView: true,
+          popup: true,
+          component: () => import('@/views/storage/UploadLocalVolume.vue')
+        },
+        {
+          api: 'uploadVolume',
+          icon: 'link',
+          docHelp: 'adminguide/storage.html#uploading-an-existing-volume-to-a-virtual-machine',
+          label: 'label.upload.volume.from.url',
+          listView: true,
+          args: ['url', 'name', 'zoneid', 'format', 'diskofferingid', 'checksum'],
+          mapping: {
+            format: {
+              options: ['RAW', 'VHD', 'VHDX', 'OVA', 'QCOW2']
+            }
+          }
+        },
+        {
+          api: 'attachVolume',
+          icon: 'paper-clip',
+          label: 'label.action.attach.disk',
+          dataView: true,
+          show: (record) => { return record.type !== 'ROOT' && ['Allocated', 'Ready', 'Uploaded'].includes(record.state) && !('virtualmachineid' in record) },
+          popup: true,
+          component: () => import('@/views/storage/AttachVolume.vue')
+        },
+        {
+          api: 'detachVolume',
+          icon: 'link',
+          label: 'label.action.detach.disk',
+          message: 'message.detach.disk',
+          dataView: true,
+          show: (record) => {
+            return record.type !== 'ROOT' && record.virtualmachineid &&
+              ['Running', 'Stopped', 'Destroyed'].includes(record.vmstate)
+          }
+        },
+        {
+          api: 'createSnapshot',
+          icon: 'camera',
+          docHelp: 'adminguide/storage.html#working-with-volume-snapshots',
+          label: 'label.action.take.snapshot',
+          dataView: true,
+          show: (record, store) => {
+            return record.state === 'Ready' && (record.hypervisor !== 'KVM' ||
+              record.hypervisor === 'KVM' && record.vmstate === 'Running' && store.features.kvmsnapshotenabled ||
+              record.hypervisor === 'KVM' && record.vmstate !== 'Running')
+          },
+          popup: true,
+          component: () => import('@/views/storage/TakeSnapshot.vue')
+        },
+        {
+          api: 'createSnapshotPolicy',
+          icon: 'clock-circle',
+          docHelp: 'adminguide/storage.html#working-with-volume-snapshots',
+          label: 'label.action.recurring.snapshot',
+          dataView: true,
+          show: (record, store) => {
+            return record.state === 'Ready' && (record.hypervisor !== 'KVM' ||
+              record.hypervisor === 'KVM' && record.vmstate === 'Running' && store.features.kvmsnapshotenabled ||
+              record.hypervisor === 'KVM' && record.vmstate !== 'Running')
+          },
+          popup: true,
+          component: () => import('@/views/storage/RecurringSnapshotVolume.vue'),
+          mapping: {
+            volumeid: {
+              value: (record) => { return record.id }
+            },
+            intervaltype: {
+              options: ['HOURLY', 'DAILY', 'WEEKLY', 'MONTHLY']
+            }
+          }
+        },
+        {
+          api: 'resizeVolume',
+          icon: 'fullscreen',
+          docHelp: 'adminguide/storage.html#resizing-volumes',
+          label: 'label.action.resize.volume',
+          dataView: true,
+          popup: true,
+          show: (record) => { return ['Allocated', 'Ready'].includes(record.state) },
+          component: () => import('@/views/storage/ResizeVolume.vue')
+        },
+        {
+          api: 'migrateVolume',
+          icon: 'drag',
+          docHelp: 'adminguide/storage.html#id2',
+          label: 'label.migrate.volume',
+          args: ['volumeid', 'storageid', 'livemigrate'],
+          dataView: true,
+          show: (record, store) => { return record.state === 'Ready' && ['Admin'].includes(store.userInfo.roletype) },
+          popup: true,
+          component: () => import('@/views/storage/MigrateVolume.vue')
+        },
+        {
+          api: 'extractVolume',
+          icon: 'cloud-download',
+          label: 'label.action.download.volume',
+          message: 'message.download.volume.confirm',
+          dataView: true,
+          show: (record) => { return record.state === 'Ready' && (record.vmstate === 'Stopped' || !record.virtualmachineid) },
+          args: ['zoneid', 'mode'],
+          mapping: {
+            zoneid: {
+              value: (record) => { return record.zoneid }
+            },
+            mode: {
+              value: (record) => { return 'HTTP_DOWNLOAD' }
+            }
+          },
+          response: (result) => { return `Please click <a href="${result.volume.url}" target="_blank">${result.volume.url}</a> to download.` }
+        },
+        {
+          api: 'createTemplate',
+          icon: 'picture',
+          label: 'label.action.create.template.from.volume',
+          dataView: true,
+          show: (record) => {
+            return !['Destroy', 'Destroyed', 'Expunging', 'Expunged', 'Migrating', 'Uploading', 'UploadError', 'Creating'].includes(record.state) &&
+            ((record.type === 'ROOT' && record.vmstate === 'Stopped') ||
+            (record.type !== 'ROOT' && !record.virtualmachineid && !['Allocated', 'Uploaded'].includes(record.state)))
+          },
+          args: ['volumeid', 'name', 'displaytext', 'ostypeid', 'ispublic', 'isfeatured', 'isdynamicallyscalable', 'requireshvm', 'passwordenabled'],
+          mapping: {
+            volumeid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'recoverVolume',
+          icon: 'medicine-box',
+          label: 'label.action.recover.volume',
+          message: 'message.action.recover.volume',
+          dataView: true,
+          show: (record, store) => {
+            return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervolume) && record.state === 'Destroy'
+          }
+        },
+        {
+          api: 'deleteVolume',
+          icon: 'delete',
+          label: 'label.action.delete.volume',
+          message: 'message.action.delete.volume',
+          dataView: true,
+          groupAction: true,
+          show: (record, store) => {
+            return ['Expunging', 'Expunged', 'UploadError'].includes(record.state) ||
+              ['Allocated', 'Uploaded'].includes(record.state) && record.type !== 'ROOT' && !record.virtualmachineid ||
+              ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervolume) && record.state === 'Destroy')
+          }
+        },
+        {
+          api: 'destroyVolume',
+          icon: 'delete',
+          label: 'label.action.destroy.volume',
+          message: 'message.action.destroy.volume',
+          dataView: true,
+          args: (record, store) => {
+            return (['Admin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervolume)
+              ? ['expunge'] : []
+          },
+          show: (record, store) => {
+            return !['Destroy', 'Destroyed', 'Expunging', 'Expunged', 'Migrating', 'Uploading', 'UploadError', 'Creating', 'Allocated', 'Uploaded'].includes(record.state) &&
+              record.type !== 'ROOT' && !record.virtualmachineid
+          }
+        }
+      ]
+    },
+    {
+      name: 'snapshot',
+      title: 'label.snapshots',
+      icon: 'build',
+      docHelp: 'adminguide/storage.html#working-with-volume-snapshots',
+      permission: ['listSnapshots'],
+      resourceType: 'Snapshot',
+      columns: () => {
+        var fields = ['name', 'state', 'volumename', 'intervaltype', 'created']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('domain')
+          fields.push('account')
+        }
+        return fields
+      },
+      details: ['name', 'id', 'volumename', 'intervaltype', 'account', 'domain', 'created'],
+      searchFilters: ['name', 'domainid', 'account', 'tags'],
+      actions: [
+        {
+          api: 'createTemplate',
+          icon: 'picture',
+          label: 'label.create.template',
+          dataView: true,
+          show: (record) => { return record.state === 'BackedUp' },
+          args: ['snapshotid', 'name', 'displaytext', 'ostypeid', 'ispublic', 'isfeatured', 'isdynamicallyscalable', 'requireshvm', 'passwordenabled'],
+          mapping: {
+            snapshotid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'createVolume',
+          icon: 'hdd',
+          label: 'label.action.create.volume',
+          dataView: true,
+          show: (record) => { return record.state === 'BackedUp' },
+          args: ['snapshotid', 'name'],
+          mapping: {
+            snapshotid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'revertSnapshot',
+          icon: 'sync',
+          label: 'label.action.revert.snapshot',
+          message: 'message.action.revert.snapshot',
+          dataView: true,
+          show: (record) => { return record.state === 'BackedUp' && record.revertable }
+        },
+        {
+          api: 'deleteSnapshot',
+          icon: 'delete',
+          label: 'label.action.delete.snapshot',
+          message: 'message.action.delete.snapshot',
+          dataView: true,
+          show: (record) => { return record.state !== 'Destroyed' }
+        }
+      ]
+    },
+    {
+      name: 'vmsnapshot',
+      title: 'label.vm.snapshots',
+      icon: 'camera',
+      docHelp: 'adminguide/storage.html#working-with-volume-snapshots',
+      permission: ['listVMSnapshot'],
+      resourceType: 'VMSnapshot',
+      columns: () => {
+        const fields = ['displayname', 'state', 'name', 'type', 'current', 'parentName', 'created']
+        if (['Admin', 'DomainAdmin'].includes(store.getters.userInfo.roletype)) {
+          fields.push('domain')
+          fields.push('account')
+        }
+        return fields
+      },
+      details: ['name', 'id', 'displayname', 'description', 'type', 'current', 'parentName', 'virtualmachineid', 'account', 'domain', 'created'],
+      searchFilters: ['name', 'domainid', 'account', 'tags'],
+      actions: [
+        {
+          api: 'createSnapshotFromVMSnapshot',
+          icon: 'camera',
+          label: 'label.action.create.snapshot.from.vmsnapshot',
+          message: 'message.action.create.snapshot.from.vmsnapshot',
+          dataView: true,
+          popup: true,
+          show: (record) => { return (record.state === 'Ready' && record.hypervisor === 'KVM') },
+          component: () => import('@/views/storage/CreateSnapshotFromVMSnapshot.vue')
+        },
+        {
+          api: 'revertToVMSnapshot',
+          icon: 'sync',
+          label: 'label.action.vmsnapshot.revert',
+          message: 'label.action.vmsnapshot.revert',
+          dataView: true,
+          show: (record) => { return record.state === 'Ready' },
+          args: ['vmsnapshotid'],
+          mapping: {
+            vmsnapshotid: {
+              value: (record) => { return record.id }
+            }
+          }
+        },
+        {
+          api: 'deleteVMSnapshot',
+          icon: 'delete',
+          label: 'label.action.vmsnapshot.delete',
+          message: 'message.action.vmsnapshot.delete',
+          dataView: true,
+          show: (record) => { return ['Ready', 'Expunging', 'Error'].includes(record.state) },
+          args: ['vmsnapshotid'],
+          mapping: {
+            vmsnapshotid: {
+              value: (record) => { return record.id }
+            }
+          }
+        }
+      ]
+    },
+    {
+      name: 'backup',
+      title: 'label.backup',
+      icon: 'cloud-upload',
+      permission: ['listBackups'],
+      columns: [{ name: (record) => { return record.virtualmachinename } }, 'virtualmachinename', 'status', 'type', 'created', 'account', 'zone'],
+      details: ['virtualmachinename', 'id', 'type', 'externalid', 'size', 'virtualsize', 'volumes', 'backupofferingname', 'zone', 'account', 'domain', 'created'],
+      actions: [
+        {
+          api: 'restoreBackup',
+          icon: 'sync',
+          docHelp: 'adminguide/virtual_machines.html#restoring-vm-backups',
+          label: 'label.backup.restore',
+          message: 'message.backup.restore',
+          dataView: true,
+          show: (record) => { return record.state !== 'Destroyed' }
+        },
+        {
+          api: 'restoreVolumeFromBackupAndAttachToVM',
+          icon: 'paper-clip',
+          label: 'label.backup.attach.restore',
+          message: 'message.backup.attach.restore',
+          dataView: true,
+          show: (record) => { return record.state !== 'Destroyed' },
+          popup: true,
+          component: () => import('@/views/storage/RestoreAttachBackupVolume.vue')
+        },
+        {
+          api: 'removeVirtualMachineFromBackupOffering',
+          icon: 'scissor',
+          label: 'label.backup.offering.remove',
+          message: 'message.backup.offering.remove',
+          dataView: true,
+          show: (record) => { return record.state !== 'Destroyed' },
+          args: ['forced', 'virtualmachineid'],
+          mapping: {
+            forced: {
+              value: (record) => { return true }
+            },
+            virtualmachineid: {
+              value: (record) => { return record.virtualmachineid }
+            }
+          }
+        },
+        {
+          api: 'deleteBackup',
+          icon: 'delete',
+          label: 'label.delete.backup',
+          message: 'message.delete.backup',
+          dataView: true,
+          show: (record) => { return record.state !== 'Destroyed' }
+        }
+      ]
+    }
+  ]
+}
diff --git a/ui/src/config/section/user.js b/ui/src/config/section/user.js
new file mode 100644
index 0000000..0ff016e
--- /dev/null
+++ b/ui/src/config/section/user.js
@@ -0,0 +1,106 @@
+// 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.
+
+export default {
+  name: 'accountuser',
+  title: 'label.users',
+  icon: 'user',
+  docHelp: 'adminguide/accounts.html#users',
+  hidden: true,
+  permission: ['listUsers'],
+  columns: ['username', 'state', 'firstname', 'lastname', 'email', 'account'],
+  details: ['username', 'id', 'firstname', 'lastname', 'email', 'usersource', 'timezone', 'rolename', 'roletype', 'account', 'domain', 'created'],
+  actions: [
+    {
+      api: 'createUser',
+      icon: 'plus',
+      label: 'label.add.user',
+      listView: true,
+      popup: true,
+      component: () => import('@/views/iam/AddUser.vue')
+    },
+    {
+      api: 'updateUser',
+      icon: 'edit',
+      label: 'label.edit',
+      dataView: true,
+      popup: true,
+      component: () => import('@/views/iam/EditUser.vue')
+    },
+    {
+      api: 'updateUser',
+      icon: 'key',
+      label: 'label.action.change.password',
+      dataView: true,
+      popup: true,
+      component: () => import('@/views/iam/ChangeUserPassword.vue')
+    },
+    {
+      api: 'registerUserKeys',
+      icon: 'file-protect',
+      label: 'label.action.generate.keys',
+      message: 'message.generate.keys',
+      dataView: true
+    },
+    {
+      api: 'enableUser',
+      icon: 'play-circle',
+      label: 'label.action.enable.user',
+      message: 'message.enable.user',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.account === 'admin' && record.accounttype === 1) &&
+          record.state === 'disabled'
+      }
+    },
+    {
+      api: 'disableUser',
+      icon: 'pause-circle',
+      label: 'label.action.disable.user',
+      message: 'message.disable.user',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.account === 'admin' && record.accounttype === 1) &&
+          record.state === 'enabled'
+      }
+    },
+    {
+      api: 'authorizeSamlSso',
+      icon: 'form',
+      label: 'Configure SAML SSO Authorization',
+      dataView: true,
+      popup: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)
+      },
+      component: () => import('@/views/iam/ConfigureSamlSsoAuth.vue')
+    },
+    {
+      api: 'deleteUser',
+      icon: 'delete',
+      label: 'label.action.delete.user',
+      message: 'message.delete.user',
+      dataView: true,
+      show: (record, store) => {
+        return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault &&
+          !(record.domain === 'ROOT' && record.account === 'admin' && record.accounttype === 1)
+      }
+    }
+  ]
+}
diff --git a/ui/src/config/settings.js b/ui/src/config/settings.js
new file mode 100644
index 0000000..6e599e7
--- /dev/null
+++ b/ui/src/config/settings.js
@@ -0,0 +1,34 @@
+// 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.
+
+export default {
+  primaryColor: '#39A7DE', // primary color of ant design
+  navTheme: 'light', // theme for nav menu
+  layout: 'sidemenu', // nav menu position: sidemenu or topmenu
+  contentWidth: 'Fixed', // layout of content: Fluid or Fixed, only works when layout is topmenu
+  fixedHeader: true, // sticky header
+  fixSiderbar: true, // sticky siderbar
+  autoHideHeader: false, //  auto hide header
+  invertedMode: true,
+  multiTab: false, // enable to have tab/route history stuff
+  // vue-ls options
+  storageOptions: {
+    namespace: 'primate__', // key prefix
+    name: 'ls', // name variable Vue.[ls] or this.[$ls],
+    storage: 'local' // storage name session, local, memory
+  }
+}
diff --git a/ui/src/core/bootstrap.js b/ui/src/core/bootstrap.js
new file mode 100644
index 0000000..ceefe3f
--- /dev/null
+++ b/ui/src/core/bootstrap.js
@@ -0,0 +1,51 @@
+// 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 Vue from 'vue'
+import config from '@/config/settings'
+import store from '@/store/'
+import {
+  ACCESS_TOKEN,
+  CURRENT_PROJECT,
+  DEFAULT_COLOR,
+  DEFAULT_THEME,
+  DEFAULT_LAYOUT_MODE,
+  DEFAULT_COLOR_INVERTED,
+  SIDEBAR_TYPE,
+  DEFAULT_FIXED_HEADER,
+  DEFAULT_FIXED_HEADER_HIDDEN,
+  DEFAULT_FIXED_SIDEMENU,
+  DEFAULT_CONTENT_WIDTH_TYPE,
+  DEFAULT_MULTI_TAB,
+  ASYNC_JOB_IDS
+} from '@/store/mutation-types'
+
+export default function Initializer () {
+  store.commit('SET_SIDEBAR_TYPE', Vue.ls.get(SIDEBAR_TYPE, true))
+  store.commit('TOGGLE_THEME', Vue.ls.get(DEFAULT_THEME, config.navTheme))
+  store.commit('TOGGLE_LAYOUT_MODE', Vue.ls.get(DEFAULT_LAYOUT_MODE, config.layout))
+  store.commit('TOGGLE_FIXED_HEADER', Vue.ls.get(DEFAULT_FIXED_HEADER, config.fixedHeader))
+  store.commit('TOGGLE_FIXED_SIDERBAR', Vue.ls.get(DEFAULT_FIXED_SIDEMENU, config.fixSiderbar))
+  store.commit('TOGGLE_CONTENT_WIDTH', Vue.ls.get(DEFAULT_CONTENT_WIDTH_TYPE, config.contentWidth))
+  store.commit('TOGGLE_FIXED_HEADER_HIDDEN', Vue.ls.get(DEFAULT_FIXED_HEADER_HIDDEN, config.autoHideHeader))
+  store.commit('TOGGLE_INVERTED', Vue.ls.get(DEFAULT_COLOR_INVERTED, config.invertedMode))
+  store.commit('TOGGLE_COLOR', Vue.ls.get(DEFAULT_COLOR, config.primaryColor))
+  store.commit('TOGGLE_MULTI_TAB', Vue.ls.get(DEFAULT_MULTI_TAB, config.multiTab))
+  store.commit('SET_TOKEN', Vue.ls.get(ACCESS_TOKEN))
+  store.commit('SET_PROJECT', Vue.ls.get(CURRENT_PROJECT))
+  store.commit('SET_ASYNC_JOB_IDS', Vue.ls.get(ASYNC_JOB_IDS) || [])
+}
diff --git a/ui/src/core/ext.js b/ui/src/core/ext.js
new file mode 100644
index 0000000..ec418a2
--- /dev/null
+++ b/ui/src/core/ext.js
@@ -0,0 +1,33 @@
+// 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 Vue from 'vue'
+
+import { library } from '@fortawesome/fontawesome-svg-core'
+import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
+
+// import { fab } from '@fortawesome/free-brands-svg-icons'
+// import { fas } from '@fortawesome/free-solid-svg-icons'
+// import { far } from '@fortawesome/free-regular-svg-icons'
+
+import { faCentos, faUbuntu, faSuse, faRedhat, faFedora, faLinux, faFreebsd, faApple, faWindows, faJava } from '@fortawesome/free-brands-svg-icons'
+import { faLanguage, faCompactDisc, faCameraRetro } from '@fortawesome/free-solid-svg-icons'
+
+library.add(faCentos, faUbuntu, faSuse, faRedhat, faFedora, faLinux, faFreebsd, faApple, faWindows, faJava)
+library.add(faLanguage, faCompactDisc, faCameraRetro)
+
+Vue.component('font-awesome-icon', FontAwesomeIcon)
diff --git a/ui/src/core/lazy_lib/components_use.js b/ui/src/core/lazy_lib/components_use.js
new file mode 100644
index 0000000..e9b7c83
--- /dev/null
+++ b/ui/src/core/lazy_lib/components_use.js
@@ -0,0 +1,124 @@
+// 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.
+
+/* eslint-disable */
+import Vue from 'vue'
+import {
+  ConfigProvider,
+  Layout,
+  Input,
+  InputNumber,
+  Button,
+  Switch,
+  Radio,
+  Checkbox,
+  Select,
+  Card,
+  Form,
+  Row,
+  Col,
+  Modal,
+  Table,
+  Tabs,
+  Icon,
+  Badge,
+  Popover,
+  Dropdown,
+  List,
+  Avatar,
+  Breadcrumb,
+  Steps,
+  Spin,
+  Menu,
+  Drawer,
+  Tooltip,
+  Alert,
+  Tag,
+  Divider,
+  DatePicker,
+  TimePicker,
+  Upload,
+  Progress,
+  Skeleton,
+  Popconfirm,
+  Descriptions,
+  message,
+  notification,
+  Affix,
+  Timeline,
+  Pagination,
+  Comment,
+  Tree,
+  Calendar,
+  Slider,
+  AutoComplete
+} from 'ant-design-vue'
+
+Vue.use(ConfigProvider)
+Vue.use(Layout)
+Vue.use(Input)
+Vue.use(InputNumber)
+Vue.use(Button)
+Vue.use(Switch)
+Vue.use(Radio)
+Vue.use(Checkbox)
+Vue.use(Select)
+Vue.use(Card)
+Vue.use(Form)
+Vue.use(Row)
+Vue.use(Col)
+Vue.use(Modal)
+Vue.use(Table)
+Vue.use(Tabs)
+Vue.use(Icon)
+Vue.use(Badge)
+Vue.use(Popover)
+Vue.use(Dropdown)
+Vue.use(List)
+Vue.use(Avatar)
+Vue.use(Breadcrumb)
+Vue.use(Steps)
+Vue.use(Spin)
+Vue.use(Menu)
+Vue.use(Drawer)
+Vue.use(Tooltip)
+Vue.use(Alert)
+Vue.use(Tag)
+Vue.use(Divider)
+Vue.use(DatePicker)
+Vue.use(TimePicker)
+Vue.use(Upload)
+Vue.use(Progress)
+Vue.use(Skeleton)
+Vue.use(Popconfirm)
+Vue.use(notification)
+Vue.use(Affix)
+Vue.use(Timeline)
+Vue.use(Pagination)
+Vue.use(Comment)
+Vue.use(Tree)
+Vue.use(Calendar)
+Vue.use(Slider)
+Vue.use(AutoComplete)
+
+Vue.prototype.$confirm = Modal.confirm
+Vue.prototype.$message = message
+Vue.prototype.$notification = notification
+Vue.prototype.$info = Modal.info
+Vue.prototype.$success = Modal.success
+Vue.prototype.$error = Modal.error
+Vue.prototype.$warning = Modal.warning
diff --git a/ui/src/core/lazy_use.js b/ui/src/core/lazy_use.js
new file mode 100644
index 0000000..e6a2067
--- /dev/null
+++ b/ui/src/core/lazy_use.js
@@ -0,0 +1,50 @@
+// 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 Vue from 'vue'
+import VueStorage from 'vue-ls'
+import config from '@/config/settings'
+
+// base library'
+// import Viser from 'viser-vue'
+import VueCropper from 'vue-cropper'
+import '@/core/lazy_lib/components_use'
+
+import 'ant-design-vue/dist/antd.min.css'
+import '@/style/vars.less'
+
+// ext library
+import VueClipboard from 'vue-clipboard2'
+import PermissionHelper from '@/utils/helper/permission'
+
+// customisation
+import Spin from 'ant-design-vue/es/spin/Spin'
+
+VueClipboard.config.autoSetContainer = true
+
+// Vue.use(Viser)
+
+Vue.use(VueStorage, config.storageOptions)
+Vue.use(VueClipboard)
+Vue.use(PermissionHelper)
+Vue.use(VueCropper)
+
+Spin.setDefaultIndicator({
+  indicator: (h) => {
+    return <a-icon type="loading" style="font-size: 30px" spin />
+  }
+})
diff --git a/ui/src/core/use.js b/ui/src/core/use.js
new file mode 100644
index 0000000..89c4f2e
--- /dev/null
+++ b/ui/src/core/use.js
@@ -0,0 +1,50 @@
+// 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 Vue from 'vue'
+import VueStorage from 'vue-ls'
+import config from '@/config/settings'
+
+// base library
+import Antd from 'ant-design-vue'
+import Viser from 'viser-vue'
+import VueCropper from 'vue-cropper'
+import 'ant-design-vue/dist/antd.less'
+import '@/style/vars.less'
+
+// ext library
+import VueClipboard from 'vue-clipboard2'
+import PermissionHelper from '@/utils/helper/permission'
+// import '@/components/use'
+
+// customisation
+import Spin from 'ant-design-vue/es/spin/Spin'
+
+VueClipboard.config.autoSetContainer = true
+
+Vue.use(Antd)
+Vue.use(Viser)
+Vue.use(VueStorage, config.storageOptions)
+Vue.use(VueClipboard)
+Vue.use(PermissionHelper)
+Vue.use(VueCropper)
+
+Spin.setDefaultIndicator({
+  indicator: (h) => {
+    return <a-icon type="loading" style="font-size: 30px" spin />
+  }
+})
diff --git a/ui/src/layouts/BasicLayout.vue b/ui/src/layouts/BasicLayout.vue
new file mode 100644
index 0000000..9c820a5
--- /dev/null
+++ b/ui/src/layouts/BasicLayout.vue
@@ -0,0 +1,70 @@
+// 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>
+  <global-layout>
+    <multi-tab v-if="$store.getters.multiTab"></multi-tab>
+    <transition name="page-transition">
+      <route-view />
+    </transition>
+  </global-layout>
+</template>
+
+<script>
+import RouteView from '@/layouts/RouteView'
+import MultiTab from '@/components/multitab'
+import GlobalLayout from '@/components/page/GlobalLayout'
+
+export default {
+  name: 'BasicLayout',
+  components: {
+    RouteView,
+    MultiTab,
+    GlobalLayout
+  },
+  data () {
+    return {}
+  }
+}
+</script>
+
+<style lang="less">
+  @import url('../style/index.less');
+
+  /*
+ * The following styles are auto-applied to elements with
+ * transition="page-transition" when their visibility is toggled
+ * by Vue.js.
+ *
+ * You can easily play with the page transition by editing
+ * these styles.
+ */
+
+  .page-transition-enter {
+    opacity: 0;
+  }
+
+  .page-transition-leave-active {
+    opacity: 0;
+  }
+
+  .page-transition-enter .page-transition-container,
+  .page-transition-leave-active .page-transition-container {
+    -webkit-transform: scale(1.1);
+    transform: scale(1.1);
+  }
+</style>
diff --git a/ui/src/layouts/BlankLayout.vue b/ui/src/layouts/BlankLayout.vue
new file mode 100644
index 0000000..7c93fb4
--- /dev/null
+++ b/ui/src/layouts/BlankLayout.vue
@@ -0,0 +1,33 @@
+// 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>
+    <router-view />
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'BlankLayout'
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/ui/src/layouts/PageView.vue b/ui/src/layouts/PageView.vue
new file mode 100644
index 0000000..a7ed4a4
--- /dev/null
+++ b/ui/src/layouts/PageView.vue
@@ -0,0 +1,166 @@
+// 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 :style="!$route.meta.hiddenHeaderContent ? 'margin: -24px -24px 0px;' : null">
+    <div class="page-menu-tabs">
+      <a-tabs :tabBarStyle="{margin: 0}" @change="changeTab">
+        <a-tab-pane v-for="child in $route.permission" :tab="this.$t(child.meta.title)" :key="child.key"></a-tab-pane>
+      </a-tabs>
+    </div>
+    <div class="content">
+      <div class="page-header-index-wide">
+        <slot>
+          <!-- keep-alive  -->
+          <keep-alive v-if="multiTab">
+            <router-view ref="content" />
+          </keep-alive>
+          <router-view v-else ref="content" />
+        </slot>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+
+export default {
+  name: 'PageView',
+  created () {
+    console.log(this.$route)
+    console.log(this.$router)
+  },
+  components: {
+  },
+  props: {
+    avatar: {
+      type: String,
+      default: null
+    },
+    title: {
+      type: [String, Boolean],
+      default: true
+    },
+    logo: {
+      type: String,
+      default: null
+    }
+  },
+  data () {
+    return {
+      pageTitle: null,
+      description: null,
+      linkList: [],
+      extraImage: '',
+      search: false,
+      tabs: {}
+    }
+  },
+  computed: {
+    ...mapState({
+      multiTab: state => state.app.multiTab
+    })
+  },
+  mounted () {
+    this.getPageMeta()
+  },
+  updated () {
+    this.getPageMeta()
+  },
+  methods: {
+    changeTab () {
+
+    },
+    getPageMeta () {
+      // eslint-disable-next-line
+      this.pageTitle = (typeof(this.title) === 'string' || !this.title) ? this.$t(this.title) : this.$t(this.$route.meta.title)
+
+      const content = this.$refs.content
+      if (content) {
+        if (content.pageMeta) {
+          Object.assign(this, content.pageMeta)
+        } else {
+          this.description = content.description
+          this.linkList = content.linkList
+          this.extraImage = content.extraImage
+          this.search = content.search === true
+          this.tabs = content.tabs
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .content {
+    margin: 24px 24px 0;
+    .link {
+      margin-top: 16px;
+      &:not(:empty) {
+        margin-bottom: 16px;
+      }
+      a {
+        margin-right: 32px;
+        height: 24px;
+        line-height: 24px;
+        display: inline-block;
+        i {
+          font-size: 24px;
+          margin-right: 8px;
+          vertical-align: middle;
+        }
+        span {
+          height: 24px;
+          line-height: 24px;
+          display: inline-block;
+          vertical-align: middle;
+        }
+      }
+    }
+  }
+  .page-menu-search {
+    text-align: center;
+    margin-bottom: 16px;
+  }
+  .page-menu-tabs {
+    margin-top: 48px;
+  }
+
+  .extra-img {
+    margin-top: -60px;
+    text-align: center;
+    width: 195px;
+
+    img {
+      width: 100%;
+    }
+  }
+
+  .mobile {
+    .extra-img{
+      margin-top: 0;
+      text-align: center;
+      width: 96px;
+
+      img{
+        width: 100%;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/layouts/ResourceLayout.vue b/ui/src/layouts/ResourceLayout.vue
new file mode 100644
index 0000000..b2aa1e5
--- /dev/null
+++ b/ui/src/layouts/ResourceLayout.vue
@@ -0,0 +1,49 @@
+// 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="page-header-index-wide page-header-wrapper-grid-content-main">
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="device === 'desktop' ? 7 : 8" style="margin-bottom: 12px">
+        <slot name="left">
+        </slot>
+      </a-col>
+      <a-col :md="24" :lg="device === 'desktop' ? 17 : 16">
+        <slot name="right">
+        </slot>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import { mixinDevice } from '@/utils/mixin.js'
+
+export default {
+  name: 'ResourceLayout',
+  mixins: [mixinDevice]
+}
+</script>
+
+<style lang="less" scoped>
+.page-header-wrapper-grid-content-main {
+  width: 100%;
+  height: 100%;
+  min-height: 100%;
+  transition: 0.3s;
+}
+</style>
diff --git a/ui/src/layouts/RouteView.vue b/ui/src/layouts/RouteView.vue
new file mode 100644
index 0000000..4833553
--- /dev/null
+++ b/ui/src/layouts/RouteView.vue
@@ -0,0 +1,40 @@
+// 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.
+
+<script>
+export default {
+  name: 'RouteView',
+  data () {
+    return {}
+  },
+  render () {
+    const { $route: { meta }, $store: { getters } } = this
+    const inKeep = (
+      <keep-alive>
+        <router-view />
+      </keep-alive>
+    )
+    const notKeep = (
+      <router-view />
+    )
+    if (meta.keepAlive === false) {
+      return notKeep
+    }
+    return getters.multiTab || meta.keepAlive ? inKeep : notKeep
+  }
+}
+</script>
diff --git a/ui/src/layouts/UserLayout.vue b/ui/src/layouts/UserLayout.vue
new file mode 100644
index 0000000..f5bb5a4
--- /dev/null
+++ b/ui/src/layouts/UserLayout.vue
@@ -0,0 +1,86 @@
+// 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 id="userLayout" :class="['user-layout', device]">
+    <div class="user-layout-container">
+      <div class="user-layout-header">
+        <img
+          v-if="$config.banner"
+          :style="{
+            width: $config.theme['@banner-width'],
+            height: $config.theme['@banner-height']
+          }"
+          :src="$config.banner"
+          class="user-layout-logo"
+          alt="logo">
+      </div>
+      <route-view></route-view>
+    </div>
+  </div>
+</template>
+
+<script>
+import RouteView from '@/layouts/RouteView'
+import { mixinDevice } from '@/utils/mixin.js'
+
+export default {
+  name: 'UserLayout',
+  components: { RouteView },
+  mixins: [mixinDevice],
+  data () {
+    return {}
+  },
+  mounted () {
+    document.body.classList.add('userLayout')
+  },
+  beforeDestroy () {
+    document.body.classList.remove('userLayout')
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.user-layout {
+  height: 100%;
+  background: #fff;
+
+  &-container {
+    padding: 3rem 0;
+    width: 100%;
+
+    @media (min-height:600px) {
+      padding: 0;
+      position: relative;
+      top: 50%;
+      transform: translateY(-50%);
+      margin-top: -50px;
+    }
+  }
+
+  &-logo {
+    border-style: none;
+    margin: 0 auto 2rem;
+    display: block;
+
+    .mobile & {
+      max-width: 300px;
+      margin-bottom: 1rem;
+    }
+  }
+}
+</style>
diff --git a/ui/src/layouts/index.js b/ui/src/layouts/index.js
new file mode 100644
index 0000000..cad56d4
--- /dev/null
+++ b/ui/src/layouts/index.js
@@ -0,0 +1,24 @@
+// 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 UserLayout from './UserLayout'
+import BlankLayout from './BlankLayout'
+import BasicLayout from './BasicLayout'
+import RouteView from './RouteView'
+import PageView from './PageView'
+
+export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView }
diff --git a/ui/src/locales/index.js b/ui/src/locales/index.js
new file mode 100644
index 0000000..f7a98aa
--- /dev/null
+++ b/ui/src/locales/index.js
@@ -0,0 +1,62 @@
+// 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 Vue from 'vue'
+import VueI18n from 'vue-i18n'
+
+const loadedLanguage = []
+const messages = {}
+
+Vue.use(VueI18n)
+
+export const i18n = new VueI18n({
+  locale: Vue.ls ? Vue.ls.get('LOCALE') || 'en' : 'en',
+  fallbackLocale: 'en',
+  silentTranslationWarn: true,
+  messages: messages
+})
+
+export function loadLanguageAsync (lang) {
+  if (!lang) {
+    lang = Vue.ls ? Vue.ls.get('LOCALE') || 'en' : 'en'
+  }
+  if (loadedLanguage.includes(lang)) {
+    return Promise.resolve(setLanguage(lang))
+  }
+
+  return fetch(`locales/${lang}.json`)
+    .then(response => response.json())
+    .then(json => Promise.resolve(setLanguage(lang, json)))
+}
+
+function setLanguage (lang, message) {
+  if (i18n) {
+    i18n.locale = lang
+
+    if (message && Object.keys(message).length > 0) {
+      i18n.setLocaleMessage(lang, message)
+    }
+  }
+
+  if (!loadedLanguage.includes(lang)) {
+    loadedLanguage.push(lang)
+  }
+
+  if (message && Object.keys(message).length > 0) {
+    messages[lang] = message
+  }
+}
diff --git a/ui/src/main.js b/ui/src/main.js
new file mode 100644
index 0000000..acc41d2
--- /dev/null
+++ b/ui/src/main.js
@@ -0,0 +1,51 @@
+// 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 Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import { i18n, loadLanguageAsync } from './locales'
+
+import bootstrap from './core/bootstrap'
+import './core/lazy_use'
+import './core/ext'
+import './permission' // permission control
+import './utils/filter' // global filter
+import { pollJobPlugin, notifierPlugin, toLocaleDatePlugin } from './utils/plugins'
+import { VueAxios } from './utils/request'
+
+Vue.config.productionTip = false
+Vue.use(VueAxios, router)
+Vue.use(pollJobPlugin)
+Vue.use(notifierPlugin)
+Vue.use(toLocaleDatePlugin)
+
+fetch('config.json').then(response => response.json()).then(config => {
+  Vue.prototype.$config = config
+  Vue.axios.defaults.baseURL = config.apiBase
+
+  loadLanguageAsync().then(() => {
+    new Vue({
+      router,
+      store,
+      i18n,
+      created: bootstrap,
+      render: h => h(App)
+    }).$mount('#app')
+  })
+})
diff --git a/ui/src/permission.js b/ui/src/permission.js
new file mode 100644
index 0000000..8e97511
--- /dev/null
+++ b/ui/src/permission.js
@@ -0,0 +1,92 @@
+// 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 Cookies from 'js-cookie'
+import Vue from 'vue'
+import { i18n } from './locales'
+import router from './router'
+import store from './store'
+
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import message from 'ant-design-vue/es/message'
+import notification from 'ant-design-vue/es/notification'
+import { setDocumentTitle } from '@/utils/domUtil'
+import { ACCESS_TOKEN, APIS } from '@/store/mutation-types'
+
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
+
+const whiteList = ['login'] // no redirect whitelist
+
+router.beforeEach((to, from, next) => {
+  // start progress bar
+  NProgress.start()
+  if (to.meta && typeof to.meta.title !== 'undefined') {
+    const title = i18n.t(to.meta.title) + ' - ' + Vue.prototype.$config.appTitle
+    setDocumentTitle(title)
+  }
+  const validLogin = Vue.ls.get(ACCESS_TOKEN) || Cookies.get('userid') || Cookies.get('userid', { path: '/client' })
+  if (validLogin) {
+    if (to.path === '/user/login') {
+      next({ path: '/dashboard' })
+      NProgress.done()
+    } else {
+      if (Object.keys(store.getters.apis).length === 0) {
+        const cachedApis = Vue.ls.get(APIS, {})
+        if (Object.keys(cachedApis).length > 0) {
+          message.loading(`${i18n.t('label.loading')}...`, 1.5)
+        }
+        store
+          .dispatch('GetInfo')
+          .then(apis => {
+            store.dispatch('GenerateRoutes', { apis }).then(() => {
+              router.addRoutes(store.getters.addRouters)
+              const redirect = decodeURIComponent(from.query.redirect || to.path)
+              if (to.path === redirect) {
+                next({ ...to, replace: true })
+              } else {
+                next({ path: redirect })
+              }
+            })
+          })
+          .catch(() => {
+            notification.error({
+              message: 'Error',
+              description: i18n.t('message.error.discovering.feature'),
+              duration: 0
+            })
+            store.dispatch('Logout').then(() => {
+              next({ path: '/user/login', query: { redirect: to.fullPath } })
+            })
+          })
+      } else {
+        next()
+      }
+    }
+  } else {
+    if (whiteList.includes(to.name)) {
+      next()
+    } else {
+      next({ path: '/user/login', query: { redirect: to.fullPath } })
+      NProgress.done()
+    }
+  }
+})
+
+router.afterEach(() => {
+  NProgress.done() // finish progress bar
+})
diff --git a/ui/src/router/index.js b/ui/src/router/index.js
new file mode 100644
index 0000000..73bb1c8
--- /dev/null
+++ b/ui/src/router/index.js
@@ -0,0 +1,29 @@
+// 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 Vue from 'vue'
+import Router from 'vue-router'
+import { constantRouterMap } from '@/config/router'
+
+Vue.use(Router)
+
+export default new Router({
+  mode: 'hash',
+  base: process.env.BASE_URL,
+  scrollBehavior: () => ({ y: 0 }),
+  routes: constantRouterMap
+})
diff --git a/ui/src/store/getters.js b/ui/src/store/getters.js
new file mode 100644
index 0000000..4e2d5eb
--- /dev/null
+++ b/ui/src/store/getters.js
@@ -0,0 +1,41 @@
+// 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.
+
+const getters = {
+  device: state => state.app.device,
+  version: state => state.app.version,
+  theme: state => state.app.theme,
+  color: state => state.app.color,
+  metrics: state => state.app.metrics,
+  token: state => state.user.token,
+  project: state => state.user.project,
+  avatar: state => state.user.avatar,
+  nickname: state => state.user.name,
+  apis: state => state.user.apis,
+  features: state => state.user.features,
+  userInfo: state => state.user.info,
+  addRouters: state => state.permission.addRouters,
+  multiTab: state => state.app.multiTab,
+  asyncJobIds: state => state.user.asyncJobIds,
+  isLdapEnabled: state => state.user.isLdapEnabled,
+  cloudian: state => state.user.cloudian,
+  zones: state => state.user.zones,
+  timezoneoffset: state => state.user.timezoneoffset,
+  usebrowsertimezone: state => state.user.usebrowsertimezone
+}
+
+export default getters
diff --git a/ui/src/store/index.js b/ui/src/store/index.js
new file mode 100644
index 0000000..e8c00f2
--- /dev/null
+++ b/ui/src/store/index.js
@@ -0,0 +1,44 @@
+// 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 Vue from 'vue'
+import Vuex from 'vuex'
+
+import app from './modules/app'
+import user from './modules/user'
+import permission from './modules/permission'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+  modules: {
+    app,
+    user,
+    permission
+  },
+  state: {
+
+  },
+  mutations: {
+
+  },
+  actions: {
+
+  },
+  getters
+})
diff --git a/ui/src/store/modules/app.js b/ui/src/store/modules/app.js
new file mode 100644
index 0000000..a03fc63
--- /dev/null
+++ b/ui/src/store/modules/app.js
@@ -0,0 +1,154 @@
+// 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 Vue from 'vue'
+import {
+  SIDEBAR_TYPE,
+  DEFAULT_THEME,
+  DEFAULT_LAYOUT_MODE,
+  DEFAULT_COLOR,
+  DEFAULT_COLOR_INVERTED,
+  DEFAULT_FIXED_HEADER,
+  DEFAULT_FIXED_SIDEMENU,
+  DEFAULT_FIXED_HEADER_HIDDEN,
+  DEFAULT_CONTENT_WIDTH_TYPE,
+  DEFAULT_MULTI_TAB,
+  USE_BROWSER_TIMEZONE
+} from '@/store/mutation-types'
+
+const app = {
+  state: {
+    version: process.env.PACKAGE_VERSION || 'master',
+    sidebar: true,
+    device: 'desktop',
+    theme: '',
+    layout: '',
+    contentWidth: '',
+    fixedHeader: false,
+    fixSiderbar: false,
+    autoHideHeader: false,
+    color: null,
+    inverted: true,
+    multiTab: true,
+    metrics: false
+  },
+  mutations: {
+    SET_SIDEBAR_TYPE: (state, type) => {
+      state.sidebar = type
+      Vue.ls.set(SIDEBAR_TYPE, type)
+    },
+    CLOSE_SIDEBAR: (state) => {
+      Vue.ls.set(SIDEBAR_TYPE, true)
+      state.sidebar = false
+    },
+    TOGGLE_DEVICE: (state, device) => {
+      state.device = device
+    },
+    TOGGLE_THEME: (state, theme) => {
+      Vue.ls.set(DEFAULT_THEME, theme)
+      state.theme = theme
+    },
+    TOGGLE_LAYOUT_MODE: (state, layout) => {
+      Vue.ls.set(DEFAULT_LAYOUT_MODE, layout)
+      state.layout = layout
+    },
+    TOGGLE_FIXED_HEADER: (state, fixed) => {
+      Vue.ls.set(DEFAULT_FIXED_HEADER, fixed)
+      state.fixedHeader = fixed
+    },
+    TOGGLE_FIXED_SIDERBAR: (state, fixed) => {
+      Vue.ls.set(DEFAULT_FIXED_SIDEMENU, fixed)
+      state.fixSiderbar = fixed
+    },
+    TOGGLE_FIXED_HEADER_HIDDEN: (state, show) => {
+      Vue.ls.set(DEFAULT_FIXED_HEADER_HIDDEN, show)
+      state.autoHideHeader = show
+    },
+    TOGGLE_CONTENT_WIDTH: (state, type) => {
+      Vue.ls.set(DEFAULT_CONTENT_WIDTH_TYPE, type)
+      state.contentWidth = type
+    },
+    TOGGLE_COLOR: (state, color) => {
+      Vue.ls.set(DEFAULT_COLOR, color)
+      state.color = color
+    },
+    TOGGLE_INVERTED: (state, flag) => {
+      Vue.ls.set(DEFAULT_COLOR_INVERTED, flag)
+      state.inverted = flag
+    },
+    TOGGLE_MULTI_TAB: (state, bool) => {
+      Vue.ls.set(DEFAULT_MULTI_TAB, bool)
+      state.multiTab = bool
+    },
+    SET_METRICS: (state, bool) => {
+      state.metrics = bool
+    },
+    SET_USE_BROWSER_TIMEZONE: (state, bool) => {
+      Vue.ls.set(USE_BROWSER_TIMEZONE, bool)
+      state.usebrowsertimezone = bool
+    }
+  },
+  actions: {
+    setSidebar ({ commit }, type) {
+      commit('SET_SIDEBAR_TYPE', type)
+    },
+    CloseSidebar ({ commit }) {
+      commit('CLOSE_SIDEBAR')
+    },
+    ToggleDevice ({ commit }, device) {
+      commit('TOGGLE_DEVICE', device)
+    },
+    ToggleTheme ({ commit }, theme) {
+      commit('TOGGLE_THEME', theme)
+    },
+    ToggleLayoutMode ({ commit }, mode) {
+      commit('TOGGLE_LAYOUT_MODE', mode)
+    },
+    ToggleFixedHeader ({ commit }, fixedHeader) {
+      if (!fixedHeader) {
+        commit('TOGGLE_FIXED_HEADER_HIDDEN', false)
+      }
+      commit('TOGGLE_FIXED_HEADER', fixedHeader)
+    },
+    ToggleFixSiderbar ({ commit }, fixSiderbar) {
+      commit('TOGGLE_FIXED_SIDERBAR', fixSiderbar)
+    },
+    ToggleFixedHeaderHidden ({ commit }, show) {
+      commit('TOGGLE_FIXED_HEADER_HIDDEN', show)
+    },
+    ToggleContentWidth ({ commit }, type) {
+      commit('TOGGLE_CONTENT_WIDTH', type)
+    },
+    ToggleColor ({ commit }, color) {
+      commit('TOGGLE_COLOR', color)
+    },
+    ToggleInverted ({ commit }, invertedFlag) {
+      commit('TOGGLE_INVERTED', invertedFlag)
+    },
+    ToggleMultiTab ({ commit }, bool) {
+      commit('TOGGLE_MULTI_TAB', bool)
+    },
+    SetMetrics ({ commit }, bool) {
+      commit('SET_METRICS', bool)
+    },
+    SetUseBrowserTimezone ({ commit }, bool) {
+      commit('SET_USE_BROWSER_TIMEZONE', bool)
+    }
+  }
+}
+
+export default app
diff --git a/ui/src/store/modules/permission.js b/ui/src/store/modules/permission.js
new file mode 100644
index 0000000..3b080be
--- /dev/null
+++ b/ui/src/store/modules/permission.js
@@ -0,0 +1,68 @@
+// 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 { asyncRouterMap, constantRouterMap } from '@/config/router'
+
+function hasApi (apis, route) {
+  if (route.meta && route.meta.permission) {
+    for (const permission of route.meta.permission) {
+      if (!apis.includes(permission)) {
+        return false
+      }
+    }
+    return true
+  }
+  return true
+}
+
+function filterAsyncRouter (routerMap, apis) {
+  const accessedRouters = routerMap.filter(route => {
+    if (hasApi(apis, route)) {
+      if (route.children && route.children.length > 0) {
+        route.children = filterAsyncRouter(route.children, apis)
+      }
+      return true
+    }
+    return false
+  })
+  return accessedRouters
+}
+
+const permission = {
+  state: {
+    routers: constantRouterMap,
+    addRouters: []
+  },
+  mutations: {
+    SET_ROUTERS: (state, routers) => {
+      state.addRouters = routers
+      state.routers = constantRouterMap.concat(routers)
+    }
+  },
+  actions: {
+    GenerateRoutes ({ commit }, data) {
+      return new Promise(resolve => {
+        const apis = Object.keys(data.apis)
+        const accessedRouters = filterAsyncRouter(asyncRouterMap(), apis)
+        commit('SET_ROUTERS', accessedRouters)
+        resolve()
+      })
+    }
+  }
+}
+
+export default permission
diff --git a/ui/src/store/modules/user.js b/ui/src/store/modules/user.js
new file mode 100644
index 0000000..9ed40e3
--- /dev/null
+++ b/ui/src/store/modules/user.js
@@ -0,0 +1,311 @@
+// 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 Cookies from 'js-cookie'
+import Vue from 'vue'
+import md5 from 'md5'
+import message from 'ant-design-vue/es/message'
+import notification from 'ant-design-vue/es/notification'
+import router from '@/router'
+import store from '@/store'
+import { login, logout, api } from '@/api'
+import { i18n } from '@/locales'
+import { ACCESS_TOKEN, CURRENT_PROJECT, DEFAULT_THEME, APIS, ASYNC_JOB_IDS, ZONES, TIMEZONE_OFFSET, USE_BROWSER_TIMEZONE } from '@/store/mutation-types'
+
+const user = {
+  state: {
+    token: '',
+    name: '',
+    avatar: '',
+    info: {},
+    apis: {},
+    features: {},
+    project: {},
+    asyncJobIds: [],
+    isLdapEnabled: false,
+    cloudian: {},
+    zones: {},
+    timezoneoffset: 0.0,
+    usebrowsertimezone: false
+  },
+
+  mutations: {
+    SET_TOKEN: (state, token) => {
+      state.token = token
+    },
+    SET_TIMEZONE_OFFSET: (state, timezoneoffset) => {
+      Vue.ls.set(TIMEZONE_OFFSET, timezoneoffset)
+      state.timezoneoffset = timezoneoffset
+    },
+    SET_USE_BROWSER_TIMEZONE: (state, bool) => {
+      Vue.ls.set(USE_BROWSER_TIMEZONE, bool)
+      state.usebrowsertimezone = bool
+    },
+    SET_PROJECT: (state, project = {}) => {
+      Vue.ls.set(CURRENT_PROJECT, project)
+      state.project = project
+    },
+    SET_NAME: (state, name) => {
+      state.name = name
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+    SET_INFO: (state, info) => {
+      state.info = info
+    },
+    SET_APIS: (state, apis) => {
+      state.apis = apis
+      Vue.ls.set(APIS, apis)
+    },
+    SET_FEATURES: (state, features) => {
+      state.features = features
+    },
+    SET_ASYNC_JOB_IDS: (state, jobsJsonArray) => {
+      Vue.ls.set(ASYNC_JOB_IDS, jobsJsonArray)
+      state.asyncJobIds = jobsJsonArray
+    },
+    SET_LDAP: (state, isLdapEnabled) => {
+      state.isLdapEnabled = isLdapEnabled
+    },
+    SET_CLOUDIAN: (state, cloudian) => {
+      state.cloudian = cloudian
+    },
+    RESET_THEME: (state) => {
+      Vue.ls.set(DEFAULT_THEME, 'light')
+    },
+    SET_ZONES: (state, zones) => {
+      state.zones = zones
+      Vue.ls.set(ZONES, zones)
+    }
+  },
+
+  actions: {
+    SetProject ({ commit }, project) {
+      commit('SET_PROJECT', project)
+    },
+    Login ({ commit }, userInfo) {
+      return new Promise((resolve, reject) => {
+        login(userInfo).then(response => {
+          const result = response.loginresponse || {}
+          Cookies.set('account', result.account, { expires: 1 })
+          Cookies.set('domainid', result.domainid, { expires: 1 })
+          Cookies.set('role', result.type, { expires: 1 })
+          Cookies.set('timezone', result.timezone, { expires: 1 })
+          Cookies.set('timezoneoffset', result.timezoneoffset, { expires: 1 })
+          Cookies.set('userfullname', result.firstname + ' ' + result.lastname, { expires: 1 })
+          Cookies.set('userid', result.userid, { expires: 1 })
+          Cookies.set('username', result.username, { expires: 1 })
+          Vue.ls.set(ACCESS_TOKEN, result.sessionkey, 24 * 60 * 60 * 1000)
+          commit('SET_TOKEN', result.sessionkey)
+          commit('SET_TIMEZONE_OFFSET', result.timezoneoffset)
+
+          const cachedUseBrowserTimezone = Vue.ls.get(USE_BROWSER_TIMEZONE, false)
+          commit('SET_USE_BROWSER_TIMEZONE', cachedUseBrowserTimezone)
+
+          commit('SET_APIS', {})
+          commit('SET_NAME', '')
+          commit('SET_AVATAR', '')
+          commit('SET_INFO', {})
+          commit('SET_PROJECT', {})
+          commit('SET_ASYNC_JOB_IDS', [])
+          commit('SET_FEATURES', {})
+          commit('SET_LDAP', {})
+          commit('SET_CLOUDIAN', {})
+
+          notification.destroy()
+
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    GetInfo ({ commit }) {
+      return new Promise((resolve, reject) => {
+        const cachedApis = Vue.ls.get(APIS, {})
+        const cachedZones = Vue.ls.get(ZONES, [])
+        const cachedTimezoneOffset = Vue.ls.get(TIMEZONE_OFFSET, 0.0)
+        const cachedUseBrowserTimezone = Vue.ls.get(USE_BROWSER_TIMEZONE, false)
+        const hasAuth = Object.keys(cachedApis).length > 0
+        if (hasAuth) {
+          console.log('Login detected, using cached APIs')
+          commit('SET_ZONES', cachedZones)
+          commit('SET_APIS', cachedApis)
+          commit('SET_TIMEZONE_OFFSET', cachedTimezoneOffset)
+          commit('SET_USE_BROWSER_TIMEZONE', cachedUseBrowserTimezone)
+
+          // Ensuring we get the user info so that store.getters.user is never empty when the page is freshly loaded
+          api('listUsers', { username: Cookies.get('username'), listall: true }).then(response => {
+            const result = response.listusersresponse.user[0]
+            commit('SET_INFO', result)
+            commit('SET_NAME', result.firstname + ' ' + result.lastname)
+            if ('email' in result) {
+              commit('SET_AVATAR', 'https://www.gravatar.com/avatar/' + md5(result.email))
+            } else {
+              commit('SET_AVATAR', 'https://www.gravatar.com/avatar/' + md5('dev@cloudstack.apache.org'))
+            }
+            resolve(cachedApis)
+          }).catch(error => {
+            reject(error)
+          })
+        } else {
+          const hide = message.loading(i18n.t('message.discovering.feature'), 0)
+          api('listZones', { listall: true }).then(json => {
+            const zones = json.listzonesresponse.zone || []
+            commit('SET_ZONES', zones)
+          }).catch(error => {
+            reject(error)
+          })
+          api('listApis').then(response => {
+            const apis = {}
+            const apiList = response.listapisresponse.api
+            for (var idx = 0; idx < apiList.length; idx++) {
+              const api = apiList[idx]
+              const apiName = api.name
+              apis[apiName] = {
+                params: api.params,
+                response: api.response
+              }
+            }
+            commit('SET_APIS', apis)
+            resolve(apis)
+            store.dispatch('GenerateRoutes', { apis }).then(() => {
+              router.addRoutes(store.getters.addRouters)
+            })
+            hide()
+            message.success(i18n.t('message.sussess.discovering.feature'))
+          }).catch(error => {
+            reject(error)
+          })
+        }
+
+        api('listUsers', { username: Cookies.get('username') }).then(response => {
+          const result = response.listusersresponse.user[0]
+          commit('SET_INFO', result)
+          commit('SET_NAME', result.firstname + ' ' + result.lastname)
+          if ('email' in result) {
+            commit('SET_AVATAR', 'https://www.gravatar.com/avatar/' + md5(result.email))
+          } else {
+            commit('SET_AVATAR', 'https://www.gravatar.com/avatar/' + md5('dev@cloudstack.apache.org'))
+          }
+        }).catch(error => {
+          reject(error)
+        })
+
+        api('listCapabilities').then(response => {
+          const result = response.listcapabilitiesresponse.capability
+          commit('SET_FEATURES', result)
+        }).catch(error => {
+          reject(error)
+        })
+
+        api('listLdapConfigurations').then(response => {
+          const ldapEnable = (response.ldapconfigurationresponse.count > 0)
+          commit('SET_LDAP', ldapEnable)
+        }).catch(error => {
+          reject(error)
+        })
+
+        api('cloudianIsEnabled').then(response => {
+          const cloudian = response.cloudianisenabledresponse.cloudianisenabled || {}
+          commit('SET_CLOUDIAN', cloudian)
+        }).catch(ignored => {
+        })
+      })
+    },
+
+    Logout ({ commit, state }) {
+      return new Promise((resolve) => {
+        var cloudianUrl = null
+        if (state.cloudian.url && state.cloudian.enabled) {
+          cloudianUrl = state.cloudian.url + 'logout.htm?redirect=' + encodeURIComponent(window.location.href)
+        }
+
+        Object.keys(Cookies.get()).forEach(cookieName => {
+          Cookies.remove(cookieName)
+          Cookies.remove(cookieName, { path: '/client' })
+        })
+
+        commit('SET_TOKEN', '')
+        commit('SET_APIS', {})
+        commit('SET_PROJECT', {})
+        commit('SET_ASYNC_JOB_IDS', [])
+        commit('SET_FEATURES', {})
+        commit('SET_LDAP', {})
+        commit('SET_CLOUDIAN', {})
+        commit('RESET_THEME')
+        Vue.ls.remove(CURRENT_PROJECT)
+        Vue.ls.remove(ACCESS_TOKEN)
+        Vue.ls.remove(ASYNC_JOB_IDS)
+
+        logout(state.token).then(() => {
+          message.destroy()
+          if (cloudianUrl) {
+            window.location.href = cloudianUrl
+          } else {
+            resolve()
+          }
+        }).catch(() => {
+          resolve()
+        })
+      })
+    },
+    AddAsyncJob ({ commit }, jobJson) {
+      var jobsArray = Vue.ls.get(ASYNC_JOB_IDS, [])
+      jobsArray.push(jobJson)
+      commit('SET_ASYNC_JOB_IDS', jobsArray)
+    },
+    ProjectView ({ commit }, projectid) {
+      return new Promise((resolve, reject) => {
+        api('listApis', { projectid: projectid }).then(response => {
+          const apis = {}
+          const apiList = response.listapisresponse.api
+          for (var idx = 0; idx < apiList.length; idx++) {
+            const api = apiList[idx]
+            const apiName = api.name
+            apis[apiName] = {
+              params: api.params,
+              response: api.response
+            }
+          }
+          commit('SET_APIS', apis)
+          resolve(apis)
+          store.dispatch('GenerateRoutes', { apis }).then(() => {
+            router.addRoutes(store.getters.addRouters)
+          })
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    RefreshFeatures ({ commit }) {
+      return new Promise((resolve, reject) => {
+        api('listCapabilities').then(response => {
+          const result = response.listcapabilitiesresponse.capability
+          resolve(result)
+          commit('SET_FEATURES', result)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    }
+  }
+}
+
+export default user
diff --git a/ui/src/store/mutation-types.js b/ui/src/store/mutation-types.js
new file mode 100644
index 0000000..9d73561
--- /dev/null
+++ b/ui/src/store/mutation-types.js
@@ -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.
+
+export const ACCESS_TOKEN = 'Access-Token'
+export const CURRENT_PROJECT = 'CURRENT_PROJECT'
+export const SIDEBAR_TYPE = 'SIDEBAR_TYPE'
+export const DEFAULT_THEME = 'DEFAULT_THEME'
+export const DEFAULT_LAYOUT_MODE = 'DEFAULT_LAYOUT_MODE'
+export const DEFAULT_COLOR = 'DEFAULT_COLOR'
+export const DEFAULT_COLOR_INVERTED = 'DEFAULT_COLOR_INVERTED'
+export const DEFAULT_FIXED_HEADER = 'DEFAULT_FIXED_HEADER'
+export const DEFAULT_FIXED_SIDEMENU = 'DEFAULT_FIXED_SIDEMENU'
+export const DEFAULT_FIXED_HEADER_HIDDEN = 'DEFAULT_FIXED_HEADER_HIDDEN'
+export const DEFAULT_CONTENT_WIDTH_TYPE = 'DEFAULT_CONTENT_WIDTH_TYPE'
+export const DEFAULT_MULTI_TAB = 'DEFAULT_MULTI_TAB'
+export const APIS = 'APIS'
+export const ZONES = 'ZONES'
+export const ASYNC_JOB_IDS = 'ASYNC_JOB_IDS'
+export const TIMEZONE_OFFSET = 'TIMEZONE_OFFSET'
+export const USE_BROWSER_TIMEZONE = 'USE_BROWSER_TIMEZONE'
+
+export const CONTENT_WIDTH_TYPE = {
+  Fluid: 'Fluid',
+  Fixed: 'Fixed'
+}
diff --git a/ui/src/style/README.md b/ui/src/style/README.md
new file mode 100644
index 0000000..d60ceb3
--- /dev/null
+++ b/ui/src/style/README.md
@@ -0,0 +1,47 @@
+# index.less
+- src/styles/index.less imports all necessary rules for cloudstack
+
+# ant .less structure node_modules/ant-design-vue/
+## main .less entry points:
+
+1. dist/antd.less
+    - imports everthing with index.less + components.less
+2. lib/style/index.less
+    - themes/default.less
+        - color/colors'
+        - default theme @variables
+    - core/index.less
+        - includes base styles, motion rules and iconfont
+
+# src/style/ explaination
+
+- index.less includes ant styles, as well as all custom variables and rules
+
+## folders:
+
+1. variables
+    - include all custom variables here
+2. common
+    - include all rules that reset styles, define global stuffs without classes at all
+    - e.g. body {} p, ul, li {} h1, h2, h3 {}
+3. ant-overwrite
+    - any styles that overwrites the existin ant rules by any reason
+    - e.g. classes like .ant-layout-header .anticon {}
+4. frame
+    - everything that belongs to the frame
+    - e.g. header, footer, nav, sider, content (just the actual content frame, not every component in it)
+5. layout
+    - rules that modify the page at all if new layout class is set.
+    - e.g. #html class="layout-ant-black"#
+6. objects
+    - repeatly used elements like buttons, inputs
+7. components
+    - complex elements like dropdown, forms, table, search (usualy include this to components/FooterToolbar/ folder)
+
+
+# The "/deep/" combinator
+- use the /deep/ combinator (or in other versions ">>>") helps us to exclude "scoped" rules into global
+- e.g. <style scoped> .a .b .c {}</style> will scope a generated data ID like .a .b .c[data-abcde] {}
+- but  <style scoped> .a /deep/ .b .c {} </style> will scope .a[data-abcde] .b .c {}
+- so everything after deep will be outside the defined scope
+- watch this article for technical information. https://vue-loader.vuejs.org/guide/scoped-css.html#child-component-root-elements
diff --git a/ui/src/style/ant-overwrite/ant-form.less b/ui/src/style/ant-overwrite/ant-form.less
new file mode 100644
index 0000000..0c838c6
--- /dev/null
+++ b/ui/src/style/ant-overwrite/ant-form.less
@@ -0,0 +1,20 @@
+// 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.
+
+.ant-form .ant-form-item {
+  margin-bottom: 6px;
+}
diff --git a/ui/src/style/ant-overwrite/ant-layout-header.less b/ui/src/style/ant-overwrite/ant-layout-header.less
new file mode 100644
index 0000000..6761cbc
--- /dev/null
+++ b/ui/src/style/ant-overwrite/ant-layout-header.less
@@ -0,0 +1,49 @@
+// 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.
+
+.ant-layout-header {
+  .anticon-menu-fold {
+    font-size: 18px;
+    line-height: 1;
+  }
+
+  .ant-breadcrumb .anticon {
+    margin-top: -3px;
+    margin-left: 12px;
+  }
+
+  .anticon-home {
+    font-size: 18px;
+  }
+
+  .anticon {
+    vertical-align: middle;
+  }
+}
+
+.ant-menu {
+
+  .ant-menu-item .anticon,
+  .ant-menu-submenu-title .anticon {
+    font-size: 18px!important; // overwrite ant-menu collaped defaults
+    margin-right: 12px;
+    vertical-align: sub;
+  }
+}
+
+.ant-badge-count {
+}
diff --git a/ui/src/style/ant-overwrite/ant-progress.less b/ui/src/style/ant-overwrite/ant-progress.less
new file mode 100644
index 0000000..70f56bc
--- /dev/null
+++ b/ui/src/style/ant-overwrite/ant-progress.less
@@ -0,0 +1,20 @@
+// 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.
+
+.ant-progress-circle .ant-progress-text {
+  font-size: 16px;
+}
diff --git a/ui/src/style/common/common.less b/ui/src/style/common/common.less
new file mode 100644
index 0000000..cf4e740
--- /dev/null
+++ b/ui/src/style/common/common.less
@@ -0,0 +1,20 @@
+// 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 {
+  overflow-y: scroll;
+}
diff --git a/ui/src/style/component/dashboard.less b/ui/src/style/component/dashboard.less
new file mode 100644
index 0000000..2acbe9d
--- /dev/null
+++ b/ui/src/style/component/dashboard.less
@@ -0,0 +1,50 @@
+// 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.
+
+.ant-pro-capacity-dashboard {
+  &__wrapper {
+    display: flex;
+    margin-bottom: 24px;
+    flex-wrap: nowrap;
+
+    .mobile & {
+      flex-wrap: wrap;
+    }
+  }
+
+  &__select {
+    width: 100%;
+
+    .mobile & {
+      margin-bottom: 12px;
+    }
+  }
+
+  &__button {
+    width: auto;
+  }
+
+  &__tile-wrapper:after {
+    content: "";
+    clear: both;
+    display: table;
+  }
+
+  &__alert-wrapper {
+    clear: both;
+  }
+}
diff --git a/ui/src/style/frame/content.less b/ui/src/style/frame/content.less
new file mode 100644
index 0000000..aa11574
--- /dev/null
+++ b/ui/src/style/frame/content.less
@@ -0,0 +1,27 @@
+// 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.
+
+.content {
+
+  .table-operator {
+    margin-bottom: 18px;
+
+    button {
+      margin-right: 8px;
+    }
+  }
+}
\ No newline at end of file
diff --git a/ui/src/style/frame/search.less b/ui/src/style/frame/search.less
new file mode 100644
index 0000000..3e0f952
--- /dev/null
+++ b/ui/src/style/frame/search.less
@@ -0,0 +1,52 @@
+// 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-page-search-wrapper {
+
+  .ant-form-inline {
+
+    .ant-form-item {
+      display: flex;
+      margin-bottom: 24px;
+      margin-right: 0;
+
+      .ant-form-item-control-wrapper {
+        flex: 1 1;
+        display: inline-block;
+        vertical-align: middle;
+      }
+
+      > .ant-form-item-label {
+        line-height: 32px;
+        padding-right: 8px;
+        width: auto;
+      }
+
+      .ant-form-item-control {
+        height: 32px;
+        line-height: 32px;
+      }
+    }
+  }
+
+  .table-page-search-submitButtons {
+    display: block;
+    margin-bottom: 24px;
+    white-space: nowrap;
+  }
+
+}
\ No newline at end of file
diff --git a/ui/src/style/frame/sider.less b/ui/src/style/frame/sider.less
new file mode 100644
index 0000000..c021946
--- /dev/null
+++ b/ui/src/style/frame/sider.less
@@ -0,0 +1,87 @@
+// 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.
+
+.sider {
+  box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
+  position: relative;
+  z-index: 10;
+  height: auto;
+
+  .ant-layout-sider-children {
+    overflow-y: hidden;
+
+    &:hover {
+      overflow-y: auto;
+    }
+  }
+
+  &.ant-fixed-sidemenu {
+    position: fixed;
+    height: 100%;
+  }
+
+  .logo {
+    height: 64px;
+    position: relative;
+    line-height: 64px;
+    padding-left: 24px;
+    -webkit-transition: all .3s;
+    transition: all .3s;
+    background: #002140;
+    overflow: hidden;
+
+    img,
+    svg,
+    h1 {
+      display: inline-block;
+      vertical-align: middle;
+    }
+
+    img {
+      height: 32px;
+      width: 32px;
+    }
+
+    h1 {
+      color: #fff;
+      font-size: 20px;
+      margin: 0 0 0 12px;
+      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+      font-weight: 600;
+      vertical-align: middle;
+    }
+  }
+
+  &.light {
+    background-color: #fff;
+    box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05);
+
+    .logo {
+      background: #fff;
+      box-shadow: 1px 1px 0px 0px #e8e8e8;
+
+      h1 {
+        color: unset;
+      }
+    }
+
+    .ant-menu-light {
+      border-right-color: transparent;
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/ui/src/style/frame/top-menu.less b/ui/src/style/frame/top-menu.less
new file mode 100644
index 0000000..4998735
--- /dev/null
+++ b/ui/src/style/frame/top-menu.less
@@ -0,0 +1,23 @@
+// 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.
+
+.topmenu {
+  .page-header-index-wide {
+    max-width: 1200px;
+    margin: 0 auto;
+  }
+}
\ No newline at end of file
diff --git a/ui/src/style/index.less b/ui/src/style/index.less
new file mode 100644
index 0000000..0cb6be4
--- /dev/null
+++ b/ui/src/style/index.less
@@ -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.
+
+//* import all  ## official ant ##  variables; mixins and styles
+@import "~ant-design-vue/lib/style/themes/default";
+@import "~ant-design-vue/lib/style/core/index";
+
+//* import all  ## custom ##  variables, mixins and styles
+
+
+@import "variables/prefixes";
+
+@import "common/common";
+
+@import "layout/ant";
+@import "layout/inverted-mode";
+@import "ant-overwrite/ant-layout-header";
+@import "ant-overwrite/ant-progress";
+@import "ant-overwrite/ant-form";
+
+@import "frame/content";
+@import "frame/search";
+@import "frame/top-menu";
+
+@import "objects/table";
diff --git a/ui/src/style/layout/ant.less b/ui/src/style/layout/ant.less
new file mode 100644
index 0000000..4f376a1
--- /dev/null
+++ b/ui/src/style/layout/ant.less
@@ -0,0 +1,321 @@
+// 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 refactor this file
+.layout.ant-layout {
+  height: auto;
+  overflow-x: hidden;
+
+  &.mobile,
+  &.tablet {
+
+    .ant-table-wrapper {
+      .ant-table-content {
+        overflow-y: auto;
+      }
+
+      .ant-table-body {
+        min-width: 500px;
+      }
+    }
+
+    .topmenu {
+      &.content-width-Fluid {
+        .header-index-wide {
+          margin-left: 0;
+        }
+      }
+    }
+  }
+
+  &.mobile {
+    .sidemenu {
+      .ant-header-fixedHeader {
+
+        &.ant-header-side-opened,
+        &.ant-header-side-closed {
+          width: 100%
+        }
+      }
+    }
+  }
+
+  &.ant-layout-has-sider {
+    flex-direction: row;
+  }
+
+  .trigger {
+    font-size: 20px;
+    line-height: 64px;
+    padding: 0 24px;
+    cursor: pointer;
+    transition: color .3s;
+
+    &:hover {
+      background: rgba(0, 0, 0, 0.025);
+    }
+  }
+
+  .topmenu {
+    .ant-header-fixedHeader {
+      position: fixed;
+      top: 0;
+      right: 0;
+      z-index: 9;
+      width: 100%;
+      transition: width .2s;
+
+      &.ant-header-side-opened {
+        width: 100%;
+      }
+
+      &.ant-header-side-closed {
+        width: 100%;
+      }
+    }
+
+    &.content-width-Fluid {
+      .header-index-wide {
+        max-width: unset;
+        margin-left: 24px;
+      }
+
+      .page-header-index-wide {
+        max-width: unset;
+      }
+    }
+
+  }
+
+  .sidemenu {
+    .ant-header-fixedHeader {
+      position: fixed;
+      top: 0;
+      right: 0;
+      z-index: 9;
+      width: 100%;
+      transition: width .2s;
+
+      &.ant-header-side-opened {
+        width: calc(100% - 256px)
+      }
+
+      &.ant-header-side-closed {
+        width: calc(100% - 80px)
+      }
+    }
+  }
+
+  .header {
+    height: 64px;
+    padding: 0 12px 0 0;
+    background: #fff;
+    box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
+    position: relative;
+  }
+
+  .header,
+  .top-nav-header-index {
+
+    .user-menu {
+      float: right;
+      height: 100%;
+      padding: 0 2px;
+
+      .action {
+        cursor: pointer;
+        padding: 0 10px;
+        display: flex;
+        align-items: center;
+        float: left;
+        transition: all .3s;
+        height: 100%;
+        color: rgba(0, 0, 0, 0.65);
+
+        &:hover {
+          background: rgba(0, 0, 0, 0.025);
+        }
+
+        .avatar {
+          margin: 20px 8px 20px 0;
+          color: #1890ff;
+          background: hsla(0, 0%, 100%, .85);
+          vertical-align: middle;
+        }
+
+        .icon {
+          font-size: 16px;
+          padding: 4px;
+        }
+      }
+    }
+
+    &.dark {
+
+      .user-menu {
+
+        .action {
+          color: rgba(255, 255, 255, 0.85);
+
+          a {
+            color: rgba(255, 255, 255, 0.85);
+          }
+
+          &:hover {
+            background: rgba(255, 255, 255, 0.16);
+          }
+        }
+      }
+    }
+  }
+
+  &.mobile,
+  &.tablet {
+    .top-nav-header-index {
+
+      .header-index-wide {
+
+        .header-index-left {
+
+          .trigger {
+            color: rgba(255, 255, 255, 0.85);
+            padding: 0 12px;
+          }
+
+          .logo.top-nav-header {
+            flex: 0 0 56px;
+            text-align: center;
+            line-height: 58px;
+
+            h1 {
+              display: none;
+            }
+          }
+        }
+      }
+
+      &.light {
+
+        .header-index-wide {
+
+          .header-index-left {
+            .trigger {
+              color: rgba(0, 0, 0, 0.65);
+            }
+          }
+        }
+
+        //
+      }
+    }
+  }
+
+  &.tablet {
+
+    // overflow: hidden; text-overflow:ellipsis; white-space: nowrap;
+    .top-nav-header-index {
+
+      .header-index-wide {
+
+        .header-index-left {
+          .logo > a {
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+        }
+
+        .ant-menu.ant-menu-horizontal {
+          flex: 1 1;
+          white-space: normal;
+        }
+      }
+    }
+
+  }
+
+  .top-nav-header-index {
+    box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
+    position: relative;
+    transition: background .3s, width .2s;
+
+    .header-index-wide {
+      max-width: 1200px;
+      margin: auto;
+      padding-left: 0;
+      display: flex;
+      height: 64px;
+
+      .ant-menu.ant-menu-horizontal {
+        border: none;
+        height: 64px;
+        line-height: 64px;
+      }
+
+      .header-index-left {
+        flex: 1 1;
+        display: flex;
+
+        .logo.top-nav-header {
+          width: 165px;
+          height: 64px;
+          position: relative;
+          line-height: 64px;
+          transition: all .3s;
+          overflow: hidden;
+
+          img,
+          svg {
+            display: inline-block;
+            vertical-align: middle;
+            height: 32px;
+            width: 32px;
+          }
+
+          h1 {
+            color: #fff;
+            display: inline-block;
+            vertical-align: top;
+            font-size: 16px;
+            margin: 0 0 0 12px;
+            font-weight: 400;
+          }
+        }
+      }
+
+      .header-index-right {
+        flex: 0 0 auto;
+        height: 64px;
+        overflow: hidden;
+      }
+    }
+
+    &.light {
+      background-color: #fff;
+
+      .header-index-wide {
+        .header-index-left {
+          .logo {
+            h1 {
+              color: #002140;
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/ui/src/style/layout/inverted-mode.less b/ui/src/style/layout/inverted-mode.less
new file mode 100644
index 0000000..30a0bc4
--- /dev/null
+++ b/ui/src/style/layout/inverted-mode.less
@@ -0,0 +1,20 @@
+// 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.layout-inverted-mode {
+  filter: invert(80%);
+}
diff --git a/ui/src/style/objects/table.less b/ui/src/style/objects/table.less
new file mode 100644
index 0000000..8b51257
--- /dev/null
+++ b/ui/src/style/objects/table.less
@@ -0,0 +1,20 @@
+// 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-alert {
+  margin-bottom: 16px;
+}
\ No newline at end of file
diff --git a/ui/src/style/variables/prefixes.less b/ui/src/style/variables/prefixes.less
new file mode 100644
index 0000000..e920ed2
--- /dev/null
+++ b/ui/src/style/variables/prefixes.less
@@ -0,0 +1,19 @@
+// 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.
+
+// The prefix to use on all css classes from ant-pro.
+@ant-pro-prefix             : ant-pro;
diff --git a/ui/src/style/vars.less b/ui/src/style/vars.less
new file mode 100644
index 0000000..179aabe
--- /dev/null
+++ b/ui/src/style/vars.less
@@ -0,0 +1,242 @@
+// 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.
+
+@logo-width: 256px;
+@logo-height: 64px;
+@banner-width: 450px;
+@banner-height: 110px;
+@error-width: 256px;
+@error-height: 256px;
+
+@logo-background-color: #ffffff;
+@navigation-background-color: #ffffff;
+@project-nav-background-color: #001529;
+@project-nav-text-color: rgba(255, 255, 255, 0.65);
+@navigation-text-color:  rgba(0, 0, 0, 0.65);
+@primary-color: #1890ff;
+@link-color: @primary-color;
+@link-hover-color: #40a9ff;
+@processing-color: @primary-color;
+@success-color: #52c41a;
+@warning-color: #faad14;
+@error-color: #f5222d;
+@font-size-base: 14px;
+@heading-color: rgba(0, 0, 0, 0.85);
+@text-color: rgba(0, 0, 0, 0.65);
+@text-color-secondary: rgba(0, 0, 0, 0.45);
+@disabled-color: rgba(0, 0, 0, 0.25);
+@border-color-base: #d9d9d9;
+@border-radius-base: 4px;
+@box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15);
+@loading-color: @primary-color;
+
+.ant-layout-sider-children .logo-image {
+  width: @logo-width;
+  height: @logo-height;
+}
+
+.user-layout {
+  &-logo {
+    width: @banner-width;
+    height: @banner-height;
+  }
+}
+
+.exception {
+  .img {
+    img {
+      width: @error-width;
+      height: @error-height;
+    }
+  }
+}
+
+a {
+  color: @link-color;
+  background-color: transparent;
+
+  &:hover {
+    color: @link-hover-color;
+  }
+}
+
+.ant-message-info .anticon,
+.ant-message-loading .anticon {
+  color: @loading-color;
+}
+
+#nprogress {
+  .bar {
+    background-color: @loading-color;
+  }
+}
+
+.sider.light .logo {
+  background-color: @logo-background-color;
+  box-shadow: 1px 1px 0px 0px #e8e8e8;
+}
+
+.sider.light {
+  background: @navigation-background-color;
+
+  .ant-menu-submenu > .ant-menu {
+    background: @navigation-background-color;
+  }
+}
+
+.sider.light .ant-menu-light {
+  background: @navigation-background-color;
+}
+
+.ant-menu-submenu-popup.ant-menu-light,
+.ant-menu-light > .ant-menu {
+  background: @navigation-background-color;
+}
+
+.ant-menu-item > a
+{
+  color: @navigation-text-color;
+}
+
+.ant-menu-item-selected > a, .ant-menu-item-selected > a:hover {
+  color: @primary-color;
+}
+
+.ant-menu-vertical .ant-menu-item,
+.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-vertical-right .ant-menu-item,
+.ant-menu-inline .ant-menu-item,
+.ant-menu-vertical .ant-menu-submenu-title,
+.ant-menu-vertical-left .ant-menu-submenu-title,
+.ant-menu-vertical-right .ant-menu-submenu-title,
+.ant-menu-inline .ant-menu-submenu-title {
+  color: @navigation-text-color;
+}
+
+.ant-menu-submenu-vertical ant-menu-submenu-selected,
+.ant-menu-vertical .ant-menu-submenu-selected,
+.ant-menu-vertical-left .ant-menu-submenu-selected,
+.ant-menu-vertical-right .ant-menu-submenu-selected {
+  color: @primary-color;
+
+  .ant-menu-submenu-title {
+    color: @primary-color;
+  }
+}
+
+.kubernet-icon path {
+  color: @navigation-text-color;
+}
+
+.ant-menu-item:hover,
+.ant-menu-item-active,
+.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open,
+.ant-menu-submenu-active,
+.ant-menu-submenu-title:hover
+{
+  color: @primary-color;
+
+  .custom-icon path {
+    color: @primary-color;
+  }
+}
+
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after {
+  background-color: @navigation-text-color;
+}
+
+.sider.dark {
+  .ant-menu-vertical .ant-menu-item,
+  .ant-menu-vertical-left .ant-menu-item,
+  .ant-menu-vertical-right .ant-menu-item,
+  .ant-menu-inline .ant-menu-item,
+  .ant-menu-vertical .ant-menu-submenu-title,
+  .ant-menu-vertical-left .ant-menu-submenu-title,
+  .ant-menu-vertical-right .ant-menu-submenu-title,
+  .ant-menu-inline .ant-menu-submenu-title {
+    color: @project-nav-text-color;
+  }
+
+  .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+  .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+  .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+  .ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+  .ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+  .ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+  .ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow::after,
+  .ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow::after
+  {
+    background-color: @project-nav-text-color;
+  }
+
+  .ant-menu-submenu-active .ant-menu-submenu-title .ant-menu-submenu-arrow::before,
+  .ant-menu-submenu-active .ant-menu-submenu-title .ant-menu-submenu-arrow::after
+  {
+    background-color: @primary-color;
+  }
+
+  .ant-menu-dark .ant-menu-item:hover > a,
+  .ant-menu-dark .ant-menu-submenu-title:hover > a,
+  .ant-menu-dark .ant-menu-submenu-title:hover,
+  .ant-menu-dark .ant-menu-item:hover,
+  .ant-menu-dark .ant-menu-submenu-title:hover
+  {
+    color: @primary-color;
+
+    .custom-icon path {
+      color: @primary-color;
+    }
+  }
+
+  .ant-menu-submenu-selected {
+    .ant-menu-submenu-title {
+      color: @primary-color;
+    }
+  }
+}
+
+.ant-menu-dark,
+.ant-menu-dark .ant-menu-sub,
+.ant-menu-dark .ant-menu-inline.ant-menu-sub{
+  background-color: @project-nav-background-color;
+}
+
+.ant-menu-dark .ant-menu-item,
+.ant-menu-dark .ant-menu-item-group-title,
+.ant-menu-dark .ant-menu-item > a {
+  color: @project-nav-text-color;
+}
+
+.ant-menu-dark .ant-menu-item:hover > a,
+.ant-menu-dark .ant-menu-submenu-title:hover > a,
+.ant-menu-dark .ant-menu-submenu-title:hover,
+.ant-menu-dark .ant-menu-item:hover,
+.ant-menu-dark .ant-menu-submenu-title:hover
+{
+  color: @primary-color;
+
+  .custom-icon path {
+    color: @primary-color;
+  }
+}
\ No newline at end of file
diff --git a/ui/src/utils/auth.js b/ui/src/utils/auth.js
new file mode 100644
index 0000000..fc019b1
--- /dev/null
+++ b/ui/src/utils/auth.js
@@ -0,0 +1,33 @@
+// 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 { setStore, getStore, clearStore } from '@/utils/storage'
+
+export const TokenKey = 'Access-Token'
+
+export function getToken () {
+  return getStore(TokenKey)
+}
+
+export function setToken (token) {
+  // key, token, timeout = 86400s
+  return setStore(TokenKey, token, 86400)
+}
+
+export function removeToken () {
+  return clearStore(TokenKey)
+}
diff --git a/ui/src/utils/axios.js b/ui/src/utils/axios.js
new file mode 100644
index 0000000..0583f93
--- /dev/null
+++ b/ui/src/utils/axios.js
@@ -0,0 +1,52 @@
+// 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.
+
+const VueAxios = {
+  vm: {},
+  // eslint-disable-next-line no-unused-vars
+  install (Vue, instance) {
+    if (this.installed) {
+      return
+    }
+    this.installed = true
+
+    if (!instance) {
+      // eslint-disable-next-line no-console
+      console.error('You have to install axios')
+      return
+    }
+
+    Vue.axios = instance
+
+    Object.defineProperties(Vue.prototype, {
+      axios: {
+        get: function get () {
+          return instance
+        }
+      },
+      $http: {
+        get: function get () {
+          return instance
+        }
+      }
+    })
+  }
+}
+
+export {
+  VueAxios
+}
diff --git a/ui/src/utils/device.js b/ui/src/utils/device.js
new file mode 100644
index 0000000..ce6deab
--- /dev/null
+++ b/ui/src/utils/device.js
@@ -0,0 +1,49 @@
+// 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 enquireJs from 'enquire.js'
+
+export const DEVICE_TYPE = {
+  DESKTOP: 'desktop',
+  TABLET: 'tablet',
+  MOBILE: 'mobile'
+}
+
+export const deviceEnquire = function (callback) {
+  const matchDesktop = {
+    match: () => {
+      callback && callback(DEVICE_TYPE.DESKTOP)
+    }
+  }
+
+  const matchTablet = {
+    match: () => {
+      callback && callback(DEVICE_TYPE.TABLET)
+    }
+  }
+
+  const matchMobile = {
+    match: () => {
+      callback && callback(DEVICE_TYPE.MOBILE)
+    }
+  }
+
+  enquireJs
+    .register('screen and (max-width: 800px)', matchMobile)
+    .register('screen and (min-width: 800px) and (max-width: 1366px)', matchTablet)
+    .register('screen and (min-width: 1367px)', matchDesktop)
+}
diff --git a/ui/src/utils/domUtil.js b/ui/src/utils/domUtil.js
new file mode 100644
index 0000000..898bc59
--- /dev/null
+++ b/ui/src/utils/domUtil.js
@@ -0,0 +1,34 @@
+// 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.
+
+export const setDocumentTitle = function (title) {
+  document.title = title
+  const ua = navigator.userAgent
+  // eslint-disable-next-line
+  const regex = /\bMicroMessenger\/([\d\.]+)/
+  if (regex.test(ua) && /ip(hone|od|ad)/i.test(ua)) {
+    const i = document.createElement('iframe')
+    i.src = '/favicon.ico'
+    i.style.display = 'none'
+    i.onload = function () {
+      setTimeout(function () {
+        i.remove()
+      }, 9)
+    }
+    document.body.appendChild(i)
+  }
+}
diff --git a/ui/src/utils/filter.js b/ui/src/utils/filter.js
new file mode 100644
index 0000000..e91340a
--- /dev/null
+++ b/ui/src/utils/filter.js
@@ -0,0 +1,37 @@
+// 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 Vue from 'vue'
+import moment from 'moment'
+import 'moment/locale/en-gb'
+moment.locale('en-gb')
+
+Vue.filter('NumberFormat', function (value) {
+  if (!value) {
+    return '0'
+  }
+  const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
+  return intPartFormat
+})
+
+Vue.filter('dayjs', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') {
+  return moment(dataStr).format(pattern)
+})
+
+Vue.filter('moment', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') {
+  return moment(dataStr).format(pattern)
+})
diff --git a/ui/src/utils/helper/permission.js b/ui/src/utils/helper/permission.js
new file mode 100644
index 0000000..f892552
--- /dev/null
+++ b/ui/src/utils/helper/permission.js
@@ -0,0 +1,59 @@
+// 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.
+
+const PERMISSION_ENUM = {
+}
+
+function plugin (Vue) {
+  if (plugin.installed) {
+    return
+  }
+
+  !Vue.prototype.$auth && Object.defineProperties(Vue.prototype, {
+    $auth: {
+      get () {
+        const _this = this
+        return (permissions) => {
+          const [permission, action] = permissions.split('.')
+          const permissionList = _this.$store.getters.roles.permissions
+          return permissionList.find((val) => {
+            return val.permissionId === permission
+          }).actionList.findIndex((val) => {
+            return val === action
+          }) > -1
+        }
+      }
+    }
+  })
+
+  !Vue.prototype.$enum && Object.defineProperties(Vue.prototype, {
+    $enum: {
+      get () {
+        // const _this = this;
+        return (val) => {
+          let result = PERMISSION_ENUM
+          val && val.split('.').forEach(v => {
+            result = result && result[v] || null
+          })
+          return result
+        }
+      }
+    }
+  })
+}
+
+export default plugin
diff --git a/ui/src/utils/icons.js b/ui/src/utils/icons.js
new file mode 100644
index 0000000..cc1f725
--- /dev/null
+++ b/ui/src/utils/icons.js
@@ -0,0 +1,38 @@
+// 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 _ from 'lodash'
+
+const osMapping = {
+  ubuntu: 'ubuntu',
+  debian: 'debian',
+  redhat: 'redhat',
+  centos: 'centos',
+  fedora: 'fedora',
+  suse: 'suse',
+  linux: 'linux',
+  bsd: 'freebsd',
+  apple: 'apple',
+  dos: 'windows',
+  windows: 'windows',
+  oracle: 'java'
+}
+
+export const getNormalizedOsName = (osName) => {
+  osName = osName.toLowerCase()
+  return _.find(osMapping, (value, key) => osName.includes(key)) || 'linux'
+}
diff --git a/ui/src/utils/mixin.js b/ui/src/utils/mixin.js
new file mode 100644
index 0000000..88a579c
--- /dev/null
+++ b/ui/src/utils/mixin.js
@@ -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.
+
+// import Vue from 'vue'
+import { deviceEnquire, DEVICE_TYPE } from '@/utils/device'
+import { mapState } from 'vuex'
+
+// const mixinsComputed = Vue.config.optionMergeStrategies.computed
+// const mixinsMethods = Vue.config.optionMergeStrategies.methods
+
+const mixin = {
+  computed: {
+    ...mapState({
+      layoutMode: state => state.app.layout,
+      navTheme: state => state.app.theme,
+      primaryColor: state => state.app.color,
+      invertedMode: state => state.app.inverted,
+      fixedHeader: state => state.app.fixedHeader,
+      fixSiderbar: state => state.app.fixSiderbar,
+      fixSidebar: state => state.app.fixSiderbar,
+      contentWidth: state => state.app.contentWidth,
+      autoHideHeader: state => state.app.autoHideHeader,
+      sidebarOpened: state => state.app.sidebar,
+      multiTab: state => state.app.multiTab
+    })
+  },
+  methods: {
+    isTopMenu () {
+      return this.layoutMode === 'topmenu'
+    },
+    isSideMenu () {
+      return !this.isTopMenu()
+    }
+  }
+}
+
+const mixinDevice = {
+  computed: {
+    ...mapState({
+      device: state => state.app.device
+    })
+  },
+  methods: {
+    isMobile () {
+      return this.device === DEVICE_TYPE.MOBILE
+    },
+    isDesktop () {
+      return this.device === DEVICE_TYPE.DESKTOP
+    },
+    isTablet () {
+      return this.device === DEVICE_TYPE.TABLET
+    }
+  }
+}
+
+const AppDeviceEnquire = {
+  mounted () {
+    const { $store } = this
+    deviceEnquire(deviceType => {
+      switch (deviceType) {
+        case DEVICE_TYPE.DESKTOP:
+          $store.commit('TOGGLE_DEVICE', 'desktop')
+          $store.dispatch('setSidebar', true)
+          break
+        case DEVICE_TYPE.TABLET:
+          $store.commit('TOGGLE_DEVICE', 'tablet')
+          $store.dispatch('setSidebar', false)
+          break
+        case DEVICE_TYPE.MOBILE:
+        default:
+          $store.commit('TOGGLE_DEVICE', 'mobile')
+          $store.dispatch('setSidebar', true)
+          break
+      }
+    })
+  }
+}
+
+export { mixin, AppDeviceEnquire, mixinDevice }
diff --git a/ui/src/utils/permissions.js b/ui/src/utils/permissions.js
new file mode 100644
index 0000000..0e65eb7
--- /dev/null
+++ b/ui/src/utils/permissions.js
@@ -0,0 +1,25 @@
+// 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.
+
+export function actionToObject (json) {
+  try {
+    return JSON.parse(json)
+  } catch (e) {
+    console.log('err', e.message)
+  }
+  return []
+}
diff --git a/ui/src/utils/plugins.js b/ui/src/utils/plugins.js
new file mode 100644
index 0000000..d32217f
--- /dev/null
+++ b/ui/src/utils/plugins.js
@@ -0,0 +1,169 @@
+// 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 _ from 'lodash'
+import { i18n } from '@/locales'
+import { api } from '@/api'
+import { message, notification } from 'ant-design-vue'
+import eventBus from '@/config/eventBus'
+
+export const pollJobPlugin = {
+  install (Vue) {
+    Vue.prototype.$pollJob = function (options) {
+      /**
+       * @param {String} jobId
+       * @param {String} [name='']
+       * @param {String} [successMessage=Success]
+       * @param {Function} [successMethod=() => {}]
+       * @param {String} [errorMessage=Error]
+       * @param {Function} [errorMethod=() => {}]
+       * @param {Object} [showLoading=true]
+       * @param {String} [loadingMessage=Loading...]
+       * @param {String} [catchMessage=Error caught]
+       * @param {Function} [catchMethod=() => {}]
+       * @param {Object} [action=null]
+       */
+      const {
+        jobId,
+        name = '',
+        successMessage = i18n.t('label.success'),
+        successMethod = () => {},
+        errorMessage = i18n.t('label.error'),
+        errorMethod = () => {},
+        loadingMessage = `${i18n.t('label.loading')}...`,
+        showLoading = true,
+        catchMessage = i18n.t('label.error.caught'),
+        catchMethod = () => {},
+        action = null
+      } = options
+
+      api('queryAsyncJobResult', { jobId }).then(json => {
+        const result = json.queryasyncjobresultresponse
+        if (result.jobstatus === 1) {
+          var content = successMessage
+          if (successMessage === 'Success' && action && action.label) {
+            content = i18n.t(action.label)
+          }
+          if (name) {
+            content = content + ' - ' + name
+          }
+          message.success({
+            content: content,
+            key: jobId,
+            duration: 2
+          })
+          eventBus.$emit('async-job-complete', action)
+          successMethod(result)
+        } else if (result.jobstatus === 2) {
+          message.error({
+            content: errorMessage,
+            key: jobId,
+            duration: 1
+          })
+          var title = errorMessage
+          if (action && action.label) {
+            title = i18n.t(action.label)
+          }
+          var desc = result.jobresult.errortext
+          if (name) {
+            desc = `(${name}) ${desc}`
+          }
+          notification.error({
+            message: title,
+            description: desc,
+            key: jobId,
+            duration: 0
+          })
+          eventBus.$emit('async-job-complete', action)
+          errorMethod(result)
+        } else if (result.jobstatus === 0) {
+          if (showLoading) {
+            message.loading({
+              content: loadingMessage,
+              key: jobId,
+              duration: 0
+            })
+          }
+          setTimeout(() => {
+            this.$pollJob(options, action)
+          }, 3000)
+        }
+      }).catch(e => {
+        console.error(`${catchMessage} - ${e}`)
+        notification.error({
+          message: i18n.t('label.error'),
+          description: catchMessage,
+          duration: 0
+        })
+        catchMethod && catchMethod()
+      })
+    }
+  }
+
+}
+
+export const notifierPlugin = {
+  install (Vue) {
+    Vue.prototype.$notifyError = function (error) {
+      console.log(error)
+      var msg = i18n.t('message.request.failed')
+      var desc = ''
+      if (error && error.response) {
+        if (error.response.status) {
+          msg = `${i18n.t('message.request.failed')} (${error.response.status})`
+        }
+        if (error.message) {
+          desc = error.message
+        }
+        if (error.response.headers && 'x-description' in error.response.headers) {
+          desc = error.response.headers['x-description']
+        }
+        if (desc === '' && error.response.data) {
+          const responseKey = _.findKey(error.response.data, 'errortext')
+          if (responseKey) {
+            desc = error.response.data[responseKey].errortext
+          }
+        }
+      }
+      notification.error({
+        message: msg,
+        description: desc,
+        duration: 0
+      })
+    }
+  }
+}
+
+export const toLocaleDatePlugin = {
+  install (Vue) {
+    Vue.prototype.$toLocaleDate = function (date) {
+      var timezoneOffset = this.$store.getters.timezoneoffset
+      if (this.$store.getters.usebrowsertimezone) {
+        // Since GMT+530 is returned as -330 (mins to GMT)
+        timezoneOffset = new Date().getTimezoneOffset() / -60
+      }
+      var milliseconds = Date.parse(date)
+      // e.g. "Tue, 08 Jun 2010 19:13:49 GMT", "Tue, 25 May 2010 12:07:01 UTC"
+      var dateWithOffset = new Date(milliseconds + (timezoneOffset * 60 * 60 * 1000)).toUTCString()
+      // e.g. "08 Jun 2010 19:13:49 GMT", "25 May 2010 12:07:01 UTC"
+      dateWithOffset = dateWithOffset.substring(dateWithOffset.indexOf(', ') + 2)
+      // e.g. "08 Jun 2010 19:13:49", "25 May 2010 12:10:16"
+      dateWithOffset = dateWithOffset.substring(0, dateWithOffset.length - 4)
+      return dateWithOffset
+    }
+  }
+}
diff --git a/ui/src/utils/request.js b/ui/src/utils/request.js
new file mode 100644
index 0000000..116a171
--- /dev/null
+++ b/ui/src/utils/request.js
@@ -0,0 +1,113 @@
+// 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 Vue from 'vue'
+import axios from 'axios'
+import router from '@/router'
+import { VueAxios } from './axios'
+import notification from 'ant-design-vue/es/notification'
+import { CURRENT_PROJECT } from '@/store/mutation-types'
+import { i18n } from '@/locales'
+import store from '@/store'
+
+const service = axios.create({
+  timeout: 600000
+})
+
+const err = (error) => {
+  const response = error.response
+  if (response) {
+    console.log(response)
+    if (response.status === 403) {
+      const data = response.data
+      notification.error({ message: i18n.t('label.forbidden'), description: data.message })
+    }
+    if (response.status === 401) {
+      if (response.config && response.config.params && ['listIdps', 'cloudianIsEnabled'].includes(response.config.params.command)) {
+        return
+      }
+      for (const key in response.data) {
+        if (key.includes('response')) {
+          if (response.data[key].errortext.includes('not available for user')) {
+            notification.error({
+              message: 'Error',
+              description: response.data[key].errortext + ' ' + i18n.t('error.unable.to.proceed'),
+              duration: 0
+            })
+            return
+          }
+        }
+      }
+      notification.error({
+        message: i18n.t('label.unauthorized'),
+        description: i18n.t('message.authorization.failed'),
+        key: 'http-401',
+        duration: 0
+      })
+      store.dispatch('Logout').then(() => {
+        if (router.history.current.path !== '/user/login') {
+          router.push({ path: '/user/login', query: { redirect: router.history.current.fullPath } })
+        }
+      })
+    }
+    if (response.status === 404) {
+      notification.error({ message: i18n.t('label.not.found'), description: i18n.t('message.resource.not.found') })
+      router.push({ path: '/exception/404' })
+    }
+  }
+  if (error.isAxiosError && !error.response) {
+    notification.warn({
+      message: error.message || i18n.t('message.network.error'),
+      description: i18n.t('message.network.error.description'),
+      key: 'network-error'
+    })
+  }
+  return Promise.reject(error)
+}
+
+// request interceptor
+service.interceptors.request.use(config => {
+  if (config && config.params) {
+    config.params.response = 'json'
+    const project = Vue.ls.get(CURRENT_PROJECT)
+    if (!config.params.projectid && project && project.id) {
+      if (config.params.command === 'listTags') {
+        config.params.projectid = '-1'
+      } else {
+        config.params.projectid = project.id
+      }
+    }
+  }
+  return config
+}, err)
+
+// response interceptor
+service.interceptors.response.use((response) => {
+  return response.data
+}, err)
+
+const installer = {
+  vm: {},
+  install (Vue) {
+    Vue.use(VueAxios, service)
+  }
+}
+
+export {
+  installer as VueAxios,
+  service as axios
+}
diff --git a/ui/src/utils/sort.js b/ui/src/utils/sort.js
new file mode 100644
index 0000000..4934c88
--- /dev/null
+++ b/ui/src/utils/sort.js
@@ -0,0 +1,102 @@
+// 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 filterNumber (value) {
+  if (/^[-+]?\d*\.?\d*$/.test(value)) {
+    return Number(value)
+  }
+  return NaN
+}
+
+function stringComparator (a, b) {
+  return a.localeCompare(b)
+}
+
+function numericComparator (a, b) {
+  return filterNumber(a) < filterNumber(b) ? 1 : -1
+}
+
+function ipV4AddressCIDRComparator (a, b) {
+  a = a.split(/[./]/gm)
+  b = b.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
+}
+
+function ipV6AddressCIDRComparator (a, b) {
+  a = a.split(/[:/]/gm)
+  b = b.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
+}
+
+function isIpV4Address (obj) {
+  return !Array.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)
+}
+
+function isIpV6Address (obj) {
+  return !Array.isArray(obj) && (/^[a-fA-F0-9:]+$/gm).test(obj)
+}
+
+function isIpV4CIDRAddress (obj) {
+  return !Array.isArray(obj) && (/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/gm).test(obj)
+}
+
+function isIpV6CIDRAddress (obj) {
+  return !Array.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)
+}
+
+function isNumeric (obj) {
+  return !Array.isArray(obj) && !isNaN(filterNumber(obj))
+}
+
+/**
+ * Compare elements, attempting to determine type of element to get the best comparison
+ *
+ */
+export function genericCompare (a, b) {
+  // strict function for filtering numbers (e.g. "2.3", "-2" but not "8 CPUs")
+  var comparator = stringComparator
+
+  if (a === b) {
+    // Short circuit out to avoid unnecessary effort
+    return 0
+  }
+  if ((isIpV4CIDRAddress(a) || isIpV4Address(a)) && (isIpV4CIDRAddress(b) || isIpV4Address(b))) {
+    comparator = ipV4AddressCIDRComparator
+  }
+  if ((isIpV6CIDRAddress(a) || isIpV6Address(a)) && (isIpV6CIDRAddress(b) || isIpV6Address(b))) {
+    comparator = ipV6AddressCIDRComparator
+  }
+  if (isNumeric(a) && isNumeric(b)) {
+    comparator = numericComparator
+  }
+
+  return comparator(a, b)
+}
diff --git a/ui/src/utils/storage.js b/ui/src/utils/storage.js
new file mode 100644
index 0000000..1a58b69
--- /dev/null
+++ b/ui/src/utils/storage.js
@@ -0,0 +1,94 @@
+// 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.
+
+/**
+ * Set storage
+ *
+ * @param name
+ * @param content
+ * @param maxAge
+ */
+export const setStore = (name, content, maxAge = null) => {
+  if (!global.window || !name) {
+    return
+  }
+
+  if (typeof content !== 'string') {
+    content = JSON.stringify(content)
+  }
+
+  const storage = global.window.localStorage
+
+  storage.setItem(name, content)
+  if (maxAge && !isNaN(parseInt(maxAge))) {
+    const timeout = parseInt(new Date().getTime() / 1000)
+    storage.setItem(`${name}_expire`, timeout + maxAge)
+  }
+}
+
+/**
+ * Get storage
+ *
+ * @param name
+ * @returns {*}
+ */
+export const getStore = name => {
+  if (!global.window || !name) {
+    return
+  }
+
+  const content = window.localStorage.getItem(name)
+  const _expire = window.localStorage.getItem(`${name}_expire`)
+
+  if (_expire) {
+    const now = parseInt(new Date().getTime() / 1000)
+    if (now > _expire) {
+      return
+    }
+  }
+
+  try {
+    return JSON.parse(content)
+  } catch (e) {
+    return content
+  }
+}
+
+/**
+ * Clear storage
+ *
+ * @param name
+ */
+export const clearStore = name => {
+  if (!global.window || !name) {
+    return
+  }
+
+  window.localStorage.removeItem(name)
+  window.localStorage.removeItem(`${name}_expire`)
+}
+
+/**
+ * Clear all storage
+ */
+export const clearAll = () => {
+  if (!global.window || !name) {
+    return
+  }
+
+  window.localStorage.clear()
+}
diff --git a/ui/src/utils/timezone/index.js b/ui/src/utils/timezone/index.js
new file mode 100644
index 0000000..36a1ea2
--- /dev/null
+++ b/ui/src/utils/timezone/index.js
@@ -0,0 +1,80 @@
+// 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 loadTimeZone () {
+  const timeZoneJson = require.context('./', true, /[A-Za-z0-9-_,\s]+\.json$/i)
+  const data = []
+
+  timeZoneJson.keys().forEach(key => {
+    const matched = key.match(/([A-Za-z0-9-_]+)\./i)
+    if (matched && matched.length > 1) {
+      const json = timeZoneJson(key)
+      for (const index in json) {
+        data.push({
+          id: index,
+          name: json[index]
+        })
+      }
+    }
+  })
+
+  return data
+}
+
+function getFullTimeZone (strQuery) {
+  if (!strQuery || strQuery === '') {
+    return []
+  }
+
+  const timeZoneJson = require.context('./', true, /[A-Za-z0-9-_,\s]+\.json$/i)
+  const data = []
+  timeZoneJson.keys().forEach(key => {
+    const matched = key.match(/([A-Za-z0-9-_]+)\./i)
+    if (matched && matched.length > 1) {
+      const json = timeZoneJson(key)
+      for (const index in json) {
+        if (index.toLowerCase() === strQuery.toLowerCase()) {
+          data.push({
+            id: index,
+            name: json[index]
+          })
+
+          break
+        }
+      }
+    }
+  })
+
+  return data
+}
+
+export function timeZone () {
+  return new Promise(resolve => {
+    const dataTimeZone = loadTimeZone()
+    resolve(dataTimeZone)
+  })
+}
+
+export function timeZoneName (key) {
+  const dataTimeZone = getFullTimeZone(key)
+
+  if (dataTimeZone && dataTimeZone[0]) {
+    return dataTimeZone[0].name
+  }
+
+  return ''
+}
diff --git a/ui/src/utils/timezone/timezone.json b/ui/src/utils/timezone/timezone.json
new file mode 100644
index 0000000..f7a4e6f
--- /dev/null
+++ b/ui/src/utils/timezone/timezone.json
@@ -0,0 +1,620 @@
+{
+  "ACT": "ACT [Central Standard Time (Northern Territory)]",
+  "AET": "AET [Eastern Standard Time (New South Wales)]",
+  "AGT": "AGT [Argentine Time]",
+  "ART": "ART [Eastern European Time]",
+  "AST": "AST [Alaska Standard Time]",
+  "Africa/Abidjan": "Africa/Abidjan [Greenwich Mean Time]",
+  "Africa/Accra": "Africa/Accra [Ghana Mean Time]",
+  "Africa/Addis_Ababa": "Africa/Addis_Ababa [Eastern African Time]",
+  "Africa/Algiers": "Africa/Algiers [Central European Time]",
+  "Africa/Asmara": "Africa/Asmara [Eastern African Time]",
+  "Africa/Asmera": "Africa/Asmera [Eastern African Time]",
+  "Africa/Bamako": "Africa/Bamako [Greenwich Mean Time]",
+  "Africa/Bangui": "Africa/Bangui [Western African Time]",
+  "Africa/Banjul": "Africa/Banjul [Greenwich Mean Time]",
+  "Africa/Bissau": "Africa/Bissau [Greenwich Mean Time]",
+  "Africa/Blantyre": "Africa/Blantyre [Central African Time]",
+  "Africa/Brazzaville": "Africa/Brazzaville [Western African Time]",
+  "Africa/Bujumbura": "Africa/Bujumbura [Central African Time]",
+  "Africa/Cairo": "Africa/Cairo [Eastern European Time]",
+  "Africa/Casablanca": "Africa/Casablanca [Western European Time]",
+  "Africa/Ceuta": "Africa/Ceuta [Central European Time]",
+  "Africa/Conakry": "Africa/Conakry [Greenwich Mean Time]",
+  "Africa/Dakar": "Africa/Dakar [Greenwich Mean Time]",
+  "Africa/Dar_es_Salaam": "Africa/Dar_es_Salaam [Eastern African Time]",
+  "Africa/Djibouti": "Africa/Djibouti [Eastern African Time]",
+  "Africa/Douala": "Africa/Douala [Western African Time]",
+  "Africa/El_Aaiun": "Africa/El_Aaiun [Western European Time]",
+  "Africa/Freetown": "Africa/Freetown [Greenwich Mean Time]",
+  "Africa/Gaborone": "Africa/Gaborone [Central African Time]",
+  "Africa/Harare": "Africa/Harare [Central African Time]",
+  "Africa/Johannesburg": "Africa/Johannesburg [South Africa Standard Time]",
+  "Africa/Juba": "Africa/Juba [GMT+03:00]",
+  "Africa/Kampala": "Africa/Kampala [Eastern African Time]",
+  "Africa/Khartoum": "Africa/Khartoum [Eastern African Time]",
+  "Africa/Kigali": "Africa/Kigali [Central African Time]",
+  "Africa/Kinshasa": "Africa/Kinshasa [Western African Time]",
+  "Africa/Lagos": "Africa/Lagos [Western African Time]",
+  "Africa/Libreville": "Africa/Libreville [Western African Time]",
+  "Africa/Lome": "Africa/Lome [Greenwich Mean Time]",
+  "Africa/Luanda": "Africa/Luanda [Western African Time]",
+  "Africa/Lubumbashi": "Africa/Lubumbashi [Central African Time]",
+  "Africa/Lusaka": "Africa/Lusaka [Central African Time]",
+  "Africa/Malabo": "Africa/Malabo [Western African Time]",
+  "Africa/Maputo": "Africa/Maputo [Central African Time]",
+  "Africa/Maseru": "Africa/Maseru [South Africa Standard Time]",
+  "Africa/Mbabane": "Africa/Mbabane [South Africa Standard Time]",
+  "Africa/Mogadishu": "Africa/Mogadishu [Eastern African Time]",
+  "Africa/Monrovia": "Africa/Monrovia [Greenwich Mean Time]",
+  "Africa/Nairobi": "Africa/Nairobi [Eastern African Time]",
+  "Africa/Ndjamena": "Africa/Ndjamena [Western African Time]",
+  "Africa/Niamey": "Africa/Niamey [Western African Time]",
+  "Africa/Nouakchott": "Africa/Nouakchott [Greenwich Mean Time]",
+  "Africa/Ouagadougou": "Africa/Ouagadougou [Greenwich Mean Time]",
+  "Africa/Porto-Novo": "Africa/Porto-Novo [Western African Time]",
+  "Africa/Sao_Tome": "Africa/Sao_Tome [Greenwich Mean Time]",
+  "Africa/Timbuktu": "Africa/Timbuktu [Greenwich Mean Time]",
+  "Africa/Tripoli": "Africa/Tripoli [Eastern European Time]",
+  "Africa/Tunis": "Africa/Tunis [Central European Time]",
+  "Africa/Windhoek": "Africa/Windhoek [Western African Time]",
+  "America/Adak": "America/Adak [Hawaii-Aleutian Standard Time]",
+  "America/Anchorage": "America/Anchorage [Alaska Standard Time]",
+  "America/Anguilla": "America/Anguilla [Atlantic Standard Time]",
+  "America/Antigua": "America/Antigua [Atlantic Standard Time]",
+  "America/Araguaina": "America/Araguaina [Brasilia Time]",
+  "America/Argentina/Buenos_Aires": "America/Argentina/Buenos_Aires [Argentine Time]",
+  "America/Argentina/Catamarca": "America/Argentina/Catamarca [Argentine Time]",
+  "America/Argentina/ComodRivadavia": "America/Argentina/ComodRivadavia [Argentine Time]",
+  "America/Argentina/Cordoba": "America/Argentina/Cordoba [Argentine Time]",
+  "America/Argentina/Jujuy": "America/Argentina/Jujuy [Argentine Time]",
+  "America/Argentina/La_Rioja": "America/Argentina/La_Rioja [Argentine Time]",
+  "America/Argentina/Mendoza": "America/Argentina/Mendoza [Argentine Time]",
+  "America/Argentina/Rio_Gallegos": "America/Argentina/Rio_Gallegos [Argentine Time]",
+  "America/Argentina/Salta": "America/Argentina/Salta [Argentine Time]",
+  "America/Argentina/San_Juan": "America/Argentina/San_Juan [Argentine Time]",
+  "America/Argentina/San_Luis": "America/Argentina/San_Luis [Western Argentine Time]",
+  "America/Argentina/Tucuman": "America/Argentina/Tucuman [Argentine Time]",
+  "America/Argentina/Ushuaia": "America/Argentina/Ushuaia [Argentine Time]",
+  "America/Aruba": "America/Aruba [Atlantic Standard Time]",
+  "America/Asuncion": "America/Asuncion [Paraguay Time]",
+  "America/Atikokan": "America/Atikokan [Eastern Standard Time]",
+  "America/Atka": "America/Atka [Hawaii-Aleutian Standard Time]",
+  "America/Bahia": "America/Bahia [Brasilia Time]",
+  "America/Bahia_Banderas": "America/Bahia_Banderas [GMT-06:00]",
+  "America/Barbados": "America/Barbados [Atlantic Standard Time]",
+  "America/Belem": "America/Belem [Brasilia Time]",
+  "America/Belize": "America/Belize [Central Standard Time]",
+  "America/Blanc-Sablon": "America/Blanc-Sablon [Atlantic Standard Time]",
+  "America/Boa_Vista": "America/Boa_Vista [Amazon Time]",
+  "America/Bogota": "America/Bogota [Colombia Time]",
+  "America/Boise": "America/Boise [Mountain Standard Time]",
+  "America/Buenos_Aires": "America/Buenos_Aires [Argentine Time]",
+  "America/Cambridge_Bay": "America/Cambridge_Bay [Mountain Standard Time]",
+  "America/Campo_Grande": "America/Campo_Grande [Amazon Time]",
+  "America/Cancun": "America/Cancun [Central Standard Time]",
+  "America/Caracas": "America/Caracas [Venezuela Time]",
+  "America/Catamarca": "America/Catamarca [Argentine Time]",
+  "America/Cayenne": "America/Cayenne [French Guiana Time]",
+  "America/Cayman": "America/Cayman [Eastern Standard Time]",
+  "America/Chicago": "America/Chicago [Central Standard Time]",
+  "America/Chihuahua": "America/Chihuahua [Mountain Standard Time]",
+  "America/Coral_Harbour": "America/Coral_Harbour [Eastern Standard Time]",
+  "America/Cordoba": "America/Cordoba [Argentine Time]",
+  "America/Costa_Rica": "America/Costa_Rica [Central Standard Time]",
+  "America/Creston": "America/Creston [GMT-07:00]",
+  "America/Cuiaba": "America/Cuiaba [Amazon Time]",
+  "America/Curacao": "America/Curacao [Atlantic Standard Time]",
+  "America/Danmarkshavn": "America/Danmarkshavn [Greenwich Mean Time]",
+  "America/Dawson": "America/Dawson [Pacific Standard Time]",
+  "America/Dawson_Creek": "America/Dawson_Creek [Mountain Standard Time]",
+  "America/Denver": "America/Denver [Mountain Standard Time]",
+  "America/Detroit": "America/Detroit [Eastern Standard Time]",
+  "America/Dominica": "America/Dominica [Atlantic Standard Time]",
+  "America/Edmonton": "America/Edmonton [Mountain Standard Time]",
+  "America/Eirunepe": "America/Eirunepe [Amazon Time]",
+  "America/El_Salvador": "America/El_Salvador [Central Standard Time]",
+  "America/Ensenada": "America/Ensenada [Pacific Standard Time]",
+  "America/Fort_Wayne": "America/Fort_Wayne [Eastern Standard Time]",
+  "America/Fortaleza": "America/Fortaleza [Brasilia Time]",
+  "America/Glace_Bay": "America/Glace_Bay [Atlantic Standard Time]",
+  "America/Godthab": "America/Godthab [Western Greenland Time]",
+  "America/Goose_Bay": "America/Goose_Bay [Atlantic Standard Time]",
+  "America/Grand_Turk": "America/Grand_Turk [Eastern Standard Time]",
+  "America/Grenada": "America/Grenada [Atlantic Standard Time]",
+  "America/Guadeloupe": "America/Guadeloupe [Atlantic Standard Time]",
+  "America/Guatemala": "America/Guatemala [Central Standard Time]",
+  "America/Guayaquil": "America/Guayaquil [Ecuador Time]",
+  "America/Guyana": "America/Guyana [Guyana Time]",
+  "America/Halifax": "America/Halifax [Atlantic Standard Time]",
+  "America/Havana": "America/Havana [Cuba Standard Time]",
+  "America/Hermosillo": "America/Hermosillo [Mountain Standard Time]",
+  "America/Indiana/Indianapolis": "America/Indiana/Indianapolis [Eastern Standard Time]",
+  "America/Indiana/Knox": "America/Indiana/Knox [Central Standard Time]",
+  "America/Indiana/Marengo": "America/Indiana/Marengo [Eastern Standard Time]",
+  "America/Indiana/Petersburg": "America/Indiana/Petersburg [Eastern Standard Time]",
+  "America/Indiana/Tell_City": "America/Indiana/Tell_City [Central Standard Time]",
+  "America/Indiana/Vevay": "America/Indiana/Vevay [Eastern Standard Time]",
+  "America/Indiana/Vincennes": "America/Indiana/Vincennes [Eastern Standard Time]",
+  "America/Indiana/Winamac": "America/Indiana/Winamac [Eastern Standard Time]",
+  "America/Indianapolis": "America/Indianapolis [Eastern Standard Time]",
+  "America/Inuvik": "America/Inuvik [Mountain Standard Time]",
+  "America/Iqaluit": "America/Iqaluit [Eastern Standard Time]",
+  "America/Jamaica": "America/Jamaica [Eastern Standard Time]",
+  "America/Jujuy": "America/Jujuy [Argentine Time]",
+  "America/Juneau": "America/Juneau [Alaska Standard Time]",
+  "America/Kentucky/Louisville": "America/Kentucky/Louisville [Eastern Standard Time]",
+  "America/Kentucky/Monticello": "America/Kentucky/Monticello [Eastern Standard Time]",
+  "America/Knox_IN": "America/Knox_IN [Central Standard Time]",
+  "America/Kralendijk": "America/Kralendijk [GMT-04:00]",
+  "America/La_Paz": "America/La_Paz [Bolivia Time]",
+  "America/Lima": "America/Lima [Peru Time]",
+  "America/Los_Angeles": "America/Los_Angeles [Pacific Standard Time]",
+  "America/Louisville": "America/Louisville [Eastern Standard Time]",
+  "America/Lower_Princes": "America/Lower_Princes [GMT-04:00]",
+  "America/Maceio": "America/Maceio [Brasilia Time]",
+  "America/Managua": "America/Managua [Central Standard Time]",
+  "America/Manaus": "America/Manaus [Amazon Time]",
+  "America/Marigot": "America/Marigot [Atlantic Standard Time]",
+  "America/Martinique": "America/Martinique [Atlantic Standard Time]",
+  "America/Matamoros": "America/Matamoros [Central Standard Time]",
+  "America/Mazatlan": "America/Mazatlan [Mountain Standard Time]",
+  "America/Mendoza": "America/Mendoza [Argentine Time]",
+  "America/Menominee": "America/Menominee [Central Standard Time]",
+  "America/Merida": "America/Merida [Central Standard Time]",
+  "America/Metlakatla": "America/Metlakatla [GMT-08:00]",
+  "America/Mexico_City": "America/Mexico_City [Central Standard Time]",
+  "America/Miquelon": "America/Miquelon [Pierre & Miquelon Standard Time]",
+  "America/Moncton": "America/Moncton [Atlantic Standard Time]",
+  "America/Monterrey": "America/Monterrey [Central Standard Time]",
+  "America/Montevideo": "America/Montevideo [Uruguay Time]",
+  "America/Montreal": "America/Montreal [Eastern Standard Time]",
+  "America/Montserrat": "America/Montserrat [Atlantic Standard Time]",
+  "America/Nassau": "America/Nassau [Eastern Standard Time]",
+  "America/New_York": "America/New_York [Eastern Standard Time]",
+  "America/Nipigon": "America/Nipigon [Eastern Standard Time]",
+  "America/Nome": "America/Nome [Alaska Standard Time]",
+  "America/Noronha": "America/Noronha [Fernando de Noronha Time]",
+  "America/North_Dakota/Beulah": "America/North_Dakota/Beulah [GMT-06:00]",
+  "America/North_Dakota/Center": "America/North_Dakota/Center [Central Standard Time]",
+  "America/North_Dakota/New_Salem": "America/North_Dakota/New_Salem [Central Standard Time]",
+  "America/Ojinaga": "America/Ojinaga [Mountain Standard Time]",
+  "America/Panama": "America/Panama [Eastern Standard Time]",
+  "America/Pangnirtung": "America/Pangnirtung [Eastern Standard Time]",
+  "America/Paramaribo": "America/Paramaribo [Suriname Time]",
+  "America/Phoenix": "America/Phoenix [Mountain Standard Time]",
+  "America/Port-au-Prince": "America/Port-au-Prince [Eastern Standard Time]",
+  "America/Port_of_Spain": "America/Port_of_Spain [Atlantic Standard Time]",
+  "America/Porto_Acre": "America/Porto_Acre [Amazon Time]",
+  "America/Porto_Velho": "America/Porto_Velho [Amazon Time]",
+  "America/Puerto_Rico": "America/Puerto_Rico [Atlantic Standard Time]",
+  "America/Rainy_River": "America/Rainy_River [Central Standard Time]",
+  "America/Rankin_Inlet": "America/Rankin_Inlet [Central Standard Time]",
+  "America/Recife": "America/Recife [Brasilia Time]",
+  "America/Regina": "America/Regina [Central Standard Time]",
+  "America/Resolute": "America/Resolute [Eastern Standard Time]",
+  "America/Rio_Branco": "America/Rio_Branco [Amazon Time]",
+  "America/Rosario": "America/Rosario [Argentine Time]",
+  "America/Santa_Isabel": "America/Santa_Isabel [Pacific Standard Time]",
+  "America/Santarem": "America/Santarem [Brasilia Time]",
+  "America/Santiago": "America/Santiago [Chile Time]",
+  "America/Santo_Domingo": "America/Santo_Domingo [Atlantic Standard Time]",
+  "America/Sao_Paulo": "America/Sao_Paulo [Brasilia Time]",
+  "America/Scoresbysund": "America/Scoresbysund [Eastern Greenland Time]",
+  "America/Shiprock": "America/Shiprock [Mountain Standard Time]",
+  "America/Sitka": "America/Sitka [GMT-09:00]",
+  "America/St_Barthelemy": "America/St_Barthelemy [Atlantic Standard Time]",
+  "America/St_Johns": "America/St_Johns [Newfoundland Standard Time]",
+  "America/St_Kitts": "America/St_Kitts [Atlantic Standard Time]",
+  "America/St_Lucia": "America/St_Lucia [Atlantic Standard Time]",
+  "America/St_Thomas": "America/St_Thomas [Atlantic Standard Time]",
+  "America/St_Vincent": "America/St_Vincent [Atlantic Standard Time]",
+  "America/Swift_Current": "America/Swift_Current [Central Standard Time]",
+  "America/Tegucigalpa": "America/Tegucigalpa [Central Standard Time]",
+  "America/Thule": "America/Thule [Atlantic Standard Time]",
+  "America/Thunder_Bay": "America/Thunder_Bay [Eastern Standard Time]",
+  "America/Tijuana": "America/Tijuana [Pacific Standard Time]",
+  "America/Toronto": "America/Toronto [Eastern Standard Time]",
+  "America/Tortola": "America/Tortola [Atlantic Standard Time]",
+  "America/Vancouver": "America/Vancouver [Pacific Standard Time]",
+  "America/Virgin": "America/Virgin [Atlantic Standard Time]",
+  "America/Whitehorse": "America/Whitehorse [Pacific Standard Time]",
+  "America/Winnipeg": "America/Winnipeg [Central Standard Time]",
+  "America/Yakutat": "America/Yakutat [Alaska Standard Time]",
+  "America/Yellowknife": "America/Yellowknife [Mountain Standard Time]",
+  "Antarctica/Casey": "Antarctica/Casey [Western Standard Time (Australia)]",
+  "Antarctica/Davis": "Antarctica/Davis [Davis Time]",
+  "Antarctica/DumontDUrville": "Antarctica/DumontDUrville [Dumont-d'Urville Time]",
+  "Antarctica/Macquarie": "Antarctica/Macquarie [Macquarie Island Time]",
+  "Antarctica/Mawson": "Antarctica/Mawson [Mawson Time]",
+  "Antarctica/McMurdo": "Antarctica/McMurdo [New Zealand Standard Time]",
+  "Antarctica/Palmer": "Antarctica/Palmer [Chile Time]",
+  "Antarctica/Rothera": "Antarctica/Rothera [Rothera Time]",
+  "Antarctica/South_Pole": "Antarctica/South_Pole [New Zealand Standard Time]",
+  "Antarctica/Syowa": "Antarctica/Syowa [Syowa Time]",
+  "Antarctica/Vostok": "Antarctica/Vostok [Vostok Time]",
+  "Arctic/Longyearbyen": "Arctic/Longyearbyen [Central European Time]",
+  "Asia/Aden": "Asia/Aden [Arabia Standard Time]",
+  "Asia/Almaty": "Asia/Almaty [Alma-Ata Time]",
+  "Asia/Amman": "Asia/Amman [Eastern European Time]",
+  "Asia/Anadyr": "Asia/Anadyr [Anadyr Time]",
+  "Asia/Aqtau": "Asia/Aqtau [Aqtau Time]",
+  "Asia/Aqtobe": "Asia/Aqtobe [Aqtobe Time]",
+  "Asia/Ashgabat": "Asia/Ashgabat [Turkmenistan Time]",
+  "Asia/Ashkhabad": "Asia/Ashkhabad [Turkmenistan Time]",
+  "Asia/Baghdad": "Asia/Baghdad [Arabia Standard Time]",
+  "Asia/Bahrain": "Asia/Bahrain [Arabia Standard Time]",
+  "Asia/Baku": "Asia/Baku [Azerbaijan Time]",
+  "Asia/Bangkok": "Asia/Bangkok [Indochina Time]",
+  "Asia/Beirut": "Asia/Beirut [Eastern European Time]",
+  "Asia/Bishkek": "Asia/Bishkek [Kirgizstan Time]",
+  "Asia/Brunei": "Asia/Brunei [Brunei Time]",
+  "Asia/Calcutta": "Asia/Calcutta [India Standard Time]",
+  "Asia/Choibalsan": "Asia/Choibalsan [Choibalsan Time]",
+  "Asia/Chongqing": "Asia/Chongqing [China Standard Time]",
+  "Asia/Chungking": "Asia/Chungking [China Standard Time]",
+  "Asia/Colombo": "Asia/Colombo [India Standard Time]",
+  "Asia/Dacca": "Asia/Dacca [Bangladesh Time]",
+  "Asia/Damascus": "Asia/Damascus [Eastern European Time]",
+  "Asia/Dhaka": "Asia/Dhaka [Bangladesh Time]",
+  "Asia/Dili": "Asia/Dili [Timor-Leste Time]",
+  "Asia/Dubai": "Asia/Dubai [Gulf Standard Time]",
+  "Asia/Dushanbe": "Asia/Dushanbe [Tajikistan Time]",
+  "Asia/Gaza": "Asia/Gaza [Eastern European Time]",
+  "Asia/Harbin": "Asia/Harbin [China Standard Time]",
+  "Asia/Hebron": "Asia/Hebron [GMT+02:00]",
+  "Asia/Ho_Chi_Minh": "Asia/Ho_Chi_Minh [Indochina Time]",
+  "Asia/Hong_Kong": "Asia/Hong_Kong [Hong Kong Time]",
+  "Asia/Hovd": "Asia/Hovd [Hovd Time]",
+  "Asia/Irkutsk": "Asia/Irkutsk [Irkutsk Time]",
+  "Asia/Istanbul": "Asia/Istanbul [Eastern European Time]",
+  "Asia/Jakarta": "Asia/Jakarta [West Indonesia Time]",
+  "Asia/Jayapura": "Asia/Jayapura [East Indonesia Time]",
+  "Asia/Jerusalem": "Asia/Jerusalem [Israel Standard Time]",
+  "Asia/Kabul": "Asia/Kabul [Afghanistan Time]",
+  "Asia/Kamchatka": "Asia/Kamchatka [Petropavlovsk-Kamchatski Time]",
+  "Asia/Karachi": "Asia/Karachi [Pakistan Time]",
+  "Asia/Kashgar": "Asia/Kashgar [China Standard Time]",
+  "Asia/Kathmandu": "Asia/Kathmandu [Nepal Time]",
+  "Asia/Katmandu": "Asia/Katmandu [Nepal Time]",
+  "Asia/Khandyga": "Asia/Khandyga [GMT+10:00]",
+  "Asia/Kolkata": "Asia/Kolkata [India Standard Time]",
+  "Asia/Krasnoyarsk": "Asia/Krasnoyarsk [Krasnoyarsk Time]",
+  "Asia/Kuala_Lumpur": "Asia/Kuala_Lumpur [Malaysia Time]",
+  "Asia/Kuching": "Asia/Kuching [Malaysia Time]",
+  "Asia/Kuwait": "Asia/Kuwait [Arabia Standard Time]",
+  "Asia/Macao": "Asia/Macao [China Standard Time]",
+  "Asia/Macau": "Asia/Macau [China Standard Time]",
+  "Asia/Magadan": "Asia/Magadan [Magadan Time]",
+  "Asia/Makassar": "Asia/Makassar [Central Indonesia Time]",
+  "Asia/Manila": "Asia/Manila [Philippines Time]",
+  "Asia/Muscat": "Asia/Muscat [Gulf Standard Time]",
+  "Asia/Nicosia": "Asia/Nicosia [Eastern European Time]",
+  "Asia/Novokuznetsk": "Asia/Novokuznetsk [Novosibirsk Time]",
+  "Asia/Novosibirsk": "Asia/Novosibirsk [Novosibirsk Time]",
+  "Asia/Omsk": "Asia/Omsk [Omsk Time]",
+  "Asia/Oral": "Asia/Oral [Oral Time]",
+  "Asia/Phnom_Penh": "Asia/Phnom_Penh [Indochina Time]",
+  "Asia/Pontianak": "Asia/Pontianak [West Indonesia Time]",
+  "Asia/Pyongyang": "Asia/Pyongyang [Korea Standard Time]",
+  "Asia/Qatar": "Asia/Qatar [Arabia Standard Time]",
+  "Asia/Qyzylorda": "Asia/Qyzylorda [Qyzylorda Time]",
+  "Asia/Rangoon": "Asia/Rangoon [Myanmar Time]",
+  "Asia/Riyadh": "Asia/Riyadh [Arabia Standard Time]",
+  "Asia/Riyadh87": "Asia/Riyadh87 [GMT+03:07]",
+  "Asia/Riyadh88": "Asia/Riyadh88 [GMT+03:07]",
+  "Asia/Riyadh89": "Asia/Riyadh89 [GMT+03:07]",
+  "Asia/Saigon": "Asia/Saigon [Indochina Time]",
+  "Asia/Sakhalin": "Asia/Sakhalin [Sakhalin Time]",
+  "Asia/Samarkand": "Asia/Samarkand [Uzbekistan Time]",
+  "Asia/Seoul": "Asia/Seoul [Korea Standard Time]",
+  "Asia/Shanghai": "Asia/Shanghai [China Standard Time]",
+  "Asia/Singapore": "Asia/Singapore [Singapore Time]",
+  "Asia/Taipei": "Asia/Taipei [China Standard Time]",
+  "Asia/Tashkent": "Asia/Tashkent [Uzbekistan Time]",
+  "Asia/Tbilisi": "Asia/Tbilisi [Georgia Time]",
+  "Asia/Tehran": "Asia/Tehran [Iran Standard Time]",
+  "Asia/Tel_Aviv": "Asia/Tel_Aviv [Israel Standard Time]",
+  "Asia/Thimbu": "Asia/Thimbu [Bhutan Time]",
+  "Asia/Thimphu": "Asia/Thimphu [Bhutan Time]",
+  "Asia/Tokyo": "Asia/Tokyo [Japan Standard Time]",
+  "Asia/Ujung_Pandang": "Asia/Ujung_Pandang [Central Indonesia Time]",
+  "Asia/Ulaanbaatar": "Asia/Ulaanbaatar [Ulaanbaatar Time]",
+  "Asia/Ulan_Bator": "Asia/Ulan_Bator [Ulaanbaatar Time]",
+  "Asia/Urumqi": "Asia/Urumqi [China Standard Time]",
+  "Asia/Ust-Nera": "Asia/Ust-Nera [GMT+11:00]",
+  "Asia/Vientiane": "Asia/Vientiane [Indochina Time]",
+  "Asia/Vladivostok": "Asia/Vladivostok [Vladivostok Time]",
+  "Asia/Yakutsk": "Asia/Yakutsk [Yakutsk Time]",
+  "Asia/Yekaterinburg": "Asia/Yekaterinburg [Yekaterinburg Time]",
+  "Asia/Yerevan": "Asia/Yerevan [Armenia Time]",
+  "Atlantic/Azores": "Atlantic/Azores [Azores Time]",
+  "Atlantic/Bermuda": "Atlantic/Bermuda [Atlantic Standard Time]",
+  "Atlantic/Canary": "Atlantic/Canary [Western European Time]",
+  "Atlantic/Cape_Verde": "Atlantic/Cape_Verde [Cape Verde Time]",
+  "Atlantic/Faeroe": "Atlantic/Faeroe [Western European Time]",
+  "Atlantic/Faroe": "Atlantic/Faroe [Western European Time]",
+  "Atlantic/Jan_Mayen": "Atlantic/Jan_Mayen [Central European Time]",
+  "Atlantic/Madeira": "Atlantic/Madeira [Western European Time]",
+  "Atlantic/Reykjavik": "Atlantic/Reykjavik [Greenwich Mean Time]",
+  "Atlantic/South_Georgia": "Atlantic/South_Georgia [South Georgia Standard Time]",
+  "Atlantic/St_Helena": "Atlantic/St_Helena [Greenwich Mean Time]",
+  "Atlantic/Stanley": "Atlantic/Stanley [Falkland Is. Time]",
+  "Australia/ACT": "Australia/ACT [Eastern Standard Time (New South Wales)]",
+  "Australia/Adelaide": "Australia/Adelaide [Central Standard Time (South Australia)]",
+  "Australia/Brisbane": "Australia/Brisbane [Eastern Standard Time (Queensland)]",
+  "Australia/Broken_Hill": "Australia/Broken_Hill [Central Standard Time (South Australia/New South Wales)]",
+  "Australia/Canberra": "Australia/Canberra [Eastern Standard Time (New South Wales)]",
+  "Australia/Currie": "Australia/Currie [Eastern Standard Time (New South Wales)]",
+  "Australia/Darwin": "Australia/Darwin [Central Standard Time (Northern Territory)]",
+  "Australia/Eucla": "Australia/Eucla [Central Western Standard Time (Australia)]",
+  "Australia/Hobart": "Australia/Hobart [Eastern Standard Time (Tasmania)]",
+  "Australia/LHI": "Australia/LHI [Lord Howe Standard Time]",
+  "Australia/Lindeman": "Australia/Lindeman [Eastern Standard Time (Queensland)]",
+  "Australia/Lord_Howe": "Australia/Lord_Howe [Lord Howe Standard Time]",
+  "Australia/Melbourne": "Australia/Melbourne [Eastern Standard Time (Victoria)]",
+  "Australia/NSW": "Australia/NSW [Eastern Standard Time (New South Wales)]",
+  "Australia/North": "Australia/North [Central Standard Time (Northern Territory)]",
+  "Australia/Perth": "Australia/Perth [Western Standard Time (Australia)]",
+  "Australia/Queensland": "Australia/Queensland [Eastern Standard Time (Queensland)]",
+  "Australia/South": "Australia/South [Central Standard Time (South Australia)]",
+  "Australia/Sydney": "Australia/Sydney [Eastern Standard Time (New South Wales)]",
+  "Australia/Tasmania": "Australia/Tasmania [Eastern Standard Time (Tasmania)]",
+  "Australia/Victoria": "Australia/Victoria [Eastern Standard Time (Victoria)]",
+  "Australia/West": "Australia/West [Western Standard Time (Australia)]",
+  "Australia/Yancowinna": "Australia/Yancowinna [Central Standard Time (South Australia/New South Wales)]",
+  "BET": "BET [Brasilia Time]",
+  "BST": "BST [Bangladesh Time]",
+  "Brazil/Acre": "Brazil/Acre [Amazon Time]",
+  "Brazil/DeNoronha": "Brazil/DeNoronha [Fernando de Noronha Time]",
+  "Brazil/East": "Brazil/East [Brasilia Time]",
+  "Brazil/West": "Brazil/West [Amazon Time]",
+  "CAT": "CAT [Central African Time]",
+  "CET": "CET [Central European Time]",
+  "CNT": "CNT [Newfoundland Standard Time]",
+  "CST": "CST [Central Standard Time]",
+  "CST6CDT": "CST6CDT [Central Standard Time]",
+  "CTT": "CTT [China Standard Time]",
+  "Canada/Atlantic": "Canada/Atlantic [Atlantic Standard Time]",
+  "Canada/Central": "Canada/Central [Central Standard Time]",
+  "Canada/East-Saskatchewan": "Canada/East-Saskatchewan [Central Standard Time]",
+  "Canada/Eastern": "Canada/Eastern [Eastern Standard Time]",
+  "Canada/Mountain": "Canada/Mountain [Mountain Standard Time]",
+  "Canada/Newfoundland": "Canada/Newfoundland [Newfoundland Standard Time]",
+  "Canada/Pacific": "Canada/Pacific [Pacific Standard Time]",
+  "Canada/Saskatchewan": "Canada/Saskatchewan [Central Standard Time]",
+  "Canada/Yukon": "Canada/Yukon [Pacific Standard Time]",
+  "Chile/Continental": "Chile/Continental [Chile Time]",
+  "Chile/EasterIsland": "Chile/EasterIsland [Easter Is. Time]",
+  "Cuba": "Cuba [Cuba Standard Time]",
+  "EAT": "EAT [Eastern African Time]",
+  "ECT": "ECT [Central European Time]",
+  "EET": "EET [Eastern European Time]",
+  "EST": "EST [Eastern Standard Time]",
+  "EST5EDT": "EST5EDT [Eastern Standard Time]",
+  "Egypt": "Egypt [Eastern European Time]",
+  "Eire": "Eire [Greenwich Mean Time]",
+  "Etc/GMT": "Etc/GMT [GMT+00:00]",
+  "Etc/GMT+0": "Etc/GMT+0 [GMT+00:00]",
+  "Etc/GMT+1": "Etc/GMT+1 [GMT-01:00]",
+  "Etc/GMT+10": "Etc/GMT+10 [GMT-10:00]",
+  "Etc/GMT+11": "Etc/GMT+11 [GMT-11:00]",
+  "Etc/GMT+12": "Etc/GMT+12 [GMT-12:00]",
+  "Etc/GMT+2": "Etc/GMT+2 [GMT-02:00]",
+  "Etc/GMT+3": "Etc/GMT+3 [GMT-03:00]",
+  "Etc/GMT+4": "Etc/GMT+4 [GMT-04:00]",
+  "Etc/GMT+5": "Etc/GMT+5 [GMT-05:00]",
+  "Etc/GMT+6": "Etc/GMT+6 [GMT-06:00]",
+  "Etc/GMT+7": "Etc/GMT+7 [GMT-07:00]",
+  "Etc/GMT+8": "Etc/GMT+8 [GMT-08:00]",
+  "Etc/GMT+9": "Etc/GMT+9 [GMT-09:00]",
+  "Etc/GMT-0": "Etc/GMT-0 [GMT+00:00]",
+  "Etc/GMT-1": "Etc/GMT-1 [GMT+01:00]",
+  "Etc/GMT-10": "Etc/GMT-10 [GMT+10:00]",
+  "Etc/GMT-11": "Etc/GMT-11 [GMT+11:00]",
+  "Etc/GMT-12": "Etc/GMT-12 [GMT+12:00]",
+  "Etc/GMT-13": "Etc/GMT-13 [GMT+13:00]",
+  "Etc/GMT-14": "Etc/GMT-14 [GMT+14:00]",
+  "Etc/GMT-2": "Etc/GMT-2 [GMT+02:00]",
+  "Etc/GMT-3": "Etc/GMT-3 [GMT+03:00]",
+  "Etc/GMT-4": "Etc/GMT-4 [GMT+04:00]",
+  "Etc/GMT-5": "Etc/GMT-5 [GMT+05:00]",
+  "Etc/GMT-6": "Etc/GMT-6 [GMT+06:00]",
+  "Etc/GMT-7": "Etc/GMT-7 [GMT+07:00]",
+  "Etc/GMT-8": "Etc/GMT-8 [GMT+08:00]",
+  "Etc/GMT-9": "Etc/GMT-9 [GMT+09:00]",
+  "Etc/GMT0": "Etc/GMT0 [GMT+00:00]",
+  "Etc/Greenwich": "Etc/Greenwich [Greenwich Mean Time]",
+  "Etc/UCT": "Etc/UCT [Coordinated Universal Time]",
+  "Etc/UTC": "Etc/UTC [Coordinated Universal Time]",
+  "Etc/Universal": "Etc/Universal [Coordinated Universal Time]",
+  "Etc/Zulu": "Etc/Zulu [Coordinated Universal Time]",
+  "Europe/Amsterdam": "Europe/Amsterdam [Central European Time]",
+  "Europe/Andorra": "Europe/Andorra [Central European Time]",
+  "Europe/Athens": "Europe/Athens [Eastern European Time]",
+  "Europe/Belfast": "Europe/Belfast [Greenwich Mean Time]",
+  "Europe/Belgrade": "Europe/Belgrade [Central European Time]",
+  "Europe/Berlin": "Europe/Berlin [Central European Time]",
+  "Europe/Bratislava": "Europe/Bratislava [Central European Time]",
+  "Europe/Brussels": "Europe/Brussels [Central European Time]",
+  "Europe/Bucharest": "Europe/Bucharest [Eastern European Time]",
+  "Europe/Budapest": "Europe/Budapest [Central European Time]",
+  "Europe/Busingen": "Europe/Busingen [GMT+01:00]",
+  "Europe/Chisinau": "Europe/Chisinau [Eastern European Time]",
+  "Europe/Copenhagen": "Europe/Copenhagen [Central European Time]",
+  "Europe/Dublin": "Europe/Dublin [Greenwich Mean Time]",
+  "Europe/Gibraltar": "Europe/Gibraltar [Central European Time]",
+  "Europe/Guernsey": "Europe/Guernsey [Greenwich Mean Time]",
+  "Europe/Helsinki": "Europe/Helsinki [Eastern European Time]",
+  "Europe/Isle_of_Man": "Europe/Isle_of_Man [Greenwich Mean Time]",
+  "Europe/Istanbul": "Europe/Istanbul [Eastern European Time]",
+  "Europe/Jersey": "Europe/Jersey [Greenwich Mean Time]",
+  "Europe/Kaliningrad": "Europe/Kaliningrad [Eastern European Time]",
+  "Europe/Kiev": "Europe/Kiev [Eastern European Time]",
+  "Europe/Lisbon": "Europe/Lisbon [Western European Time]",
+  "Europe/Ljubljana": "Europe/Ljubljana [Central European Time]",
+  "Europe/London": "Europe/London [Greenwich Mean Time]",
+  "Europe/Luxembourg": "Europe/Luxembourg [Central European Time]",
+  "Europe/Madrid": "Europe/Madrid [Central European Time]",
+  "Europe/Malta": "Europe/Malta [Central European Time]",
+  "Europe/Mariehamn": "Europe/Mariehamn [Eastern European Time]",
+  "Europe/Minsk": "Europe/Minsk [Eastern European Time]",
+  "Europe/Monaco": "Europe/Monaco [Central European Time]",
+  "Europe/Moscow": "Europe/Moscow [Moscow Standard Time]",
+  "Europe/Nicosia": "Europe/Nicosia [Eastern European Time]",
+  "Europe/Oslo": "Europe/Oslo [Central European Time]",
+  "Europe/Paris": "Europe/Paris [Central European Time]",
+  "Europe/Podgorica": "Europe/Podgorica [Central European Time]",
+  "Europe/Prague": "Europe/Prague [Central European Time]",
+  "Europe/Riga": "Europe/Riga [Eastern European Time]",
+  "Europe/Rome": "Europe/Rome [Central European Time]",
+  "Europe/Samara": "Europe/Samara [Samara Time]",
+  "Europe/San_Marino": "Europe/San_Marino [Central European Time]",
+  "Europe/Sarajevo": "Europe/Sarajevo [Central European Time]",
+  "Europe/Simferopol": "Europe/Simferopol [Eastern European Time]",
+  "Europe/Skopje": "Europe/Skopje [Central European Time]",
+  "Europe/Sofia": "Europe/Sofia [Eastern European Time]",
+  "Europe/Stockholm": "Europe/Stockholm [Central European Time]",
+  "Europe/Tallinn": "Europe/Tallinn [Eastern European Time]",
+  "Europe/Tirane": "Europe/Tirane [Central European Time]",
+  "Europe/Tiraspol": "Europe/Tiraspol [Eastern European Time]",
+  "Europe/Uzhgorod": "Europe/Uzhgorod [Eastern European Time]",
+  "Europe/Vaduz": "Europe/Vaduz [Central European Time]",
+  "Europe/Vatican": "Europe/Vatican [Central European Time]",
+  "Europe/Vienna": "Europe/Vienna [Central European Time]",
+  "Europe/Vilnius": "Europe/Vilnius [Eastern European Time]",
+  "Europe/Volgograd": "Europe/Volgograd [Volgograd Time]",
+  "Europe/Warsaw": "Europe/Warsaw [Central European Time]",
+  "Europe/Zagreb": "Europe/Zagreb [Central European Time]",
+  "Europe/Zaporozhye": "Europe/Zaporozhye [Eastern European Time]",
+  "Europe/Zurich": "Europe/Zurich [Central European Time]",
+  "GB": "GB [Greenwich Mean Time]",
+  "GB-Eire": "GB-Eire [Greenwich Mean Time]",
+  "GMT": "GMT [Greenwich Mean Time]",
+  "GMT0": "GMT0 [GMT+00:00]",
+  "Greenwich": "Greenwich [Greenwich Mean Time]",
+  "HST": "HST [Hawaii Standard Time]",
+  "Hongkong": "Hongkong [Hong Kong Time]",
+  "IET": "IET [Eastern Standard Time]",
+  "IST": "IST [India Standard Time]",
+  "Iceland": "Iceland [Greenwich Mean Time]",
+  "Indian/Antananarivo": "Indian/Antananarivo [Eastern African Time]",
+  "Indian/Chagos": "Indian/Chagos [Indian Ocean Territory Time]",
+  "Indian/Christmas": "Indian/Christmas [Christmas Island Time]",
+  "Indian/Cocos": "Indian/Cocos [Cocos Islands Time]",
+  "Indian/Comoro": "Indian/Comoro [Eastern African Time]",
+  "Indian/Kerguelen": "Indian/Kerguelen [French Southern & Antarctic Lands Time]",
+  "Indian/Mahe": "Indian/Mahe [Seychelles Time]",
+  "Indian/Maldives": "Indian/Maldives [Maldives Time]",
+  "Indian/Mauritius": "Indian/Mauritius [Mauritius Time]",
+  "Indian/Mayotte": "Indian/Mayotte [Eastern African Time]",
+  "Indian/Reunion": "Indian/Reunion [Reunion Time]",
+  "Iran": "Iran [Iran Standard Time]",
+  "Israel": "Israel [Israel Standard Time]",
+  "JST": "JST [Japan Standard Time]",
+  "Jamaica": "Jamaica [Eastern Standard Time]",
+  "Japan": "Japan [Japan Standard Time]",
+  "Kwajalein": "Kwajalein [Marshall Islands Time]",
+  "Libya": "Libya [Eastern European Time]",
+  "MET": "MET [Middle Europe Time]",
+  "MIT": "MIT [West Samoa Time]",
+  "MST": "MST [Mountain Standard Time]",
+  "MST7MDT": "MST7MDT [Mountain Standard Time]",
+  "Mexico/BajaNorte": "Mexico/BajaNorte [Pacific Standard Time]",
+  "Mexico/BajaSur": "Mexico/BajaSur [Mountain Standard Time]",
+  "Mexico/General": "Mexico/General [Central Standard Time]",
+  "Mideast/Riyadh87": "Mideast/Riyadh87 [GMT+03:07]",
+  "Mideast/Riyadh88": "Mideast/Riyadh88 [GMT+03:07]",
+  "Mideast/Riyadh89": "Mideast/Riyadh89 [GMT+03:07]",
+  "NET": "NET [Armenia Time]",
+  "NST": "NST [New Zealand Standard Time]",
+  "NZ": "NZ [New Zealand Standard Time]",
+  "NZ-CHAT": "NZ-CHAT [Chatham Standard Time]",
+  "Navajo": "Navajo [Mountain Standard Time]",
+  "PLT": "PLT [Pakistan Time]",
+  "PNT": "PNT [Mountain Standard Time]",
+  "PRC": "PRC [China Standard Time]",
+  "PRT": "PRT [Atlantic Standard Time]",
+  "PST": "PST [Pacific Standard Time]",
+  "PST8PDT": "PST8PDT [Pacific Standard Time]",
+  "Pacific/Apia": "Pacific/Apia [West Samoa Time]",
+  "Pacific/Auckland": "Pacific/Auckland [New Zealand Standard Time]",
+  "Pacific/Chatham": "Pacific/Chatham [Chatham Standard Time]",
+  "Pacific/Chuuk": "Pacific/Chuuk [GMT+10:00]",
+  "Pacific/Easter": "Pacific/Easter [Easter Is. Time]",
+  "Pacific/Efate": "Pacific/Efate [Vanuatu Time]",
+  "Pacific/Enderbury": "Pacific/Enderbury [Phoenix Is. Time]",
+  "Pacific/Fakaofo": "Pacific/Fakaofo [Tokelau Time]",
+  "Pacific/Fiji": "Pacific/Fiji [Fiji Time]",
+  "Pacific/Funafuti": "Pacific/Funafuti [Tuvalu Time]",
+  "Pacific/Galapagos": "Pacific/Galapagos [Galapagos Time]",
+  "Pacific/Gambier": "Pacific/Gambier [Gambier Time]",
+  "Pacific/Guadalcanal": "Pacific/Guadalcanal [Solomon Is. Time]",
+  "Pacific/Guam": "Pacific/Guam [Chamorro Standard Time]",
+  "Pacific/Honolulu": "Pacific/Honolulu [Hawaii Standard Time]",
+  "Pacific/Johnston": "Pacific/Johnston [Hawaii Standard Time]",
+  "Pacific/Kiritimati": "Pacific/Kiritimati [Line Is. Time]",
+  "Pacific/Kosrae": "Pacific/Kosrae [Kosrae Time]",
+  "Pacific/Kwajalein": "Pacific/Kwajalein [Marshall Islands Time]",
+  "Pacific/Majuro": "Pacific/Majuro [Marshall Islands Time]",
+  "Pacific/Marquesas": "Pacific/Marquesas [Marquesas Time]",
+  "Pacific/Midway": "Pacific/Midway [Samoa Standard Time]",
+  "Pacific/Nauru": "Pacific/Nauru [Nauru Time]",
+  "Pacific/Niue": "Pacific/Niue [Niue Time]",
+  "Pacific/Norfolk": "Pacific/Norfolk [Norfolk Time]",
+  "Pacific/Noumea": "Pacific/Noumea [New Caledonia Time]",
+  "Pacific/Pago_Pago": "Pacific/Pago_Pago [Samoa Standard Time]",
+  "Pacific/Palau": "Pacific/Palau [Palau Time]",
+  "Pacific/Pitcairn": "Pacific/Pitcairn [Pitcairn Standard Time]",
+  "Pacific/Pohnpei": "Pacific/Pohnpei [GMT+11:00]",
+  "Pacific/Ponape": "Pacific/Ponape [Ponape Time]",
+  "Pacific/Port_Moresby": "Pacific/Port_Moresby [Papua New Guinea Time]",
+  "Pacific/Rarotonga": "Pacific/Rarotonga [Cook Is. Time]",
+  "Pacific/Saipan": "Pacific/Saipan [Chamorro Standard Time]",
+  "Pacific/Samoa": "Pacific/Samoa [Samoa Standard Time]",
+  "Pacific/Tahiti": "Pacific/Tahiti [Tahiti Time]",
+  "Pacific/Tarawa": "Pacific/Tarawa [Gilbert Is. Time]",
+  "Pacific/Tongatapu": "Pacific/Tongatapu [Tonga Time]",
+  "Pacific/Truk": "Pacific/Truk [Truk Time]",
+  "Pacific/Wake": "Pacific/Wake [Wake Time]",
+  "Pacific/Wallis": "Pacific/Wallis [Wallis & Futuna Time]",
+  "Pacific/Yap": "Pacific/Yap [Truk Time]",
+  "Portugal": "Portugal [Western European Time]",
+  "ROK": "ROK [Korea Standard Time]",
+  "SST": "SST [Solomon Is. Time]",
+  "Singapore": "Singapore [Singapore Time]",
+  "SystemV/AST4": "SystemV/AST4 [Atlantic Standard Time]",
+  "SystemV/AST4ADT": "SystemV/AST4ADT [Atlantic Standard Time]",
+  "SystemV/CST6": "SystemV/CST6 [Central Standard Time]",
+  "SystemV/CST6CDT": "SystemV/CST6CDT [Central Standard Time]",
+  "SystemV/EST5": "SystemV/EST5 [Eastern Standard Time]",
+  "SystemV/EST5EDT": "SystemV/EST5EDT [Eastern Standard Time]",
+  "SystemV/HST10": "SystemV/HST10 [Hawaii Standard Time]",
+  "SystemV/MST7": "SystemV/MST7 [Mountain Standard Time]",
+  "SystemV/MST7MDT": "SystemV/MST7MDT [Mountain Standard Time]",
+  "SystemV/PST8": "SystemV/PST8 [Pacific Standard Time]",
+  "SystemV/PST8PDT": "SystemV/PST8PDT [Pacific Standard Time]",
+  "SystemV/YST9": "SystemV/YST9 [Alaska Standard Time]",
+  "SystemV/YST9YDT": "SystemV/YST9YDT [Alaska Standard Time]",
+  "Turkey": "Turkey [Eastern European Time]",
+  "UCT": "UCT [Coordinated Universal Time]",
+  "US/Alaska": "US/Alaska [Alaska Standard Time]",
+  "US/Aleutian": "US/Aleutian [Hawaii-Aleutian Standard Time]",
+  "US/Arizona": "US/Arizona [Mountain Standard Time]",
+  "US/Central": "US/Central [Central Standard Time]",
+  "US/East-Indiana": "US/East-Indiana [Eastern Standard Time]",
+  "US/Eastern": "US/Eastern [Eastern Standard Time]",
+  "US/Hawaii": "US/Hawaii [Hawaii Standard Time]",
+  "US/Indiana-Starke": "US/Indiana-Starke [Central Standard Time]",
+  "US/Michigan": "US/Michigan [Eastern Standard Time]",
+  "US/Mountain": "US/Mountain [Mountain Standard Time]",
+  "US/Pacific": "US/Pacific [Pacific Standard Time]",
+  "US/Pacific-New": "US/Pacific-New [Pacific Standard Time]",
+  "US/Samoa": "US/Samoa [Samoa Standard Time]",
+  "UTC": "UTC [Coordinated Universal Time]",
+  "Universal": "Universal [Coordinated Universal Time]",
+  "VST": "VST [Indochina Time]",
+  "W-SU": "W-SU [Moscow Standard Time]",
+  "WET": "WET [Western European Time]",
+  "Zulu": "Zulu [Coordinated Universal Time]"
+}
diff --git a/ui/src/utils/util.js b/ui/src/utils/util.js
new file mode 100644
index 0000000..2f017e0
--- /dev/null
+++ b/ui/src/utils/util.js
@@ -0,0 +1,63 @@
+// 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.
+
+export function timeFix () {
+  const time = new Date()
+  const hour = time.getHours()
+  return hour < 9 ? '早上好' : hour <= 11 ? '上午好' : hour <= 13 ? '中午好' : hour < 20 ? '下午好' : '晚上好'
+}
+
+export function triggerWindowResizeEvent () {
+  const event = document.createEvent('HTMLEvents')
+  event.initEvent('resize', true, true)
+  event.eventType = 'message'
+  window.dispatchEvent(event)
+}
+
+export function handleScrollHeader (callback) {
+  let timer = 0
+
+  let beforeScrollTop = window.pageYOffset
+  callback = callback || function () {}
+  window.addEventListener(
+    'scroll',
+    event => {
+      clearTimeout(timer)
+      timer = setTimeout(() => {
+        let direction = 'up'
+        const afterScrollTop = window.pageYOffset
+        const delta = afterScrollTop - beforeScrollTop
+        if (delta === 0) {
+          return false
+        }
+        direction = delta > 0 ? 'down' : 'up'
+        callback(direction)
+        beforeScrollTop = afterScrollTop
+      }, 50)
+    },
+    false
+  )
+}
+
+export function removeLoadingAnimate (id = '', timeout = 1500) {
+  if (id === '') {
+    return
+  }
+  setTimeout(() => {
+    document.body.removeChild(document.getElementById(id))
+  }, timeout)
+}
diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue
new file mode 100644
index 0000000..157d7d7
--- /dev/null
+++ b/ui/src/views/AutogenView.vue
@@ -0,0 +1,1188 @@
+// 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>
+    <a-card class="breadcrumb-card">
+      <a-row>
+        <a-col :span="device === 'mobile' ? 24 : 12" style="padding-left: 12px">
+          <breadcrumb :resource="resource">
+            <span slot="end">
+              <a-button
+                :loading="loading"
+                style="margin-bottom: 5px"
+                shape="round"
+                size="small"
+                icon="reload"
+                @click="fetchData({ irefresh: true })">
+                {{ $t('label.refresh') }}
+              </a-button>
+              <a-switch
+                v-if="!dataView && ['vm', 'volume', 'zone', 'cluster', 'host', 'storagepool'].includes($route.name)"
+                style="margin-left: 8px"
+                :checked-children="$t('label.metrics')"
+                :un-checked-children="$t('label.metrics')"
+                :checked="$store.getters.metrics"
+                @change="(checked, event) => { $store.dispatch('SetMetrics', checked) }"/>
+              <a-tooltip placement="right">
+                <template slot="title">
+                  {{ $t('label.filterby') }}
+                </template>
+                <a-select
+                  v-if="!dataView && filters && filters.length > 0"
+                  :placeholder="$t('label.filterby')"
+                  :value="$route.query.filter || (projectView && $route.name === 'vm' ||
+                    ['Admin', 'DomainAdmin'].includes($store.getters.userInfo.roletype) && ['vm', 'iso', 'template'].includes($route.name)
+                    ? 'all' : ['guestnetwork'].includes($route.name) ? 'all' : 'self')"
+                  style="min-width: 100px; margin-left: 10px"
+                  @change="changeFilter">
+                  <a-icon slot="suffixIcon" type="filter" />
+                  <a-select-option v-if="['Admin', 'DomainAdmin'].includes($store.getters.userInfo.roletype) && ['vm', 'iso', 'template'].includes($route.name)" key="all">
+                    {{ $t('label.all') }}
+                  </a-select-option>
+                  <a-select-option v-for="filter in filters" :key="filter">
+                    {{ $t('label.' + filter) }}
+                  </a-select-option>
+                </a-select>
+              </a-tooltip>
+            </span>
+          </breadcrumb>
+        </a-col>
+        <a-col
+          :span="device === 'mobile' ? 24 : 12"
+          :style="device === 'mobile' ? { float: 'right', 'margin-top': '12px', 'margin-bottom': '-6px', display: 'table' } : { float: 'right', display: 'table', 'margin-bottom': '-6px' }" >
+          <slot name="action" v-if="dataView && $route.path.startsWith('/publicip')"></slot>
+          <action-button
+            v-else
+            :style="dataView ? { float: device === 'mobile' ? 'left' : 'right' } : { 'margin-right': '10px', display: 'inline-flex' }"
+            :loading="loading"
+            :actions="actions"
+            :selectedRowKeys="selectedRowKeys"
+            :dataView="dataView"
+            :resource="resource"
+            @exec-action="(action) => execAction(action, action.groupAction && !dataView)"/>
+          <search-view
+            v-if="!dataView"
+            :searchFilters="searchFilters"
+            :searchParams="searchParams"
+            :apiName="apiName"/>
+        </a-col>
+      </a-row>
+    </a-card>
+
+    <div v-show="showAction">
+      <keep-alive v-if="currentAction.component && (!currentAction.groupAction || this.selectedRowKeys.length === 0)">
+        <a-modal
+          :visible="showAction"
+          :closable="true"
+          :maskClosable="false"
+          :cancelText="$t('label.cancel')"
+          style="top: 20px;"
+          @cancel="closeAction"
+          :confirmLoading="actionLoading"
+          :footer="null"
+          centered
+          width="auto"
+        >
+          <span slot="title">
+            {{ $t(currentAction.label) }}
+            <a
+              v-if="currentAction.docHelp || $route.meta.docHelp"
+              style="margin-left: 5px"
+              :href="$config.docBase + '/' + (currentAction.docHelp || $route.meta.docHelp)"
+              target="_blank">
+              <a-icon type="question-circle-o"></a-icon>
+            </a>
+          </span>
+          <component
+            :is="currentAction.component"
+            :resource="resource"
+            :loading="loading"
+            :action="{currentAction}"
+            v-bind="{currentAction}"
+            @refresh-data="fetchData"
+            @poll-action="pollActionCompletion"
+            @close-action="closeAction"/>
+        </a-modal>
+      </keep-alive>
+      <a-modal
+        v-else
+        :visible="showAction"
+        :closable="true"
+        :maskClosable="false"
+        :okText="$t('label.ok')"
+        :cancelText="$t('label.cancel')"
+        style="top: 20px;"
+        @ok="handleSubmit"
+        @cancel="closeAction"
+        :confirmLoading="actionLoading"
+        centered
+      >
+        <span slot="title">
+          {{ $t(currentAction.label) }}
+          <a
+            v-if="currentAction.docHelp || $route.meta.docHelp"
+            style="margin-left: 5px"
+            :href="$config.docBase + '/' + (currentAction.docHelp || $route.meta.docHelp)"
+            target="_blank">
+            <a-icon type="question-circle-o"></a-icon>
+          </a>
+        </span>
+        <a-spin :spinning="actionLoading">
+          <span v-if="currentAction.message">
+            <a-alert type="warning">
+              <span slot="message" v-html="$t(currentAction.message)" />
+            </a-alert>
+            <br v-if="currentAction.paramFields.length > 0"/>
+          </span>
+          <a-form
+            :form="form"
+            @submit="handleSubmit"
+            layout="vertical" >
+            <a-form-item
+              v-for="(field, fieldIndex) in currentAction.paramFields"
+              :key="fieldIndex"
+              :v-bind="field.name"
+              v-if="!(currentAction.mapping && field.name in currentAction.mapping && currentAction.mapping[field.name].value)"
+            >
+              <span slot="label">
+                {{ $t('label.' + field.name) }}
+                <a-tooltip :title="field.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+
+              <span v-if="field.type==='boolean'">
+                <a-switch
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
+                  }]"
+                  v-model="formModel[field.name]"
+                  :placeholder="field.description"
+                  :autoFocus="fieldIndex === 0"
+                />
+              </span>
+              <span v-else-if="currentAction.mapping && field.name in currentAction.mapping && currentAction.mapping[field.name].options">
+                <a-select
+                  :loading="field.loading"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
+                  }]"
+                  :placeholder="field.description"
+                >
+                  <a-select-option key="" >{{ }}</a-select-option>
+                  <a-select-option v-for="(opt, optIndex) in currentAction.mapping[field.name].options" :key="optIndex">
+                    {{ opt }}
+                  </a-select-option>
+                </a-select>
+              </span>
+              <span
+                v-else-if="field.name==='keypair' ||
+                  (field.name==='account' && !['addAccountToProject', 'createAccount'].includes(currentAction.api))">
+                <a-select
+                  showSearch
+                  optionFilterProp="children"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
+                  }]"
+                  :loading="field.loading"
+                  :placeholder="field.description"
+                  :filterOption="(input, option) => {
+                    return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                  }"
+                >
+                  <a-select-option key="">{{ }}</a-select-option>
+                  <a-select-option v-for="(opt, optIndex) in field.opts" :key="optIndex">
+                    {{ opt.name || opt.description || opt.traffictype || opt.publicip }}
+                  </a-select-option>
+                </a-select>
+              </span>
+              <span
+                v-else-if="field.type==='uuid'">
+                <a-select
+                  showSearch
+                  optionFilterProp="children"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
+                  }]"
+                  :loading="field.loading"
+                  :placeholder="field.description"
+                  :filterOption="(input, option) => {
+                    return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                  }"
+                >
+                  <a-select-option key="">{{ }}</a-select-option>
+                  <a-select-option v-for="opt in field.opts" :key="opt.id">
+                    {{ opt.name || opt.description || opt.traffictype || opt.publicip }}
+                  </a-select-option>
+                </a-select>
+              </span>
+              <span v-else-if="field.type==='list'">
+                <a-select
+                  :loading="field.loading"
+                  mode="multiple"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
+                  }]"
+                  :placeholder="field.description"
+                >
+                  <a-select-option v-for="(opt, optIndex) in field.opts" :key="optIndex">
+                    {{ opt.name && opt.type ? opt.name + ' (' + opt.type + ')' : opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </span>
+              <span v-else-if="field.type==='long'">
+                <a-input-number
+                  :autoFocus="fieldIndex === 0"
+                  style="width: 100%;"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.validate.number')}` }]
+                  }]"
+                  :placeholder="field.description"
+                />
+              </span>
+              <span v-else-if="field.name==='password' || field.name==='currentpassword' || field.name==='confirmpassword'">
+                <a-input-password
+                  v-decorator="[field.name, {
+                    rules: [
+                      {
+                        required: field.required,
+                        message: `${$t('message.error.required.input')}`
+                      },
+                      {
+                        validator: validateTwoPassword
+                      }
+                    ]
+                  }]"
+                  :placeholder="field.description"
+                  @blur="($event) => handleConfirmBlur($event, field.name)"
+                />
+              </span>
+              <span v-else-if="field.name==='certificate' || field.name==='privatekey' || field.name==='certchain'">
+                <a-textarea
+                  rows="2"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
+                  }]"
+                  :placeholder="field.description"
+                />
+              </span>
+              <span v-else>
+                <a-input
+                  :autoFocus="fieldIndex === 0"
+                  v-decorator="[field.name, {
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
+                  }]"
+                  :placeholder="field.description" />
+              </span>
+            </a-form-item>
+          </a-form>
+        </a-spin>
+      </a-modal>
+    </div>
+
+    <div v-if="dataView">
+      <slot name="resource" v-if="$route.path.startsWith('/quotasummary') || $route.path.startsWith('/publicip')"></slot>
+      <resource-view
+        v-else
+        :resource="resource"
+        :loading="loading"
+        :tabs="$route.meta.tabs" />
+    </div>
+    <div class="row-element" v-else>
+      <list-view
+        :loading="loading"
+        :columns="columns"
+        :items="items"
+        :actions="actions"
+        ref="listview"
+        @selection-change="onRowSelectionChange"
+        @refresh="this.fetchData" />
+      <a-pagination
+        class="row-element"
+        size="small"
+        :current="page"
+        :pageSize="pageSize"
+        :total="itemCount"
+        :showTotal="total => `${$t('label.showing')} ${Math.min(total, 1+((page-1)*pageSize))}-${Math.min(page*pageSize, total)} ${$t('label.of')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="device === 'desktop' ? ['20', '50', '100', '200'] : ['10', '20', '50', '100', '200']"
+        @change="changePage"
+        @showSizeChange="changePageSize"
+        showSizeChanger
+        showQuickJumper>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import { genericCompare } from '@/utils/sort.js'
+import store from '@/store'
+import eventBus from '@/config/eventBus'
+
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+import ChartCard from '@/components/widgets/ChartCard'
+import Status from '@/components/widgets/Status'
+import ListView from '@/components/view/ListView'
+import ResourceView from '@/components/view/ResourceView'
+import ActionButton from '@/components/view/ActionButton'
+import SearchView from '@/components/view/SearchView'
+
+export default {
+  name: 'Resource',
+  components: {
+    Breadcrumb,
+    ChartCard,
+    ResourceView,
+    ListView,
+    Status,
+    ActionButton,
+    SearchView
+  },
+  mixins: [mixinDevice],
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData,
+      parentToggleLoading: this.toggleLoading,
+      parentStartLoading: this.startLoading,
+      parentFinishLoading: this.finishLoading,
+      parentSearch: this.onSearch,
+      parentChangeFilter: this.changeFilter,
+      parentChangeResource: this.changeResource,
+      parentPollActionCompletion: this.pollActionCompletion,
+      parentEditTariffAction: () => {}
+    }
+  },
+  data () {
+    return {
+      apiName: '',
+      loading: false,
+      actionLoading: false,
+      columns: [],
+      items: [],
+      itemCount: 0,
+      page: 1,
+      pageSize: 10,
+      resource: {},
+      selectedRowKeys: [],
+      currentAction: {},
+      showAction: false,
+      dataView: false,
+      projectView: false,
+      selectedFilter: '',
+      filters: [],
+      searchFilters: [],
+      searchParams: {},
+      actions: [],
+      formModel: {},
+      confirmDirty: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  created () {
+    eventBus.$on('vm-refresh-data', () => {
+      if (this.$route.path === '/vm' || this.$route.path.includes('/vm/')) {
+        this.fetchData()
+      }
+    })
+    eventBus.$on('async-job-complete', (action) => {
+      if (this.$route.path.includes('/vm/')) {
+        if (action && 'api' in action && ['destroyVirtualMachine'].includes(action.api)) {
+          return
+        }
+      }
+      this.fetchData()
+    })
+    eventBus.$on('exec-action', (action, isGroupAction) => {
+      this.execAction(action, isGroupAction)
+    })
+  },
+  mounted () {
+    if (this.device === 'desktop') {
+      this.pageSize = 20
+    }
+    this.currentPath = this.$route.fullPath
+    this.fetchData()
+    if ('projectid' in this.$route.query) {
+      this.switchProject(this.$route.query.projectid)
+    }
+  },
+  beforeRouteUpdate (to, from, next) {
+    this.currentPath = this.$route.fullPath
+    next()
+  },
+  beforeRouteLeave (to, from, next) {
+    this.currentPath = this.$route.fullPath
+    next()
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.fullPath !== from.fullPath && !to.fullPath.includes('action/')) {
+        if ('page' in to.query) {
+          this.page = Number(to.query.page)
+          this.pageSize = Number(to.query.pagesize)
+        } else {
+          this.page = 1
+          this.pageSize = (this.device === 'desktop' ? 20 : 10)
+        }
+        this.itemCount = 0
+        this.fetchData()
+        if ('projectid' in to.query) {
+          this.switchProject(to.query.projectid)
+        }
+      }
+    },
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchData()
+      }
+    },
+    '$store.getters.metrics' (oldVal, newVal) {
+      this.fetchData()
+    }
+  },
+  methods: {
+    switchProject (projectId) {
+      if (!projectId || !projectId.length || projectId.length !== 36) {
+        return
+      }
+      api('listProjects', { id: projectId, listall: true, details: 'min' }).then(json => {
+        if (!json || !json.listprojectsresponse || !json.listprojectsresponse.project) return
+        const project = json.listprojectsresponse.project[0]
+        this.$store.dispatch('SetProject', project)
+        this.$store.dispatch('ToggleTheme', project.id === undefined ? 'light' : 'dark')
+        this.$message.success(`${this.$t('message.switch.to')} "${project.name}"`)
+        const query = Object.assign({}, this.$route.query)
+        delete query.projectid
+        this.$router.replace({ query })
+      })
+    },
+    fetchData (params = {}) {
+      if (this.$route.name === 'deployVirtualMachine') {
+        return
+      }
+      if (this.routeName !== this.$route.name) {
+        this.routeName = this.$route.name
+        this.items = []
+      }
+      if (!this.routeName) {
+        this.routeName = this.$route.matched[this.$route.matched.length - 1].parent.name
+      }
+      this.apiName = ''
+      this.actions = []
+      this.columns = []
+      this.columnKeys = []
+      const refreshed = ('irefresh' in params)
+
+      params.listall = true
+      if (this.$route.meta.params) {
+        Object.assign(params, this.$route.meta.params)
+      }
+      if (['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype) &&
+        'templatefilter' in params && this.routeName === 'template') {
+        params.templatefilter = 'all'
+      }
+      if (['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype) &&
+        'isofilter' in params && this.routeName === 'iso') {
+        params.isofilter = 'all'
+      }
+      if (Object.keys(this.$route.query).length > 0) {
+        if ('page' in this.$route.query) {
+          this.page = Number(this.$route.query.page)
+        }
+        if ('pagesize' in this.$route.query) {
+          this.pagesize = Number(this.$route.query.pagesize)
+        }
+        Object.assign(params, this.$route.query)
+      }
+      delete params.q
+      delete params.filter
+      delete params.irefresh
+
+      this.searchFilters = this.$route && this.$route.meta && this.$route.meta.searchFilters
+      this.filters = this.$route && this.$route.meta && this.$route.meta.filters
+      if (typeof this.filters === 'function') {
+        this.filters = this.filters()
+      }
+
+      this.projectView = Boolean(store.getters.project && store.getters.project.id)
+
+      if (this.$route && this.$route.params && this.$route.params.id) {
+        this.dataView = true
+        if (!refreshed) {
+          this.resource = {}
+          this.$emit('change-resource', this.resource)
+        }
+      } else {
+        this.dataView = false
+      }
+
+      if ('listview' in this.$refs && this.$refs.listview) {
+        this.$refs.listview.resetSelection()
+      }
+
+      if (this.$route && this.$route.meta && this.$route.meta.permission) {
+        this.apiName = this.$route.meta.permission[0]
+        if (this.$route.meta.columns) {
+          const columns = this.$route.meta.columns
+          if (columns && typeof columns === 'function') {
+            this.columnKeys = columns()
+          } else {
+            this.columnKeys = columns
+          }
+        }
+
+        if (this.$route.meta.actions) {
+          this.actions = this.$route.meta.actions
+        }
+      }
+
+      if (this.apiName === '' || this.apiName === undefined) {
+        return
+      }
+
+      if (!this.columnKeys || this.columnKeys.length === 0) {
+        for (const field of store.getters.apis[this.apiName].response) {
+          this.columnKeys.push(field.name)
+        }
+        this.columnKeys = [...new Set(this.columnKeys)]
+        this.columnKeys.sort(function (a, b) {
+          if (a === 'name' && b !== 'name') { return -1 }
+          if (a < b) { return -1 }
+          if (a > b) { return 1 }
+          return 0
+        })
+      }
+
+      const customRender = {}
+      for (var columnKey of this.columnKeys) {
+        var key = columnKey
+        if (typeof columnKey === 'object') {
+          key = Object.keys(columnKey)[0]
+          customRender[key] = columnKey[key]
+        }
+        this.columns.push({
+          title: this.$t('label.' + String(key).toLowerCase()),
+          dataIndex: key,
+          scopedSlots: { customRender: key },
+          sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+        })
+      }
+
+      if (['listTemplates', 'listIsos'].includes(this.apiName) && this.dataView) {
+        delete params.showunique
+      }
+
+      this.loading = true
+      if (this.$route.params && this.$route.params.id) {
+        params.id = this.$route.params.id
+        if (this.$route.path.startsWith('/ssh/')) {
+          params.name = this.$route.params.id
+        } else if (this.$route.path.startsWith('/vmsnapshot/')) {
+          params.vmsnapshotid = this.$route.params.id
+        } else if (this.$route.path.startsWith('/ldapsetting/')) {
+          params.hostname = this.$route.params.id
+        }
+      }
+
+      params.page = this.page
+      params.pagesize = this.pageSize
+      api(this.apiName, params).then(json => {
+        var responseName
+        var objectName
+        for (const key in json) {
+          if (key.includes('response')) {
+            responseName = key
+            break
+          }
+        }
+        this.itemCount = 0
+        for (const key in json[responseName]) {
+          if (key === 'count') {
+            this.itemCount = json[responseName].count
+            continue
+          }
+          objectName = key
+          break
+        }
+        this.items = json[responseName][objectName]
+        if (!this.items || this.items.length === 0) {
+          this.items = []
+        }
+
+        if (['listTemplates', 'listIsos'].includes(this.apiName) && this.items.length > 1) {
+          this.items = [...new Map(this.items.map(x => [x.id, x])).values()]
+        }
+
+        if (this.apiName === 'listProjects' && this.items.length > 0) {
+          this.columns.map(col => {
+            if (col.title === 'Account') {
+              col.title = this.$t('label.project.owner')
+            }
+          })
+        }
+
+        for (let idx = 0; idx < this.items.length; idx++) {
+          this.items[idx].key = idx
+          for (const key in customRender) {
+            const func = customRender[key]
+            if (func && typeof func === 'function') {
+              this.items[idx][key] = func(this.items[idx])
+            }
+          }
+          if (this.$route.path.startsWith('/ssh')) {
+            this.items[idx].id = this.items[idx].name
+          } else if (this.$route.path.startsWith('/ldapsetting')) {
+            this.items[idx].id = this.items[idx].hostname
+          }
+        }
+        if (this.items.length > 0) {
+          this.resource = this.items[0]
+          this.$emit('change-resource', this.resource)
+        } else {
+          if (this.dataView) {
+            this.$router.push({ path: '/exception/404' })
+          }
+        }
+      }).catch(error => {
+        if ([401].includes(error.response.status)) {
+          return
+        }
+
+        if (Object.keys(this.searchParams).length > 0) {
+          this.itemCount = 0
+          this.items = []
+          this.$message.error({
+            content: error.response.headers['x-description'],
+            duration: 5
+          })
+          return
+        }
+
+        this.$notifyError(error)
+
+        if ([405].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/403' })
+        }
+
+        if ([430, 431, 432].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/404' })
+        }
+
+        if ([530, 531, 532, 533, 534, 535, 536, 537].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/500' })
+        }
+      }).finally(f => {
+        this.loading = false
+      })
+    },
+    closeAction () {
+      this.actionLoading = false
+      this.showAction = false
+      this.currentAction = {}
+    },
+    onRowSelectionChange (selection) {
+      this.selectedRowKeys = selection
+    },
+    execAction (action, isGroupAction) {
+      const self = this
+      this.form = this.$form.createForm(this)
+      this.formModel = {}
+      if (action.component && action.api && !action.popup) {
+        this.$router.push({ name: action.api })
+        return
+      }
+      this.currentAction = action
+      this.currentAction.params = store.getters.apis[this.currentAction.api].params
+      this.resource = action.resource
+      this.$emit('change-resource', this.resource)
+      var paramFields = this.currentAction.params
+      paramFields.sort(function (a, b) {
+        if (a.name === 'name' && b.name !== 'name') { return -1 }
+        if (a.name !== 'name' && b.name === 'name') { return -1 }
+        if (a.name === 'id') { return -1 }
+        if (a.name < b.name) { return -1 }
+        if (a.name > b.name) { return 1 }
+        return 0
+      })
+      this.currentAction.paramFields = []
+      if ('args' in action) {
+        var args = action.args
+        if (typeof action.args === 'function') {
+          args = action.args(action.resource, this.$store.getters, isGroupAction)
+        }
+        if (args.length > 0) {
+          this.currentAction.paramFields = args.map(function (arg) {
+            if (arg === 'confirmpassword') {
+              return {
+                type: 'password',
+                name: 'confirmpassword',
+                required: true,
+                description: self.$t('label.confirmpassword.description')
+              }
+            }
+            return paramFields.filter(function (param) {
+              return param.name.toLowerCase() === arg.toLowerCase()
+            })[0]
+          })
+        }
+      }
+
+      this.showAction = true
+      for (const param of this.currentAction.paramFields) {
+        if (param.type === 'list' && ['tags', 'hosttags'].includes(param.name)) {
+          param.type = 'string'
+        }
+        if (param.type === 'uuid' || param.type === 'list' || param.name === 'account' || (this.currentAction.mapping && param.name in this.currentAction.mapping)) {
+          this.listUuidOpts(param)
+        }
+      }
+      this.actionLoading = false
+      if (action.dataView && ['copy', 'edit', 'share-alt'].includes(action.icon)) {
+        this.fillEditFormFieldValues()
+      }
+    },
+    listUuidOpts (param) {
+      if (this.currentAction.mapping && param.name in this.currentAction.mapping && !this.currentAction.mapping[param.name].api) {
+        return
+      }
+      var paramName = param.name
+      var extractedParamName = paramName.replace('ids', '').replace('id', '').toLowerCase()
+      var params = { listall: true }
+      const possibleName = 'list' + extractedParamName + 's'
+      var possibleApi
+      if (this.currentAction.mapping && param.name in this.currentAction.mapping && this.currentAction.mapping[param.name].api) {
+        possibleApi = this.currentAction.mapping[param.name].api
+        if (this.currentAction.mapping[param.name].params) {
+          const customParams = this.currentAction.mapping[param.name].params(this.resource)
+          if (customParams) {
+            params = { ...params, ...customParams }
+          }
+        }
+      } else if (paramName === 'id') {
+        possibleApi = this.apiName
+      } else {
+        for (const api in store.getters.apis) {
+          if (api.toLowerCase().startsWith(possibleName)) {
+            possibleApi = api
+            break
+          }
+        }
+      }
+      if (!possibleApi) {
+        return
+      }
+      param.loading = true
+      param.opts = []
+      if (possibleApi === 'listTemplates') {
+        params.templatefilter = 'executable'
+      } else if (possibleApi === 'listIsos') {
+        params.isofilter = 'executable'
+      } else if (possibleApi === 'listHosts') {
+        params.type = 'routing'
+      }
+      api(possibleApi, params).then(json => {
+        param.loading = false
+        for (const obj in json) {
+          if (obj.includes('response')) {
+            for (const res in json[obj]) {
+              if (res === 'count') {
+                continue
+              }
+              param.opts = json[obj][res]
+              if (this.currentAction.mapping && this.currentAction.mapping[param.name] && this.currentAction.mapping[param.name].filter) {
+                const filter = this.currentAction.mapping[param.name].filter
+                param.opts = json[obj][res].filter(filter)
+              }
+              if (['listTemplates', 'listIsos'].includes(possibleApi)) {
+                param.opts = [...new Map(param.opts.map(x => [x.id, x])).values()]
+              }
+              break
+            }
+            break
+          }
+        }
+        this.$forceUpdate()
+      }).catch(function (error) {
+        console.log(error)
+        param.loading = false
+      }).then(function () {
+      })
+    },
+    pollActionCompletion (jobId, action, resourceName, showLoading = true) {
+      this.$pollJob({
+        jobId,
+        name: resourceName,
+        successMethod: result => {
+          this.fetchData()
+          if (action.response) {
+            const description = action.response(result.jobresult)
+            if (description) {
+              this.$notification.info({
+                message: this.$t(action.label),
+                description: (<span domPropsInnerHTML={description}></span>),
+                duration: 0
+              })
+            }
+          }
+        },
+        errorMethod: () => this.fetchData(),
+        loadingMessage: `${this.$t(action.label)} - ${resourceName}`,
+        showLoading: showLoading,
+        catchMessage: this.$t('error.fetching.async.job.result'),
+        action
+      })
+    },
+    fillEditFormFieldValues () {
+      const form = this.form
+      this.currentAction.paramFields.map(field => {
+        let fieldValue = null
+        let fieldName = null
+        if (field.type === 'list' || field.name === 'account') {
+          fieldName = field.name.replace('ids', 'name').replace('id', 'name')
+        } else {
+          fieldName = field.name
+        }
+        fieldValue = this.resource[fieldName] ? this.resource[fieldName] : null
+        if (fieldValue) {
+          form.getFieldDecorator(field.name, { initialValue: fieldValue })
+          this.formModel[field.name] = fieldValue
+        }
+      })
+    },
+    handleSubmit (e) {
+      if (!this.dataView && this.currentAction.groupAction && this.selectedRowKeys.length > 0) {
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            this.actionLoading = true
+            const itemsNameMap = {}
+            this.items.map(x => {
+              itemsNameMap[x.id] = x.name || x.displaytext || x.id
+            })
+            const paramsList = this.currentAction.groupMap(this.selectedRowKeys, values)
+            for (const params of paramsList) {
+              var resourceName = itemsNameMap[params.id]
+              // Using a method for this since it's an async call and don't want wrong prarms to be passed
+              this.callGroupApi(params, resourceName)
+            }
+            this.$message.info({
+              content: this.$t(this.currentAction.label),
+              key: this.currentAction.label,
+              duration: 3
+            })
+            setTimeout(() => {
+              this.actionLoading = false
+              this.closeAction()
+              this.fetchData()
+            }, 500)
+          }
+        })
+      } else {
+        this.execSubmit(e)
+      }
+    },
+    callGroupApi (params, resourceName) {
+      const action = this.currentAction
+      api(action.api, params).then(json => {
+        this.handleResponse(json, resourceName, action, false)
+      }).catch(error => {
+        if ([401].includes(error.response.status)) {
+          return
+        }
+        this.$notifyError(error)
+      })
+    },
+    handleResponse (response, resourceName, action, showLoading = true) {
+      for (const obj in response) {
+        if (obj.includes('response')) {
+          if (response[obj].jobid) {
+            const jobid = response[obj].jobid
+            this.$store.dispatch('AddAsyncJob', { title: this.$t(action.label), jobid: jobid, description: resourceName, status: 'progress' })
+            this.pollActionCompletion(jobid, action, resourceName, showLoading)
+            return true
+          } else {
+            var message = action.successMessage ? this.$t(action.successMessage) : this.$t(action.label) +
+              (resourceName ? ' - ' + resourceName : '')
+            var duration = 2
+            if (action.additionalMessage) {
+              message = message + ' - ' + this.$t(action.successMessage)
+              duration = 5
+            }
+            this.$message.success({
+              content: message,
+              key: action.label + resourceName,
+              duration: duration
+            })
+          }
+          break
+        }
+      }
+      return false
+    },
+    execSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        const action = this.currentAction
+        if ('id' in this.resource && action.params.map(i => { return i.name }).includes('id')) {
+          params.id = this.resource.id
+        }
+        for (const key in values) {
+          const input = values[key]
+          for (const param of action.params) {
+            if (param.name !== key) {
+              continue
+            }
+            if (!input === undefined || input === null ||
+              (input === '' && !['updateStoragePool', 'updateHost', 'updatePhysicalNetwork'].includes(action.api))) {
+              if (param.type === 'boolean') {
+                params[key] = false
+              }
+              break
+            }
+            if (action.mapping && key in action.mapping && action.mapping[key].options) {
+              params[key] = action.mapping[key].options[input]
+            } else if (param.type === 'list') {
+              params[key] = input.map(e => { return param.opts[e].id }).reduce((str, name) => { return str + ',' + name })
+            } else if (param.name === 'account' || param.name === 'keypair') {
+              if (['addAccountToProject', 'createAccount'].includes(action.api)) {
+                params[key] = input
+              } else {
+                params[key] = param.opts[input].name
+              }
+            } else {
+              params[key] = input
+            }
+            break
+          }
+        }
+
+        for (const key in action.defaultArgs) {
+          if (!params[key]) {
+            params[key] = action.defaultArgs[key]
+          }
+        }
+
+        if (action.mapping) {
+          for (const key in action.mapping) {
+            if (!action.mapping[key].value) {
+              continue
+            }
+            params[key] = action.mapping[key].value(this.resource, params)
+          }
+        }
+
+        const resourceName = params.displayname || params.displaytext || params.name || params.hostname || params.username ||
+          params.ipaddress || params.virtualmachinename || this.resource.name || this.resource.ipaddress || this.resource.id
+
+        var hasJobId = false
+        this.actionLoading = true
+        let args = null
+        if (action.post) {
+          args = [action.api, {}, 'POST', params]
+        } else {
+          args = [action.api, params]
+        }
+        api(...args).then(json => {
+          hasJobId = this.handleResponse(json, resourceName, action)
+          if ((action.icon === 'delete' || ['archiveEvents', 'archiveAlerts', 'unmanageVirtualMachine'].includes(action.api)) && this.dataView) {
+            this.$router.go(-1)
+          } else {
+            if (!hasJobId) {
+              this.fetchData()
+            }
+          }
+          this.closeAction()
+        }).catch(error => {
+          if ([401].includes(error.response.status)) {
+            return
+          }
+
+          console.log(error)
+          this.$notifyError(error)
+        }).finally(f => {
+          this.actionLoading = false
+        })
+      })
+    },
+    changeFilter (filter) {
+      const query = Object.assign({}, this.$route.query)
+      delete query.templatefilter
+      delete query.isofilter
+      delete query.account
+      delete query.domainid
+      delete query.state
+      if (this.$route.name === 'template') {
+        query.templatefilter = filter
+      } else if (this.$route.name === 'iso') {
+        query.isofilter = filter
+      } else if (this.$route.name === 'guestnetwork') {
+        if (filter === 'all') {
+          delete query.type
+        } else {
+          query.type = filter
+        }
+      } else if (this.$route.name === 'vm') {
+        if (filter === 'self') {
+          query.account = this.$store.getters.userInfo.account
+          query.domainid = this.$store.getters.userInfo.domainid
+        } else if (['running', 'stopped'].includes(filter)) {
+          query.state = filter
+        }
+      }
+      query.filter = filter
+      query.page = 1
+      query.pagesize = this.pageSize
+      this.$router.push({ query })
+    },
+    onSearch (opts) {
+      const query = Object.assign({}, this.$route.query)
+      for (const key in this.searchParams) {
+        delete query[key]
+      }
+      delete query.name
+      delete query.templatetype
+      delete query.keyword
+      delete query.q
+      this.searchParams = {}
+      if (opts && Object.keys(opts).length > 0) {
+        this.searchParams = opts
+        if ('searchQuery' in opts) {
+          const value = opts.searchQuery
+          if (value && value.length > 0) {
+            if (this.$route.name === 'role') {
+              query.name = value
+            } else if (this.$route.name === 'quotaemailtemplate') {
+              query.templatetype = value
+            } else if (this.$route.name === 'globalsetting') {
+              query.name = value
+            } else {
+              query.keyword = value
+            }
+            query.q = value
+          }
+          this.searchParams = {}
+        } else {
+          Object.assign(query, opts)
+        }
+      }
+      query.page = 1
+      query.pagesize = this.pageSize
+      if (JSON.stringify(query) === JSON.stringify(this.$route.query)) {
+        this.fetchData(query)
+        return
+      }
+      this.$router.push({ query })
+    },
+    changePage (page, pageSize) {
+      const query = Object.assign({}, this.$route.query)
+      query.page = page
+      query.pagesize = pageSize
+      this.$router.push({ query })
+    },
+    changePageSize (currentPage, pageSize) {
+      const query = Object.assign({}, this.$route.query)
+      query.page = currentPage
+      query.pagesize = pageSize
+      this.$router.push({ query })
+    },
+    changeResource (resource) {
+      this.resource = resource
+    },
+    start () {
+      this.loading = true
+      this.fetchData()
+      setTimeout(() => {
+        this.loading = false
+        this.selectedRowKeys = []
+      }, 1000)
+    },
+    toggleLoading () {
+      this.loading = !this.loading
+    },
+    startLoading () {
+      this.loading = true
+    },
+    finishLoading () {
+      this.loading = false
+    },
+    handleConfirmBlur (e, name) {
+      if (name !== 'confirmpassword') {
+        return
+      }
+      const value = e.target.value
+      this.confirmDirty = this.confirmDirty || !!value
+    },
+    validateTwoPassword (rule, value, callback) {
+      if (!value || value.length === 0) {
+        callback()
+      } else if (rule.field === 'confirmpassword') {
+        const form = this.form
+        const messageConfirm = this.$t('message.validate.equalto')
+        const passwordVal = form.getFieldValue('password')
+        if (passwordVal && passwordVal !== value) {
+          callback(messageConfirm)
+        } else {
+          callback()
+        }
+      } else if (rule.field === 'password') {
+        const form = this.form
+        const confirmPasswordVal = form.getFieldValue('confirmpassword')
+        if (!confirmPasswordVal || confirmPasswordVal.length === 0) {
+          callback()
+        } else if (value && this.confirmDirty) {
+          form.validateFields(['confirmpassword'], { force: true })
+          callback()
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+.breadcrumb-card {
+  margin-left: -24px;
+  margin-right: -24px;
+  margin-top: -16px;
+  margin-bottom: 12px;
+}
+
+.row-element {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+
+.ant-breadcrumb {
+  vertical-align: text-bottom;
+}
+</style>
diff --git a/ui/src/views/auth/Login.vue b/ui/src/views/auth/Login.vue
new file mode 100644
index 0000000..a43b611
--- /dev/null
+++ b/ui/src/views/auth/Login.vue
@@ -0,0 +1,272 @@
+// 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>
+  <a-form
+    id="formLogin"
+    class="user-layout-login"
+    ref="formLogin"
+    :form="form"
+    @submit="handleSubmit"
+  >
+    <a-tabs
+      :activeKey="customActiveKey"
+      size="large"
+      :tabBarStyle="{ textAlign: 'center', borderBottom: 'unset' }"
+      @change="handleTabClick"
+      :animated="false"
+    >
+      <a-tab-pane key="cs">
+        <span slot="tab">
+          <a-icon type="safety" />
+          {{ $t('label.login.portal') }}
+        </span>
+        <a-form-item>
+          <a-input
+            size="large"
+            type="text"
+            autoFocus
+            :placeholder="$t('label.username')"
+            v-decorator="[
+              'username',
+              {rules: [{ required: true, message: $t('message.error.username') }, { validator: handleUsernameOrEmail }], validateTrigger: 'change'}
+            ]"
+          >
+            <a-icon slot="prefix" type="user" :style="{ color: 'rgba(0,0,0,.25)' }"/>
+          </a-input>
+        </a-form-item>
+
+        <a-form-item>
+          <a-input-password
+            size="large"
+            type="password"
+            autocomplete="false"
+            :placeholder="$t('label.password')"
+            v-decorator="[
+              'password',
+              {rules: [{ required: true, message: $t('message.error.password') }], validateTrigger: 'blur'}
+            ]"
+          >
+            <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
+          </a-input-password>
+        </a-form-item>
+
+        <a-form-item>
+          <a-input
+            size="large"
+            type="text"
+            :placeholder="$t('label.domain')"
+            v-decorator="[
+              'domain',
+              {rules: [{ required: false, message: $t('message.error.domain') }], validateTrigger: 'change'}
+            ]"
+          >
+            <a-icon slot="prefix" type="block" :style="{ color: 'rgba(0,0,0,.25)' }"/>
+          </a-input>
+        </a-form-item>
+
+      </a-tab-pane>
+      <a-tab-pane key="saml" :disabled="idps.length === 0">
+        <span slot="tab">
+          <a-icon type="audit" />
+          {{ $t('label.login.single.signon') }}
+        </span>
+        <a-form-item>
+          <a-select v-decorator="['idp', { initialValue: selectedIdp } ]">
+            <a-select-option v-for="(idp, idx) in idps" :key="idx" :value="idp.id">
+              {{ idp.orgName }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-tab-pane>
+    </a-tabs>
+
+    <a-form-item>
+      <a-button
+        size="large"
+        type="primary"
+        htmlType="submit"
+        class="login-button"
+        :loading="state.loginBtn"
+        :disabled="state.loginBtn"
+      >{{ $t('label.login') }}</a-button>
+    </a-form-item>
+    <translation-menu/>
+  </a-form>
+</template>
+
+<script>
+import { api } from '@/api'
+import { mapActions } from 'vuex'
+import TranslationMenu from '@/components/header/TranslationMenu'
+
+export default {
+  components: {
+    TranslationMenu
+  },
+  data () {
+    return {
+      idps: [],
+      selectedIdp: '',
+      customActiveKey: 'cs',
+      loginBtn: false,
+      loginType: 0,
+      form: this.$form.createForm(this),
+      state: {
+        time: 60,
+        loginBtn: false,
+        loginType: 0
+      }
+    }
+  },
+  created () {
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    ...mapActions(['Login', 'Logout']),
+    fetchData () {
+      api('listIdps').then(response => {
+        if (response) {
+          this.idps = response.listidpsresponse.idp || []
+          this.selectedIdp = this.idps[0].id || ''
+        }
+      })
+    },
+    // handler
+    handleUsernameOrEmail (rule, value, callback) {
+      const { state } = this
+      const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
+      if (regex.test(value)) {
+        state.loginType = 0
+      } else {
+        state.loginType = 1
+      }
+      callback()
+    },
+    handleTabClick (key) {
+      this.customActiveKey = key
+      // this.form.resetFields()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      const {
+        form: { validateFields },
+        state,
+        customActiveKey,
+        Login
+      } = this
+
+      state.loginBtn = true
+
+      const validateFieldsKey = customActiveKey === 'cs' ? ['username', 'password', 'domain'] : ['idp']
+
+      validateFields(validateFieldsKey, { force: true }, (err, values) => {
+        if (!err) {
+          if (customActiveKey === 'cs') {
+            const loginParams = { ...values }
+            delete loginParams.username
+            loginParams[!state.loginType ? 'email' : 'username'] = values.username
+            loginParams.password = values.password
+            loginParams.domain = values.domain
+            if (!loginParams.domain) {
+              loginParams.domain = '/'
+            }
+            Login(loginParams)
+              .then((res) => this.loginSuccess(res))
+              .catch(err => this.requestFailed(err))
+              .finally(() => {
+                state.loginBtn = false
+              })
+          } else if (customActiveKey === 'saml') {
+            state.loginBtn = false
+            var samlUrl = this.$config.apiBase + '?command=samlSso'
+            if (values.idp) {
+              samlUrl += ('&idpid=' + values.idp)
+            }
+            window.location.href = samlUrl
+          }
+        } else {
+          setTimeout(() => {
+            state.loginBtn = false
+          }, 600)
+        }
+      })
+    },
+    loginSuccess (res) {
+      this.$router.push({ path: '/dashboard' }).catch(() => {})
+    },
+    requestFailed (err) {
+      if (err && err.response && err.response.data && err.response.data.loginresponse) {
+        const error = err.response.data.loginresponse.errorcode + ': ' + err.response.data.loginresponse.errortext
+        this.$message.error(`${this.$t('label.error')} ${error}`)
+      } else {
+        this.$message.error(this.$t('message.login.failed'))
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.user-layout-login {
+  min-width: 260px;
+  width: 368px;
+  margin: 0 auto;
+
+  .mobile & {
+    max-width: 368px;
+    width: 98%;
+  }
+
+  label {
+    font-size: 14px;
+  }
+
+  button.login-button {
+    margin-top: 8px;
+    padding: 0 15px;
+    font-size: 16px;
+    height: 40px;
+    width: 100%;
+  }
+
+  .user-login-other {
+    text-align: left;
+    margin-top: 24px;
+    line-height: 22px;
+
+    .item-icon {
+      font-size: 24px;
+      color: rgba(0, 0, 0, 0.2);
+      margin-left: 16px;
+      vertical-align: middle;
+      cursor: pointer;
+      transition: color 0.3s;
+
+      &:hover {
+        color: #1890ff;
+      }
+    }
+
+    .register {
+      float: right;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/compute/AssignInstance.vue b/ui/src/views/compute/AssignInstance.vue
new file mode 100644
index 0000000..543a43b
--- /dev/null
+++ b/ui/src/views/compute/AssignInstance.vue
@@ -0,0 +1,270 @@
+// 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>
+    <p v-html="$t('message.assign.instance.another')"></p>
+
+    <div class="form">
+
+      <div v-if="loading" class="loading">
+        <a-icon type="loading" style="color: #1890ff;"></a-icon>
+      </div>
+
+      <div class="form__item">
+        <p class="form__label">{{ $t('label.accounttype') }}</p>
+        <a-select v-model="selectedAccountType" defaultValue="account">
+          <a-select-option :value="$t('label.account')">{{ $t('label.account') }}</a-select-option>
+          <a-select-option :value="$t('label.project')">{{ $t('label.project') }}</a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <p class="form__label"><span class="required">*</span>{{ $t('label.domain') }}</p>
+        <a-select @change="changeDomain" v-model="selectedDomain" :defaultValue="selectedDomain">
+          <a-select-option v-for="domain in domains" :key="domain.name" :value="domain.id">
+            {{ domain.path }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <template v-if="selectedAccountType === 'Account'">
+        <div class="form__item">
+          <p class="form__label"><span class="required">*</span>{{ $t('label.account') }}</p>
+          <a-select @change="changeAccount" v-model="selectedAccount">
+            <a-select-option v-for="account in accounts" :key="account.name" :value="account.name">
+              {{ account.name }}
+            </a-select-option>
+          </a-select>
+          <span v-if="accountError" class="required">{{ $t('label.required') }}</span>
+        </div>
+      </template>
+
+      <template v-else>
+        <div class="form__item">
+          <p class="form__label"><span class="required">*</span>{{ $t('label.project') }}</p>
+          <a-select @change="changeProject" v-model="selectedProject">
+            <a-select-option v-for="project in projects" :key="project.id" :value="project.id">
+              {{ project.name }}
+            </a-select-option>
+          </a-select>
+          <span v-if="projectError" class="required">{{ $t('label.required') }}</span>
+        </div>
+      </template>
+
+      <div class="form__item">
+        <p class="form__label">{{ $t('label.network') }}</p>
+        <a-select v-model="selectedNetwork">
+          <a-select-option v-for="network in networks" :key="network.id" :value="network.id">
+            {{ network.name ? network.name : '-' }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <a-button type="primary" class="submit-btn" @click="submitData">
+        {{ $t('label.submit') }}
+      </a-button>
+
+    </div>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AssignInstance',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      domains: [],
+      accounts: [],
+      projects: [],
+      networks: [],
+      selectedAccountType: 'Account',
+      selectedDomain: null,
+      selectedAccount: null,
+      selectedProject: null,
+      selectedNetwork: null,
+      accountError: false,
+      projectError: false,
+      loading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listDomains', {
+        response: 'json',
+        listAll: true,
+        details: 'min'
+      }).then(response => {
+        this.domains = response.listdomainsresponse.domain
+        this.selectedDomain = this.domains[0].id
+        this.fetchAccounts()
+        this.fetchProjects()
+      })
+    },
+    fetchAccounts () {
+      this.loading = true
+      api('listAccounts', {
+        response: 'json',
+        domainId: this.selectedDomain,
+        state: 'Enabled',
+        listAll: true
+      }).then(response => {
+        this.accounts = response.listaccountsresponse.account
+        this.loading = false
+      })
+    },
+    fetchProjects () {
+      this.loading = true
+      api('listProjects', {
+        response: 'json',
+        domainId: this.selectedDomain,
+        state: 'Active',
+        details: 'min',
+        listAll: true
+      }).then(response => {
+        this.projects = response.listprojectsresponse.project
+        this.loading = false
+      })
+    },
+    fetchNetworks () {
+      this.loading = true
+      api('listNetworks', {
+        response: 'json',
+        domainId: this.selectedDomain,
+        listAll: true,
+        isrecursive: false,
+        account: this.selectedAccount,
+        projectid: this.selectedProject
+      }).then(response => {
+        this.networks = response.listnetworksresponse.network
+        this.loading = false
+      })
+    },
+    changeDomain () {
+      this.selectedAccount = null
+      this.fetchAccounts()
+      this.fetchProjects()
+    },
+    changeAccount () {
+      this.selectedProject = null
+      this.fetchNetworks()
+    },
+    changeProject () {
+      this.selectedAccount = null
+      this.fetchNetworks()
+    },
+    submitData () {
+      let variableKey = ''
+      let variableValue = ''
+
+      if (this.selectedAccountType === 'Account') {
+        if (!this.selectedAccount) {
+          this.accountError = true
+          return
+        }
+        variableKey = 'account'
+        variableValue = this.selectedAccount
+      } else if (this.selectedAccountType === 'Project') {
+        if (!this.selectedProject) {
+          this.projectError = true
+          return
+        }
+        variableKey = 'projectid'
+        variableValue = this.selectedProject
+      }
+
+      this.loading = true
+      api('assignVirtualMachine', {
+        response: 'json',
+        virtualmachineid: this.resource.id,
+        domainid: this.selectedDomain,
+        [variableKey]: variableValue,
+        networkids: this.selectedNetwork
+      }).then(response => {
+        this.$notification.success({
+          message: this.$t('label.loadbalancerinstance')
+        })
+        this.$parent.$parent.close()
+        this.parentFetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+    display: flex;
+    flex-direction: column;
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      margin-bottom: 10px;
+    }
+
+    &__label {
+      display: flex;
+      font-weight: bold;
+      margin-bottom: 5px;
+    }
+
+  }
+
+  .submit-btn {
+    margin-top: 10px;
+    align-self: flex-end;
+  }
+
+  .required {
+    margin-right: 2px;
+    color: red;
+    font-size: 0.7rem;
+  }
+
+  .loading {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 3rem;
+  }
+</style>
diff --git a/ui/src/views/compute/AttachIso.vue b/ui/src/views/compute/AttachIso.vue
new file mode 100644
index 0000000..9472011
--- /dev/null
+++ b/ui/src/views/compute/AttachIso.vue
@@ -0,0 +1,167 @@
+// 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"
+        layout="vertical">
+        <a-form-item :label="$t('label.iso.name')">
+          <a-select
+            :loading="loading"
+            v-decorator="['id', {
+              initialValue: this.selectedIso,
+              rules: [{ required: true, message: `${this.$t('label.required')}`}]
+            }]" >
+            <a-select-option v-for="iso in isos" :key="iso.id">
+              {{ iso.displaytext || iso.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+import _ from 'lodash'
+
+export default {
+  name: 'AttachIso',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      loading: false,
+      selectedIso: '',
+      isos: []
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const isoFiters = ['featured', 'community', 'selfexecutable']
+      this.loading = true
+      const promises = []
+      isoFiters.forEach((filter) => {
+        promises.push(this.fetchIsos(filter))
+      })
+      Promise.all(promises).then(() => {
+        this.isos = _.uniqBy(this.isos, 'id')
+        if (this.isos.length > 0) {
+          this.selectedIso = this.isos[0].id
+        }
+      }).catch((error) => {
+        console.log(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchIsos (isoFilter) {
+      const params = {
+        listall: true,
+        zoneid: this.resource.zoneid,
+        isready: true,
+        isofilter: isoFilter
+      }
+      return new Promise((resolve, reject) => {
+        api('listIsos', params).then((response) => {
+          const isos = response.listisosresponse.iso || []
+          this.isos.push(...isos)
+          resolve(response)
+        }).catch((error) => {
+          reject(error)
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {
+          id: values.id,
+          virtualmachineid: this.resource.id
+        }
+        this.loading = true
+        const title = this.$t('label.action.attach.iso')
+        api('attachIso', params).then(json => {
+          const jobId = json.attachisoresponse.jobid
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                this.$store.dispatch('AddAsyncJob', {
+                  title: title,
+                  jobid: jobId,
+                  status: this.$t('progress')
+                })
+                this.parentFetchData()
+              },
+              successMessage: `${this.$t('label.action.attach.iso')} ${this.$t('label.success')}`,
+              loadingMessage: `${title} ${this.$t('label.in.progress')}`,
+              catchMessage: this.$t('error.fetching.async.job.result')
+            })
+          }
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 80vw;
+  @media (min-width: 700px) {
+    width: 600px;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/compute/BackupScheduleWizard.vue b/ui/src/views/compute/BackupScheduleWizard.vue
new file mode 100644
index 0000000..eac8995
--- /dev/null
+++ b/ui/src/views/compute/BackupScheduleWizard.vue
@@ -0,0 +1,95 @@
+// 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="backup-layout">
+    <a-tabs defaultActiveKey="1" :animated="false">
+      <a-tab-pane :tab="$t('label.schedule')" key="1">
+        <FormSchedule
+          :loading="loading"
+          :resource="resource"
+          :dataSource="dataSource"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.scheduled.backups')" key="2">
+        <BackupSchedule
+          :loading="loading"
+          :resource="resource"
+          :dataSource="dataSource" />
+      </a-tab-pane>
+    </a-tabs>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import FormSchedule from '@views/compute/backup/FormSchedule'
+import BackupSchedule from '@views/compute/backup/BackupSchedule'
+
+export default {
+  name: 'BackupScheduleWizard',
+  components: {
+    FormSchedule,
+    BackupSchedule
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      dataSource: {}
+    }
+  },
+  provide () {
+    return {
+      refreshSchedule: this.fetchData,
+      closeSchedule: this.closeAction
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      this.dataSource = {}
+      this.loading = true
+      params.virtualmachineid = this.resource.id
+      api('listBackupSchedule', params).then(json => {
+        this.dataSource = json.listbackupscheduleresponse.backupschedule || {}
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .backup-layout {
+    width: 80vw;
+    @media (min-width: 800px) {
+      width: 600px;
+    }
+  }
+</style>
diff --git a/ui/src/views/compute/ChangeAffinity.vue b/ui/src/views/compute/ChangeAffinity.vue
new file mode 100644
index 0000000..9482ccf
--- /dev/null
+++ b/ui/src/views/compute/ChangeAffinity.vue
@@ -0,0 +1,180 @@
+// 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>
+  <a-form class="form">
+
+    <p v-html="$t('message.select.affinity.groups')" />
+
+    <div v-if="loading" class="loading">
+      <a-icon type="loading" style="color: #1890ff;" />
+    </div>
+
+    <div class="form__item">
+      <a-input-search
+        style="margin-bottom: 10px;"
+        :placeholder="$t('label.search')"
+        v-model="filter"
+        @search="handleSearch" />
+    </div>
+
+    <div class="form__item">
+      <a-table
+        size="small"
+        :loading="loading"
+        :columns="columns"
+        :dataSource="items"
+        :rowKey="record => record.id || record.name"
+        :pagination="{showSizeChanger: true, total: total}"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange"
+        @handle-search-filter="handleTableChange"
+        style="overflow-y: auto"/>
+    </div>
+
+    <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>
+</template>
+
+<script>
+import { api } from '@/api'
+import { genericCompare } from '@/utils/sort.js'
+
+export default {
+  name: 'ChangeAffinity',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      items: [],
+      total: 0,
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.name'),
+          sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+        },
+        {
+          dataIndex: 'type',
+          title: this.$t('label.type'),
+          sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+        },
+        {
+          dataIndex: 'description',
+          title: this.$t('label.description'),
+          sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+        }
+      ],
+      selectedRowKeys: [],
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: ''
+      },
+      filter: '',
+      loading: false
+    }
+  },
+  mounted () {
+    for (const group of this.resource.affinitygroup) {
+      this.selectedRowKeys.push(group.id)
+    }
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      this.items = []
+      this.total = 0
+      api('listAffinityGroups', {
+        keyword: this.options.keyword,
+        domainid: this.resource.domainid,
+        accountid: this.resource.accountid,
+        page: this.options.page,
+        pageSize: this.options.pageSize,
+        response: 'json'
+      }).then(response => {
+        this.total = response.listaffinitygroupsresponse.count
+        if (this.total !== 0) {
+          this.items = response.listaffinitygroupsresponse.affinitygroup
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    onSelectChange (selectedRowKeys) {
+      this.selectedRowKeys = selectedRowKeys
+    },
+    handleSearch (keyword) {
+      this.filter = keyword
+      this.options.keyword = keyword
+      this.fetchData()
+    },
+    handleTableChange (pagination) {
+      this.options.page = pagination.current
+      this.options.pageSize = pagination.pageSize
+      this.fetchData()
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    handleSubmit () {
+      this.loading = true
+      api('updateVMAffinityGroup', {
+        id: this.resource.id,
+        affinitygroupids: this.selectedRowKeys.join(',')
+      }).then(response => {
+        this.$notification.success({
+          message: this.$t('message.success.change.affinity.group')
+        })
+        this.$parent.$parent.close()
+        this.parentFetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.form {
+  width: 90vw;
+  @media (min-width: 800px) {
+    width: 45vw;
+  }
+}
+
+.action-button {
+  text-align: right;
+  margin-top: 10px;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/compute/CreateKubernetesCluster.vue b/ui/src/views/compute/CreateKubernetesCluster.vue
new file mode 100644
index 0000000..9759a5d
--- /dev/null
+++ b/ui/src/views/compute/CreateKubernetesCluster.vue
@@ -0,0 +1,586 @@
+// 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.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.kubecluster.name') }]
+            }]"
+            :placeholder="apiParams.name.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.description') }}
+            <a-tooltip :title="apiParams.description.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['description', {
+              rules: [{ required: true, message: $t('message.error.cluster.description') }]
+            }]"
+            :placeholder="apiParams.description.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            v-decorator="['zoneid', {
+              rules: [{ required: true, message: $t('message.error.zone.for.cluster') }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="apiParams.zoneid.description"
+            @change="val => { this.handleZoneChange(this.zones[val]) }">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.kubernetesversionid') }}
+            <a-tooltip :title="apiParams.kubernetesversionid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="version-selection"
+            v-decorator="['kubernetesversionid', {
+              rules: [{ required: true, message: $t('message.error.version.for.cluster') }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="kubernetesVersionLoading"
+            :placeholder="apiParams.kubernetesversionid.description"
+            @change="val => { this.handleKubernetesVersionChange(this.kubernetesVersions[val]) }">
+            <a-select-option v-for="(opt, optIndex) in this.kubernetesVersions" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.serviceofferingid') }}
+            <a-tooltip :title="apiParams.serviceofferingid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="offering-selection"
+            v-decorator="['serviceofferingid', {
+              rules: [{ required: true, message: $t('message.error.serviceoffering.for.cluster') }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="serviceOfferingLoading"
+            :placeholder="apiParams.serviceofferingid.description">
+            <a-select-option v-for="(opt, optIndex) in this.serviceOfferings" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.noderootdisksize') }}
+            <a-tooltip :title="apiParams.noderootdisksize.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['noderootdisksize', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.validate.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="apiParams.noderootdisksize.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.networkid') }}
+            <a-tooltip :title="apiParams.networkid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="network-selection"
+            v-decorator="['networkid', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="networkLoading"
+            :placeholder="apiParams.networkid.description">
+            <a-select-option v-for="(opt, optIndex) in this.networks" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.haenable')" v-if="this.selectedKubernetesVersion != null && this.selectedKubernetesVersion != undefined && this.selectedKubernetesVersion.supportsha === true">
+          <a-switch v-decorator="['haenable', {initialValue: this.haEnabled}]" :checked="this.haEnabled" @change="val => { this.haEnabled = val }" />
+        </a-form-item>
+        <a-form-item v-if="this.haEnabled">
+          <span slot="label">
+            {{ $t('label.masternodes') }}
+            <a-tooltip :title="apiParams.masternodes.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['masternodes', {
+              initialValue: '2',
+              rules: [{ required: true, message: $t('message.error.input.value') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value < 2)) {
+                            callback(this.$t('message.validate.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="apiParams.masternodes.description"/>
+        </a-form-item>
+        <a-form-item v-if="this.haEnabled">
+          <span slot="label">
+            {{ $t('label.externalloadbalanceripaddress') }}
+            <a-tooltip :title="apiParams.externalloadbalanceripaddress.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['externalloadbalanceripaddress', {}]"
+            :placeholder="apiParams.externalloadbalanceripaddress.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.cks.cluster.size') }}
+            <a-tooltip :title="apiParams.size.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['size', {
+              initialValue: '1',
+              rules: [{ required: true, message: $t('message.error.size.for.cluster') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.validate.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="apiParams.size.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.keypair') }}
+            <a-tooltip :title="apiParams.keypair.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="keypair-selection"
+            v-decorator="['keypair', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="keyPairLoading"
+            :placeholder="apiParams.keypair.description">
+            <a-select-option v-for="(opt, optIndex) in this.keyPairs" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div v-if="$store.getters.features.kubernetesclusterexperimentalfeaturesenabled">
+          <a-form-item :label="$t('label.private.registry')">
+            <a-switch v-decorator="['privateregistry']" @change="checked => { this.usePrivateRegistry = checked }" />
+          </a-form-item>
+          <div v-if="usePrivateRegistry">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.username') }}
+                <a-tooltip :title="apiParams.dockerregistryusername.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['dockerregistryusername', {
+                  rules: [{ required: true, message: $t('label.required') }]
+                }]"
+                :placeholder="apiParams.dockerregistryusername.description"/>
+            </a-form-item>
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.password') }}
+                <a-tooltip :title="apiParams.dockerregistrypassword.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input-password
+                v-decorator="['dockerregistrypassword', {
+                  rules: [{ required: true, message: $t('label.required') }]
+                }]"
+                :placeholder="apiParams.dockerregistrypassword.description"/>
+            </a-form-item>
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.url') }}
+                <a-tooltip :title="apiParams.dockerregistryurl.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['dockerregistryurl', {
+                  rules: [{ required: true, message: $t('label.required') }]
+                }]"
+                :placeholder="apiParams.dockerregistryurl.description"/>
+            </a-form-item>
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.email') }}
+                <a-tooltip :title="apiParams.dockerregistryemail.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['dockerregistryemail', {
+                  rules: [{ required: true, message: $t('label.required') }]
+                }]"
+                :placeholder="apiParams.dockerregistryemail.description"/>
+            </a-form-item>
+          </div>
+        </div>
+        <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: 'CreateKubernetesCluster',
+  props: {},
+  data () {
+    return {
+      zones: [],
+      zoneLoading: false,
+      selectedZone: {},
+      kubernetesVersions: [],
+      kubernetesVersionLoading: false,
+      selectedKubernetesVersion: {},
+      serviceOfferings: [],
+      serviceOfferingLoading: false,
+      networks: [],
+      networkLoading: false,
+      keyPairs: [],
+      keyPairLoading: false,
+      haEnabled: false,
+      usePrivateRegistry: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createKubernetesCluster || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.networks = [
+      {
+        id: null,
+        name: ''
+      }
+    ]
+    this.keyPairs = [
+      {
+        id: null,
+        name: ''
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZoneData()
+      this.fetchNetworkData()
+      this.fetchKeyPairData()
+    },
+    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)
+    },
+    fetchZoneData () {
+      const params = {}
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+        if (this.arrayHasItems(this.zones)) {
+          this.form.setFieldsValue({
+            zoneid: 0
+          })
+          this.handleZoneChange(this.zones[0])
+        }
+      })
+    },
+    handleZoneChange (zone) {
+      this.selectedZone = zone
+      this.fetchKubernetesVersionData()
+    },
+    fetchKubernetesVersionData () {
+      this.kubernetesVersions = []
+      const params = {}
+      if (!this.isObjectEmpty(this.selectedZone)) {
+        params.zoneid = this.selectedZone.id
+      }
+      this.kubernetesVersionLoading = true
+      api('listKubernetesSupportedVersions', params).then(json => {
+        const versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion
+        if (this.arrayHasItems(versionObjs)) {
+          for (var i = 0; i < versionObjs.length; i++) {
+            if (versionObjs[i].state === 'Enabled' && versionObjs[i].isostate === 'Ready') {
+              this.kubernetesVersions.push(versionObjs[i])
+            }
+          }
+        }
+      }).finally(() => {
+        this.kubernetesVersionLoading = false
+        if (this.arrayHasItems(this.kubernetesVersions)) {
+          this.form.setFieldsValue({
+            kubernetesversionid: 0
+          })
+          this.handleKubernetesVersionChange(this.kubernetesVersions[0])
+        }
+      })
+    },
+    handleKubernetesVersionChange (version) {
+      this.selectedKubernetesVersion = version
+      this.fetchServiceOfferingData()
+    },
+    fetchServiceOfferingData () {
+      this.serviceOfferings = []
+      const params = {}
+      this.serviceOfferingLoading = true
+      api('listServiceOfferings', params).then(json => {
+        var items = json.listserviceofferingsresponse.serviceoffering
+        var minCpu = 2
+        var minMemory = 2048
+        if (!this.isObjectEmpty(this.selectedKubernetesVersion)) {
+          minCpu = this.selectedKubernetesVersion.mincpunumber
+          minMemory = this.selectedKubernetesVersion.minmemory
+        }
+        if (items != null) {
+          for (var i = 0; i < items.length; i++) {
+            if (items[i].iscustomized === false &&
+                items[i].cpunumber >= minCpu && items[i].memory >= minMemory) {
+              this.serviceOfferings.push(items[i])
+            }
+          }
+        }
+      }).finally(() => {
+        this.serviceOfferingLoading = false
+        if (this.arrayHasItems(this.serviceOfferings)) {
+          this.form.setFieldsValue({
+            serviceofferingid: 0
+          })
+        }
+      })
+    },
+    fetchNetworkData () {
+      const params = {}
+      this.networkLoading = true
+      api('listNetworks', params).then(json => {
+        const listNetworks = json.listnetworksresponse.network
+        if (this.arrayHasItems(listNetworks)) {
+          this.networks = this.networks.concat(listNetworks)
+        }
+      }).finally(() => {
+        this.networkLoading = false
+        if (this.arrayHasItems(this.networks)) {
+          this.form.setFieldsValue({
+            networkid: 0
+          })
+        }
+      })
+    },
+    fetchKeyPairData () {
+      const params = {}
+      this.keyPairLoading = true
+      api('listSSHKeyPairs', params).then(json => {
+        const listKeyPairs = json.listsshkeypairsresponse.sshkeypair
+        if (this.arrayHasItems(listKeyPairs)) {
+          for (var i = 0; i < listKeyPairs.length; i++) {
+            this.keyPairs.push({
+              id: listKeyPairs[i].name,
+              description: listKeyPairs[i].name
+            })
+          }
+        }
+      }).finally(() => {
+        this.keyPairLoading = false
+        if (this.arrayHasItems(this.keyPairs)) {
+          this.form.setFieldsValue({
+            keypair: 0
+          })
+        }
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          name: values.name,
+          description: values.description,
+          zoneid: this.zones[values.zoneid].id,
+          kubernetesversionid: this.kubernetesVersions[values.kubernetesversionid].id,
+          serviceofferingid: this.serviceOfferings[values.serviceofferingid].id,
+          size: values.size
+        }
+        if (this.isValidValueForKey(values, 'noderootdisksize') && values.noderootdisksize > 0) {
+          params.noderootdisksize = values.noderootdisksize
+        }
+        if (this.isValidValueForKey(values, 'masternodes') && values.masternodes > 0) {
+          params.masternodes = values.masternodes
+        }
+        if (this.isValidValueForKey(values, 'externalloadbalanceripaddress') && values.externalloadbalanceripaddress !== '') {
+          params.externalloadbalanceripaddress = values.externalloadbalanceripaddress
+        }
+        if (this.isValidValueForKey(values, 'networkid') && this.arrayHasItems(this.networks) && this.networks[values.networkid].id != null) {
+          params.networkid = this.networks[values.networkid].id
+        }
+        if (this.isValidValueForKey(values, 'keypair') && this.arrayHasItems(this.keyPairs) && this.keyPairs[values.keypair].id != null) {
+          params.keypair = this.keyPairs[values.keypair].id
+        }
+        if (this.usePrivateRegistry) {
+          params.dockerregistryusername = values.dockerregistryusername
+          params.dockerregistrypassword = values.dockerregistrypassword
+          params.dockerregistryurl = values.dockerregistryurl
+          params.dockerregistryemail = values.dockerregistryemail
+        }
+
+        api('createKubernetesCluster', params).then(json => {
+          const jobId = json.createkubernetesclusterresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.kubernetes.cluster.create'),
+            jobid: jobId,
+            description: values.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            loadingMessage: `${this.$t('label.kubernetes.cluster.create')} ${values.name} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            successMessage: this.$t('message.success.create.kubernetes.cluter') + ' ' + values.name,
+            successMethod: result => {
+              this.$emit('refresh-data')
+            }
+          })
+          this.closeAction()
+          this.$emit('refresh-data')
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/compute/CreateSSHKeyPair.vue b/ui/src/views/compute/CreateSSHKeyPair.vue
new file mode 100644
index 0000000..ba58a0e
--- /dev/null
+++ b/ui/src/views/compute/CreateSSHKeyPair.vue
@@ -0,0 +1,237 @@
+// 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" v-if="!isSubmitted">
+      <p v-html="$t('message.desc.create.ssh.key.pair')"></p>
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item :label="$t('label.name')">
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.name') }]
+            }]"
+            :placeholder="apiParams.name.description"/>
+        </a-form-item>
+        <a-form-item :label="$t('label.publickey')">
+          <a-input
+            v-decorator="['publickey', {}]"
+            :placeholder="apiParams.publickey.description"/>
+        </a-form-item>
+        <a-form-item :label="$t('label.domainid')" v-if="this.isAdminOrDomainAdmin()">
+          <a-select
+            id="domain-selection"
+            v-decorator="['domainid', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="apiParams.domainid.description"
+            @change="val => { this.handleDomainChanged(this.domains[val]) }">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.account')" v-if="this.isAdminOrDomainAdmin() && !this.isObjectEmpty(this.selectedDomain) && this.selectedDomain.id !== null">
+          <a-input
+            v-decorator="['account', {}]"
+            :placeholder="apiParams.account.description"/>
+        </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 v-if="isSubmitted">
+      <p v-html="$t('message.desc.created.ssh.key.pair')"></p>
+      <div :span="24" class="action-button">
+        <a-button @click="notifyCopied" v-clipboard:copy="hiddenElement.innerHTML" type="primary">{{ $t('label.copy.clipboard') }}</a-button>
+        <a-button @click="downloadKey" type="primary">{{ this.$t('label.download') }}</a-button>
+        <a-button @click="closeAction">{{ this.$t('label.close') }}</a-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateSSHKeyPair',
+  props: {},
+  data () {
+    return {
+      domains: [],
+      domainLoading: false,
+      selectedDomain: {},
+      loading: false,
+      isSubmitted: false,
+      hiddenElement: null
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createSSHKeyPair || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+    this.apiConfig = this.$store.getters.apis.registerSSHKeyPair || {}
+    this.apiConfig.params.forEach(param => {
+      if (!(param.name in this.apiParams)) {
+        this.apiParams[param.name] = param
+      }
+    })
+  },
+  created () {
+    this.domains = [
+      {
+        id: null,
+        name: ''
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.isAdminOrDomainAdmin()) {
+        this.fetchDomainData()
+      }
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    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)
+    },
+    fetchDomainData () {
+      const params = {}
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listdomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listdomains)
+      }).finally(() => {
+        this.domainLoading = false
+        if (this.arrayHasItems(this.domains)) {
+          this.form.setFieldsValue({
+            domainid: 0
+          })
+          this.handleDomainChanged(this.domains[0])
+        }
+      })
+    },
+    handleDomainChanged (domain) {
+      this.selectedDomain = domain
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          name: values.name
+        }
+        if (this.isValidValueForKey(values, 'domainid') &&
+          this.arrayHasItems(this.domains) &&
+          this.domains[values.domainid].id !== null) {
+          params.domainid = this.domains[values.domainid].id
+        }
+        if (this.isValidValueForKey(values, 'account') && values.account.length > 0) {
+          params.account = values.account
+        }
+        if (this.isValidValueForKey(values, 'publickey') && values.publickey.length > 0) {
+          params.publickey = values.publickey
+          api('registerSSHKeyPair', params).then(json => {
+            this.$message.success(this.$t('message.success.register.keypair') + ' ' + values.name)
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.$emit('refresh-data')
+            this.loading = false
+            this.closeAction()
+          })
+        } else {
+          api('createSSHKeyPair', params).then(json => {
+            this.$message.success(this.$t('message.success.create.keypair') + ' ' + values.name)
+            if (json.createsshkeypairresponse && json.createsshkeypairresponse.keypair && json.createsshkeypairresponse.keypair.privatekey) {
+              this.isSubmitted = true
+              const key = json.createsshkeypairresponse.keypair.privatekey
+              this.hiddenElement = document.createElement('a')
+              this.hiddenElement.href = 'data:text/plain;charset=utf-8,' + encodeURI(key)
+              this.hiddenElement.innerHTML = key
+              this.hiddenElement.target = '_blank'
+              this.hiddenElement.download = values.name + '.key'
+            }
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.$emit('refresh-data')
+            this.loading = false
+          })
+        }
+      })
+    },
+    downloadKey () {
+      this.hiddenElement.click()
+    },
+    notifyCopied () {
+      this.$notification.info({
+        message: this.$t('message.success.copy.clipboard')
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 600px) {
+      width: 450px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/compute/CreateSnapshotWizard.vue b/ui/src/views/compute/CreateSnapshotWizard.vue
new file mode 100644
index 0000000..bf9d9dd
--- /dev/null
+++ b/ui/src/views/compute/CreateSnapshotWizard.vue
@@ -0,0 +1,201 @@
+// 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" :title="apiParams.volumeid.description">
+            {{ $t('label.volumeid') }}
+            <a-tooltip>
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            showSearch
+            allowClear
+            v-decorator="['volumeid', {
+              rules: [{ required: true, message: $t('message.error.select') }]
+            }]"
+            @change="onChangeVolume"
+            :placeholder="apiParams.volumeid.description">
+            <a-select-option
+              v-for="volume in listVolumes"
+              :key="volume.id">
+              {{ volume.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label" :title="apiParams.name.description">
+            {{ $t('label.name') }}
+            <a-tooltip>
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name']"
+            :placeholder="apiParams.name.description"/>
+        </a-form-item>
+        <a-form-item v-if="isQuiesceVm">
+          <span slot="label" :title="apiParams.quiescevm.description">
+            {{ $t('label.quiescevm') }}
+            <a-tooltip>
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['quiescevm', { initialValue: false }]"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label" :title="apiParams.asyncbackup.description">
+            {{ $t('label.asyncbackup') }}
+            <a-tooltip>
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['asyncbackup', { initialValue: false }]"/>
+        </a-form-item>
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateSnapshotWizard',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      isQuiesceVm: false,
+      listVolumes: []
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createSnapshot || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+
+      api('listVolumes', { virtualMachineId: this.resource.id })
+        .then(json => {
+          this.listVolumes = json.listvolumesresponse.volume || []
+        })
+        .catch(e => {})
+        .finally(() => { this.loading = false })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+
+      this.form.validateFields((err, values) => {
+        if (err) return
+
+        const params = {}
+        params.volumeid = values.volumeid
+        params.name = values.name
+        params.asyncbackup = values.asyncbackup
+        params.quiescevm = values.quiescevm
+
+        const title = this.$t('label.action.vmstoragesnapshot.create')
+        const description = values.name || values.volumeid
+
+        this.loading = true
+
+        api('createSnapshot', params)
+          .then(json => {
+            const jobId = json.createsnapshotresponse.jobid
+            if (jobId) {
+              this.$pollJob({
+                jobId,
+                successMethod: result => {
+                  const volumeId = result.jobresult.snapshot.volumeid
+                  const snapshotId = result.jobresult.snapshot.id
+                  const message = `${this.$t('label.create.snapshot.for.volume')} ${volumeId} ${this.$t('label.with.snapshotid')} ${snapshotId}`
+                  this.$notification.success({
+                    message: message,
+                    duration: 0
+                  })
+                },
+                loadingMessage: `${title} ${this.$t('label.in.progress')}`,
+                catchMessage: this.$t('error.fetching.async.job.result')
+              })
+              this.$store.dispatch('AddAsyncJob', {
+                title: title,
+                jobid: jobId,
+                description: description,
+                status: 'progress'
+              })
+            }
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.loading = false
+            this.closeAction()
+          })
+      })
+    },
+    onChangeVolume (volumeId) {
+      const volumeFilter = this.listVolumes.filter(volume => volume.id === volumeId)
+      if (volumeFilter && volumeFilter.length > 0) {
+        this.isQuiesceVm = volumeFilter[0].quiescevm
+      }
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 80vw;
+  @media (min-width: 600px) {
+    width: 450px;
+  }
+}
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/compute/DeployVM.vue b/ui/src/views/compute/DeployVM.vue
new file mode 100644
index 0000000..bee2a38
--- /dev/null
+++ b/ui/src/views/compute/DeployVM.vue
@@ -0,0 +1,2015 @@
+// 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>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="17">
+        <a-card :bordered="true" :title="this.$t('label.newinstance')">
+          <a-form
+            :form="form"
+            @submit="handleSubmit"
+            layout="vertical"
+          >
+            <a-steps direction="vertical" size="small">
+              <a-step :title="this.$t('label.select.deployment.infrastructure')" status="process">
+                <template slot="description">
+                  <div style="margin-top: 15px">
+                    <span>{{ $t('message.select.a.zone') }}</span><br/>
+                    <a-form-item :label="this.$t('label.zoneid')">
+                      <a-select
+                        v-decorator="['zoneid', {
+                          rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+                        }]"
+                        showSearch
+                        optionFilterProp="children"
+                        :filterOption="filterOption"
+                        :options="zoneSelectOptions"
+                        @change="onSelectZoneId"
+                        :loading="loading.zones"
+                      ></a-select>
+                    </a-form-item>
+                    <a-form-item
+                      v-if="!isNormalAndDomainUser"
+                      :label="this.$t('label.podid')">
+                      <a-select
+                        v-decorator="['podid']"
+                        showSearch
+                        optionFilterProp="children"
+                        :filterOption="filterOption"
+                        :options="podSelectOptions"
+                        :loading="loading.pods"
+                        @change="onSelectPodId"
+                      ></a-select>
+                    </a-form-item>
+                    <a-form-item
+                      v-if="!isNormalAndDomainUser"
+                      :label="this.$t('label.clusterid')">
+                      <a-select
+                        v-decorator="['clusterid']"
+                        showSearch
+                        optionFilterProp="children"
+                        :filterOption="filterOption"
+                        :options="clusterSelectOptions"
+                        :loading="loading.clusters"
+                        @change="onSelectClusterId"
+                      ></a-select>
+                    </a-form-item>
+                    <a-form-item
+                      v-if="!isNormalAndDomainUser"
+                      :label="this.$t('label.hostid')">
+                      <a-select
+                        v-decorator="['hostid']"
+                        showSearch
+                        optionFilterProp="children"
+                        :filterOption="filterOption"
+                        :options="hostSelectOptions"
+                        :loading="loading.hosts"
+                      ></a-select>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="this.$t('label.templateiso')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description">
+                  <div v-if="zoneSelected" style="margin-top: 15px">
+                    <a-card
+                      :tabList="tabList"
+                      :activeTabKey="tabKey"
+                      @tabChange="key => onTabChange(key, 'tabKey')">
+                      <p v-if="tabKey === 'templateid'">
+                        {{ $t('message.template.desc') }}
+                        <template-iso-selection
+                          input-decorator="templateid"
+                          :items="options.templates"
+                          :selected="tabKey"
+                          :loading="loading.templates"
+                          :preFillContent="dataPreFill"
+                          @handle-search-filter="($event) => fetchAllTemplates($event)"
+                          @update-template-iso="updateFieldValue" />
+                        <span>
+                          {{ $t('label.override.rootdisk.size') }}
+                          <a-switch @change="val => { this.showRootDiskSizeChanger = val }" style="margin-left: 10px;"/>
+                        </span>
+                        <disk-size-selection
+                          v-show="showRootDiskSizeChanger"
+                          input-decorator="rootdisksize"
+                          :preFillContent="dataPreFill"
+                          :minDiskSize="dataPreFill.minrootdisksize"
+                          @update-disk-size="updateFieldValue"
+                          style="margin-top: 10px;"/>
+                      </p>
+                      <p v-else>
+                        {{ $t('message.iso.desc') }}
+                        <template-iso-selection
+                          input-decorator="isoid"
+                          :items="options.isos"
+                          :selected="tabKey"
+                          :loading="loading.isos"
+                          :preFillContent="dataPreFill"
+                          @handle-search-filter="($event) => fetchAllIsos($event)"
+                          @update-template-iso="updateFieldValue" />
+                        <a-form-item :label="this.$t('label.hypervisor')">
+                          <a-select
+                            v-decorator="['hypervisor', {
+                              initialValue: hypervisorSelectOptions && hypervisorSelectOptions.length > 0
+                                ? hypervisorSelectOptions[0].value
+                                : null,
+                              rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+                            }]"
+                            :options="hypervisorSelectOptions"
+                            @change="value => this.hypervisor = value" />
+                        </a-form-item>
+                      </p>
+                    </a-card>
+                    <a-form-item class="form-item-hidden">
+                      <a-input v-decorator="['templateid']"/>
+                    </a-form-item>
+                    <a-form-item class="form-item-hidden">
+                      <a-input v-decorator="['isoid']"/>
+                    </a-form-item>
+                    <a-form-item class="form-item-hidden">
+                      <a-input v-decorator="['rootdisksize']"/>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="this.$t('label.serviceofferingid')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description">
+                  <div v-if="zoneSelected">
+                    <a-form-item v-if="zoneSelected && templateConfigurationExists">
+                      <span slot="label">
+                        {{ $t('label.configuration') }}
+                        <a-tooltip :title="$t('message.ovf.configurations')">
+                          <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                        </a-tooltip>
+                      </span>
+                      <a-select
+                        showSearch
+                        optionFilterProp="children"
+                        v-decorator="[
+                          'templateConfiguration'
+                        ]"
+                        defaultActiveFirstOption
+                        :placeholder="$t('label.configuration')"
+                        :filterOption="(input, option) => {
+                          return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                        }"
+                        @change="onSelectTemplateConfigurationId"
+                      >
+                        <a-select-option v-for="opt in templateConfigurations" :key="opt.id">
+                          {{ opt.name || opt.description }}
+                        </a-select-option>
+                      </a-select>
+                      <span v-if="selectedTemplateConfiguration && selectedTemplateConfiguration.description">{{ selectedTemplateConfiguration.description }}</span>
+                    </a-form-item>
+                    <compute-offering-selection
+                      :compute-items="options.serviceOfferings"
+                      :row-count="rowCount.serviceOfferings"
+                      :zoneId="zoneId"
+                      :value="serviceOffering ? serviceOffering.id : ''"
+                      :loading="loading.serviceOfferings"
+                      :preFillContent="dataPreFill"
+                      :minimum-cpunumber="templateConfigurationExists && selectedTemplateConfiguration && selectedTemplateConfiguration.cpunumber ? selectedTemplateConfiguration.cpunumber : 0"
+                      :minimum-cpuspeed="templateConfigurationExists && selectedTemplateConfiguration && selectedTemplateConfiguration.cpuspeed ? selectedTemplateConfiguration.cpuspeed : 0"
+                      :minimum-memory="templateConfigurationExists && selectedTemplateConfiguration && selectedTemplateConfiguration.memory ? selectedTemplateConfiguration.memory : 0"
+                      @select-compute-item="($event) => updateComputeOffering($event)"
+                      @handle-search-filter="($event) => handleSearchFilter('serviceOfferings', $event)"
+                    ></compute-offering-selection>
+                    <compute-selection
+                      v-if="serviceOffering && serviceOffering.iscustomized"
+                      cpunumber-input-decorator="cpunumber"
+                      cpuspeed-input-decorator="cpuspeed"
+                      memory-input-decorator="memory"
+                      :preFillContent="dataPreFill"
+                      :computeOfferingId="instanceConfig.computeofferingid"
+                      :isConstrained="'serviceofferingdetails' in serviceOffering"
+                      :minCpu="'serviceofferingdetails' in serviceOffering ? serviceOffering.serviceofferingdetails.mincpunumber*1 : 0"
+                      :maxCpu="'serviceofferingdetails' in serviceOffering ? serviceOffering.serviceofferingdetails.maxcpunumber*1 : Number.MAX_SAFE_INTEGER"
+                      :minMemory="'serviceofferingdetails' in serviceOffering ? serviceOffering.serviceofferingdetails.minmemory*1 : 0"
+                      :maxMemory="'serviceofferingdetails' in serviceOffering ? serviceOffering.serviceofferingdetails.maxmemory*1 : Number.MAX_SAFE_INTEGER"
+                      @update-compute-cpunumber="updateFieldValue"
+                      @update-compute-cpuspeed="updateFieldValue"
+                      @update-compute-memory="updateFieldValue" />
+                    <span v-if="serviceOffering && serviceOffering.iscustomized">
+                      <a-form-item class="form-item-hidden">
+                        <a-input v-decorator="['cpunumber']"/>
+                      </a-form-item>
+                      <a-form-item
+                        class="form-item-hidden"
+                        v-if="(serviceOffering && !(serviceOffering.cpuspeed > 0))">
+                        <a-input v-decorator="['cpuspeed']"/>
+                      </a-form-item>
+                      <a-form-item class="form-item-hidden">
+                        <a-input v-decorator="['memory']"/>
+                      </a-form-item>
+                    </span>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="$t('label.data.disk')"
+                :status="zoneSelected ? 'process' : 'wait'"
+                v-if="!template.deployasis && template.childtemplates && template.childtemplates.length > 0" >
+                <template slot="description">
+                  <div v-if="zoneSelected">
+                    <multi-disk-selection
+                      :items="template.childtemplates"
+                      :diskOfferings="options.diskOfferings"
+                      :zoneId="zoneId"
+                      @select-multi-disk-offering="updateMultiDiskOffering($event)" />
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                v-else
+                :title="tabKey == 'templateid' ? $t('label.data.disk') : $t('label.disk.size')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description">
+                  <div v-if="zoneSelected">
+                    <disk-offering-selection
+                      :items="options.diskOfferings"
+                      :row-count="rowCount.diskOfferings"
+                      :zoneId="zoneId"
+                      :value="diskOffering ? diskOffering.id : ''"
+                      :loading="loading.diskOfferings"
+                      :preFillContent="dataPreFill"
+                      :isIsoSelected="tabKey==='isoid'"
+                      @select-disk-offering-item="($event) => updateDiskOffering($event)"
+                      @handle-search-filter="($event) => handleSearchFilter('diskOfferings', $event)"
+                    ></disk-offering-selection>
+                    <disk-size-selection
+                      v-if="diskOffering && diskOffering.iscustomized"
+                      input-decorator="size"
+                      :preFillContent="dataPreFill"
+                      @update-disk-size="updateFieldValue" />
+                    <a-form-item class="form-item-hidden">
+                      <a-input v-decorator="['size']"/>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="this.$t('label.networks')"
+                :status="zoneSelected ? 'process' : 'wait'"
+                v-if="zone && zone.networktype !== 'Basic'">
+                <template slot="description">
+                  <div v-if="zoneSelected">
+                    <div v-if="vm.templateid && templateNics && templateNics.length > 0">
+                      <a-form-item
+                        v-for="(nic, nicIndex) in templateNics"
+                        :key="nicIndex"
+                        :v-bind="nic.name" >
+                        <span slot="label">
+                          {{ nic.elementName + ' - ' + nic.name }}
+                          <a-tooltip :title="nic.networkDescription">
+                            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                          </a-tooltip>
+                        </span>
+                        <a-select
+                          showSearch
+                          optionFilterProp="children"
+                          v-decorator="[
+                            'networkMap.nic-' + nic.InstanceID.toString(),
+                            { initialValue: options.networks && options.networks.length > 0 ? options.networks[Math.min(nicIndex, options.networks.length - 1)].id : null }
+                          ]"
+                          :placeholder="nic.networkDescription"
+                          :filterOption="(input, option) => {
+                            return option.componentOptions.children[0].children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                          }"
+                        >
+                          <a-select-option v-for="opt in options.networks" :key="opt.id">
+                            <span v-if="opt.type!=='L2'">
+                              {{ opt.name || opt.description }} ({{ `${$t('label.cidr')}: ${opt.cidr}` }})
+                            </span>
+                            <span v-else>{{ opt.name || opt.description }}</span>
+                          </a-select-option>
+                        </a-select>
+                      </a-form-item>
+                    </div>
+                    <div v-show="!(vm.templateid && templateNics && templateNics.length > 0)" >
+                      <network-selection
+                        :items="options.networks"
+                        :row-count="rowCount.networks"
+                        :value="networkOfferingIds"
+                        :loading="loading.networks"
+                        :zoneId="zoneId"
+                        :preFillContent="dataPreFill"
+                        @select-network-item="($event) => updateNetworks($event)"
+                        @handle-search-filter="($event) => handleSearchFilter('networks', $event)"
+                      ></network-selection>
+                      <network-configuration
+                        v-if="networks.length > 0"
+                        :items="networks"
+                        :preFillContent="dataPreFill"
+                        @update-network-config="($event) => updateNetworkConfig($event)"
+                        @select-default-network-item="($event) => updateDefaultNetworks($event)"
+                      ></network-configuration>
+                    </div>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                v-if="showSecurityGroupSection"
+                :title="$t('label.security.groups')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description">
+                  <security-group-selection
+                    :zoneId="zoneId"
+                    :value="securitygroupids"
+                    :loading="loading.networks"
+                    :preFillContent="dataPreFill"
+                    @select-security-group-item="($event) => updateSecurityGroups($event)"></security-group-selection>
+                </template>
+              </a-step>
+              <a-step
+                :title="this.$t('label.sshkeypairs')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description">
+                  <div v-if="zoneSelected">
+                    <ssh-key-pair-selection
+                      :items="options.sshKeyPairs"
+                      :row-count="rowCount.sshKeyPairs"
+                      :zoneId="zoneId"
+                      :value="sshKeyPair ? sshKeyPair.name : ''"
+                      :loading="loading.sshKeyPairs"
+                      :preFillContent="dataPreFill"
+                      @select-ssh-key-pair-item="($event) => updateSshKeyPairs($event)"
+                      @handle-search-filter="($event) => handleSearchFilter('sshKeyPairs', $event)"
+                    />
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="$t('label.ovf.properties')"
+                :status="zoneSelected ? 'process' : 'wait'"
+                v-if="vm.templateid && templateProperties && Object.keys(templateProperties).length > 0">
+                <template slot="description">
+                  <div v-for="(props, category) in templateProperties" :key="category">
+                    <a-alert :message="'Category: ' + category + ' (' + props.length + ' properties)'" type="info" />
+                    <div style="margin-left: 15px; margin-top: 10px">
+                      <a-form-item
+                        v-for="(property, propertyIndex) in props"
+                        :key="propertyIndex"
+                        :v-bind="property.key" >
+                        <span slot="label" style="text-transform: capitalize">
+                          {{ property.label }}
+                          <a-tooltip :title="property.description">
+                            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                          </a-tooltip>
+                        </span>
+
+                        <span v-if="property.type && property.type==='boolean'">
+                          <a-switch
+                            v-decorator="['properties.' + escapePropertyKey(property.key), { initialValue: property.value==='TRUE'?true:false}]"
+                            :defaultChecked="property.value==='TRUE'?true:false"
+                            :placeholder="property.description"
+                          />
+                        </span>
+                        <span v-else-if="property.type && (property.type==='int' || property.type==='real')">
+                          <a-input-number
+                            v-decorator="['properties.'+ escapePropertyKey(property.key) ]"
+                            :defaultValue="property.value"
+                            :placeholder="property.description"
+                            :min="getPropertyQualifiers(property.qualifiers, 'number-select').min"
+                            :max="getPropertyQualifiers(property.qualifiers, 'number-select').max" />
+                        </span>
+                        <span v-else-if="property.type && property.type==='string' && property.qualifiers && property.qualifiers.startsWith('ValueMap')">
+                          <a-select
+                            showSearch
+                            optionFilterProp="children"
+                            v-decorator="['properties.' + escapePropertyKey(property.key), { initialValue: property.value && property.value.length>0 ? property.value: getPropertyQualifiers(property.qualifiers, 'select')[0] }]"
+                            :placeholder="property.description"
+                            :filterOption="(input, option) => {
+                              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                            }"
+                          >
+                            <a-select-option v-for="opt in getPropertyQualifiers(property.qualifiers, 'select')" :key="opt">
+                              {{ opt }}
+                            </a-select-option>
+                          </a-select>
+                        </span>
+                        <span v-else-if="property.type && property.type==='string' && property.password">
+                          <a-input-password
+                            v-decorator="['properties.' + escapePropertyKey(property.key), {
+                              rules: [
+                                {
+                                  initialValue: property.value
+                                },
+                                {
+                                  validator: (rule, value, callback) => {
+                                    if (!property.qualifiers) {
+                                      callback()
+                                    }
+                                    var minlength = getPropertyQualifiers(property.qualifiers, 'number-select').min
+                                    var maxlength = getPropertyQualifiers(property.qualifiers, 'number-select').max
+                                    var errorMessage = ''
+                                    var isPasswordInvalidLength = function () {
+                                      return false
+                                    }
+                                    if (minlength) {
+                                      errorMessage = $t('message.validate.minlength').replace('{0}', minlength)
+                                      isPasswordInvalidLength = function () {
+                                        return !value || value.length < minlength
+                                      }
+                                    }
+                                    if (maxlength !== Number.MAX_SAFE_INTEGER) {
+                                      if (minlength) {
+                                        errorMessage = $t('message.validate.range.length').replace('{0}', minlength).replace('{1}', maxlength)
+                                        isPasswordInvalidLength = function () {
+                                          return !value || (maxlength < value.length || value.length < minlength)
+                                        }
+                                      } else {
+                                        errorMessage = $t('message.validate.maxlength').replace('{0}', maxlength)
+                                        isPasswordInvalidLength = function () {
+                                          return !value || value.length > maxlength
+                                        }
+                                      }
+                                    }
+                                    if (isPasswordInvalidLength()) {
+                                      callback(errorMessage)
+                                    }
+                                    callback()
+                                  }
+                                }
+                              ]
+                            }]"
+                            :placeholder="property.description" />
+                        </span>
+                        <span v-else>
+                          <a-input
+                            v-decorator="['properties.' + escapePropertyKey(property.key), { initialValue: property.value }]"
+                            :placeholder="property.description" />
+                        </span>
+                      </a-form-item>
+                    </div>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="$t('label.advanced.mode')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description" v-if="zoneSelected">
+                  <span>
+                    {{ $t('label.isadvanced') }}
+                    <a-switch @change="val => { this.showDetails = val }" :checked="this.showDetails" style="margin-left: 10px"/>
+                  </span>
+                  <div style="margin-top: 15px" v-show="this.showDetails">
+                    <div
+                      v-if="vm.templateid && ['KVM', 'VMware'].includes(hypervisor) && !template.deployasis">
+                      <a-form-item :label="$t('label.boottype')">
+                        <a-select
+                          v-decorator="['boottype']"
+                          @change="fetchBootModes"
+                        >
+                          <a-select-option v-for="bootType in options.bootTypes" :key="bootType.id">
+                            {{ bootType.description }}
+                          </a-select-option>
+                        </a-select>
+                      </a-form-item>
+                      <a-form-item :label="$t('label.bootmode')">
+                        <a-select
+                          v-decorator="['bootmode']">
+                          <a-select-option v-for="bootMode in options.bootModes" :key="bootMode.id">
+                            {{ bootMode.description }}
+                          </a-select-option>
+                        </a-select>
+                      </a-form-item>
+                    </div>
+                    <a-form-item
+                      :label="this.$t('label.bootintosetup')"
+                      v-if="zoneSelected && ((tabKey === 'isoid' && hypervisor === 'VMware') || (tabKey === 'templateid' && template && template.hypervisor === 'VMware'))" >
+                      <a-switch
+                        v-decorator="['bootintosetup']">
+                      </a-switch>
+                    </a-form-item>
+                    <a-form-item :label="$t('label.userdata')">
+                      <a-textarea
+                        v-decorator="['userdata']">
+                      </a-textarea>
+                    </a-form-item>
+                    <a-form-item :label="this.$t('label.affinity.groups')">
+                      <affinity-group-selection
+                        :items="options.affinityGroups"
+                        :row-count="rowCount.affinityGroups"
+                        :zoneId="zoneId"
+                        :value="affinityGroupIds"
+                        :loading="loading.affinityGroups"
+                        :preFillContent="dataPreFill"
+                        @select-affinity-group-item="($event) => updateAffinityGroups($event)"
+                        @handle-search-filter="($event) => handleSearchFilter('affinityGroups', $event)"/>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="this.$t('label.details')"
+                :status="zoneSelected ? 'process' : 'wait'">
+                <template slot="description" v-if="zoneSelected">
+                  <div style="margin-top: 15px">
+                    {{ $t('message.vm.review.launch') }}
+                    <a-form-item :label="$t('label.name.optional')">
+                      <a-input
+                        v-decorator="['name']"
+                      />
+                    </a-form-item>
+                    <a-form-item :label="$t('label.group.optional')">
+                      <a-auto-complete
+                        v-decorator="['group']"
+                        :filterOption="filterOption"
+                        :dataSource="options.instanceGroups" />
+                    </a-form-item>
+                    <a-form-item :label="$t('label.keyboard')">
+                      <a-select
+                        v-decorator="['keyboard']"
+                        :options="keyboardSelectOptions"
+                      ></a-select>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+              <a-step
+                :title="$t('label.license.agreements')"
+                :status="zoneSelected ? 'process' : 'wait'"
+                v-if="vm.templateid && templateLicenses && templateLicenses.length > 0">
+                <template slot="description">
+                  <div style="margin-top: 10px">
+                    {{ $t('message.read.accept.license.agreements') }}
+                    <a-form-item>
+                      <div
+                        style="margin-top: 10px"
+                        v-for="(license, licenseIndex) in templateLicenses"
+                        :key="licenseIndex"
+                        :v-bind="license.id">
+                        <span slot="label" style="text-transform: capitalize">
+                          {{ 'Agreement ' + (licenseIndex+1) + ': ' + license.name }}
+                        </span>
+                        <a-textarea
+                          :value="license.text"
+                          :auto-size="{ minRows: 3, maxRows: 8 }"
+                          readOnly />
+                      </div>
+                      <a-checkbox
+                        style="margin-top: 10px"
+                        v-decorator="['licensesaccepted', {
+                          rules: [
+                            {
+                              validator: (rule, value, callback) => {
+                                if (!value) {
+                                  callback($t('message.license.agreements.not.accepted'))
+                                }
+                                callback()
+                              }
+                            }
+                          ]
+                        }]">
+                        {{ $t('label.i.accept.all.license.agreements') }}
+                      </a-checkbox>
+                    </a-form-item>
+                  </div>
+                </template>
+              </a-step>
+            </a-steps>
+            <div class="card-footer">
+              <!-- ToDo extract as component -->
+              <a-button @click="() => this.$router.back()" :disabled="loading.deploy">
+                {{ this.$t('label.cancel') }}
+              </a-button>
+              <a-button type="primary" @click="handleSubmit" :loading="loading.deploy">
+                <a-icon type="rocket" />
+                {{ this.$t('label.launch.vm') }}
+              </a-button>
+            </div>
+          </a-form>
+        </a-card>
+      </a-col>
+      <a-col :md="24" :lg="7" v-if="!isMobile()">
+        <a-affix :offsetTop="75">
+          <info-card class="vm-info-card" :resource="vm" :title="vm.name ? this.$t('label.yourinstance') + ' : ' + vm.name : this.$t('label.yourinstance')" />
+        </a-affix>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import Vue from 'vue'
+import { api } from '@/api'
+import _ from 'lodash'
+import { mixin, mixinDevice } from '@/utils/mixin.js'
+import store from '@/store'
+import eventBus from '@/config/eventBus'
+
+import InfoCard from '@/components/view/InfoCard'
+import ComputeOfferingSelection from '@views/compute/wizard/ComputeOfferingSelection'
+import ComputeSelection from '@views/compute/wizard/ComputeSelection'
+import DiskOfferingSelection from '@views/compute/wizard/DiskOfferingSelection'
+import DiskSizeSelection from '@views/compute/wizard/DiskSizeSelection'
+import MultiDiskSelection from '@views/compute/wizard/MultiDiskSelection'
+import TemplateIsoSelection from '@views/compute/wizard/TemplateIsoSelection'
+import AffinityGroupSelection from '@views/compute/wizard/AffinityGroupSelection'
+import NetworkSelection from '@views/compute/wizard/NetworkSelection'
+import NetworkConfiguration from '@views/compute/wizard/NetworkConfiguration'
+import SshKeyPairSelection from '@views/compute/wizard/SshKeyPairSelection'
+import SecurityGroupSelection from '@views/compute/wizard/SecurityGroupSelection'
+
+export default {
+  name: 'Wizard',
+  components: {
+    SshKeyPairSelection,
+    NetworkConfiguration,
+    NetworkSelection,
+    AffinityGroupSelection,
+    TemplateIsoSelection,
+    DiskSizeSelection,
+    MultiDiskSelection,
+    DiskOfferingSelection,
+    InfoCard,
+    ComputeOfferingSelection,
+    ComputeSelection,
+    SecurityGroupSelection
+  },
+  props: {
+    visible: {
+      type: Boolean
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  mixins: [mixin, mixinDevice],
+  data () {
+    return {
+      zoneId: '',
+      podId: null,
+      clusterId: null,
+      zoneSelected: false,
+      vm: {
+        name: null,
+        zoneid: null,
+        zonename: null,
+        hypervisor: null,
+        templateid: null,
+        templatename: null,
+        keyboard: null,
+        keypair: null,
+        group: null,
+        affinitygroupids: [],
+        affinitygroup: [],
+        serviceofferingid: null,
+        serviceofferingname: null,
+        ostypeid: null,
+        ostypename: null,
+        rootdisksize: null,
+        disksize: null
+      },
+      options: {
+        templates: [],
+        isos: [],
+        hypervisors: [],
+        serviceOfferings: [],
+        diskOfferings: [],
+        zones: [],
+        affinityGroups: [],
+        networks: [],
+        sshKeyPairs: [],
+        pods: [],
+        clusters: [],
+        hosts: [],
+        groups: [],
+        keyboards: [],
+        bootTypes: [],
+        bootModes: []
+      },
+      rowCount: {},
+      loading: {
+        deploy: false,
+        templates: false,
+        isos: false,
+        hypervisors: false,
+        serviceOfferings: false,
+        diskOfferings: false,
+        affinityGroups: false,
+        networks: false,
+        sshKeyPairs: false,
+        zones: false,
+        pods: false,
+        clusters: false,
+        hosts: false,
+        groups: false
+      },
+      instanceConfig: {},
+      template: {},
+      templateConfigurations: [],
+      templateNics: [],
+      templateLicenses: [],
+      templateProperties: {},
+      selectedTemplateConfiguration: {},
+      iso: {},
+      hypervisor: '',
+      serviceOffering: {},
+      diskOffering: {},
+      affinityGroups: [],
+      networks: [],
+      networksAdd: [],
+      zone: {},
+      sshKeyPair: {},
+      templateFilter: [
+        'featured',
+        'community',
+        'selfexecutable',
+        'sharedexecutable'
+      ],
+      isoFilter: [
+        'featured',
+        'community',
+        'selfexecutable',
+        'sharedexecutable'
+      ],
+      initDataConfig: {},
+      defaultNetwork: '',
+      networkConfig: [],
+      dataNetworkCreated: [],
+      tabList: [
+        {
+          key: 'templateid',
+          tab: this.$t('label.templates')
+        },
+        {
+          key: 'isoid',
+          tab: this.$t('label.isos')
+        }
+      ],
+      tabKey: 'templateid',
+      dataPreFill: {},
+      showDetails: false,
+      showRootDiskSizeChanger: false,
+      securitygroupids: []
+    }
+  },
+  computed: {
+    isNormalAndDomainUser () {
+      return ['DomainAdmin', 'User'].includes(this.$store.getters.userInfo.roletype)
+    },
+    diskSize () {
+      const rootDiskSize = _.get(this.instanceConfig, 'rootdisksize', 0)
+      const customDiskSize = _.get(this.instanceConfig, 'size', 0)
+      const diskOfferingDiskSize = _.get(this.diskOffering, 'disksize', 0)
+      const dataDiskSize = diskOfferingDiskSize > 0 ? diskOfferingDiskSize : customDiskSize
+      const size = []
+      if (rootDiskSize > 0) {
+        size.push(`${rootDiskSize} GB (Root)`)
+      }
+      if (dataDiskSize > 0) {
+        size.push(`${dataDiskSize} GB (Data)`)
+      }
+      return size.join(' | ')
+    },
+    affinityGroupIds () {
+      return _.map(this.affinityGroups, 'id')
+    },
+    params () {
+      return {
+        serviceOfferings: {
+          list: 'listServiceOfferings',
+          options: {
+            zoneid: _.get(this.zone, 'id'),
+            issystem: false,
+            page: 1,
+            pageSize: 10,
+            keyword: undefined
+          }
+        },
+        diskOfferings: {
+          list: 'listDiskOfferings',
+          options: {
+            zoneid: _.get(this.zone, 'id'),
+            page: 1,
+            pageSize: 10,
+            keyword: undefined
+          }
+        },
+        zones: {
+          list: 'listZones',
+          isLoad: true,
+          field: 'zoneid'
+        },
+        hypervisors: {
+          list: 'listHypervisors',
+          options: {
+            zoneid: _.get(this.zone, 'id')
+          },
+          field: 'hypervisor'
+        },
+        affinityGroups: {
+          list: 'listAffinityGroups',
+          options: {
+            page: 1,
+            pageSize: 10,
+            keyword: undefined,
+            listall: false
+          }
+        },
+        sshKeyPairs: {
+          list: 'listSSHKeyPairs',
+          options: {
+            page: 1,
+            pageSize: 10,
+            keyword: undefined,
+            listall: false
+          }
+        },
+        networks: {
+          list: 'listNetworks',
+          options: {
+            zoneid: _.get(this.zone, 'id'),
+            canusefordeploy: true,
+            projectid: store.getters.project ? store.getters.project.id : null,
+            domainid: store.getters.project && store.getters.project.id ? null : store.getters.userInfo.domainid,
+            account: store.getters.project && store.getters.project.id ? null : store.getters.userInfo.account,
+            page: 1,
+            pageSize: 10,
+            keyword: undefined
+          }
+        },
+        pods: {
+          list: 'listPods',
+          isLoad: !this.isNormalAndDomainUser,
+          options: {
+            zoneid: _.get(this.zone, 'id')
+          },
+          field: 'podid'
+        },
+        clusters: {
+          list: 'listClusters',
+          isLoad: !this.isNormalAndDomainUser,
+          options: {
+            zoneid: _.get(this.zone, 'id'),
+            podid: this.podId
+          },
+          field: 'clusterid'
+        },
+        hosts: {
+          list: 'listHosts',
+          isLoad: !this.isNormalAndDomainUser,
+          options: {
+            zoneid: _.get(this.zone, 'id'),
+            podid: this.podId,
+            clusterid: this.clusterId,
+            state: 'Up',
+            type: 'Routing'
+          },
+          field: 'hostid'
+        }
+      }
+    },
+    networkOfferingIds () {
+      return _.map(this.networks, 'id')
+    },
+    zoneSelectOptions () {
+      return this.options.zones.map((zone) => {
+        return {
+          label: zone.name,
+          value: zone.id
+        }
+      })
+    },
+    hypervisorSelectOptions () {
+      return this.options.hypervisors.map((hypervisor) => {
+        return {
+          label: hypervisor.name,
+          value: hypervisor.name
+        }
+      })
+    },
+    podSelectOptions () {
+      const options = this.options.pods.map((pod) => {
+        return {
+          label: pod.name,
+          value: pod.id
+        }
+      })
+      options.unshift({
+        label: this.$t('label.default'),
+        value: undefined
+      })
+      return options
+    },
+    clusterSelectOptions () {
+      const options = this.options.clusters.map((cluster) => {
+        return {
+          label: cluster.name,
+          value: cluster.id
+        }
+      })
+      options.unshift({
+        label: this.$t('label.default'),
+        value: undefined
+      })
+      return options
+    },
+    hostSelectOptions () {
+      const options = this.options.hosts.map((host) => {
+        return {
+          label: host.name,
+          value: host.id
+        }
+      })
+      options.unshift({
+        label: this.$t('label.default'),
+        value: undefined
+      })
+      return options
+    },
+    keyboardSelectOptions () {
+      const keyboardOpts = this.$config.keyboardOptions || {}
+      return Object.keys(keyboardOpts).map((keyboard) => {
+        return {
+          label: this.$t(keyboardOpts[keyboard]),
+          value: keyboard
+        }
+      })
+    },
+    templateConfigurationExists () {
+      return this.vm.templateid && this.templateConfigurations && this.templateConfigurations.length > 0
+    },
+    networkId () {
+      return this.$route.query.networkid || null
+    },
+    showSecurityGroupSection () {
+      return (this.networks.length > 0 && this.zone.securitygroupsenabled) || (this.zone && this.zone.networktype === 'Basic')
+    }
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.name === 'deployVirtualMachine') {
+        this.resetData()
+      }
+    },
+    instanceConfig (instanceConfig) {
+      this.template = ''
+      for (const key in this.options.templates) {
+        var template = _.find(_.get(this.options.templates[key], 'template', []), (option) => option.id === instanceConfig.templateid)
+        if (template) {
+          this.template = template
+          break
+        }
+      }
+
+      this.iso = ''
+      for (const key in this.options.isos) {
+        var iso = _.find(_.get(this.options.isos[key], 'iso', []), (option) => option.id === instanceConfig.isoid)
+        if (iso) {
+          this.iso = iso
+          break
+        }
+      }
+
+      if (instanceConfig.hypervisor) {
+        var hypervisorItem = _.find(this.options.hypervisors, (option) => option.name === instanceConfig.hypervisor)
+        this.hypervisor = hypervisorItem ? hypervisorItem.name : null
+      }
+
+      this.serviceOffering = _.find(this.options.serviceOfferings, (option) => option.id === instanceConfig.computeofferingid)
+      this.diskOffering = _.find(this.options.diskOfferings, (option) => option.id === instanceConfig.diskofferingid)
+      this.zone = _.find(this.options.zones, (option) => option.id === instanceConfig.zoneid)
+      this.affinityGroups = _.filter(this.options.affinityGroups, (option) => _.includes(instanceConfig.affinitygroupids, option.id))
+      this.networks = _.filter(this.options.networks, (option) => _.includes(instanceConfig.networkids, option.id))
+      this.sshKeyPair = _.find(this.options.sshKeyPairs, (option) => option.name === instanceConfig.keypair)
+
+      if (this.zone) {
+        this.vm.zoneid = this.zone.id
+        this.vm.zonename = this.zone.name
+      }
+
+      const pod = _.find(this.options.pods, (option) => option.id === instanceConfig.podid)
+      if (pod) {
+        this.vm.podid = pod.id
+        this.vm.podname = pod.name
+      }
+
+      const cluster = _.find(this.options.clusters, (option) => option.id === instanceConfig.clusterid)
+      if (cluster) {
+        this.vm.clusterid = cluster.id
+        this.vm.clustername = cluster.name
+      }
+
+      const host = _.find(this.options.hosts, (option) => option.id === instanceConfig.hostid)
+      if (host) {
+        this.vm.hostid = host.id
+        this.vm.hostname = host.name
+      }
+
+      if (this.diskSize) {
+        this.vm.disksizetotalgb = this.diskSize
+      }
+
+      if (this.networks) {
+        this.vm.networks = this.networks
+      }
+
+      if (this.template) {
+        this.vm.templateid = this.template.id
+        this.vm.templatename = this.template.displaytext
+        this.vm.ostypeid = this.template.ostypeid
+        this.vm.ostypename = this.template.ostypename
+      }
+
+      if (this.iso) {
+        this.vm.templateid = this.iso.id
+        this.vm.templatename = this.iso.displaytext
+        this.vm.ostypeid = this.iso.ostypeid
+        this.vm.ostypename = this.iso.ostypename
+        if (this.hypervisor) {
+          this.vm.hypervisor = this.hypervisor
+        }
+      }
+
+      if (this.serviceOffering) {
+        this.vm.serviceofferingid = this.serviceOffering.id
+        this.vm.serviceofferingname = this.serviceOffering.displaytext
+        if (this.serviceOffering.cpunumber) {
+          this.vm.cpunumber = this.serviceOffering.cpunumber
+        }
+        if (this.serviceOffering.cpuspeed) {
+          this.vm.cpuspeed = this.serviceOffering.cpuspeed
+        }
+        if (this.serviceOffering.memory) {
+          this.vm.memory = this.serviceOffering.memory
+        }
+      }
+
+      if (!this.template.deployasis && this.template.childtemplates && this.template.childtemplates.length > 0) {
+        this.vm.diskofferingid = ''
+        this.vm.diskofferingname = ''
+        this.vm.diskofferingsize = ''
+      } else if (this.diskOffering) {
+        this.vm.diskofferingid = this.diskOffering.id
+        this.vm.diskofferingname = this.diskOffering.displaytext
+        this.vm.diskofferingsize = this.diskOffering.disksize
+      }
+
+      if (this.affinityGroups) {
+        this.vm.affinitygroup = this.affinityGroups
+      }
+    }
+  },
+  created () {
+    this.form = this.$form.createForm(this, {
+      onValuesChange: (props, fields) => {
+        if (fields.isoid) {
+          this.form.setFieldsValue({
+            templateid: null,
+            rootdisksize: 0
+          })
+        } else if (fields.templateid) {
+          this.form.setFieldsValue({ isoid: null })
+        }
+        this.instanceConfig = { ...this.form.getFieldsValue(), ...fields }
+        Object.keys(fields).forEach(field => {
+          if (field in this.vm) {
+            this.vm[field] = this.instanceConfig[field]
+          }
+        })
+      }
+    })
+    this.form.getFieldDecorator('computeofferingid', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('diskofferingid', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('multidiskoffering', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('affinitygroupids', { initialValue: [], preserve: true })
+    this.form.getFieldDecorator('networkids', { initialValue: [], preserve: true })
+    this.form.getFieldDecorator('keypair', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('cpunumber', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('cpuSpeed', { initialValue: undefined, preserve: true })
+    this.form.getFieldDecorator('memory', { initialValue: undefined, preserve: true })
+  },
+  mounted () {
+    this.dataPreFill = this.preFillContent && Object.keys(this.preFillContent).length > 0 ? this.preFillContent : {}
+    this.fetchData()
+  },
+  provide () {
+    return {
+      vmFetchTemplates: this.fetchAllTemplates,
+      vmFetchIsos: this.fetchAllIsos,
+      vmFetchNetworks: this.fetchNetwork
+    }
+  },
+  methods: {
+    getPropertyQualifiers (qualifiers, type) {
+      var result = ''
+      switch (type) {
+        case 'select':
+          result = []
+          if (qualifiers && qualifiers.includes('ValueMap')) {
+            result = qualifiers.replace('ValueMap', '').substr(1).slice(0, -1).split(',')
+            for (var i = 0; i < result.length; i++) {
+              result[i] = result[i].replace(/"/g, '')
+            }
+          }
+          break
+        case 'number-select':
+          var min = 0
+          var max = Number.MAX_SAFE_INTEGER
+          if (qualifiers) {
+            var match = qualifiers.match(/MinLen\((\d+)\)/)
+            if (match) {
+              min = parseInt(match[1])
+            }
+            match = qualifiers.match(/MaxLen\((\d+)\)/)
+            if (match) {
+              max = parseInt(match[1])
+            }
+          }
+          result = { min: min, max: max }
+          break
+        default:
+      }
+      return result
+    },
+    fillValue (field) {
+      this.form.getFieldDecorator([field], { initialValue: this.dataPreFill[field] })
+    },
+    fetchData () {
+      if (this.dataPreFill.zoneid) {
+        this.fetchDataByZone(this.dataPreFill.zoneid)
+      } else {
+        _.each(this.params, (param, name) => {
+          if (param.isLoad) {
+            this.fetchOptions(param, name)
+          }
+        })
+      }
+
+      this.fetchBootTypes()
+      this.fetchBootModes()
+      this.fetchInstaceGroups()
+      Vue.nextTick().then(() => {
+        ['name', 'keyboard', 'boottype', 'bootmode', 'userdata'].forEach(this.fillValue)
+        this.instanceConfig = this.form.getFieldsValue() // ToDo: maybe initialize with some other defaults
+      })
+    },
+    async fetchDataByZone (zoneId) {
+      this.fillValue('zoneid')
+      this.options.zones = await this.fetchZones()
+      this.zoneId = zoneId
+      this.zoneSelected = true
+      this.tabKey = 'templateid'
+      await _.each(this.params, (param, name) => {
+        if (!('isLoad' in param) || param.isLoad) {
+          this.fetchOptions(param, name, ['zones'])
+        }
+      })
+      await this.fetchAllTemplates()
+    },
+    fetchBootTypes () {
+      const bootTypes = []
+
+      bootTypes.push({
+        id: 'BIOS',
+        description: 'BIOS'
+      })
+      bootTypes.push({
+        id: 'UEFI',
+        description: 'UEFI'
+      })
+
+      this.options.bootTypes = bootTypes
+      this.$forceUpdate()
+    },
+    fetchBootModes (bootType) {
+      const bootModes = []
+
+      if (bootType === 'UEFI') {
+        bootModes.push({
+          id: 'LEGACY',
+          description: 'LEGACY'
+        })
+        bootModes.push({
+          id: 'SECURE',
+          description: 'SECURE'
+        })
+      } else {
+        bootModes.push({
+          id: 'LEGACY',
+          description: 'LEGACY'
+        })
+      }
+
+      this.options.bootModes = bootModes
+      this.$forceUpdate()
+    },
+    fetchInstaceGroups () {
+      this.options.instanceGroups = []
+      api('listInstanceGroups', {
+        account: this.$store.getters.userInfo.account,
+        domainid: this.$store.getters.userInfo.domainid,
+        listall: true
+      }).then(response => {
+        const groups = response.listinstancegroupsresponse.instancegroup || []
+        groups.forEach(x => {
+          this.options.instanceGroups.push(x.name)
+        })
+      })
+    },
+    fetchNetwork () {
+      const param = this.params.networks
+      this.fetchOptions(param, 'networks')
+    },
+    resetData () {
+      this.vm = {}
+      this.zoneSelected = false
+      this.form.resetFields()
+      this.fetchData()
+    },
+    updateFieldValue (name, value) {
+      if (name === 'templateid') {
+        this.tabKey = 'templateid'
+        this.form.setFieldsValue({
+          templateid: value,
+          isoid: null
+        })
+        this.resetFromTemplateConfiguration()
+        let template = ''
+        for (const key in this.options.templates) {
+          var t = _.find(_.get(this.options.templates[key], 'template', []), (option) => option.id === value)
+          if (t) {
+            this.template = t
+            this.templateConfigurations = []
+            this.selectedTemplateConfiguration = {}
+            this.templateNics = []
+            this.templateLicenses = []
+            this.templateProperties = {}
+            this.updateTemplateParameters()
+            template = t
+            break
+          }
+        }
+        if (template) {
+          var size = template.size / (1024 * 1024 * 1024) || 0 // bytes to GB
+          this.dataPreFill.minrootdisksize = Math.ceil(size)
+        }
+      } else if (name === 'isoid') {
+        this.templateConfigurations = []
+        this.selectedTemplateConfiguration = {}
+        this.templateNics = []
+        this.templateLicenses = []
+        this.templateProperties = {}
+        this.tabKey = 'isoid'
+        this.resetFromTemplateConfiguration()
+        this.form.setFieldsValue({
+          isoid: value,
+          templateid: null
+        })
+      } else if (['cpuspeed', 'cpunumber', 'memory'].includes(name)) {
+        this.vm[name] = value
+        this.form.setFieldsValue({
+          [name]: value
+        })
+      } else {
+        this.form.setFieldsValue({
+          [name]: value
+        })
+      }
+    },
+    updateComputeOffering (id) {
+      this.form.setFieldsValue({
+        computeofferingid: id
+      })
+      setTimeout(() => {
+        this.updateTemplateConfigurationOfferingDetails(id)
+      }, 500)
+    },
+    updateDiskOffering (id) {
+      if (id === '0') {
+        this.form.setFieldsValue({
+          diskofferingid: undefined
+        })
+        return
+      }
+      this.form.setFieldsValue({
+        diskofferingid: id
+      })
+    },
+    updateMultiDiskOffering (value) {
+      this.form.setFieldsValue({
+        multidiskoffering: value
+      })
+    },
+    updateAffinityGroups (ids) {
+      this.form.setFieldsValue({
+        affinitygroupids: ids
+      })
+    },
+    updateNetworks (ids) {
+      this.form.setFieldsValue({
+        networkids: ids
+      })
+    },
+    updateDefaultNetworks (id) {
+      this.defaultNetwork = id
+    },
+    updateNetworkConfig (networks) {
+      this.networkConfig = networks
+    },
+    updateSshKeyPairs (name) {
+      if (name === this.$t('label.noselect')) {
+        this.form.setFieldsValue({
+          keypair: undefined
+        })
+        return
+      }
+      this.form.setFieldsValue({
+        keypair: name
+      })
+    },
+    escapePropertyKey (key) {
+      return key.split('.').join('\\002E')
+    },
+    updateSecurityGroups (securitygroupids) {
+      this.securitygroupids = securitygroupids
+    },
+    getText (option) {
+      return _.get(option, 'displaytext', _.get(option, 'name'))
+    },
+    handleSubmit (e) {
+      console.log('wizard submit')
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          if (err.licensesaccepted) {
+            this.$notification.error({
+              message: this.$t('message.license.agreements.not.accepted'),
+              description: this.$t('message.step.license.agreements.continue')
+            })
+            return
+          }
+
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: this.$t('error.form.message')
+          })
+          return
+        }
+
+        if (!values.templateid && !values.isoid) {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: this.$t('message.template.iso')
+          })
+          return
+        } else if (values.isoid && (!values.diskofferingid || values.diskofferingid === '0')) {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: this.$t('message.step.3.continue')
+          })
+          return
+        }
+        if (!values.computeofferingid) {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: this.$t('message.step.2.continue')
+          })
+          return
+        }
+
+        this.loading.deploy = true
+
+        let networkIds = []
+
+        const deployVmData = {}
+        // step 1 : select zone
+        deployVmData.zoneid = values.zoneid
+        deployVmData.podid = values.podid
+        deployVmData.clusterid = values.clusterid
+        deployVmData.hostid = values.hostid
+        deployVmData.keyboard = values.keyboard
+        deployVmData.boottype = values.boottype
+        deployVmData.bootmode = values.bootmode
+        if (values.userdata && values.userdata.length > 0) {
+          deployVmData.userdata = encodeURIComponent(btoa(this.sanitizeReverse(values.userdata)))
+        }
+        // step 2: select template/iso
+        if (this.tabKey === 'templateid') {
+          deployVmData.templateid = values.templateid
+        } else {
+          deployVmData.templateid = values.isoid
+        }
+        if (this.showRootDiskSizeChanger && values.rootdisksize && values.rootdisksize > 0) {
+          deployVmData.rootdisksize = values.rootdisksize
+        }
+        if (values.hypervisor && values.hypervisor.length > 0) {
+          deployVmData.hypervisor = values.hypervisor
+        }
+        // step 3: select service offering
+        deployVmData.serviceofferingid = values.computeofferingid
+        if (this.serviceOffering && this.serviceOffering.iscustomized) {
+          if (values.cpunumber) {
+            deployVmData['details[0].cpuNumber'] = values.cpunumber
+          }
+          if (values.cpuspeed) {
+            deployVmData['details[0].cpuSpeed'] = values.cpuspeed
+          }
+          if (values.memory) {
+            deployVmData['details[0].memory'] = values.memory
+          }
+        }
+        if (this.selectedTemplateConfiguration) {
+          deployVmData['details[0].configurationId'] = this.selectedTemplateConfiguration.id
+        }
+        // step 4: select disk offering
+        if (!this.template.deployasis && this.template.childtemplates && this.template.childtemplates.length > 0) {
+          if (values.multidiskoffering) {
+            let i = 0
+            Object.entries(values.multidiskoffering).forEach(([disk, offering]) => {
+              const diskKey = `datadiskofferinglist[${i}].datadisktemplateid`
+              const offeringKey = `datadiskofferinglist[${i}].diskofferingid`
+              deployVmData[diskKey] = disk
+              deployVmData[offeringKey] = offering
+              i++
+            })
+          }
+        } else {
+          deployVmData.diskofferingid = values.diskofferingid
+          if (values.size) {
+            deployVmData.size = values.size
+          }
+        }
+        // step 5: select an affinity group
+        deployVmData.affinitygroupids = (values.affinitygroupids || []).join(',')
+        // step 6: select network
+        if (this.zone.networktype !== 'Basic') {
+          if ('networkMap' in values) {
+            const keys = Object.keys(values.networkMap)
+            for (var j = 0; j < keys.length; ++j) {
+              if (values.networkMap[keys[j]] && values.networkMap[keys[j]].length > 0) {
+                deployVmData['nicnetworklist[' + j + '].nic'] = keys[j].replace('nic-', '')
+                deployVmData['nicnetworklist[' + j + '].network'] = values.networkMap[keys[j]]
+              }
+            }
+          } else {
+            const arrNetwork = []
+            networkIds = values.networkids
+            if (networkIds.length > 0) {
+              for (let i = 0; i < networkIds.length; i++) {
+                if (networkIds[i] === this.defaultNetwork) {
+                  const ipToNetwork = {
+                    networkid: this.defaultNetwork
+                  }
+                  arrNetwork.unshift(ipToNetwork)
+                } else {
+                  const ipToNetwork = {
+                    networkid: networkIds[i]
+                  }
+                  arrNetwork.push(ipToNetwork)
+                }
+              }
+            } else {
+              this.$notification.error({
+                message: this.$t('message.request.failed'),
+                description: this.$t('message.step.4.continue')
+              })
+              this.loading.deploy = false
+              return
+            }
+            for (let j = 0; j < arrNetwork.length; j++) {
+              deployVmData['iptonetworklist[' + j + '].networkid'] = arrNetwork[j].networkid
+              if (this.networkConfig.length > 0) {
+                const networkConfig = this.networkConfig.filter((item) => item.key === arrNetwork[j].networkid)
+                if (networkConfig && networkConfig.length > 0) {
+                  deployVmData['iptonetworklist[' + j + '].ip'] = networkConfig[0].ipAddress ? networkConfig[0].ipAddress : undefined
+                  deployVmData['iptonetworklist[' + j + '].mac'] = networkConfig[0].macAddress ? networkConfig[0].macAddress : undefined
+                }
+              }
+            }
+          }
+          if (this.securitygroupids.length > 0) {
+            deployVmData.securitygroupids = this.securitygroupids.join(',')
+          }
+        }
+        // step 7: select ssh key pair
+        deployVmData.keypair = values.keypair
+        if (values.name) {
+          deployVmData.name = values.name
+          deployVmData.displayname = values.name
+        }
+        if (values.group) {
+          deployVmData.group = values.group
+        }
+        // step 8: enter setup
+        if ('properties' in values) {
+          const keys = Object.keys(values.properties)
+          for (var i = 0; i < keys.length; ++i) {
+            const propKey = keys[i].split('\\002E').join('.')
+            deployVmData['properties[' + i + '].key'] = propKey
+            deployVmData['properties[' + i + '].value'] = values.properties[keys[i]]
+          }
+        }
+        if ('bootintosetup' in values) {
+          deployVmData.bootintosetup = values.bootintosetup
+        }
+
+        const title = this.$t('label.launch.vm')
+        const description = values.name || ''
+        const password = this.$t('label.password')
+
+        api('deployVirtualMachine', deployVmData).then(response => {
+          const jobId = response.deployvirtualmachineresponse.jobid
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                const vm = result.jobresult.virtualmachine
+                const name = vm.displayname || vm.name || vm.id
+                if (vm.password) {
+                  this.$notification.success({
+                    message: password + ` ${this.$t('label.for')} ` + name,
+                    description: vm.password,
+                    duration: 0
+                  })
+                }
+                eventBus.$emit('vm-refresh-data')
+              },
+              errorMethod: () => {
+                eventBus.$emit('vm-refresh-data')
+              },
+              loadingMessage: `${title} ${this.$t('label.in.progress')}`,
+              catchMessage: this.$t('error.fetching.async.job.result'),
+              catchMethod: () => {
+                eventBus.$emit('vm-refresh-data')
+              }
+            })
+            this.$store.dispatch('AddAsyncJob', {
+              title: title,
+              jobid: jobId,
+              description: description,
+              status: 'progress'
+            })
+          }
+          // Sending a refresh in case it hasn't picked up the new VM
+          new Promise(resolve => setTimeout(resolve, 3000)).then(() => {
+            eventBus.$emit('vm-refresh-data')
+          })
+          this.$router.back()
+        }).catch(error => {
+          this.$notifyError(error)
+          this.loading.deploy = false
+        })
+      })
+    },
+    fetchZones () {
+      return new Promise((resolve) => {
+        this.loading.zones = true
+        const param = this.params.zones
+        api(param.list, { listall: true }).then(json => {
+          const zones = json.listzonesresponse.zone || []
+          resolve(zones)
+        }).catch(function (error) {
+          console.log(error.stack)
+        }).finally(() => {
+          this.loading.zones = false
+        })
+      })
+    },
+    fetchOptions (param, name, exclude) {
+      if (exclude && exclude.length > 0) {
+        if (exclude.includes(name)) {
+          return
+        }
+      }
+      this.loading[name] = true
+      param.loading = true
+      param.opts = []
+      const options = param.options || {}
+      if (!('listall' in options)) {
+        options.listall = true
+      }
+      api(param.list, options).then((response) => {
+        param.loading = false
+        _.map(response, (responseItem, responseKey) => {
+          if (Object.keys(responseItem).length === 0) {
+            this.rowCount[name] = 0
+            this.options[name] = []
+            this.$forceUpdate()
+            return
+          }
+          if (!responseKey.includes('response')) {
+            return
+          }
+          _.map(responseItem, (response, key) => {
+            if (key === 'count') {
+              this.rowCount[name] = response
+              return
+            }
+            param.opts = response
+            this.options[name] = response
+
+            if (name === 'hypervisors') {
+              this.hypervisor = response[0] && response[0].name ? response[0].name : null
+            }
+
+            this.$forceUpdate()
+            if (param.field) {
+              this.fillValue(param.field)
+            }
+          })
+
+          if (name === 'zones') {
+            let zoneid = ''
+            if (this.$route.query.zoneid) {
+              zoneid = this.$route.query.zoneid
+            } else if (this.options.zones.length === 1) {
+              zoneid = this.options.zones[0].id
+            }
+            if (zoneid) {
+              this.form.getFieldDecorator(['zoneid'], { initialValue: zoneid })
+              this.onSelectZoneId(zoneid)
+            }
+          }
+        })
+      }).catch(function (error) {
+        console.log(error.stack)
+        param.loading = false
+      }).finally(() => {
+        this.loading[name] = false
+      })
+    },
+    fetchTemplates (templateFilter, params) {
+      const args = Object.assign({}, params)
+      if (args.keyword || args.category !== templateFilter) {
+        args.page = 1
+        args.pageSize = args.pageSize || 10
+      }
+      args.zoneid = _.get(this.zone, 'id')
+      args.templatefilter = templateFilter
+      args.details = 'all'
+
+      return new Promise((resolve, reject) => {
+        api('listTemplates', args).then((response) => {
+          resolve(response)
+        }).catch((reason) => {
+          // ToDo: Handle errors
+          reject(reason)
+        })
+      })
+    },
+    fetchIsos (isoFilter, params) {
+      const args = Object.assign({}, params)
+      if (args.keyword || args.category !== isoFilter) {
+        args.page = 1
+        args.pageSize = args.pageSize || 10
+      }
+      args.zoneid = _.get(this.zone, 'id')
+      args.isoFilter = isoFilter
+      args.bootable = true
+
+      return new Promise((resolve, reject) => {
+        api('listIsos', args).then((response) => {
+          resolve(response)
+        }).catch((reason) => {
+          // ToDo: Handle errors
+          reject(reason)
+        })
+      })
+    },
+    fetchAllTemplates (params) {
+      const promises = []
+      const templates = {}
+      this.loading.templates = true
+      this.templateFilter.forEach((filter) => {
+        templates[filter] = { count: 0, template: [] }
+        promises.push(this.fetchTemplates(filter, params))
+      })
+      this.options.templates = templates
+      Promise.all(promises).then((response) => {
+        response.forEach((resItem, idx) => {
+          templates[this.templateFilter[idx]] = _.isEmpty(resItem.listtemplatesresponse) ? { count: 0, template: [] } : resItem.listtemplatesresponse
+          this.options.templates = { ...templates }
+          this.$forceUpdate()
+        })
+      }).catch((reason) => {
+        console.log(reason)
+      }).finally(() => {
+        this.loading.templates = false
+      })
+    },
+    fetchAllIsos (params) {
+      const promises = []
+      const isos = {}
+      this.loading.isos = true
+      this.isoFilter.forEach((filter) => {
+        isos[filter] = { count: 0, iso: [] }
+        promises.push(this.fetchIsos(filter, params))
+      })
+      this.options.isos = isos
+      Promise.all(promises).then((response) => {
+        response.forEach((resItem, idx) => {
+          isos[this.isoFilter[idx]] = _.isEmpty(resItem.listisosresponse) ? { count: 0, iso: [] } : resItem.listisosresponse
+          this.options.isos = { ...isos }
+          this.$forceUpdate()
+        })
+      }).catch((reason) => {
+        console.log(reason)
+      }).finally(() => {
+        this.loading.isos = false
+      })
+    },
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
+      )
+    },
+    onSelectZoneId (value) {
+      this.dataPreFill = {}
+      this.zoneId = value
+      this.podId = null
+      this.clusterId = null
+      this.zone = _.find(this.options.zones, (option) => option.id === value)
+      this.zoneSelected = true
+      this.form.setFieldsValue({
+        clusterid: undefined,
+        podid: undefined,
+        hostid: undefined,
+        templateid: undefined,
+        isoid: undefined
+      })
+      this.tabKey = 'templateid'
+      _.each(this.params, (param, name) => {
+        if (this.networkId && name === 'networks') {
+          param.options = {
+            id: this.networkId
+          }
+        }
+        if (!('isLoad' in param) || param.isLoad) {
+          this.fetchOptions(param, name, ['zones'])
+        }
+      })
+      this.fetchAllTemplates()
+    },
+    onSelectPodId (value) {
+      this.podId = value
+
+      this.fetchOptions(this.params.clusters, 'clusters')
+      this.fetchOptions(this.params.hosts, 'hosts')
+    },
+    onSelectClusterId (value) {
+      this.clusterId = value
+
+      this.fetchOptions(this.params.hosts, 'hosts')
+    },
+    handleSearchFilter (name, options) {
+      this.params[name].options = { ...this.params[name].options, ...options }
+      this.fetchOptions(this.params[name], name)
+    },
+    onTabChange (key, type) {
+      this[type] = key
+      if (key === 'isoid') {
+        this.fetchAllIsos()
+      }
+    },
+    sanitizeReverse (value) {
+      const reversedValue = value
+        .replace(/&amp;/g, '&')
+        .replace(/&lt;/g, '<')
+        .replace(/&gt;/g, '>')
+
+      return reversedValue
+    },
+    fetchTemplateNics (template) {
+      var nics = []
+      if (template && template.deployasisdetails && Object.keys(template.deployasisdetails).length > 0) {
+        var keys = Object.keys(template.deployasisdetails)
+        keys = keys.filter(key => key.startsWith('network-'))
+        for (var key of keys) {
+          var propertyMap = JSON.parse(template.deployasisdetails[key])
+          nics.push(propertyMap)
+        }
+        nics.sort(function (a, b) {
+          return a.InstanceID - b.InstanceID
+        })
+      }
+      return nics
+    },
+    groupBy (array, key) {
+      const result = {}
+      array.forEach(item => {
+        if (!result[item[key]]) {
+          result[item[key]] = []
+        }
+        result[item[key]].push(item)
+      })
+      return result
+    },
+    fetchTemplateProperties (template) {
+      var properties = []
+      if (template && template.deployasisdetails && Object.keys(template.deployasisdetails).length > 0) {
+        var keys = Object.keys(template.deployasisdetails)
+        keys = keys.filter(key => key.startsWith('property-'))
+        for (var key of keys) {
+          var propertyMap = JSON.parse(template.deployasisdetails[key])
+          properties.push(propertyMap)
+        }
+        properties.sort(function (a, b) {
+          return a.index - b.index
+        })
+      }
+      return this.groupBy(properties, 'category')
+    },
+    fetchTemplateConfigurations (template) {
+      var configurations = []
+      if (template && template.deployasisdetails && Object.keys(template.deployasisdetails).length > 0) {
+        var keys = Object.keys(template.deployasisdetails)
+        keys = keys.filter(key => key.startsWith('configuration-'))
+        for (var key of keys) {
+          var configuration = JSON.parse(template.deployasisdetails[key])
+          configuration.name = configuration.label
+          configuration.displaytext = configuration.label
+          configuration.iscustomized = true
+          configuration.cpunumber = 0
+          configuration.cpuspeed = 0
+          configuration.memory = 0
+          for (var harwareItem of configuration.hardwareItems) {
+            if (harwareItem.resourceType === 'Processor') {
+              configuration.cpunumber = harwareItem.virtualQuantity
+              configuration.cpuspeed = harwareItem.reservation
+            } else if (harwareItem.resourceType === 'Memory') {
+              configuration.memory = harwareItem.virtualQuantity
+            }
+          }
+          configurations.push(configuration)
+        }
+        configurations.sort(function (a, b) {
+          return a.index - b.index
+        })
+      }
+      return configurations
+    },
+    fetchTemplateLicenses (template) {
+      var licenses = []
+      if (template && template.deployasisdetails && Object.keys(template.deployasisdetails).length > 0) {
+        var keys = Object.keys(template.deployasisdetails)
+        const prefix = /eula-\d-/
+        keys = keys.filter(key => key.startsWith('eula-')).sort()
+        for (var key of keys) {
+          var license = {
+            id: this.escapePropertyKey(key.replace(' ', '-')),
+            name: key.replace(prefix, ''),
+            text: template.deployasisdetails[key]
+          }
+          licenses.push(license)
+        }
+      }
+      return licenses
+    },
+    deleteFrom (options, values) {
+      for (const value of values) {
+        delete options[value]
+      }
+    },
+    resetFromTemplateConfiguration () {
+      this.deleteFrom(this.params.serviceOfferings.options, ['cpuspeed', 'cpunumber', 'memory'])
+      this.deleteFrom(this.dataPreFill, ['cpuspeed', 'cpunumber', 'memory'])
+      this.handleSearchFilter('serviceOfferings', {
+        page: 1,
+        pageSize: 10
+      })
+    },
+    handleTemplateConfiguration () {
+      if (!this.selectedTemplateConfiguration) {
+        return
+      }
+      const params = {
+        cpunumber: this.selectedTemplateConfiguration.cpunumber,
+        cpuspeed: this.selectedTemplateConfiguration.cpuspeed,
+        memory: this.selectedTemplateConfiguration.memory,
+        page: 1,
+        pageSize: 10
+      }
+      this.dataPreFill.cpunumber = params.cpunumber
+      this.dataPreFill.cpuspeed = params.cpuspeed
+      this.dataPreFill.memory = params.memory
+      this.handleSearchFilter('serviceOfferings', params)
+    },
+    updateTemplateParameters () {
+      if (this.template) {
+        this.templateNics = this.fetchTemplateNics(this.template)
+        this.templateConfigurations = this.fetchTemplateConfigurations(this.template)
+        this.templateLicenses = this.fetchTemplateLicenses(this.template)
+        this.templateProperties = this.fetchTemplateProperties(this.template)
+        this.selectedTemplateConfiguration = {}
+        setTimeout(() => {
+          if (this.templateConfigurationExists) {
+            this.selectedTemplateConfiguration = this.templateConfigurations[0]
+            this.handleTemplateConfiguration()
+            if ('templateConfiguration' in this.form.fieldsStore.fieldsMeta) {
+              this.updateFieldValue('templateConfiguration', this.selectedTemplateConfiguration.id)
+            }
+            this.updateComputeOffering(null) // reset as existing selection may be incompatible
+          }
+        }, 500)
+      }
+    },
+    onSelectTemplateConfigurationId (value) {
+      this.selectedTemplateConfiguration = _.find(this.templateConfigurations, (option) => option.id === value)
+      this.handleTemplateConfiguration()
+      this.updateComputeOffering(null)
+    },
+    updateTemplateConfigurationOfferingDetails (offeringId) {
+      var offering = this.serviceOffering
+      if (!offering || offering.id !== offeringId) {
+        offering = _.find(this.options.serviceOfferings, (option) => option.id === offeringId)
+      }
+      if (offering && offering.iscustomized && this.templateConfigurationExists && this.selectedTemplateConfiguration) {
+        if ('cpunumber' in this.form.fieldsStore.fieldsMeta) {
+          this.updateFieldValue('cpunumber', this.selectedTemplateConfiguration.cpunumber)
+        }
+        if ((offering.cpuspeed == null || offering.cpuspeed === undefined) && 'cpuspeed' in this.form.fieldsStore.fieldsMeta) {
+          this.updateFieldValue('cpuspeed', this.selectedTemplateConfiguration.cpuspeed)
+        }
+        if ('memory' in this.form.fieldsStore.fieldsMeta) {
+          this.updateFieldValue('memory', this.selectedTemplateConfiguration.memory)
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .card-footer {
+    text-align: right;
+    margin-top: 2rem;
+
+    button + button {
+      margin-left: 8px;
+    }
+  }
+
+  .ant-list-item-meta-avatar {
+    font-size: 1rem;
+  }
+
+  .ant-collapse {
+    margin: 2rem 0;
+  }
+</style>
+
+<style lang="less">
+  @import url('../../style/index');
+
+  .ant-table-selection-column {
+    // Fix for the table header if the row selection use radio buttons instead of checkboxes
+    > div:empty {
+      width: 16px;
+    }
+  }
+
+  .ant-collapse-borderless > .ant-collapse-item {
+    border: 1px solid @border-color-split;
+    border-radius: @border-radius-base !important;
+    margin: 0 0 1.2rem;
+  }
+
+  .vm-info-card {
+    .ant-card-body {
+      min-height: 250px;
+      max-height: calc(100vh - 150px);
+      overflow-y: auto;
+      scroll-behavior: smooth;
+    }
+
+    .resource-detail-item__label {
+      font-weight: normal;
+    }
+
+    .resource-detail-item__details, .resource-detail-item {
+      a {
+        color: rgba(0, 0, 0, 0.65);
+        cursor: default;
+        pointer-events: none;
+      }
+    }
+  }
+
+  .form-item-hidden {
+    display: none;
+  }
+</style>
diff --git a/ui/src/views/compute/DestroyVM.vue b/ui/src/views/compute/DestroyVM.vue
new file mode 100644
index 0000000..638097d
--- /dev/null
+++ b/ui/src/views/compute/DestroyVM.vue
@@ -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.
+
+<template>
+  <div class="form-layout">
+    <a-alert type="warning" v-html="$t('message.action.destroy.instance')" /><br/>
+    <a-spin :spinning="loading">
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item v-if="$store.getters.userInfo.roletype === 'Admin' || $store.getters.features.allowuserexpungerecovervm">
+          <span slot="label">
+            {{ $t('label.expunge') }}
+            <a-tooltip placement="bottom" :title="apiParams.expunge.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['expunge']" :auto-focus="true" />
+        </a-form-item>
+
+        <a-form-item v-if="volumes.length > 0">
+          <span slot="label">
+            {{ $t('label.delete.volumes') }}
+            <a-tooltip placement="bottom" :title="apiParams.volumeids.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['volumeids']"
+            :placeholder="$t('label.delete.volumes')"
+            mode="multiple"
+            :loading="loading">
+            <a-select-option v-for="volume in volumes" :key="volume.id">
+              {{ volume.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <p v-else v-html="$t('label.volume.empty')" />
+
+        <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: 'DestroyVM',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      volumes: [],
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.destroyVirtualMachine || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.volumes = []
+      this.loading = true
+      api('listVolumes', {
+        virtualMachineId: this.resource.id,
+        type: 'DATADISK',
+        details: 'min',
+        listall: 'true'
+      }).then(json => {
+        this.volumes = json.listvolumesresponse.volume || []
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+
+        const params = {
+          id: this.resource.id
+        }
+        if (values.volumeids) {
+          params.volumeids = values.volumeids.join(',')
+        }
+        if (values.expunge) {
+          params.expunge = values.expunge
+        }
+
+        api('destroyVirtualMachine', params).then(json => {
+          const jobId = json.destroyvirtualmachineresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.action.destroy.instance'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            loadingMessage: `${this.$t('message.deleting.vm')} ${this.resource.name}`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            successMessage: `${this.$t('message.success.delete.vm')} ${this.resource.name}`,
+            successMethod: () => {
+              if (this.$route.path.includes('/vm/') && values.expunge) {
+                this.$router.go(-1)
+              } else {
+                this.parentFetchData()
+              }
+            },
+            action: {
+              api: 'destroyVirtualMachine'
+            }
+          })
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    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/InstanceTab.vue b/ui/src/views/compute/InstanceTab.vue
new file mode 100644
index 0000000..fd11d76
--- /dev/null
+++ b/ui/src/views/compute/InstanceTab.vue
@@ -0,0 +1,782 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-tabs
+      :activeKey="currentTab"
+      :tabPosition="device === 'mobile' ? 'top' : 'left'"
+      :animated="false"
+      @change="handleChangeTab">
+      <a-tab-pane :tab="$t('label.details')" key="details">
+        <DetailsTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.iso')" key="cdrom" v-if="vm.isoid">
+        <a-icon type="usb" />
+        <router-link :to="{ path: '/iso/' + vm.isoid }">{{ vm.isoname }}</router-link> <br/>
+        <a-icon type="barcode"/> {{ vm.isoid }}
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.volumes')" key="volumes" v-if="'listVolumes' in $store.getters.apis">
+        <a-table
+          class="table"
+          size="small"
+          :columns="volumeColumns"
+          :dataSource="volumes"
+          :rowKey="item => item.id"
+          :pagination="false"
+        >
+          <template slot="name" slot-scope="text, item">
+            <a-icon type="hdd" />
+            <router-link :to="{ path: '/volume/' + item.id }">
+              {{ text }}
+            </router-link>
+            <a-tag v-if="item.provisioningtype">
+              {{ item.provisioningtype }}
+            </a-tag>
+          </template>
+          <template slot="state" slot-scope="text">
+            <status :text="text ? text : ''" />{{ text }}
+          </template>
+          <template slot="size" slot-scope="text, item">
+            {{ parseFloat(item.size / (1024.0 * 1024.0 * 1024.0)).toFixed(2) }} GB
+          </template>
+        </a-table>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.nics')" key="nics" v-if="'listNics' in $store.getters.apis">
+        <a-button
+          type="dashed"
+          style="width: 100%; margin-bottom: 10px"
+          @click="showAddModal"
+          :loading="loadingNic"
+          :disabled="!('addNicToVirtualMachine' in $store.getters.apis)">
+          <a-icon type="plus"></a-icon> {{ $t('label.network.addvm') }}
+        </a-button>
+        <NicsTable :resource="vm" :loading="loading">
+          <span slot="actions" slot-scope="record">
+            <a-tooltip placement="bottom">
+              <template slot="title">
+                {{ $t('label.set.default.nic') }}
+              </template>
+              <a-popconfirm
+                :title="$t('label.set.default.nic')"
+                @confirm="setAsDefault(record.nic)"
+                :okText="$t('label.yes')"
+                :cancelText="$t('label.no')"
+                v-if="!record.nic.isdefault"
+              >
+                <a-button
+                  :disabled="!('updateDefaultNicForVirtualMachine' in $store.getters.apis)"
+                  icon="check-square"
+                  shape="circle" />
+              </a-popconfirm>
+            </a-tooltip>
+            <a-tooltip placement="bottom" v-if="record.nic.type !== 'L2'">
+              <template slot="title">
+                {{ $t('label.change.ip.addess') }}
+              </template>
+              <a-button
+                icon="swap"
+                shape="circle"
+                :disabled="!('updateVmNicIp' in $store.getters.apis)"
+                @click="onChangeIPAddress(record)" />
+            </a-tooltip>
+            <a-tooltip placement="bottom" v-if="record.nic.type !== 'L2'">
+              <template slot="title">
+                {{ $t('label.edit.secondary.ips') }}
+              </template>
+              <a-button
+                icon="environment"
+                shape="circle"
+                :disabled="(!('addIpToNic' in $store.getters.apis) && !('addIpToNic' in $store.getters.apis))"
+                @click="fetchSecondaryIPs(record.nic.id)" />
+            </a-tooltip>
+            <a-tooltip placement="bottom">
+              <template slot="title">
+                {{ $t('label.action.delete.nic') }}
+              </template>
+              <a-popconfirm
+                :title="$t('message.network.removenic')"
+                @confirm="removeNIC(record.nic)"
+                :okText="$t('label.yes')"
+                :cancelText="$t('label.no')"
+                v-if="!record.nic.isdefault"
+              >
+                <a-button
+                  :disabled="!('removeNicFromVirtualMachine' in $store.getters.apis)"
+                  type="danger"
+                  icon="delete"
+                  shape="circle" />
+              </a-popconfirm>
+            </a-tooltip>
+          </span>
+        </NicsTable>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.vm.snapshots')" key="vmsnapshots" v-if="'listVMSnapshot' in $store.getters.apis">
+        <ListResourceTable
+          apiName="listVMSnapshot"
+          :resource="resource"
+          :params="{virtualmachineid: this.resource.id}"
+          :columns="['displayname', 'state', 'type', 'created']"
+          :routerlinks="(record) => { return { displayname: '/vmsnapshot/' + record.id } }"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.backup')" key="backups" v-if="'listBackups' in $store.getters.apis">
+        <ListResourceTable
+          apiName="listBackups"
+          :resource="resource"
+          :params="{virtualmachineid: this.resource.id}"
+          :columns="['id', 'status', 'type', 'created']"
+          :routerlinks="(record) => { return { id: '/backup/' + record.id } }"
+          :showSearch="false"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.securitygroups')" key="securitygroups" v-if="this.resource.securitygroup && this.resource.securitygroup.length > 0">
+        <ListResourceTable
+          :items="this.resource.securitygroup"
+          :columns="['name', 'description']"
+          :routerlinks="(record) => { return { name: '/securitygroups/' + record.id } }"
+          :showSearch="false"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.settings')" key="settings">
+        <DetailSettings :resource="resource" :loading="loading" />
+      </a-tab-pane>
+    </a-tabs>
+
+    <a-modal
+      :visible="showAddNetworkModal"
+      :title="$t('label.network.addvm')"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @cancel="closeModals"
+      @ok="submitAddNetwork">
+      {{ $t('message.network.addvm.desc') }}
+      <div class="modal-form">
+        <p class="modal-form__label">{{ $t('label.network') }}:</p>
+        <a-select :defaultValue="addNetworkData.network" @change="e => addNetworkData.network = e">
+          <a-select-option
+            v-for="network in addNetworkData.allNetworks"
+            :key="network.id"
+            :value="network.id">
+            {{ network.name }}
+          </a-select-option>
+        </a-select>
+        <p class="modal-form__label">{{ $t('label.publicip') }}:</p>
+        <a-input v-model="addNetworkData.ip"></a-input>
+      </div>
+    </a-modal>
+
+    <a-modal
+      :visible="showUpdateIpModal"
+      :title="$t('label.change.ipaddress')"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @cancel="closeModals"
+      @ok="submitUpdateIP"
+    >
+      {{ $t('message.network.updateip') }}
+
+      <div class="modal-form">
+        <p class="modal-form__label">{{ $t('label.publicip') }}:</p>
+        <a-select
+          showSearch
+          v-if="editNicResource.type==='Shared'"
+          v-model="editIpAddressValue"
+          :loading="listIps.loading">
+          <a-select-option v-for="ip in listIps.opts" :key="ip.ipaddress">
+            {{ ip.ipaddress }}
+          </a-select-option>
+        </a-select>
+        <a-input
+          v-else
+          v-model="editIpAddressValue"></a-input>
+      </div>
+    </a-modal>
+
+    <a-modal
+      :visible="showSecondaryIpModal"
+      :title="$t('label.acquire.new.secondary.ip')"
+      :maskClosable="false"
+      :footer="null"
+      :closable="false"
+      class="wide-modal"
+    >
+      <p>
+        {{ $t('message.network.secondaryip') }}
+      </p>
+      <a-divider />
+      <a-input :placeholder="$t('label.new.secondaryip.description')" v-model="newSecondaryIp"></a-input>
+      <div style="margin-top: 10px; display: flex; justify-content:flex-end;">
+        <a-button @click="submitSecondaryIP" type="primary" style="margin-right: 10px;">{{ $t('label.add.secondary.ip') }}</a-button>
+        <a-button @click="closeModals">{{ $t('label.close') }}</a-button>
+      </div>
+
+      <a-divider />
+      <a-list itemLayout="vertical">
+        <a-list-item v-for="(ip, index) in secondaryIPs" :key="index">
+          <a-popconfirm
+            :title="`${$t('label.action.release.ip')}?`"
+            @confirm="removeSecondaryIP(ip.id)"
+            :okText="$t('label.yes')"
+            :cancelText="$t('label.no')"
+          >
+            <a-button
+              type="danger"
+              shape="circle"
+              icon="delete" />
+            {{ ip.ipaddress }}
+          </a-popconfirm>
+        </a-list-item>
+      </a-list>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import ResourceLayout from '@/layouts/ResourceLayout'
+import Status from '@/components/widgets/Status'
+import DetailsTab from '@/components/view/DetailsTab'
+import DetailSettings from '@/components/view/DetailSettings'
+import NicsTable from '@/views/network/NicsTable'
+import ListResourceTable from '@/components/view/ListResourceTable'
+
+export default {
+  name: 'InstanceTab',
+  components: {
+    ResourceLayout,
+    DetailsTab,
+    DetailSettings,
+    NicsTable,
+    Status,
+    ListResourceTable
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      vm: {},
+      volumes: [],
+      totalStorage: 0,
+      currentTab: 'details',
+      showAddNetworkModal: false,
+      showUpdateIpModal: false,
+      showSecondaryIpModal: false,
+      addNetworkData: {
+        allNetworks: [],
+        network: '',
+        ip: ''
+      },
+      loadingNic: false,
+      editIpAddressNic: '',
+      editIpAddressValue: '',
+      secondaryIPs: [],
+      selectedNicId: '',
+      newSecondaryIp: '',
+      volumeColumns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.type'),
+          dataIndex: 'type'
+        },
+        {
+          title: this.$t('label.size'),
+          dataIndex: 'size',
+          scopedSlots: { customRender: 'size' }
+        }
+      ],
+      editNicResource: {},
+      listIps: {
+        loading: false,
+        opts: []
+      }
+    }
+  },
+  created () {
+    this.vm = this.resource
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.vm = newItem
+      this.fetchData()
+    },
+    $route: function (newItem, oldItem) {
+      this.setCurrentTab()
+    }
+  },
+  mounted () {
+    this.setCurrentTab()
+  },
+  methods: {
+    setCurrentTab () {
+      this.currentTab = this.$route.query.tab ? this.$route.query.tab : 'details'
+    },
+    handleChangeTab (e) {
+      this.currentTab = e
+      const query = Object.assign({}, this.$route.query)
+      query.tab = e
+      history.replaceState(
+        {},
+        null,
+        '#' + this.$route.path + '?' + Object.keys(query).map(key => {
+          return (
+            encodeURIComponent(key) + '=' + encodeURIComponent(query[key])
+          )
+        }).join('&')
+      )
+    },
+    fetchData () {
+      this.volumes = []
+      if (!this.vm || !this.vm.id) {
+        return
+      }
+      api('listVolumes', { listall: true, virtualmachineid: this.vm.id }).then(json => {
+        this.volumes = json.listvolumesresponse.volume
+        if (this.volumes) {
+          this.volumes.sort((a, b) => { return a.deviceid - b.deviceid })
+        }
+        this.$set(this.resource, 'volumes', this.volumes)
+      })
+    },
+    listNetworks () {
+      api('listNetworks', {
+        listAll: 'true',
+        zoneid: this.vm.zoneid
+      }).then(response => {
+        this.addNetworkData.allNetworks = response.listnetworksresponse.network.filter(network => !this.vm.nic.map(nic => nic.networkid).includes(network.id))
+        this.addNetworkData.network = this.addNetworkData.allNetworks[0].id
+      })
+    },
+    fetchSecondaryIPs (nicId) {
+      this.showSecondaryIpModal = true
+      this.selectedNicId = nicId
+      api('listNics', {
+        nicId: nicId,
+        keyword: '',
+        virtualmachineid: this.vm.id
+      }).then(response => {
+        this.secondaryIPs = response.listnicsresponse.nic[0].secondaryip
+      })
+    },
+    fetchPublicIps (networkid) {
+      this.listIps.loading = true
+      this.listIps.opts = []
+      api('listPublicIpAddresses', {
+        networkid: networkid,
+        allocatedonly: false,
+        forvirtualnetwork: false
+      }).then(json => {
+        const listPublicIps = json.listpublicipaddressesresponse.publicipaddress || []
+        listPublicIps.forEach(item => {
+          if (item.state === 'Free') {
+            this.listIps.opts.push({
+              ipaddress: item.ipaddress
+            })
+          }
+        })
+        this.listIps.opts.sort(function (a, b) {
+          const currentIp = a.ipaddress.replaceAll('.', '')
+          const nextIp = b.ipaddress.replaceAll('.', '')
+          if (parseInt(currentIp) < parseInt(nextIp)) { return -1 }
+          if (parseInt(currentIp) > parseInt(nextIp)) { return 1 }
+          return 0
+        })
+      }).finally(() => {
+        this.listIps.loading = false
+      })
+    },
+    showAddModal () {
+      this.showAddNetworkModal = true
+      this.listNetworks()
+    },
+    closeModals () {
+      this.showAddNetworkModal = false
+      this.showUpdateIpModal = false
+      this.showSecondaryIpModal = false
+      this.addNetworkData.network = ''
+      this.addNetworkData.ip = ''
+      this.editIpAddressValue = ''
+      this.newSecondaryIp = ''
+    },
+    onChangeIPAddress (record) {
+      this.editNicResource = record.nic
+      this.editIpAddressNic = record.nic.id
+      this.showUpdateIpModal = true
+      if (record.nic.type === 'Shared') {
+        this.fetchPublicIps(record.nic.networkid)
+      }
+    },
+    submitAddNetwork () {
+      const params = {}
+      params.virtualmachineid = this.vm.id
+      params.networkid = this.addNetworkData.network
+      if (this.addNetworkData.ip) {
+        params.ipaddress = this.addNetworkData.ip
+      }
+      this.showAddNetworkModal = false
+      this.loadingNic = true
+      api('addNicToVirtualMachine', params).then(response => {
+        this.$pollJob({
+          jobId: response.addnictovirtualmachineresponse.jobid,
+          successMessage: this.$t('message.success.add.network'),
+          successMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('message.add.network.failed'),
+          errorMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.add.network.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loadingNic = false
+      })
+    },
+    setAsDefault (item) {
+      this.loadingNic = true
+      api('updateDefaultNicForVirtualMachine', {
+        virtualmachineid: this.vm.id,
+        nicid: item.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.updatedefaultnicforvirtualmachineresponse.jobid,
+          successMessage: `${this.$t('label.success.set')} ${item.networkname} ${this.$t('label.as.default')}. ${this.$t('message.set.default.nic.manual')}.`,
+          successMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          },
+          errorMessage: `${this.$t('label.error.setting')} ${item.networkname} ${this.$t('label.as.default')}`,
+          errorMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          },
+          loadingMessage: `${this.$t('label.setting')} ${item.networkname} ${this.$t('label.as.default')}...`,
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loadingNic = false
+      })
+    },
+    submitUpdateIP () {
+      this.loadingNic = true
+      this.showUpdateIpModal = false
+      api('updateVmNicIp', {
+        nicId: this.editIpAddressNic,
+        ipaddress: this.editIpAddressValue
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.updatevmnicipresponse.jobid,
+          successMessage: this.$t('message.success.update.ipaddress'),
+          successMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('label.error'),
+          errorMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.update.ipaddress.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.closeModals()
+            this.parentFetchData()
+          }
+        })
+      })
+        .catch(error => {
+          this.$notifyError(error)
+          this.loadingNic = false
+        })
+    },
+    removeNIC (item) {
+      this.loadingNic = true
+
+      api('removeNicFromVirtualMachine', {
+        nicid: item.id,
+        virtualmachineid: this.vm.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.removenicfromvirtualmachineresponse.jobid,
+          successMessage: this.$t('message.success.remove.nic'),
+          successMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('message.error.remove.nic'),
+          errorMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.remove.nic.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.parentFetchData()
+          }
+        })
+      })
+        .catch(error => {
+          this.$notifyError(error)
+          this.loadingNic = false
+        })
+    },
+    submitSecondaryIP () {
+      this.loadingNic = true
+
+      const params = {}
+      params.nicid = this.selectedNicId
+      if (this.newSecondaryIp) {
+        params.ipaddress = this.newSecondaryIp
+      }
+
+      api('addIpToNic', params).then(response => {
+        this.$pollJob({
+          jobId: response.addiptovmnicresponse.jobid,
+          successMessage: this.$t('message.success.add.secondary.ipaddress'),
+          successMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('message.error.add.secondary.ipaddress'),
+          errorMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.add.secondary.ipaddress.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loadingNic = false
+      })
+    },
+    removeSecondaryIP (id) {
+      this.loadingNic = true
+
+      api('removeIpFromNic', { id }).then(response => {
+        this.$pollJob({
+          jobId: response.removeipfromnicresponse.jobid,
+          successMessage: this.$t('message.success.remove.secondary.ipaddress'),
+          successMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('message.error.remove.secondary.ipaddress'),
+          errorMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.remove.secondary.ipaddress.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loadingNic = false
+            this.fetchSecondaryIPs(this.selectedNicId)
+            this.parentFetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loadingNic = false
+        this.fetchSecondaryIPs(this.selectedNicId)
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .page-header-wrapper-grid-content-main {
+    width: 100%;
+    height: 100%;
+    min-height: 100%;
+    transition: 0.3s;
+    .vm-detail {
+      .svg-inline--fa {
+        margin-left: -1px;
+        margin-right: 8px;
+      }
+      span {
+        margin-left: 10px;
+      }
+      margin-bottom: 8px;
+    }
+  }
+
+  .list {
+    margin-top: 20px;
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      align-items: flex-start;
+
+      @media (min-width: 760px) {
+        flex-direction: row;
+        align-items: center;
+      }
+    }
+  }
+
+  .modal-form {
+    display: flex;
+    flex-direction: column;
+
+    &__label {
+      margin-top: 20px;
+      margin-bottom: 5px;
+      font-weight: bold;
+
+      &--no-margin {
+        margin-top: 0;
+      }
+    }
+  }
+
+  .actions {
+    display: flex;
+    flex-wrap: wrap;
+
+    button {
+      padding: 5px;
+      height: auto;
+      margin-bottom: 10px;
+      align-self: flex-start;
+
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+
+  }
+
+  .label {
+    font-weight: bold;
+  }
+
+  .attribute {
+    margin-bottom: 10px;
+  }
+
+  .ant-tag {
+    padding: 4px 10px;
+    height: auto;
+  }
+
+  .title {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    align-items: center;
+
+    a {
+      margin-right: 30px;
+      margin-bottom: 10px;
+    }
+
+    .ant-tag {
+      margin-bottom: 10px;
+    }
+
+    &__details {
+      display: flex;
+    }
+
+    .tags {
+      margin-left: 10px;
+    }
+
+  }
+
+  .ant-list-item-meta-title {
+    margin-bottom: -10px;
+  }
+
+  .divider-small {
+    margin-top: 20px;
+    margin-bottom: 20px;
+  }
+
+  .list-item {
+
+    &:not(:first-child) {
+      padding-top: 25px;
+    }
+
+  }
+</style>
+
+<style scoped>
+.wide-modal {
+  min-width: 50vw;
+}
+
+/deep/ .ant-list-item {
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+</style>
diff --git a/ui/src/views/compute/KubernetesServiceTab.vue b/ui/src/views/compute/KubernetesServiceTab.vue
new file mode 100644
index 0000000..91c8973
--- /dev/null
+++ b/ui/src/views/compute/KubernetesServiceTab.vue
@@ -0,0 +1,410 @@
+// 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>
+  <a-spin :spinning="networkLoading">
+    <a-tabs
+      :activeKey="currentTab"
+      :tabPosition="device === 'mobile' ? 'top' : 'left'"
+      :animated="false"
+      @change="handleChangeTab">
+      <a-tab-pane :tab="$t('label.details')" key="details">
+        <DetailsTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.access')" key="access">
+        <a-card :title="$t('label.kubeconfig.cluster')" :loading="this.versionLoading">
+          <div v-if="this.clusterConfig !== ''">
+            <a-textarea :value="this.clusterConfig" :rows="5" readonly />
+            <div :span="24" class="action-button">
+              <a-button @click="downloadKubernetesClusterConfig" type="primary">{{ this.$t('label.download.kubernetes.cluster.config') }}</a-button>
+            </div>
+          </div>
+          <div v-else>
+            <p>{{ $t('message.kubeconfig.cluster.not.available') }}</p>
+          </div>
+        </a-card>
+        <a-card :title="$t('label.using.cli')" :loading="this.versionLoading">
+          <a-timeline>
+            <a-timeline-item>
+              <p v-html="$t('label.download.kubeconfig.cluster')">
+              </p>
+            </a-timeline-item>
+            <a-timeline-item>
+              <p v-html="$t('label.download.kubectl')"></p>
+              <p>
+                {{ $t('label.linux') }}: <a :href="this.kubectlLinuxLink">{{ this.kubectlLinuxLink }}</a><br>
+                {{ $t('label.macos') }}: <a :href="this.kubectlMacLink">{{ this.kubectlMacLink }}</a><br>
+                {{ $t('label.windows') }}: <a :href="this.kubectlWindowsLink">{{ this.kubectlWindowsLink }}</a>
+              </p>
+            </a-timeline-item>
+            <a-timeline-item>
+              <p v-html="$t('label.use.kubectl.access.cluster')"></p>
+              <p>
+                <code><b>kubectl --kubeconfig /custom/path/kube.conf {COMMAND}</b></code><br><br>
+                <em>{{ $t('label.list.pods') }}</em><br>
+                <code>kubectl --kubeconfig /custom/path/kube.conf get pods --all-namespaces</code><br>
+                <em>{{ $t('label.list.nodes') }}</em><br>
+                <code>kubectl --kubeconfig /custom/path/kube.conf get nodes --all-namespaces</code><br>
+                <em>{{ $t('label.list.services') }}</em><br>
+                <code>kubectl --kubeconfig /custom/path/kube.conf get services --all-namespaces</code>
+              </p>
+            </a-timeline-item>
+          </a-timeline>
+        </a-card>
+        <a-card :title="$t('label.kubernetes.dashboard')">
+          <a-timeline>
+            <a-timeline-item>
+              <p>
+                {{ $t('label.run.proxy.locally') }}<br><br>
+                <code><b>kubectl --kubeconfig /custom/path/kube.conf proxy</b></code>
+              </p>
+            </a-timeline-item>
+            <a-timeline-item>
+              <p>
+                {{ $t('label.open.url') }}<br><br>
+                <a href="http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/"><code>http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/</code></a>
+              </p>
+            </a-timeline-item>
+            <a-timeline-item>
+              <p>
+                {{ $t('label.token.for.dashboard.login') }}<br><br>
+                <code><b>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</b></code>
+              </p>
+            </a-timeline-item>
+          </a-timeline>
+          <p>{{ $t('label.more.access.dashboard.ui') }}, <a href="https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#accessing-the-dashboard-ui">https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/#accessing-the-dashboard-ui</a></p>
+        </a-card>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.instances')" key="instances">
+        <a-table
+          class="table"
+          size="small"
+          :columns="this.vmColumns"
+          :dataSource="this.virtualmachines"
+          :rowKey="item => item.id"
+          :pagination="false"
+        >
+          <template slot="name" slot-scope="text, record">
+            <router-link :to="{ path: '/vm/' + record.id }">{{ record.name }}</router-link>
+          </template>
+          <template slot="state" slot-scope="text">
+            <status :text="text ? text : ''" displayText />
+          </template>
+          <template slot="port" slot-scope="text, record, index">
+            {{ cksSshStartingPort + index }}
+          </template>
+        </a-table>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.firewall')" key="firewall" v-if="publicIpAddress">
+        <FirewallRules :resource="this.publicIpAddress" :loading="this.networkLoading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.portforwarding')" key="portforwarding" v-if="publicIpAddress">
+        <PortForwarding :resource="this.publicIpAddress" :loading="this.networkLoading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.loadbalancing')" key="loadbalancing" v-if="publicIpAddress">
+        <LoadBalancing :resource="this.publicIpAddress" :loading="this.networkLoading" />
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import DetailsTab from '@/components/view/DetailsTab'
+import FirewallRules from '@/views/network/FirewallRules'
+import PortForwarding from '@/views/network/PortForwarding'
+import LoadBalancing from '@/views/network/LoadBalancing'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'KubernetesServiceTab',
+  components: {
+    DetailsTab,
+    FirewallRules,
+    PortForwarding,
+    LoadBalancing,
+    Status
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      clusterConfigLoading: false,
+      clusterConfig: '',
+      versionLoading: false,
+      kubernetesVersion: {},
+      kubectlLinuxLink: 'https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl',
+      kubectlMacLink: 'https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/darwin/amd64/kubectl',
+      kubectlWindowsLink: 'https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/windows/amd64/kubectl.exe',
+      instanceLoading: false,
+      virtualmachines: [],
+      vmColumns: [],
+      networkLoading: false,
+      network: {},
+      publicIpAddress: {},
+      currentTab: 'details',
+      cksSshStartingPort: 2222
+    }
+  },
+  created () {
+    this.vmColumns = [
+      {
+        title: this.$t('label.name'),
+        dataIndex: 'name',
+        scopedSlots: { customRender: 'name' }
+      },
+      {
+        title: this.$t('label.state'),
+        dataIndex: 'state',
+        scopedSlots: { customRender: 'state' }
+      },
+      {
+        title: this.$t('label.instancename'),
+        dataIndex: 'instancename'
+      },
+      {
+        title: this.$t('label.ipaddress'),
+        dataIndex: 'ipaddress'
+      },
+      {
+        title: this.$t('label.ssh.port'),
+        dataIndex: 'port',
+        scopedSlots: { customRender: 'port' }
+      },
+      {
+        title: this.$t('label.zonename'),
+        dataIndex: 'zonename'
+      }
+    ]
+    if (!this.isAdmin()) {
+      this.vmColumns = this.vmColumns.filter(x => x.dataIndex !== 'instancename')
+    }
+  },
+  watch: {
+    resource (newData, oldData) {
+      if (newData && newData !== oldData) {
+        this.handleFetchData()
+        if (this.resource.ipaddress) {
+          this.vmColumns = this.vmColumns.filter(x => x.dataIndex !== 'ipaddress')
+        } else {
+          this.vmColumns = this.vmColumns.filter(x => x.dataIndex !== 'port')
+        }
+      }
+    },
+    $route: function (newItem, oldItem) {
+      this.setCurrentTab()
+    }
+  },
+  mounted () {
+    this.handleFetchData()
+    this.setCurrentTab()
+  },
+  methods: {
+    setCurrentTab () {
+      this.currentTab = this.$route.query.tab ? this.$route.query.tab : 'details'
+    },
+    handleChangeTab (e) {
+      this.currentTab = e
+      const query = Object.assign({}, this.$route.query)
+      query.tab = e
+      history.replaceState(
+        {},
+        null,
+        '#' + this.$route.path + '?' + Object.keys(query).map(key => {
+          return (
+            encodeURIComponent(key) + '=' + encodeURIComponent(query[key])
+          )
+        }).join('&')
+      )
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    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)
+    },
+    handleFetchData () {
+      this.fetchKubernetesClusterConfig()
+      this.fetchKubernetesVersion()
+      this.fetchInstances()
+      this.fetchPublicIpAddress()
+    },
+    fetchKubernetesClusterConfig () {
+      this.clusterConfigLoading = true
+      this.clusterConfig = ''
+      if (!this.isObjectEmpty(this.resource)) {
+        var params = {}
+        params.id = this.resource.id
+        api('getKubernetesClusterConfig', params).then(json => {
+          const config = json.getkubernetesclusterconfigresponse.clusterconfig
+          if (!this.isObjectEmpty(config) &&
+            this.isValidValueForKey(config, 'configdata') &&
+            config.configdata !== '') {
+            this.clusterConfig = config.configdata
+          } else {
+            this.$notification.error({
+              message: this.$t('message.request.failed'),
+              description: this.$t('message.error.retrieve.kubeconfig')
+            })
+          }
+        }).finally(() => {
+          this.clusterConfigLoading = false
+          if (!this.isObjectEmpty(this.kubernetesVersion) && this.isValidValueForKey(this.kubernetesVersion, 'semanticversion')) {
+            this.kubectlLinuxLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/linux/amd64/kubectl'
+            this.kubectlMacLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/darwin/amd64/kubectl'
+            this.kubectlWindowsLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/windows/amd64/kubectl.exe'
+          }
+        })
+      }
+    },
+    fetchKubernetesVersion () {
+      this.versionLoading = true
+      if (!this.isObjectEmpty(this.resource) && this.isValidValueForKey(this.resource, 'kubernetesversionid') &&
+        this.resource.kubernetesversionid !== '') {
+        var params = {}
+        params.id = this.resource.kubernetesversionid
+        api('listKubernetesSupportedVersions', params).then(json => {
+          const versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion
+          if (this.arrayHasItems(versionObjs)) {
+            this.kubernetesVersion = versionObjs[0]
+          }
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.versionLoading = false
+          if (!this.isObjectEmpty(this.kubernetesVersion) && this.isValidValueForKey(this.kubernetesVersion, 'semanticversion')) {
+            this.kubectlLinuxLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/linux/amd64/kubectl'
+            this.kubectlMacLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/darwin/amd64/kubectl'
+            this.kubectlWindowsLink = 'https://storage.googleapis.com/kubernetes-release/release/v' + this.kubernetesVersion.semanticversion + '/bin/windows/amd64/kubectl.exe'
+          }
+        })
+      }
+    },
+    fetchInstances () {
+      this.instanceLoading = true
+      this.virtualmachines = this.resource.virtualmachines || []
+      this.virtualmachines.map(x => { x.ipaddress = x.nic[0].ipaddress })
+      this.instanceLoading = false
+    },
+    fetchPublicIpAddress () {
+      this.networkLoading = true
+      var params = {
+        listAll: true,
+        forvirtualnetwork: true
+      }
+      if (!this.isObjectEmpty(this.resource)) {
+        if (this.isValidValueForKey(this.resource, 'projectid') &&
+          this.resource.projectid !== '') {
+          params.projectid = this.resource.projectid
+        }
+        if (this.isValidValueForKey(this.resource, 'networkid')) {
+          params.associatednetworkid = this.resource.networkid
+        }
+      }
+      api('listPublicIpAddresses', params).then(json => {
+        let ips = json.listpublicipaddressesresponse.publicipaddress
+        if (this.arrayHasItems(ips)) {
+          ips = ips.filter(x => x.issourcenat)
+          this.publicIpAddress = ips.length > 0 ? ips[0] : null
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.networkLoading = false
+      })
+    },
+    downloadKubernetesClusterConfig () {
+      var blob = new Blob([this.clusterConfig], { 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)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .list {
+
+    &__item,
+    &__row {
+      display: flex;
+      flex-wrap: wrap;
+      width: 100%;
+    }
+
+    &__item {
+      margin-bottom: -20px;
+    }
+
+    &__col {
+      flex: 1;
+      margin-right: 20px;
+      margin-bottom: 20px;
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+
+  .pagination {
+    margin-top: 20px;
+  }
+
+  .table {
+    margin-top: 20px;
+    overflow-y: auto;
+  }
+
+  .action-button {
+    margin-top: 10px;
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/compute/MigrateWizard.vue b/ui/src/views/compute/MigrateWizard.vue
new file mode 100644
index 0000000..46346e9
--- /dev/null
+++ b/ui/src/views/compute/MigrateWizard.vue
@@ -0,0 +1,272 @@
+// 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">
+    <a-input-search
+      :placeholder="$t('label.search')"
+      v-model="searchQuery"
+      style="margin-bottom: 10px;"
+      @search="fetchData" />
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="hosts"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <div slot="suitability" slot-scope="record">
+        <a-icon
+          class="host-item__suitability-icon"
+          type="check-circle"
+          theme="twoTone"
+          twoToneColor="#52c41a"
+          v-if="record.suitableformigration" />
+        <a-icon
+          class="host-item__suitability-icon"
+          type="close-circle"
+          theme="twoTone"
+          twoToneColor="#f5222d"
+          v-else />
+      </div>
+      <div slot="memused" slot-scope="record">
+        {{ record.memoryused | byteToGigabyte }} GB
+      </div>
+      <template slot="select" slot-scope="record">
+        <a-radio
+          class="host-item__radio"
+          @click="selectedHost = record"
+          :checked="record.id === selectedHost.id"
+          :disabled="!record.suitableformigration"></a-radio>
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <div style="margin-top: 20px; display: flex; justify-content:flex-end;">
+      <a-button type="primary" :disabled="!selectedHost.id" @click="submitForm">
+        {{ $t('label.ok') }}
+      </a-button>
+    </div>
+  </div>
+
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'VMMigrateWizard',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: true,
+      hosts: [],
+      selectedHost: {},
+      searchQuery: '',
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name'
+        },
+        {
+          title: this.$t('label.suitability'),
+          scopedSlots: { customRender: 'suitability' }
+        },
+        {
+          title: this.$t('label.cpuused'),
+          dataIndex: 'cpuused'
+        },
+        {
+          title: this.$t('label.memused'),
+          scopedSlots: { customRender: 'memused' }
+        },
+        {
+          title: this.$t('label.select'),
+          scopedSlots: { customRender: 'select' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('findHostsForMigration', {
+        virtualmachineid: this.resource.id,
+        keyword: this.searchQuery,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        this.hosts = response.findhostsformigrationresponse.host || []
+        this.hosts.sort((a, b) => {
+          return b.suitableformigration - a.suitableformigration
+        })
+        this.totalCount = response.findhostsformigrationresponse.count
+      }).catch(error => {
+        this.$message.error(`${this.$t('message.load.host.failed')}: ${error}`)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    submitForm () {
+      this.loading = true
+      api(this.selectedHost.requiresStorageMotion ? 'migrateVirtualMachineWithVolume' : 'migrateVirtualMachine', {
+        hostid: this.selectedHost.id,
+        virtualmachineid: this.resource.id
+      }).then(response => {
+        const jobid = this.selectedHost.requiresStorageMotion ? response.migratevirtualmachinewithvolumeresponse.jobid : response.migratevirtualmachineresponse.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.$emit('close-action')
+          },
+          errorMessage: this.$t('message.migrating.failed'),
+          errorMethod: () => {
+            this.$emit('close-action')
+          },
+          loadingMessage: `${this.$t('message.migrating.processing')} ${this.resource.name}`,
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.$emit('close-action')
+          }
+        })
+        this.$emit('close-action')
+      }).catch(error => {
+        this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+          duration: 0
+        })
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  },
+  filters: {
+    byteToGigabyte: value => {
+      return (value / Math.pow(10, 9)).toFixed(2)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+  .form {
+    width: 85vw;
+    @media (min-width: 800px) {
+      width: 750px;
+    }
+  }
+
+  .host-item {
+    padding-right: 20px;
+    padding-bottom: 0;
+    padding-left: 20px;
+
+    &--selected {
+      background-color: #e6f7ff;
+    }
+
+    &__row {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 760px) {
+        flex-direction: row;
+      }
+    }
+
+    &__value {
+      display: flex;
+      flex-direction: column;
+      align-items: flex-start;
+      flex: 1;
+      margin-bottom: 10px;
+
+      &--small {
+
+        @media (min-width: 760px) {
+          flex: none;
+          margin-right: 40px;
+          margin-left: 40px;
+        }
+      }
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__suitability-icon {
+      margin-top: 5px;
+    }
+
+    &__radio {
+      display: flex;
+      align-items: center;
+    }
+
+  }
+
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/compute/ScaleKubernetesCluster.vue b/ui/src/views/compute/ScaleKubernetesCluster.vue
new file mode 100644
index 0000000..8ebc1fb
--- /dev/null
+++ b/ui/src/views/compute/ScaleKubernetesCluster.vue
@@ -0,0 +1,237 @@
+// 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-alert type="warning">
+        <span slot="message" v-html="$t('message.kubernetes.cluster.scale')" />
+      </a-alert>
+      <br />
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.cks.cluster.size') }}
+            <a-tooltip :title="apiParams.size.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['size', {
+              initialValue: originalSize,
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="apiParams.size.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.serviceofferingid') }}
+            <a-tooltip :title="apiParams.serviceofferingid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="offering-selection"
+            v-decorator="['serviceofferingid', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="serviceOfferingLoading"
+            :placeholder="apiParams.serviceofferingid.description">
+            <a-select-option v-for="(opt, optIndex) in this.serviceOfferings" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </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: 'ScaleKubernetesCluster',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      serviceOfferings: [],
+      serviceOfferingLoading: false,
+      minCpu: 2,
+      minMemory: 2048,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.scaleKubernetesCluster || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.originalSize = !this.isObjectEmpty(this.resource) ? this.resource.size : 1
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchKubernetesVersionData()
+    },
+    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)
+    },
+    fetchKubernetesVersionData () {
+      const params = {}
+      if (!this.isObjectEmpty(this.resource)) {
+        params.id = this.resource.kubernetesversionid
+      }
+      api('listKubernetesSupportedVersions', params).then(json => {
+        const versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion
+        if (this.arrayHasItems(versionObjs) && !this.isObjectEmpty(versionObjs[0])) {
+          this.minCpu = versionObjs[0].mincpunumber
+          this.minMemory = versionObjs[0].minmemory
+        }
+      }).finally(() => {
+        this.fetchServiceOfferingData()
+      })
+    },
+    fetchServiceOfferingData () {
+      this.serviceOfferings = []
+      const params = {}
+      this.serviceOfferingLoading = true
+      api('listServiceOfferings', params).then(json => {
+        var items = json.listserviceofferingsresponse.serviceoffering
+        if (items != null) {
+          for (var i = 0; i < items.length; i++) {
+            if (items[i].iscustomized === false &&
+                items[i].cpunumber >= this.minCpu && items[i].memory >= this.minMemory) {
+              this.serviceOfferings.push(items[i])
+            }
+          }
+        }
+      }).finally(() => {
+        this.serviceOfferingLoading = false
+        if (this.arrayHasItems(this.serviceOfferings)) {
+          for (var i = 0; i < this.serviceOfferings.length; i++) {
+            if (this.serviceOfferings[i].id === this.resource.serviceofferingid) {
+              this.form.setFieldsValue({
+                serviceofferingid: i
+              })
+              break
+            }
+          }
+        }
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          id: this.resource.id
+        }
+        if (this.isValidValueForKey(values, 'size') && values.size > 0) {
+          params.size = values.size
+        }
+        if (this.isValidValueForKey(values, 'serviceofferingid') && this.arrayHasItems(this.serviceOfferings)) {
+          params.serviceofferingid = this.serviceOfferings[values.serviceofferingid].id
+        }
+        api('scaleKubernetesCluster', params).then(json => {
+          const jobId = json.scalekubernetesclusterresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.kubernetes.cluster.scale'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            loadingMessage: `${this.$t('label.kubernetes.cluster.scale')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            successMessage: `${this.$t('message.success.scale.kubernetes')} ${this.resource.name}`,
+            successMethod: result => {
+              this.$emit('refresh-data')
+            }
+          })
+          this.closeAction()
+          this.$emit('refresh-data')
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    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/ScaleVM.vue b/ui/src/views/compute/ScaleVM.vue
new file mode 100644
index 0000000..125e753
--- /dev/null
+++ b/ui/src/views/compute/ScaleVM.vue
@@ -0,0 +1,203 @@
+// 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>
+  <a-form class="form">
+    <p v-html="getMessage()"></p>
+
+    <div v-if="loading" class="loading">
+      <a-icon type="loading" style="color: #1890ff;"></a-icon>
+    </div>
+
+    <compute-offering-selection
+      :compute-items="offerings"
+      :loading="loading"
+      :rowCount="total"
+      size="small"
+      @select-compute-item="($event) => updateComputeOffering($event)"
+      @handle-search-filter="($event) => fetchData($event)" />
+
+    <compute-selection
+      v-if="selectedOffering && selectedOffering.iscustomized"
+      :cpunumber-input-decorator="cpuNumberKey"
+      :cpuspeed-input-decorator="cpuSpeedKey"
+      :memory-input-decorator="memoryKey"
+      :computeOfferingId="selectedOffering.id"
+      :isConstrained="'serviceofferingdetails' in selectedOffering"
+      :minCpu="getMinCpu()"
+      :maxCpu="'serviceofferingdetails' in selectedOffering ? selectedOffering.serviceofferingdetails.maxcpunumber*1 : Number.MAX_SAFE_INTEGER"
+      :minMemory="getMinMemory()"
+      :maxMemory="'serviceofferingdetails' in selectedOffering ? selectedOffering.serviceofferingdetails.maxmemory*1 : Number.MAX_SAFE_INTEGER"
+      @update-compute-cpunumber="updateFieldValue"
+      @update-compute-cpuspeed="updateFieldValue"
+      @update-compute-memory="updateFieldValue" />
+
+    <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>
+</template>
+
+<script>
+import { api } from '@/api'
+import ComputeOfferingSelection from '@views/compute/wizard/ComputeOfferingSelection'
+import ComputeSelection from '@views/compute/wizard/ComputeSelection'
+
+export default {
+  name: 'ScaleVM',
+  components: {
+    ComputeOfferingSelection,
+    ComputeSelection
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      offeringsMap: {},
+      offerings: [],
+      selectedOffering: {},
+      total: 0,
+      params: { id: this.resource.id },
+      loading: false,
+      cpuNumberKey: 'details[0].cpuNumber',
+      cpuSpeedKey: 'details[0].cpuSpeed',
+      memoryKey: 'details[0].memory'
+    }
+  },
+  mounted () {
+    this.fetchData({
+      keyword: '',
+      pageSize: 10,
+      page: 1
+    })
+  },
+  methods: {
+    fetchData (options) {
+      this.loading = true
+      this.total = 0
+      this.offerings = []
+      this.offeringsMap = []
+      api('listServiceOfferings', {
+        virtualmachineid: this.resource.id,
+        keyword: options.keyword,
+        page: options.page,
+        pageSize: options.pageSize,
+        details: 'min',
+        response: 'json'
+      }).then(response => {
+        this.total = response.listserviceofferingsresponse.count
+        if (this.total === 0) {
+          return
+        }
+        this.offerings = response.listserviceofferingsresponse.serviceoffering
+        this.offerings.map(i => { this.offeringsMap[i.id] = i })
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    getMinCpu () {
+      // We can only scale up while a VM is running
+      if (this.resource.state === 'Running') {
+        return this.resource.cpunumber
+      }
+      return 'serviceofferingdetails' in this.selectedOffering ? this.selectedOffering.serviceofferingdetails.mincpunumber * 1 : 1
+    },
+    getMinMemory () {
+      // We can only scale up while a VM is running
+      if (this.resource.state === 'Running') {
+        return this.resource.memory
+      }
+      return 'serviceofferingdetails' in this.selectedOffering ? this.selectedOffering.serviceofferingdetails.minmemory * 1 : 32
+    },
+    getMessage () {
+      if (this.resource.hypervisor === 'VMware') {
+        return this.$t('message.read.admin.guide.scaling.up')
+      }
+      return this.$t('message.change.offering.confirm')
+    },
+    updateComputeOffering (id) {
+      // Delete custom details
+      delete this.params[this.cpuNumberKey]
+      delete this.params[this.cpuSpeedKey]
+      delete this.params[this.memoryKey]
+
+      this.params.serviceofferingid = id
+      this.selectedOffering = this.offeringsMap[id]
+    },
+    updateFieldValue (name, value) {
+      this.params[name] = value
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    handleSubmit () {
+      this.loading = true
+
+      if ('cpuspeed' in this.selectedOffering && this.selectedOffering.iscustomized) {
+        delete this.params[this.cpuSpeedKey]
+      }
+
+      api('scaleVirtualMachine', this.params).then(response => {
+        const jobId = response.scalevirtualmachineresponse.jobid
+        if (jobId) {
+          this.$pollJob({
+            jobId,
+            successMethod: result => {
+              this.$notification.success({
+                message: this.$t('message.success.change.offering')
+              })
+            },
+            loadingMessage: this.$t('message.scale.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+        }
+        this.$parent.$parent.close()
+        this.parentFetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+.form {
+  width: 90vw;
+  @media (min-width: 700px) {
+    width: 50vw;
+  }
+}
+
+.action-button {
+  margin-top: 10px;
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/compute/StartVirtualMachine.vue b/ui/src/views/compute/StartVirtualMachine.vue
new file mode 100644
index 0000000..5bca860
--- /dev/null
+++ b/ui/src/views/compute/StartVirtualMachine.vue
@@ -0,0 +1,291 @@
+// 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-alert type="warning">
+        <span slot="message" v-html="$t('message.action.start.instance')" />
+      </a-alert>
+      <br />
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <div v-if="this.$store.getters.userInfo.roletype === 'Admin'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.podid') }}
+              <a-tooltip :title="apiParams.podid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['podid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="podsLoading"
+              :placeholder="apiParams.podid.description"
+              @change="handlePodChange">
+              <a-select-option v-for="pod in this.pods" :key="pod.id">
+                {{ pod.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.clusterid') }}
+              <a-tooltip :title="apiParams.clusterid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              id="cluster-selection"
+              v-decorator="['clusterid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="clustersLoading"
+              :placeholder="apiParams.clusterid.description"
+              @change="handleClusterChange">
+              <a-select-option v-for="cluster in this.clusters" :key="cluster.id">
+                {{ cluster.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.hostid') }}
+              <a-tooltip :title="apiParams.hostid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              id="host-selection"
+              v-decorator="['hostid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="hostsLoading"
+              :placeholder="apiParams.hostid.description">
+              <a-select-option v-for="host in this.hosts" :key="host.id">
+                {{ host.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+
+        <a-form-item v-if="resource.hypervisor === 'VMware'">
+          <span slot="label">
+            {{ $t('label.bootintosetup') }}
+            <a-tooltip :title="apiParams.bootintosetup.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch
+            v-decorator="['bootintosetup']">
+          </a-switch>
+        </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: 'StartVirtualMachine',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      pods: [],
+      clusters: [],
+      hosts: [],
+      podsLoading: false,
+      clustersLoading: false,
+      hostsLoading: false,
+      loading: false
+    }
+  },
+  inject: ['parentFetchData'],
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.startVirtualMachine || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    if (this.$store.getters.userInfo.roletype === 'Admin') {
+      this.fetchPods()
+      this.fetchClusters()
+      this.fetchHosts()
+    }
+  },
+  methods: {
+    fetchPods () {
+      this.pods = []
+      this.podsLoading = true
+      const params = { zoneid: this.resource.zoneid }
+      api('listPods', params).then(json => {
+        this.pods = json.listpodsresponse.pod || []
+        if (this.pods.length === 0) {
+          this.$notification.error({
+            message: 'No pods found',
+            duration: 0
+          })
+        }
+      }).finally(() => {
+        this.podsLoading = false
+      })
+    },
+    fetchClusters (podid) {
+      this.clusters = []
+      this.clustersLoading = true
+      const params = { zoneid: this.resource.zoneid }
+      if (podid) {
+        params.podid = podid
+      }
+      api('listClusters', params).then(json => {
+        this.clusters = json.listclustersresponse.cluster || []
+        if (this.clusters.length === 0) {
+          this.$notification.error({
+            message: 'No clusters found',
+            duration: 0
+          })
+        }
+      }).finally(() => {
+        this.clustersLoading = false
+      })
+    },
+    fetchHosts (podid, clusterid) {
+      this.hosts = []
+      this.hostsLoading = true
+      const params = { zoneid: this.resource.zoneid, type: 'Routing', state: 'Up' }
+      if (podid) {
+        params.podid = podid
+      }
+      if (clusterid) {
+        params.clusterid = clusterid
+      }
+      api('listHosts', params).then(json => {
+        this.hosts = json.listhostsresponse.host || []
+        if (this.hosts.length === 0) {
+          this.$notification.error({
+            message: 'No hosts found',
+            duration: 0
+          })
+        }
+      }).finally(() => {
+        this.hostsLoading = false
+      })
+    },
+    handlePodChange (podid) {
+      this.form.clearField('clusterid')
+      this.form.clearField('hostid')
+      this.fetchClusters(podid)
+      this.fetchHosts(podid)
+    },
+    handleClusterChange (clusterid) {
+      this.form.clearField('hostid')
+      this.fetchHosts('', clusterid)
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        this.loading = true
+        const params = {
+          id: this.resource.id
+        }
+        for (const key in values) {
+          if (values[key]) {
+            params[key] = values[key]
+          }
+        }
+        api('startVirtualMachine', params).then(json => {
+          const jobId = json.startvirtualmachineresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.action.start.instance'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            loadingMessage: `${this.$t('label.action.start.instance')} ${this.resource.name}`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            successMessage: `${this.$t('label.action.start.instance')} ${this.resource.name}`,
+            successMethod: () => {
+              this.parentFetchData()
+            },
+            response: (result) => { return result.virtualmachine && result.virtualmachine.password ? `Password of the VM is ${result.virtualmachine.password}` : null }
+          })
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    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/UpgradeKubernetesCluster.vue b/ui/src/views/compute/UpgradeKubernetesCluster.vue
new file mode 100644
index 0000000..18b51b2
--- /dev/null
+++ b/ui/src/views/compute/UpgradeKubernetesCluster.vue
@@ -0,0 +1,209 @@
+// 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-alert type="warning">
+        <span slot="message" v-html="$t('message.kubernetes.cluster.upgrade')" />
+      </a-alert>
+      <br />
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.kubernetesversionid') }}
+            <a-tooltip :title="apiParams.kubernetesversionid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="version-selection"
+            v-decorator="['kubernetesversionid', {
+              rules: [{ required: true }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="kubernetesVersionLoading"
+            :placeholder="apiParams.kubernetesversionid.description">
+            <a-select-option v-for="(opt, optIndex) in this.kubernetesVersions" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </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: 'UpgradeKubernetesCluster',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      kubernetesVersions: [],
+      kubernetesVersionLoading: false,
+      minCpu: 2,
+      minMemory: 2048,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.upgradeKubernetesCluster || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchKubernetesVersionData()
+    },
+    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)
+    },
+    fetchKubernetesVersionData () {
+      this.kubernetesVersions = []
+      const params = {}
+      if (!this.isObjectEmpty(this.resource)) {
+        params.minimumkubernetesversionid = this.resource.kubernetesversionid
+      }
+      this.kubernetesVersionLoading = true
+      api('listKubernetesSupportedVersions', params).then(json => {
+        const versionObjs = json.listkubernetessupportedversionsresponse.kubernetessupportedversion
+        if (this.arrayHasItems(versionObjs)) {
+          var clusterVersion = null
+          for (var j = 0; j < versionObjs.length; j++) {
+            if (versionObjs[j].id === this.resource.kubernetesversionid) {
+              clusterVersion = versionObjs[j]
+              break
+            }
+          }
+          for (var i = 0; i < versionObjs.length; i++) {
+            if (versionObjs[i].id !== this.resource.kubernetesversionid &&
+              (clusterVersion == null || (clusterVersion != null && versionObjs[i].semanticversion !== clusterVersion.semanticversion)) &&
+              versionObjs[i].state === 'Enabled' && versionObjs[i].isostate === 'Ready') {
+              this.kubernetesVersions.push({
+                id: versionObjs[i].id,
+                description: versionObjs[i].name
+              })
+            }
+          }
+        }
+      }).finally(() => {
+        this.kubernetesVersionLoading = false
+        if (this.arrayHasItems(this.kubernetesVersions)) {
+          this.form.setFieldsValue({
+            kubernetesversionid: 0
+          })
+        }
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          id: this.resource.id
+        }
+        if (this.isValidValueForKey(values, 'kubernetesversionid') && this.arrayHasItems(this.kubernetesVersions)) {
+          params.kubernetesversionid = this.kubernetesVersions[values.kubernetesversionid].id
+        }
+        api('upgradeKubernetesCluster', params).then(json => {
+          this.$emit('refresh-data')
+          const jobId = json.upgradekubernetesclusterresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.kubernetes.cluster.upgrade'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            loadingMessage: `${this.$t('label.kubernetes.cluster.upgrade')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            successMessage: `${this.$t('message.success.upgrade.kubernetes')} ${this.resource.name}`,
+            successMethod: result => {
+              this.$emit('refresh-data')
+            }
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    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/backup/BackupSchedule.vue b/ui/src/views/compute/backup/BackupSchedule.vue
new file mode 100644
index 0000000..daf31cc
--- /dev/null
+++ b/ui/src/views/compute/backup/BackupSchedule.vue
@@ -0,0 +1,217 @@
+// 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="list-schedule">
+    <a-table
+      size="small"
+      :columns="columns"
+      :dataSource="dataSchedules"
+      :rowKey="record => record.virtualmachineid"
+      :pagination="false"
+      :loading="loading">
+      <div slot="icon" slot-scope="text, record">
+        <label class="interval-icon">
+          <span v-if="record.intervaltype==='HOURLY'">
+            <a-icon type="clock-circle" />
+          </span>
+          <span class="custom-icon icon-daily" v-else-if="record.intervaltype==='DAILY'">
+            <a-icon type="calendar" />
+          </span>
+          <span class="custom-icon icon-weekly" v-else-if="record.intervaltype==='WEEKLY'">
+            <a-icon type="calendar" />
+          </span>
+          <span class="custom-icon icon-monthly" v-else-if="record.intervaltype==='MONTHLY'">
+            <a-icon type="calendar" />
+          </span>
+        </label>
+      </div>
+      <div slot="time" slot-scope="text, record">
+        <label class="interval-content">
+          <span v-if="record.intervaltype==='HOURLY'">{{ record.schedule + ' ' + $t('label.min.past.hour') }}</span>
+          <span v-else>{{ record.schedule.split(':')[1] + ':' + record.schedule.split(':')[0] }}</span>
+        </label>
+      </div>
+      <div slot="interval" slot-scope="text, record">
+        <span v-if="record.intervaltype==='WEEKLY'">
+          {{ `${$t('label.every')} ${$t(listDayOfWeek[record.schedule.split(':')[2] - 1])}` }}
+        </span>
+        <span v-else-if="record.intervaltype==='MONTHLY'">
+          {{ `${$t('label.day')} ${record.schedule.split(':')[2]} ${$t('label.of.month')}` }}
+        </span>
+      </div>
+      <div slot="timezone" slot-scope="text, record">
+        <label>{{ getTimeZone(record.timezone) }}</label>
+      </div>
+      <div slot="action" class="account-button-action" slot-scope="text, record">
+        <a-tooltip placement="top">
+          <template slot="title">
+            {{ $t('label.delete') }}
+          </template>
+          <a-button
+            type="danger"
+            shape="circle"
+            icon="close"
+            size="small"
+            :loading="actionLoading"
+            @click="handleClickDelete(record)"/>
+        </a-tooltip>
+      </div>
+    </a-table>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZoneName } from '@/utils/timezone'
+
+export default {
+  name: 'BackupSchedule',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    dataSource: {
+      type: Object,
+      required: true
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      dataSchedules: [],
+      listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
+    }
+  },
+  computed: {
+    columns () {
+      return [
+        {
+          title: '',
+          dataIndex: 'icon',
+          width: 30,
+          scopedSlots: { customRender: 'icon' }
+        },
+        {
+          title: this.$t('label.time'),
+          dataIndex: 'schedule',
+          scopedSlots: { customRender: 'time' }
+        },
+        {
+          title: '',
+          dataIndex: 'interval',
+          scopedSlots: { customRender: 'interval' }
+        },
+        {
+          title: this.$t('label.timezone'),
+          dataIndex: 'timezone',
+          scopedSlots: { customRender: 'timezone' }
+        },
+        {
+          title: this.$t('label.action'),
+          dataIndex: 'action',
+          width: 50,
+          scopedSlots: { customRender: 'action' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.dataSchedules = []
+    if (this.dataSource && Object.keys(this.dataSource).length > 0) {
+      this.dataSchedules.push(this.dataSource)
+    }
+  },
+  inject: ['refreshSchedule'],
+  watch: {
+    dataSource (newData, oldData) {
+      this.dataSchedules = []
+      if (newData && Object.keys(newData).length > 0) {
+        this.dataSchedules.push(newData)
+      }
+    }
+  },
+  methods: {
+    handleClickDelete (record) {
+      const params = {}
+      params.virtualmachineid = record.virtualmachineid
+      this.actionLoading = true
+      api('deleteBackupSchedule', params).then(json => {
+        if (json.deletebackupscheduleresponse.success) {
+          this.$notification.success({
+            message: this.$t('label.scheduled.backups'),
+            description: this.$t('message.success.delete.backup.schedule')
+          })
+        }
+        this.refreshSchedule()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.actionLoading = false
+      })
+    },
+    getTimeZone (timeZone) {
+      return timeZoneName(timeZone)
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.interval-icon {
+  span {
+    position: relative;
+    font-size: 18px;
+  }
+
+  .custom-icon:before {
+    font-size: 8px;
+    position: absolute;
+    top: 8px;
+    left: 3.5px;
+    color: #000;
+    font-weight: 700;
+    line-height: 1.7;
+  }
+
+  .icon-daily:before {
+    content: "01";
+    left: 5px;
+    top: 7px;
+    line-height: 1.9;
+  }
+
+  .icon-weekly:before {
+    content: "1-7";
+    left: 3px;
+    line-height: 1.7;
+  }
+
+  .icon-monthly:before {
+    content: "***";
+  }
+}
+
+/deep/.ant-btn > .anticon {
+  line-height: 1.8;
+}
+</style>
diff --git a/ui/src/views/compute/backup/FormSchedule.vue b/ui/src/views/compute/backup/FormSchedule.vue
new file mode 100644
index 0000000..c30b3e2
--- /dev/null
+++ b/ui/src/views/compute/backup/FormSchedule.vue
@@ -0,0 +1,327 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <label>
+        {{ $t('label.header.backup.schedule') }}
+      </label>
+      <div class="form">
+        <a-form
+          :form="form"
+          layout="vertical"
+          @submit="handleSubmit">
+          <a-row :gutter="12">
+            <a-col :md="24" :lg="24">
+              <a-form-item :label="$t('label.intervaltype')">
+                <a-radio-group
+                  v-decorator="['intervaltype', {
+                    initialValue: intervalType
+                  }]"
+                  buttonStyle="solid"
+                  @change="handleChangeIntervalType">
+                  <a-radio-button value="hourly">
+                    {{ $t('label.hourly') }}
+                  </a-radio-button>
+                  <a-radio-button value="daily">
+                    {{ $t('label.daily') }}
+                  </a-radio-button>
+                  <a-radio-button value="weekly">
+                    {{ $t('label.weekly') }}
+                  </a-radio-button>
+                  <a-radio-button value="monthly">
+                    {{ $t('label.monthly') }}
+                  </a-radio-button>
+                </a-radio-group>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='hourly'">
+              <a-form-item :label="$t('label.time')">
+                <a-tooltip
+                  placement="right"
+                  :title="$t('label.minute.past.hour')">
+                  <a-input-number
+                    style="width: 100%"
+                    v-decorator="['time', {
+                      rules: [{required: true, message: $t('message.error.required.input')}]
+                    }]"
+                    :min="1"
+                    :max="59"/>
+                </a-tooltip>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="['daily', 'weekly', 'monthly'].includes(intervalType)">
+              <a-form-item
+                class="custom-time-select"
+                :label="$t('label.time')">
+                <a-time-picker
+                  use12Hours
+                  format="h:mm A"
+                  v-decorator="['timeSelect', {
+                    rules: [{
+                      type: 'object',
+                      required: true,
+                      message: $t('message.error.time')
+                    }]
+                  }]" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='weekly'">
+              <a-form-item :label="$t('label.day.of.week')">
+                <a-select
+                  v-decorator="['day-of-week', {
+                    rules: [{
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }]
+                  }]" >
+                  <a-select-option v-for="(opt, optIndex) in dayOfWeek" :key="optIndex">
+                    {{ opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='monthly'">
+              <a-form-item :label="$t('label.day.of.month')">
+                <a-select
+                  v-decorator="['day-of-month', {
+                    rules: [{
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }]
+                  }]">
+                  <a-select-option v-for="opt in dayOfMonth" :key="opt.name">
+                    {{ opt.name }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="24">
+              <a-form-item :label="$t('label.timezone')">
+                <a-select
+                  showSearch
+                  v-decorator="['timezone', {
+                    rules: [{
+                      required: true,
+                      messamessage: `${this.$t('message.error.select')}`
+                    }]
+                  }]"
+                  :loading="fetching">
+                  <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+                    {{ opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="actionLoading"
+              @click="closeAction">
+              {{ this.$t('label.cancel') }}
+            </a-button>
+            <a-button
+              :loading="actionLoading"
+              type="primary"
+              @click="handleSubmit">
+              {{ this.$t('label.ok') }}
+            </a-button>
+          </div>
+        </a-form>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import debounce from 'lodash/debounce'
+
+export default {
+  name: 'FormSchedule',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    dataSource: {
+      type: Object,
+      required: true
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    this.fetchTimeZone = debounce(this.fetchTimeZone, 800)
+
+    return {
+      dayOfWeek: [],
+      dayOfMonth: [],
+      timeZoneMap: [],
+      fetching: false,
+      actionLoading: false,
+      intervalValue: 0,
+      intervalType: 'hourly',
+      listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchTimeZone()
+  },
+  inject: ['refreshSchedule', 'closeSchedule'],
+  methods: {
+    fetchTimeZone (value) {
+      this.timeZoneMap = []
+      this.fetching = true
+
+      timeZone(value).then(json => {
+        this.timeZoneMap = json
+        this.fetching = false
+      })
+    },
+    fetchDayOfWeek () {
+      this.dayOfWeek = []
+
+      for (const index in this.listDayOfWeek) {
+        const dayName = this.listDayOfWeek[index]
+        this.dayOfWeek.push({
+          id: dayName,
+          name: this.$t('label.' + dayName)
+        })
+      }
+    },
+    fetchDayOfMonth () {
+      this.dayOfMonth = []
+      const maxDayOfMonth = 28
+      for (let num = 1; num <= maxDayOfMonth; num++) {
+        this.dayOfMonth.push({
+          id: num,
+          name: num
+        })
+      }
+    },
+    handleChangeIntervalType (e) {
+      this.intervalType = e.target.value
+      this.resetForm()
+
+      switch (this.intervalType) {
+        case 'hourly':
+          this.intervalValue = 'HOURLY'
+          break
+        case 'daily':
+          this.intervalValue = 'DAILY'
+          break
+        case 'weekly':
+          this.intervalValue = 'WEEKLY'
+          this.fetchDayOfWeek()
+          break
+        case 'monthly':
+          this.intervalValue = 'MONTHLY'
+          this.fetchDayOfMonth()
+          break
+      }
+    },
+    handleSubmit (e) {
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+        const params = {}
+        params.virtualmachineid = this.resource.id
+        params.intervaltype = values.intervaltype
+        params.timezone = values.timezone
+        switch (values.intervaltype) {
+          case 'hourly':
+            params.schedule = values.time
+            break
+          case 'daily':
+            params.schedule = values.timeSelect.format('mm:HH')
+            break
+          case 'weekly':
+            params.schedule = [values.timeSelect.format('mm:HH'), (values['day-of-week'] + 1)].join(':')
+            break
+          case 'monthly':
+            params.schedule = [values.timeSelect.format('mm:HH'), values['day-of-month']].join(':')
+            break
+        }
+        this.actionLoading = true
+        api('createBackupSchedule', params).then(json => {
+          this.$notification.success({
+            message: this.$t('label.scheduled.backups'),
+            description: this.$t('message.success.config.backup.schedule')
+          })
+          this.refreshSchedule()
+          this.resetForm()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    resetForm () {
+      this.form.setFieldsValue({
+        time: undefined,
+        timezone: undefined,
+        timeSelect: undefined,
+        'day-of-week': undefined,
+        'day-of-month': undefined
+      })
+      this.tags = []
+    },
+    closeAction () {
+      this.closeSchedule()
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .ant-tag {
+    margin-bottom: 10px;
+  }
+
+  /deep/.custom-time-select .ant-time-picker {
+    width: 100%;
+  }
+
+  /deep/.ant-divider-horizontal {
+    margin-top: 0;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.action-button {
+  margin-top: 20px;
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/compute/wizard/AffinityGroupSelection.vue b/ui/src/views/compute/wizard/AffinityGroupSelection.vue
new file mode 100644
index 0000000..e3ce1c7
--- /dev/null
+++ b/ui/src/views/compute/wizard/AffinityGroupSelection.vue
@@ -0,0 +1,171 @@
+// 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>
+    {{ $t('message.select.affinity.groups') }}
+    <a-input-search
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-table
+      :loading="loading"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      size="middle"
+      :scroll="{ y: 225 }"
+    >
+    </a-table>
+
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+
+export default {
+  name: 'AffinityGroupSelection',
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    rowCount: {
+      type: Number,
+      default: () => 0
+    },
+    value: {
+      type: Array,
+      default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.affinity.groups'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'description',
+          title: this.$t('label.description'),
+          width: '60%'
+        }
+      ],
+      selectedRowKeys: [],
+      oldZoneId: null,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  computed: {
+    rowSelection () {
+      return {
+        type: 'checkbox',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: (rows) => {
+          this.$emit('select-affinity-group-item', rows)
+        }
+      }
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && !_.isEqual(newValue, oldValue)) {
+        this.selectedRowKeys = newValue
+      }
+    },
+    loading () {
+      if (!this.loading) {
+        if (this.preFillContent.affinitygroupids) {
+          this.selectedRowKeys = this.preFillContent.affinitygroupids
+          this.$emit('select-affinity-group-item', this.preFillContent.affinitygroupids)
+        } else {
+          if (this.oldZoneId === this.zoneId) {
+            return
+          }
+          this.oldZoneId = this.zoneId
+          this.selectedRowKeys = []
+          this.$emit('select-affinity-group-item', null)
+        }
+      }
+    }
+  },
+  methods: {
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/ComputeOfferingSelection.vue b/ui/src/views/compute/wizard/ComputeOfferingSelection.vue
new file mode 100644
index 0000000..c372b82
--- /dev/null
+++ b/ui/src/views/compute/wizard/ComputeOfferingSelection.vue
@@ -0,0 +1,259 @@
+// 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>
+    <a-input-search
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-table
+      :columns="columns"
+      :dataSource="tableSource"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      :customRow="onClickRow"
+      :loading="loading"
+      size="middle"
+      :scroll="{ y: 225 }"
+    >
+      <span slot="cpuTitle"><a-icon type="appstore" /> {{ $t('label.cpu') }}</span>
+      <span slot="ramTitle"><a-icon type="bulb" /> {{ $t('label.memory') }}</span>
+    </a-table>
+
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ComputeOfferingSelection',
+  props: {
+    computeItems: {
+      type: Array,
+      default: () => []
+    },
+    rowCount: {
+      type: Number,
+      default: () => 0
+    },
+    value: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    },
+    minimumCpunumber: {
+      type: Number,
+      default: 0
+    },
+    minimumCpuspeed: {
+      type: Number,
+      default: 0
+    },
+    minimumMemory: {
+      type: Number,
+      default: 0
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.serviceofferingid'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'cpu',
+          slots: { title: 'cpuTitle' },
+          width: '30%'
+        },
+        {
+          dataIndex: 'ram',
+          slots: { title: 'ramTitle' },
+          width: '30%'
+        }
+      ],
+      selectedRowKeys: [],
+      oldZoneId: null,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  computed: {
+    tableSource () {
+      return this.computeItems.map((item) => {
+        var maxCpuNumber = item.cpunumber
+        var maxCpuSpeed = item.cpuspeed
+        var maxMemory = item.memory
+        var cpuNumberValue = (item.cpunumber !== null && item.cpunumber !== undefined && item.cpunumber > 0) ? item.cpunumber + '' : ''
+        var cpuSpeedValue = (item.cpuspeed !== null && item.cpuspeed !== undefined && item.cpuspeed > 0) ? parseFloat(item.cpuspeed / 1000.0).toFixed(2) + '' : ''
+        var ramValue = (item.memory !== null && item.memory !== undefined && item.memory > 0) ? item.memory + '' : ''
+        if (item.iscustomized === true) {
+          if ('serviceofferingdetails' in item &&
+            'mincpunumber' in item.serviceofferingdetails &&
+            'maxcpunumber' in item.serviceofferingdetails) {
+            maxCpuNumber = item.serviceofferingdetails.maxcpunumber
+            cpuNumberValue = item.serviceofferingdetails.mincpunumber + '-' + item.serviceofferingdetails.maxcpunumber
+          }
+          if ('serviceofferingdetails' in item &&
+            'minmemory' in item.serviceofferingdetails &&
+            'maxmemory' in item.serviceofferingdetails) {
+            maxMemory = item.serviceofferingdetails.maxmemory
+            ramValue = item.serviceofferingdetails.minmemory + '-' + item.serviceofferingdetails.maxmemory
+          }
+        }
+        var disabled = false
+        if (this.minimumCpunumber > 0 && ((item.iscustomized === false && maxCpuNumber !== this.minimumCpunumber) ||
+            (item.iscustomized === true && maxCpuNumber < this.minimumCpunumber))) {
+          disabled = true
+        }
+        if (disabled === false && this.minimumCpuspeed > 0 && maxCpuSpeed && maxCpuSpeed !== this.minimumCpuspeed) {
+          disabled = true
+        }
+        if (disabled === false && maxMemory && this.minimumMemory > 0 &&
+          ((item.iscustomized === false && maxMemory !== this.minimumMemory) ||
+            (item.iscustomized === true && maxMemory < this.minimumMemory))) {
+          disabled = true
+        }
+        return {
+          key: item.id,
+          name: item.name,
+          cpu: cpuNumberValue.length > 0 ? `${cpuNumberValue} CPU x ${cpuSpeedValue} Ghz` : '',
+          ram: ramValue.length > 0 ? `${ramValue} MB` : '',
+          disabled: disabled
+        }
+      })
+    },
+    rowSelection () {
+      return {
+        type: 'radio',
+        selectedRowKeys: this.selectedRowKeys || [],
+        onChange: this.onSelectRow,
+        getCheckboxProps: (record) => ({
+          props: {
+            disabled: record.disabled
+          }
+        })
+      }
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && newValue !== oldValue) {
+        this.selectedRowKeys = [newValue]
+      } else {
+        this.selectedRowKeys = []
+      }
+    },
+    loading () {
+      if (!this.loading) {
+        if (!this.preFillContent) {
+          return
+        }
+        if (this.preFillContent.computeofferingid) {
+          this.selectedRowKeys = [this.preFillContent.computeofferingid]
+          this.$emit('select-compute-item', this.preFillContent.computeofferingid)
+        } else {
+          if (this.oldZoneId === this.zoneId) {
+            return
+          }
+          this.oldZoneId = this.zoneId
+          if (this.computeItems && this.computeItems.length > 0) {
+            this.selectedRowKeys = [this.computeItems[0].id]
+            this.$emit('select-compute-item', this.computeItems[0].id)
+          }
+        }
+      }
+    }
+  },
+  methods: {
+    onSelectRow (value) {
+      this.selectedRowKeys = value
+      this.$emit('select-compute-item', value[0])
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onClickRow (record) {
+      return {
+        on: {
+          click: () => {
+            this.selectedRowKeys = [record.key]
+            this.$emit('select-compute-item', record.key)
+          }
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+
+  /deep/.ant-table-tbody > tr > td {
+    cursor: pointer;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/ComputeSelection.vue b/ui/src/views/compute/wizard/ComputeSelection.vue
new file mode 100644
index 0000000..46a9f73
--- /dev/null
+++ b/ui/src/views/compute/wizard/ComputeSelection.vue
@@ -0,0 +1,251 @@
+// 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>
+  <a-card>
+    <a-col>
+      <a-row>
+        <a-col :md="colContraned" :lg="colContraned">
+          <a-form-item
+            :label="$t('label.cpunumber')"
+            :validate-status="errors.cpu.status"
+            :help="errors.cpu.message">
+            <a-row :gutter="12">
+              <a-col :md="10" :lg="10" v-show="isConstrained">
+                <a-slider
+                  :min="minCpu"
+                  :max="maxCpu"
+                  v-model="cpuNumberInputValue"
+                  @change="($event) => updateComputeCpuNumber($event)"
+                />
+              </a-col>
+              <a-col :md="4" :lg="4">
+                <a-input-number
+                  v-model="cpuNumberInputValue"
+                  @change="($event) => updateComputeCpuNumber($event)"
+                />
+              </a-col>
+            </a-row>
+          </a-form-item>
+        </a-col>
+        <a-col :md="8" :lg="8" v-show="!isConstrained">
+          <a-form-item
+            :label="$t('label.cpuspeed')"
+            :validate-status="errors.cpuspeed.status"
+            :help="errors.cpuspeed.message">
+            <a-input-number
+              v-model="cpuSpeedInputValue"
+              @change="($event) => updateComputeCpuSpeed($event)"
+            />
+          </a-form-item>
+        </a-col>
+        <a-col :md="colContraned" :lg="colContraned">
+          <a-form-item
+            :label="$t('label.memory.mb')"
+            :validate-status="errors.memory.status"
+            :help="errors.memory.message">
+            <a-row :gutter="12">
+              <a-col :md="10" :lg="10" v-show="isConstrained">
+                <a-slider
+                  :min="minMemory"
+                  :max="maxMemory"
+                  v-model="memoryInputValue"
+                  @change="($event) => updateComputeMemory($event)"
+                />
+              </a-col>
+              <a-col :md="4" :lg="4">
+                <a-input-number
+                  v-model="memoryInputValue"
+                  @change="($event) => updateComputeMemory($event)"
+                />
+              </a-col>
+            </a-row>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-col>
+  </a-card>
+</template>
+
+<script>
+export default {
+  name: 'ComputeSelection',
+  props: {
+    computeOfferingId: {
+      type: String,
+      default: () => ''
+    },
+    isConstrained: {
+      type: Boolean,
+      default: true
+    },
+    minCpu: {
+      type: Number,
+      default: 0
+    },
+    maxCpu: {
+      type: Number,
+      default: 2
+    },
+    minMemory: {
+      type: Number,
+      default: 0
+    },
+    maxMemory: {
+      type: Number,
+      default: 256
+    },
+    cpunumberInputDecorator: {
+      type: String,
+      default: ''
+    },
+    cpuspeedInputDecorator: {
+      type: String,
+      default: ''
+    },
+    memoryInputDecorator: {
+      type: String,
+      default: ''
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      cpuNumberInputValue: 0,
+      cpuSpeedInputValue: 0,
+      memoryInputValue: 0,
+      errors: {
+        cpu: {
+          status: '',
+          message: ''
+        },
+        cpuspeed: {
+          status: '',
+          message: ''
+        },
+        memory: {
+          status: '',
+          message: ''
+        }
+      }
+    }
+  },
+  computed: {
+    colContraned () {
+      return this.isConstrained ? 12 : 8
+    }
+  },
+  watch: {
+    computeOfferingId (newValue, oldValue) {
+      if (newValue !== oldValue) {
+        this.fillValue()
+      }
+    }
+  },
+  mounted () {
+    this.fillValue()
+  },
+  methods: {
+    fillValue () {
+      this.cpuNumberInputValue = this.minCpu
+      this.memoryInputValue = this.minMemory
+
+      if (!this.preFillContent) {
+        this.updateComputeCpuNumber(this.cpuNumberInputValue)
+        this.updateComputeCpuSpeed(this.cpuSpeedInputValue)
+        this.updateComputeMemory(this.memoryInputValue)
+        return
+      }
+      if (this.preFillContent.cpunumber) {
+        this.cpuNumberInputValue = this.preFillContent.cpunumber
+      }
+      if (this.preFillContent.cpuspeed) {
+        this.cpuSpeedInputValue = this.preFillContent.cpuspeed
+      }
+      if (this.preFillContent.memory) {
+        this.memoryInputValue = this.preFillContent.memory
+      }
+      this.updateComputeCpuNumber(this.preFillContent.cpunumber || this.cpuNumberInputValue)
+      this.updateComputeCpuSpeed(this.preFillContent.cpuspeed || this.cpuSpeedInputValue)
+      this.updateComputeMemory(this.preFillContent.memory || this.memoryInputValue)
+    },
+    updateComputeCpuNumber (value) {
+      if (!value) this.cpuNumberInputValue = 0
+      if (!this.validateInput('cpu', value)) {
+        return
+      }
+      this.$emit('update-compute-cpunumber', this.cpunumberInputDecorator, value)
+    },
+    updateComputeCpuSpeed (value) {
+      this.$emit('update-compute-cpuspeed', this.cpuspeedInputDecorator, value)
+    },
+    updateComputeMemory (value) {
+      if (!value) this.memoryInputValue = 0
+      if (!this.validateInput('memory', value)) {
+        return
+      }
+      this.$emit('update-compute-memory', this.memoryInputDecorator, value)
+    },
+    validateInput (input, value) {
+      this.errors[input].status = ''
+      this.errors[input].message = ''
+
+      if (value === null || value === undefined || value.length === 0) {
+        this.errors[input].status = 'error'
+        this.errors[input].message = this.$t('message.error.required.input')
+        return false
+      }
+
+      if (!this.isConstrained) {
+        return true
+      }
+
+      let min
+      let max
+
+      switch (input) {
+        case 'cpu':
+          min = this.minCpu
+          max = this.maxCpu
+          break
+        case 'memory':
+          min = this.minMemory
+          max = this.maxMemory
+          break
+      }
+
+      if (!this.checkValidRange(value, min, max)) {
+        this.errors[input].status = 'error'
+        this.errors[input].message = `${this.$t('message.please.enter.value')} ${this.$t('label.from')} ${min} ${this.$t('label.to')} ${max})`
+        return false
+      }
+
+      return true
+    },
+    checkValidRange (value, min, max) {
+      if (value < min || value > max) {
+        return false
+      }
+
+      return true
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/compute/wizard/DiskOfferingSelection.vue b/ui/src/views/compute/wizard/DiskOfferingSelection.vue
new file mode 100644
index 0000000..aff96a2
--- /dev/null
+++ b/ui/src/views/compute/wizard/DiskOfferingSelection.vue
@@ -0,0 +1,258 @@
+// 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>
+    <a-input-search
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-table
+      :loading="loading"
+      :columns="columns"
+      :dataSource="tableSource"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      :customRow="onClickRow"
+      size="middle"
+      :scroll="{ y: 225 }"
+    >
+      <span slot="diskSizeTitle"><a-icon type="hdd" /> {{ $t('label.disksize') }}</span>
+      <span slot="iopsTitle"><a-icon type="rocket" /> {{ $t('label.minmaxiops') }}</span>
+      <template slot="diskSize" slot-scope="text, record">
+        <div v-if="record.isCustomized">{{ $t('label.iscustomized') }}</div>
+        <div v-else-if="record.diskSize">{{ record.diskSize }} GB</div>
+        <div v-else>-</div>
+      </template>
+      <template slot="iops" slot-scope="text, record">
+        <span v-if="record.miniops && record.maxiops">{{ record.miniops }} - {{ record.maxiops }}</span>
+        <span v-else-if="record.miniops && !record.maxiops">{{ record.miniops }}</span>
+        <span v-else-if="!record.miniops && record.maxiops">{{ record.maxiops }}</span>
+        <span v-else>-</span>
+      </template>
+    </a-table>
+
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'DiskOfferingSelection',
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    rowCount: {
+      type: Number,
+      default: () => 0
+    },
+    value: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    },
+    isIsoSelected: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.diskoffering'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'disksize',
+          slots: { title: 'diskSizeTitle' },
+          width: '30%',
+          scopedSlots: { customRender: 'diskSize' }
+        },
+        {
+          dataIndex: 'iops',
+          slots: { title: 'iopsTitle' },
+          width: '30%',
+          scopedSlots: { customRender: 'iops' }
+        }
+      ],
+      selectedRowKeys: ['0'],
+      dataItems: [],
+      oldZoneId: null,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  created () {
+    this.initDataItem()
+    if (this.items) {
+      this.dataItems = this.dataItems.concat(this.items)
+    }
+  },
+  computed: {
+    tableSource () {
+      return this.dataItems.map((item) => {
+        return {
+          key: item.id,
+          name: item.name,
+          diskSize: item.disksize,
+          miniops: item.miniops,
+          maxiops: item.maxiops,
+          isCustomized: item.iscustomized
+        }
+      })
+    },
+    rowSelection () {
+      return {
+        type: 'radio',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: this.onSelectRow
+      }
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && newValue !== oldValue) {
+        this.selectedRowKeys = [newValue]
+      }
+    },
+    items (newData, oldData) {
+      this.initDataItem()
+      this.dataItems = this.dataItems.concat(newData)
+    },
+    loading () {
+      if (!this.loading) {
+        if (this.preFillContent.diskofferingid) {
+          this.selectedRowKeys = [this.preFillContent.diskofferingid]
+          this.$emit('select-disk-offering-item', this.preFillContent.diskofferingid)
+        } else {
+          if (this.oldZoneId === this.zoneId) {
+            return
+          }
+          this.oldZoneId = this.zoneId
+          this.selectedRowKeys = ['0']
+          this.$emit('select-disk-offering-item', '0')
+        }
+      }
+    },
+    isIsoSelected () {
+      if (this.isIsoSelected) {
+        this.dataItems = this.dataItems.filter(item => item.id !== '0')
+      } else {
+        this.dataItems.unshift({
+          id: '0',
+          name: this.$t('label.noselect'),
+          diskSize: undefined,
+          miniops: undefined,
+          maxiops: undefined,
+          isCustomized: undefined
+        })
+      }
+    }
+  },
+  methods: {
+    initDataItem () {
+      this.dataItems = []
+      if (this.options.page === 1 && !this.isIsoSelected) {
+        this.dataItems.push({
+          id: '0',
+          name: this.$t('label.noselect'),
+          diskSize: undefined,
+          miniops: undefined,
+          maxiops: undefined,
+          isCustomized: undefined
+        })
+      }
+    },
+    onSelectRow (value) {
+      this.selectedRowKeys = value
+      this.$emit('select-disk-offering-item', value[0])
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onClickRow (record) {
+      return {
+        on: {
+          click: () => {
+            this.selectedRowKeys = [record.key]
+            this.$emit('select-disk-offering-item', record.key)
+          }
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+
+  /deep/.ant-table-tbody > tr > td {
+    cursor: pointer;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/DiskSizeSelection.vue b/ui/src/views/compute/wizard/DiskSizeSelection.vue
new file mode 100644
index 0000000..dcea640
--- /dev/null
+++ b/ui/src/views/compute/wizard/DiskSizeSelection.vue
@@ -0,0 +1,98 @@
+// 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>
+  <a-form-item
+    :label="inputDecorator === 'rootdisksize' ? $t('label.root.disk.size') : $t('label.disksize')"
+    class="form-item">
+    <a-row :gutter="12">
+      <a-col :md="4" :lg="4">
+        <span style="display: inline-flex">
+          <a-input-number
+            v-model="inputValue"
+            @change="($event) => updateDiskSize($event)"
+          />
+          <span style="padding-top: 6px; margin-left: 5px">GB</span>
+        </span>
+      </a-col>
+    </a-row>
+    <p v-if="error" style="color: red"> {{ $t(error) }} </p>
+  </a-form-item>
+</template>
+
+<script>
+export default {
+  name: 'DiskSizeSelection',
+  props: {
+    inputDecorator: {
+      type: String,
+      default: ''
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    },
+    minDiskSize: {
+      type: Number,
+      default: 0
+    }
+  },
+  watch: {
+    minDiskSize (newItem) {
+      if (newItem && newItem > 0) {
+        this.inputValue = newItem
+        this.updateDiskSize(newItem)
+      }
+    }
+  },
+  data () {
+    return {
+      inputValue: 0,
+      error: false
+    }
+  },
+  mounted () {
+    this.fillValue()
+  },
+  methods: {
+    fillValue () {
+      this.inputValue = this.minDiskSize
+      if (this.inputDecorator === 'rootdisksize') {
+        this.inputValue = this.preFillContent.rootdisksize ? this.preFillContent.rootdisksize : this.minDiskSize
+      } else if (this.inputDecorator === 'size') {
+        this.inputValue = this.preFillContent.size ? this.preFillContent.size : this.minDiskSize
+      }
+      this.$emit('update-disk-size', this.inputDecorator, this.inputValue)
+    },
+    updateDiskSize (value) {
+      if (value < this.minDiskSize) {
+        this.inputValue = this.minDiskSize
+        this.error = `${this.$t('message.error.limit.value')} ` + this.minDiskSize + ' GB'
+        return
+      }
+      this.error = false
+      this.$emit('update-disk-size', this.inputDecorator, value)
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-item {
+    margin: 0 5px;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/MultiDiskSelection.vue b/ui/src/views/compute/wizard/MultiDiskSelection.vue
new file mode 100644
index 0000000..998fdbe
--- /dev/null
+++ b/ui/src/views/compute/wizard/MultiDiskSelection.vue
@@ -0,0 +1,170 @@
+// 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>
+    <a-table
+      :loading="loading"
+      :columns="columns"
+      :dataSource="tableSource"
+      :rowKey="record => record.id"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      :scroll="{ y: 225 }" >
+
+      <span slot="offering" slot-scope="text, record">
+        <a-select
+          v-if="validOfferings[record.id] && validOfferings[record.id].length > 0"
+          @change="updateOffering($event, record.id)"
+          :defaultValue="validOfferings[record.id][0].id">
+          <a-select-option v-for="offering in validOfferings[record.id]" :key="offering.id">
+            {{ offering.displaytext }}
+          </a-select-option>
+        </a-select>
+        <span v-else>
+          {{ $t('label.no.matching.offering') }}
+        </span>
+      </span>
+    </a-table>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'MultiDiskSelection',
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data () {
+    return {
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.data.disk')
+        },
+        {
+          dataIndex: 'offering',
+          title: this.$t('label.data.disk.offering'),
+          scopedSlots: { customRender: 'offering' }
+        }
+      ],
+      loading: false,
+      selectedRowKeys: [],
+      diskOfferings: [],
+      validOfferings: {},
+      values: {}
+    }
+  },
+  computed: {
+    tableSource () {
+      return this.items.map(item => {
+        return {
+          id: item.id,
+          name: `${item.name} (${item.size} GB)`,
+          disabled: this.validOfferings[item.id] && this.validOfferings[item.id].length === 0
+        }
+      })
+    },
+    rowSelection () {
+      return {
+        type: 'checkbox',
+        selectedRowKeys: this.selectedRowKeys,
+        getCheckboxProps: record => ({
+          props: {
+            disabled: record.disabled
+          }
+        }),
+        onChange: (rows) => {
+          this.selectedRowKeys = rows
+          this.sendValues()
+        }
+      }
+    }
+  },
+  watch: {
+    items (newData, oldData) {
+      this.items = newData
+      this.selectedRowKeys = []
+      this.fetchDiskOfferings()
+    },
+    zoneId (newData) {
+      this.zoneId = newData
+      this.fetchDiskOfferings()
+    }
+  },
+  created () {
+    this.fetchDiskOfferings()
+  },
+  methods: {
+    fetchDiskOfferings () {
+      this.diskOfferings = []
+      this.loading = true
+      api('listDiskOfferings', {
+        zoneid: this.zoneId,
+        listall: true
+      }).then(response => {
+        this.diskOfferings = response.listdiskofferingsresponse.diskoffering || []
+        this.diskOfferings = this.diskOfferings.filter(x => !x.iscustomized)
+        this.orderDiskOfferings()
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    orderDiskOfferings () {
+      this.loading = true
+      this.validOfferings = {}
+      for (const item of this.items) {
+        this.validOfferings[item.id] = this.diskOfferings.filter(x => x.disksize >= item.size)
+      }
+      this.setDefaultValues()
+      this.loading = false
+    },
+    setDefaultValues () {
+      this.values = {}
+      for (const item of this.items) {
+        this.values[item.id] = this.validOfferings[item.id].length > 0 ? this.validOfferings[item.id][0].id : ''
+      }
+    },
+    updateOffering (value, templateid) {
+      this.values[templateid] = value
+      this.sendValues()
+    },
+    sendValues () {
+      const data = {}
+      this.selectedRowKeys.map(x => {
+        data[x] = this.values[x]
+      })
+      this.$emit('select-multi-disk-offering', data)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/NetworkConfiguration.vue b/ui/src/views/compute/wizard/NetworkConfiguration.vue
new file mode 100644
index 0000000..7bd17f4
--- /dev/null
+++ b/ui/src/views/compute/wizard/NetworkConfiguration.vue
@@ -0,0 +1,258 @@
+// 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>
+  <a-table
+    :columns="columns"
+    :dataSource="dataItems"
+    :pagination="false"
+    :rowSelection="rowSelection"
+    :customRow="onClickRow"
+    :rowKey="record => record.id"
+    size="middle"
+    :scroll="{ y: 225 }"
+  >
+    <template slot="name" slot-scope="text, record">
+      <div>{{ text }}</div>
+      <small v-if="record.type!=='L2'">{{ $t('label.cidr') + ': ' + record.cidr }}</small>
+    </template>
+    <template slot="ipAddress" slot-scope="text, record">
+      <a-form-item v-if="record.type!=='L2'">
+        <a-input
+          style="width: 150px;"
+          v-decorator="['ipAddress' + record.id, {
+            rules: [{
+              validator: validatorIpAddress,
+              cidr: record.cidr,
+              networkType: record.type
+            }]
+          }]"
+          :placeholder="record.cidr"
+          @change="($event) => updateNetworkData('ipAddress', record.id, $event.target.value)">
+          <a-tooltip v-if="record.type !== 'L2'" slot="suffix" :title="getIpRangeDescription(record)">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </a-input>
+      </a-form-item>
+    </template>
+    <template slot="macAddress" slot-scope="text, record">
+      <a-form-item>
+        <a-input
+          style="width: 150px;"
+          :placeholder="$t('label.macaddress')"
+          v-decorator="[`macAddress` + record.id, {
+            rules: [{
+              validator: validatorMacAddress
+            }]
+          }]"
+          @change="($event) => updateNetworkData('macAddress', record.id, $event.target.value)">
+          <a-tooltip slot="suffix" :title="$t('label.macaddress.example')">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </a-input>
+      </a-form-item>
+    </template>
+  </a-table>
+</template>
+
+<script>
+export default {
+  name: 'NetworkConfiguration',
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    value: {
+      type: String,
+      default: ''
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      networks: [],
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.defaultnetwork'),
+          width: '30%',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          dataIndex: 'ip',
+          title: this.$t('label.ip'),
+          width: '30%',
+          scopedSlots: { customRender: 'ipAddress' }
+        },
+        {
+          dataIndex: 'mac',
+          title: this.$t('label.macaddress'),
+          width: '30%',
+          scopedSlots: { customRender: 'macAddress' }
+        }
+      ],
+      selectedRowKeys: [],
+      dataItems: [],
+      macRegex: /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/i,
+      ipV4Regex: /^(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
+    }
+  },
+  beforeCreate () {
+    this.dataItems = []
+  },
+  created () {
+    this.dataItems = this.items
+    if (this.dataItems.length > 0) {
+      this.selectedRowKeys = [this.dataItems[0].id]
+      this.$emit('select-default-network-item', this.dataItems[0].id)
+    }
+  },
+  computed: {
+    rowSelection () {
+      return {
+        type: 'radio',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: this.onSelectRow
+      }
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && newValue !== oldValue) {
+        this.selectedRowKeys = [newValue]
+      }
+    },
+    items (newData, oldData) {
+      if (newData && newData.length > 0) {
+        this.dataItems = newData
+        const keyEx = this.dataItems.filter((item) => this.selectedRowKeys.includes(item.id))
+        if (!keyEx || keyEx.length === 0) {
+          this.selectedRowKeys = [this.dataItems[0].id]
+          this.$emit('select-default-network-item', this.dataItems[0].id)
+        }
+      }
+    }
+  },
+  methods: {
+    onSelectRow (value) {
+      this.selectedRowKeys = value
+      this.$emit('select-default-network-item', value[0])
+    },
+    updateNetworkData (name, key, value) {
+      const index = this.networks.findIndex(item => item.key === key)
+      if (index === -1) {
+        const networkItem = {}
+        networkItem.key = key
+        networkItem[name] = value
+        this.networks.push(networkItem)
+        this.$emit('update-network-config', this.networks)
+        return
+      }
+
+      this.networks.filter((item, index) => {
+        if (item.key === key) {
+          this.$set(this.networks[index], name, value)
+        }
+      })
+      this.$emit('update-network-config', this.networks)
+    },
+    removeItem (id) {
+      this.dataItems = this.dataItems.filter(item => item.id !== id)
+      if (this.selectedRowKeys.includes(id)) {
+        if (this.dataItems && this.dataItems.length > 0) {
+          this.selectedRowKeys = [this.dataItems[0].id]
+          this.$emit('select-default-network-item', this.dataItems[0].id)
+        }
+      }
+    },
+    validatorMacAddress (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (!this.macRegex.test(value)) {
+        callback(this.$t('message.error.macaddress'))
+      } else {
+        callback()
+      }
+    },
+    validatorIpAddress (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (!this.ipV4Regex.test(value)) {
+        callback(this.$t('message.error.ipv4.address'))
+      } else if (rule.networkType !== 'L2' && !this.isIp4InCidr(value, rule.cidr)) {
+        const rangeIps = this.calculateCidrRange(rule.cidr)
+        const message = `${this.$t('message.error.ip.range')} ${this.$t('label.from')} ${rangeIps[0]} ${this.$t('label.to')} ${rangeIps[1]}`
+        callback(message)
+      } else {
+        callback()
+      }
+    },
+    getIpRangeDescription (network) {
+      const rangeIps = this.calculateCidrRange(network.cidr)
+      const rangeIpDescription = [`${this.$t('label.ip.range')}:`, rangeIps[0], '-', rangeIps[1]].join(' ')
+      return rangeIpDescription
+    },
+    isIp4InCidr (ip, cidr) {
+      const [range, bits = 32] = cidr.split('/')
+      const mask = ~(2 ** (32 - bits) - 1)
+      return (this.ip4ToInt(ip) & mask) === (this.ip4ToInt(range) & mask)
+    },
+    calculateCidrRange (cidr) {
+      const [range, bits = 32] = cidr.split('/')
+      const mask = ~(2 ** (32 - bits) - 1)
+      return [this.intToIp4(this.ip4ToInt(range) & mask), this.intToIp4(this.ip4ToInt(range) | ~mask)]
+    },
+    ip4ToInt (ip) {
+      return ip.split('.').reduce((int, oct) => (int << 8) + parseInt(oct, 10), 0) >>> 0
+    },
+    intToIp4 (int) {
+      return [(int >>> 24) & 0xFF, (int >>> 16) & 0xFF, (int >>> 8) & 0xFF, int & 0xFF].join('.')
+    },
+    onClickRow (record, index) {
+      return {
+        on: {
+          click: (event) => {
+            if (event.target.tagName.toLowerCase() !== 'input') {
+              this.selectedRowKeys = [record.id]
+              this.$emit('select-default-network-item', record.id)
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+
+  /deep/.ant-table-tbody > tr > td {
+    cursor: pointer;
+  }
+
+  .ant-form .ant-form-item {
+    margin-bottom: 0;
+    padding-bottom: 0;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/NetworkSelection.vue b/ui/src/views/compute/wizard/NetworkSelection.vue
new file mode 100644
index 0000000..d0d01af
--- /dev/null
+++ b/ui/src/views/compute/wizard/NetworkSelection.vue
@@ -0,0 +1,302 @@
+// 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>
+    <a-input-search
+      style="width: 25vw; float: right; margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-button type="primary" @click="showCreateForm = true" style="float: right; margin-right: 5px; z-index: 8">
+      {{ $t('label.create.network') }}
+    </a-button>
+    <a-table
+      :loading="loading"
+      :columns="columns"
+      :dataSource="networkItems"
+      :rowKey="record => record.id"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      :scroll="{ y: 225 }"
+    >
+      <a-list
+        slot="expandedRowRender"
+        slot-scope="record"
+        :key="record.id"
+        :dataSource="getDetails(record)"
+        size="small"
+      >
+        <a-list-item slot="renderItem" slot-scope="item" :key="item.id">
+          <a-list-item-meta
+            :description="item.description"
+          >
+            <template v-slot:title>{{ item.title }}</template>
+          </a-list-item-meta>
+        </a-list-item>
+      </a-list>
+    </a-table>
+
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+
+    <a-modal
+      :visible="showCreateForm"
+      :title="$t('label.add.network')"
+      :closable="true"
+      :maskClosable="false"
+      :footer="null"
+      :cancelText="$t('label.cancel')"
+      @cancel="showCreateForm = false"
+      centered
+      width="auto">
+      <create-network
+        :resource="{ zoneid: zoneId }"
+        @refresh-data="handleSearch"
+        @close-action="showCreateForm = false"
+      />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash'
+import { api } from '@/api'
+import store from '@/store'
+import CreateNetwork from '@/views/network/CreateNetwork'
+
+export default {
+  name: 'NetworkSelection',
+  components: {
+    CreateNetwork
+  },
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    rowCount: {
+      type: Number,
+      default: () => 0
+    },
+    value: {
+      type: Array,
+      default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      selectedRowKeys: [],
+      vpcs: [],
+      filteredInfo: null,
+      networkOffering: {
+        loading: false,
+        opts: []
+      },
+      showCreateForm: false,
+      oldZoneId: null,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  computed: {
+    columns () {
+      let vpcFilter = []
+      if (this.vpcs) {
+        vpcFilter = this.vpcs.map((vpc) => {
+          return {
+            text: vpc.displaytext,
+            value: vpc.id
+          }
+        })
+      }
+      return [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.networks'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'type',
+          title: this.$t('label.guestiptype'),
+          width: '30%'
+        },
+        {
+          dataIndex: 'vpcName',
+          title: this.$t('label.vpc'),
+          width: '30%',
+          filters: vpcFilter,
+          filteredValue: _.get(this.filteredInfo, 'id'),
+          onFilter: (value, record) => {
+            return record.vpcid === value
+          }
+        }
+      ]
+    },
+    rowSelection () {
+      return {
+        type: 'checkbox',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: (rows) => {
+          this.$emit('select-network-item', rows)
+        }
+      }
+    },
+    networkItems () {
+      return this.items.map((network) => {
+        const vpc = _.find(this.vpcs, { id: network.vpcid })
+        return {
+          ...network,
+          ...{
+            vpcName: _.get(vpc, 'displaytext')
+          }
+        }
+      })
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && !_.isEqual(newValue, oldValue)) {
+        this.selectedRowKeys = newValue
+      }
+    },
+    loading () {
+      if (!this.loading) {
+        if (this.preFillContent.networkids) {
+          this.selectedRowKeys = this.preFillContent.networkids
+          this.$emit('select-network-item', this.preFillContent.networkids)
+        } else {
+          if (this.items && this.items.length > 0) {
+            if (this.oldZoneId === this.zoneId) {
+              return
+            }
+            this.oldZoneId = this.zoneId
+            this.selectedRowKeys = [this.items[0].id]
+            this.$emit('select-network-item', this.selectedRowKeys)
+          } else {
+            this.selectedRowKeys = []
+            this.$emit('select-network-item', [])
+          }
+        }
+      }
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  created () {
+    api('listVPCs', {
+      projectid: store.getters.project.id
+    }).then((response) => {
+      this.vpcs = _.get(response, 'listvpcsresponse.vpc')
+    })
+  },
+  inject: ['vmFetchNetworks'],
+  methods: {
+    getDetails (network) {
+      const detail = [
+        {
+          title: this.$t('label.description'),
+          description: network.displaytext
+        },
+        {
+          title: this.$t('label.networkofferingid'),
+          description: network.networkofferingdisplaytext
+        }
+      ]
+      if (network.type !== 'L2') {
+        detail.push({
+          title: this.$t('label.cidr'),
+          description: network.cidr
+        })
+      }
+      return detail
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    listNetworkOfferings () {
+      return new Promise((resolve, reject) => {
+        const args = {}
+        args.forvpc = false
+        args.zoneid = this.zoneId
+        args.guestiptype = 'Isolated'
+        args.supportedServices = 'SourceNat'
+        args.specifyvlan = false
+        args.state = 'Enabled'
+
+        api('listNetworkOfferings', args).then(json => {
+          const listNetworkOfferings = json.listnetworkofferingsresponse.networkoffering || []
+          resolve(listNetworkOfferings)
+        }).catch(error => {
+          resolve(error)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/SecurityGroupSelection.vue b/ui/src/views/compute/wizard/SecurityGroupSelection.vue
new file mode 100644
index 0000000..07aabd2
--- /dev/null
+++ b/ui/src/views/compute/wizard/SecurityGroupSelection.vue
@@ -0,0 +1,198 @@
+// 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 style="margin-top: 10px;">
+    <label>{{ $t('message.select.security.groups') }}</label>
+    <a-input-search
+      style="width: 25vw; float: right; margin-bottom: 10px; z-index: 8;"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-table
+      :loading="loading || fetchLoading"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id"
+      :pagination="false"
+      :rowSelection="rowSelection"
+      size="middle"
+      :scroll="{ y: 225 }"
+    ></a-table>
+
+    <div style="display: block; text-align: right; margin-top: 30px">
+      <a-pagination
+        size="small"
+        :current="page"
+        :pageSize="pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import _ from 'lodash'
+
+export default {
+  name: 'SecurityGroupSelection',
+  props: {
+    value: {
+      type: Array,
+      default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      fetchLoading: false,
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.security.groups'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'description',
+          title: this.$t('label.description'),
+          width: '60%'
+        }
+      ],
+      items: [],
+      selectedRowKeys: [],
+      page: 1,
+      pageSize: 10,
+      keyword: null,
+      rowCount: 0
+    }
+  },
+  computed: {
+    rowSelection () {
+      return {
+        type: 'checkbox',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: (rows) => {
+          this.$emit('select-security-group-item', rows)
+        }
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && !_.isEqual(newValue, oldValue)) {
+        this.selectedRowKeys = newValue
+      }
+    },
+    loading () {
+      if (!this.loading) {
+        if (this.preFillContent.securitygroupids) {
+          this.selectedRowKeys = this.preFillContent.securitygroupids
+          this.$emit('select-security-group-item', this.preFillContent.securitygroupids)
+        } else {
+          if (this.oldZoneId === this.zoneId) {
+            return
+          }
+          this.oldZoneId = this.zoneId
+          this.selectedRowKeys = []
+          this.$emit('select-security-group-item', null)
+        }
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {
+        domainid: this.$store.getters.userInfo.domainid,
+        account: this.$store.getters.userInfo.account,
+        page: this.page,
+        pageSize: this.pageSize
+      }
+
+      if (this.keyword) {
+        params.keyword = this.keyword
+      }
+
+      this.items = []
+      this.fetchLoading = true
+
+      api('listSecurityGroups', params).then(json => {
+        const items = json.listsecuritygroupsresponse.securitygroup || []
+        this.rowCount = json.listsecuritygroupsresponse.count || 0
+        if (items && items.length > 0) {
+          for (let i = 0; i < items.length; i++) {
+            this.items.push(items[i])
+          }
+          this.items.sort((a, b) => {
+            if (a.name < b.name) return -1
+            if (a.name > b.name) return 1
+            return 0
+          })
+        }
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.page = 1
+      this.pageSize = 10
+      this.keyword = this.filter
+      this.fetchData()
+    },
+    onChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    onChangePageSize (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/SshKeyPairSelection.vue b/ui/src/views/compute/wizard/SshKeyPairSelection.vue
new file mode 100644
index 0000000..222868e
--- /dev/null
+++ b/ui/src/views/compute/wizard/SshKeyPairSelection.vue
@@ -0,0 +1,214 @@
+// 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>
+    <a-input-search
+      style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
+      :placeholder="$t('label.search')"
+      v-model="filter"
+      @search="handleSearch" />
+    <a-table
+      :loading="loading"
+      :columns="columns"
+      :dataSource="tableSource"
+      :rowSelection="rowSelection"
+      :customRow="onClickRow"
+      :pagination="false"
+      size="middle"
+      :scroll="{ y: 225 }"
+    >
+      <template v-slot:account><a-icon type="user" /> {{ $t('label.account') }}</template>
+      <template v-slot:domain><a-icon type="block" /> {{ $t('label.domain') }}</template>
+    </a-table>
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="rowCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'SshKeyPairSelection',
+  props: {
+    items: {
+      type: Array,
+      default: () => []
+    },
+    rowCount: {
+      type: Number,
+      default: () => 0
+    },
+    value: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      columns: [
+        {
+          dataIndex: 'name',
+          title: this.$t('label.sshkeypairs'),
+          width: '40%'
+        },
+        {
+          dataIndex: 'account',
+          slots: { title: 'account' },
+          width: '30%'
+        },
+        {
+          dataIndex: 'domain',
+          slots: { title: 'domain' },
+          width: '30%'
+        }
+      ],
+      selectedRowKeys: [this.$t('label.noselect')],
+      dataItems: [],
+      oldZoneId: null,
+      options: {
+        page: 1,
+        pageSize: 10,
+        keyword: null
+      }
+    }
+  },
+  computed: {
+    tableSource () {
+      const dataItems = []
+
+      if (this.options.page === 1) {
+        dataItems.push({
+          key: this.$t('label.noselect'),
+          name: this.$t('label.noselect'),
+          account: '-',
+          domain: '-'
+        })
+      }
+
+      this.items.map((item) => {
+        dataItems.push({
+          key: item.name,
+          name: item.name,
+          account: item.account,
+          domain: item.domain
+        })
+      })
+
+      return dataItems
+    },
+    rowSelection () {
+      return {
+        type: 'radio',
+        selectedRowKeys: this.selectedRowKeys,
+        onChange: this.onSelectRow
+      }
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      if (newValue && newValue !== oldValue) {
+        this.selectedRowKeys = [newValue]
+      }
+    },
+    loading () {
+      if (!this.loading) {
+        if (this.preFillContent.keypair) {
+          this.selectedRowKeys = [this.preFillContent.keypair]
+          this.$emit('select-ssh-key-pair-item', this.preFillContent.keypair)
+        } else {
+          if (this.oldZoneId === this.zoneId) {
+            return
+          }
+          this.oldZoneId = this.zoneId
+          this.selectedRowKeys = [this.$t('label.noselect')]
+          this.$emit('select-ssh-key-pair-item', this.$t('label.noselect'))
+        }
+      }
+    }
+  },
+  methods: {
+    onSelectRow (value) {
+      this.selectedRowKeys = value
+      this.$emit('select-ssh-key-pair-item', value[0])
+    },
+    handleSearch (value) {
+      this.filter = value
+      this.options.page = 1
+      this.options.pageSize = 10
+      this.options.keyword = this.filter
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onClickRow (record) {
+      return {
+        on: {
+          click: () => {
+            this.selectedRowKeys = [record.key]
+            this.$emit('select-ssh-key-pair-item', record.key)
+          }
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .ant-table-wrapper {
+    margin: 2rem 0;
+  }
+
+  /deep/.ant-table-tbody > tr > td {
+    cursor: pointer;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/TemplateIsoRadioGroup.vue b/ui/src/views/compute/wizard/TemplateIsoRadioGroup.vue
new file mode 100644
index 0000000..f5496f9
--- /dev/null
+++ b/ui/src/views/compute/wizard/TemplateIsoRadioGroup.vue
@@ -0,0 +1,171 @@
+// 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>
+  <a-form-item>
+    <a-list
+      class="form-item-scroll"
+      itemLayout="vertical"
+      size="small"
+      :dataSource="osList"
+      :pagination="false">
+      <a-list-item slot="renderItem" slot-scope="os, osIndex" key="os.id" @click="onClickRow(os)">
+        <a-radio-group
+          class="radio-group"
+          :key="osIndex"
+          v-model="value"
+          @change="($event) => updateSelectionTemplateIso($event.target.value)">
+          <a-radio
+            class="radio-group__radio"
+            :value="os.id">
+            {{ os.displaytext }}&nbsp;
+            <os-logo
+              class="radio-group__os-logo"
+              :osId="os.ostypeid"
+              :os-name="os.osName" />
+          </a-radio>
+        </a-radio-group>
+      </a-list-item>
+    </a-list>
+
+    <div style="display: block; text-align: right;">
+      <a-pagination
+        size="small"
+        :current="options.page"
+        :pageSize="options.pageSize"
+        :total="itemCount"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100', '200']"
+        @change="onChangePage"
+        @showSizeChange="onChangePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </div>
+  </a-form-item>
+</template>
+
+<script>
+import OsLogo from '@/components/widgets/OsLogo'
+
+export default {
+  name: 'TemplateIsoRadioGroup',
+  components: { OsLogo },
+  props: {
+    osList: {
+      type: Array,
+      default: () => []
+    },
+    inputDecorator: {
+      type: String,
+      default: ''
+    },
+    selected: {
+      type: String,
+      default: ''
+    },
+    itemCount: {
+      type: Number,
+      default: 0
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      value: '',
+      options: {
+        page: 1,
+        pageSize: 10
+      }
+    }
+  },
+  mounted () {
+    this.onSelectTemplateIso()
+  },
+  watch: {
+    selected (newVal, oldVal) {
+      if (newVal === oldVal) return
+      this.onSelectTemplateIso()
+    }
+  },
+  methods: {
+    onSelectTemplateIso () {
+      if (this.inputDecorator === 'templateid') {
+        this.value = !this.preFillContent.templateid ? this.selected : this.preFillContent.templateid
+      } else {
+        this.value = !this.preFillContent.isoid ? this.selected : this.preFillContent.isoid
+      }
+
+      this.$emit('emit-update-template-iso', this.inputDecorator, this.value)
+    },
+    updateSelectionTemplateIso (id) {
+      this.$emit('emit-update-template-iso', this.inputDecorator, id)
+    },
+    onChangePage (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onChangePageSize (page, pageSize) {
+      this.options.page = page
+      this.options.pageSize = pageSize
+      this.$emit('handle-search-filter', this.options)
+    },
+    onClickRow (os) {
+      this.value = os.id
+      this.$emit('emit-update-template-iso', this.inputDecorator, this.value)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .radio-group {
+    margin: 0.5rem 0;
+
+    /deep/.ant-radio {
+      margin-right: 20px;
+    }
+
+    &__os-logo {
+      position: absolute;
+      top: 0;
+      left: 0;
+      margin-top: 2px;
+      margin-left: 23px;
+    }
+  }
+
+  /deep/.ant-spin-container {
+    max-height: 200px;
+    overflow-y: auto;
+  }
+
+  .pagination {
+    margin-top: 20px;
+    float: right;
+  }
+
+  /deep/.ant-list-split .ant-list-item {
+    cursor: pointer;
+  }
+</style>
diff --git a/ui/src/views/compute/wizard/TemplateIsoSelection.vue b/ui/src/views/compute/wizard/TemplateIsoSelection.vue
new file mode 100644
index 0000000..323af75
--- /dev/null
+++ b/ui/src/views/compute/wizard/TemplateIsoSelection.vue
@@ -0,0 +1,175 @@
+// 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>
+    <a-input-search
+      class="search-input"
+      :placeholder="$t('label.search')"
+      @search="handleSearch">
+    </a-input-search>
+    <a-spin :spinning="loading">
+      <a-tabs
+        :animated="false"
+        :defaultActiveKey="filterOpts[0].id"
+        v-model="filterType"
+        tabPosition="top"
+        @change="changeFilterType">
+        <a-tab-pane
+          v-for="filterItem in filterOpts"
+          :key="filterItem.id"
+          :tab="$t(filterItem.name)">
+          <TemplateIsoRadioGroup
+            v-if="filterType===filterItem.id"
+            :osList="items[filterItem.id][inputDecorator.slice(0, -2)] || []"
+            :itemCount="items[filterItem.id].count || 0"
+            :input-decorator="inputDecorator"
+            :selected="checkedValue"
+            :preFillContent="preFillContent"
+            @emit-update-template-iso="updateTemplateIso"
+            @handle-search-filter="($event) => eventPagination($event)"
+          ></TemplateIsoRadioGroup>
+        </a-tab-pane>
+      </a-tabs>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import TemplateIsoRadioGroup from '@views/compute/wizard/TemplateIsoRadioGroup'
+
+export default {
+  name: 'TemplateIsoSelection',
+  components: { TemplateIsoRadioGroup },
+  props: {
+    items: {
+      type: Object,
+      default: () => {}
+    },
+    inputDecorator: {
+      type: String,
+      default: ''
+    },
+    selected: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    preFillContent: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      filter: '',
+      checkedValue: '',
+      filterOpts: [{
+        id: 'featured',
+        name: 'label.featured'
+      }, {
+        id: 'community',
+        name: 'label.community'
+      }, {
+        id: 'selfexecutable',
+        name: 'label.my.templates'
+      }, {
+        id: 'sharedexecutable',
+        name: 'label.sharedexecutable'
+      }],
+      filterType: 'featured',
+      pagination: false
+    }
+  },
+  watch: {
+    items (items) {
+      const key = this.inputDecorator.slice(0, -2)
+      for (const filter of this.filterOpts) {
+        if (items[filter.id] && items[filter.id][key] && items[filter.id][key].length > 0) {
+          if (!this.pagination) {
+            this.filterType = filter.id
+            this.checkedValue = items[filter.id][key][0].id
+          }
+          break
+        }
+      }
+    },
+    inputDecorator (newValue, oldValue) {
+      if (newValue !== oldValue) {
+        this.filter = ''
+      }
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  methods: {
+    updateTemplateIso (name, id) {
+      this.checkedValue = id
+      this.$emit('update-template-iso', name, id)
+    },
+    handleSearch (value) {
+      if (!this.filter && !value) {
+        return
+      }
+      this.pagination = false
+      this.filter = value
+      const options = {
+        page: 1,
+        pageSize: 10,
+        keyword: this.filter
+      }
+      this.emitSearchFilter(options)
+    },
+    eventPagination (options) {
+      this.pagination = true
+      this.emitSearchFilter(options)
+    },
+    emitSearchFilter (options) {
+      options.category = this.filterType
+      this.$emit('handle-search-filter', options)
+    },
+    changeFilterType (value) {
+      this.filterType = value
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .search-input {
+    width: 25vw;
+    z-index: 8;
+    position: absolute;
+    top: 11px;
+    right: 10px;
+
+    @media (max-width: 600px) {
+      position: relative;
+      width: 100%;
+      top: 0;
+      right: 0;
+    }
+  }
+
+  /deep/.ant-tabs-nav-scroll {
+    min-height: 45px;
+  }
+</style>
diff --git a/ui/src/views/dashboard/CapacityDashboard.vue b/ui/src/views/dashboard/CapacityDashboard.vue
new file mode 100644
index 0000000..9f38299
--- /dev/null
+++ b/ui/src/views/dashboard/CapacityDashboard.vue
@@ -0,0 +1,312 @@
+// 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>
+  <a-row class="capacity-dashboard" :gutter="12">
+    <a-col :xl="18">
+      <div class="capacity-dashboard-wrapper">
+        <div class="capacity-dashboard-select">
+          <a-select
+            showSearch
+            optionFilterProp="children"
+            :defaultValue="zoneSelected.name"
+            :placeholder="$t('label.select.a.zone')"
+            :value="zoneSelected.name"
+            @change="changeZone">
+            <a-select-option v-for="(zone, index) in zones" :key="index">
+              {{ zone.name }}
+            </a-select-option>
+          </a-select>
+        </div>
+        <div class="capacity-dashboard-button">
+          <a-button
+            shape="round"
+            @click="() => { listCapacity(zoneSelected, true); listEvents() }">
+            {{ $t('label.fetch.latest') }}
+          </a-button>
+        </div>
+      </div>
+      <a-row :gutter="12">
+        <a-col
+          :xs="12"
+          :sm="8"
+          :md="6"
+          :style="{ marginBottom: '12px' }"
+          v-for="stat in stats"
+          :key="stat.type">
+          <chart-card :loading="loading">
+            <router-link :to="{ path: '/zone/' + zoneSelected.id }">
+              <div class="capacity-dashboard-chart-card-inner">
+                <h3>{{ $t(ts[stat.name]) }}</h3>
+                <a-progress
+                  type="dashboard"
+                  :status="getStatus(parseFloat(stat.percentused))"
+                  :percent="parseFloat(stat.percentused)"
+                  :format="percent => `${parseFloat(stat.percentused).toFixed(2)}%`"
+                  :strokeColor="getStrokeColour(parseFloat(stat.percentused))"
+                  :width="100" />
+              </div>
+            </router-link>
+            <template slot="footer"><center>{{ displayData(stat.name, stat.capacityused) }} / {{ displayData(stat.name, stat.capacitytotal) }}</center></template>
+          </chart-card>
+        </a-col>
+      </a-row>
+    </a-col>
+
+    <a-col :xl="6">
+      <chart-card :loading="loading">
+        <div style="text-align: center">
+          <a-tooltip placement="bottom" class="capacity-dashboard-button-wrapper">
+            <template slot="title">
+              {{ $t('label.view') + ' ' + $t('label.host.alerts') }}
+            </template>
+            <a-button type="danger" shape="circle">
+              <router-link :to="{ name: 'host', query: {'state': 'Alert'} }">
+                <a-icon class="capacity-dashboard-button-icon" type="desktop" />
+              </router-link>
+            </a-button>
+          </a-tooltip>
+          <a-tooltip placement="bottom" class="capacity-dashboard-button-wrapper">
+            <template slot="title">
+              {{ $t('label.view') + ' ' + $t('label.alerts') }}
+            </template>
+            <a-button shape="circle">
+              <router-link :to="{ name: 'alert' }">
+                <a-icon class="capacity-dashboard-button-icon" type="flag" />
+              </router-link>
+            </a-button>
+          </a-tooltip>
+          <a-tooltip placement="bottom" class="capacity-dashboard-button-wrapper">
+            <template slot="title">
+              {{ $t('label.view') + ' ' + $t('label.events') }}
+            </template>
+            <a-button shape="circle">
+              <router-link :to="{ name: 'event' }">
+                <a-icon class="capacity-dashboard-button-icon" type="schedule" />
+              </router-link>
+            </a-button>
+          </a-tooltip>
+        </div>
+        <template slot="footer">
+          <div class="capacity-dashboard-footer">
+            <a-timeline>
+              <a-timeline-item
+                v-for="event in events"
+                :key="event.id"
+                :color="getEventColour(event)">
+                <span :style="{ color: '#999' }"><small>{{ $toLocaleDate(event.created) }}</small></span><br/>
+                <span :style="{ color: '#666' }"><small><router-link :to="{ path: 'event/' + event.id }">{{ event.type }}</router-link></small></span><br/>
+                <span :style="{ color: '#aaa' }">({{ event.username }}) {{ event.description }}</span>
+              </a-timeline-item>
+            </a-timeline>
+          </div>
+        </template>
+      </chart-card>
+    </a-col>
+  </a-row>
+</template>
+
+<script>
+import { api } from '@/api'
+
+import ChartCard from '@/components/widgets/ChartCard'
+
+export default {
+  name: 'CapacityDashboard',
+  components: {
+    ChartCard
+  },
+  data () {
+    return {
+      loading: true,
+      events: [],
+      zones: [],
+      zoneSelected: {},
+      stats: [],
+      ts: {
+        CPU: 'label.cpu',
+        CPU_CORE: 'label.cpunumber',
+        DIRECT_ATTACHED_PUBLIC_IP: 'label.direct.ips',
+        GPU: 'label.gpu',
+        LOCAL_STORAGE: 'label.local.storage',
+        MEMORY: 'label.memory',
+        PRIVATE_IP: 'label.management.ips',
+        SECONDARY_STORAGE: 'label.secondary.storage',
+        STORAGE: 'label.storage',
+        STORAGE_ALLOCATED: 'label.primary.storage',
+        VIRTUAL_NETWORK_PUBLIC_IP: 'label.public.ips',
+        VLAN: 'label.vlan'
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.name === 'dashboard') {
+        this.fetchData()
+      }
+    }
+  },
+  created () {
+    setTimeout(() => {
+      // to do after initial timeout
+    }, 1000)
+  },
+  methods: {
+    getStatus (value) {
+      if (value > 85) {
+        return 'exception'
+      }
+      if (value > 75) {
+        return 'active'
+      }
+      return 'normal'
+    },
+    getStrokeColour (value) {
+      if (value >= 80) {
+        return 'red'
+      }
+      return 'primary'
+    },
+    displayData (dataType, value) {
+      switch (dataType) {
+        case 'CPU':
+          value = parseFloat(value / 1000.0, 10).toFixed(2) + ' GHz'
+          break
+        case 'MEMORY':
+        case 'STORAGE':
+        case 'STORAGE_ALLOCATED':
+        case 'SECONDARY_STORAGE':
+        case 'LOCAL_STORAGE':
+          value = parseFloat(value / (1024 * 1024 * 1024.0), 10).toFixed(2)
+          if (value >= 1024.0) {
+            value = parseFloat(value / 1024.0).toFixed(2) + ' TB'
+          } else {
+            value = value + ' GB'
+          }
+          break
+      }
+      return value
+    },
+    fetchData () {
+      this.listZones()
+      this.listEvents()
+    },
+    listCapacity (zone, latest = false) {
+      const params = {
+        zoneid: zone.id,
+        fetchlatest: latest
+      }
+      this.loading = true
+      api('listCapacity', params).then(json => {
+        this.stats = []
+        this.loading = false
+        if (json && json.listcapacityresponse && json.listcapacityresponse.capacity) {
+          this.stats = json.listcapacityresponse.capacity
+        }
+      })
+    },
+    listEvents () {
+      const params = {
+        page: 1,
+        pagesize: 6,
+        listall: true
+      }
+      this.loading = true
+      api('listEvents', params).then(json => {
+        this.events = []
+        this.loading = false
+        if (json && json.listeventsresponse && json.listeventsresponse.event) {
+          this.events = json.listeventsresponse.event
+        }
+      })
+    },
+    getEventColour (event) {
+      if (event.level === 'ERROR') {
+        return 'red'
+      }
+      if (event.state === 'Completed') {
+        return 'green'
+      }
+      return 'blue'
+    },
+    listZones () {
+      api('listZones').then(json => {
+        if (json && json.listzonesresponse && json.listzonesresponse.zone) {
+          this.zones = json.listzonesresponse.zone
+          if (this.zones.length > 0) {
+            this.zoneSelected = this.zones[0]
+            this.listCapacity(this.zones[0])
+          }
+        }
+      })
+    },
+    changeZone (index) {
+      this.zoneSelected = this.zones[index]
+      this.listCapacity(this.zoneSelected)
+    },
+    filterZone (input, option) {
+      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.capacity-dashboard {
+  &-wrapper {
+    display: flex;
+    margin-bottom: 12px;
+  }
+
+  &-chart-card-inner {
+     text-align: center;
+     white-space: nowrap;
+     overflow: hidden;
+  }
+
+  &-select {
+    width: 100%; // for flexbox causes
+
+    .ant-select {
+      width: 100%; // to fill flex item width
+    }
+  }
+
+  &-button-wrapper {
+    margin-left: 12px;
+  }
+
+  &-button {
+    width: auto;
+    padding-left: 12px;
+  }
+
+  &-button-icon {
+    font-size: 16px;
+    padding: 2px;
+  }
+
+  &-footer {
+    padding-top: 12px;
+    padding-left: 3px;
+    white-space: normal;
+  }
+}
+</style>
diff --git a/ui/src/views/dashboard/Dashboard.vue b/ui/src/views/dashboard/Dashboard.vue
new file mode 100644
index 0000000..946a1cc
--- /dev/null
+++ b/ui/src/views/dashboard/Dashboard.vue
@@ -0,0 +1,87 @@
+// 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="page-header-index-wide">
+    <div v-if="showOnboarding">
+      <onboarding-dashboard />
+    </div>
+    <div v-else-if="$store.getters.userInfo.roletype === 'Admin' && !project">
+      <capacity-dashboard/>
+    </div>
+    <div v-else>
+      <usage-dashboard :resource="$store.getters.project" :showProject="project" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import store from '@/store'
+import CapacityDashboard from './CapacityDashboard'
+import UsageDashboard from './UsageDashboard'
+import OnboardingDashboard from './OnboardingDashboard'
+
+export default {
+  name: 'Dashboard',
+  components: {
+    CapacityDashboard,
+    UsageDashboard,
+    OnboardingDashboard
+  },
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData
+    }
+  },
+  data () {
+    return {
+      showCapacityDashboard: false,
+      project: false,
+      showOnboarding: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+    this.showCapacityDashboard = Object.prototype.hasOwnProperty.call(store.getters.apis, 'listCapacity')
+    this.project = false
+    if (store.getters.project && store.getters.project.id) {
+      this.project = true
+    }
+    this.$store.watch(
+      (state, getters) => getters.project,
+      (newValue, oldValue) => {
+        if (newValue && newValue.id) {
+          this.project = true
+        } else {
+          this.project = false
+        }
+      }
+    )
+  },
+  methods: {
+    fetchData () {
+      if (!['Admin'].includes(this.$store.getters.userInfo.roletype)) {
+        return
+      }
+      api('listZones').then(json => {
+        this.showOnboarding = json.listzonesresponse.count ? json.listzonesresponse.count === 0 : true
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/dashboard/OnboardingDashboard.vue b/ui/src/views/dashboard/OnboardingDashboard.vue
new file mode 100644
index 0000000..093ace5
--- /dev/null
+++ b/ui/src/views/dashboard/OnboardingDashboard.vue
@@ -0,0 +1,153 @@
+// 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="onboarding">
+    <div class="head">
+      <h2>{{ $t('label.installwizard.title') }}</h2>
+      <h3>{{ $t('label.installwizard.subtitle') }}</h3>
+    </div>
+    <div class="body">
+      <div class="intro">
+        <div class="title">{{ $t('label.what.is.cloudstack') }}</div>
+        <div class="subtitle">{{ $t('label.introduction.to.cloudstack') }}</div>
+        <p>{{ $t('message.installwizard.copy.whatiscloudstack') }}</p>
+        <img class="center" src="assets/bg-what-is-cloudstack.png">
+        <a-button @click="() => { this.step = 1 }" type="primary">
+          {{ $t('label.continue.install') }}
+          <a-icon type="double-right"/>
+        </a-button>
+      </div>
+    </div>
+    <a-modal
+      :title="$t('message.change.password')"
+      :visible="this.step === 1"
+      :closable="true"
+      :maskClosable="false"
+      :footer="null"
+      :cancelText="$t('label.cancel')"
+      @cancel="closeAction"
+      centered
+      width="auto">
+      <change-user-password
+        :resource="this.resource"
+        @close-action="() => { if (this.step !== 2) this.step = 0 }"
+        @refresh-data="() => { this.step = 2 }" />
+    </a-modal>
+    <a-modal
+      :title="$t('label.installwizard.addzoneintro.title')"
+      :visible="this.step === 2"
+      :closable="true"
+      :maskClosable="false"
+      :footer="null"
+      :cancelText="$t('label.cancel')"
+      @cancel="closeAction"
+      centered
+      width="auto">
+      <zone-wizard
+        @close-action="closeAction"
+        @refresh-data="parentFetchData" />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import ChangeUserPassword from '@/views/iam/ChangeUserPassword.vue'
+import ZoneWizard from '@/views/infra/zone/ZoneWizard.vue'
+
+export default {
+  name: 'OnboardingDashboard',
+  components: {
+    ChangeUserPassword,
+    ZoneWizard
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      step: 0,
+      resource: {
+        id: this.$store.getters.userInfo.id,
+        username: this.$store.getters.userInfo.username
+      }
+    }
+  },
+  methods: {
+    closeAction () {
+      this.step = 0
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+.onboarding {
+  font-family: sans-serif;
+  padding: 20px 10px 50px 10px;
+  background: #fff;
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+  @media (min-width: 760px) {
+    padding: 20px 10% 50px 10%;
+  }
+}
+
+.head {
+  text-align: center;
+}
+
+h2 {
+  font-size: 28px;
+}
+
+h3 {
+  font-size: 20px;
+}
+
+.body {
+  padding: 56px 20px 20px 20px;
+}
+
+.title {
+  margin: auto auto 30px;
+  font-size: 22px;
+}
+
+.subtitle {
+  font-size: 12px;
+  font-weight: bold;
+}
+
+p {
+  font-family: sans-serif;
+  text-align: justify;
+  font-size: 15px;
+  line-height: 23px;
+  white-space: pre-line;
+}
+
+.center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+  margin-bottom: 10px;
+  text-align: center;
+}
+
+button {
+  float: right;
+}
+</style>
diff --git a/ui/src/views/dashboard/UsageDashboard.vue b/ui/src/views/dashboard/UsageDashboard.vue
new file mode 100644
index 0000000..ef4d964
--- /dev/null
+++ b/ui/src/views/dashboard/UsageDashboard.vue
@@ -0,0 +1,264 @@
+// 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>
+  <a-row class="usage-dashboard" :gutter="12">
+    <a-col :xl="16">
+      <a-row :gutter="12">
+        <a-card>
+          <a-tabs
+            v-if="showProject"
+            :animated="false"
+            @change="onTabChange">
+            <a-tab-pane
+              v-for="tab in $route.meta.tabs"
+              :tab="$t('label.' + tab.name)"
+              :key="tab.name"
+              v-if="'show' in tab ? tab.show(project, $route, $store.getters.userInfo) : true">
+              <component
+                :is="tab.component"
+                :resource="project"
+                :loading="loading"
+                :bordered="false"
+                :stats="stats" />
+            </a-tab-pane>
+          </a-tabs>
+          <a-col
+            v-else
+            class="usage-dashboard-chart-tile"
+            :xs="12"
+            :md="8"
+            v-for="stat in stats"
+            :key="stat.type">
+            <a-card
+              class="usage-dashboard-chart-card"
+              :bordered="false"
+              :loading="loading"
+              :style="stat.bgcolor ? { 'background-color': stat.bgcolor } : {}">
+              <router-link :to="{ path: stat.path }">
+                <div
+                  class="usage-dashboard-chart-card-inner">
+                  <h3>{{ stat.name }}</h3>
+                  <h2>
+                    <a-icon :type="stat.icon" />
+                    {{ stat.count == undefined ? 0 : stat.count }}
+                  </h2>
+                </div>
+              </router-link>
+            </a-card>
+          </a-col>
+        </a-card>
+      </a-row>
+    </a-col>
+    <a-col
+      :xl="8">
+      <chart-card :loading="loading" >
+        <div class="usage-dashboard-chart-card-inner">
+          <a-button>
+            <router-link :to="{ name: 'event' }">
+              {{ $t('label.view') + ' ' + $t('label.events') }}
+            </router-link>
+          </a-button>
+        </div>
+        <template slot="footer">
+          <div class="usage-dashboard-chart-footer">
+            <a-timeline>
+              <a-timeline-item
+                v-for="event in events"
+                :key="event.id"
+                :color="getEventColour(event)">
+                <span :style="{ color: '#999' }"><small>{{ $toLocaleDate(event.created) }}</small></span><br/>
+                <span :style="{ color: '#666' }"><small><router-link :to="{ path: 'event/' + event.id }">{{ event.type }}</router-link></small></span><br/>
+                <span :style="{ color: '#aaa' }">({{ event.username }}) {{ event.description }}</span>
+              </a-timeline-item>
+            </a-timeline>
+          </div>
+        </template>
+      </chart-card>
+    </a-col>
+  </a-row>
+</template>
+
+<script>
+import { api } from '@/api'
+import store from '@/store'
+
+import ChartCard from '@/components/widgets/ChartCard'
+import UsageDashboardChart from '@/views/dashboard/UsageDashboardChart'
+
+export default {
+  name: 'UsageDashboard',
+  components: {
+    ChartCard,
+    UsageDashboardChart
+  },
+  props: {
+    resource: {
+      type: Object,
+      default () {
+        return []
+      }
+    },
+    showProject: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      showAction: false,
+      showAddAccount: false,
+      events: [],
+      stats: [],
+      project: {}
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.project = store.getters.project
+    this.fetchData()
+    this.$store.watch(
+      (state, getters) => getters.project,
+      (newValue, oldValue) => {
+        if (newValue && newValue.id) {
+          this.fetchData()
+        }
+      }
+    )
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.name === 'dashboard') {
+        this.fetchData()
+      }
+    },
+    resource (newData, oldData) {
+      this.project = newData
+    },
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.stats = [{}, {}, {}, {}, {}, {}]
+      api('listVirtualMachines', { state: 'Running', listall: true }).then(json => {
+        var count = 0
+        if (json && json.listvirtualmachinesresponse) {
+          count = json.listvirtualmachinesresponse.count
+        }
+        this.stats.splice(0, 1, { name: this.$t('label.running'), count: count, icon: 'desktop', bgcolor: '#dfe9cc', path: '/vm?state=running&filter=running' })
+      })
+      api('listVirtualMachines', { state: 'Stopped', listall: true }).then(json => {
+        var count = 0
+        if (json && json.listvirtualmachinesresponse) {
+          count = json.listvirtualmachinesresponse.count
+        }
+        this.stats.splice(1, 1, { name: this.$t('label.stopped'), count: count, icon: 'poweroff', bgcolor: '#edcbce', path: '/vm?state=stopped&filter=stopped' })
+      })
+      api('listVirtualMachines', { listall: true }).then(json => {
+        var count = 0
+        if (json && json.listvirtualmachinesresponse) {
+          count = json.listvirtualmachinesresponse.count
+        }
+        this.stats.splice(2, 1, { name: this.$t('label.total.vms'), count: count, icon: 'number', path: '/vm' })
+      })
+      api('listVolumes', { listall: true }).then(json => {
+        var count = 0
+        if (json && json.listvolumesresponse) {
+          count = json.listvolumesresponse.count
+        }
+        this.stats.splice(3, 1, { name: this.$t('label.total.volume'), count: count, icon: 'database', path: '/volume' })
+      })
+      api('listNetworks', { listall: true }).then(json => {
+        var count = 0
+        if (json && json.listnetworksresponse) {
+          count = json.listnetworksresponse.count
+        }
+        this.stats.splice(4, 1, { name: this.$t('label.total.network'), count: count, icon: 'apartment', path: '/guestnetwork' })
+      })
+      api('listPublicIpAddresses', { listall: true }).then(json => {
+        var count = 0
+        if (json && json.listpublicipaddressesresponse) {
+          count = json.listpublicipaddressesresponse.count
+        }
+        this.stats.splice(5, 1, { name: this.$t('label.public.ip.addresses'), count: count, icon: 'environment', path: '/publicip' })
+      })
+      this.listEvents()
+    },
+    listEvents () {
+      const params = {
+        page: 1,
+        pagesize: 6,
+        listall: true
+      }
+      this.loading = true
+      api('listEvents', params).then(json => {
+        this.events = []
+        this.loading = false
+        if (json && json.listeventsresponse && json.listeventsresponse.event) {
+          this.events = json.listeventsresponse.event
+        }
+      })
+    },
+    getEventColour (event) {
+      if (event.level === 'ERROR') {
+        return 'red'
+      }
+      if (event.state === 'Completed') {
+        return 'green'
+      }
+      return 'blue'
+    },
+    onTabChange (key) {
+      this.showAddAccount = false
+
+      if (key !== 'Dashboard') {
+        this.showAddAccount = true
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .usage-dashboard {
+
+    &-chart-tile {
+      margin-bottom: 12px;
+    }
+
+    &-chart-card {
+      padding-top: 24px;
+    }
+
+    &-chart-card-inner {
+      text-align: center;
+    }
+
+    &-footer {
+       padding-top: 12px;
+       padding-left: 3px;
+       white-space: normal;
+    }
+  }
+</style>
diff --git a/ui/src/views/dashboard/UsageDashboardChart.vue b/ui/src/views/dashboard/UsageDashboardChart.vue
new file mode 100644
index 0000000..1430d2d
--- /dev/null
+++ b/ui/src/views/dashboard/UsageDashboardChart.vue
@@ -0,0 +1,67 @@
+// 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>
+    <a-col
+      class="usage-dashboard-chart-tile"
+      :xs="12"
+      :md="8"
+      v-for="stat in stats"
+      :key="stat.type">
+      <a-card
+        class="usage-dashboard-chart-card"
+        :bordered="false"
+        :loading="loading"
+        :style="stat.bgcolor ? { 'background-color': stat.bgcolor } : {}">
+        <router-link :to="{ path: stat.path }">
+          <div
+            class="usage-dashboard-chart-card-inner">
+            <h3>{{ stat.name }}</h3>
+            <h2>
+              <a-icon :type="stat.icon" />
+              {{ stat.count == undefined ? 0 : stat.count }}
+            </h2>
+          </div>
+        </router-link>
+      </a-card>
+    </a-col>
+  </div>
+</template>
+
+<script>
+import ChartCard from '@/components/widgets/ChartCard'
+
+export default {
+  name: 'UsageDashboardChart',
+  components: {
+    ChartCard
+  },
+  props: {
+    stats: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/exception/403.vue b/ui/src/views/exception/403.vue
new file mode 100644
index 0000000..4bca962
--- /dev/null
+++ b/ui/src/views/exception/403.vue
@@ -0,0 +1,34 @@
+// 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>
+  <exception-page type="403" />
+</template>
+
+<script>
+import ExceptionPage from './ExceptionPage'
+
+export default {
+  components: {
+    ExceptionPage
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/ui/src/views/exception/404.vue b/ui/src/views/exception/404.vue
new file mode 100644
index 0000000..0dcb895
--- /dev/null
+++ b/ui/src/views/exception/404.vue
@@ -0,0 +1,34 @@
+// 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>
+  <exception-page type="404" />
+</template>
+
+<script>
+import ExceptionPage from './ExceptionPage'
+
+export default {
+  components: {
+    ExceptionPage
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/ui/src/views/exception/500.vue b/ui/src/views/exception/500.vue
new file mode 100644
index 0000000..eb75697
--- /dev/null
+++ b/ui/src/views/exception/500.vue
@@ -0,0 +1,34 @@
+// 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>
+  <exception-page type="500" />
+</template>
+
+<script>
+import ExceptionPage from './ExceptionPage'
+
+export default {
+  components: {
+    ExceptionPage
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/ui/src/views/exception/ExceptionPage.vue b/ui/src/views/exception/ExceptionPage.vue
new file mode 100644
index 0000000..97c22d4
--- /dev/null
+++ b/ui/src/views/exception/ExceptionPage.vue
@@ -0,0 +1,124 @@
+// 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="exception">
+    <div class="img" v-if="type == '403'">
+      <img
+        v-if="$config.error['403']"
+        :src="$config.error['403']"
+        :style="{
+          width: $config.theme['@error-width'],
+          height: $config.theme['@error-height']
+        }"/>
+    </div>
+    <div class="img" v-if="type == '404'">
+      <img
+        v-if="$config.error['404']"
+        :src="$config.error['404']"
+        :style="{
+          width: $config.theme['@error-width'],
+          height: $config.theme['@error-height']
+        }"/>
+    </div>
+    <div class="img" v-if="type == '500'">
+      <img
+        v-if="$config.error['500']"
+        :src="$config.error['500']"
+        :style="{
+          width: $config.theme['@error-width'],
+          height: $config.theme['@error-height']
+        }"/>
+    </div>
+    <div class="content">
+      <h1>{{ config[type].title }}</h1>
+      <div class="desc">{{ config[type].desc }}</div>
+      <div class="action">
+        <a-button type="primary" @click="handleToHome">{{ $t('label.go.back') }}</a-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import types from './type'
+
+export default {
+  name: 'Exception',
+  props: {
+    type: {
+      type: String,
+      default: '404'
+    }
+  },
+  data () {
+    return {
+      config: types
+    }
+  },
+  methods: {
+    handleToHome () {
+      this.$router.push({ name: 'dashboard' })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .exception {
+    min-height: 500px;
+    height: 80%;
+    align-items: center;
+    text-align: center;
+    margin-top: 150px;
+    .img {
+      display: inline-block;
+      padding-right: 52px;
+      zoom: 1;
+    }
+    .content {
+      display: inline-block;
+      flex: auto;
+      h1 {
+        color: #434e59;
+        font-size: 72px;
+        font-weight: 600;
+        line-height: 72px;
+        margin-bottom: 24px;
+      }
+      .desc {
+        color: rgba(0, 0, 0, .45);
+        font-size: 20px;
+        line-height: 28px;
+        margin-bottom: 16px;
+      }
+    }
+  }
+
+  .mobile {
+    .exception {
+      margin-top: 30px;
+      .img {
+        padding-right: unset;
+
+        img {
+          max-width: 80%;
+        }
+      }
+    }
+  }
+</style>
diff --git a/ui/src/views/exception/type.js b/ui/src/views/exception/type.js
new file mode 100644
index 0000000..8f071c5
--- /dev/null
+++ b/ui/src/views/exception/type.js
@@ -0,0 +1,33 @@
+// 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.
+
+const types = {
+  403: {
+    title: '403',
+    desc: 'Access Forbidden.'
+  },
+  404: {
+    title: '404',
+    desc: 'Not Found.'
+  },
+  500: {
+    title: '500',
+    desc: 'Internal Server Error.'
+  }
+}
+
+export default types
diff --git a/ui/src/views/iam/AddAccount.vue b/ui/src/views/iam/AddAccount.vue
new file mode 100644
index 0000000..eca86a7
--- /dev/null
+++ b/ui/src/views/iam/AddAccount.vue
@@ -0,0 +1,430 @@
+// 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" :loading="loading" @submit="handleSubmit" layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.role') }}
+            <a-tooltip :title="apiParams.roleid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['roleid', {
+              initialValue: selectedRole,
+              rules: [{ required: true, message: $t('message.error.select') }] }]"
+            :loading="roleLoading"
+            :placeholder="apiParams.roleid.description">
+            <a-select-option v-for="role in roles" :key="role.id">
+              {{ role.name + ' (' + role.type + ')' }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.username') }}
+            <a-tooltip :title="apiParams.username.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['username', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.username.description" />
+        </a-form-item>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.password') }}
+                <a-tooltip :title="apiParams.password.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input-password
+                v-decorator="['password', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.password.description"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.confirmpassword') }}
+                <a-tooltip :title="apiParams.password.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input-password
+                v-decorator="['confirmpassword', {
+                  rules: [
+                    { required: true, message: $t('message.error.required.input') },
+                    { validator: validateConfirmPassword }
+                  ]
+                }]"
+                :placeholder="apiParams.password.description"/>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.email') }}
+            <a-tooltip :title="apiParams.email.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['email', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.email.description" />
+        </a-form-item>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.firstname') }}
+                <a-tooltip :title="apiParams.firstname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['firstname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.firstname.description" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.lastname') }}
+                <a-tooltip :title="apiParams.lastname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['lastname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.lastname.description" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item v-if="this.isAdminOrDomainAdmin()">
+          <span slot="label">
+            {{ $t('label.domain') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            :loading="domainLoading"
+            v-decorator="['domainid', {
+              initialValue: selectedDomain,
+              rules: [{ required: true, message: $t('message.error.select') }] }]"
+            :placeholder="apiParams.domainid.description">
+            <a-select-option v-for="domain in domainsList" :key="domain.id">
+              {{ domain.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.account') }}
+            <a-tooltip :title="apiParams.account.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input v-decorator="['account']" :placeholder="apiParams.account.description" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.timezone') }}
+            <a-tooltip :title="apiParams.timezone.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            showSearch
+            v-decorator="['timezone']"
+            :loading="timeZoneLoading"
+            :placeholder="apiParams.timezone.description">
+            <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.networkdomain') }}
+            <a-tooltip :title="apiParams.networkdomain.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['networkdomain']"
+            :placeholder="apiParams.networkdomain.description" />
+        </a-form-item>
+        <div v-if="'authorizeSamlSso' in $store.getters.apis">
+          <a-form-item :label="$t('label.samlenable')">
+            <a-switch v-decorator="['samlenable']" @change="checked => { this.samlEnable = checked }" />
+          </a-form-item>
+          <a-form-item v-if="samlEnable">
+            <span slot="label">
+              {{ $t('label.samlentity') }}
+              <a-tooltip :title="apiParams.entityid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['samlentity', {
+                initialValue: selectedIdp,
+              }]"
+              :loading="idpLoading">
+              <a-select-option v-for="(idp, idx) in idps" :key="idx">
+                {{ idp.orgName }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import debounce from 'lodash/debounce'
+
+export default {
+  name: 'AddAccountForm',
+  data () {
+    this.fetchTimeZone = debounce(this.fetchTimeZone, 800)
+    return {
+      loading: false,
+      domainLoading: false,
+      domainsList: [],
+      selectedDomain: '',
+      roleLoading: false,
+      roles: [],
+      selectedRole: '',
+      timeZoneLoading: false,
+      timeZoneMap: [],
+      samlEnable: false,
+      idpLoading: false,
+      idps: [],
+      selectedIdp: ''
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createAccount || {}
+    this.apiParams = {}
+    if (this.apiConfig.params) {
+      this.apiConfig.params.forEach(param => {
+        this.apiParams[param.name] = param
+      })
+    }
+    this.apiConfig = this.$store.getters.apis.authorizeSamlSso || {}
+    if (this.apiConfig.params) {
+      this.apiConfig.params.forEach(param => {
+        this.apiParams[param.name] = param
+      })
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomains()
+      this.fetchRoles()
+      this.fetchTimeZone()
+      if ('listIdps' in this.$store.getters.apis) {
+        this.fetchIdps()
+      }
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isDomainAdmin () {
+      return this.$store.getters.userInfo.roletype === 'DomainAdmin'
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    validateConfirmPassword (rule, value, callback) {
+      if (!value || value.length === 0) {
+        callback()
+      } else if (rule.field === 'confirmpassword') {
+        const form = this.form
+        const messageConfirm = this.$t('error.password.not.match')
+        const passwordVal = form.getFieldValue('password')
+        if (passwordVal && passwordVal !== value) {
+          callback(messageConfirm)
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    },
+    fetchDomains () {
+      this.domainLoading = true
+      api('listDomains', {
+        listAll: true,
+        details: 'min'
+      }).then(response => {
+        this.domainsList = response.listdomainsresponse.domain || []
+        this.selectedDomain = this.domainsList[0].id || ''
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext
+        })
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchRoles () {
+      this.roleLoading = true
+      api('listRoles').then(response => {
+        this.roles = response.listrolesresponse.role || []
+        this.selectedRole = this.roles[0].id
+        if (this.isDomainAdmin()) {
+          const userRole = this.roles.filter(role => role.type === 'User')
+          if (userRole.length > 0) {
+            this.selectedRole = userRole[0].id
+          }
+        }
+      }).finally(() => {
+        this.roleLoading = false
+      })
+    },
+    fetchTimeZone (value) {
+      this.timeZoneMap = []
+      this.timeZoneLoading = true
+
+      timeZone(value).then(json => {
+        this.timeZoneMap = json
+        this.timeZoneLoading = false
+      })
+    },
+    fetchIdps () {
+      this.idpLoading = true
+      api('listIdps').then(response => {
+        this.idps = response.listidpsresponse.idp || []
+        this.selectedIdp = this.idps[0].id || ''
+      }).finally(() => {
+        this.idpLoading = false
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          roleid: values.roleid,
+          username: values.username,
+          password: values.password,
+          email: values.email,
+          firstname: values.firstname,
+          lastname: values.lastname,
+          domainid: values.domainid
+        }
+        if (this.isValidValueForKey(values, 'account') && values.account.length > 0) {
+          params.account = values.account
+        }
+        if (this.isValidValueForKey(values, 'timezone') && values.timezone.length > 0) {
+          params.timezone = values.timezone
+        }
+        if (this.isValidValueForKey(values, 'networkdomain') && values.networkdomain.length > 0) {
+          params.networkdomain = values.networkdomain
+        }
+
+        api('createAccount', params).then(response => {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: this.$t('label.create.account'),
+            description: `${this.$t('message.success.create.account')} ${params.username}`
+          })
+          const users = response.createaccountresponse.account.user
+          if (values.samlenable && users) {
+            for (var i = 0; i < users.length; i++) {
+              api('authorizeSamlSso', {
+                enable: values.samlenable,
+                entityid: values.samlentity,
+                userid: users[i].id
+              }).then(response => {
+                this.$notification.success({
+                  message: this.$t('samlenable'),
+                  description: this.$t('message.success.enable.saml.auth')
+                })
+              }).catch(error => {
+                this.$notification.error({
+                  message: this.$t('message.request.failed'),
+                  description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+                  duration: 0
+                })
+              })
+            }
+          }
+          this.closeAction()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+            duration: 0
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+    @media (min-width: 600px) {
+      width: 450px;
+    }
+  }
+  .action-button {
+    text-align: right;
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/iam/AddLdapAccount.vue b/ui/src/views/iam/AddLdapAccount.vue
new file mode 100644
index 0000000..50806d1
--- /dev/null
+++ b/ui/src/views/iam/AddLdapAccount.vue
@@ -0,0 +1,489 @@
+// 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="ldap-account-layout">
+    <a-row :gutter="0">
+      <a-col :md="24" :lg="16">
+        <a-card :bordered="false">
+          <a-input-search
+            style="margin-bottom: 10px"
+            :placeholder="$t('label.search')"
+            v-model="searchQuery"
+            @search="handleSearch" />
+          <a-table
+            size="small"
+            :loading="listLoading"
+            :columns="columns"
+            :dataSource="dataSource"
+            :rowSelection="{
+              columnWidth: 50,
+              selectedRowKeys: selectedRowKeys,
+              onChange: onSelectChange
+            }"
+            :rowKey="record => record.username"
+            :rowClassName="getRowClassName"
+            :pagination="false"
+            style="overflow-y: auto"
+            :scroll="{ y: '50vh' }"
+          />
+        </a-card>
+      </a-col>
+      <a-col :md="24" :lg="8">
+        <a-card :bordered="false">
+          <a-form
+            :form="form"
+            @submit="handleSubmit"
+            layout="vertical" >
+            <a-form-item :label="$t('label.filterby')">
+              <a-select @change="fetchListLdapUsers" v-model="selectedFilter" >
+                <a-select-option v-for="opt in filters" :key="opt.id" >
+                  {{ opt.name }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+            <a-form-item :label="$t('label.domain')">
+              <a-select
+                showSearch
+                v-decorator="['domainid', {
+                  rules: [{ required: true, memessage: `${this.$t('message.error.select')}` }]
+                }]"
+                :placeholder="apiParams.domainid.description"
+                :loading="domainLoading"
+                @change="fetchListLdapUsers($event)" >
+                <a-select-option v-for="opt in listDomains" :key="opt.name">
+                  {{ opt.name }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+            <a-form-item :label="$t('label.account')">
+              <a-input
+                v-decorator="['account']"
+                :placeholder="apiParams.account.description"
+              />
+            </a-form-item>
+            <a-form-item :label="$t('label.role')">
+              <a-select
+                showSearch
+                v-decorator="['roleid', {
+                  rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+                }]"
+                :placeholder="apiParams.roleid.description"
+                :loading="roleLoading">
+                <a-select-option v-for="opt in listRoles" :key="opt.name">
+                  {{ opt.name }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+            <a-form-item :label="$t('label.timezone')">
+              <a-select
+                showSearch
+                v-decorator="['timezone']"
+                :placeholder="apiParams.timezone.description"
+                :loading="timeZoneLoading">
+                <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+            <a-form-item :label="$t('label.networkdomain')">
+              <a-input
+                v-decorator="['networkdomain']"
+                :placeholder="apiParams.networkdomain.description"
+              />
+            </a-form-item>
+            <a-form-item :label="$t('label.ldap.group.name')">
+              <a-input
+                v-decorator="['group']"
+                :placeholder="apiParams.group.description"
+              />
+            </a-form-item>
+            <div v-if="'authorizeSamlSso' in $store.getters.apis">
+              <a-form-item :label="$t('label.samlenable')">
+                <a-switch v-decorator="['samlEnable']" @change="checked => { this.samlEnable = checked }" />
+              </a-form-item>
+              <a-form-item v-if="samlEnable" :label="$t('label.samlentity')">
+                <a-select
+                  v-decorator="['samlEntity', {
+                    initialValue: selectedIdp,
+                    rules: [{ required: samlEnable, message: `${this.$t('message.error.select')}` }]
+                  }]"
+                  :placeholder="$t('label.choose.saml.indentity')"
+                  :loading="loading">
+                  <a-select-option v-for="(idp, idx) in listIdps" :key="idx">
+                    {{ idp.orgName }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </div>
+
+            <div class="card-footer">
+              <a-button @click="handleClose">{{ $t('label.close') }}</a-button>
+              <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.add') }}</a-button>
+            </div>
+          </a-form>
+        </a-card>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import store from '@/store'
+
+export default {
+  name: 'AddLdapAccount',
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      oldDataSource: [],
+      selectedRowKeys: [],
+      listDomains: [],
+      listRoles: [],
+      timeZoneMap: [],
+      listIdps: [],
+      selectedIdp: '',
+      filters: [],
+      selectedFilter: '',
+      listLoading: false,
+      timeZoneLoading: false,
+      domainLoading: false,
+      roleLoading: false,
+      loading: false,
+      searchQuery: undefined,
+      samlEnable: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiLdapCreateAccountConfig = this.$store.getters.apis.ldapCreateAccount || {}
+    this.apiImportLdapUsersConfig = this.$store.getters.apis.importLdapUsers || {}
+    this.apiParams = {}
+    this.apiLdapCreateAccountConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+    this.apiImportLdapUsersConfig.params.forEach(param => {
+      if (!this.apiParams || !this.apiParams[param.name]) {
+        this.apiParams[param.name] = param
+      }
+    })
+  },
+  created () {
+    this.selectedRowKeys = []
+    this.dataSource = []
+    this.listDomains = []
+    this.listRoles = []
+    this.listIdps = []
+    this.columns = [
+      {
+        title: this.$t('label.name'),
+        dataIndex: 'name',
+        width: 120,
+        scopedSlots: { customRender: 'name' }
+      },
+      {
+        title: this.$t('label.username'),
+        dataIndex: 'username',
+        width: 120,
+        scopedSlots: { customRender: 'username' }
+      },
+      {
+        title: this.$t('label.email'),
+        dataIndex: 'email',
+        scopedSlots: { customRender: 'email' }
+      },
+      {
+        title: this.$t('label.user.conflict'),
+        dataIndex: 'conflictingusersource',
+        scopedSlots: { customRender: 'conflictingusersource' }
+      }
+    ]
+    this.filters = [
+      {
+        id: 'NoFilter',
+        name: 'No filter'
+      },
+      {
+        id: 'LocalDomain',
+        name: 'Local domain'
+      },
+      {
+        id: 'AnyDomain',
+        name: 'Any domain'
+      },
+      {
+        id: 'PotentialImport',
+        name: 'Potential import'
+      }
+    ]
+    this.selectedFilter = this.filters[0].id
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    async fetchData () {
+      this.timeZoneLoading = true
+      this.domainLoading = true
+      this.roleLoading = true
+      this.fetchListLdapUsers()
+      const [
+        listTimeZone,
+        listDomains,
+        listRoles,
+        listIdps
+      ] = await Promise.all([
+        this.fetchTimeZone(),
+        this.fetchListDomains(),
+        this.fetchListRoles(),
+        ('listIdps' in this.$store.getters.apis) ? this.fetchIdps() : []
+      ]).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.timeZoneLoading = false
+        this.domainLoading = false
+        this.roleLoading = false
+      })
+      this.timeZoneMap = listTimeZone && listTimeZone.length > 0 ? listTimeZone : []
+      this.listDomains = listDomains && listDomains.length > 0 ? listDomains : []
+      this.listRoles = listRoles && listRoles.length > 0 ? listRoles : []
+      this.listIdps = listIdps && listIdps.length > 0 ? listIdps : []
+    },
+    fetchTimeZone (value) {
+      return new Promise((resolve, reject) => {
+        timeZone(value).then(json => {
+          resolve(json)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    fetchListLdapUsers (domain) {
+      this.listLoading = true
+      const params = {}
+      params.listtype = 'new'
+      params.userfilter = this.selectedFilter
+      params.domainid = store.getters.userInfo.domainid
+      if (domain) {
+        const result = this.listDomains.filter(item => item.name === domain)
+        if (result.length > 0) {
+          params.domainid = result[0].id
+        }
+      }
+      api('listLdapUsers', params).then(json => {
+        const listLdapUsers = json.ldapuserresponse.LdapUser
+        if (listLdapUsers) {
+          const ldapUserLength = listLdapUsers.length
+          for (let i = 0; i < ldapUserLength; i++) {
+            listLdapUsers[i].name = [listLdapUsers[i].firstname, listLdapUsers[i].lastname].join(' ')
+          }
+        }
+        this.dataSource = listLdapUsers
+        this.oldDataSource = listLdapUsers
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.listLoading = false
+      })
+    },
+    fetchListDomains () {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        api('listDomains', params).then(json => {
+          const listDomains = json.listdomainsresponse.domain
+          resolve(listDomains)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    fetchListRoles () {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        api('listRoles', params).then(json => {
+          const listRoles = json.listrolesresponse.role
+          resolve(listRoles)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    fetchIdps () {
+      return new Promise((resolve, reject) => {
+        api('listIdps').then(json => {
+          const listIdps = json.listidpsresponse.idp || []
+          if (listIdps.length !== 0) {
+            this.selectedIdp = listIdps[0].id
+          }
+          resolve(listIdps)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        let apiName = 'ldapCreateAccount'
+        const domain = this.listDomains.filter(item => item.name === values.domainid)
+        const role = this.listRoles.filter(item => item.name === values.roleid)
+        const promises = []
+        const params = {}
+        params.domainid = domain[0].id
+        params.roleid = role[0].id
+        params.account = values.account
+        params.timezone = values.timezone
+        params.networkdomain = values.networkdomain
+        if (values.group && values.group.trim().length > 0) {
+          params.group = values.group
+          apiName = 'importLdapUsers'
+          promises.push(new Promise((resolve, reject) => {
+            api(apiName, params).then(json => {
+              resolve(json)
+            }).catch(error => {
+              reject(error)
+            })
+          }))
+        } else {
+          this.selectedRowKeys.forEach(username => {
+            params.username = username
+            promises.push(new Promise((resolve, reject) => {
+              api(apiName, params).then(json => {
+                resolve(json)
+              }).catch(error => {
+                reject(error)
+              })
+            }))
+          })
+        }
+        this.loading = true
+        Promise.all(promises).then(responses => {
+          for (const response of responses) {
+            if (apiName === 'ldapCreateAccount' && values.samlEnable) {
+              const users = response.createaccountresponse.account.user
+              const entityId = values.samlEntity
+              if (users && entityId) {
+                this.authorizeUsersForSamlSSO(users, entityId)
+              }
+            } else if (apiName === 'importLdapUsers' && response.ldapuserresponse && values.samlEnable) {
+              this.$notification.error({
+                message: this.$t('message.request.failed'),
+                description: this.$t('message.error.enable.saml')
+              })
+            } else {
+              if (apiName === 'ldapCreateAccount') {
+                this.$notification.success({
+                  message: this.$t('label.add.ldap.account'),
+                  description: response.createaccountresponse.account.name
+                })
+              }
+            }
+          }
+          this.$emit('refresh-data')
+          this.handleClose()
+        }).catch(error => {
+          this.$notifyError(error)
+          this.$emit('refresh-data')
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    handleSearch () {
+      this.dataSource = this.oldDataSource
+      if (!this.searchQuery || this.searchQuery.length === 0) {
+        return
+      }
+      this.dataSource = this.dataSource.filter(item => this.filterLdapUser(item))
+    },
+    filterLdapUser (item) {
+      switch (true) {
+        case (item.name && item.name.toLowerCase().indexOf(this.searchQuery.toLowerCase()) > -1):
+          return item
+        case (item.username && item.username.toLowerCase().indexOf(this.searchQuery.toLowerCase()) > -1):
+          return item
+        case (item.email && item.email.toLowerCase().indexOf(this.searchQuery.toLowerCase()) > -1):
+          return item
+        default:
+          break
+      }
+    },
+    handleClose () {
+      this.$emit('close-action')
+    },
+    authorizeUsersForSamlSSO (users, entityId) {
+      const promises = []
+      for (var i = 0; i < users.length; i++) {
+        const params = {}
+        params.enable = true
+        params.userid = users[i].id
+        params.entityid = entityId
+        promises.push(new Promise((resolve, reject) => {
+          api('authorizeSamlSso', params).catch(error => {
+            reject(error)
+          })
+        }))
+      }
+      Promise.all(promises).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    onSelectChange (selectedRowKeys) {
+      this.selectedRowKeys = selectedRowKeys
+    },
+    getRowClassName (record, index) {
+      if (index % 2 === 0) {
+        return 'light-row'
+      }
+      return 'dark-row'
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.ldap-account-layout {
+  width: 85vw;
+
+  @media (min-width: 1000px) {
+    width: 900px;
+  }
+}
+
+.card-footer {
+  text-align: right;
+
+  button + button {
+    margin-left: 8px;
+  }
+}
+
+/deep/ .light-row {
+  background-color: #fff;
+}
+
+/deep/ .dark-row {
+  background-color: #f9f9f9;
+}
+
+</style>
diff --git a/ui/src/views/iam/AddUser.vue b/ui/src/views/iam/AddUser.vue
new file mode 100644
index 0000000..d7121ea
--- /dev/null
+++ b/ui/src/views/iam/AddUser.vue
@@ -0,0 +1,412 @@
+// 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" :loading="loading" @submit="handleSubmit" layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.username') }}
+            <a-tooltip :title="apiParams.username.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['username', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.username.description" />
+        </a-form-item>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.password') }}
+                <a-tooltip :title="apiParams.password.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input-password
+                v-decorator="['password', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.password.description"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.confirmpassword') }}
+                <a-tooltip :title="apiParams.password.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input-password
+                v-decorator="['confirmpassword', {
+                  rules: [
+                    { required: true, message: $t('message.error.required.input') },
+                    { validator: validateConfirmPassword }
+                  ]
+                }]"
+                :placeholder="apiParams.password.description"/>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.email') }}
+            <a-tooltip :title="apiParams.email.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['email', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.email.description" />
+        </a-form-item>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.firstname') }}
+                <a-tooltip :title="apiParams.firstname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['firstname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.firstname.description" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.lastname') }}
+                <a-tooltip :title="apiParams.lastname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['lastname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.lastname.description" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item v-if="this.isAdminOrDomainAdmin() && !domainid">
+          <span slot="label">
+            {{ $t('label.domain') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            :loading="domainLoading"
+            v-decorator="['domainid']"
+            :placeholder="apiParams.domainid.description">
+            <a-select-option v-for="domain in domainsList" :key="domain.id">
+              {{ domain.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="!account">
+          <span slot="label">
+            {{ $t('label.account') }}
+            <a-tooltip :title="apiParams.account.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['account']"
+            :loading="loadingAccount"
+            :placeholder="apiParams.account.description">
+            <a-select-option v-for="(item, idx) in accountList" :key="idx">
+              {{ item.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.timezone') }}
+            <a-tooltip :title="apiParams.timezone.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            showSearch
+            v-decorator="['timezone']"
+            :loading="timeZoneLoading">
+            <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div v-if="'authorizeSamlSso' in $store.getters.apis">
+          <a-form-item :label="$t('label.samlenable')">
+            <a-switch v-decorator="['samlenable']" @change="checked => { this.samlEnable = checked }" />
+          </a-form-item>
+          <a-form-item v-if="samlEnable">
+            <span slot="label">
+              {{ $t('label.samlentity') }}
+              <a-tooltip :title="apiParams.entityid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['samlentity', {
+                initialValue: selectedIdp,
+              }]"
+              :loading="idpLoading">
+              <a-select-option v-for="(idp, idx) in idps" :key="idx">
+                {{ idp.orgName }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import debounce from 'lodash/debounce'
+
+export default {
+  name: 'AddUser',
+  data () {
+    this.fetchTimeZone = debounce(this.fetchTimeZone, 800)
+    return {
+      loading: false,
+      timeZoneLoading: false,
+      timeZoneMap: [],
+      domainLoading: false,
+      domainsList: [],
+      selectedDomain: '',
+      samlEnable: false,
+      idpLoading: false,
+      idps: [],
+      selectedIdp: '',
+      loadingAccount: false,
+      accountList: [],
+      account: null,
+      domainid: null
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createUser || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+    this.apiConfig = this.$store.getters.apis.authorizeSamlSso || {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.account = this.$route.query && this.$route.query.account ? this.$route.query.account : null
+      this.domainid = this.$route.query && this.$route.query.domainid ? this.$route.query.domainid : null
+      if (!this.domianid) {
+        this.fetchDomains()
+      }
+      if (!this.account) {
+        this.fetchAccount()
+      }
+      this.fetchTimeZone()
+      if ('listIdps' in this.$store.getters.apis) {
+        this.fetchIdps()
+      }
+    },
+    fetchDomains () {
+      this.domainLoading = true
+      api('listDomains', {
+        listAll: true,
+        details: 'min'
+      }).then(response => {
+        this.domainsList = response.listdomainsresponse.domain || []
+        this.selectedDomain = this.domainsList[0].id || ''
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext
+        })
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchAccount () {
+      this.accountList = []
+      this.loadingAccount = true
+      api('listAccounts', { listAll: true }).then(response => {
+        this.accountList = response.listaccountsresponse.account || []
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext
+        })
+      }).finally(() => {
+        this.loadingAccount = false
+      })
+    },
+    fetchTimeZone (value) {
+      this.timeZoneMap = []
+      this.timeZoneLoading = true
+
+      timeZone(value).then(json => {
+        this.timeZoneMap = json
+        this.timeZoneLoading = false
+      })
+    },
+    fetchIdps () {
+      this.idpLoading = true
+      api('listIdps').then(response => {
+        this.idps = response.listidpsresponse.idp || []
+        this.selectedIdp = this.idps[0].id || ''
+      }).finally(() => {
+        this.idpLoading = false
+      })
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          username: values.username,
+          password: values.password,
+          email: values.email,
+          firstname: values.firstname,
+          lastname: values.lastname,
+          accounttype: 0
+        }
+
+        if (this.account) {
+          params.account = this.account
+        } else if (values.account) {
+          params.account = this.accountList[values.account].name
+        }
+
+        if (this.domainid) {
+          params.domainid = this.domainid
+        } else if (values.domainid) {
+          params.domainid = values.domainid
+        }
+
+        if (this.isValidValueForKey(values, 'timezone') && values.timezone.length > 0) {
+          params.timezone = values.timezone
+        }
+
+        api('createUser', {}, 'POST', params).then(response => {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: this.$t('label.create.user'),
+            description: `${this.$t('message.success.create.user')} ${params.username}`
+          })
+          const users = response.createuserresponse.user.user
+          if (values.samlenable && users) {
+            for (var i = 0; i < users.length; i++) {
+              api('authorizeSamlSso', {
+                enable: values.samlenable,
+                entityid: values.samlentity,
+                userid: users[i].id
+              }).then(response => {
+                this.$notification.success({
+                  message: this.$t('label.samlenable'),
+                  description: this.$t('message.success.enable.saml.auth')
+                })
+              }).catch(error => {
+                this.$notification.error({
+                  message: this.$t('message.request.failed'),
+                  description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+                  duration: 0
+                })
+              })
+            }
+          }
+          this.closeAction()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+            duration: 0
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    validateConfirmPassword (rule, value, callback) {
+      if (!value || value.length === 0) {
+        callback()
+      } else if (rule.field === 'confirmpassword') {
+        const form = this.form
+        const messageConfirm = this.$t('error.password.not.match')
+        const passwordVal = form.getFieldValue('password')
+        if (passwordVal && passwordVal !== value) {
+          callback(messageConfirm)
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 80vw;
+  @media (min-width: 600px) {
+    width: 450px;
+  }
+}
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/iam/ChangeUserPassword.vue b/ui/src/views/iam/ChangeUserPassword.vue
new file mode 100644
index 0000000..698d2fb
--- /dev/null
+++ b/ui/src/views/iam/ChangeUserPassword.vue
@@ -0,0 +1,180 @@
+// 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 v-if="!this.isAdminOrDomainAdmin()">
+          <span slot="label">
+            {{ $t('label.currentpassword') }}
+            <a-tooltip :title="apiParams.currentpassword.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input-password
+            v-decorator="['currentpassword', {
+              rules: [{ required: true, message: $t('message.error.current.password') }]
+            }]"
+            :placeholder="$t('message.error.current.password')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.new.password') }}
+            <a-tooltip :title="apiParams.password.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input-password
+            v-decorator="['password', {
+              rules: [{ required: true, message: $t('message.error.new.password') }]
+            }]"
+            :placeholder="$t('label.new.password')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.confirmpassword') }}
+            <a-tooltip :title="apiParams.password.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input-password
+            v-decorator="['confirmpassword', {
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.error.confirm.password')
+                },
+                {
+                  validator: validateTwoPassword
+                }
+              ]
+            }]"
+            :placeholder="$t('label.confirmpassword.description')"/>
+        </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: 'ChangeUserPassword',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    this.apiConfig = this.$store.getters.apis.updateUser || {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  methods: {
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    validateTwoPassword (rule, value, callback) {
+      if (!value || value.length === 0) {
+        callback()
+      } else if (rule.field === 'confirmpassword') {
+        const form = this.form
+        const messageConfirm = this.$t('message.validate.equalto')
+        const passwordVal = form.getFieldValue('password')
+        if (passwordVal && passwordVal !== value) {
+          callback(messageConfirm)
+        } else {
+          callback()
+        }
+      } else {
+        callback()
+      }
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          id: this.resource.id,
+          password: values.password
+        }
+        if (this.isValidValueForKey(values, 'currentpassword') && values.currentpassword.length > 0) {
+          params.currentpassword = values.currentpassword
+        }
+        api('updateUser', {}, 'POST', params).then(json => {
+          this.$notification.success({
+            message: this.$t('label.action.change.password'),
+            description: `${this.$t('message.success.change.password')} ${this.resource.username}`
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 600px) {
+      width: 450px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/iam/ConfigureSamlSsoAuth.vue b/ui/src/views/iam/ConfigureSamlSsoAuth.vue
new file mode 100644
index 0000000..1e21a0d
--- /dev/null
+++ b/ui/src/views/iam/ConfigureSamlSsoAuth.vue
@@ -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.
+
+<template>
+  <div class="form-layout">
+    <a-form :form="form" @submit="handleSubmit" layout="vertical" :loading="loading">
+      <a-form-item :label="$t('label.samlenable')">
+        <a-switch
+          v-decorator="['samlEnable', {
+            initialValue: isSamlEnabled
+          }]"
+          :checked="isSamlEnabled"
+          @change="val => { isSamlEnabled = val }"
+        />
+      </a-form-item>
+      <a-form-item :label="$t('label.samlentity')">
+        <a-select
+          v-decorator="['samlEntity', {
+            initialValue: selectedIdp,
+          }]">
+          <a-select-option v-for="(idp, idx) in idps" :key="idx">
+            {{ idp.orgName }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <div class="card-footer">
+        <a-button @click="handleClose">{{ $t('label.close') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+export default {
+  name: 'ConfigureSamlSsoAuth',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      selectedIdp: '',
+      idps: [],
+      isSamlEnabled: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.IsUserSamlAuthorized()
+      this.loading = true
+      api('listIdps').then(response => {
+        this.idps = response.listidpsresponse.idp || []
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    IsUserSamlAuthorized () {
+      api('listSamlAuthorization', {
+        userid: this.resource.id
+      }).then(response => {
+        this.isSamlEnabled = response.listsamlauthorizationsresponse.samlauthorization[0].status || false
+        this.selectedIdp = response.listsamlauthorizationsresponse.samlauthorization[0].idpid || ''
+      })
+    },
+    handleClose () {
+      this.$emit('close-action')
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        api('authorizeSamlSso', {
+          enable: values.samlEnable,
+          userid: this.resource.id,
+          entityid: values.samlEntity
+        }).then(response => {
+          this.$notification.success({
+            message: values.samlEnable ? this.$t('label.saml.enable') : this.$t('label.saml.disable'),
+            description: values.samlEnable ? `${this.$t('message.success.enable.saml.auth')} ${this.$t('label.for')} ${this.resource.username}`
+              : `${this.$t('message.success.disable.saml.auth')} ${this.$t('label.for')} ${this.resource.username}`
+          })
+          this.handleClose()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+            duration: 0
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+<style scoped lang="less">
+.form-layout {
+  width: 75vw;
+
+  @media (min-width: 700px) {
+    width: 40vw;
+  }
+}
+.card-footer {
+  text-align: right;
+
+  button + button {
+    margin-left: 8px;
+  }
+}
+</style>
diff --git a/ui/src/views/iam/CreateRole.vue b/ui/src/views/iam/CreateRole.vue
new file mode 100644
index 0000000..38156f8
--- /dev/null
+++ b/ui/src/views/iam/CreateRole.vue
@@ -0,0 +1,205 @@
+// 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 :label="$t('label.name')">
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="createRoleApiParams.name.description" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.description')">
+          <a-input
+            v-decorator="['description']"
+            :placeholder="createRoleApiParams.description.description" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.based.on')" v-if="'roleid' in createRoleApiParams">
+          <a-radio-group
+            v-decorator="['using', {
+              initialValue: this.createRoleUsing
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleChangeCreateRole(selected.target.value) }">
+            <a-radio-button value="type">
+              {{ $t('label.type') }}
+            </a-radio-button>
+            <a-radio-button value="role">
+              {{ $t('label.role') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.type')" v-if="this.createRoleUsing === 'type'">
+          <a-select
+            v-decorator="['type', {
+              rules: [{ required: true, message: $t('message.error.select') }]
+            }]"
+            :placeholder="createRoleApiParams.type.description">
+            <a-select-option v-for="role in defaultRoles" :key="role">
+              {{ role }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.role')" v-if="this.createRoleUsing === 'role'">
+          <a-select
+            v-decorator="['roleid', {
+              rules: [{ required: true, message: $t('message.error.select') }]
+            }]"
+            :placeholder="createRoleApiParams.roleid.description">
+            <a-select-option
+              v-for="role in roles"
+              :value="role.id"
+              :key="role.id">
+              {{ role.name }}
+            </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: 'CreateRole',
+  data () {
+    return {
+      roles: [],
+      defaultRoles: ['Admin', 'DomainAdmin', 'User'],
+      createRoleUsing: 'type',
+      loading: false
+    }
+  },
+  mounted () {
+    this.fetchRoles()
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createRole || {}
+    this.createRoleApiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.createRoleApiParams[param.name] = param
+    })
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.fullPath !== from.fullPath && !to.fullPath.includes('action/')) {
+        this.fetchRoles()
+      }
+    },
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchRoles()
+      }
+    }
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          if (key === 'using') {
+            continue
+          }
+
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+
+          params[key] = input
+        }
+
+        this.createRole(params)
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    createRole (params) {
+      this.loading = true
+      api('createRole', params).then(json => {
+        const role = json.createroleresponse.role
+        if (role) {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: 'Create Role',
+            description: 'Sucessfully created role ' + params.name
+          })
+        }
+        this.closeAction()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchRoles () {
+      const params = {}
+      api('listRoles', params).then(json => {
+        if (json && json.listrolesresponse && json.listrolesresponse.role) {
+          this.roles = json.listrolesresponse.role
+        }
+      }).catch(error => {
+        console.error(error)
+      })
+    },
+    handleChangeCreateRole (value) {
+      this.createRoleUsing = value
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/iam/DomainActionForm.vue b/ui/src/views/iam/DomainActionForm.vue
new file mode 100644
index 0000000..900a590
--- /dev/null
+++ b/ui/src/views/iam/DomainActionForm.vue
@@ -0,0 +1,294 @@
+// 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>
+    <a-modal
+      :visible="showAction"
+      :closable="true"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      style="top: 20px;"
+      @ok="handleSubmit"
+      @cancel="parentCloseAction"
+      :confirmLoading="action.loading"
+      centered
+    >
+      <span slot="title">
+        {{ $t(action.label) }}
+      </span>
+      <a-spin :spinning="action.loading">
+        <a-form
+          :form="form"
+          @submit="handleSubmit"
+          layout="vertical" >
+          <a-form-item
+            v-for="(field, fieldIndex) in action.paramFields"
+            :key="fieldIndex"
+            :v-bind="field.name"
+            v-if="!(action.mapping && field.name in action.mapping && action.mapping[field.name].value)"
+          >
+            <span slot="label">
+              {{ $t('label.' + field.name) }}
+              <a-tooltip :title="field.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+
+            <span v-if="field.type==='boolean'">
+              <a-switch
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
+                }]"
+                :placeholder="field.description"
+              />
+            </span>
+            <span v-else-if="action.mapping && field.name in action.mapping && action.mapping[field.name].options">
+              <a-select
+                :loading="field.loading"
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: $t('message.error.select') }]
+                }]"
+                :placeholder="field.description"
+              >
+                <a-select-option v-for="(opt, optIndex) in action.mapping[field.name].options" :key="optIndex">
+                  {{ opt }}
+                </a-select-option>
+              </a-select>
+            </span>
+            <span
+              v-else-if="field.type==='uuid' || field.name==='account'">
+              <a-select
+                showSearch
+                optionFilterProp="children"
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: $t('message.error.select') }]
+                }]"
+                :loading="field.loading"
+                :placeholder="field.description"
+                :filterOption="(input, option) => {
+                  return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                }"
+              >
+                <a-select-option v-for="(opt, optIndex) in field.opts" :key="optIndex">
+                  {{ opt.name || opt.description || opt.traffictype || opt.publicip }}
+                </a-select-option>
+              </a-select>
+            </span>
+            <span v-else-if="field.type==='list'">
+              <a-select
+                :loading="field.loading"
+                mode="multiple"
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: $t('message.error.select') }]
+                }]"
+                :placeholder="field.description"
+              >
+                <a-select-option v-for="(opt, optIndex) in field.opts" :key="optIndex">
+                  {{ opt.name && opt.type ? opt.name + ' (' + opt.type + ')' : opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </span>
+            <span v-else-if="field.type==='long'">
+              <a-input-number
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: `${$t('message.validate.number')}` }]
+                }]"
+                :placeholder="field.description"
+              />
+            </span>
+            <span v-else>
+              <a-input
+                v-decorator="[field.name, {
+                  rules: [{ required: field.required, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="field.description" />
+            </span>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'DomainActionForm',
+  props: {
+    action: {
+      type: Object,
+      required: true
+    },
+    showAction: {
+      type: Boolean,
+      default: false
+    },
+    resource: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.action.dataView && this.action.icon === 'edit') {
+      this.fillEditFormFieldValues()
+    }
+  },
+  inject: ['parentCloseAction', 'parentFetchData', 'parentUpdActionData'],
+  methods: {
+    pollActionCompletion (jobId, action) {
+      this.$pollJob({
+        jobId,
+        successMethod: result => {
+          if (this.action.api === 'deleteDomain') {
+            this.$set(this.resource, 'isDel', true)
+            this.parentUpdActionData(this.resource)
+          }
+          this.parentFetchData()
+          if (action.response) {
+            const description = action.response(result.jobresult)
+            if (description) {
+              this.$notification.info({
+                message: this.$t(action.label),
+                description: (<span domPropsInnerHTML={description}></span>),
+                duration: 0
+              })
+            }
+          }
+        },
+        errorMethod: () => this.parentFetchData(),
+        loadingMessage: `${this.$t(action.label)} ${this.$t('label.in.progress')} ${this.$t('label.for')} ${this.resource.name}`,
+        catchMessage: this.$t('error.fetching.async.job.result'),
+        action
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.action.loading = true
+        const params = {}
+        if ('id' in this.resource && this.action.params.map(i => { return i.name }).includes('id')) {
+          params.id = this.resource.id
+        }
+        for (const key in values) {
+          const input = values[key]
+          for (const param of this.action.params) {
+            if (param.name === key) {
+              if (input === undefined) {
+                if (param.type === 'boolean') {
+                  params[key] = false
+                }
+                break
+              }
+              if (this.action.mapping && key in this.action.mapping && this.action.mapping[key].options) {
+                params[key] = this.action.mapping[key].options[input]
+              } else if (param.type === 'uuid') {
+                params[key] = param.opts[input].id
+              } else if (param.type === 'list') {
+                params[key] = input.map(e => { return param.opts[e].id }).reduce((str, name) => { return str + ',' + name })
+              } else if (param.name === 'account') {
+                params[key] = param.opts[input].name
+              } else {
+                params[key] = input
+              }
+              break
+            }
+          }
+        }
+
+        for (const key in this.action.defaultArgs) {
+          if (!params[key]) {
+            params[key] = this.action.defaultArgs[key]
+          }
+        }
+
+        if (this.action.mapping) {
+          for (const key in this.action.mapping) {
+            if (!this.action.mapping[key].value) {
+              continue
+            }
+            params[key] = this.action.mapping[key].value(this.resource, params)
+          }
+        }
+
+        let hasJobId = false
+        api(this.action.api, params).then(json => {
+          for (const obj in json) {
+            if (obj.includes('response')) {
+              for (const res in json[obj]) {
+                if (res === 'jobid') {
+                  this.$store.dispatch('AddAsyncJob', {
+                    title: this.$t(this.action.label),
+                    jobid: json[obj][res],
+                    description: this.resource.name,
+                    status: 'progress'
+                  })
+                  this.pollActionCompletion(json[obj][res], this.action)
+                  hasJobId = true
+                  break
+                }
+              }
+              break
+            }
+          }
+          if (!hasJobId) {
+            this.parentUpdActionData(json)
+            this.parentFetchData()
+          }
+          this.parentCloseAction()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }).finally(f => {
+          this.action.loading = false
+        })
+      })
+    },
+    fillEditFormFieldValues () {
+      const form = this.form
+      this.action.paramFields.map(field => {
+        let fieldName = null
+        if (field.type === 'uuid' ||
+          field.type === 'list' ||
+          field.name === 'account' ||
+          (this.action.mapping && field.name in this.action.mapping)) {
+          fieldName = field.name.replace('ids', 'name').replace('id', 'name')
+        } else {
+          fieldName = field.name
+        }
+        const fieldValue = this.resource[fieldName] ? this.resource[fieldName] : null
+        if (fieldValue) {
+          form.getFieldDecorator(field.name, { initialValue: fieldValue })
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/iam/DomainView.vue b/ui/src/views/iam/DomainView.vue
new file mode 100644
index 0000000..12ba40b
--- /dev/null
+++ b/ui/src/views/iam/DomainView.vue
@@ -0,0 +1,339 @@
+// 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>
+    <a-card class="breadcrumb-card">
+      <a-row>
+        <a-col :span="14" style="padding-left: 6px">
+          <breadcrumb :resource="resource">
+            <span slot="end">
+              <template slot="title">
+                {{ $t('label.refresh') }}
+              </template>
+              <a-button
+                style="margin-top: 4px"
+                :loading="loading"
+                shape="round"
+                size="small"
+                icon="reload"
+                @click="fetchData()">
+                {{ $t('label.refresh') }}
+              </a-button>
+            </span>
+          </breadcrumb>
+        </a-col>
+        <a-col :span="10">
+          <span style="float: right">
+            <action-button
+              :style="dataView ? { float: device === 'mobile' ? 'left' : 'right' } : { 'margin-right': '10px', display: 'inline-flex' }"
+              :loading="loading"
+              :actions="actions"
+              :selectedRowKeys="selectedRowKeys"
+              :dataView="dataView"
+              :resource="resource"
+              @exec-action="execAction"/>
+          </span>
+        </a-col>
+      </a-row>
+    </a-card>
+
+    <div class="row-element">
+      <resource-view
+        v-if="dataView"
+        :resource="resource"
+        :loading="loading"
+        :tabs="$route.meta.tabs" />
+      <tree-view
+        v-else
+        :treeData="treeData"
+        :treeSelected="treeSelected"
+        :loading="loading"
+        :tabs="$route.meta.tabs"
+        @change-resource="changeResource"
+        :actionData="actionData"/>
+    </div>
+
+    <div v-if="showAction">
+      <domain-action-form
+        :showAction="showAction"
+        :resource="resource"
+        :action="action"/>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import store from '@/store'
+import { mixinDevice } from '@/utils/mixin.js'
+
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+import ActionButton from '@/components/view/ActionButton'
+import TreeView from '@/components/view/TreeView'
+import DomainActionForm from '@/views/iam/DomainActionForm'
+import ResourceView from '@/components/view/ResourceView'
+
+export default {
+  name: 'DomainView',
+  components: {
+    Breadcrumb,
+    ActionButton,
+    TreeView,
+    DomainActionForm,
+    ResourceView
+  },
+  mixins: [mixinDevice],
+  data () {
+    return {
+      resource: {},
+      loading: false,
+      selectedRowKeys: [],
+      treeData: [],
+      actionData: [],
+      treeSelected: {},
+      showAction: false,
+      action: {},
+      dataView: false
+    }
+  },
+  computed: {
+    actions () {
+      let actions = []
+      if (this.$route && this.$route.meta) {
+        if (this.$route.meta.actions) {
+          actions = this.$route.meta.actions
+        }
+      }
+      return actions
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  beforeRouteUpdate (to, from, next) {
+    next()
+  },
+  beforeRouteLeave (to, from, next) {
+    next()
+  },
+  watch: {
+    '$route' (to, from) {
+      if (to.fullPath !== from.fullPath && !to.fullPath.includes('action/')) {
+        this.fetchData()
+      }
+    },
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchData()
+      }
+    }
+  },
+  provide () {
+    return {
+      parentCloseAction: this.closeAction,
+      parentUpdActionData: this.updateActionData,
+      parentFetchData: this.fetchData
+    }
+  },
+  methods: {
+    fetchData () {
+      this.treeData = []
+      this.treeSelected = {}
+      const params = { listall: true }
+      if (this.$route && this.$route.params && this.$route.params.id) {
+        this.resource = {}
+        this.dataView = true
+        params.id = this.$route.params.id
+      } else {
+        this.dataView = false
+        params.id = this.$store.getters.userInfo.domainid
+      }
+
+      this.loading = true
+
+      api('listDomains', params).then(json => {
+        const domains = json.listdomainsresponse.domain || []
+        this.treeData = this.generateTreeData(domains)
+        this.resource = domains[0] || {}
+        this.treeSelected = domains[0] || {}
+      }).catch(error => {
+        if ([401].includes(error.response.status)) {
+          return
+        }
+
+        this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: error.response.headers['x-description'],
+          duration: 0
+        })
+
+        if ([405].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/403' })
+        }
+
+        if ([430, 431, 432].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/404' })
+        }
+
+        if ([530, 531, 532, 533, 534, 535, 536, 537].includes(error.response.status)) {
+          this.$router.push({ path: '/exception/500' })
+        }
+      }).finally(f => {
+        this.loading = false
+      })
+    },
+    execAction (action) {
+      this.actionData = []
+      this.action = action
+      this.action.params = store.getters.apis[this.action.api].params
+      const paramFields = this.action.params
+      paramFields.sort(function (a, b) {
+        if (a.name === 'name' && b.name !== 'name') { return -1 }
+        if (a.name !== 'name' && b.name === 'name') { return -1 }
+        if (a.name === 'id') { return -1 }
+        if (a.name < b.name) { return -1 }
+        if (a.name > b.name) { return 1 }
+        return 0
+      })
+      this.action.paramFields = []
+      if (action.args) {
+        var args = action.args
+        if (typeof action.args === 'function') {
+          args = action.args(action.resource, this.$store.getters)
+        }
+        if (args.length > 0) {
+          this.action.paramFields = args.map(function (arg) {
+            return paramFields.filter(function (param) {
+              return param.name.toLowerCase() === arg.toLowerCase()
+            })[0]
+          })
+        }
+      }
+      this.showAction = true
+      for (const param of this.action.paramFields) {
+        if (param.type === 'list' && ['tags', 'hosttags'].includes(param.name)) {
+          param.type = 'string'
+        }
+        if (param.type === 'uuid' || param.type === 'list' || param.name === 'account' || (this.action.mapping && param.name in this.action.mapping)) {
+          this.listUuidOpts(param)
+        }
+      }
+      this.action.loading = false
+    },
+    listUuidOpts (param) {
+      if (this.action.mapping && param.name in this.action.mapping && !this.action.mapping[param.name].api) {
+        return
+      }
+      const paramName = param.name
+      const possibleName = 'list' + paramName.replace('ids', '').replace('id', '').toLowerCase() + 's'
+      let params = { listall: true }
+      let possibleApi
+      if (this.action.mapping && param.name in this.action.mapping && this.action.mapping[param.name].api) {
+        possibleApi = this.action.mapping[param.name].api
+        if (this.action.mapping[param.name].params) {
+          const customParams = this.action.mapping[param.name].params(this.resource)
+          if (customParams) {
+            params = { ...params, ...customParams }
+          }
+        }
+      } else if (paramName === 'id') {
+        possibleApi = this.apiName
+      } else {
+        for (const api in store.getters.apis) {
+          if (api.toLowerCase().startsWith(possibleName)) {
+            possibleApi = api
+            break
+          }
+        }
+      }
+      if (!possibleApi) {
+        return
+      }
+      param.loading = true
+      param.opts = []
+      api(possibleApi, params).then(json => {
+        param.loading = false
+        for (const obj in json) {
+          if (obj.includes('response')) {
+            for (const res in json[obj]) {
+              if (res === 'count') {
+                continue
+              }
+              param.opts = json[obj][res]
+              this.$forceUpdate()
+              break
+            }
+            break
+          }
+        }
+      }).catch(() => {
+        param.loading = false
+      })
+    },
+    generateTreeData (treeData) {
+      const result = []
+      const rootItem = treeData
+
+      rootItem[0].title = rootItem[0].title ? rootItem[0].title : rootItem[0].name
+      rootItem[0].key = rootItem[0].id ? rootItem[0].id : 0
+
+      if (!rootItem[0].haschild) {
+        rootItem[0].isLeaf = true
+      }
+
+      result.push(rootItem[0])
+      return result
+    },
+    changeResource (resource) {
+      this.treeSelected = resource
+      this.resource = this.treeSelected
+    },
+    closeAction () {
+      this.showAction = false
+    },
+    updateActionData (data) {
+      this.actionData.push(data)
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .breadcrumb-card {
+    margin-left: -24px;
+    margin-right: -24px;
+    margin-top: -16px;
+    margin-bottom: 12px;
+  }
+
+  .row-element {
+    margin-top: 10px;
+    margin-bottom: 10px;
+  }
+
+  .ant-breadcrumb {
+    vertical-align: text-bottom;
+  }
+
+  .ant-breadcrumb .anticon {
+    margin-left: 8px;
+  }
+</style>
diff --git a/ui/src/views/iam/EditUser.vue b/ui/src/views/iam/EditUser.vue
new file mode 100644
index 0000000..e1ae0b5
--- /dev/null
+++ b/ui/src/views/iam/EditUser.vue
@@ -0,0 +1,236 @@
+// 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" :loading="loading" @submit="handleSubmit" layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.username') }}
+            <a-tooltip :title="apiParams.username.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['username', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.username.description" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.email') }}
+            <a-tooltip :title="apiParams.email.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['email', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.email.description" />
+        </a-form-item>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.firstname') }}
+                <a-tooltip :title="apiParams.firstname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['firstname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.firstname.description" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.lastname') }}
+                <a-tooltip :title="apiParams.lastname.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-input
+                v-decorator="['lastname', {
+                  rules: [{ required: true, message: $t('message.error.required.input') }]
+                }]"
+                :placeholder="apiParams.lastname.description" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.timezone') }}
+            <a-tooltip :title="apiParams.timezone.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            showSearch
+            v-decorator="['timezone']"
+            :loading="timeZoneLoading">
+            <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import debounce from 'lodash/debounce'
+
+export default {
+  name: 'EditUser',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    currentAction: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    this.fetchTimeZone = debounce(this.fetchTimeZone, 800)
+    return {
+      loading: false,
+      timeZoneLoading: false,
+      timeZoneMap: [],
+      userId: null
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.updateUser || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.userId = this.$route.params.id || null
+      this.fetchTimeZone()
+      this.fillEditFormFieldValues()
+    },
+    fetchTimeZone (value) {
+      this.timeZoneMap = []
+      this.timeZoneLoading = true
+
+      timeZone(value).then(json => {
+        this.timeZoneMap = json
+        this.timeZoneLoading = false
+      })
+    },
+    fillEditFormFieldValues () {
+      const form = this.form
+      this.loading = true
+      Object.keys(this.apiParams).forEach(item => {
+        const field = this.apiParams[item]
+        let fieldValue = null
+        let fieldName = null
+
+        if (field.type === 'list' || field.name === 'account') {
+          fieldName = field.name.replace('ids', 'name').replace('id', 'name')
+        } else {
+          fieldName = field.name
+        }
+        fieldValue = this.resource[fieldName] ? this.resource[fieldName] : null
+        if (fieldValue) {
+          form.getFieldDecorator(field.name, { initialValue: fieldValue })
+        }
+      })
+      this.loading = false
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          id: this.userId,
+          username: values.username,
+          email: values.email,
+          firstname: values.firstname,
+          lastname: values.lastname
+        }
+        if (this.isValidValueForKey(values, 'timezone') && values.timezone.length > 0) {
+          params.timezone = values.timezone
+        }
+
+        api('updateUser', params).then(response => {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: this.$t('label.edit.user'),
+            description: `${this.$t('message.success.update.user')} ${params.username}`
+          })
+          this.closeAction()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message,
+            duration: 0
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 80vw;
+  @media (min-width: 600px) {
+    width: 450px;
+  }
+}
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/iam/ImportRole.vue b/ui/src/views/iam/ImportRole.vue
new file mode 100644
index 0000000..151efda
--- /dev/null
+++ b/ui/src/views/iam/ImportRole.vue
@@ -0,0 +1,299 @@
+// 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 :label="$t('label.rules.file')">
+          <a-upload-dragger
+            :multiple="false"
+            :fileList="fileList"
+            :remove="handleRemove"
+            :beforeUpload="beforeUpload"
+            @change="handleChange"
+            v-decorator="['file', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: checkCsvRulesFile,
+                        message: $t('label.error.rules.file.import')
+                      }
+              ]
+            }]">
+            <p class="ant-upload-drag-icon">
+              <a-icon type="cloud-upload" />
+            </p>
+            <p class="ant-upload-text" v-if="fileList.length === 0">
+              {{ $t('label.rules.file.import.description') }}
+            </p>
+          </a-upload-dragger>
+        </a-form-item>
+        <a-form-item :label="$t('label.name')">
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="importRoleApiParams.name.description" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.description')">
+          <a-input
+            v-decorator="['description']"
+            :placeholder="importRoleApiParams.description.description" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.type')">
+          <a-select
+            v-decorator="['type', {
+              rules: [{ required: true, message: $t('message.error.select') }]
+            }]"
+            :placeholder="importRoleApiParams.type.description">
+            <a-select-option v-for="role in defaultRoles" :key="role">
+              {{ role }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.forced')">
+          <a-switch
+            v-decorator="['forced', {
+              initialValue: false
+            }]" />
+        </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: 'ImportRole',
+  data () {
+    return {
+      fileList: [],
+      defaultRoles: ['Admin', 'DomainAdmin', 'ResourceAdmin', 'User'],
+      rulesCsv: '',
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.importRole || {}
+    this.importRoleApiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.importRoleApiParams[param.name] = param
+    })
+  },
+  methods: {
+    handleRemove (file) {
+      const index = this.fileList.indexOf(file)
+      const newFileList = this.fileList.slice()
+      newFileList.splice(index, 1)
+      this.fileList = newFileList
+    },
+    handleChange (info) {
+      if (info.file.status === 'error') {
+        this.$notification.error({
+          message: this.$t('label.error.file.upload'),
+          description: this.$t('label.error.file.upload')
+        })
+      }
+    },
+    beforeUpload (file) {
+      if (file.type !== 'text/csv') {
+        return false
+      }
+
+      this.fileList = [file]
+      return false
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          if (key === 'file') {
+            continue
+          }
+
+          params[key] = input
+        }
+
+        if (this.fileList.length !== 1) {
+          return
+        }
+
+        var rules = this.rulesCsvToJson(this.rulesCsv)
+        rules.forEach(function (values, index) {
+          for (const key in values) {
+            params['rules[' + index + '].' + key] = values[key]
+          }
+        })
+
+        this.importRole(params)
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    importRole (params) {
+      this.loading = true
+      api('importRole', {}, 'POST', params).then(json => {
+        const role = json.importroleresponse.role
+        if (role) {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: 'Import Role',
+            description: 'Sucessfully imported role ' + params.name
+          })
+        }
+        this.closeAction()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    rulesCsvToJson (rulesCsv) {
+      const columnDelimiter = ','
+      const lineDelimiter = '\n'
+      var lines = rulesCsv.split(lineDelimiter)
+      var result = []
+      if (lines.length === 0) {
+        return result
+      }
+      var headers = lines[0].split(columnDelimiter)
+      lines = lines.slice(1) // Remove header
+
+      lines.map((line, indexLine) => {
+        if (line.trim() === '') return // Empty line
+        var obj = {}
+        var currentline = line.trim().split(columnDelimiter)
+
+        headers.map((header, indexHeader) => {
+          if (indexHeader === 2 && currentline.length > 3) {
+            if (currentline[indexHeader].startsWith('"')) {
+              obj[header.trim()] = currentline[indexHeader].substr(1)
+            } else {
+              obj[header.trim()] = currentline[indexHeader]
+            }
+
+            for (let i = 3; i < currentline.length - 1; i++) {
+              obj[header.trim()] += columnDelimiter + currentline[i]
+            }
+
+            var lastColumn = currentline[currentline.length - 1]
+            if (lastColumn.endsWith('"')) {
+              obj[header.trim()] += columnDelimiter + lastColumn.substr(0, lastColumn.length - 1)
+            } else {
+              obj[header.trim()] += columnDelimiter + lastColumn
+            }
+          } else {
+            obj[header.trim()] = currentline[indexHeader]
+          }
+        })
+        result.push(obj)
+      })
+      return result
+    },
+    checkCsvRulesFile (rule, value, callback) {
+      if (!value || value === '' || value.file === '') {
+        callback()
+      } else {
+        if (value.file.type !== 'text/csv') {
+          callback(rule.message)
+        }
+
+        this.readCsvFile(value.file).then((validFile) => {
+          if (!validFile) {
+            callback(rule.message)
+          } else {
+            callback()
+          }
+        }).catch((reason) => {
+          console.log(reason)
+          callback(rule.message)
+        })
+      }
+    },
+    readCsvFile (file) {
+      return new Promise((resolve, reject) => {
+        if (window.FileReader) {
+          var reader = new FileReader()
+          reader.onload = (event) => {
+            this.rulesCsv = event.target.result
+            var lines = this.rulesCsv.split('\n')
+            var headers = lines[0].split(',')
+            if (headers.length !== 3) {
+              resolve(false)
+            } else if (!(headers[0].trim() === 'rule' && headers[1].trim() === 'permission' && headers[2].trim() === 'description')) {
+              resolve(false)
+            } else {
+              resolve(true)
+            }
+          }
+
+          reader.onerror = (event) => {
+            if (event.target.error.name === 'NotReadableError') {
+              reject(event.target.error)
+            }
+          }
+
+          reader.readAsText(file)
+        } else {
+          reject(this.$t('label.error.file.read'))
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/iam/PermissionEditable.vue b/ui/src/views/iam/PermissionEditable.vue
new file mode 100644
index 0000000..df70749
--- /dev/null
+++ b/ui/src/views/iam/PermissionEditable.vue
@@ -0,0 +1,42 @@
+// 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>
+  <a-select
+    :value="defaultValue"
+    @change="handleChange">
+    <a-select-option value="allow">{{ $t('label.allow') }}</a-select-option>
+    <a-select-option value="deny">{{ $t('label.deny') }}</a-select-option>
+  </a-select>
+</template>
+
+<script>
+export default {
+  props: {
+    defaultValue: {
+      type: String,
+      required: true
+    }
+  },
+  methods: {
+    handleChange (e) {
+      this.$emit('change', e)
+    }
+  }
+
+}
+</script>
diff --git a/ui/src/views/iam/RolePermissionTab.vue b/ui/src/views/iam/RolePermissionTab.vue
new file mode 100644
index 0000000..3e63daf
--- /dev/null
+++ b/ui/src/views/iam/RolePermissionTab.vue
@@ -0,0 +1,472 @@
+// 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>
+  <a-icon v-if="loadingTable" type="loading" class="main-loading-spinner"></a-icon>
+  <div v-else>
+    <div style="width: 100%; display: flex; margin-bottom: 10px">
+      <a-button type="dashed" @click="exportRolePermissions" style="width: 100%" icon="download">
+        Export Rules
+      </a-button>
+    </div>
+    <div v-if="updateTable" class="loading-overlay">
+      <a-icon type="loading" />
+    </div>
+    <div
+      class="rules-list ant-list ant-list-bordered"
+      :class="{'rules-list--overflow-hidden' : updateTable}" >
+
+      <div class="rules-table-item ant-list-item">
+        <div class="rules-table__col rules-table__col--grab"></div>
+        <div class="rules-table__col rules-table__col--rule rules-table__col--new">
+          <a-auto-complete
+            :autoFocus="true"
+            :filterOption="filterOption"
+            :dataSource="apis"
+            :value="newRule"
+            @change="val => newRule = val"
+            :placeholder="$t('label.rule')"
+            :class="{'rule-dropdown-error' : newRuleSelectError}" />
+        </div>
+        <div class="rules-table__col rules-table__col--permission">
+          <permission-editable
+            :defaultValue="newRulePermission"
+            @change="onPermissionChange(null, $event)" />
+        </div>
+        <div class="rules-table__col rules-table__col--description">
+          <a-input v-model="newRuleDescription" :placeholder="$t('label.description')"></a-input>
+        </div>
+        <div class="rules-table__col rules-table__col--actions">
+          <a-tooltip
+            placement="bottom">
+            <template slot="title">
+              {{ $t('label.save.new.rule') }}
+            </template>
+            <a-button
+              :disabled="!('createRolePermission' in $store.getters.apis)"
+              icon="plus"
+              type="primary"
+              shape="circle"
+              @click="onRuleSave"
+            >
+            </a-button>
+          </a-tooltip>
+        </div>
+      </div>
+
+      <draggable
+        v-model="rules"
+        @change="changeOrder"
+        :disabled="!('updateRolePermission' in this.$store.getters.apis)"
+        handle=".drag-handle"
+        animation="200"
+        ghostClass="drag-ghost">
+        <transition-group type="transition">
+          <div
+            v-for="(record, index) in rules"
+            :key="`item-${index}`"
+            class="rules-table-item ant-list-item">
+            <div class="rules-table__col rules-table__col--grab drag-handle">
+              <a-icon type="drag"></a-icon>
+            </div>
+            <div class="rules-table__col rules-table__col--rule">
+              {{ record.rule }}
+            </div>
+            <div class="rules-table__col rules-table__col--permission">
+              <permission-editable
+                :defaultValue="record.permission"
+                @change="onPermissionChange(record, $event)" />
+            </div>
+            <div class="rules-table__col rules-table__col--description">
+              <template v-if="record.description">
+                {{ record.description }}
+              </template>
+              <div v-else class="no-description">
+                {{ $t('message.no.description') }}
+              </div>
+            </div>
+            <div class="rules-table__col rules-table__col--actions">
+              <rule-delete
+                :disabled="!('deleteRolePermission' in $store.getters.apis)"
+                :record="record"
+                @delete="onRuleDelete(record.id)" />
+            </div>
+          </div>
+        </transition-group>
+      </draggable>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import draggable from 'vuedraggable'
+import PermissionEditable from './PermissionEditable'
+import RuleDelete from './RuleDelete'
+
+export default {
+  name: 'RolePermissionTab',
+  components: {
+    RuleDelete,
+    PermissionEditable,
+    draggable
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loadingTable: true,
+      updateTable: false,
+      rules: null,
+      newRule: '',
+      newRulePermission: 'allow',
+      newRuleDescription: '',
+      newRuleSelectError: false,
+      drag: false,
+      apis: []
+    }
+  },
+  mounted () {
+    this.apis = Object.keys(this.$store.getters.apis).sort((a, b) => a.localeCompare(b))
+    this.fetchData()
+  },
+  watch: {
+    resource: function () {
+      this.fetchData(() => {
+        this.resetNewFields()
+      })
+    }
+  },
+  methods: {
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
+      )
+    },
+    resetNewFields () {
+      this.newRule = ''
+      this.newRulePermission = 'allow'
+      this.newRuleDescription = ''
+      this.newRuleSelectError = false
+    },
+    fetchData (callback = null) {
+      if (!this.resource.id) return
+      api('listRolePermissions', { roleid: this.resource.id }).then(response => {
+        this.rules = response.listrolepermissionsresponse.rolepermission
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loadingTable = false
+        this.updateTable = false
+        if (callback) callback()
+      })
+    },
+    changeOrder () {
+      api('updateRolePermission', {}, 'POST', {
+        roleid: this.resource.id,
+        ruleorder: this.rules.map(rule => rule.id)
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    onRuleDelete (key) {
+      this.updateTable = true
+      api('deleteRolePermission', { id: key }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    onPermissionChange (record, value) {
+      this.newRulePermission = value
+
+      if (!record) return
+
+      this.updateTable = true
+      api('updateRolePermission', {
+        roleid: this.resource.id,
+        ruleid: record.id,
+        permission: value
+      }).then(() => {
+        this.fetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    onRuleSelect (value) {
+      this.newRule = value
+    },
+    onRuleSave () {
+      if (!this.newRule) {
+        this.newRuleSelectError = true
+        return
+      }
+
+      this.updateTable = true
+      api('createRolePermission', {
+        rule: this.newRule,
+        permission: this.newRulePermission,
+        description: this.newRuleDescription,
+        roleid: this.resource.id
+      }).then(() => {
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.resetNewFields()
+        this.fetchData()
+      })
+    },
+    rulesDataToCsv ({ data = null, columnDelimiter = ',', lineDelimiter = '\n' }) {
+      if (data === null || !data.length) {
+        return null
+      }
+
+      const keys = ['rule', 'permission', 'description']
+      let result = ''
+      result += keys.join(columnDelimiter)
+      result += lineDelimiter
+
+      data.forEach(item => {
+        keys.forEach(key => {
+          if (item[key] === undefined) {
+            item[key] = ''
+          }
+          result += typeof item[key] === 'string' && item[key].includes(columnDelimiter) ? `"${item[key]}"` : item[key]
+          result += columnDelimiter
+        })
+        result = result.slice(0, -1)
+        result += lineDelimiter
+      })
+
+      return result
+    },
+    exportRolePermissions () {
+      const rulesCsvData = this.rulesDataToCsv({ data: this.rules })
+      const hiddenElement = document.createElement('a')
+      hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(rulesCsvData)
+      hiddenElement.target = '_blank'
+      hiddenElement.download = this.resource.name + '_' + this.resource.type + '.csv'
+      hiddenElement.click()
+      hiddenElement.delete()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .main-loading-spinner {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 30px;
+  }
+  .role-add-btn {
+    margin-bottom: 15px;
+  }
+  .new-role-controls {
+    display: flex;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 5px;
+      }
+    }
+
+  }
+
+  .rules-list {
+    max-height: 600px;
+    overflow: auto;
+
+    &--overflow-hidden {
+      overflow: hidden;
+    }
+
+  }
+
+  .rules-table {
+
+    &-item {
+      position: relative;
+      display: flex;
+      align-items: stretch;
+      padding: 0;
+      flex-wrap: wrap;
+
+      @media (min-width: 760px) {
+        flex-wrap: nowrap;
+        padding-right: 25px;
+      }
+
+    }
+
+    &__col {
+      display: flex;
+      align-items: center;
+      padding: 15px;
+
+      @media (min-width: 760px) {
+        padding: 15px 0;
+
+        &:not(:first-child) {
+          padding-left: 20px;
+        }
+
+        &:not(:last-child) {
+          border-right: 1px solid #e8e8e8;
+          padding-right: 20px;
+        }
+      }
+
+      &--grab {
+        position: absolute;
+        top: 4px;
+        left: 0;
+        width: 100%;
+
+        @media (min-width: 760px) {
+          position: relative;
+          top: auto;
+          width: 35px;
+          padding-left: 25px;
+          justify-content: center;
+        }
+
+      }
+
+      &--rule,
+      &--description {
+        word-break: break-all;
+        flex: 1;
+        width: 100%;
+
+        @media (min-width: 760px) {
+          width: auto;
+        }
+
+      }
+
+      &--rule {
+        padding-left: 60px;
+        background-color: rgba(#e6f7ff, 0.7);
+
+        @media (min-width: 760px) {
+          padding-left: 0;
+          background: none;
+        }
+
+      }
+
+      &--permission {
+        justify-content: center;
+        width: 100%;
+
+        .ant-select {
+          width: 100%;
+        }
+
+        @media (min-width: 760px) {
+          width: auto;
+
+          .ant-select {
+            width: auto;
+          }
+
+        }
+
+      }
+
+      &--actions {
+        max-width: 60px;
+        width: 100%;
+        padding-right: 0;
+
+        @media (min-width: 760px) {
+          width: auto;
+          max-width: 70px;
+          padding-right: 15px;
+        }
+
+      }
+
+      &--new {
+        padding-left: 15px;
+        background-color: transparent;
+
+        div {
+          width: 100%;
+        }
+
+      }
+
+    }
+
+  }
+
+  .no-description {
+    opacity: 0.4;
+    font-size: 0.7rem;
+
+    @media (min-width: 760px) {
+      display: none;
+    }
+
+  }
+
+  .drag-handle {
+    cursor: pointer;
+  }
+
+  .drag-ghost {
+    opacity: 0.5;
+    background: #f0f2f5;
+  }
+
+  .loading-overlay {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 5;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 3rem;
+    color: #39A7DE;
+    background-color: rgba(#fff, 0.8);
+  }
+</style>
+
+<style lang="scss">
+  .rules-table__col--new {
+    .ant-select {
+      width: 100%;
+    }
+  }
+  .rule-dropdown-error {
+    .ant-input {
+      border-color: #ff0000
+    }
+  }
+</style>
diff --git a/ui/src/views/iam/RuleDelete.vue b/ui/src/views/iam/RuleDelete.vue
new file mode 100644
index 0000000..53c8310
--- /dev/null
+++ b/ui/src/views/iam/RuleDelete.vue
@@ -0,0 +1,64 @@
+// 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>
+  <a-tooltip placement="bottom">
+    <template slot="title">
+      {{ $t('label.delete.rule') }}
+    </template>
+    <a-popconfirm
+      :title="`${$t('label.delete.rule')}?`"
+      @confirm="handleDelete"
+      :disabled="disabled">
+      <a-button type="danger" shape="circle" :disabled="disabled">
+        <a-icon type="delete" />
+      </a-button>
+    </a-popconfirm>
+  </a-tooltip>
+</template>
+
+<script>
+export default {
+  name: 'RuleDelete',
+  props: {
+    record: {
+      type: Object,
+      required: true
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    handleDelete () {
+      this.$emit('delete')
+    }
+  }
+}
+</script>
+
+<style
+  scoped
+  lang="scss"
+>
+  .anticon-delete {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+</style>
diff --git a/ui/src/views/iam/SSLCertificateTab.vue b/ui/src/views/iam/SSLCertificateTab.vue
new file mode 100644
index 0000000..1524f74
--- /dev/null
+++ b/ui/src/views/iam/SSLCertificateTab.vue
@@ -0,0 +1,245 @@
+// 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>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-table
+          size="small"
+          :loading="loading"
+          :columns="columns"
+          :dataSource="dataSource"
+          :rowKey="record => record.id"
+          :pagination="false"
+          v-if="!quickview"
+        >
+          <span slot="action" slot-scope="text, record" class="cert-button-action">
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.quickview') }}
+              </template>
+              <a-button type="primary" shape="circle" icon="eye" size="small" @click="onQuickView(record.id)" />
+            </a-tooltip>
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.delete.sslcertificate') }}
+              </template>
+              <a-button
+                :disabled="!('deleteSslCert' in $store.getters.apis)"
+                type="danger"
+                shape="circle"
+                icon="delete"
+                size="small"
+                @click="onShowConfirm(record)"/>
+            </a-tooltip>
+          </span>
+        </a-table>
+
+        <a-list size="small" :dataSource="detailColumn" v-if="quickview">
+          <div class="close-quickview">
+            <a-button @click="() => { this.quickview = false }">{{ $t('label.close') }}</a-button>
+          </div>
+          <a-list-item slot="renderItem" slot-scope="item" v-if="item in detail">
+            <div>
+              <strong>{{ $t(item) }}</strong>
+              <br/>
+              <div class="list-item-content">
+                {{ detail[item] }}
+              </div>
+            </div>
+          </a-list-item>
+        </a-list>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'SSLCertificate',
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      selectedRowKeys: [],
+      detailColumn: [],
+      detail: [],
+      page: 1,
+      pageSize: 10,
+      quickview: false,
+      loading: false
+    }
+  },
+  props: {
+    resource: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    tab: {
+      type: String,
+      default () {
+        return ''
+      }
+    }
+  },
+  watch: {
+    tab (newValue, oldValue) {
+      if (newValue === 'certificate') {
+        this.quickview = false
+        this.fetchData()
+      }
+    },
+    resource (newValue, oldValue) {
+      if (Object.keys(newValue).length > 0 &&
+        newValue.id &&
+        this.tab === 'certificate'
+      ) {
+        this.quickview = false
+        this.fetchData()
+      }
+    }
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.name'),
+        dataIndex: 'name',
+        scopedSlots: { customRender: 'name' }
+      },
+      {
+        title: this.$t('label.certificateid'),
+        dataIndex: 'id',
+        width: 450,
+        scopedSlots: { customRender: 'id' }
+      },
+      {
+        title: this.$t('label.action'),
+        dataIndex: 'action',
+        fixed: 'right',
+        width: 80,
+        scopedSlots: { customRender: 'action' }
+      }
+    ]
+    this.detailColumn = ['name', 'certificate', 'certchain']
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      params.listAll = true
+      params.page = this.page
+      params.pageSize = this.pageSize
+      params.accountid = this.resource.id
+
+      this.loading = true
+
+      api('listSslCerts', params).then(json => {
+        const listSslResponse = json.listsslcertsresponse.sslcert
+
+        // check exists json response
+        if (!listSslResponse || Object.keys(listSslResponse).length === 0) {
+          this.dataSource = []
+          return
+        }
+
+        this.dataSource = listSslResponse
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    onQuickView (id) {
+      this.loading = true
+      const detail = this.dataSource.filter(item => item.id === id)
+      this.detail = detail[0]
+      this.quickview = true
+      this.loading = false
+    },
+    onDelete (row) {
+      const params = {}
+      params.id = row.id
+
+      // show loading
+      const message = `${this.$t('label.delete.certificate')} ${this.$t('label.in.progress.for')} ${row.name}`
+      const loading = this.$message.loading(message, 0)
+
+      api('deleteSslCert', params).then(json => {
+        const jsonResponse = json.deletesslcertresponse
+
+        // hide loading
+        setTimeout(loading)
+
+        if (jsonResponse.success) {
+          this.$message.success(this.$t('message.success.delete'), 3)
+          this.fetchData()
+        } else {
+          this.$message.error(this.$t('message.delete.failed'), 3)
+        }
+      }).catch(error => {
+        // hide loading
+        setTimeout(loading)
+
+        // show error
+        this.$notifyError(error)
+      })
+    },
+    onShowConfirm (row) {
+      const self = this
+      const title = `${this.$t('label.deleteconfirm')} ${this.$t('label.certificate')}`
+
+      this.$confirm({
+        title: title,
+        okText: this.$t('label.ok'),
+        okType: 'danger',
+        cancelText: this.$t('label.cancel'),
+        onOk () {
+          self.onDelete(row)
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+/deep/.ant-table-fixed-right {
+  z-index: 5;
+}
+
+.cert-button-action button {
+  margin-right: 5px;
+}
+
+.list-item-content {
+  word-break: break-word;
+}
+
+.close-quickview {
+  text-align: right;
+  margin-top: 12px;
+  line-height: 32px;
+  height: 32px;
+}
+</style>
diff --git a/ui/src/views/image/AddKubernetesSupportedVersion.vue b/ui/src/views/image/AddKubernetesSupportedVersion.vue
new file mode 100644
index 0000000..30fb480
--- /dev/null
+++ b/ui/src/views/image/AddKubernetesSupportedVersion.vue
@@ -0,0 +1,282 @@
+// 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.semanticversion') }}
+            <a-tooltip :title="apiParams.semanticversion.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['semanticversion', {
+              rules: [{ required: true, message: $t('message.error.kuberversion') }]
+            }]"
+            :placeholder="apiParams.semanticversion.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ message: $t('message.error.name') }]
+            }]"
+            :placeholder="$t('label.name')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback(this.$t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="apiParams.zoneid.description">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.url') }}
+            <a-tooltip :title="apiParams.url.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['url', {
+              rules: [{ required: true, message: $t('message.error.binaries.iso.url') }]
+            }]"
+            :placeholder="apiParams.url.description" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.checksum') }}
+            <a-tooltip :title="apiParams.checksum.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['checksum', {
+              rules: [{ required: false, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.checksum.description" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.mincpunumber') }}
+            <a-tooltip :title="apiParams.mincpunumber.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['mincpunumber', {
+              rules: [{ required: true, message: $t('message.please.enter.value') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.validate.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="apiParams.mincpunumber.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.minmemory') }}
+            <a-tooltip :title="apiParams.minmemory.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['minmemory', {
+              rules: [{ required: true, message: $t('message.please.enter.value') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.validate.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="apiParams.minmemory.description"/>
+        </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: 'AddKubernetesSupportedVersion',
+  props: {},
+  data () {
+    return {
+      zones: [],
+      zoneLoading: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.addKubernetesSupportedVersion || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: null,
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZoneData()
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+        if (this.arrayHasItems(this.zones)) {
+          this.form.setFieldsValue({
+            zoneid: 0
+          })
+        }
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {
+          semanticversion: values.semanticversion,
+          url: values.url
+        }
+        if (this.isValidValueForKey(values, 'name')) {
+          params.name = values.name
+        }
+        if (this.isValidValueForKey(values, 'checksum')) {
+          params.checksum = values.checksum
+        }
+        if (this.isValidValueForKey(values, 'zoneid')) {
+          params.zoneid = this.zones[values.zoneid].id
+        }
+        if (this.isValidValueForKey(values, 'mincpunumber') && values.mincpunumber > 0) {
+          params.mincpunumber = values.mincpunumber
+        }
+        if (this.isValidValueForKey(values, 'minmemory') && values.minmemory > 0) {
+          params.minmemory = values.minmemory
+        }
+        api('addKubernetesSupportedVersion', params).then(json => {
+          this.$message.success(`${this.$t('message.success.add.kuberversion')}: ${values.semanticversion}`)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/image/IsoZones.vue b/ui/src/views/image/IsoZones.vue
new file mode 100644
index 0000000..6808724
--- /dev/null
+++ b/ui/src/views/image/IsoZones.vue
@@ -0,0 +1,350 @@
+// 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>
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading || fetchLoading"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="false"
+      :rowKey="record => record.zoneid">
+      <div slot="isready" slot-scope="text, record">
+        <span v-if="record.isready">{{ $t('label.yes') }}</span>
+        <span v-else>{{ $t('label.no') }}</span>
+      </div>
+      <template slot="action" slot-scope="text, record">
+        <span style="margin-right: 5px">
+          <a-button
+            :disabled="!('copyIso' in $store.getters.apis && record.isready)"
+            icon="copy"
+            shape="circle"
+            :loading="copyLoading"
+            @click="showCopyIso(record)" />
+        </span>
+        <span style="margin-right: 5px">
+          <a-popconfirm
+            v-if="'deleteIso' in $store.getters.apis"
+            placement="topRight"
+            :title="$t('message.action.delete.iso')"
+            :ok-text="$t('label.yes')"
+            :cancel-text="$t('label.no')"
+            :loading="deleteLoading"
+            @confirm="deleteIso(record)"
+          >
+            <a-button
+              type="danger"
+              icon="delete"
+              shape="circle" />
+          </a-popconfirm>
+        </span>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="itemCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-if="'copyIso' in $store.getters.apis"
+      style="top: 20px;"
+      :title="$t('label.action.copy.iso')"
+      :visible="showCopyActionForm"
+      :closable="true"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @ok="handleCopyIsoSubmit"
+      @cancel="onCloseCopyForm"
+      :confirmLoading="copyLoading"
+      centered>
+      <a-spin :spinning="copyLoading">
+        <a-form
+          :form="form"
+          @submit="handleCopyIsoSubmit"
+          layout="vertical">
+          <a-form-item :label="$t('label.zoneid')">
+            <a-select
+              id="zone-selection"
+              mode="multiple"
+              :placeholder="$t('label.select.zones')"
+              v-decorator="['zoneid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading">
+              <a-select-option v-for="zone in zones" :key="zone.id">
+                {{ zone.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'IsoZones',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      page: 1,
+      pageSize: 10,
+      itemCount: 0,
+      fetchLoading: false,
+      showCopyActionForm: false,
+      currentRecord: {},
+      zones: [],
+      zoneLoading: false,
+      copyLoading: false,
+      deleteLoading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfigParams = (this.$store.getters.apis.copyIso && this.$store.getters.apis.copyIso.params) || []
+    this.apiParams = {}
+    this.apiConfigParams.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.zonename'),
+        dataIndex: 'zonename'
+      },
+      {
+        title: this.$t('label.status'),
+        dataIndex: 'status'
+      },
+      {
+        title: this.$t('label.isready'),
+        dataIndex: 'isready',
+        scopedSlots: { customRender: 'isready' }
+      }
+    ]
+    if (this.isActionPermitted()) {
+      this.columns.push({
+        title: '',
+        dataIndex: 'action',
+        fixed: 'right',
+        width: 100,
+        scopedSlots: { customRender: 'action' }
+      })
+    }
+
+    const userInfo = this.$store.getters.userInfo
+    if (!['Admin'].includes(userInfo.roletype) &&
+      (userInfo.account !== this.resource.account || userInfo.domain !== this.resource.domain)) {
+      this.columns = this.columns.filter(col => { return col.dataIndex !== 'status' })
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      params.id = this.resource.id
+      params.isofilter = 'executable'
+      params.listall = true
+      params.page = this.page
+      params.pagesize = this.pageSize
+
+      this.dataSource = []
+      this.itemCount = 0
+      this.fetchLoading = true
+      api('listIsos', params).then(json => {
+        this.dataSource = json.listisosresponse.iso || []
+        this.itemCount = json.listisosresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    isActionPermitted () {
+      return (['Admin'].includes(this.$store.getters.userInfo.roletype) || // If admin or owner or belongs to current project
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.account === this.$store.getters.userInfo.account) ||
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.projectid && this.$store.getters.project && this.$store.getters.project.id && this.resource.projectid === this.$store.getters.project.id)) &&
+        (this.resource.isready || !this.resource.status || this.resource.status.indexOf('Downloaded') === -1) && // Iso is ready or downloaded
+        this.resource.account !== 'system'
+    },
+    deleteIso (record) {
+      const params = {
+        id: record.id,
+        zoneid: record.zoneid
+      }
+      this.deleteLoading = true
+      api('deleteIso', params).then(json => {
+        const jobId = json.deleteisoresponse.jobid
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('label.action.delete.iso'),
+          jobid: jobId,
+          description: this.resource.name,
+          status: 'progress'
+        })
+        const singleZone = (this.dataSource.length === 1)
+        this.$pollJob({
+          jobId,
+          successMethod: result => {
+            if (singleZone) {
+              this.$router.go(-1)
+            } else {
+              this.fetchData()
+            }
+          },
+          errorMethod: () => this.fetchData(),
+          loadingMessage: `${this.$t('label.deleting.iso')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.deleteLoading = false
+        this.fetchData()
+      })
+    },
+    fetchZoneData () {
+      this.zones = []
+      this.zoneLoading = true
+      api('listZones', { listall: true }).then(json => {
+        const zones = json.listzonesresponse.zone || []
+        this.zones = [...zones.filter((zone) => this.currentRecord.zoneid !== zone.id)]
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    showCopyIso (record) {
+      this.currentRecord = record
+      this.form.setFieldsValue({
+        zoneid: []
+      })
+      this.fetchZoneData()
+      this.showCopyActionForm = true
+    },
+    onCloseCopyForm () {
+      this.currentRecord = {}
+      this.showCopyActionForm = false
+    },
+    handleCopyIsoSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {
+          id: this.currentRecord.id,
+          sourcezoneid: this.currentRecord.zoneid,
+          destzoneids: values.zoneid.join()
+        }
+        this.copyLoading = true
+        api('copyIso', params).then(json => {
+          const jobId = json.copytemplateresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.action.copy.iso'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            successMethod: result => {
+              this.fetchData()
+            },
+            errorMethod: () => this.fetchData(),
+            loadingMessage: `${this.$t('label.action.copy.iso')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }).finally(() => {
+          this.copyLoading = false
+          this.$emit('refresh-data')
+          this.onCloseCopyForm()
+          this.fetchData()
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.row-element {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+</style>
diff --git a/ui/src/views/image/RegisterOrUploadIso.vue b/ui/src/views/image/RegisterOrUploadIso.vue
new file mode 100644
index 0000000..a5b2a6a
--- /dev/null
+++ b/ui/src/views/image/RegisterOrUploadIso.vue
@@ -0,0 +1,392 @@
+// 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">
+    <span v-if="uploadPercentage > 0">
+      <a-icon type="loading" />
+      {{ $t('message.upload.file.processing') }}
+      <a-progress :percent="uploadPercentage" />
+    </span>
+    <a-spin :spinning="loading" v-else>
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item v-if="currentForm === 'Create'" :label="$t('label.url')">
+          <a-input
+            autoFocus
+            v-decorator="['url', {
+              rules: [{ required: true, message: `${this.$t('label.upload.iso.from.local')}` }]
+            }]"
+            :placeholder="apiParams.url.description" />
+        </a-form-item>
+        <a-form-item v-if="currentForm === 'Upload'" :label="$t('label.templatefileupload')">
+          <a-upload-dragger
+            :multiple="false"
+            :fileList="fileList"
+            :remove="handleRemove"
+            :beforeUpload="beforeUpload"
+            v-decorator="['file', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]">
+            <p class="ant-upload-drag-icon">
+              <a-icon type="cloud-upload" />
+            </p>
+            <p class="ant-upload-text" v-if="fileList.length === 0">
+              {{ $t('label.volume.volumefileupload.description') }}
+            </p>
+          </a-upload-dragger>
+        </a-form-item>
+        <a-form-item :label="$t('label.name')">
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]"
+            :placeholder="apiParams.name.description" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.displaytext')">
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]"
+            :placeholder="apiParams.displaytext.description" />
+        </a-form-item>
+
+        <a-form-item v-if="allowed && currentForm !== 'Upload'" :label="$t('label.directdownload')">
+          <a-switch v-decorator="['directdownload']"/>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.zoneid')">
+          <a-select
+            v-decorator="['zoneid', {
+              initialValue: this.selectedZone,
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="apiParams.zoneid.description">
+            <a-select-option :value="opt.id" v-for="opt in zones" :key="opt.id">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.bootable')">
+          <a-switch
+            v-decorator="['bootable', {
+              initialValue: true,
+            }]"
+            :checked="bootable"
+            @change="val => bootable = val"/>
+        </a-form-item>
+
+        <a-form-item v-if="bootable" :label="$t('label.ostypeid')">
+          <a-select
+            v-decorator="['ostypeid', {
+              initialValue: defaultOsType,
+              rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="osTypeLoading"
+            :placeholder="apiParams.ostypeid.description">
+            <a-select-option :value="opt.id" v-for="(opt, optIndex) in osTypes" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.isextractable')">
+          <a-switch
+            v-decorator="['isextractable', {
+              initialValue: false
+            }]" />
+        </a-form-item>
+
+        <a-form-item
+          :label="$t('label.ispublic')"
+          v-if="$store.getters.userInfo.roletype === 'Admin' || $store.getters.features.userpublictemplateenabled" >
+          <a-switch
+            v-decorator="['ispublic', {
+              initialValue: false
+            }]" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.isfeatured')">
+          <a-switch
+            v-decorator="['isfeatured', {
+              initialValue: false
+            }]" />
+        </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'
+import store from '@/store'
+import { axios } from '../../utils/request'
+
+export default {
+  name: 'RegisterIso',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    action: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      fileList: [],
+      zones: [],
+      osTypes: [],
+      zoneLoading: false,
+      osTypeLoading: false,
+      defaultOsType: '',
+      loading: false,
+      allowed: false,
+      bootable: true,
+      selectedZone: '',
+      uploadParams: null,
+      uploadPercentage: 0,
+      currentForm: this.action.currentAction.icon === 'plus' ? 'Create' : 'Upload'
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.registerIso || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = []
+    if (this.$store.getters.userInfo.roletype === 'Admin' && this.currentForm === 'Create') {
+      this.zones = [
+        {
+          id: '-1',
+          name: this.$t('label.all.zone')
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZoneData()
+      this.fetchOsType()
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+
+      this.zoneLoading = true
+      if (store.getters.userInfo.roletype === this.rootAdmin) {
+        this.allowed = true
+      }
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+        this.selectedZone = (this.zones[0].id ? this.zones[0].id : '')
+      })
+    },
+    fetchOsType () {
+      const params = {}
+      params.listAll = true
+
+      this.osTypeLoading = true
+
+      api('listOsTypes', params).then(json => {
+        const listOsTypes = json.listostypesresponse.ostype
+        this.osTypes = this.osTypes.concat(listOsTypes)
+      }).finally(() => {
+        this.osTypeLoading = false
+        this.defaultOsType = this.osTypes[0].id
+      })
+    },
+    handleRemove (file) {
+      const index = this.fileList.indexOf(file)
+      const newFileList = this.fileList.slice()
+      newFileList.splice(index, 1)
+      this.fileList = newFileList
+    },
+    beforeUpload (file) {
+      this.fileList = [file]
+      return false
+    },
+    handleUpload () {
+      const { fileList } = this
+      if (this.fileList.length > 1) {
+        this.$notification.error({
+          message: this.$t('message.upload.iso.failed'),
+          description: this.$t('message.error.upload.iso.description'),
+          duration: 0
+        })
+      }
+      const formData = new FormData()
+      fileList.forEach(file => {
+        formData.append('files[]', file)
+      })
+      this.uploadPercentage = 0
+      axios.post(this.uploadParams.postURL,
+        formData,
+        {
+          headers: {
+            'Content-Type': 'multipart/form-data',
+            'X-signature': this.uploadParams.signature,
+            'X-expires': this.uploadParams.expires,
+            'X-metadata': this.uploadParams.metadata
+          },
+          onUploadProgress: (progressEvent) => {
+            this.uploadPercentage = Number(parseFloat(100 * progressEvent.loaded / progressEvent.total).toFixed(1))
+          },
+          timeout: 86400000
+        }).then((json) => {
+        this.$notification.success({
+          message: this.$t('message.success.upload'),
+          description: this.$t('message.success.upload.description')
+        })
+        this.closeAction()
+        this.$emit('refresh-data')
+      }).catch(e => {
+        this.$notification.error({
+          message: this.$t('message.upload.failed'),
+          description: `${this.$t('message.upload.iso.failed.description')} -  ${e}`,
+          duration: 0
+        })
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          if (key === 'file') {
+            continue
+          }
+          switch (key) {
+            case 'zoneid':
+              var zone = this.zones.filter(zone => zone.id === input)
+              params[key] = zone[0].id
+              break
+            case 'ostypeid':
+              params[key] = input
+              break
+            default:
+              params[key] = input
+              break
+          }
+        }
+
+        if (this.currentForm === 'Create') {
+          this.loading = true
+          api('registerIso', params).then(json => {
+            this.$notification.success({
+              message: this.$t('label.action.register.iso'),
+              description: `${this.$t('message.success.register.iso')} ${params.name}`
+            })
+            this.closeAction()
+            this.$emit('refresh-data')
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.loading = false
+          })
+        } else {
+          if (this.fileList.length !== 1) {
+            return
+          }
+          params.format = 'ISO'
+          this.loading = true
+          api('getUploadParamsForIso', params).then(json => {
+            this.uploadParams = (json.postuploadisoresponse && json.postuploadisoresponse.getuploadparams) ? json.postuploadisoresponse.getuploadparams : ''
+            const response = this.handleUpload()
+            if (response === 'upload successful') {
+              this.$notification.success({
+                message: this.$t('message.success.upload'),
+                description: this.$t('message.success.upload.iso.description')
+              })
+            }
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.loading = false
+            this.$emit('refresh-data')
+          })
+        }
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/image/RegisterOrUploadTemplate.vue b/ui/src/views/image/RegisterOrUploadTemplate.vue
new file mode 100644
index 0000000..c55410f
--- /dev/null
+++ b/ui/src/views/image/RegisterOrUploadTemplate.vue
@@ -0,0 +1,913 @@
+// 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">
+    <span v-if="uploadPercentage > 0">
+      <a-icon type="loading" />
+      {{ $t('message.upload.file.processing') }}
+      <a-progress :percent="uploadPercentage" />
+    </span>
+    <a-spin :spinning="loading" v-else>
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <div v-if="currentForm === 'Create'">
+          <a-row :gutter="12">
+            <a-form-item :label="$t('label.url')">
+              <a-input
+                autoFocus
+                v-decorator="['url', {
+                  rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+                }]"
+                :placeholder="apiParams.url.description" />
+            </a-form-item>
+          </a-row>
+        </div>
+        <div v-if="currentForm === 'Upload'">
+          <a-form-item :label="$t('label.templatefileupload')">
+            <a-upload-dragger
+              :multiple="false"
+              :fileList="fileList"
+              :remove="handleRemove"
+              :beforeUpload="beforeUpload"
+              v-decorator="['file', {
+                rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+              }]">
+              <p class="ant-upload-drag-icon">
+                <a-icon type="cloud-upload" />
+              </p>
+              <p class="ant-upload-text" v-if="fileList.length === 0">
+                {{ $t('label.volume.volumefileupload.description') }}
+              </p>
+            </a-upload-dragger>
+          </a-form-item>
+        </div>
+        <a-row :gutter="12">
+          <a-form-item :label="$t('label.name')">
+            <a-input
+              v-decorator="['name', {
+                rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+              }]"
+              :placeholder="apiParams.name.description" />
+          </a-form-item>
+        </a-row>
+        <a-row :gutter="12">
+          <a-form-item :label="$t('label.displaytext')">
+            <a-input
+              v-decorator="['displaytext', {
+                rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+              }]"
+              :placeholder="apiParams.displaytext.description" />
+          </a-form-item>
+        </a-row>
+        <div v-if="currentForm === 'Create'">
+          <a-row :gutter="12">
+            <a-col :md="24" :lg="24">
+              <a-form-item
+                :label="$t('label.zone')"
+                :validate-status="zoneError"
+                :help="zoneErrorMessage">
+                <a-select
+                  v-decorator="['zoneids', {
+                    rules: [
+                      {
+                        required: true,
+                        message: `${this.$t('message.error.select')}`,
+                        type: 'array'
+                      }
+                    ]
+                  }]"
+                  :loading="zones.loading"
+                  mode="multiple"
+                  optionFilterProp="children"
+                  :filterOption="(input, option) => {
+                    return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                  }"
+                  :placeholder="apiParams.zoneids.description"
+                  @change="handlerSelectZone">
+                  <a-select-option v-for="opt in zones.opts" :key="opt.id">
+                    {{ opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </div>
+        <div v-else>
+          <a-row :gutter="12">
+            <a-col :md="24" :lg="24">
+              <a-form-item
+                :label="$t('label.zoneid')"
+                :validate-status="zoneError"
+                :help="zoneErrorMessage">
+                <a-select
+                  v-decorator="['zoneid', {
+                    initialValue: this.zoneSelected,
+                    rules: [
+                      {
+                        required: true,
+                        message: `${this.$t('message.error.select')}`
+                      }
+                    ]
+                  }]"
+                  showSearch
+                  optionFilterProp="children"
+                  :filterOption="(input, option) => {
+                    return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                  }"
+                  @change="handlerSelectZone"
+                  :placeholder="apiParams.zoneid.description"
+                  :loading="zones.loading">
+                  <a-select-option :value="zone.id" v-for="zone in zones.opts" :key="zone.id">
+                    {{ zone.name || zone.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </div>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="12">
+            <a-form-item :label="$t('label.hypervisor')">
+              <a-select
+                v-decorator="['hypervisor', {
+                  rules: [
+                    {
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }
+                  ]
+                }]"
+                :loading="hyperVisor.loading"
+                :placeholder="apiParams.hypervisor.description"
+                @change="handlerSelectHyperVisor">
+                <a-select-option v-for="(opt, optIndex) in hyperVisor.opts" :key="optIndex">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12">
+            <a-form-item :label="$t('label.format')">
+              <a-select
+                v-decorator="['format', {
+                  rules: [
+                    {
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }
+                  ]
+                }]"
+                :placeholder="apiParams.format.description">
+                <a-select-option v-for="opt in format.opts" :key="opt.id">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="12" v-if="allowed && hyperKVMShow && currentForm !== 'Upload'">
+          <a-col :md="24" :lg="12">
+            <a-form-item :label="$t('label.directdownload')">
+              <a-switch v-decorator="['directdownload']" @change="handleChangeDirect" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="12" v-if="allowDirectDownload">
+            <a-form-item :label="$t('label.checksum')">
+              <a-input
+                v-decorator="['checksum', {
+                  rules: [{ required: false, message: `${this.$t('message.error.required.input')}` }]
+                }]"
+                :placeholder="apiParams.checksum.description" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="12" v-if="allowed && hyperXenServerShow">
+          <a-form-item v-if="hyperXenServerShow" :label="$t('label.xenservertoolsversion61plus')">
+            <a-switch
+              v-decorator="['xenserverToolsVersion61plus',{
+                initialValue: xenServerProvider
+              }]"
+              :default-checked="xenServerProvider" />
+          </a-form-item>
+        </a-row>
+        <a-row :gutter="12" v-if="hyperKVMShow || hyperVMWShow">
+          <a-col :md="24" :lg="24" v-if="hyperKVMShow">
+            <a-form-item :label="$t('label.rootdiskcontrollertype')">
+              <a-select
+                v-decorator="['rootDiskControllerType', {
+                  initialValue: rootDisk.opts.length > 0 ? 'osdefault' : '',
+                  rules: [
+                    {
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }
+                  ]
+                }]"
+                :loading="rootDisk.loading"
+                :placeholder="$t('label.rootdiskcontrollertype')">
+                <a-select-option v-for="opt in rootDisk.opts" :key="opt.id">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="24">
+            <a-form-item v-if="hyperVMWShow" :label="$t('label.keyboardtype')">
+              <a-select
+                v-decorator="['keyboardType', {
+                  rules: [
+                    {
+                      required: false,
+                      message: `${this.$t('message.error.select')}`
+                    }
+                  ]
+                }]"
+                :placeholder="$t('label.keyboard')">
+                <a-select-option v-for="opt in keyboardType.opts" :key="opt.id">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="12" v-if="!hyperVMWShow">
+          <a-col :md="24" :lg="24">
+            <a-form-item :label="$t('label.ostypeid')">
+              <a-select
+                showSearch
+                optionFilterProp="children"
+                :filterOption="(input, option) => {
+                  return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+                }"
+                v-decorator="['ostypeid', {
+                  initialValue: defaultOsId,
+                  rules: [
+                    {
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }
+                  ]
+                }]"
+                :loading="osTypes.loading"
+                :placeholder="apiParams.ostypeid.description">
+                <a-select-option v-for="opt in osTypes.opts" :key="opt.id">
+                  {{ opt.name || opt.description }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="24">
+            <a-form-item>
+              <a-checkbox-group
+                v-decorator="['groupenabled', { initialValue: ['requireshvm'] }]"
+                style="width: 100%;"
+              >
+                <a-row>
+                  <a-col :span="12">
+                    <a-checkbox value="isextractable">
+                      {{ $t('label.isextractable') }}
+                    </a-checkbox>
+                  </a-col>
+                  <a-col :span="12">
+                    <a-checkbox value="passwordenabled">
+                      {{ $t('label.passwordenabled') }}
+                    </a-checkbox>
+                  </a-col>
+                </a-row>
+                <a-row>
+                  <a-col :span="12">
+                    <a-checkbox value="isdynamicallyscalable">
+                      {{ $t('label.isdynamicallyscalable') }}
+                    </a-checkbox>
+                  </a-col>
+                  <a-col :span="12">
+                    <a-checkbox value="requireshvm">
+                      {{ $t('label.requireshvm') }}
+                    </a-checkbox>
+                  </a-col>
+                </a-row>
+                <a-row>
+                  <a-col :span="12">
+                    <a-checkbox value="isfeatured">
+                      {{ $t('label.isfeatured') }}
+                    </a-checkbox>
+                  </a-col>
+                  <a-col :span="12">
+                    <a-checkbox
+                      value="ispublic"
+                      v-if="$store.getters.userInfo.roletype === 'Admin' || $store.getters.features.userpublictemplateenabled" >
+                      {{ $t('label.ispublic') }}
+                    </a-checkbox>
+                  </a-col>
+                </a-row>
+                <a-row>
+                  <a-col :span="12" v-if="$store.getters.userInfo.roletype === 'Admin'">
+                    <a-checkbox value="isrouting">
+                      {{ $t('label.isrouting') }}
+                    </a-checkbox>
+                  </a-col>
+                </a-row>
+              </a-checkbox-group>
+            </a-form-item>
+          </a-col>
+        </a-row>
+
+        <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'
+import store from '@/store'
+import { axios } from '../../utils/request'
+
+export default {
+  name: 'RegisterOrUploadTemplate',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    action: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      uploadPercentage: 0,
+      uploading: false,
+      fileList: [],
+      zones: {},
+      defaultZone: '',
+      zoneSelected: '',
+      hyperVisor: {},
+      rootDisk: {},
+      nicAdapterType: {},
+      keyboardType: {},
+      format: {},
+      osTypes: {},
+      defaultOsType: '',
+      defaultOsId: null,
+      xenServerProvider: false,
+      hyperKVMShow: false,
+      hyperXenServerShow: false,
+      hyperVMWShow: false,
+      zoneError: '',
+      zoneErrorMessage: '',
+      loading: false,
+      rootAdmin: 'Admin',
+      allowed: false,
+      allowDirectDownload: false,
+      uploadParams: null,
+      currentForm: this.action.currentAction.icon === 'plus' ? 'Create' : 'Upload'
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.registerTemplate || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.$set(this.zones, 'loading', false)
+    this.$set(this.zones, 'opts', [])
+    this.$set(this.hyperVisor, 'loading', false)
+    this.$set(this.hyperVisor, 'opts', [])
+    this.$set(this.rootDisk, 'loading', false)
+    this.$set(this.rootDisk, 'opts', [])
+    this.$set(this.nicAdapterType, 'loading', false)
+    this.$set(this.nicAdapterType, 'opts', [])
+    this.$set(this.keyboardType, 'loading', false)
+    this.$set(this.keyboardType, 'opts', [])
+    this.$set(this.format, 'loading', false)
+    this.$set(this.format, 'opts', [])
+    this.$set(this.osTypes, 'loading', false)
+    this.$set(this.osTypes, 'opts', [])
+  },
+  mounted () {
+    this.fetchData()
+  },
+  computed: {
+  },
+  methods: {
+    fetchData () {
+      this.fetchZone()
+      this.fetchOsTypes()
+      if (Object.prototype.hasOwnProperty.call(store.getters.apis, 'listConfigurations')) {
+        this.fetchXenServerProvider()
+      }
+    },
+    handleFormChange (e) {
+      this.currentForm = e.target.value
+    },
+    handleRemove (file) {
+      const index = this.fileList.indexOf(file)
+      const newFileList = this.fileList.slice()
+      newFileList.splice(index, 1)
+      this.fileList = newFileList
+    },
+    beforeUpload (file) {
+      this.fileList = [file]
+      return false
+    },
+    handleUpload () {
+      const { fileList } = this
+      const formData = new FormData()
+      fileList.forEach(file => {
+        formData.append('files[]', file)
+      })
+      this.uploadPercentage = 0
+      axios.post(this.uploadParams.postURL,
+        formData,
+        {
+          headers: {
+            'Content-Type': 'multipart/form-data',
+            'X-signature': this.uploadParams.signature,
+            'X-expires': this.uploadParams.expires,
+            'X-metadata': this.uploadParams.metadata
+          },
+          onUploadProgress: (progressEvent) => {
+            this.uploadPercentage = Number(parseFloat(100 * progressEvent.loaded / progressEvent.total).toFixed(1))
+          },
+          timeout: 86400000
+        }).then((json) => {
+        this.$notification.success({
+          message: this.$t('message.success.upload'),
+          description: this.$t('message.success.upload.template.description')
+        })
+        this.$emit('refresh-data')
+        this.closeAction()
+      }).catch(e => {
+        this.$notification.error({
+          message: this.$t('message.upload.failed'),
+          description: `${this.$t('message.upload.template.failed.description')} -  ${e}`,
+          duration: 0
+        })
+      })
+    },
+    fetchZone () {
+      const params = {}
+      let listZones = []
+      params.listAll = true
+
+      this.allowed = false
+
+      if (store.getters.userInfo.roletype === this.rootAdmin && this.currentForm === 'Create') {
+        this.allowed = true
+        listZones.push({
+          id: this.$t('label.all.zone'),
+          name: this.$t('label.all.zone')
+        })
+      }
+
+      this.zones.loading = true
+      this.zones.opts = []
+
+      api('listZones', params).then(json => {
+        const listZonesResponse = json.listzonesresponse.zone
+        listZones = listZones.concat(listZonesResponse)
+
+        this.$set(this.zones, 'opts', listZones)
+      }).finally(() => {
+        this.zoneSelected = (this.zones.opts && this.zones.opts[1]) ? this.zones.opts[1].id : ''
+        this.zones.loading = false
+        this.fetchHyperVisor({ zoneid: this.zoneSelected })
+      })
+    },
+    fetchHyperVisor (params) {
+      this.hyperVisor.loading = true
+      let listhyperVisors = this.hyperVisor.opts
+
+      api('listHypervisors', params).then(json => {
+        const listResponse = json.listhypervisorsresponse.hypervisor
+        if (listResponse) {
+          listhyperVisors = listhyperVisors.concat(listResponse)
+        }
+        if (this.currentForm !== 'Upload') {
+          listhyperVisors.push({
+            name: 'Any'
+          })
+        }
+        this.$set(this.hyperVisor, 'opts', listhyperVisors)
+      }).finally(() => {
+        this.hyperVisor.loading = false
+      })
+    },
+    fetchOsTypes () {
+      const params = {}
+      params.listAll = true
+
+      this.osTypes.opts = []
+      this.osTypes.loading = true
+
+      api('listOsTypes', params).then(json => {
+        const listOsTypes = json.listostypesresponse.ostype
+        this.$set(this.osTypes, 'opts', listOsTypes)
+        this.defaultOsType = this.osTypes.opts[1].description
+        this.defaultOsId = this.osTypes.opts[1].id
+      }).finally(() => {
+        this.osTypes.loading = false
+      })
+    },
+    fetchXenServerProvider () {
+      const params = {}
+      params.name = 'xenserver.pvdriver.version'
+
+      this.xenServerProvider = true
+
+      api('listConfigurations', params).then(json => {
+        if (json.listconfigurationsresponse.configuration !== null && json.listconfigurationsresponse.configuration[0].value !== 'xenserver61') {
+          this.xenServerProvider = false
+        }
+      })
+    },
+    fetchRootDisk (hyperVisor) {
+      const controller = []
+      this.rootDisk.opts = []
+
+      if (hyperVisor === 'KVM') {
+        controller.push({
+          id: '',
+          description: ''
+        })
+        controller.push({
+          id: 'ide',
+          description: 'ide'
+        })
+        controller.push({
+          id: 'osdefault',
+          description: 'osdefault'
+        })
+        controller.push({
+          id: 'scsi',
+          description: 'scsi'
+        })
+        controller.push({
+          id: 'virtio',
+          description: 'virtio'
+        })
+      } else if (hyperVisor === 'VMware') {
+        controller.push({
+          id: '',
+          description: ''
+        })
+        controller.push({
+          id: 'scsi',
+          description: 'scsi'
+        })
+        controller.push({
+          id: 'ide',
+          description: 'ide'
+        })
+        controller.push({
+          id: 'osdefault',
+          description: 'osdefault'
+        })
+        controller.push({
+          id: 'pvscsi',
+          description: 'pvscsi'
+        })
+        controller.push({
+          id: 'lsilogic',
+          description: 'lsilogic'
+        })
+        controller.push({
+          id: 'lsisas1068',
+          description: 'lsilogicsas'
+        })
+        controller.push({
+          id: 'buslogic',
+          description: 'buslogic'
+        })
+      }
+
+      this.$set(this.rootDisk, 'opts', controller)
+    },
+    fetchNicAdapterType () {
+      const nicAdapterType = []
+      nicAdapterType.push({
+        id: '',
+        description: ''
+      })
+      nicAdapterType.push({
+        id: 'E1000',
+        description: 'E1000'
+      })
+      nicAdapterType.push({
+        id: 'PCNet32',
+        description: 'PCNet32'
+      })
+      nicAdapterType.push({
+        id: 'Vmxnet2',
+        description: 'Vmxnet2'
+      })
+      nicAdapterType.push({
+        id: 'Vmxnet3',
+        description: 'Vmxnet3'
+      })
+
+      this.$set(this.nicAdapterType, 'opts', nicAdapterType)
+    },
+    fetchKeyboardType () {
+      const keyboardType = []
+      const keyboardOpts = this.$config.keyboardOptions || {}
+      keyboardType.push({
+        id: '',
+        description: ''
+      })
+
+      Object.keys(keyboardOpts).forEach(keyboard => {
+        keyboardType.push({
+          id: keyboard,
+          description: this.$t(keyboardOpts[keyboard])
+        })
+      })
+
+      this.$set(this.keyboardType, 'opts', keyboardType)
+    },
+    fetchFormat (hyperVisor) {
+      const format = []
+
+      switch (hyperVisor) {
+        case 'Hyperv':
+          format.push({
+            id: 'VHD',
+            description: 'VHD'
+          })
+          format.push({
+            id: 'VHDX',
+            description: 'VHDX'
+          })
+          break
+        case 'KVM':
+          this.hyperKVMShow = true
+          format.push({
+            id: 'QCOW2',
+            description: 'QCOW2'
+          })
+          format.push({
+            id: 'RAW',
+            description: 'RAW'
+          })
+          format.push({
+            id: 'VHD',
+            description: 'VHD'
+          })
+          format.push({
+            id: 'VMDK',
+            description: 'VMDK'
+          })
+          break
+        case 'XenServer':
+          this.hyperXenServerShow = true
+          format.push({
+            id: 'VHD',
+            description: 'VHD'
+          })
+          break
+        case 'Simulator':
+          format.push({
+            id: 'VHD',
+            description: 'VHD'
+          })
+          break
+        case 'VMware':
+          this.hyperVMWShow = true
+          format.push({
+            id: 'OVA',
+            description: 'OVA'
+          })
+          break
+        case 'BareMetal':
+          format.push({
+            id: 'BareMetal',
+            description: 'BareMetal'
+          })
+          break
+        case 'Ovm':
+          format.push({
+            id: 'RAW',
+            description: 'RAW'
+          })
+          break
+        case 'LXC':
+          format.push({
+            id: 'TAR',
+            description: 'TAR'
+          })
+          break
+        default:
+          break
+      }
+      this.$set(this.format, 'opts', format)
+    },
+    handlerSelectZone (value) {
+      if (!Array.isArray(value)) {
+        value = [value]
+      }
+      this.validZone(value)
+      this.hyperVisor.opts = []
+
+      if (this.zoneError !== '') {
+        return
+      }
+
+      this.resetSelect()
+
+      const params = {}
+
+      if (value.includes(this.$t('label.all.zone'))) {
+        params.listAll = true
+        this.fetchHyperVisor(params)
+        return
+      }
+
+      for (let i = 0; i < value.length; i++) {
+        const zoneSelected = this.zones.opts.filter(zone => zone.id === value[i])
+
+        if (zoneSelected.length > 0) {
+          params.zoneid = zoneSelected[0].id
+          this.fetchHyperVisor(params)
+        }
+      }
+    },
+    handlerSelectHyperVisor (value) {
+      const hyperVisor = this.hyperVisor.opts[value].name
+
+      this.hyperXenServerShow = false
+      this.hyperVMWShow = false
+      this.hyperKVMShow = false
+      this.allowDirectDownload = false
+
+      this.resetSelect()
+      this.fetchFormat(hyperVisor)
+      this.fetchRootDisk(hyperVisor)
+      this.fetchNicAdapterType()
+      this.fetchKeyboardType()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err || this.zoneError !== '') {
+          return
+        }
+        let params = {}
+        for (const key in values) {
+          const input = values[key]
+
+          if (input === undefined) {
+            continue
+          }
+          if (key === 'file') {
+            continue
+          }
+
+          if (key === 'zoneids') {
+            if (input.length === 1 && input[0] === this.$t('label.all.zone')) {
+              params.zoneids = '-1'
+              continue
+            }
+            params[key] = input.join()
+          } else if (key === 'zoneid') {
+            params[key] = input
+          } else if (key === 'ostypeid') {
+            params[key] = input
+          } else if (key === 'hypervisor') {
+            params[key] = this.hyperVisor.opts[input].name
+          } else if (key === 'groupenabled') {
+            for (const index in input) {
+              const name = input[index]
+              params[name] = true
+            }
+          } else {
+            const formattedDetailData = {}
+            switch (key) {
+              case 'rootDiskControllerType':
+                formattedDetailData['details[0].rootDiskController'] = input
+                break
+              case 'nicAdapterType':
+                formattedDetailData['details[0].nicAdapter'] = input
+                break
+              case 'keyboardType':
+                formattedDetailData['details[0].keyboard'] = input
+                break
+              case 'xenserverToolsVersion61plus':
+                formattedDetailData['details[0].hypervisortoolsversion'] = input
+                break
+            }
+
+            if (Object.keys(formattedDetailData).length > 0) {
+              params = Object.assign({}, params, formattedDetailData)
+            } else {
+              params[key] = input
+            }
+          }
+        }
+        if (this.currentForm === 'Create') {
+          this.loading = true
+          api('registerTemplate', params).then(json => {
+            this.$notification.success({
+              message: this.$t('label.register.template'),
+              description: `${this.$t('message.success.register.template')} ${params.name}`
+            })
+            this.$emit('refresh-data')
+            this.closeAction()
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.loading = false
+          })
+        } else {
+          this.loading = true
+          if (this.fileList.length > 1) {
+            this.$notification.error({
+              message: this.$t('message.error.upload.template'),
+              description: this.$t('message.error.upload.template.description'),
+              duration: 0
+            })
+          }
+          api('getUploadParamsForTemplate', params).then(json => {
+            this.uploadParams = (json.postuploadtemplateresponse && json.postuploadtemplateresponse.getuploadparams) ? json.postuploadtemplateresponse.getuploadparams : ''
+            this.handleUpload()
+          }).catch(error => {
+            this.$notifyError(error)
+          }).finally(() => {
+            this.loading = false
+          })
+        }
+      })
+    },
+    handleChangeDirect (checked) {
+      this.allowDirectDownload = checked
+    },
+    validZone (zones) {
+      const allZoneExists = zones.filter(zone => zone === this.$t('label.all.zone'))
+
+      this.zoneError = ''
+      this.zoneErrorMessage = ''
+
+      if (allZoneExists.length > 0 && zones.length > 1) {
+        this.zoneError = 'error'
+        this.zoneErrorMessage = this.$t('message.error.zone.combined')
+      }
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    resetSelect () {
+      this.form.setFieldsValue({
+        hypervisor: undefined,
+        format: undefined,
+        rootDiskControllerType: undefined,
+        nicAdapterType: undefined,
+        keyboardType: undefined
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/image/TemplateZones.vue b/ui/src/views/image/TemplateZones.vue
new file mode 100644
index 0000000..047d39f
--- /dev/null
+++ b/ui/src/views/image/TemplateZones.vue
@@ -0,0 +1,374 @@
+// 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>
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading || fetchLoading"
+      :columns="columns"
+      :dataSource="dataSource"
+      :pagination="false"
+      :rowKey="record => record.zoneid">
+      <div slot="isready" slot-scope="text, record">
+        <span v-if="record.isready">{{ $t('label.yes') }}</span>
+        <span v-else>{{ $t('label.no') }}</span>
+      </div>
+      <template slot="action" slot-scope="text, record">
+        <span style="margin-right: 5px">
+          <a-button
+            :disabled="!('copyTemplate' in $store.getters.apis && record.isready)"
+            icon="copy"
+            shape="circle"
+            :loading="copyLoading"
+            @click="showCopyTemplate(record)" />
+        </span>
+        <span style="margin-right: 5px">
+          <a-button
+            :disabled="!('deleteTemplate' in $store.getters.apis)"
+            type="danger"
+            icon="delete"
+            shape="circle"
+            @click="onShowDeleteModal(record)"/>
+        </span>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="itemCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-if="'copyTemplate' in $store.getters.apis"
+      style="top: 20px;"
+      :title="$t('label.action.copy.template')"
+      :visible="showCopyActionForm"
+      :closable="true"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @ok="handleCopyTemplateSubmit"
+      @cancel="onCloseModal"
+      :confirmLoading="copyLoading"
+      centered>
+      <a-spin :spinning="copyLoading">
+        <a-form
+          :form="form"
+          @submit="handleCopyTemplateSubmit"
+          layout="vertical">
+          <a-form-item :label="$t('label.zoneid')">
+            <a-select
+              id="zone-selection"
+              mode="multiple"
+              :placeholder="$t('label.select.zones')"
+              v-decorator="['zoneid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading">
+              <a-select-option v-for="zone in zones" :key="zone.id">
+                {{ zone.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+
+    <a-modal
+      :title="$t('label.action.delete.template')"
+      :visible="showDeleteTemplate"
+      :closable="true"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @ok="deleteTemplate"
+      @cancel="onCloseModal"
+      :confirmLoading="deleteLoading"
+      centered>
+      <a-spin :spinning="deleteLoading">
+        <a-alert :message="$t('message.action.delete.template')" type="warning" />
+        <a-form-item :label="$t('label.isforced')" style="margin-bottom: 0;">
+          <a-switch v-model="forcedDelete"></a-switch>
+        </a-form-item>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'TemplateZones',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      page: 1,
+      pageSize: 10,
+      itemCount: 0,
+      fetchLoading: false,
+      showCopyActionForm: false,
+      currentRecord: {},
+      zones: [],
+      zoneLoading: false,
+      copyLoading: false,
+      deleteLoading: false,
+      showDeleteTemplate: false,
+      forcedDelete: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfigParams = (this.$store.getters.apis.copyTemplate && this.$store.getters.apis.copyTemplate.params) || []
+    this.apiParams = {}
+    this.apiConfigParams.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.zonename'),
+        dataIndex: 'zonename'
+      },
+      {
+        title: this.$t('label.status'),
+        dataIndex: 'status'
+      },
+      {
+        title: this.$t('label.isready'),
+        dataIndex: 'isready',
+        scopedSlots: { customRender: 'isready' }
+      }
+    ]
+    if (this.isActionPermitted()) {
+      this.columns.push({
+        title: '',
+        dataIndex: 'action',
+        fixed: 'right',
+        width: 100,
+        scopedSlots: { customRender: 'action' }
+      })
+    }
+
+    const userInfo = this.$store.getters.userInfo
+    if (!['Admin'].includes(userInfo.roletype) &&
+      (userInfo.account !== this.resource.account || userInfo.domain !== this.resource.domain)) {
+      this.columns = this.columns.filter(col => { return col.dataIndex !== 'status' })
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      params.id = this.resource.id
+      params.templatefilter = 'executable'
+      params.listall = true
+      params.page = this.page
+      params.pagesize = this.pageSize
+
+      this.dataSource = []
+      this.itemCount = 0
+      this.fetchLoading = true
+      api('listTemplates', params).then(json => {
+        this.dataSource = json.listtemplatesresponse.template || []
+        this.itemCount = json.listtemplatesresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    isActionPermitted () {
+      return (['Admin'].includes(this.$store.getters.userInfo.roletype) || // If admin or owner or belongs to current project
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.account === this.$store.getters.userInfo.account) ||
+        (this.resource.domainid === this.$store.getters.userInfo.domainid && this.resource.projectid && this.$store.getters.project && this.$store.getters.project.id && this.resource.projectid === this.$store.getters.project.id)) &&
+        (this.resource.isready || !this.resource.status || this.resource.status.indexOf('Downloaded') === -1) && // Template is ready or downloaded
+        this.resource.templatetype !== 'SYSTEM'
+    },
+    deleteTemplate () {
+      const params = {
+        id: this.currentRecord.id,
+        forced: this.forcedDelete,
+        zoneid: this.currentRecord.zoneid
+      }
+      this.deleteLoading = true
+      api('deleteTemplate', params).then(json => {
+        const jobId = json.deletetemplateresponse.jobid
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('label.action.delete.template'),
+          jobid: jobId,
+          description: this.resource.name,
+          status: 'progress'
+        })
+        const singleZone = (this.dataSource.length === 1)
+        this.$pollJob({
+          jobId,
+          successMethod: result => {
+            if (singleZone) {
+              const isResourcePage = (this.$route.params && this.$route.params.id)
+              if (isResourcePage) {
+                this.$router.go(-1)
+              }
+            } else {
+              this.fetchData()
+            }
+          },
+          errorMethod: () => this.fetchData(),
+          loadingMessage: `${this.$t('label.deleting.template')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+        this.onCloseModal()
+        this.fetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.deleteLoading = false
+      })
+    },
+    fetchZoneData () {
+      this.zones = []
+      this.zoneLoading = true
+      api('listZones', { listall: true }).then(json => {
+        const zones = json.listzonesresponse.zone || []
+        this.zones = [...zones.filter((zone) => this.currentRecord.zoneid !== zone.id)]
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    showCopyTemplate (record) {
+      this.currentRecord = record
+      this.form.setFieldsValue({
+        zoneid: []
+      })
+      this.fetchZoneData()
+      this.showCopyActionForm = true
+    },
+    onShowDeleteModal (record) {
+      this.forcedDelete = false
+      this.currentRecord = record
+      this.showDeleteTemplate = true
+    },
+    onCloseModal () {
+      this.currentRecord = {}
+      this.showCopyActionForm = false
+      this.showDeleteTemplate = false
+    },
+    handleCopyTemplateSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {
+          id: this.currentRecord.id,
+          sourcezoneid: this.currentRecord.zoneid,
+          destzoneids: values.zoneid.join()
+        }
+        this.copyLoading = true
+        api('copyTemplate', params).then(json => {
+          const jobId = json.copytemplateresponse.jobid
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.action.copy.template'),
+            jobid: jobId,
+            description: this.resource.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId,
+            successMethod: result => {
+              this.fetchData()
+            },
+            errorMethod: () => this.fetchData(),
+            loadingMessage: `${this.$t('label.action.copy.template')} ${this.resource.name} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }).finally(() => {
+          this.copyLoading = false
+          this.$emit('refresh-data')
+          this.onCloseModal()
+          this.fetchData()
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.row-element {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+</style>
diff --git a/ui/src/views/image/UpdateKubernetesSupportedVersion.vue b/ui/src/views/image/UpdateKubernetesSupportedVersion.vue
new file mode 100644
index 0000000..6d8475f
--- /dev/null
+++ b/ui/src/views/image/UpdateKubernetesSupportedVersion.vue
@@ -0,0 +1,165 @@
+// 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 :label="$t('label.state')">
+          <a-select
+            id="state-selection"
+            v-decorator="['state', {
+              rules: [{ required: true }]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="stateLoading"
+            :placeholder="apiParams.state.description">
+            <a-select-option v-for="(opt, optIndex) in this.states" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </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: 'UpdateKubernetesSupportedVersion',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      states: [],
+      stateLoading: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.updateKubernetesSupportedVersion || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.states = [
+      {
+        id: 'Enabled',
+        name: this.$t('state.enabled')
+      },
+      {
+        id: 'Disabled',
+        name: this.$t('state.disabled')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      var selectedState = 0
+      if (!this.isObjectEmpty(this.resource)) {
+        for (var i = 0; i < this.states.length; ++i) {
+          if (this.states[i].id === this.resource.state) {
+            selectedState = i
+            break
+          }
+        }
+      }
+      this.form.setFieldsValue({
+        state: selectedState
+      })
+    },
+    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
+        const params = {
+          id: this.resource.id
+        }
+        if (this.isValidValueForKey(values, 'state') && this.arrayHasItems(this.states)) {
+          params.state = this.states[values.state].id
+        }
+        api('updateKubernetesSupportedVersion', params).then(json => {
+          this.$message.success(`${this.$t('message.success.update.kubeversion')}: ${this.resource.name}`)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    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/image/UpdateTemplateIsoPermissions.vue b/ui/src/views/image/UpdateTemplateIsoPermissions.vue
new file mode 100644
index 0000000..6bafcc6
--- /dev/null
+++ b/ui/src/views/image/UpdateTemplateIsoPermissions.vue
@@ -0,0 +1,320 @@
+// 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">
+    <div v-if="loading" class="loading">
+      <a-icon type="loading"></a-icon>
+    </div>
+
+    <div class="form__item">
+      <p class="form__label">{{ $t('label.operation') }}</p>
+      <a-select v-model="selectedOperation" :defaultValue="$t('label.add')" @change="fetchData">
+        <a-select-option :value="$t('label.add')">{{ $t('label.add') }}</a-select-option>
+        <a-select-option :value="$t('label.remove')">{{ $t('label.remove') }}</a-select-option>
+        <a-select-option :value="$t('label.reset')">{{ $t('label.reset') }}</a-select-option>
+      </a-select>
+    </div>
+
+    <template v-if="selectedOperation !== $t('label.reset')">
+      <div class="form__item">
+        <p class="form__label">
+          <span class="required">*</span>
+          {{ $t('label.sharewith') }}
+        </p>
+        <a-select v-model="selectedShareWith" :defaultValue="$t('label.account')" @change="fetchData">
+          <a-select-option :value="$t('label.account')">{{ $t('label.account') }}</a-select-option>
+          <a-select-option :value="$t('label.project')">{{ $t('label.project') }}</a-select-option>
+        </a-select>
+      </div>
+
+      <template v-if="selectedShareWith === $t('label.account')">
+        <div class="form__item">
+          <p class="form__label">
+            {{ $t('label.account') }}
+          </p>
+          <div v-if="showAccountSelect">
+            <a-select
+              mode="multiple"
+              placeholder="Select Accounts"
+              :value="selectedAccounts"
+              @change="handleChange"
+              style="width: 100%">
+              <a-select-option v-for="account in accountsList" :key="account.name">
+                {{ account.name }}
+              </a-select-option>
+            </a-select>
+          </div>
+          <div v-else>
+            <a-input v-model="selectedAccountsList" :placeholder="$t('label.comma.separated.list.description')"></a-input>
+          </div>
+        </div>
+      </template>
+
+      <template v-else>
+        <div class="form__item">
+          <p class="form__label">
+            {{ $t('label.project') }}
+          </p>
+          <a-select
+            mode="multiple"
+            :placeholder="$t('label.select.projects')"
+            :value="selectedProjects"
+            @change="handleChange"
+            style="width: 100%">
+            <a-select-option v-for="project in projectsList" :key="project.name">
+              {{ project.name }}
+            </a-select-option>
+          </a-select>
+        </div>
+      </template>
+    </template>
+    <div class="actions">
+      <a-button @click="closeModal">
+        {{ $t('label.cancel') }}
+      </a-button>
+      <a-button type="primary" @click="submitData">
+        {{ $t('label.ok') }}
+      </a-button>
+    </div>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'UpdateTemplateIsoPermissions',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      projects: [],
+      accounts: [],
+      permittedAccounts: [],
+      permittedProjects: [],
+      selectedAccounts: [],
+      selectedProjects: [],
+      selectedAccountsList: '',
+      selectedOperation: this.$t('label.add'),
+      selectedShareWith: this.$t('label.account'),
+      accountError: false,
+      projectError: false,
+      showAccountSelect: true,
+      loading: false,
+      isImageTypeIso: false
+    }
+  },
+  computed: {
+    accountsList () {
+      return this.accounts.length > 0 ? this.accounts
+        .filter(a =>
+          this.selectedOperation === this.$t('label.add')
+            ? !this.permittedAccounts.includes(a.name)
+            : this.permittedAccounts.includes(a.name)
+        ) : this.accounts
+    },
+    projectsList () {
+      return this.projects > 0 ? this.projects
+        .filter(p =>
+          this.selectedOperation === this.$t('label.add')
+            ? !this.permittedProjects.includes(p.id)
+            : this.permittedProjects.includes(p.id)
+        ) : this.projects
+    }
+  },
+  mounted () {
+    this.isImageTypeIso = this.$route.meta.name === 'iso'
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.isImageTypeIso) {
+        this.fetchIsoPermissions()
+      } else {
+        this.fetchTemplatePermissions()
+      }
+      if (this.selectedShareWith === this.$t('label.account')) {
+        this.selectedAccounts = []
+        this.fetchAccounts()
+      } else {
+        this.selectedProjects = []
+        this.fetchProjects()
+      }
+      this.showAccountSelect = this.$store.getters.features.allowuserviewalldomainaccounts || !(this.$store.getters.userInfo.roletype === 'User')
+    },
+    fetchAccounts () {
+      this.loading = true
+      api('listAccounts', {
+        listall: true
+      }).then(response => {
+        this.accounts = response.listaccountsresponse.account.filter(account => account.name !== this.resource.account)
+      }).finally(e => {
+        this.loading = false
+      })
+    },
+    fetchProjects () {
+      api('listProjects', {
+        details: 'min',
+        listall: true
+      }).then(response => {
+        this.projects = response.listprojectsresponse.project
+      }).finally(e => {
+        this.loading = false
+      })
+    },
+    fetchTemplatePermissions () {
+      this.loading = true
+      api('listTemplatePermissions', {
+        id: this.resource.id
+      }).then(response => {
+        const permission = response.listtemplatepermissionsresponse.templatepermission
+        if (permission && permission.account) {
+          this.permittedAccounts = permission.account
+        }
+        if (permission && permission.projectids) {
+          this.permittedProjects = permission.projectids
+        }
+      }).finally(e => {
+        this.loading = false
+      })
+    },
+    fetchIsoPermissions () {
+      this.loading = true
+      api('listIsoPermissions', {
+        id: this.resource.id
+      }).then(response => {
+        const permission = response.listtemplatepermissionsresponse.templatepermission
+        if (permission && permission.account) {
+          this.permittedAccounts = permission.account
+        }
+        if (permission && permission.projectids) {
+          this.permittedProjects = permission.projectids
+        }
+      }).finally(e => {
+        this.loading = false
+      })
+    },
+    handleChange (selectedItems) {
+      if (this.selectedOperation === this.$t('label.add') || this.selectedOperation === this.$t('label.remove')) {
+        if (this.selectedShareWith === this.$t('label.account')) {
+          this.selectedAccounts = selectedItems
+        } else {
+          this.selectedProjects = selectedItems
+        }
+      }
+    },
+    closeModal () {
+      this.$parent.$parent.close()
+    },
+    submitData () {
+      let variableKey = ''
+      let variableValue = ''
+      if (this.selectedShareWith === this.$t('label.account')) {
+        variableKey = 'accounts'
+        if (this.showAccountSelect) {
+          variableValue = this.selectedAccounts.map(account => account).join(',')
+        } else {
+          variableValue = this.selectedAccountsList
+        }
+      } else {
+        variableKey = 'projectids'
+        variableValue = this.projects.filter(p => this.selectedProjects.includes(p.name)).map(p => p.id).join(',')
+      }
+      this.loading = true
+      const apiName = this.isImageTypeIso ? 'updateIsoPermissions' : 'updateTemplatePermissions'
+      const resourceType = this.isImageTypeIso ? 'ISO' : 'template'
+      api(apiName, {
+        [variableKey]: variableValue,
+        id: this.resource.id,
+        ispublic: this.resource.isPublic,
+        isextractable: this.resource.isExtractable,
+        featured: this.resource.featured,
+        op: this.selectedOperation.toLowerCase()
+      }).then(response => {
+        this.$notification.success({
+          message: `${this.$t('label.success.updated')} ${resourceType} ${this.$t('label.permissions')}`
+        })
+        this.closeModal()
+        this.parentFetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(e => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+  .form {
+    display: flex;
+    flex-direction: column;
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 500px;
+    }
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      margin-bottom: 10px;
+    }
+
+    &__label {
+      display: flex;
+      font-weight: bold;
+      margin-bottom: 5px;
+    }
+
+  }
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 20px;
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .required {
+    margin-right: 2px;
+    color: red;
+    font-size: 0.7rem;
+  }
+
+  .loading {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 3rem;
+  }
+</style>
diff --git a/ui/src/views/image/UploadLocalIso.vue b/ui/src/views/image/UploadLocalIso.vue
new file mode 100644
index 0000000..134a9dc
--- /dev/null
+++ b/ui/src/views/image/UploadLocalIso.vue
@@ -0,0 +1,56 @@
+// 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>
+    TODO: upload ISO from local file component
+
+    <a-upload
+      name="avatar"
+      listType="picture-card"
+      class="avatar-uploader"
+      :showUploadList="false"
+      action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
+      :beforeUpload="beforeUpload"
+      @change="handleChange"
+    >
+      <img v-if="imageUrl" :src="imageUrl" alt="avatar" />
+      <div v-else>
+        <a-icon :type="loading ? 'loading' : 'plus'" />
+        <div class="ant-upload-text">{{ $t('label.upload') }}</div>
+      </div>
+    </a-upload>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: '',
+  components: {
+  },
+  data () {
+    return {
+    }
+  },
+  methods: {
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/image/UploadLocalTemplate.vue b/ui/src/views/image/UploadLocalTemplate.vue
new file mode 100644
index 0000000..d16443f
--- /dev/null
+++ b/ui/src/views/image/UploadLocalTemplate.vue
@@ -0,0 +1,56 @@
+// 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>
+    TODO: upload template from local file component
+
+    <a-upload
+      name="avatar"
+      listType="picture-card"
+      class="avatar-uploader"
+      :showUploadList="false"
+      action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
+      :beforeUpload="beforeUpload"
+      @change="handleChange"
+    >
+      <img v-if="imageUrl" :src="imageUrl" alt="avatar" />
+      <div v-else>
+        <a-icon :type="loading ? 'loading' : 'plus'" />
+        <div class="ant-upload-text">{{ $t('label.upload') }}</div>
+      </div>
+    </a-upload>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: '',
+  components: {
+  },
+  data () {
+    return {
+    }
+  },
+  methods: {
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/infra/AddPrimaryStorage.vue b/ui/src/views/infra/AddPrimaryStorage.vue
new file mode 100644
index 0000000..8229abe
--- /dev/null
+++ b/ui/src/views/infra/AddPrimaryStorage.vue
@@ -0,0 +1,706 @@
+// 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" layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.scope') }}
+            <a-tooltip :title="apiParams.scope.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select v-decorator="['scope', { initialValue: 'cluster' }]" @change="val => { this.scope = val }">
+            <a-select-option :value="'cluster'"> {{ $t('label.clusterid') }} </a-select-option>
+            <a-select-option :value="'zone'"> {{ $t('label.zoneid') }} </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div v-if="this.scope === 'zone'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.hypervisor') }}
+              <a-tooltip :title="apiParams.hypervisor.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['hypervisor', { initialValue: hypervisors[0]}]"
+              @change="val => this.selectedHypervisor = val">
+              <a-select-option :value="hypervisor" v-for="(hypervisor, idx) in hypervisors" :key="idx">
+                {{ hypervisor }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['zone', { initialValue: this.zoneSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+            @change="val => changeZone(val)">
+            <a-select-option :value="zone.id" v-for="(zone) in zones" :key="zone.id">
+              {{ zone.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div v-if="this.scope === 'cluster' || this.scope === 'host'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.podid') }}
+              <a-tooltip :title="apiParams.podid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['pod', { initialValue: this.podSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+              @change="val => changePod(val)">
+              <a-select-option :value="pod.id" v-for="(pod) in pods" :key="pod.id">
+                {{ pod.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.clusterid') }}
+              <a-tooltip :title="apiParams.clusterid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['cluster', { initialValue: this.clusterSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+              @change="val => fetchHypervisor(val)">
+              <a-select-option :value="cluster.id" v-for="cluster in clusters" :key="cluster.id">
+                {{ cluster.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+        <div v-if="this.scope === 'host'">
+          <a-form-item :label="$t('label.hostid')">
+            <a-select
+              v-decorator="['host', { initialValue: this.hostSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+              @change="val => this.hostSelected = val">
+              <a-select-option :value="host.id" v-for="host in hosts" :key="host.id">
+                {{ host.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </div>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input v-decorator="['name', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.protocol') }}
+            <a-tooltip :title="$t('message.protocol.description')">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['protocol', { initialValue: this.protocols[0], rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+            @change="val => this.protocolSelected = val">
+            <a-select-option :value="protocol" v-for="(protocol,idx) in protocols" :key="idx">
+              {{ protocol }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <div
+          v-if="protocolSelected === 'nfs' || protocolSelected === 'SMB' || protocolSelected === 'iscsi' || protocolSelected === 'vmfs'|| protocolSelected === 'Gluster' ||
+            (protocolSelected === 'PreSetup' && hypervisorType === 'VMware') || protocolSelected === 'datastorecluster'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.server') }}
+              <a-tooltip :title="$t('message.server.description')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['server', { rules: [{ required: true, message: `${$t('label.required')}` }] }]" />
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'nfs' || protocolSelected === 'SMB' || protocolSelected === 'ocfs2' || (protocolSelected === 'PreSetup' && hypervisorType !== 'VMware') || protocolSelected === 'SharedMountPoint'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.path') }}
+              <a-tooltip :title="$t('message.path.description')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['path', { rules: [{ required: true, message: `${$t('label.required')}` }] }]" />
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'SMB'">
+          <a-form-item :label="$t('label.smbusername')">
+            <a-input v-decorator="['smbUsername', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.smbpassword')">
+            <a-input-password v-decorator="['smbPassword', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.smbdomain')">
+            <a-input v-decorator="['smbDomain', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'iscsi'">
+          <a-form-item :label="$t('label.iqn')">
+            <a-input v-decorator="['iqn', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.lun')">
+            <a-input v-decorator="['lun', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'vmfs' || (protocolSelected === 'PreSetup' && hypervisorType === 'VMware') || protocolSelected === 'datastorecluster'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.vcenterdatacenter') }}
+              <a-tooltip :title="$t('message.datacenter.description')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['vCenterDataCenter', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.vcenterdatastore') }}
+              <a-tooltip :title="$t('message.datastore.description')">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['vCenterDataStore', { rules: [{ required: true, message: `${$t('label.required')}` }] }]"/>
+          </a-form-item>
+        </div>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.providername') }}
+            <a-tooltip :title="apiParams.provider.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['provider', { initialValue: providerSelected, rules: [{ required: true, message: `${$t('label.required')}`}] }]"
+            @change="val => this.providerSelected = val">
+            <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'">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ismanaged') }}
+              <a-tooltip :title="apiParams.managed.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-checkbox-group v-decorator="['managed']" >
+              <a-checkbox value="ismanaged"></a-checkbox>
+            </a-checkbox-group>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.capacitybytes') }}
+              <a-tooltip :title="apiParams.capacitybytes.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['capacityBytes']" />
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.capacityiops') }}
+              <a-tooltip :title="apiParams.capacityiops.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['capacityIops']" />
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.url') }}
+              <a-tooltip :title="apiParams.url.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input v-decorator="['url']" />
+          </a-form-item>
+        </div>
+        <div v-if="this.protocolSelected === 'RBD'">
+          <a-form-item :label="$t('label.rados.monitor')">
+            <a-input v-decorator="['radosmonitor']" />
+          </a-form-item><a-form-item :label="$t('label.rados.pool')">
+            <a-input v-decorator="['radospool']" />
+          </a-form-item>
+          <a-form-item :label="$t('label.rados.user')">
+            <a-input v-decorator="['radosuser']" />
+          </a-form-item>
+          <a-form-item :label="$t('label.rados.secret')">
+            <a-input v-decorator="['radossecret']" />
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'CLVM'">
+          <a-form-item :label="$t('label.volumegroup')">
+            <a-input v-decorator="['volumegroup', { rules: [{ required: true, message: `${$t('label.required')}`}] }]" />
+          </a-form-item>
+        </div>
+        <div v-if="protocolSelected === 'Gluster'">
+          <a-form-item :label="$t('label.volume')">
+            <a-input v-decorator="['volume']" />
+          </a-form-item>
+        </div>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.storagetags') }}
+            <a-tooltip :title="apiParams.tags.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="tags"
+            v-model="selectedTags"
+          >
+            <a-select-option v-for="tag in storageTags" :key="tag.name">{{ tag.name }}</a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+      <div class="actions">
+        <a-button @click="closeModal">{{ $t('label.cancel') }}</a-button>
+        <a-button type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+      </div>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import _ from 'lodash'
+
+export default {
+  name: 'AddPrimaryStorage',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      hypervisors: ['KVM', 'VMware', 'Hyperv', 'Any'],
+      protocols: [],
+      providers: [],
+      scope: 'cluster',
+      zones: [],
+      pods: [],
+      clusters: [],
+      hosts: [],
+      selectedTags: [],
+      storageTags: [],
+      zoneId: '',
+      zoneSelected: '',
+      podSelected: '',
+      clusterSelected: '',
+      hostSelected: '',
+      hypervisorType: '',
+      protocolSelected: 'nfs',
+      providerSelected: 'DefaultPrimary',
+      selectedHypervisor: 'KVM',
+      size: 'default',
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createStoragePool || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.getInfraData()
+      this.listStorageTags()
+      this.listStorageProviders()
+    },
+    getInfraData () {
+      this.loading = true
+      api('listZones').then(json => {
+        this.zones = json.listzonesresponse.zone || []
+        this.changeZone(this.zones[0] ? this.zones[0].id : '')
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    changeZone (value) {
+      this.zoneSelected = value
+      if (this.zoneSelected === '') {
+        this.podSelected = ''
+        return
+      }
+      api('listPods', {
+        zoneid: this.zoneSelected
+      }).then(json => {
+        this.pods = json.listpodsresponse.pod || []
+        this.changePod(this.pods[0] ? this.pods[0].id : '')
+      })
+    },
+    changePod (value) {
+      this.podSelected = value
+      if (this.podSelected === '') {
+        this.clusterSelected = ''
+        return
+      }
+      api('listClusters', {
+        podid: this.podSelected
+      }).then(json => {
+        this.clusters = json.listclustersresponse.cluster || []
+        if (this.clusters.length > 0) {
+          this.clusterSelected = this.clusters[0].id
+          this.fetchHypervisor()
+        }
+      }).then(() => {
+        api('listHosts', {
+          clusterid: this.clusterSelected
+        }).then(json => {
+          this.hosts = json.listhostsresponse.host || []
+          if (this.hosts.length > 0) {
+            this.hostSelected = this.hosts[0].id
+          }
+        })
+      })
+    },
+    listStorageProviders () {
+      this.providers = []
+      this.loading = true
+      api('listStorageProviders', { type: 'primary' }).then(json => {
+        var providers = json.liststorageprovidersresponse.dataStoreProvider || []
+        for (const provider of providers) {
+          this.providers.push(provider.name)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    listStorageTags () {
+      this.loading = true
+      api('listStorageTags').then(json => {
+        this.storageTags = json.liststoragetagsresponse.storagetag || []
+        if (this.storageTags) {
+          this.storageTags = _.uniqBy(this.storageTags, 'name')
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchHypervisor (value) {
+      const cluster = this.clusters.find(cluster => cluster.id === this.clusterSelected)
+      this.hypervisorType = cluster.hypervisortype
+      if (this.hypervisorType === 'KVM') {
+        this.protocols = ['nfs', 'SharedMountPoint', 'RBD', 'CLVM', 'Gluster', 'custom']
+      } else if (this.hypervisorType === 'XenServer') {
+        this.protocols = ['nfs', 'PreSetup', 'iscsi', 'custom']
+      } else if (this.hypervisorType === 'VMware') {
+        this.protocols = ['nfs', 'vmfs', 'custom']
+        if ('importVsphereStoragePolicies' in this.$store.getters.apis) {
+          this.protocols = ['nfs', 'PreSetup', 'datastorecluster', 'custom']
+        }
+      } else if (this.hypervisorType === 'Hyperv') {
+        this.protocols = ['SMB']
+      } else if (this.hypervisorType === 'Ovm') {
+        this.protocols = ['nfs', 'ocfs2']
+      } else if (this.hypervisorType === 'LXC') {
+        this.protocols = ['nfs', 'SharedMountPoint', 'RBD']
+      } else {
+        this.protocols = ['nfs']
+      }
+    },
+    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
+    },
+    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
+    },
+    presetupURL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'presetup://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    datastoreclusterURL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'datastorecluster://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    ocfs2URL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'ocfs2://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    SharedMountPointURL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'SharedMountPoint://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    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('+', '-')
+      secret = secret.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
+    },
+    clvmURL (vgname) {
+      var url
+      if (vgname.indexOf('://') === -1) {
+        url = 'clvm://localhost/' + vgname
+      } else {
+        url = vgname
+      }
+      return url
+    },
+    vmfsURL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'vmfs://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    iscsiURL (server, iqn, lun) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'iscsi://' + server + iqn + '/' + lun
+      } else {
+        url = server + iqn + '/' + lun
+      }
+      return url
+    },
+    glusterURL (server, path) {
+      var url
+      if (server.indexOf('://') === -1) {
+        url = 'gluster://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    closeModal () {
+      this.$parent.$parent.close()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {
+          scope: values.scope,
+          zoneid: values.zone,
+          name: values.name,
+          provider: values.provider
+        }
+        if (values.scope === 'zone') {
+          params.hypervisor = values.hypervisor
+        }
+        if (values.scope === 'cluster' || values.scope === 'host') {
+          params.podid = values.pod
+          params.clusterid = values.cluster
+        }
+        if (values.scope === 'host') {
+          params.hostid = values.host
+        }
+        var server = values.server ? values.server : null
+        var path = values.path ? values.path : null
+        if (path !== null && path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        var url = ''
+        if (values.protocol === 'nfs') {
+          url = this.nfsURL(server, path)
+        } else if (values.protocol === 'SMB') {
+          url = this.smbURL(server, path)
+          const smbParams = {
+            user: encodeURIComponent(values.smbUsername),
+            password: encodeURIComponent(values.smbPassword),
+            domain: values.smbDomain
+          }
+          Object.keys(smbParams).forEach((key, index) => {
+            params['details[' + index.toString() + '].' + key] = smbParams[key]
+          })
+        } else if (values.protocol === 'PreSetup' && this.hypervisorType !== 'VMware') {
+          server = 'localhost'
+          url = this.presetupURL(server, path)
+        } else if (values.protocol === 'PreSetup' && this.hypervisorType === 'VMware') {
+          path = values.vCenterDataCenter
+          if (path.substring(0, 1) !== '/') {
+            path = '/' + path
+          }
+          path += '/' + values.vCenterDataStore
+          url = this.presetupURL(server, path)
+        } else if (values.protocol === 'datastorecluster' && this.hypervisorType === 'VMware') {
+          path = values.vCenterDataCenter
+          if (path.substring(0, 1) !== '/') {
+            path = '/' + path
+          }
+          path += '/' + values.vCenterDataStore
+          url = this.datastoreclusterURL(server, path)
+        } else if (values.protocol === 'ocfs2') {
+          url = this.ocfs2URL(server, path)
+        } else if (values.protocol === 'SharedMountPoint') {
+          server = 'localhost'
+          url = this.SharedMountPointURL(server, path)
+        } else if (values.protocol === 'CLVM') {
+          var vg = (values.volumegroup.substring(0, 1) !== '/') ? ('/' + values.volumegroup) : values.volumegroup
+          url = this.clvmURL(vg)
+        } else if (values.protocol === 'RBD') {
+          url = this.rbdURL(values.radosmonitor, values.radospool, values.radosuser, values.radossecret)
+        } else if (values.protocol === 'vmfs') {
+          path = values.vCenterDataCenter
+          if (path.substring(0, 1) !== '/') {
+            path = '/' + path
+          }
+          path += '/' + values.vCenterDataStore
+          url = this.vmfsURL(server, path)
+        } else if (values.protocol === 'Gluster') {
+          var glustervolume = values.volume
+          if (glustervolume.substring(0, 1) !== '/') {
+            glustervolume = '/' + glustervolume
+          }
+          url = this.glusterURL(server, glustervolume)
+        } else if (values.protocol === 'iscsi') {
+          var iqn = values.iqn
+          if (iqn.substring(0, 1) !== '/') {
+            iqn = '/' + iqn
+          }
+          var lun = values.lun
+          url = this.iscsiURL(server, iqn, lun)
+        }
+        params.url = url
+        if (values.provider !== 'DefaultPrimary') {
+          if (values.managed) {
+            params.managed = true
+          } else {
+            params.managed = false
+          }
+          if (values.capacityBytes && values.capacityBytes.length > 0) {
+            params.capacityBytes = values.capacityBytes.split(',').join('')
+          }
+          if (values.capacityIops && values.capacityIops.length > 0) {
+            params.capacityIops = values.capacityIops.split(',').join('')
+          }
+          if (values.url && values.url.length > 0) {
+            params.url = values.url
+          }
+        }
+        if (this.selectedTags.length > 0) {
+          params.tags = this.selectedTags.join()
+        }
+        this.loading = true
+        api('createStoragePool', {}, 'POST', params).then(json => {
+          this.$notification.success({
+            message: this.$t('label.add.primary.storage'),
+            description: this.$t('label.add.primary.storage')
+          })
+          this.closeModal()
+          this.parentFetchData()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 80vw;
+  @media (min-width: 1000px) {
+    width: 500px;
+  }
+}
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+  button {
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/AddSecondaryStorage.vue b/ui/src/views/infra/AddSecondaryStorage.vue
new file mode 100644
index 0000000..4016c41
--- /dev/null
+++ b/ui/src/views/infra/AddSecondaryStorage.vue
@@ -0,0 +1,312 @@
+// 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" layout="vertical">
+        <a-form-item :label="$t('label.name')">
+          <a-input v-decorator="['name']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.providername')">
+          <a-select
+            v-decorator="[
+              'provider',
+              {
+                initialValue: 'NFS'
+              }]"
+            @change="val => { this.provider = val }"
+          >
+            <a-select-option
+              :value="prov"
+              v-for="(prov,idx) in providers"
+              :key="idx"
+            >{{ prov }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <div v-if="provider !== 'Swift'">
+          <a-form-item :label="$t('label.zone')">
+            <a-select
+              v-decorator="[
+                'zone',
+                {
+                  initialValue: this.zoneSelected,
+                  rules: [{ required: true, message: `${$t('label.required')}`}]
+                }]"
+              @change="val => { zoneSelected = val }"
+            >
+              <a-select-option
+                :value="zone.id"
+                v-for="(zone) in zones"
+                :key="zone.id"
+              >{{ zone.name }}</a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item :label="$t('label.server')">
+            <a-input
+              v-decorator="[
+                'server',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.path')">
+            <a-input
+              v-decorator="[
+                'path',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+        </div>
+        <div v-if="provider === 'SMB/CIFS'">
+          <a-form-item :label="$t('label.smbusername')">
+            <a-input
+              v-decorator="[
+                'smbUsername',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.smbpassword')">
+            <a-input-password
+              v-decorator="[
+                'smbPassword',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.smbdomain')">
+            <a-input
+              v-decorator="[
+                'smbDomain',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+        </div>
+        <div v-if="provider === 'Swift'">
+          <a-form-item :label="$t('label.url')">
+            <a-input
+              v-decorator="[
+                'url',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.account')">
+            <a-input
+              v-decorator="[
+                'account',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="[
+                'username',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.key')">
+            <a-input
+              v-decorator="[
+                'key',
+                {
+                  rules: [{ required: true, message: `${$t('label.required')}` }]
+                }]"
+            />
+          </a-form-item>
+          <a-form-item :label="$t('label.storagepolicy')">
+            <a-input
+              v-decorator="[
+                'storagepolicy'
+              ]"
+            />
+          </a-form-item>
+        </div>
+        <div class="actions">
+          <a-button @click="closeModal">{{ $t('label.cancel') }}</a-button>
+          <a-button type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddSecondryStorage',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      providers: ['NFS', 'SMB/CIFS', 'Swift'],
+      provider: '',
+      zones: [],
+      zoneSelected: '',
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.listZones()
+    },
+    closeModal () {
+      this.$parent.$parent.close()
+    },
+    listZones () {
+      api('listZones').then(json => {
+        if (json && json.listzonesresponse && json.listzonesresponse.zone) {
+          this.zones = json.listzonesresponse.zone
+          if (this.zones.length > 0) {
+            this.zoneSelected = this.zones[0].id || ''
+          }
+        }
+      })
+    },
+    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
+    },
+    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
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        var data = {
+          name: values.name
+        }
+        var url = ''
+        var provider = values.provider
+        if (provider === 'NFS') {
+          url = this.nfsURL(values.server, values.path)
+        }
+        if (provider === 'SMB/CIFS') {
+          provider = 'SMB'
+          url = this.smbURL(values.server, values.path, values.smbUsername, values.smbPassword, values.smbDomain)
+          const smbParams = {
+            user: values.smbUsername,
+            password: values.smbPassword,
+            domain: values.smbDomain
+          }
+          Object.keys(smbParams).forEach((key, index) => {
+            data['details[' + index.toString() + '].key'] = key
+            data['details[' + index.toString() + '].value'] = smbParams[key]
+          })
+        }
+        if (provider === 'Swift') {
+          url = values.url
+          const swiftParams = {
+            account: values.account,
+            username: values.username,
+            key: values.key,
+            storagepolicy: values.storagepolicy
+          }
+          Object.keys(swiftParams).forEach((key, index) => {
+            data['details[' + index.toString() + '].key'] = key
+            data['details[' + index.toString() + '].value'] = swiftParams[key]
+          })
+        }
+
+        data.url = url
+        data.provider = provider
+        if (values.zone && provider !== 'Swift') {
+          data.zoneid = values.zone
+        }
+
+        this.loading = true
+        api('addImageStore', data).then(json => {
+          this.$notification.success({
+            message: this.$t('label.add.secondary.storage'),
+            description: this.$t('label.add.secondary.storage')
+          })
+          this.closeModal()
+          this.parentFetchData()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 85vw;
+
+  @media (min-width: 1000px) {
+    width: 35vw;
+  }
+}
+
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+  button {
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/ClusterAdd.vue b/ui/src/views/infra/ClusterAdd.vue
new file mode 100644
index 0000000..f4c03fe
--- /dev/null
+++ b/ui/src/views/infra/ClusterAdd.vue
@@ -0,0 +1,380 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form">
+      <div class="form__item">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.zonenamelabel') }}</div>
+        <a-select v-model="zoneId" @change="fetchPods">
+          <a-select-option
+            v-for="zone in zonesList"
+            :value="zone.id"
+            :key="zone.id">
+            {{ zone.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.hypervisor') }}</div>
+        <a-select v-model="hypervisor" @change="resetAllFields">
+          <a-select-option
+            v-for="hv in hypervisorsList"
+            :value="hv.name"
+            :key="hv.name">
+            {{ hv.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.podname') }}</div>
+        <a-select v-model="podId">
+          <a-select-option
+            v-for="pod in podsList"
+            :value="pod.id"
+            :key="pod.id">
+            {{ pod.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.clusternamelabel') }}</div>
+        <span class="required required-label" ref="requiredCluster">{{ $t('label.required') }}</span>
+        <a-input :placeholder="placeholder.clustername" v-model="clustername"></a-input>
+      </div>
+
+      <template v-if="hypervisor === 'VMware'">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.vcenter.host') }}</div>
+          <a-input v-model="host"></a-input>
+        </div>
+
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.vcenterusername') }}</div>
+          <a-input v-model="username"></a-input>
+        </div>
+
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.vcenterpassword') }}</div>
+          <a-input type="password" v-model="password"></a-input>
+        </div>
+
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.vcenterdatacenter') }}</div>
+          <a-input v-model="dataCenter"></a-input>
+        </div>
+      </template>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.isdedicated') }}</div>
+        <a-checkbox @change="toggleDedicated" />
+      </div>
+
+      <template v-if="showDedicated">
+        <DedicateDomain
+          @domainChange="id => dedicatedDomainId = id"
+          @accountChange="id => dedicatedAccount = id"
+          :error="domainError" />
+      </template>
+
+      <a-divider></a-divider>
+
+      <div class="actions">
+        <a-button @click="() => this.$parent.$parent.close()">{{ $t('label.cancel') }}</a-button>
+        <a-button @click="handleSubmitForm" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import DedicateDomain from '../../components/view/DedicateDomain'
+
+export default {
+  name: 'ClusterAdd',
+  components: {
+    DedicateDomain
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      loading: false,
+      zoneId: null,
+      hypervisor: null,
+      podId: null,
+      clustername: null,
+      clustertype: 'CloudManaged',
+      username: null,
+      password: null,
+      url: null,
+      host: null,
+      dataCenter: null,
+      ovm3pool: null,
+      ovm3cluster: null,
+      ovm3vip: null,
+      zonesList: [],
+      hypervisorsList: [],
+      podsList: [],
+      showDedicated: false,
+      dedicatedDomainId: null,
+      dedicatedAccount: null,
+      domainError: false,
+      params: [],
+      placeholder: {
+        clustername: null
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZones()
+      this.fetchHypervisors()
+      this.params = this.$store.getters.apis.addCluster.params
+      Object.keys(this.placeholder).forEach(item => { this.returnPlaceholder(item) })
+    },
+    fetchZones () {
+      this.loading = true
+      api('listZones').then(response => {
+        this.zonesList = response.listzonesresponse.zone || []
+        this.zoneId = this.zonesList[0].id || null
+        this.fetchPods()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchHypervisors () {
+      this.loading = true
+      api('listHypervisors').then(response => {
+        this.hypervisorsList = response.listhypervisorsresponse.hypervisor || []
+        this.hypervisor = this.hypervisorsList[0].name || null
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchPods () {
+      this.loading = true
+      api('listPods', {
+        zoneid: this.zoneId
+      }).then(response => {
+        this.podsList = response.listpodsresponse.pod || []
+        this.podId = this.podsList[0].id || null
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    toggleDedicated () {
+      this.dedicatedDomainId = null
+      this.dedicatedAccount = null
+      this.showDedicated = !this.showDedicated
+    },
+    handleSubmitForm () {
+      if (!this.clustername) {
+        this.$refs.requiredCluster.classList.add('required-label--visible')
+        return
+      }
+      this.$refs.requiredCluster.classList.remove('required-label--visible')
+
+      if (this.hypervisor === 'Ovm3') {
+        this.ovm3pool = 'on'
+        this.ovm3cluster = 'undefined'
+        this.ovm3vip = ''
+      }
+
+      if (this.hypervisor === 'VMware') {
+        this.clustertype = 'ExternalManaged'
+        if ((this.host === null || this.host.length === 0) &&
+          (this.dataCenter === null || this.dataCenter.length === 0)) {
+          api('listVmwareDcs', {
+            zoneid: this.zoneId
+          }).then(response => {
+            var vmwaredcs = response.listvmwaredcsresponse.VMwareDC
+            if (vmwaredcs !== null) {
+              this.host = vmwaredcs[0].vcenter
+              this.dataCenter = vmwaredcs[0].name
+            }
+            this.addCluster()
+          }).catch(error => {
+            this.$notification.error({
+              message: `${this.$t('label.error')} ${error.response.status}`,
+              description: error.response.data.listvmwaredcsresponse.errortext,
+              duration: 0
+            })
+          })
+          return
+        }
+      }
+      this.addCluster()
+    },
+    addCluster () {
+      if (this.hypervisor === 'VMware') {
+        const clusternameVal = this.clustername
+        this.url = `http://${this.host}/${this.dataCenter}/${clusternameVal}`
+        this.clustername = `${this.host}/${this.dataCenter}/${clusternameVal}`
+      }
+      this.loading = true
+      this.parentToggleLoading()
+      api('addCluster', {}, 'POST', {
+        zoneId: this.zoneId,
+        hypervisor: this.hypervisor,
+        clustertype: this.clustertype,
+        podId: this.podId,
+        clustername: this.clustername,
+        ovm3pool: this.ovm3pool,
+        ovm3cluster: this.ovm3cluster,
+        ovm3vip: this.ovm3vip,
+        username: this.username,
+        password: this.password,
+        url: this.url
+      }).then(response => {
+        const cluster = response.addclusterresponse.cluster[0] || {}
+        if (cluster.id && this.showDedicated) {
+          this.dedicateCluster(cluster.id)
+        }
+        this.parentFetchData()
+        this.parentToggleLoading()
+        this.$parent.$parent.close()
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.addclusterresponse.errortext,
+          duration: 0
+        })
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    dedicateCluster (clusterId) {
+      this.loading = true
+      api('dedicateCluster', {
+        clusterId,
+        domainId: this.dedicatedDomainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicateclusterresponse.jobid,
+          successMessage: this.$t('message.cluster.dedicated'),
+          successMethod: () => {
+            this.loading = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.cluster.dedicated'),
+              jobid: response.dedicateclusterresponse.jobid,
+              description: `${this.$t('label.domainid')} : ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.cluster.failed'),
+          errorMethod: () => {
+            this.loading = false
+          },
+          loadingMessage: this.$t('message.dedicate.zone'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loading = false
+          }
+        })
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+        this.loading = false
+      })
+    },
+    resetAllFields () {
+      this.clustertype = 'CloudManaged'
+      this.username = null
+      this.password = null
+      this.url = null
+      this.host = null
+      this.dataCenter = null
+      this.ovm3pool = null
+      this.ovm3cluster = null
+      this.ovm3vip = null
+    },
+    returnPlaceholder (field) {
+      this.params.find(i => {
+        if (i.name === field) this.placeholder[field] = i.description
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+
+    &__label {
+      margin-bottom: 5px;
+    }
+
+    &__item {
+      margin-bottom: 20px;
+    }
+
+    .ant-select {
+      width: 85vw;
+
+      @media (min-width: 760px) {
+        width: 400px;
+      }
+    }
+  }
+
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .required {
+    color: #ff0000;
+
+    &-label {
+      display: none;
+
+      &--visible {
+        display: block;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/CpuSockets.vue b/ui/src/views/infra/CpuSockets.vue
new file mode 100644
index 0000000..e04f8b0
--- /dev/null
+++ b/ui/src/views/infra/CpuSockets.vue
@@ -0,0 +1,185 @@
+// 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>
+    <a-card class="breadcrumb-card">
+      <a-row>
+        <a-col :span="24" style="padding-left: 12px">
+          <breadcrumb>
+            <a-tooltip placement="bottom" slot="end">
+              <template slot="title">{{ $t('label.refresh') }}</template>
+              <a-button
+                style="margin-top: 4px"
+                :loading="loading"
+                shape="round"
+                size="small"
+                icon="reload"
+                @click="fetchData()"
+              >{{ $t('label.refresh') }}</a-button>
+            </a-tooltip>
+          </breadcrumb>
+        </a-col>
+      </a-row>
+    </a-card>
+
+    <div class="row-element">
+      <list-view
+        :columns="columns"
+        :items="items"
+        :loading="loading"
+        @refresh="this.fetchData" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { genericCompare } from '@/utils/sort.js'
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+import ListView from '@/components/view/ListView.vue'
+
+export default {
+  name: 'CpuSockets',
+  components: {
+    ListView,
+    Breadcrumb
+  },
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData,
+      parentToggleLoading: () => { this.loading = !this.loading }
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      items: [],
+      data: {},
+      columns: []
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    '$i18n.locale' (to, from) {
+      if (to !== from) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    pushData (hypervisor) {
+      if (['BareMetal', 'LXC'].includes(hypervisor)) {
+        this.data[hypervisor].cpusockets = 'N/A'
+      }
+      if (hypervisor === 'Hyperv') {
+        this.data[hypervisor].name = 'Hyper-V'
+      }
+      this.items.push(this.data[hypervisor])
+    },
+    callListHostsWithPage (hypervisor, currentPage) {
+      this.loading = true
+      const pageSize = 100
+      api('listHosts', {
+        type: 'routing',
+        details: 'min',
+        hypervisor: hypervisor,
+        page: currentPage,
+        pagesize: pageSize
+      }).then(json => {
+        if (json.listhostsresponse.count === undefined) {
+          this.pushData(hypervisor)
+          return
+        }
+
+        this.data[hypervisor].hosts = json.listhostsresponse.count
+        this.data[hypervisor].currentHosts += json.listhostsresponse.host.length
+
+        for (const host of json.listhostsresponse.host) {
+          if (host.cpusockets !== undefined && isNaN(host.cpusockets) === false) {
+            this.data[hypervisor].cpusockets += host.cpusockets
+          }
+        }
+
+        if (this.data[hypervisor].currentHosts < this.data[hypervisor].hosts) {
+          this.callListHostsWithPage(hypervisor, currentPage + 1)
+        } else {
+          this.pushData(hypervisor)
+        }
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchData () {
+      this.columns = []
+      this.columns.push({
+        dataIndex: 'name',
+        title: this.$t('label.hypervisor'),
+        sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+      })
+
+      this.columns.push({
+        dataIndex: 'hosts',
+        title: this.$t('label.hosts'),
+        sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+      })
+      this.columns.push({
+        dataIndex: 'cpusockets',
+        title: this.$t('label.cpu.sockets'),
+        sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
+      })
+
+      this.items = []
+      this.data = {}
+      const hypervisors = ['BareMetal', 'Hyperv', 'KVM', 'LXC', 'Ovm3', 'Simulator', 'VMware', 'XenServer']
+      for (const hypervisor of hypervisors) {
+        this.data[hypervisor] = {
+          name: hypervisor,
+          hosts: 0,
+          cpusockets: 0,
+          currentHosts: 0
+        }
+        this.callListHostsWithPage(hypervisor, 1)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.breadcrumb-card {
+  margin-left: -24px;
+  margin-right: -24px;
+  margin-top: -18px;
+  margin-bottom: 12px;
+}
+
+.row-element {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+
+.ant-breadcrumb {
+  vertical-align: text-bottom;
+}
+
+.ant-breadcrumb .anticon {
+  margin-left: 8px;
+}
+</style>
diff --git a/ui/src/views/infra/HostAdd.vue b/ui/src/views/infra/HostAdd.vue
new file mode 100644
index 0000000..73b11f2
--- /dev/null
+++ b/ui/src/views/infra/HostAdd.vue
@@ -0,0 +1,390 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form">
+
+      <div class="form__item">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.zonenamelabel') }}</div>
+        <a-select v-model="zoneId" @change="fetchPods">
+          <a-select-option
+            v-for="zone in zonesList"
+            :value="zone.id"
+            :key="zone.id">
+            {{ zone.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.podname') }}</div>
+        <a-select v-model="podId" @change="fetchClusters">
+          <a-select-option
+            v-for="pod in podsList"
+            :value="pod.id"
+            :key="pod.id">
+            {{ pod.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.clustername') }}</div>
+        <a-select v-model="clusterId" @change="handleChangeCluster">
+          <a-select-option
+            v-for="cluster in clustersList"
+            :value="cluster.id"
+            :key="cluster.id">
+            {{ cluster.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item required-field">
+        <div class="form__label"><span class="required">* </span>{{ selectedClusterHyperVisorType === 'VMware' ? $t('label.esx.host') : $t('label.hostnamelabel') }}</div>
+        <span class="required required-label">{{ $t('label.required') }}</span>
+        <a-input v-model="hostname"></a-input>
+      </div>
+
+      <div class="form__item required-field" v-if="selectedClusterHyperVisorType !== 'VMware'">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.username') }}</div>
+        <span class="required required-label">{{ $t('label.required') }}</span>
+        <a-input :placeholder="placeholder.username" v-model="username"></a-input>
+      </div>
+
+      <div class="form__item required-field" v-if="selectedClusterHyperVisorType !== 'VMware'">
+        <div class="form__label"><span class="required">* </span>{{ $t('label.password') }}</div>
+        <span class="required required-label">{{ $t('label.required') }}</span>
+        <a-input :placeholder="placeholder.password" type="password" v-model="password"></a-input>
+      </div>
+
+      <template v-if="selectedClusterHyperVisorType === 'Ovm3'">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.agent.username') }}</div>
+          <a-input v-model="agentusername"></a-input>
+        </div>
+        <div class="form__item required-field">
+          <div class="form__label"><span class="required">* </span>{{ $t('label.agent.password') }}</div>
+          <span class="required required-label">{{ $t('label.required') }}</span>
+          <a-input type="password" v-model="agentpassword"></a-input>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.agentport') }}</div>
+          <a-input v-model="agentport"></a-input>
+        </div>
+      </template>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.hosttags') }}</div>
+        <a-select
+          mode="tags"
+          :placeholder="placeholder.hosttags"
+          v-model="selectedTags"
+        >
+          <a-select-option v-for="tag in hostTagsList" :key="tag.name">{{ tag.name }}</a-select-option>
+        </a-select>
+      </div>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.isdedicated') }}</div>
+        <a-checkbox @change="toggleDedicated" />
+      </div>
+
+      <template v-if="showDedicated">
+        <DedicateDomain
+          @domainChange="id => dedicatedDomainId = id"
+          @accountChange="id => dedicatedAccount = id"
+          :error="domainError" />
+      </template>
+
+      <a-divider></a-divider>
+
+      <div class="actions">
+        <a-button @click="() => this.$parent.$parent.close()">{{ $t('label.cancel') }}</a-button>
+        <a-button @click="handleSubmitForm" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import DedicateDomain from '../../components/view/DedicateDomain'
+
+export default {
+  name: 'HostAdd',
+  components: {
+    DedicateDomain
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      loading: false,
+      zoneId: null,
+      podId: null,
+      clusterId: null,
+      hostname: null,
+      username: null,
+      password: null,
+      selectedTags: [],
+      zonesList: [],
+      clustersList: [],
+      podsList: [],
+      hostTagsList: [],
+      url: null,
+      agentusername: null,
+      agentpassword: null,
+      agentport: null,
+      selectedCluster: null,
+      selectedClusterHyperVisorType: null,
+      showDedicated: false,
+      dedicatedDomainId: null,
+      dedicatedAccount: null,
+      domainError: false,
+      params: [],
+      placeholder: {
+        username: null,
+        password: null,
+        hosttags: null
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZones()
+      this.fetchHostTags()
+      this.params = this.$store.getters.apis.addHost.params
+      Object.keys(this.placeholder).forEach(item => { this.returnPlaceholder(item) })
+    },
+    fetchZones () {
+      this.loading = true
+      api('listZones').then(response => {
+        this.zonesList = response.listzonesresponse.zone || []
+        this.zoneId = this.zonesList[0].id || null
+        this.fetchPods()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchPods () {
+      this.loading = true
+      api('listPods', {
+        zoneid: this.zoneId
+      }).then(response => {
+        this.podsList = response.listpodsresponse.pod || []
+        this.podId = this.podsList[0].id || null
+        this.fetchClusters()
+      }).catch(error => {
+        this.$notifyError(error)
+        this.podsList = []
+        this.podId = ''
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchClusters () {
+      this.loading = true
+      api('listClusters', {
+        podid: this.podId
+      }).then(response => {
+        this.clustersList = response.listclustersresponse.cluster || []
+        this.clusterId = this.clustersList[0].id || null
+        if (this.clusterId) {
+          this.handleChangeCluster()
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+        this.clustersList = []
+        this.clusterId = null
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchHostTags () {
+      this.loading = true
+      api('listHostTags').then(response => {
+        this.hostTagsList = response.listhosttagsresponse.hosttag || []
+      }).catch(error => {
+        this.$notifyError(error)
+        this.hostTagsList = []
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleChangeCluster () {
+      this.selectedCluster = this.clustersList.find(i => i.id === this.clusterId)
+      this.selectedClusterHyperVisorType = this.selectedCluster.hypervisortype
+    },
+    toggleDedicated () {
+      this.dedicatedDomainId = null
+      this.dedicatedAccount = null
+      this.showDedicated = !this.showDedicated
+    },
+    handleSubmitForm () {
+      const requiredFields = document.querySelectorAll('.required-field')
+
+      requiredFields.forEach(field => {
+        const input = field.querySelector('.ant-input')
+        if (!input.value) {
+          input.parentNode.querySelector('.required-label').classList.add('required-label--error')
+        } else {
+          input.parentNode.querySelector('.required-label').classList.remove('required-label--error')
+        }
+      })
+
+      if (this.$el.querySelectorAll('.required-label--error').length > 0) return
+
+      if (this.selectedClusterHyperVisorType === 'VMware') {
+        this.username = ''
+        this.password = ''
+      }
+
+      if (this.hostname.indexOf('http://') === -1) {
+        this.url = `http://${this.hostname}`
+      } else {
+        this.url = this.hostname
+      }
+
+      const args = {
+        zoneid: this.zoneId,
+        podid: this.podId,
+        clusterid: this.clusterId,
+        hypervisor: this.selectedClusterHyperVisorType,
+        clustertype: this.selectedCluster.clustertype,
+        hosttags: this.selectedTags.join(),
+        username: this.username,
+        password: this.password,
+        url: this.url,
+        agentusername: this.agentusername,
+        agentpassword: this.agentpassword,
+        agentport: this.agentport
+      }
+      Object.keys(args).forEach((key) => (args[key] == null) && delete args[key])
+
+      this.loading = true
+      api('addHost', {}, 'POST', args).then(response => {
+        const host = response.addhostresponse.host[0] || {}
+        if (host.id && this.showDedicated) {
+          this.dedicateHost(host.id)
+        }
+        this.parentFetchData()
+        this.$parent.$parent.close()
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.addhostresponse.errortext,
+          duration: 0
+        })
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    dedicateHost (hostId) {
+      this.loading = true
+      api('dedicateHost', {
+        hostId,
+        domainId: this.dedicatedDomainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicatehostresponse.jobid,
+          successMessage: this.$t('message.host.dedicated'),
+          successMethod: () => {
+            this.loading = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.host.dedicated'),
+              jobid: response.dedicatehostresponse.jobid,
+              description: `${this.$t('label.domainid')} : ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.host.failed'),
+          errorMethod: () => {
+            this.loading = false
+          },
+          loadingMessage: this.$t('message.dedicating.host'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loading = false
+          }
+        })
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+        this.loading = false
+      })
+    },
+    returnPlaceholder (field) {
+      this.params.find(i => {
+        if (i.name === field) this.placeholder[field] = i.description
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+    &__label {
+      margin-bottom: 5px;
+    }
+    &__item {
+      margin-bottom: 20px;
+    }
+    .ant-select {
+      width: 85vw;
+      @media (min-width: 760px) {
+        width: 400px;
+      }
+    }
+  }
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .required {
+    color: #ff0000;
+    &-label {
+      display: none;
+      &--error {
+        display: block;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/HostInfo.vue b/ui/src/views/infra/HostInfo.vue
new file mode 100644
index 0000000..a28a808
--- /dev/null
+++ b/ui/src/views/infra/HostInfo.vue
@@ -0,0 +1,157 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-list size="small">
+      <a-list-item>
+        <div>
+          <strong>{{ $t('label.hypervisorversion') }}</strong>
+          <div>
+            {{ host.hypervisor }}
+            <span v-if="host.hypervisorversion">
+              {{ host.hypervisorversion }}
+            </span>
+            <span v-else-if="host.details">
+              {{ host.details['Host.OS'] + ' ' + host.details['Host.OS.Version'] }}
+            </span>
+            <span v-else>
+              {{ host.version }}
+            </span>
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.details && host.details.secured">
+        <div>
+          <strong>{{ $t('label.secured') }}</strong>
+          <div>
+            {{ host.details.secured }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item>
+        <div>
+          <strong>{{ $t('label.hosttags') }}</strong>
+          <div>
+            {{ host.hosttags }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item>
+        <div>
+          <strong>{{ $t('label.oscategoryid') }}</strong>
+          <div>
+            {{ host.oscategoryname }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.outofbandmanagement">
+        <div>
+          <strong>{{ $t('label.outofbandmanagement') }}</strong>
+          <div>
+            {{ host.outofbandmanagement.enabled }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.outofbandmanagement">
+        <div>
+          <strong>{{ $t('label.powerstate') }}</strong>
+          <div>
+            {{ host.outofbandmanagement.powerstate }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.hostha">
+        <div>
+          <strong>{{ $t('label.haenable') }}</strong>
+          <div>
+            {{ host.hostha.haenable }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.hostha">
+        <div>
+          <strong>{{ $t('label.hastate') }}</strong>
+          <div>
+            {{ host.hostha.hastate }}
+          </div>
+        </div>
+      </a-list-item>
+      <a-list-item v-if="host.hostha">
+        <div>
+          <strong>{{ $t('label.haprovider') }}</strong>
+          <div>
+            {{ host.hostha.haprovider }}
+          </div>
+        </div>
+      </a-list-item>
+
+    </a-list>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'HostInfo',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      host: {},
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (this.resource && this.resource.id && newItem && newItem.id !== oldItem.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.dataSource = []
+      this.itemCount = 0
+      this.fetchLoading = true
+      api('listHosts', { id: this.resource.id }).then(json => {
+        this.host = json.listhostsresponse.host[0]
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>
diff --git a/ui/src/views/infra/InfraSummary.vue b/ui/src/views/infra/InfraSummary.vue
new file mode 100644
index 0000000..bf47aa2
--- /dev/null
+++ b/ui/src/views/infra/InfraSummary.vue
@@ -0,0 +1,386 @@
+// 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>
+  <a-row :gutter="12">
+    <a-col :md="24">
+      <a-card class="breadcrumb-card">
+        <a-col :md="24" style="display: flex">
+          <breadcrumb style="padding-top: 6px; padding-left: 8px" />
+          <a-button
+            style="margin-left: 12px; margin-top: 4px"
+            :loading="loading"
+            icon="reload"
+            size="small"
+            shape="round"
+            @click="fetchData()" >
+            {{ $t('label.refresh') }}
+          </a-button>
+          <a-button
+            style="margin-left: 12px; margin-top: 4px"
+            icon="safety-certificate"
+            size="small"
+            shape="round"
+            @click="sslFormVisible = true">
+            {{ $t('label.sslcertificates') }}
+          </a-button>
+          <a-modal
+            :title="$t('label.sslcertificates')"
+            :visible="sslFormVisible"
+            :footer="null"
+            :maskClosable="false"
+            :cancelText="$t('label.cancel')"
+            @cancel="sslModalClose">
+            <p>
+              {{ $t('message.update.ssl') }}
+            </p>
+
+            <a-form @submit.prevent="handleSslFormSubmit" ref="sslForm" :form="form">
+              <a-form-item :required="true">
+                <span slot="label">
+                  {{ $t('label.root.certificate') }}
+                  <a-tooltip placement="bottom" :title="apiParams.name.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-textarea
+                  id="rootCert"
+                  rows="2"
+                  :placeholder="$t('label.root.certificate')"
+                  :autoFocus="true"
+                  name="rootCert"
+                  v-decorator="[
+                    'root',
+                    {rules: [{ required: true, message: `${$t('label.required')}` }], validateTrigger:'change'}
+                  ]"
+                ></a-textarea>
+              </a-form-item>
+
+              <transition-group name="fadeInUp" tag="div">
+                <a-form-item
+                  v-for="(item, index) in intermediateCertificates"
+                  :key="`key-${index}`"
+                  class="intermediate-certificate">
+                  <span slot="label">
+                    {{ $t('label.intermediate.certificate') + ` ${index + 1} ` }}
+                    <a-tooltip placement="bottom" :title="apiParams.id.description">
+                      <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                    </a-tooltip>
+                  </span>
+                  <a-textarea
+                    :id="`intermediateCert${index}`"
+                    rows="2"
+                    :placeholder="$t('label.intermediate.certificate') + ` ${index + 1}`"
+                    :name="`intermediateCert${index}`"
+                    v-decorator="[
+                      `intermediate${index + 1}`,
+                      {validateTrigger:'change'}
+                    ]"
+                  ></a-textarea>
+                </a-form-item>
+              </transition-group>
+
+              <a-form-item>
+                <a-button @click="addIntermediateCert">
+                  <a-icon type="plus-circle" />
+                  {{ $t('label.add.intermediate.certificate') }}
+                </a-button>
+              </a-form-item>
+
+              <a-form-item :required="true">
+                <span slot="label">
+                  {{ $t('label.server.certificate') }}
+                  <a-tooltip placement="bottom" :title="apiParams.certificate.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-textarea
+                  id="serverCert"
+                  rows="2"
+                  :placeholder="$t('label.server.certificate')"
+                  name="serverCert"
+                  v-decorator="[
+                    'server',
+                    {rules: [{ required: true, message: `${$t('label.required')}` }], validateTrigger:'change'}
+                  ]"
+                ></a-textarea>
+              </a-form-item>
+
+              <a-form-item :required="true">
+                <span slot="label">
+                  {{ $t('label.pkcs.private.certificate') }}
+                  <a-tooltip placement="bottom" :title="apiParams.privatekey.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-textarea
+                  id="pkcsKey"
+                  rows="2"
+                  :placeholder="$t('label.pkcs.private.certificate')"
+                  name="pkcsKey"
+                  v-decorator="[
+                    'pkcs',
+                    {rules: [{ required: true, message: `${$t('label.required')}` }], validateTrigger:'change'}
+                  ]"
+                ></a-textarea>
+              </a-form-item>
+
+              <a-form-item :required="true">
+                <span slot="label">
+                  {{ $t('label.domain.suffix') }}
+                  <a-tooltip placement="bottom" :title="apiParams.domainsuffix.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-input
+                  id="dnsSuffix"
+                  :placeholder="$t('label.domain.suffix')"
+                  name="dnsSuffix"
+                  v-decorator="[
+                    'dns',
+                    {rules: [{ required: true, message: `${$t('label.required')}` }], validateTrigger:'change'}
+                  ]"
+                ></a-input>
+              </a-form-item>
+
+              <a-form-item class="controls">
+                <a-button @click="this.sslModalClose" class="close-button">
+                  {{ $t('label.cancel' ) }}
+                </a-button>
+                <a-button type="primary" htmlType="submit" :loading="sslFormSubmitting">
+                  {{ $t('label.submit' ) }}
+                </a-button>
+              </a-form-item>
+            </a-form>
+          </a-modal>
+        </a-col>
+      </a-card>
+    </a-col>
+    <a-col
+      :md="6"
+      style="margin-bottom: 12px"
+      v-for="(section, index) in sections"
+      v-if="routes[section]"
+      :key="index">
+      <chart-card :loading="loading">
+        <div class="chart-card-inner">
+          <router-link :to="{ name: section.substring(0, section.length - 1) }">
+            <h2>{{ $t(routes[section].title) }}</h2>
+            <h2><a-icon :type="routes[section].icon" /> {{ stats[section] }}</h2>
+          </router-link>
+        </div>
+      </chart-card>
+    </a-col>
+  </a-row>
+</template>
+
+<script>
+import { api } from '@/api'
+import router from '@/router'
+
+import Breadcrumb from '@/components/widgets/Breadcrumb'
+import ChartCard from '@/components/widgets/ChartCard'
+
+export default {
+  name: 'InfraSummary',
+  components: {
+    Breadcrumb,
+    ChartCard
+  },
+  data () {
+    return {
+      loading: true,
+      routes: {},
+      sections: ['zones', 'pods', 'clusters', 'hosts', 'storagepools', 'imagestores', 'systemvms', 'routers', 'cpusockets', 'managementservers', 'alerts', 'ilbvms'],
+      sslFormVisible: false,
+      stats: {},
+      intermediateCertificates: [],
+      sslFormSubmitting: false,
+      maxCerts: 0
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.uploadCustomCertificate || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.routes = {}
+      for (const section of this.sections) {
+        const node = router.resolve({ name: section.substring(0, section.length - 1) })
+        this.routes[section] = {
+          title: node.route.meta.title,
+          icon: node.route.meta.icon
+        }
+      }
+      this.listInfra()
+    },
+    listInfra () {
+      this.loading = true
+      api('listInfrastructure').then(json => {
+        this.stats = []
+        if (json && json.listinfrastructureresponse && json.listinfrastructureresponse.infrastructure) {
+          this.stats = json.listinfrastructureresponse.infrastructure
+        }
+      }).finally(f => {
+        this.loading = false
+      })
+    },
+
+    resetSslFormData () {
+      this.form.resetFields()
+      this.intermediateCertificates = []
+      this.sslFormSubmitting = false
+      this.sslFormVisible = false
+    },
+
+    sslModalClose () {
+      this.resetSslFormData()
+    },
+
+    addIntermediateCert () {
+      this.intermediateCertificates.push('')
+    },
+
+    pollActionCompletion (jobId, count) {
+      api('queryAsyncJobResult', { jobid: jobId }).then(json => {
+        const result = json.queryasyncjobresultresponse
+        if (result.jobstatus === 1 && this.maxCerts === count) {
+          this.$message.success(`${this.$t('label.certificate.upload')}: ${result.jobresult.customcertificate.message}`)
+          this.$notification.success({
+            message: this.$t('label.certificate.upload'),
+            description: result.jobresult.customcertificate.message || this.$t('message.success.certificate.upload')
+          })
+        } else if (result.jobstatus === 2) {
+          this.$notification.error({
+            message: this.$t('label.certificate.upload.failed'),
+            description: result.jobresult.errortext || this.$t('label.certificate.upload.failed.description'),
+            duration: 0
+          })
+        } else if (result.jobstatus === 0) {
+          this.$message
+            .loading(`${this.$t('message.certificate.upload.processing')}: ${count}`, 2)
+            .then(() => this.pollActionCompletion(jobId, count))
+        }
+      }).catch(e => {
+        console.log(this.$t('error.fetching.async.job.result') + e)
+      })
+    },
+
+    handleSslFormSubmit () {
+      this.sslFormSubmitting = true
+
+      this.form.validateFields(errors => {
+        if (errors) {
+          this.sslFormSubmitting = false
+          return
+        }
+
+        const formValues = this.form.getFieldsValue()
+
+        this.maxCerts = 2 + Object.keys(formValues).length
+        let count = 1
+        let data = {
+          id: count,
+          certificate: formValues.root,
+          domainsuffix: formValues.dns,
+          name: 'root'
+        }
+        api('uploadCustomCertificate', {}, 'POST', data).then(response => {
+          this.pollActionCompletion(response.uploadcustomcertificateresponse.jobid, count)
+        }).then(() => {
+          this.sslModalClose()
+        })
+
+        Object.keys(formValues).forEach(key => {
+          if (key.includes('intermediate')) {
+            count = count + 1
+            const data = {
+              id: count,
+              certificate: formValues[key],
+              domainsuffix: formValues.dns,
+              name: key
+            }
+            api('uploadCustomCertificate', {}, 'POST', data).then(response => {
+              this.pollActionCompletion(response.uploadcustomcertificateresponse.jobid, count)
+            }).then(() => {
+              this.sslModalClose()
+            })
+          }
+        })
+
+        count = count <= 2 ? 3 : count + 1
+        data = {
+          id: count,
+          certificate: formValues.server,
+          domainsuffix: formValues.dns,
+          privatekey: formValues.pkcs
+        }
+        api('uploadCustomCertificate', {}, 'POST', data).then(response => {
+          this.pollActionCompletion(response.uploadcustomcertificateresponse.jobid, count)
+        }).then(() => {
+          this.sslModalClose()
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+  .breadcrumb-card {
+    margin-left: -24px;
+    margin-right: -24px;
+    margin-top: -16px;
+    margin-bottom: 12px;
+  }
+
+  .chart-card-inner {
+    text-align: center;
+    white-space: nowrap;
+    overflow: hidden;
+  }
+  .intermediate-certificate {
+    opacity: 1;
+    transform: none;
+    transition: opacity 0.2s ease 0s, transform 0.5s ease;
+    will-change: transform;
+  }
+  .intermediate-certificate.fadeInUp-enter-active {
+    opacity: 0;
+    transform: translateY(10px);
+    transition: none;
+  }
+  .controls {
+    display: flex;
+    justify-content: flex-end;
+  }
+  .close-button {
+    margin-right: 20px;
+  }
+  .ant-form-item {
+    margin-bottom: 10px;
+  }
+</style>
diff --git a/ui/src/views/infra/MigrateData.vue b/ui/src/views/infra/MigrateData.vue
new file mode 100644
index 0000000..56449d4
--- /dev/null
+++ b/ui/src/views/infra/MigrateData.vue
@@ -0,0 +1,225 @@
+// 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
+          :label="$t('migrate.from')">
+          <a-select
+            v-decorator="['srcpool', {
+              initialValue: selectedStore,
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.error.select'),
+                }]
+            }]"
+            :loading="loading"
+            @change="val => { selectedStore = val }"
+          >
+            <a-select-option
+              v-for="store in imageStores"
+              :key="store.id"
+            >{{ store.name || opt.url }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item
+          :label="$t('migrate.to')">
+          <a-select
+            v-decorator="['destpools', {
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.select.destination.image.stores'),
+                }]
+            }]"
+            mode="multiple"
+            :loading="loading"
+          >
+            <a-select-option
+              v-for="store in imageStores"
+              v-if="store.id !== selectedStore"
+              :key="store.id"
+            >{{ store.name || opt.url }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('migrationPolicy')">
+          <a-select
+            v-decorator="['migrationtype', {
+              initialValue: 'Complete',
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.select.migration.policy'),
+                }]
+            }]"
+            :loading="loading"
+          >
+            <a-select-option value="Complete">{{ $t('label.complete') }}</a-select-option>
+            <a-select-option value="Balance">{{ $t('label.balance') }}</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: 'MigrateData',
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      imageStores: [],
+      loading: false,
+      selectedStore: ''
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchImageStores()
+  },
+  methods: {
+    fetchImageStores () {
+      this.loading = true
+      api('listImageStores').then(json => {
+        this.imageStores = json.listimagestoresresponse.imagestore || []
+        this.selectedStore = this.imageStores[0].id || ''
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          if (key === 'destpools') {
+            params[key] = input.join(',')
+          } else {
+            params[key] = input
+          }
+        }
+
+        const title = this.$t('message.data.migration')
+        this.loading = true
+
+        const result = this.migrateData(params, title)
+        result.then(json => {
+          const result = json.jobresult
+          const success = result.imagestore.success || false
+          const message = result.imagestore.message || ''
+          if (success) {
+            this.$notification.success({
+              message: title,
+              description: message
+            })
+          } else {
+            this.$notification.error({
+              message: title,
+              description: message,
+              duration: 0
+            })
+          }
+          this.parentFetchData()
+          this.closeAction()
+        }).catch(error => {
+          console.log(error)
+        })
+        setTimeout(() => {
+          this.$message.loading({ content: this.$t('label.migrating.data'), duration: 1 })
+          this.loading = false
+          this.closeAction()
+        }, 200)
+      })
+    },
+    migrateData (args, title) {
+      return new Promise((resolve, reject) => {
+        api('migrateSecondaryStorageData', args).then(async json => {
+          const jobId = json.migratesecondarystoragedataresponse.jobid
+          if (jobId) {
+            this.$store.dispatch('AddAsyncJob', {
+              title: title,
+              jobid: jobId,
+              description: this.$t('message.data.migration.progress'),
+              status: 'progress',
+              silent: true
+            })
+            const result = await this.pollJob(jobId, title)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId, title) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 85vw;
+
+  @media (min-width: 1000px) {
+    width: 40vw;
+  }
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/infra/PodAdd.vue b/ui/src/views/infra/PodAdd.vue
new file mode 100644
index 0000000..b06373f
--- /dev/null
+++ b/ui/src/views/infra/PodAdd.vue
@@ -0,0 +1,298 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-form :form="form" layout="vertical" class="form">
+
+      <a-form-item class="form__item" :label="$t('label.zone')">
+        <a-select
+          v-decorator="['zoneid', {
+            initialValue: this.zoneId,
+            rules: [{ required: true, message: `${$t('label.required')}` }] }
+          ]">
+          <a-select-option
+            v-for="zone in zonesList"
+            :value="zone.id"
+            :key="zone.id">
+            {{ zone.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+
+      <a-form-item class="form__item" :label="$t('label.podname')">
+        <a-input
+          :placeholder="placeholder.name"
+          v-decorator="[
+            'name',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+        />
+      </a-form-item>
+
+      <a-form-item class="form__item" :label="$t('label.reservedsystemgateway')">
+        <a-input
+          :placeholder="placeholder.gateway"
+          v-decorator="[
+            'gateway',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+        />
+      </a-form-item>
+
+      <a-form-item class="form__item" :label="$t('label.reservedsystemnetmask')">
+        <a-input
+          :placeholder="placeholder.netmask"
+          v-decorator="[
+            'netmask',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+        />
+      </a-form-item>
+
+      <a-form-item class="form__item" :label="$t('label.reservedsystemstartip')">
+        <a-input
+          :placeholder="placeholder.startip"
+          v-decorator="[
+            'startip',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+        />
+      </a-form-item>
+
+      <a-form-item class="form__item" :label="$t('label.reservedsystemendip')">
+        <a-input
+          :placeholder="placeholder.endip"
+          v-decorator="['endip']"
+        />
+      </a-form-item>
+
+      <div class="form__item">
+        <div class="form__label">{{ $t('label.isdedicated') }}</div>
+        <a-checkbox @change="toggleDedicate" />
+      </div>
+
+      <template v-if="showDedicated">
+        <DedicateDomain
+          @domainChange="id => dedicatedDomainId = id"
+          @accountChange="id => dedicatedAccount = id"
+          :error="domainError" />
+      </template>
+
+      <a-divider></a-divider>
+
+      <div class="actions">
+        <a-button @click="() => this.$parent.$parent.close()">{{ $t('label.cancel') }}</a-button>
+        <a-button @click="handleSubmit" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </a-form>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import DedicateDomain from '../../components/view/DedicateDomain'
+
+export default {
+  name: 'ClusterAdd',
+  components: {
+    DedicateDomain
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      loading: false,
+      zonesList: [],
+      zoneId: null,
+      showDedicated: false,
+      dedicatedDomainId: null,
+      dedicatedAccount: null,
+      domainError: false,
+      params: [],
+      placeholder: {
+        name: null,
+        gateway: null,
+        netmask: null,
+        startip: null,
+        endip: null
+      }
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZones()
+    },
+    fetchZones () {
+      this.loading = true
+      api('listZones').then(response => {
+        this.zonesList = response.listzonesresponse.zone || []
+        this.zoneId = this.zonesList[0].id
+        this.params = this.$store.getters.apis.createPod.params
+        Object.keys(this.placeholder).forEach(item => { this.returnPlaceholder(item) })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    toggleDedicate () {
+      this.dedicatedDomainId = null
+      this.dedicatedAccount = null
+      this.showDedicated = !this.showDedicated
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) return
+
+        this.loading = true
+        api('createPod', {
+          zoneId: values.zoneid,
+          name: values.name,
+          gateway: values.gateway,
+          netmask: values.netmask,
+          startip: values.startip,
+          endip: values.endip
+        }).then(response => {
+          const pod = response.createpodresponse.pod || {}
+          if (pod.id && this.showDedicated) {
+            this.dedicatePod(pod.id)
+          }
+          this.loading = false
+          this.parentFetchData()
+          this.$parent.$parent.close()
+        }).catch(error => {
+          this.$notification.error({
+            message: `${this.$t('label.error')} ${error.response.status}`,
+            description: error.response.data.createpodresponse.errortext,
+            duration: 0
+          })
+          this.loading = false
+        })
+      })
+    },
+    dedicatePod (podId) {
+      this.loading = true
+      api('dedicatePod', {
+        podId,
+        domainid: this.dedicatedDomainId,
+        account: this.dedicatedAccount
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.dedicatepodresponse.jobid,
+          successMessage: this.$t('message.pod.dedicated'),
+          successMethod: () => {
+            this.loading = false
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.pod.dedicated'),
+              jobid: response.dedicatepodresponse.jobid,
+              description: `${this.$t('label.domainid')} : ${this.dedicatedDomainId}`,
+              status: 'progress'
+            })
+          },
+          errorMessage: this.$t('error.dedicate.pod.failed'),
+          errorMethod: () => {
+            this.loading = false
+          },
+          loadingMessage: this.$t('message.dedicating.pod'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.loading = false
+          }
+        })
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+        this.loading = false
+      })
+    },
+    returnPlaceholder (field) {
+      this.params.find(i => {
+        if (i.name === field) this.placeholder[field] = i.description
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+
+    &__label {
+      margin-bottom: 5px;
+    }
+
+    &__item {
+      margin-bottom: 20px;
+    }
+
+    .ant-select {
+      width: 85vw;
+
+      @media (min-width: 760px) {
+        width: 400px;
+      }
+    }
+
+  }
+
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+
+  }
+
+  .required {
+    color: #ff0000;
+
+    &-label {
+      display: none;
+
+      &--visible {
+        display: block;
+      }
+
+    }
+
+  }
+</style>
diff --git a/ui/src/views/infra/Resources.vue b/ui/src/views/infra/Resources.vue
new file mode 100644
index 0000000..aba42ef
--- /dev/null
+++ b/ui/src/views/infra/Resources.vue
@@ -0,0 +1,162 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-list>
+      <a-list-item v-for="item in resourcesList" :key="item.id" class="list-item">
+        <div class="list-item__container">
+          <div class="list-item__data list-item__title">{{ returnCapacityTitle(item.type) }}</div>
+          <div class="list-item__vals">
+            <div class="list-item__data">
+              Allocated:
+              {{ convertByType(item.type, item.capacityused) }} / {{ convertByType(item.type, item.capacitytotal) }}
+            </div>
+            <a-progress
+              status="normal"
+              :percent="parseFloat(item.percentused)"
+              :format="p => parseFloat(item.percentused).toFixed(2) + '%'" />
+          </div>
+        </div>
+      </a-list-item>
+    </a-list>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'Resources',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (this.resource && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      resourcesList: []
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const entity = this.$route.meta.name + 'id'
+      const params = {}
+      params[entity] = this.resource.id
+      this.fetchLoading = true
+      api('listCapacity', params).then(response => {
+        this.resourcesList = response.listcapacityresponse.capacity
+        this.animatePercentVals()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    animatePercentVals () {
+      this.resourcesList.forEach(resource => {
+        const percent = resource.percentused
+        resource.percentused = 0
+        setTimeout(() => {
+          resource.percentused = percent
+        }, 200)
+      })
+    },
+    convertBytes (val) {
+      if (val < 1024 * 1024) return `${(val / 1024).toFixed(2)} KB`
+      if (val < 1024 * 1024 * 1024) return `${(val / 1024 / 1024).toFixed(2)} MB`
+      if (val < 1024 * 1024 * 1024 * 1024) return `${(val / 1024 / 1024 / 1024).toFixed(2)} GB`
+      if (val < 1024 * 1024 * 1024 * 1024 * 1024) return `${(val / 1024 / 1024 / 1024 / 1024).toFixed(2)} TB`
+      return val
+    },
+    convertHz (val) {
+      if (val < 1000) return `${val} Mhz`
+      return `${(val / 1000).toFixed(2)} GHz`
+    },
+    convertByType (type, val) {
+      switch (type) {
+        case 0: return this.convertBytes(val)
+        case 1: return this.convertHz(val)
+        case 2: return this.convertBytes(val)
+        case 3: return this.convertBytes(val)
+        case 6: return this.convertBytes(val)
+        case 9: return this.convertBytes(val)
+        case 11: return this.convertBytes(val)
+        default: return val
+      }
+    },
+    returnCapacityTitle (type) {
+      switch (type) {
+        case 0: return this.$t('label.memory')
+        case 1: return this.$t('label.cpu')
+        case 2: return this.$t('label.primary.storage.used')
+        case 3: return this.$t('label.primary.storage.allocated')
+        case 4: return this.$t('label.public.ips')
+        case 5: return this.$t('label.management.ips')
+        case 6: return this.$t('label.secondary.storage')
+        case 7: return this.$t('label.vlan')
+        case 8: return this.$t('label.direct.ips')
+        case 9: return this.$t('label.local.storage')
+        case 19: return this.$t('label.gpu')
+        case 90: return this.$t('label.num.cpu.cores')
+        default: return ''
+      }
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .list-item {
+
+    &__container {
+      max-width: 90%;
+      width: 100%;
+
+      @media (min-width: 760px) {
+        max-width: 95%;
+      }
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__data {
+      margin-right: 20px;
+      white-space: nowrap;
+    }
+
+    &__vals {
+      @media (min-width: 760px) {
+        display: flex;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/network/DedicatedVLANTab.vue b/ui/src/views/infra/network/DedicatedVLANTab.vue
new file mode 100644
index 0000000..f82c224
--- /dev/null
+++ b/ui/src/views/infra/network/DedicatedVLANTab.vue
@@ -0,0 +1,418 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-button
+      :disabled="!('dedicateGuestVlanRange' in $store.getters.apis)"
+      type="dashed"
+      icon="plus"
+      style="width: 100%"
+      @click="handleOpenModal">{{ $t('label.dedicate.vlan.vni.range') }}</a-button>
+    <a-table
+      size="small"
+      style="overflow-y: auto; margin-top: 20px;"
+      :loading="fetchLoading"
+      :columns="columns"
+      :dataSource="items"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <template slot="actions" slot-scope="record">
+        <a-popconfirm
+          :title="`${$t('label.delete')}?`"
+          @confirm="handleDelete(record)"
+          :okText="$t('label.yes')"
+          :cancelText="$t('label.no')"
+          placement="top"
+        >
+          <a-button :disabled="!('releaseDedicatedGuestVlanRange' in $store.getters.apis)" icon="delete" type="danger" shape="circle"></a-button>
+        </a-popconfirm>
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-model="modal"
+      :title="$t('label.dedicate.vlan.vni.range')"
+      :maskClosable="false"
+      @ok="handleSubmit">
+      <a-spin :spinning="formLoading">
+        <a-form
+          :form="form"
+          @submit="handleSubmit"
+          layout="vertical" >
+          <a-form-item :label="$t('label.vlanrange')">
+            <a-input
+              v-decorator="['range', {
+                rules: [{ required: true, message: `${$t('label.required')}` }]
+              }]"
+            ></a-input>
+          </a-form-item>
+
+          <a-form-item :label="$t('label.scope')">
+            <a-select defaultValue="account" v-model="selectedScope" @change="handleScopeChange">
+              <a-select-option value="account">{{ $t('label.account') }}</a-select-option>
+              <a-select-option value="project">{{ $t('label.project') }}</a-select-option>
+            </a-select>
+          </a-form-item>
+
+          <a-form-item :label="$t('label.domain')">
+            <a-select
+              @change="handleDomainChange"
+              v-decorator="['domain', {
+                rules: [{ required: true, message: `${$t('label.required')}` }]
+              }]"
+            >
+              <a-select-option v-for="domain in domains" :key="domain.id" :value="domain.id">{{ domain.name }}</a-select-option>
+            </a-select>
+          </a-form-item>
+
+          <a-form-item :label="$t('label.account')" v-if="selectedScope === 'account'">
+            <a-select
+              v-decorator="['account', {
+                rules: [{ required: true, message: `${$t('label.required')}` }]
+              }]"
+            >
+              <a-select-option
+                v-for="account in accounts"
+                :key="account.id"
+                :value="account.name">
+                {{ account.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+
+          <a-form-item :label="$t('label.project')" v-if="selectedScope === 'project'">
+            <a-select
+              v-decorator="['project', {
+                rules: [{ required: true, message: `${$t('label.required')}` }]
+              }]"
+            >
+              <a-select-option
+                v-for="project in projects"
+                :key="project.id"
+                :value="project.id">
+                {{ project.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'DedicatedVLANTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  inject: ['parentStartLoading', 'parentFinishLoading'],
+  data () {
+    return {
+      fetchLoading: false,
+      formLoading: false,
+      items: [],
+      domains: [],
+      accounts: [],
+      projects: [],
+      modal: false,
+      selectedScope: 'account',
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.vlanrange'),
+          dataIndex: 'guestvlanrange'
+        },
+        {
+          title: this.$t('label.domain'),
+          dataIndex: 'domain'
+        },
+        {
+          title: this.$t('label.account'),
+          dataIndex: 'account'
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.form.resetFields()
+      this.formLoading = true
+      api('listDedicatedGuestVlanRanges', {
+        physicalnetworkid: this.resource.id,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.items = response.listdedicatedguestvlanrangesresponse.dedicatedguestvlanrange || []
+        this.totalCount = response.listdedicatedguestvlanrangesresponse.count || 0
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+      }).finally(() => {
+        this.formLoading = false
+        this.parentFinishLoading()
+      })
+    },
+    fetchDomains () {
+      api('listDomains', {
+        details: 'min',
+        listAll: true
+      }).then(response => {
+        this.domains = response.listdomainsresponse.domain || []
+        if (this.domains.length > 0) {
+          this.form.setFieldsValue({
+            domain: this.domains[0].id
+          })
+          this.fetchAccounts(this.form.getFieldValue('domain'))
+        } else {
+          this.form.setFieldsValue({
+            domain: null
+          })
+        }
+        this.formLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.formLoading = false
+      })
+    },
+    fetchAccounts (e) {
+      this.formLoading = true
+      api('listAccounts', {
+        domainid: e,
+        details: 'min',
+        listAll: true
+      }).then(response => {
+        this.accounts = response.listaccountsresponse.account
+          ? response.listaccountsresponse.account : []
+        if (this.accounts.length > 0) {
+          this.form.setFieldsValue({
+            account: this.accounts[0].name
+          })
+        } else {
+          this.form.setFieldsValue({
+            account: null
+          })
+        }
+        this.formLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.formLoading = false
+      })
+    },
+    fetchProjects (e) {
+      this.formLoading = true
+      api('listProjects', {
+        domainid: e,
+        details: 'min'
+      }).then(response => {
+        this.projects = response.listprojectsresponse.project
+          ? response.listprojectsresponse.project : []
+        if (this.projects.length > 0) {
+          this.form.setFieldsValue({
+            project: this.projects[0].id
+          })
+        } else {
+          this.form.setFieldsValue({
+            project: null
+          })
+        }
+        this.formLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.formLoading = false
+      })
+    },
+    handleDelete (item) {
+      this.parentStartLoading()
+      api('releaseDedicatedGuestVlanRange', {
+        id: item.id
+      }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: `${this.$t('label.delete.dedicated.vlan.range')} ${item.guestvlanrange} ${this.$t('label.for')} ${item.account}`,
+          jobid: response.releasededicatedguestvlanrangeresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.releasededicatedguestvlanrangeresponse.jobid,
+          successMethod: () => {
+            this.fetchData()
+            this.parentFinishLoading()
+          },
+          errorMessage: this.$t('label.deleting.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.parentFinishLoading()
+          },
+          loadingMessage: `${this.$t('label.deleting')} ${item.id}`,
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.parentFinishLoading()
+          }
+        })
+      }).catch(error => {
+        console.log(error)
+        this.$message.error(this.$t('message.fail.to.delete'))
+        this.fetchData()
+        this.parentFinishLoading()
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(errors => {
+        if (errors) return
+
+        this.formLoading = true
+        this.parentStartLoading()
+        const fieldValues = this.form.getFieldsValue()
+
+        api('dedicateGuestVlanRange', {
+          physicalnetworkid: this.resource.id,
+          vlanrange: fieldValues.range,
+          domainid: fieldValues.domain,
+          account: fieldValues.account,
+          projectid: fieldValues.project
+        }).then(response => {
+          this.modal = false
+          this.fetchData()
+        }).catch(error => {
+          this.$notifyError(error)
+          this.modal = false
+          this.fetchData()
+        })
+      })
+    },
+    fetchBasedOnScope (e) {
+      if (e === 'account') this.fetchAccounts(this.form.getFieldValue('domain'))
+      if (e === 'project') this.fetchProjects(this.form.getFieldValue('domain'))
+    },
+    handleDomainChange () {
+      setTimeout(() => {
+        this.fetchBasedOnScope(this.selectedScope)
+      }, 100)
+    },
+    handleScopeChange (e) {
+      this.fetchBasedOnScope(e)
+    },
+    handleOpenModal () {
+      this.modal = true
+      this.formLoading = true
+      this.fetchDomains()
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__label {
+    font-weight: bold;
+  }
+
+  &__col {
+    flex: 1;
+
+    @media (min-width: 480px) {
+      &:not(:last-child) {
+        margin-right: 20px;
+      }
+    }
+  }
+
+  &__item {
+    margin-right: -8px;
+
+    &-outer-container {
+      width: 100%;
+    }
+
+    &-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 480px) {
+        flex-direction: row;
+        margin-bottom: 10px;
+      }
+    }
+  }
+}
+
+.pagination {
+  margin-top: 20px;
+}
+</style>
diff --git a/ui/src/views/infra/network/EditTrafficLabel.vue b/ui/src/views/infra/network/EditTrafficLabel.vue
new file mode 100644
index 0000000..e36b70b
--- /dev/null
+++ b/ui/src/views/infra/network/EditTrafficLabel.vue
@@ -0,0 +1,235 @@
+// 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" :loading="loading" @submit="handleSubmit" layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.traffictype') }}
+            <a-tooltip :title="apiParams.id.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['id', {
+              initialValue: selectedType,
+              rules: [{ required: true, message: $t('message.error.select') }] }]"
+            :loading="typeLoading"
+            :placeholder="apiParams.id.description"
+            @change="onChangeTrafficType">
+            <a-select-option v-for="type in trafficTypes" :key="type.id">
+              {{ type.traffictype }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.kvmnetworklabel') }}
+            <a-tooltip :title="apiParams.kvmnetworklabel.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['kvmnetworklabel', {
+              initialValue: trafficResource.kvmnetworklabel
+            }]"
+            :placeholder="$t('label.network.label.display.for.blank.value')" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.vmwarenetworklabel') }}
+            <a-tooltip :title="apiParams.vmwarenetworklabel.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['vmwarenetworklabel', {
+              initialValue: trafficResource.vmwarenetworklabel
+            }]"
+            :placeholder="$t('label.network.label.display.for.blank.value')" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.xennetworklabel') }}
+            <a-tooltip :title="apiParams.xennetworklabel.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['xennetworklabel', {
+              initialValue: trafficResource.xennetworklabel
+            }]"
+            :placeholder="$t('label.network.label.display.for.blank.value')" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.hypervnetworklabel') }}
+            <a-tooltip :title="apiParams.hypervnetworklabel.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['hypervnetworklabel', {
+              initialValue: trafficResource.hypervnetworklabel
+            }]"
+            :placeholder="$t('label.network.label.display.for.blank.value')" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.ovm3networklabel') }}
+            <a-tooltip :title="apiParams.ovm3networklabel.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['ovm3networklabel', {
+              initialValue: trafficResource.ovm3networklabel
+            }]"
+            :placeholder="$t('label.network.label.display.for.blank.value')" />
+        </a-form-item>
+        <div :span="24" class="action-button">
+          <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+          <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+        </div>
+      </a-form>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'EditTrafficLabel',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      selectedType: undefined,
+      typeLoading: false,
+      traffictype: null,
+      trafficTypes: [],
+      trafficResource: {}
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.updateTrafficType || {}
+    this.apiParams = {}
+    if (this.apiConfig.params) {
+      this.apiConfig.params.forEach(param => {
+        this.apiParams[param.name] = param
+      })
+    }
+  },
+  inject: ['parentFetchData'],
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.typeLoading = true
+
+      api('listTrafficTypes', { physicalnetworkid: this.resource.id })
+        .then(json => {
+          this.trafficTypes = json.listtraffictypesresponse.traffictype || []
+          this.selectedType = this.trafficTypes[0].id || undefined
+          this.trafficResource = this.trafficTypes[0] || {}
+          this.traffictype = this.trafficTypes[0].traffictype || undefined
+        })
+        .catch(error => {
+          this.$notification.error({
+            message: `${this.$t('label.error')} ${error.response.status}`,
+            description: error.response.data.errorresponse.errortext
+          })
+        })
+        .finally(() => {
+          this.typeLoading = false
+        })
+    },
+    onChangeTrafficType (trafficId) {
+      if (!trafficId) return
+      this.trafficResource = this.trafficTypes.filter(item => item.id === trafficId)[0] || {}
+      this.traffictype = this.trafficResource.traffictype || undefined
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        const params = {}
+        for (const key in values) {
+          params[key] = values[key]
+        }
+        const title = this.$t('label.update.traffic.label')
+        const description = this.traffictype
+        api('updateTrafficType', params).then(response => {
+          this.$pollJob({
+            jobId: response.updatetraffictyperesponse.jobid,
+            successMethod: result => {
+              this.$store.dispatch('AddAsyncJob', {
+                title: title,
+                description: description,
+                jobid: response.updatetraffictyperesponse.jobid,
+                status: this.$t('progress')
+              })
+              this.parentFetchData()
+            },
+            successMessage: `${this.$t('label.update.traffic.label')} ${this.traffictype} ${this.$t('label.success')}`,
+            loadingMessage: `${title} ${this.$t('label.in.progress')}`,
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+          this.closeAction()
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 80vw;
+
+  @media (min-width: 600px) {
+    width: 450px;
+  }
+}
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/IpRangesTab.vue b/ui/src/views/infra/network/IpRangesTab.vue
new file mode 100644
index 0000000..41257f1
--- /dev/null
+++ b/ui/src/views/infra/network/IpRangesTab.vue
@@ -0,0 +1,63 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    IP Ranges Tab here
+  </a-spin>
+</template>
+
+<script>
+
+export default {
+  name: 'IpRangesTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      // List existing IP range etc.
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>
diff --git a/ui/src/views/infra/network/IpRangesTabGuest.vue b/ui/src/views/infra/network/IpRangesTabGuest.vue
new file mode 100644
index 0000000..49d63f7
--- /dev/null
+++ b/ui/src/views/infra/network/IpRangesTabGuest.vue
@@ -0,0 +1,182 @@
+// 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>
+  <a-spin :spinning="componentLoading">
+    <a-button
+      :disabled="!('createNetwork' in this.$store.getters.apis)"
+      type="dashed"
+      icon="plus"
+      style="margin-bottom: 20px; width: 100%"
+      @click="handleOpenShowCreateForm">
+      {{ $t('label.add.guest.network') }}
+    </a-button>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id"
+      :pagination="false"
+    >
+      <template slot="name" slot-scope="text, item">
+        <router-link :to="{ path: '/guestnetwork/' + item.id }">
+          {{ text }}
+        </router-link>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      style="overflow-y: auto"
+      :current="page"
+      :pageSize="pageSize"
+      :total="total"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-model="showCreateForm"
+      :title="$t('label.add.guest.network')"
+      :closable="true"
+      :maskClosable="false"
+      :footer="null"
+      :cancelText="$t('label.cancel')"
+      @cancel="showCreateForm = false"
+      centered
+      width="auto">
+      <CreateNetwork :resource="{ zoneid: resource.zoneid }"/>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import CreateNetwork from '@/views/network/CreateNetwork'
+
+export default {
+  name: 'IpRangesTabGuest',
+  components: {
+    CreateNetwork
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      componentLoading: false,
+      items: [],
+      total: 0,
+      showCreateForm: false,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.type'),
+          dataIndex: 'type'
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlan'
+        },
+        {
+          title: this.$t('label.broadcasturi'),
+          dataIndex: 'broadcasturi'
+        },
+        {
+          title: this.$t('label.cidr'),
+          dataIndex: 'cidr'
+        },
+        {
+          title: this.$t('label.ip6cidr'),
+          dataIndex: 'ip6cidr'
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    network (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.componentLoading = true
+      api('listNetworks', {
+        zoneid: this.resource.zoneid,
+        physicalnetworkid: this.resource.id,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        console.log(response)
+        this.items = response.listnetworksresponse.network ? response.listnetworksresponse.network : []
+        this.total = response.listnetworksresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    handleOpenShowCreateForm () {
+      this.showCreateForm = true
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/infra/network/IpRangesTabManagement.vue b/ui/src/views/infra/network/IpRangesTabManagement.vue
new file mode 100644
index 0000000..27a1b0c
--- /dev/null
+++ b/ui/src/views/infra/network/IpRangesTabManagement.vue
@@ -0,0 +1,412 @@
+// 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>
+  <a-spin :spinning="componentLoading">
+    <a-button
+      :disabled="!('createManagementNetworkIpRange' in $store.getters.apis)"
+      type="dashed"
+      icon="plus"
+      style="margin-bottom: 20px; width: 100%"
+      @click="handleOpenAddIpRangeModal">
+      {{ $t('label.add.ip.range') }}
+    </a-button>
+
+    <a-table
+      style="overflow-y: auto"
+      size="small"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id + record.startip"
+      :pagination="false"
+    >
+      <template slot="forsystemvms" slot-scope="text, record">
+        <a-checkbox :checked="record.forsystemvms" />
+      </template>
+      <template slot="actions" slot-scope="record">
+        <div class="actions">
+          <a-popover placement="bottom">
+            <template slot="content">{{ $t('label.remove.ip.range') }}</template>
+            <a-button
+              :disabled="!('deleteManagementNetworkIpRange' in $store.getters.apis)"
+              icon="delete"
+              shape="circle"
+              type="danger"
+              @click="handleDeleteIpRange(record)"></a-button>
+          </a-popover>
+        </div>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      style="overflow-y: auto"
+      :current="page"
+      :pageSize="pageSize"
+      :total="total"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-model="addIpRangeModal"
+      :title="$t('label.add.ip.range')"
+      :maskClosable="false"
+      @ok="handleAddIpRange">
+      <a-form
+        :form="form"
+        @submit="handleAddIpRange"
+        layout="vertical"
+        class="form"
+      >
+        <a-form-item :label="$t('label.podid')" class="form__item">
+          <a-select
+            v-decorator="['pod', {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+          >
+            <a-select-option v-for="item in items" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.gateway')" class="form__item">
+          <a-input
+            v-decorator="['gateway', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.netmask')" class="form__item">
+          <a-input
+            v-decorator="['netmask', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.vlan')" class="form__item">
+          <a-input
+            v-decorator="['vlan']">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.startip')" class="form__item">
+          <a-input
+            v-decorator="['startip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.endip')" class="form__item">
+          <a-input
+            v-decorator="['endip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.system.vms')" class="form__item">
+          <a-checkbox v-decorator="['vms']"></a-checkbox>
+        </a-form-item>
+      </a-form>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'IpRangesTabManagement',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      componentLoading: false,
+      items: [],
+      total: 0,
+      domains: [],
+      domainsLoading: false,
+      addIpRangeModal: false,
+      defaultSelectedPod: null,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.podid'),
+          dataIndex: 'name'
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlanid',
+          scopedSlots: { customRender: 'vlan' }
+        },
+        {
+          title: this.$t('label.startip'),
+          dataIndex: 'startip',
+          scopedSlots: { customRender: 'startip' }
+        },
+        {
+          title: this.$t('label.endip'),
+          dataIndex: 'endip',
+          scopedSlots: { customRender: 'endip' }
+        },
+        {
+          title: this.$t('label.system.vms'),
+          dataIndex: 'forsystemvms',
+          scopedSlots: { customRender: 'forsystemvms' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.componentLoading = true
+      api('listPods', {
+        zoneid: this.resource.zoneid,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        this.items = []
+        this.total = response.listpodsresponse.count || 0
+        const pods = response.listpodsresponse.pod ? response.listpodsresponse.pod : []
+        for (const pod of pods) {
+          if (pod && pod.startip && pod.startip.length > 0) {
+            for (var idx = 0; idx < pod.startip.length; idx++) {
+              this.items.push({
+                id: pod.id,
+                name: pod.name,
+                gateway: pod.gateway,
+                netmask: pod.netmask,
+                vlanid: pod.vlanid[idx],
+                startip: pod.startip[idx],
+                endip: pod.endip[idx],
+                forsystemvms: pod.forsystemvms[idx] === '1'
+              })
+            }
+          }
+        }
+      }).catch(error => {
+        console.log(error)
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    handleOpenAddIpRangeModal () {
+      this.addIpRangeModal = true
+      setTimeout(() => {
+        if (this.items.length > 0) {
+          this.form.setFieldsValue({
+            pod: this.items[0].id
+          })
+        }
+      }, 200)
+    },
+    handleDeleteIpRange (record) {
+      this.componentLoading = true
+      api('deleteManagementNetworkIpRange', {
+        podid: record.id,
+        startip: record.startip,
+        endip: record.endip,
+        vlan: record.vlanid
+      }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.success.remove.iprange'),
+          jobid: response.deletemanagementnetworkiprangeresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.deletemanagementnetworkiprangeresponse.jobid,
+          successMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.remove.failed'),
+          errorMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.remove.iprange.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.componentLoading = false
+        this.fetchData()
+      })
+    },
+    handleAddIpRange (e) {
+      this.form.validateFields((error, values) => {
+        if (error) return
+
+        this.componentLoading = true
+        this.addIpRangeModal = false
+        api('createManagementNetworkIpRange', {
+          podid: values.pod,
+          gateway: values.gateway,
+          netmask: values.netmask,
+          startip: values.startip,
+          endip: values.endip,
+          forsystemvms: values.vms,
+          vlan: values.vlan || null
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.success.add.iprange'),
+            jobid: response.createmanagementnetworkiprangeresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createmanagementnetworkiprangeresponse.jobid,
+            successMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            },
+            errorMessage: this.$t('message.add.failed'),
+            errorMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            },
+            loadingMessage: this.$t('message.add.iprange.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.componentLoading = false
+          this.fetchData()
+        })
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .list {
+    &__item {
+      display: flex;
+    }
+
+    &__data {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &__col {
+      flex-basis: calc((100% / 3) - 20px);
+      margin-right: 20px;
+      margin-bottom: 10px;
+    }
+
+    &__label {
+    }
+  }
+
+  .ant-list-item {
+    padding-top: 0;
+    padding-bottom: 0;
+
+    &:not(:first-child) {
+      padding-top: 20px;
+    }
+
+    &:not(:last-child) {
+      padding-bottom: 20px;
+    }
+  }
+
+  .actions {
+    button {
+      &:not(:last-child) {
+        margin-bottom: 10px;
+      }
+    }
+  }
+
+  .ant-select {
+    width: 100%;
+  }
+
+  .form {
+    .actions {
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        &:not(:last-child) {
+          margin-right: 10px;
+        }
+      }
+
+    }
+
+    &__item {
+    }
+  }
+
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/infra/network/IpRangesTabPublic.vue b/ui/src/views/infra/network/IpRangesTabPublic.vue
new file mode 100644
index 0000000..4e87885
--- /dev/null
+++ b/ui/src/views/infra/network/IpRangesTabPublic.vue
@@ -0,0 +1,494 @@
+// 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>
+  <a-spin :spinning="componentLoading">
+    <a-button
+      :disabled="!('createVlanIpRange' in this.$store.getters.apis)"
+      type="dashed"
+      icon="plus"
+      style="margin-bottom: 20px; width: 100%"
+      @click="handleOpenAddIpRangeModal">
+      {{ $t('label.add.ip.range') }}
+    </a-button>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id"
+      :pagination="false"
+    >
+      <template slot="account" slot-scope="record">
+        <a-button @click="() => handleOpenAccountModal(record)">{{ `[${record.domain}] ${record.account === undefined ? '' : record.account}` }}</a-button>
+      </template>
+      <template slot="actions" slot-scope="record">
+        <div class="actions">
+          <a-popover v-if="record.account === 'system'" placement="bottom">
+            <template slot="content">{{ $t('label.add.account') }}</template>
+            <a-button
+              icon="user-add"
+              shape="circle"
+              @click="() => handleOpenAddAccountModal(record)"
+              :disabled="!('dedicatePublicIpRange' in $store.getters.apis)"></a-button>
+          </a-popover>
+          <a-popover
+            v-else
+            placement="bottom">
+            <template slot="content">{{ $t('label.release.account') }}</template>
+            <a-button
+              icon="user-delete"
+              shape="circle"
+              type="danger"
+              @click="() => handleRemoveAccount(record.id)"
+              :disabled="!('releasePublicIpRange' in $store.getters.apis)"></a-button>
+          </a-popover>
+          <a-popover placement="bottom">
+            <template slot="content">{{ $t('label.remove.ip.range') }}</template>
+            <a-button
+              icon="delete"
+              shape="circle"
+              type="danger"
+              @click="handleDeleteIpRange(record.id)"
+              :disabled="!('deleteVlanIpRange' in $store.getters.apis)"></a-button>
+          </a-popover>
+        </div>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      style="overflow-y: auto"
+      :current="page"
+      :pageSize="pageSize"
+      :total="total"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-model="accountModal"
+      v-if="selectedItem"
+      :maskClosable="false"
+      @ok="accountModal = false">
+      <div>
+        <div style="margin-bottom: 10px;">
+          <div class="list__label">{{ $t('label.account') }}</div>
+          <div>{{ selectedItem.account }}</div>
+        </div>
+        <div style="margin-bottom: 10px;">
+          <div class="list__label">{{ $t('label.domain') }}</div>
+          <div>{{ selectedItem.domain }}</div>
+        </div>
+        <div style="margin-bottom: 10px;">
+          <div class="list__label">{{ $t('label.system.vms') }}</div>
+          <div>{{ selectedItem.forsystemvms }}</div>
+        </div>
+      </div>
+    </a-modal>
+
+    <a-modal
+      :zIndex="1001"
+      :maskClosable="false"
+      v-model="addAccountModal"
+      :title="$t('label.add.account')"
+      @ok="handleAddAccount">
+      <a-spin :spinning="domainsLoading">
+        <div style="margin-bottom: 10px;">
+          <div class="list__label">{{ $t('label.account') }}:</div>
+          <a-input v-model="addAccount.account"></a-input>
+        </div>
+        <div>
+          <div class="list__label">{{ $t('label.domain') }}:</div>
+          <a-select v-model="addAccount.domain">
+            <a-select-option
+              v-for="domain in domains"
+              :key="domain.id"
+              :value="domain.id">{{ domain.name }}
+            </a-select-option>
+          </a-select>
+        </div>
+      </a-spin>
+    </a-modal>
+
+    <a-modal
+      v-model="addIpRangeModal"
+      :title="$t('label.add.ip.range')"
+      :maskClosable="false"
+      @ok="handleAddIpRange">
+      <a-form
+        :form="form"
+        @submit="handleAddIpRange"
+        layout="vertical"
+        class="form"
+      >
+        <a-form-item :label="$t('label.gateway')" class="form__item">
+          <a-input
+            v-decorator="['gateway', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.netmask')" class="form__item">
+          <a-input
+            v-decorator="['netmask', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.vlan')" class="form__item">
+          <a-input
+            v-decorator="['vlan']">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.startip')" class="form__item">
+          <a-input
+            v-decorator="['startip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.endip')" class="form__item">
+          <a-input
+            v-decorator="['endip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <div class="form__item">
+          <div style="color: black;">{{ $t('label.set.reservation') }}</div>
+          <a-switch @change="handleShowAccountFields"></a-switch>
+        </div>
+        <div v-if="showAccountFields" style="margin-top: 20px;">
+          <div v-html="$t('label.set.reservation.desc')"></div>
+          <a-form-item :label="$t('label.system.vms')" class="form__item">
+            <a-switch v-decorator="['forsystemvms']"></a-switch>
+          </a-form-item>
+          <a-spin :spinning="domainsLoading">
+            <a-form-item :label="$t('label.account')" class="form__item">
+              <a-input v-decorator="['account']"></a-input>
+            </a-form-item>
+            <a-form-item :label="$t('label.domain')" class="form__item">
+              <a-select v-decorator="['domain']">
+                <a-select-option
+                  v-for="domain in domains"
+                  :key="domain.id"
+                  :value="domain.id">{{ domain.name }}
+                </a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-spin>
+        </div>
+      </a-form>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'IpRangesTabPublic',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    network: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      componentLoading: false,
+      items: [],
+      total: 0,
+      selectedItem: null,
+      accountModal: false,
+      addAccountModal: false,
+      addAccount: {
+        account: null,
+        domain: null
+      },
+      domains: [],
+      domainsLoading: false,
+      addIpRangeModal: false,
+      showAccountFields: false,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlan'
+        },
+        {
+          title: this.$t('label.startip'),
+          dataIndex: 'startip'
+        },
+        {
+          title: this.$t('label.endip'),
+          dataIndex: 'endip'
+        },
+        {
+          title: this.$t('label.account'),
+          scopedSlots: { customRender: 'account' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    network (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.componentLoading = true
+      api('listVlanIpRanges', {
+        networkid: this.network.id,
+        zoneid: this.resource.zoneid,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        this.items = response.listvlaniprangesresponse.vlaniprange ? response.listvlaniprangesresponse.vlaniprange : []
+        this.total = response.listvlaniprangesresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    fetchDomains () {
+      this.domainsLoading = true
+      api('listDomains', {
+        details: 'min',
+        listAll: true
+      }).then(response => {
+        this.domains = response.listdomainsresponse.domain ? response.listdomainsresponse.domain : []
+        if (this.domains.length > 0) {
+          this.addAccount.domain = this.domains[0].id
+          this.form.setFieldsValue({ domain: this.domains[0].id })
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.domainsLoading = false
+      })
+    },
+    handleAddAccount () {
+      this.domainsLoading = true
+
+      if (this.addIpRangeModal === true) {
+        this.addAccountModal = false
+        return
+      }
+
+      api('dedicatePublicIpRange', {
+        id: this.selectedItem.id,
+        zoneid: this.selectedItem.zoneid,
+        domainid: this.addAccount.domain,
+        account: this.addAccount.account
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.addAccountModal = false
+        this.domainsLoading = false
+        this.fetchData()
+      })
+    },
+    handleRemoveAccount (id) {
+      this.componentLoading = true
+      api('releasePublicIpRange', { id }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    handleOpenAccountModal (item) {
+      this.selectedItem = item
+      this.accountModal = true
+    },
+    handleOpenAddAccountModal (item) {
+      if (!this.addIpRangeModal) {
+        this.selectedItem = item
+      }
+      this.addAccountModal = true
+      this.fetchDomains()
+    },
+    handleShowAccountFields () {
+      if (this.showAccountFields === false) {
+        this.showAccountFields = true
+        this.fetchDomains()
+        return
+      }
+      this.showAccountFields = false
+    },
+    handleOpenAddIpRangeModal () {
+      this.addIpRangeModal = true
+    },
+    handleDeleteIpRange (id) {
+      this.componentLoading = true
+      api('deleteVlanIpRange', { id }).then(() => {
+        this.$notification.success({
+          message: 'Removed IP Range'
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+        this.fetchData()
+      })
+    },
+    handleAddIpRange (e) {
+      this.form.validateFields((error, values) => {
+        if (error) return
+
+        this.componentLoading = true
+        this.addIpRangeModal = false
+        api('createVlanIpRange', {
+          zoneId: this.resource.zoneid,
+          vlan: values.vlan,
+          gateway: values.gateway,
+          netmask: values.netmask,
+          startip: values.startip,
+          endip: values.endip,
+          forsystemvms: values.forsystemvms,
+          account: values.forsystemvms ? null : values.account,
+          domainid: values.forsystemvms ? null : values.domain,
+          forvirtualnetwork: true
+        }).then(() => {
+          this.$notification.success({
+            message: this.$t('message.success.add.iprange')
+          })
+        }).catch(error => {
+          this.$notification.error({
+            message: `${this.$t('label.error')} ${error.response.status}`,
+            description: error.response.data.createvlaniprangeresponse
+              ? error.response.data.createvlaniprangeresponse.errortext : error.response.data.errorresponse.errortext,
+            duration: 0
+          })
+        }).finally(() => {
+          this.componentLoading = false
+          this.fetchData()
+        })
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .list {
+    &__item {
+      display: flex;
+    }
+
+    &__data {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &__col {
+      flex-basis: calc((100% / 3) - 20px);
+      margin-right: 20px;
+      margin-bottom: 10px;
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+  }
+
+  .ant-list-item {
+    padding-top: 0;
+    padding-bottom: 0;
+
+    &:not(:first-child) {
+      padding-top: 20px;
+    }
+
+    &:not(:last-child) {
+      padding-bottom: 20px;
+    }
+  }
+
+  .actions {
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .ant-select {
+    width: 100%;
+  }
+
+  .form {
+    .actions {
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        &:not(:last-child) {
+          margin-right: 10px;
+        }
+      }
+
+    }
+  }
+
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/infra/network/IpRangesTabStorage.vue b/ui/src/views/infra/network/IpRangesTabStorage.vue
new file mode 100644
index 0000000..8b38134
--- /dev/null
+++ b/ui/src/views/infra/network/IpRangesTabStorage.vue
@@ -0,0 +1,394 @@
+// 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>
+  <a-spin :spinning="componentLoading">
+    <a-button
+      :disabled="!('createStorageNetworkIpRange' in $store.getters.apis)"
+      type="dashed"
+      icon="plus"
+      style="margin-bottom: 20px; width: 100%"
+      @click="handleOpenAddIpRangeModal">
+      {{ $t('label.add.ip.range') }}
+    </a-button>
+
+    <a-table
+      style="overflow-y: auto"
+      size="small"
+      :columns="columns"
+      :dataSource="items"
+      :rowKey="record => record.id"
+      :pagination="false"
+    >
+      <template slot="name" slot-scope="record">
+        <div>{{ returnPodName(record.podid) }}</div>
+      </template>
+      <template slot="actions" slot-scope="record">
+        <a-popover placement="bottom">
+          <template slot="content">{{ $t('label.remove.ip.range') }}</template>
+          <a-button
+            :disabled="!('deleteStorageNetworkIpRange' in $store.getters.apis)"
+            icon="delete"
+            shape="circle"
+            type="danger"
+            @click="handleDeleteIpRange(record.id)"></a-button>
+        </a-popover>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      style="overflow-y: auto"
+      :current="page"
+      :pageSize="pageSize"
+      :total="total"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      v-model="addIpRangeModal"
+      :title="$t('label.add.ip.range')"
+      :maskClosable="false"
+      @ok="handleAddIpRange">
+      <a-form
+        :form="form"
+        @submit="handleAddIpRange"
+        layout="vertical"
+        class="form"
+      >
+        <a-form-item :label="$t('label.podid')" class="form__item">
+          <a-select
+            v-decorator="['pod', {
+              rules: [{ required: true, message: `${$t('label.required')}` }]
+            }]"
+          >
+            <a-select-option v-for="pod in pods" :key="pod.id" :value="pod.id">{{ pod.name }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.gateway')" class="form__item">
+          <a-input
+            v-decorator="['gateway', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.netmask')" class="form__item">
+          <a-input
+            v-decorator="['netmask', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.vlan')" class="form__item">
+          <a-input
+            v-decorator="['vlan']">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.startip')" class="form__item">
+          <a-input
+            v-decorator="['startip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+        <a-form-item :label="$t('label.endip')" class="form__item">
+          <a-input
+            v-decorator="['endip', { rules: [{ required: true, message: `${$t('label.required')}` }] }]">
+          </a-input>
+        </a-form-item>
+      </a-form>
+    </a-modal>
+
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'IpRangesTabStorage',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      componentLoading: false,
+      items: [],
+      total: 0,
+      pods: [],
+      domains: [],
+      domainsLoading: false,
+      addIpRangeModal: false,
+      defaultSelectedPod: null,
+      columns: [
+        {
+          title: this.$t('label.podid'),
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlanid'
+        },
+        {
+          title: this.$t('label.startip'),
+          dataIndex: 'startip'
+        },
+        {
+          title: this.$t('label.endip'),
+          dataIndex: 'endip'
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ],
+      page: 1,
+      pageSize: 10
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchPods()
+      this.componentLoading = true
+      api('listStorageNetworkIpRange', {
+        zoneid: this.resource.zoneid,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.items = response.liststoragenetworkiprangeresponse.storagenetworkiprange || []
+        this.total = response.liststoragenetworkiprangeresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    fetchPods () {
+      this.componentLoading = true
+      api('listPods', {
+        zoneid: this.resource.zoneid
+      }).then(response => {
+        this.pods = response.listpodsresponse.pod ? response.listpodsresponse.pod : []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    returnPodName (id) {
+      const match = this.pods.find(i => i.id === id)
+      return match ? match.name : null
+    },
+    handleOpenAddIpRangeModal () {
+      this.addIpRangeModal = true
+      setTimeout(() => {
+        if (this.items.length > 0) {
+          this.form.setFieldsValue({
+            pod: this.pods[0].id
+          })
+        }
+      }, 200)
+    },
+    handleDeleteIpRange (id) {
+      this.componentLoading = true
+      api('deleteStorageNetworkIpRange', { id }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.success.remove.iprange'),
+          jobid: response.deletestoragenetworkiprangeresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.deletestoragenetworkiprangeresponse.jobid,
+          successMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.remove.failed'),
+          errorMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.remove.iprange.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.componentLoading = false
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.componentLoading = false
+        this.fetchData()
+      })
+    },
+    handleAddIpRange (e) {
+      this.form.validateFields((error, values) => {
+        if (error) return
+
+        this.componentLoading = true
+        this.addIpRangeModal = false
+        api('createStorageNetworkIpRange', {
+          podid: values.pod,
+          zoneid: this.resource.zoneid,
+          gateway: values.gateway,
+          netmask: values.netmask,
+          startip: values.startip,
+          endip: values.endip,
+          vlan: values.vlan || null
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.success.add.iprange'),
+            jobid: response.createstoragenetworkiprangeresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createstoragenetworkiprangeresponse.jobid,
+            successMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            },
+            errorMessage: this.$t('message.add.failed'),
+            errorMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            },
+            loadingMessage: this.$t('message.add.iprange.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.componentLoading = false
+              this.fetchData()
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.componentLoading = false
+          this.fetchData()
+        })
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .list {
+    &__item {
+      display: flex;
+    }
+
+    &__data {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &__col {
+      flex-basis: calc((100% / 3) - 20px);
+      margin-right: 20px;
+      margin-bottom: 10px;
+    }
+
+    &__label {
+    }
+  }
+
+  .ant-list-item {
+    padding-top: 0;
+    padding-bottom: 0;
+
+    &:not(:first-child) {
+      padding-top: 20px;
+    }
+
+    &:not(:last-child) {
+      padding-bottom: 20px;
+    }
+  }
+
+  .actions {
+    button {
+      &:not(:last-child) {
+        margin-bottom: 10px;
+      }
+    }
+  }
+
+  .ant-select {
+    width: 100%;
+  }
+
+  .form {
+    .actions {
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        &:not(:last-child) {
+          margin-right: 10px;
+        }
+      }
+
+    }
+
+    &__item {
+    }
+  }
+
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/infra/network/ServiceProvidersTab.vue b/ui/src/views/infra/network/ServiceProvidersTab.vue
new file mode 100644
index 0000000..89c92d4
--- /dev/null
+++ b/ui/src/views/infra/network/ServiceProvidersTab.vue
@@ -0,0 +1,1381 @@
+// 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>
+    <a-spin :spinning="fetchLoading">
+      <a-tabs
+        :tabPosition="device === 'mobile' ? 'top' : 'left'"
+        :animated="false"
+        @change="onTabChange">
+        <a-tab-pane
+          v-for="item in hardcodedNsps"
+          :key="item.title">
+          <span slot="tab">
+            {{ $t(item.title) }}
+            <status :text="item.title in nsps ? nsps[item.title].state : $t('label.disabled')" style="margin-bottom: 6px; margin-left: 6px" />
+          </span>
+          <provider-item
+            v-if="tabKey===item.title"
+            :loading="loading"
+            :itemNsp="item"
+            :nsp="nsps[item.title]"
+            :resourceId="resource.id"
+            :zoneId="resource.zoneid"/>
+        </a-tab-pane>
+      </a-tabs>
+    </a-spin>
+    <div v-if="showFormAction">
+      <keep-alive v-if="currentAction.component">
+        <a-modal
+          :title="$t(currentAction.label)"
+          :visible="showFormAction"
+          :closable="true"
+          :maskClosable="false"
+          :cancelText="$t('label.cancel')"
+          style="top: 20px;"
+          @cancel="onCloseAction"
+          :confirmLoading="actionLoading"
+          :footer="null"
+          centered>
+          <component
+            :is="currentAction.component"
+            :resource="nsp"
+            :action="currentAction" />
+        </a-modal>
+      </keep-alive>
+      <a-modal
+        v-else
+        :title="$t(currentAction.label)"
+        :visible="showFormAction"
+        :confirmLoading="actionLoading"
+        :maskClosable="false"
+        :okText="$t('label.ok')"
+        :cancelText="$t('label.cancel')"
+        style="top: 20px;"
+        @ok="handleSubmit"
+        @cancel="onCloseAction"
+        centered
+      >
+        <a-form
+          :form="form"
+          layout="vertical">
+          <a-form-item
+            v-for="(field, index) in currentAction.fieldParams"
+            :key="index"
+            :label="$t('label.' + field.name)">
+            <span v-if="field.name==='password'">
+              <a-input-password
+                v-decorator="[field.name, {
+                  rules: [
+                    {
+                      required: field.required,
+                      message: $t('message.error.required.input')
+                    }
+                  ]
+                }]"
+                :placeholder="field.description" />
+            </span>
+            <span v-else-if="field.type==='boolean'">
+              <a-switch
+                v-decorator="[field.name, {
+                  rules: [{
+                    required: field.required,
+                    message: $t('message.error.required.input')
+                  }]
+                }]"
+                :placeholder="field.description"
+              />
+            </span>
+            <span v-else-if="field.type==='uuid'">
+              <a-select
+                v-decorator="[field.name, {
+                  rules: [{
+                    required: field.required,
+                    message: $t('message.error.select')
+                  }]
+                }]"
+                :loading="field.loading"
+                :placeholder="field.description">
+                <a-select-option
+                  v-for="(opt, idx) in field.opts"
+                  :key="idx">{{ opt.name || opt.description }}</a-select-option>
+              </a-select>
+            </span>
+            <span v-else>
+              <a-input
+                v-decorator="[field.name, {
+                  rules: [
+                    {
+                      required: field.required,
+                      message: $t('message.error.required.input')
+                    }
+                  ]
+                }]"
+                :placeholder="field.description" />
+            </span>
+          </a-form-item>
+        </a-form>
+      </a-modal>
+    </div>
+  </div>
+</template>
+
+<script>
+import store from '@/store'
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import Status from '@/components/widgets/Status'
+import ProviderItem from '@/views/infra/network/providers/ProviderItem'
+
+export default {
+  name: 'ServiceProvidersTab',
+  components: {
+    Status,
+    ProviderItem
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      nsps: {},
+      nsp: {},
+      fetchLoading: false,
+      actionLoading: false,
+      showFormAction: false,
+      currentAction: {},
+      tabKey: 'BaremetalDhcpProvider'
+    }
+  },
+  computed: {
+    hardcodedNsps () {
+      return [
+        {
+          title: 'BaremetalDhcpProvider',
+          actions: [
+            {
+              api: 'addBaremetalDhcp',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.baremetal.dhcp.device',
+              args: ['url', 'username', 'password'],
+              mapping: {
+                dhcpservertype: {
+                  value: (record) => { return 'DHCPD' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Enabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Disabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.baremetal.dhcp.devices',
+              api: 'listBaremetalDhcp',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['url']
+            }
+          ]
+        },
+        {
+          title: 'BaremetalPxeProvider',
+          actions: [
+            {
+              api: 'addBaremetalPxeKickStartServer',
+              listView: true,
+              icon: 'plus',
+              label: 'label.baremetal.pxe.device',
+              args: ['url', 'username', 'password', 'tftpdir'],
+              mapping: {
+                pxeservertype: {
+                  value: (record) => { return 'KICK_START' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Enabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Disabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.baremetal.pxe.devices',
+              api: 'listBaremetalPxeServers',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['url']
+            }
+          ]
+        },
+        {
+          title: 'BigSwitchBcf',
+          actions: [
+            {
+              api: 'addBigSwitchBcfDevice',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.bigswitchbcf.device',
+              args: ['hostname', 'username', 'password', 'nat']
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listBigSwitchBcfDevices',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['hostname', 'action']
+            }
+          ]
+        },
+        {
+          title: 'BrocadeVcs',
+          actions: [
+            {
+              api: 'addBrocadeVcsDevice',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.bigswitchbcf.device',
+              args: ['hostname', 'username', 'password']
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listBrocadeVcsDevices',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['hostname', 'action']
+            }
+          ]
+        },
+        {
+          title: 'CiscoVnmc',
+          actions: [
+            {
+              api: 'addCiscoVnmcResource',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.vnmc.device',
+              args: ['hostname', 'username', 'password']
+            },
+            {
+              api: 'addCiscoAsa1000vResource',
+              listView: true,
+              icon: 'plus-circle',
+              label: 'label.add.ciscoasa1000v',
+              args: ['hostname', 'insideportprofile', 'clusterid'],
+              mapping: {
+                zoneid: {
+                  params: (record) => { return record.zoneid }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.list.ciscovnmc',
+              api: 'listCiscoVnmcResources',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['resource', 'provider']
+            },
+            {
+              title: 'label.list.ciscoasa1000v',
+              api: 'listCiscoAsa1000vResources',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['hostname', 'insideportprofile', 'action']
+            }
+          ]
+        },
+        {
+          title: 'ConfigDrive',
+          actions: [
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist', 'physicalnetworkid']
+        },
+        {
+          title: 'F5BigIp',
+          actions: [
+            {
+              api: 'addF5LoadBalancer',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.f5.device',
+              component: () => import('@/views/infra/network/providers/AddF5LoadBalancer.vue')
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listF5LoadBalancers',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['ipaddress', 'lbdevicestate', 'action']
+            }
+          ]
+        },
+        {
+          title: 'GloboDns',
+          actions: [
+            {
+              api: 'addGloboDnsHost',
+              listView: true,
+              icon: 'plus',
+              label: 'label.globo.dns.configuration',
+              args: ['url', 'username', 'password']
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist']
+        },
+        {
+          title: 'InternalLbVm',
+          actions: [
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            }
+          ],
+          details: ['name', 'state', 'id', 'physicalnetworkid', 'destinationphysicalnetworkid', 'servicelist'],
+          lists: [
+            {
+              title: 'label.instances',
+              api: 'listInternalLoadBalancerVMs',
+              mapping: {
+                zoneid: {
+                  value: (record) => { return record.zoneid }
+                }
+              },
+              columns: ['name', 'zonename', 'type', 'state']
+            }
+          ]
+        },
+        {
+          title: 'JuniperSRX',
+          actions: [
+            {
+              api: 'addSrxFirewall',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.srx.device',
+              component: () => import('@/views/infra/network/providers/AddSrxFirewall.vue')
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listSrxFirewalls',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['ipaddress', 'fwdevicestate', 'action']
+            }
+          ]
+        },
+        {
+          title: 'Netscaler',
+          actions: [
+            {
+              api: 'addNetscalerLoadBalancer',
+              icon: 'plus',
+              listView: true,
+              label: 'label.add.netscaler.device',
+              component: () => import('@/views/infra/network/providers/AddNetscalerLoadBalancer.vue')
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listNetscalerLoadBalancers',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['ipaddress', 'lbdevicestate', 'action']
+            }
+          ]
+        },
+        {
+          title: 'NiciraNvp',
+          actions: [
+            {
+              api: 'addNiciraNvpDevice',
+              icon: 'plus',
+              listView: true,
+              label: 'label.add.niciranvp.device',
+              component: () => import('@/views/infra/network/providers/AddNiciraNvpDevice.vue')
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listNiciraNvpDevices',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['hostname', 'transportzoneuuid', 'l3gatewayserviceuuid', 'l2gatewayserviceuuid', 'action']
+            }
+          ]
+        },
+        {
+          title: 'Opendaylight',
+          actions: [
+            {
+              api: 'addOpenDaylightController',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.opendaylight.device',
+              args: ['url', 'username', 'password']
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.opendaylight.controllers',
+              api: 'listOpenDaylightControllers',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['name', 'url', 'username', 'action']
+            }
+          ]
+        },
+        {
+          title: 'Ovs',
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'listOvsElements',
+              api: 'listOvsElements',
+              mapping: {
+                nspid: {
+                  value: (record) => { return record.id }
+                }
+              },
+              columns: ['account', 'domain', 'enabled', 'project', 'action']
+            }
+          ]
+        },
+        {
+          title: 'PaloAlto',
+          actions: [
+            {
+              api: 'addPaloAltoFirewall',
+              listView: true,
+              icon: 'plus',
+              label: 'label.add.pa.device',
+              component: () => import('@/views/infra/network/providers/AddPaloAltoFirewall.vue')
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Enabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return (record && record.id && record.state === 'Disabled') },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            },
+            {
+              api: 'deleteNetworkServiceProvider',
+              listView: true,
+              icon: 'poweroff',
+              label: 'label.shutdown.provider',
+              confirm: 'message.confirm.delete.provider',
+              show: (record) => { return record && record.id }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.devices',
+              api: 'listPaloAltoFirewalls',
+              mapping: {
+                physicalnetworkid: {
+                  value: (record) => { return record.physicalnetworkid }
+                }
+              },
+              columns: ['ipaddress', 'fwdevicestate', 'type', 'action']
+            }
+          ]
+        },
+        // {
+        //   title: 'SecurityGroupProvider',
+        //   details: ['name', 'state', 'id', 'servicelist'],
+        // },
+        {
+          title: 'VirtualRouter',
+          actions: [
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.instances',
+              api: 'listRouters',
+              mapping: {
+                listAll: {
+                  value: (record) => { return true }
+                },
+                zoneid: {
+                  value: (record) => { return record.zoneid }
+                },
+                forvpc: {
+                  value: (record) => { return false }
+                }
+              },
+              columns: ['name', 'state', 'hostname', 'zonename']
+            }
+          ]
+        },
+        {
+          title: 'VpcVirtualRouter',
+          actions: [
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'stop',
+              listView: true,
+              label: 'label.disable.provider',
+              confirm: 'message.confirm.disable.provider',
+              show: (record) => { return record && record.id && record.state === 'Enabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Disabled' }
+                }
+              }
+            },
+            {
+              api: 'updateNetworkServiceProvider',
+              icon: 'play-circle',
+              listView: true,
+              label: 'label.enable.provider',
+              confirm: 'message.confirm.enable.provider',
+              show: (record) => { return record && record.id && record.state === 'Disabled' },
+              mapping: {
+                state: {
+                  value: (record) => { return 'Enabled' }
+                }
+              }
+            }
+          ],
+          details: ['name', 'state', 'id', 'servicelist'],
+          lists: [
+            {
+              title: 'label.instances',
+              api: 'listRouters',
+              mapping: {
+                forvpc: {
+                  value: (record) => { return true }
+                },
+                zoneid: {
+                  value: (record) => { return record.zoneid }
+                },
+                listAll: {
+                  value: () => { return true }
+                }
+              },
+              columns: ['name', 'state', 'hostname', 'zonename']
+            }
+          ]
+        }
+      ]
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  inject: ['parentPollActionCompletion'],
+  provide () {
+    return {
+      provideSetNsp: this.setNsp,
+      provideExecuteAction: this.executeAction,
+      provideCloseAction: this.onCloseAction,
+      provideReload: this.fetchData
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchServiceProvider()
+    },
+    fetchServiceProvider (name) {
+      this.fetchLoading = true
+      api('listNetworkServiceProviders', { physicalnetworkid: this.resource.id, name: name }).then(json => {
+        const sps = json.listnetworkserviceprovidersresponse.networkserviceprovider || []
+        if (sps.length > 0) {
+          for (const sp of sps) {
+            this.nsps[sp.name] = sp
+          }
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    onTabChange (tabKey) {
+      this.tabKey = tabKey
+    },
+    setNsp (nsp) {
+      this.nsp = nsp
+    },
+    async handleSubmit () {
+      if (this.currentAction.confirm) {
+        await this.executeConfirmAction()
+        return
+      }
+
+      await this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.nsp.physicalnetworkid
+        for (const key in values) {
+          const input = values[key]
+          for (const param of this.currentAction.fieldParams) {
+            if (param.name !== key) {
+              continue
+            }
+            if (param.type === 'uuid') {
+              params[key] = param.opts[input].id
+            } else if (param.type === 'list') {
+              params[key] = input.map(e => { return param.opts[e].id }).reduce((str, name) => { return str + ',' + name })
+            } else {
+              params[key] = input
+            }
+          }
+        }
+        if (this.currentAction.mapping) {
+          for (const key in this.currentAction.mapping) {
+            if (!this.currentAction.mapping[key].value) {
+              continue
+            }
+            params[key] = this.currentAction.mapping[key].value(this.resource, params)
+          }
+        }
+        this.actionLoading = true
+
+        try {
+          if (!this.nsp.id) {
+            const serviceParams = {}
+            serviceParams.name = this.nsp.name
+            serviceParams.physicalnetworkid = this.nsp.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(serviceParams)
+            this.nsp = { ...this.nsp, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const hasJobId = await this.executeApi(this.currentAction.api, params, this.currentAction.method)
+          if (!hasJobId) {
+            await this.$message.success('Success')
+            await this.fetchData()
+          }
+          this.actionLoading = false
+          this.onCloseAction()
+        } catch (error) {
+          this.actionLoading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: error
+          })
+        }
+      })
+    },
+    onCloseAction () {
+      this.currentAction = {}
+      this.showFormAction = false
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          message = (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          reject(message)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    },
+    executeAction (action) {
+      this.currentAction = action
+      if (this.currentAction.confirm) {
+        this.$confirm({
+          title: this.$t('label.confirmation'),
+          content: this.$t(action.confirm),
+          onOk: this.handleSubmit
+        })
+      } else {
+        this.showFormAction = true
+        if (!action.component) {
+          const apiParams = store.getters.apis[action.api].params || []
+          this.currentAction.fieldParams = action.args.map(arg => {
+            const field = apiParams.filter(param => param.name === arg)[0]
+            if (field.type === 'uuid') {
+              this.listFieldOpts(field)
+            }
+            return field
+          }) || []
+          if (this.currentAction.api === 'addCiscoVnmcResource') {
+            this.currentAction.method = 'POST'
+          }
+        }
+      }
+    },
+    listFieldOpts (field) {
+      const paramName = field.name
+      const params = { listall: true }
+      const possibleName = 'list' + paramName.replace('ids', '').replace('id', '').toLowerCase() + 's'
+      let possibleApi
+      for (const api in store.getters.apis) {
+        if (api.toLowerCase().startsWith(possibleName)) {
+          possibleApi = api
+          break
+        }
+      }
+      if (this.currentAction.mapping) {
+        Object.keys(this.currentAction.mapping).forEach(key => {
+          if (this.currentAction.mapping[key].params) {
+            params[key] = this.currentAction.mapping[key].params(this.resource)
+          }
+        })
+      }
+      if (!possibleApi) {
+        return
+      }
+      field.loading = true
+      field.opts = []
+      api(possibleApi, params).then(json => {
+        field.loading = false
+        for (const obj in json) {
+          if (obj.includes('response')) {
+            for (const res in json[obj]) {
+              if (res === 'count') {
+                continue
+              }
+              field.opts = json[obj][res]
+              this.$forceUpdate()
+              break
+            }
+            break
+          }
+        }
+      }).catch(error => {
+        console.log(error.stack)
+        field.loading = false
+      })
+    },
+    async executeConfirmAction () {
+      const params = {}
+      params.id = this.nsp.id
+      if (this.currentAction.mapping) {
+        for (const key in this.currentAction.mapping) {
+          if (!this.currentAction.mapping[key].value) {
+            continue
+          }
+          params[key] = this.currentAction.mapping[key].value(this.resource, params)
+        }
+      }
+      this.actionLoading = true
+
+      try {
+        const hasJobId = await this.executeApi(this.currentAction.api, params)
+        if (!hasJobId) {
+          await this.fetchData()
+        }
+        this.actionLoading = false
+        this.onCloseAction()
+      } catch (message) {
+        this.actionLoading = false
+        this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: message
+        })
+      }
+    },
+    executeApi (apiName, args, method) {
+      return new Promise((resolve, reject) => {
+        let hasJobId = false
+        let message = ''
+        const promise = (method === 'POST') ? api(apiName, {}, method, args) : api(apiName, args)
+        promise.then(json => {
+          for (const obj in json) {
+            if (obj.includes('response') || obj.includes(apiName)) {
+              for (const res in json[obj]) {
+                if (res === 'jobid') {
+                  this.$store.dispatch('AddAsyncJob', {
+                    title: this.$t(this.currentAction.label),
+                    jobid: json[obj][res],
+                    description: this.$t(this.nsp.name),
+                    status: 'progress'
+                  })
+                  this.parentPollActionCompletion(json[obj][res], this.currentAction)
+                  hasJobId = true
+                  break
+                }
+              }
+              break
+            }
+          }
+
+          resolve(hasJobId)
+        }).catch(error => {
+          message = (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          reject(message)
+        })
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/infra/network/TrafficTypesTab.vue b/ui/src/views/infra/network/TrafficTypesTab.vue
new file mode 100644
index 0000000..3b14f9c
--- /dev/null
+++ b/ui/src/views/infra/network/TrafficTypesTab.vue
@@ -0,0 +1,139 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-tabs :tabPosition="device === 'mobile' ? 'top' : 'left'" :animated="false">
+      <a-tab-pane v-for="(item, index) in traffictypes" :tab="item.traffictype" :key="index">
+        <div
+          v-for="(type, idx) in ['kvmnetworklabel', 'vmwarenetworklabel', 'xennetworklabel', 'hypervnetworklabel', 'ovm3networklabel']"
+          :key="idx"
+          style="margin-bottom: 10px;">
+          <div><strong>{{ $t(type) }}</strong></div>
+          <div>{{ item[type] || $t('label.network.label.display.for.blank.value') }}</div>
+        </div>
+        <div v-if="item.traffictype === 'Guest'">
+          <a-divider />
+          <IpRangesTabGuest :resource="resource" :loading="loading" />
+        </div>
+        <div v-if="item.traffictype === 'Public'">
+          <div style="margin-bottom: 10px;">
+            <div><strong>{{ $t('label.traffictype') }}</strong></div>
+            <div>{{ publicNetwork.traffictype }}</div>
+          </div>
+          <div style="margin-bottom: 10px;">
+            <div><strong>{{ $t('label.broadcastdomaintype') }}</strong></div>
+            <div>{{ publicNetwork.broadcastdomaintype }}</div>
+          </div>
+          <a-divider />
+          <IpRangesTabPublic :resource="resource" :loading="loading" :network="publicNetwork" />
+        </div>
+        <div v-if="item.traffictype === 'Management'">
+          <a-divider />
+          <IpRangesTabManagement :resource="resource" :loading="loading" />
+        </div>
+        <div v-if="item.traffictype === 'Storage'">
+          <a-divider />
+          <IpRangesTabStorage :resource="resource" />
+        </div>
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import IpRangesTabPublic from './IpRangesTabPublic'
+import IpRangesTabManagement from './IpRangesTabManagement'
+import IpRangesTabStorage from './IpRangesTabStorage'
+import IpRangesTabGuest from './IpRangesTabGuest'
+
+export default {
+  name: 'TrafficTypesTab',
+  components: {
+    IpRangesTabPublic,
+    IpRangesTabManagement,
+    IpRangesTabStorage,
+    IpRangesTabGuest
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      traffictypes: [],
+      publicNetwork: {},
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    if (this.resource.id) {
+      this.fetchData()
+    }
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchLoading = true
+      api('listTrafficTypes', { physicalnetworkid: this.resource.id }).then(json => {
+        this.traffictypes = json.listtraffictypesresponse.traffictype
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+
+      this.fetchLoading = true
+      api('listNetworks', {
+        listAll: true,
+        trafficType: 'Public',
+        isSystem: true,
+        zoneId: this.resource.zoneid
+      }).then(json => {
+        if (json.listnetworksresponse && json.listnetworksresponse.network && json.listnetworksresponse.network.length > 0) {
+          this.publicNetwork = json.listnetworksresponse.network[0]
+        } else {
+          this.publicNetwork = {}
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>
diff --git a/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue b/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue
new file mode 100644
index 0000000..d2f49e7
--- /dev/null
+++ b/ui/src/views/infra/network/providers/AddF5LoadBalancer.vue
@@ -0,0 +1,321 @@
+// 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-form
+      :form="form"
+      layout="vertical"
+      @submit="handleSubmit">
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.ip')">
+            <a-input
+              v-decorator="['ip', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="['username', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.password')">
+            <a-input-password
+              v-decorator="['password', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.networkdevicetype')">
+            <a-select
+              v-decorator="['networkdevicetype', {
+                rules: [{ required: true, message: $t('message.error.select') }]
+              }]">
+              <a-select-option
+                v-for="opt in networkDeviceType"
+                :key="opt.id">{{ $t(opt.description) }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.publicinterface')">
+            <a-input
+              v-decorator="['publicinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.privateinterface')">
+            <a-input
+              v-decorator="['privateinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.numretries')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['numretries', { initialValue: 2 }]" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.dedicated')">
+            <a-switch
+              v-decorator="['dedicated', { initialValue: false }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.capacity')">
+            <a-input
+              v-decorator="['capacity']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddF5LoadBalancer',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      nsp: {}
+    }
+  },
+  computed: {
+    networkDeviceType () {
+      const items = []
+      items.push({
+        id: 'F5BigIpLoadBalancer',
+        description: 'label.f5.ip.loadbalancer'
+      })
+
+      return items
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.resource && Object.keys(this.resource).length > 0) {
+      this.nsp = this.resource
+    }
+  },
+  inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
+  methods: {
+    onCloseAction () {
+      this.provideCloseAction()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.resource.physicalnetworkid
+        params.username = values.username
+        params.password = values.password
+        params.networkdevicetype = values.networkdevicetype
+
+        const url = []
+        const ip = values.ip
+        url.push('https://' + ip)
+        let isQuestionMarkAdded = false
+
+        const publicInterface = values.publicinterface ? values.publicinterface : null
+        if (publicInterface != null && publicInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicinterface=' + publicInterface)
+        }
+
+        const privateInterface = values.privateinterface ? values.privateinterface : null
+        if (privateInterface != null && privateInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privateinterface=' + publicInterface)
+        }
+
+        const numretries = values.numretries ? values.numretries : null
+        if (numretries != null && numretries.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('numretries=' + numretries)
+        }
+
+        const capacity = values.capacity ? values.capacity : null
+        if (capacity != null && capacity.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('lbdevicecapacity=' + capacity)
+        }
+
+        const dedicated = values.dedicated ? values.dedicated : false
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('lbdevicededicated=' + dedicated)
+
+        params.url = url.join('')
+
+        this.loading = true
+
+        try {
+          if (!this.nsp.id) {
+            const addParams = {}
+            addParams.name = this.resource.name
+            addParams.physicalnetworkid = this.resource.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
+            this.nsp = { ...this.resource, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const jobId = await this.addF5LoadBalancer(params)
+          if (jobId) {
+            await this.$store.dispatch('AddAsyncJob', {
+              title: this.$t(this.action.label),
+              jobid: jobId,
+              description: this.$t(this.nsp.name),
+              status: 'progress'
+            })
+            await this.parentPollActionCompletion(jobId, this.action)
+          }
+          this.loading = false
+          await this.provideCloseAction()
+        } catch (error) {
+          this.loading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }
+      })
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    addF5LoadBalancer (args) {
+      return new Promise((resolve, reject) => {
+        api('addF5LoadBalancer', args).then(json => {
+          const jobId = json.addf5bigiploadbalancerresponse.jobid || null
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue b/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue
new file mode 100644
index 0000000..786c0d4
--- /dev/null
+++ b/ui/src/views/infra/network/providers/AddNetscalerLoadBalancer.vue
@@ -0,0 +1,356 @@
+// 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-form
+      :form="form"
+      layout="vertical"
+      @submit="handleSubmit">
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.ip')">
+            <a-input
+              v-decorator="['ip', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="['username', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.password')">
+            <a-input-password
+              v-decorator="['password', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.networkdevicetype')">
+            <a-select
+              v-decorator="['networkdevicetype', {
+                rules: [{ required: true, message: $t('message.error.select') }]
+              }]">
+              <a-select-option
+                v-for="opt in networkDeviceType"
+                :key="opt.id">{{ $t(opt.description) }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.publicinterface')">
+            <a-input
+              v-decorator="['publicinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.privateinterface')">
+            <a-input
+              v-decorator="['privateinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.gslbprovider')">
+            <a-switch
+              v-decorator="['gslbprovider', { initialValue: false }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.gslbproviderpublicip')">
+            <a-input
+              v-decorator="['gslbproviderpublicip']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.gslbproviderprivateip')">
+            <a-input
+              v-decorator="['gslbproviderprivateip']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.numretries')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['numretries', { initialValue: 2 }]" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.dedicated')">
+            <a-switch
+              v-decorator="['dedicated', { initialValue: false }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.capacity')">
+            <a-input
+              v-decorator="['capacity']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddNetscalerLoadBalancer',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      nsp: {}
+    }
+  },
+  computed: {
+    networkDeviceType () {
+      const items = []
+      items.push({
+        id: 'NetscalerMPXLoadBalancer',
+        description: 'label.netscaler.mpx'
+      })
+      items.push({
+        id: 'NetscalerVPXLoadBalancer',
+        description: 'label.netscaler.vpx'
+      })
+      items.push({
+        id: 'NetscalerSDXLoadBalancer',
+        description: 'label.netscaler.sdx'
+      })
+
+      return items
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.resource && Object.keys(this.resource).length > 0) {
+      this.nsp = this.resource
+    }
+  },
+  inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
+  methods: {
+    onCloseAction () {
+      this.provideCloseAction()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.resource.physicalnetworkid
+        params.username = values.username
+        params.password = values.password
+        params.networkdevicetype = values.networkdevicetype
+        params.gslbprovider = values.gslbprovider ? values.gslbprovider : false
+        params.gslbproviderpublicip = values.gslbproviderpublicip ? values.gslbproviderpublicip : null
+        params.gslbproviderprivateip = values.gslbproviderprivateip ? values.gslbproviderprivateip : null
+
+        const url = []
+        const ip = values.ip
+        url.push('https://' + ip)
+        let isQuestionMarkAdded = false
+
+        const publicInterface = values.publicinterface ? values.publicinterface : null
+        if (publicInterface != null && publicInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicinterface=' + publicInterface)
+        }
+
+        const privateInterface = values.privateinterface ? values.privateinterface : null
+        if (privateInterface != null && privateInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privateinterface=' + publicInterface)
+        }
+
+        const numretries = values.numretries ? values.numretries : null
+        if (numretries != null && numretries.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('numretries=' + numretries)
+        }
+
+        const capacity = values.capacity ? values.capacity : null
+        if (capacity != null && capacity.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('lbdevicecapacity=' + capacity)
+        }
+
+        const dedicated = values.dedicated ? values.dedicated : false
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('lbdevicededicated=' + dedicated)
+
+        params.url = url.join('')
+
+        this.loading = true
+
+        try {
+          if (!this.nsp.id) {
+            const addParams = {}
+            addParams.name = this.resource.name
+            addParams.physicalnetworkid = this.resource.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
+            this.nsp = { ...this.resource, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const jobId = await this.addNetscalerLoadBalancer(params)
+          if (jobId) {
+            await this.$store.dispatch('AddAsyncJob', {
+              title: this.$t(this.action.label),
+              jobid: jobId,
+              description: this.$t(this.nsp.name),
+              status: 'progress'
+            })
+            await this.parentPollActionCompletion(jobId, this.action)
+          }
+          this.loading = false
+          await this.provideCloseAction()
+        } catch (error) {
+          this.loading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }
+      })
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    addNetscalerLoadBalancer (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetscalerLoadBalancer', args).then(json => {
+          const jobId = json.addnetscalerloadbalancerresponse.jobid || null
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue b/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue
new file mode 100644
index 0000000..d3d70f6
--- /dev/null
+++ b/ui/src/views/infra/network/providers/AddNiciraNvpDevice.vue
@@ -0,0 +1,233 @@
+// 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-form
+      :form="form"
+      layout="vertical"
+      @submit="handleSubmit">
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.ip')">
+            <a-input
+              v-decorator="['ip', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="['username', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.password')">
+            <a-input-password
+              v-decorator="['password', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.numretries')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['numretries', { initialValue: 2 }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.transportzoneuuid')">
+            <a-input
+              v-decorator="['transportzoneuuid']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.l3gatewayserviceuuid')">
+            <a-input
+              v-decorator="['l3gatewayserviceuuid']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.l2gatewayserviceuuid')">
+            <a-input
+              v-decorator="['l2gatewayserviceuuid']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddNiciraNvpDevice',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      nsp: {}
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.resource && Object.keys(this.resource).length > 0) {
+      this.nsp = this.resource
+    }
+  },
+  inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
+  methods: {
+    onCloseAction () {
+      this.provideCloseAction()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.resource.physicalnetworkid
+        params.hostname = values.ip
+        params.username = values.username
+        params.password = values.password
+        params.transportzoneuuid = values.transportzoneuuid ? values.transportzoneuuid : null
+        params.l2gatewayserviceuuid = values.l2gatewayserviceuuid ? values.l2gatewayserviceuuid : null
+        params.l3gatewayserviceuuid = values.l3gatewayserviceuuid ? values.l3gatewayserviceuuid : null
+
+        this.loading = true
+
+        try {
+          if (!this.nsp.id) {
+            const addParams = {}
+            addParams.name = this.resource.name
+            addParams.physicalnetworkid = this.resource.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
+            this.nsp = { ...this.resource, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const jobId = await this.addNiciraNvpDevice(params)
+          if (jobId) {
+            await this.$store.dispatch('AddAsyncJob', {
+              title: this.$t(this.action.label),
+              jobid: jobId,
+              description: this.$t(this.nsp.name),
+              status: 'progress'
+            })
+            await this.parentPollActionCompletion(jobId, this.action)
+          }
+          this.loading = false
+          await this.provideCloseAction()
+        } catch (error) {
+          this.loading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }
+      })
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    addNiciraNvpDevice (args) {
+      return new Promise((resolve, reject) => {
+        api('addNiciraNvpDevice', args).then(json => {
+          const jobId = json.addniciranvpdeviceresponse.jobid || null
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue b/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue
new file mode 100644
index 0000000..36c48d7
--- /dev/null
+++ b/ui/src/views/infra/network/providers/AddPaloAltoFirewall.vue
@@ -0,0 +1,445 @@
+// 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-form
+      :form="form"
+      layout="vertical"
+      @submit="handleSubmit">
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.ip')">
+            <a-input
+              v-decorator="['ip', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="['username', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.password')">
+            <a-input-password
+              v-decorator="['password', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.networkdevicetype')">
+            <a-select
+              v-decorator="['networkdevicetype', {
+                rules: [{ required: true, message: $t('message.error.select') }]
+              }]">
+              <a-select-option
+                v-for="opt in networkDeviceType"
+                :key="opt.id">{{ $t(opt.description) }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.publicinterface')">
+            <a-input
+              v-decorator="['publicinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.privateinterface')">
+            <a-input
+              v-decorator="['privateinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.usageinterface')">
+            <a-input
+              v-decorator="['usageinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.numretries')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['numretries', { initialValue: 2 }]" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.timeout')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['timeout', { initialValue: 300 }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.publicnetwork')">
+            <a-input
+              v-decorator="['publicnetwork', { initialValue: 'untrusted' }]"
+              :disabled="true" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.privatenetwork')">
+            <a-input
+              v-decorator="['privatenetwork', { initialValue: 'trusted' }]"
+              :disabled="true" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.pavr')">
+            <a-input
+              v-decorator="['pavr']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.patp')">
+            <a-input
+              v-decorator="['patp']" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.palp')">
+            <a-input
+              v-decorator="['palp']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.capacity')">
+            <a-input
+              v-decorator="['capacity']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddPaloAltoFirewall',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      nsp: {}
+    }
+  },
+  computed: {
+    networkDeviceType () {
+      const items = []
+      items.push({
+        id: 'PaloAltoFirewall',
+        description: 'label.palo.alto.firewall'
+      })
+
+      return items
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.resource && Object.keys(this.resource).length > 0) {
+      this.nsp = this.resource
+    }
+  },
+  inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
+  methods: {
+    onCloseAction () {
+      this.provideCloseAction()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.resource.physicalnetworkid
+        params.username = values.username
+        params.password = values.password
+        params.networkdevicetype = values.networkdevicetype
+
+        const url = []
+        const ip = values.ip
+        url.push('https://' + ip)
+        let isQuestionMarkAdded = false
+
+        const publicInterface = values.publicinterface ? values.publicinterface : null
+        if (publicInterface != null && publicInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicinterface=' + publicInterface)
+        }
+
+        const privateInterface = values.privateinterface ? values.privateinterface : null
+        if (privateInterface != null && privateInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privateinterface=' + publicInterface)
+        }
+
+        const usageInterface = values.usageinterface ? values.usageinterface : null
+        if (usageInterface != null && usageInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('usageinterface=' + usageInterface)
+        }
+
+        const numretries = values.numretries ? values.numretries : null
+        if (numretries != null && numretries.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('numretries=' + numretries)
+        }
+
+        const timeout = values.timeout ? values.timeout : null
+        if (timeout != null && timeout.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('timeout=' + timeout)
+        }
+
+        const publicNetwork = values.publicnetwork ? values.publicnetwork : null
+        if (publicNetwork != null && publicNetwork.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicnetwork=' + publicNetwork)
+        }
+
+        const privateNetwork = values.privatenetwork ? values.privatenetwork : null
+        if (privateNetwork != null && privateNetwork.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privatenetwork=' + privateNetwork)
+        }
+
+        const capacity = values.capacity ? values.capacity : null
+        if (capacity != null && capacity.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('lbdevicecapacity=' + capacity)
+        }
+
+        const dedicated = values.dedicated ? values.dedicated : false
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('lbdevicededicated=' + dedicated)
+
+        const externalVirtualRouter = values.pavr ? values.pavr : null
+        if (externalVirtualRouter != null && externalVirtualRouter.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('pavr=' + externalVirtualRouter)
+        }
+
+        const externalThreatProfile = values.patp ? values.patp : null
+        if (externalThreatProfile != null && externalThreatProfile.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('patp=' + externalThreatProfile)
+        }
+
+        const externalLogProfile = values.palp ? values.palp : null
+        if (externalLogProfile != null && externalLogProfile.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('palp=' + externalLogProfile)
+        }
+
+        params.url = url.join('')
+
+        this.loading = true
+
+        try {
+          if (!this.nsp.id) {
+            const addParams = {}
+            addParams.name = this.resource.name
+            addParams.physicalnetworkid = this.resource.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
+            this.nsp = { ...this.resource, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const jobId = await this.addPaloAltoFirewall(params)
+          if (jobId) {
+            await this.$store.dispatch('AddAsyncJob', {
+              title: this.$t(this.action.label),
+              jobid: jobId,
+              description: this.$t(this.nsp.name),
+              status: 'progress'
+            })
+            await this.parentPollActionCompletion(jobId, this.action)
+          }
+          this.loading = false
+          await this.provideCloseAction()
+        } catch (error) {
+          this.loading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }
+      })
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    addPaloAltoFirewall (args) {
+      return new Promise((resolve, reject) => {
+        api('addPaloAltoFirewall', args).then(json => {
+          const jobId = json.addpaloaltofirewallresponse.jobid || null
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/providers/AddSrxFirewall.vue b/ui/src/views/infra/network/providers/AddSrxFirewall.vue
new file mode 100644
index 0000000..19a5cb9
--- /dev/null
+++ b/ui/src/views/infra/network/providers/AddSrxFirewall.vue
@@ -0,0 +1,390 @@
+// 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-form
+      :form="form"
+      layout="vertical"
+      @submit="handleSubmit">
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.ip')">
+            <a-input
+              v-decorator="['ip', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.username')">
+            <a-input
+              v-decorator="['username', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.password')">
+            <a-input-password
+              v-decorator="['password', {
+                rules: [{ required: true, message: $t('message.error.required.input') }]
+              }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.networkdevicetype')">
+            <a-select
+              v-decorator="['networkdevicetype', {
+                rules: [{ required: true, message: $t('message.error.select') }]
+              }]">
+              <a-select-option
+                v-for="opt in networkDeviceType"
+                :key="opt.id">{{ $t(opt.description) }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.publicinterface')">
+            <a-input
+              v-decorator="['publicinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.privateinterface')">
+            <a-input
+              v-decorator="['privateinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.usageinterface')">
+            <a-input
+              v-decorator="['usageinterface']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.numretries')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['numretries', { initialValue: 2 }]" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.timeout')">
+            <a-input-number
+              style="width: 100%"
+              v-decorator="['timeout', { initialValue: 300 }]" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.publicnetwork')">
+            <a-input
+              v-decorator="['publicnetwork', { initialValue: 'untrusted' }]"
+              :disabled="true" />
+          </a-form-item>
+        </a-col>
+        <a-col :md="12" :lg="12">
+          <a-form-item :label="$t('label.privatenetwork')">
+            <a-input
+              v-decorator="['privatenetwork', { initialValue: 'trusted' }]"
+              :disabled="true" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <a-row :gutter="12">
+        <a-col :md="24" :lg="24">
+          <a-form-item :label="$t('label.capacity')">
+            <a-input
+              v-decorator="['capacity']" />
+          </a-form-item>
+        </a-col>
+      </a-row>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @click="onCloseAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddSrxFirewall',
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      nsp: {}
+    }
+  },
+  computed: {
+    networkDeviceType () {
+      const items = []
+      items.push({
+        id: 'JuniperSRXFirewall',
+        description: 'label.srx.firewall'
+      })
+
+      return items
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    if (this.resource && Object.keys(this.resource).length > 0) {
+      this.nsp = this.resource
+    }
+  },
+  inject: ['provideCloseAction', 'provideReload', 'provideCloseAction', 'parentPollActionCompletion'],
+  methods: {
+    onCloseAction () {
+      this.provideCloseAction()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields(async (err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.physicalnetworkid = this.resource.physicalnetworkid
+        params.username = values.username
+        params.password = values.password
+        params.networkdevicetype = values.networkdevicetype
+
+        const url = []
+        const ip = values.ip
+        url.push('https://' + ip)
+        let isQuestionMarkAdded = false
+
+        const publicInterface = values.publicinterface ? values.publicinterface : null
+        if (publicInterface != null && publicInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicinterface=' + publicInterface)
+        }
+
+        const privateInterface = values.privateinterface ? values.privateinterface : null
+        if (privateInterface != null && privateInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privateinterface=' + publicInterface)
+        }
+
+        const usageInterface = values.usageinterface ? values.usageinterface : null
+        if (usageInterface != null && usageInterface.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('usageinterface=' + usageInterface)
+        }
+
+        const numretries = values.numretries ? values.numretries : null
+        if (numretries != null && numretries.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('numretries=' + numretries)
+        }
+
+        const timeout = values.timeout ? values.timeout : null
+        if (timeout != null && timeout.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('timeout=' + timeout)
+        }
+
+        const publicNetwork = values.publicnetwork ? values.publicnetwork : null
+        if (publicNetwork != null && publicNetwork.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('publicnetwork=' + publicNetwork)
+        }
+
+        const privateNetwork = values.privatenetwork ? values.privatenetwork : null
+        if (privateNetwork != null && privateNetwork.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('privatenetwork=' + privateNetwork)
+        }
+
+        const capacity = values.capacity ? values.capacity : null
+        if (capacity != null && capacity.length > 0) {
+          if (!isQuestionMarkAdded) {
+            url.push('?')
+            isQuestionMarkAdded = true
+          } else {
+            url.push('&')
+          }
+          url.push('lbdevicecapacity=' + capacity)
+        }
+
+        const dedicated = values.dedicated ? values.dedicated : false
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('lbdevicededicated=' + dedicated)
+
+        params.url = url.join('')
+
+        this.loading = true
+
+        try {
+          if (!this.nsp.id) {
+            const addParams = {}
+            addParams.name = this.resource.name
+            addParams.physicalnetworkid = this.resource.physicalnetworkid
+            const networkServiceProvider = await this.addNetworkServiceProvider(addParams)
+            this.nsp = { ...this.resource, ...networkServiceProvider }
+          }
+          params.id = this.nsp.id
+          const jobId = await this.addSrxFirewall(params)
+          if (jobId) {
+            await this.$store.dispatch('AddAsyncJob', {
+              title: this.$t(this.action.label),
+              jobid: jobId,
+              description: this.$t(this.nsp.name),
+              status: 'progress'
+            })
+            await this.parentPollActionCompletion(jobId, this.action)
+          }
+          this.loading = false
+          await this.provideCloseAction()
+        } catch (error) {
+          this.loading = false
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }
+      })
+    },
+    addNetworkServiceProvider (args) {
+      return new Promise((resolve, reject) => {
+        api('addNetworkServiceProvider', args).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              reject(result.jobresult.errortext)
+              return
+            }
+            resolve(result.jobresult.networkserviceprovider)
+          }
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    addSrxFirewall (args) {
+      return new Promise((resolve, reject) => {
+        api('addSrxFirewall', args).then(json => {
+          const jobId = json.addsrxfirewallresponse.jobid || null
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/network/providers/ProviderDetail.vue b/ui/src/views/infra/network/providers/ProviderDetail.vue
new file mode 100644
index 0000000..ce756ed
--- /dev/null
+++ b/ui/src/views/infra/network/providers/ProviderDetail.vue
@@ -0,0 +1,60 @@
+// 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>
+    <a-list size="small" :dataSource="details">
+      <a-list-item slot="renderItem" slot-scope="item">
+        <div>
+          <strong>{{ $t(`label.${item}`) }}</strong>
+          <br />
+          <div v-if="item === 'servicelist'">
+            {{ nsp[item] ? nsp[item].join(', ') : '' }}
+          </div>
+          <span v-else-if="item !== 'state'">{{ nsp[item] ? nsp[item] : '' }}</span>
+          <span v-else>
+            <status :text="nsp[item] ? nsp[item] : 'Disabled'" displayText />
+          </span>
+        </div>
+      </a-list-item>
+    </a-list>
+  </div>
+</template>
+
+<script>
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'ProviderDetail',
+  components: {
+    Status
+  },
+  props: {
+    details: {
+      type: Array,
+      default: () => []
+    },
+    nsp: {
+      type: Object,
+      default: () => {}
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/infra/network/providers/ProviderItem.vue b/ui/src/views/infra/network/providers/ProviderItem.vue
new file mode 100644
index 0000000..458fa89
--- /dev/null
+++ b/ui/src/views/infra/network/providers/ProviderItem.vue
@@ -0,0 +1,256 @@
+// 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>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24" style="text-align: left">
+        <action-button
+          :actions="provider.actions"
+          :resource="resource"
+          :loading="loading"
+          @exec-action="handleExecAction"/>
+      </a-col>
+    </a-row>
+    <provider-detail
+      style="margin-top: 10px"
+      :details="provider.details"
+      :nsp="resource"
+      :loading="loading" />
+    <div
+      v-for="(list, index) in listData"
+      :key="index">
+      <provider-list-view
+        style="border-top: 1px solid #ddd; padding-top: 5px;"
+        v-if="resource.id"
+        :title="list.title"
+        :action="currentAction"
+        :dataSource="list.data"
+        :columns="list.columns"
+        :itemCount="list.itemCount"
+        :resource="resource"
+        :page="page"
+        :pageSize="pageSize"
+        :loading="loading || list.loading" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import ActionButton from '@/components/view/ActionButton'
+import ProviderDetail from '@/views/infra/network/providers/ProviderDetail'
+import ProviderListView from '@/views/infra/network/providers/ProviderListView'
+
+export default {
+  name: 'ProviderItem',
+  components: {
+    ActionButton,
+    ProviderDetail,
+    ProviderListView
+  },
+  props: {
+    itemNsp: {
+      type: Object,
+      required: true
+    },
+    nsp: {
+      type: Object,
+      default: () => {}
+    },
+    resourceId: {
+      type: String,
+      default: () => ''
+    },
+    zoneId: {
+      type: String,
+      default: () => ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      provider: {},
+      listData: {},
+      resource: {},
+      currentAction: {},
+      page: 1,
+      pageSize: 10,
+      itemCount: 0
+    }
+  },
+  provide () {
+    return {
+      providerChangePage: this.changePage
+    }
+  },
+  inject: ['provideSetNsp', 'provideExecuteAction'],
+  watch: {
+    loading (newValue, oldValue) {
+      if (newValue !== oldValue && !newValue) {
+        this.fetchData()
+      }
+    },
+    nsp (newData, oldData) {
+      if (newData && Object.keys(newData).length > 0) {
+        this.nsp = newData
+        this.resource = this.nsp
+        this.$set(this.resource, 'zoneid', this.zoneId)
+        this.provideSetNsp(this.resource)
+        this.fetchData()
+      }
+    }
+  },
+  mounted () {
+    if (!this.nsp || Object.keys(this.nsp).length === 0) {
+      this.resource = {
+        name: this.itemNsp.title,
+        state: 'Disabled',
+        physicalnetworkid: this.resourceId,
+        zoneid: this.zoneId
+      }
+    } else {
+      this.resource = this.nsp
+      this.$set(this.resource, 'zoneid', this.zoneId)
+    }
+    if (this.itemNsp && Object.keys(this.itemNsp).length > 0) {
+      this.provider = this.itemNsp
+      this.provideSetNsp(this.resource)
+      this.fetchData()
+    }
+  },
+  methods: {
+    async fetchData () {
+      if (!this.provider.lists || this.provider.lists.length === 0) {
+        return
+      }
+      this.provider.lists.map(this.fetchOptions)
+    },
+    async fetchOptions (args) {
+      if (!args || Object.keys(args).length === 0) {
+        return
+      }
+
+      const params = {}
+      if (args.mapping) {
+        Object.keys(args.mapping).map(key => {
+          params[key] = 'value' in args.mapping[key] ? args.mapping[key].value(this.resource) : null
+        })
+      }
+      params.page = this.page
+      params.pageSize = this.pageSize
+
+      let length = args.columns.length
+      if (args.columns.includes('action')) {
+        length--
+      }
+      const columns = args.columns.map(col => {
+        if (col === 'action') {
+          return {
+            title: this.$t('label.' + col),
+            dataIndex: col,
+            width: 80,
+            fixed: 'right',
+            scopedSlots: { customRender: col }
+          }
+        }
+        const width = 100 / (length) + '%'
+        return {
+          title: this.$t('label.' + col),
+          width: width,
+          dataIndex: col,
+          scopedSlots: { customRender: col }
+        }
+      })
+
+      this.listData[args.title] = {
+        title: args.title,
+        columns: columns,
+        data: [],
+        itemCount: 0,
+        loading: true
+      }
+
+      try {
+        const listResult = await this.executeApi(args.api, params)
+        this.listData[args.title].data = listResult.data
+        this.listData[args.title].itemCount = listResult.itemCount
+        this.listData[args.title].loading = false
+      } catch (error) {
+        this.listData[args.title].loading = false
+        this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+        })
+      }
+      this.$forceUpdate()
+    },
+    executeApi (apiName, params) {
+      return new Promise((resolve, reject) => {
+        api(apiName, params).then(json => {
+          let responseName
+          let objectName
+          let itemCount = 0
+          const result = {
+            data: [],
+            itemCount: 0
+          }
+          for (const key in json) {
+            if (key.includes('response') || key.includes(apiName)) {
+              responseName = key
+              break
+            }
+          }
+          if (!responseName) {
+            resolve(result)
+            return
+          }
+          for (const key in json[responseName]) {
+            if (key === 'count') {
+              itemCount = json[responseName].count
+              continue
+            }
+            objectName = key
+            break
+          }
+          result.data = json[responseName][objectName] || []
+          result.itemCount = itemCount
+          resolve(result)
+        }).catch(e => {
+          reject(e)
+        })
+      })
+    },
+    handleExecAction (action) {
+      this.currentAction = action
+      this.provideExecuteAction(action)
+    },
+    changePage (listName, page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      const listItem = this.provider.lists.filter(provider => provider.title === listName)[0] || {}
+      this.fetchOptions(listItem)
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/infra/network/providers/ProviderListView.vue b/ui/src/views/infra/network/providers/ProviderListView.vue
new file mode 100644
index 0000000..a2d1142
--- /dev/null
+++ b/ui/src/views/infra/network/providers/ProviderListView.vue
@@ -0,0 +1,389 @@
+// 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>
+    <strong>{{ $t(title) }}</strong>
+    <a-table
+      style="margin-top: 10px;"
+      size="small"
+      class="row-list-data"
+      :loading="loading"
+      :columns="listCols"
+      :dataSource="dataSource"
+      :rowKey="record => record.id || record.name || record.nvpdeviceid || record.resourceid"
+      :pagination="false"
+      :scroll="scrollable">
+      <template slot="name" slot-scope="text, record">
+        <span v-if="record.role==='VIRTUAL_ROUTER'">
+          <router-link :to="{ path: '/router' + '/' + record.id }" v-if="record.id">{{ text }}</router-link>
+          <label v-else>{{ text }}</label>
+        </span>
+        <span v-else>{{ text }}</span>
+      </template>
+      <template slot="hostname" slot-scope="text, record">
+        <span v-if="record.role==='VIRTUAL_ROUTER'">
+          <router-link :to="{ path: '/host' + '/' + record.hostid }" v-if="record.hostid">{{ text }}</router-link>
+          <label v-else>{{ text }}</label>
+        </span>
+        <span v-else>{{ text }}</span>
+      </template>
+      <template slot="zonename" slot-scope="text, record">
+        <span v-if="record.role==='VIRTUAL_ROUTER'">
+          <router-link :to="{ path: '/zone' + '/' + record.zoneid }" v-if="record.zoneid">{{ text }}</router-link>
+          <label v-else>{{ text }}</label>
+        </span>
+        <span v-else>{{ text }}</span>
+      </template>
+      <template slot="action" slot-scope="text, record">
+        <a-tooltip placement="top">
+          <template slot="title">
+            <span v-if="resource.name==='BigSwitchBcf'">{{ $t('label.delete.bigswitchbcf') }}</span>
+            <span v-else-if="resource.name==='BrocadeVcs'">{{ $t('label.delete.brocadevcs') }}</span>
+            <span v-else-if="resource.name==='NiciraNvp'">{{ $t('label.delete.niciranvp') }}</span>
+            <span v-else-if="resource.name==='F5BigIp'">{{ $t('label.delete.f5') }}</span>
+            <span v-else-if="resource.name==='JuniperSRX'">{{ $t('label.delete.srx') }}</span>
+            <span v-else-if="resource.name==='Netscaler'">{{ $t('label.delete.netscaler') }}</span>
+            <span v-else-if="resource.name==='Opendaylight'">{{ $t('label.delete.opendaylight.device') }}</span>
+            <span v-else-if="resource.name==='PaloAlto'">{{ $t('label.delete.pa') }}</span>
+            <span v-else-if="resource.name==='CiscoVnmc' && title==='listCiscoVnmcResources'">
+              {{ $t('label.delete.ciscovnmc.resource') }}
+            </span>
+            <span v-else-if="resource.name==='CiscoVnmc' && title==='listCiscoAsa1000vResources'">
+              {{ $t('label.delete.ciscoasa1000v') }}
+            </span>
+          </template>
+          <a-button
+            v-if="resource.name==='Ovs'"
+            type="default"
+            shape="circle"
+            icon="setting"
+            size="small"
+            :loading="actionLoading"
+            @click="onConfigureOvs(record)"/>
+          <a-button
+            v-else
+            type="danger"
+            shape="circle"
+            icon="close"
+            size="small"
+            :loading="actionLoading"
+            @click="onDelete(record)"/>
+        </a-tooltip>
+      </template>
+      <template slot="lbdevicestate" slot-scope="text">
+        <status :text="text ? text : ''" displayText />
+      </template>
+      <template slot="status" slot-scope="text">
+        <status :text="text ? text : ''" displayText />
+      </template>
+      <template slot="state" slot-scope="text">
+        <status :text="text ? text : ''" displayText />
+      </template>
+    </a-table>
+    <a-pagination
+      size="small"
+      class="row-pagination"
+      :current="page"
+      :pageSize="pageSize"
+      :total="itemCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger
+      showQuickJumper>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'ProviderListView',
+  components: { Status },
+  props: {
+    title: {
+      type: String,
+      required: true
+    },
+    columns: {
+      type: Array,
+      required: true
+    },
+    dataSource: {
+      type: Array,
+      default: () => []
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    page: {
+      type: Number,
+      default: () => 1
+    },
+    pageSize: {
+      type: Number,
+      default: () => 10
+    },
+    itemCount: {
+      type: Number,
+      default: () => 0
+    },
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    action: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      actionLoading: false
+    }
+  },
+  computed: {
+    scrollable () {
+      if (this.dataSource.length === 0) {
+        return { y: '60vh', x: 'auto' }
+      } else if (this.columns.length > 3) {
+        return { y: '60vh', x: '50vw' }
+      }
+
+      return { y: '60vh' }
+    },
+    listCols () {
+      const columns = []
+      this.columns.forEach(col => {
+        if (col.dataIndex === 'hostname' && this.resource.name === 'BigSwitchBcf') {
+          col.title = this.$t('label.bigswitch.controller.address')
+        }
+        if (col.dataIndex === 'hostname' && this.resource.name === 'BrocadeVcs') {
+          col.title = this.$t('label.brocade.vcs.address')
+        }
+        columns.push(col)
+      })
+      return columns
+    }
+  },
+  inject: ['providerChangePage', 'provideReload', 'parentPollActionCompletion'],
+  methods: {
+    changePage (page, pageSize) {
+      this.providerChangePage(this.title, page, pageSize)
+    },
+    changePageSize (currentPage, pageSize) {
+      this.providerChangePage(this.title, currentPage, pageSize)
+    },
+    onDelete (record) {
+      let apiName
+      let confirmation
+      let label
+      let name
+      const params = {}
+      switch (this.resource.name) {
+        case 'BigSwitchBcf':
+          label = 'label.delete.bigswitchbcf'
+          name = record.hostname
+          apiName = 'deleteBigSwitchBcfDevice'
+          confirmation = 'message.confirm.delete.bigswitchbcf'
+          params.bcfdeviceid = record.bcfdeviceid
+          break
+        case 'F5BigIp':
+          label = 'label.delete.f5'
+          name = record.ipaddress
+          apiName = 'deleteF5LoadBalancer'
+          confirmation = 'message.confirm.delete.f5'
+          params.lbdeviceid = record.lbdeviceid
+          break
+        case 'NiciraNvp':
+          label = 'label.delete.niciranvp'
+          name = record.hostname
+          apiName = 'deleteNiciraNvpDevice'
+          confirmation = 'message.confirm.delete.niciranvp'
+          params.nvpdeviceid = record.nvpdeviceid
+          break
+        case 'BrocadeVcs':
+          label = 'label.delete.brocadevcs'
+          name = record.hostname
+          apiName = 'deleteBrocadeVcsDevice'
+          confirmation = 'message.confirm.delete.brocadevcs'
+          params.vcsdeviceid = record.vcsdeviceid
+          break
+        case 'JuniperSRX':
+          label = 'label.delete.srx'
+          name = record.ipaddress
+          apiName = 'deleteSrxFirewall'
+          confirmation = 'message.confirm.delete.srx'
+          params.fwdeviceid = record.fwdeviceid
+          break
+        case 'Netscaler':
+          label = 'label.delete.netscaler'
+          name = record.ipaddress
+          apiName = 'deleteNetscalerLoadBalancer'
+          confirmation = 'message.confirm.delete.netscaler'
+          params.lbdeviceid = record.lbdeviceid
+          break
+        case 'Opendaylight':
+          label = 'label.delete.opendaylight.device'
+          name = record.name
+          apiName = 'deleteOpenDaylightController'
+          confirmation = 'message.confirm.delete.Opendaylight'
+          params.id = record.id
+          break
+        case 'PaloAlto':
+          label = 'label.delete.PA'
+          name = record.ipaddress
+          apiName = 'deletePaloAltoFirewall'
+          confirmation = 'message.confirm.delete.pa'
+          params.fwdeviceid = record.fwdeviceid
+          break
+        case 'CiscoVnmc':
+          if (this.title === 'listCiscoVnmcResources') {
+            label = 'label.delete.ciscovnmc.resource'
+            apiName = 'deleteCiscoVnmcResource'
+            confirmation = 'message.confirm.delete.ciscovnmc.resource'
+          } else {
+            label = 'label.delete.ciscoasa1000v'
+            apiName = 'deleteCiscoAsa1000vResource'
+            confirmation = 'message.confirm.delete.ciscoasa1000v'
+          }
+
+          name = record.hostname
+          params.resourceid = record.resourceid
+          break
+        default:
+          break
+      }
+
+      this.$confirm({
+        title: this.$t('label.confirmation'),
+        content: this.$t(confirmation),
+        onOk: async () => {
+          if (apiName) {
+            this.actionLoading = true
+            try {
+              const jobId = await this.executeDeleteRecord(apiName, params)
+              if (jobId) {
+                this.$store.dispatch('AddAsyncJob', {
+                  title: this.$t(label),
+                  jobid: jobId,
+                  description: this.$t(name),
+                  status: 'progress'
+                })
+                this.parentPollActionCompletion(jobId, this.action)
+              } else {
+                this.$success('Success')
+                this.provideReload()
+              }
+              this.actionLoading = false
+            } catch (error) {
+              this.actionLoading = false
+              this.$notification.error({
+                message: this.$t('message.request.failed'),
+                description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+              })
+            }
+          }
+        }
+      })
+    },
+    onConfigureOvs (record) {
+      const params = {}
+      params.id = record.id
+      params.enabled = true
+
+      this.$confirm({
+        title: this.$t('label.confirmation'),
+        content: this.$t('message.confirm.configure.ovs'),
+        onOk: async () => {
+          this.actionLoading = true
+          try {
+            const jobId = await this.configureOvsElement(params)
+            if (jobId) {
+              this.$store.dispatch('AddAsyncJob', {
+                title: this.$t('label.configure.ovs'),
+                jobid: jobId,
+                description: this.$t(record.id),
+                status: 'progress'
+              })
+              this.parentPollActionCompletion(jobId, this.action)
+            } else {
+              this.$success('Success')
+              this.provideReload()
+            }
+            this.actionLoading = false
+          } catch (error) {
+            this.actionLoading = false
+            this.$notification.error({
+              message: this.$t('message.request.failed'),
+              description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+            })
+          }
+        }
+      })
+    },
+    executeDeleteRecord (apiName, args) {
+      return new Promise((resolve, reject) => {
+        let jobId = null
+        api(apiName, args).then(json => {
+          for (const obj in json) {
+            if (obj.includes('response')) {
+              for (const res in json[obj]) {
+                if (res === 'jobid') {
+                  jobId = json[obj][res]
+                  break
+                }
+              }
+              break
+            }
+          }
+
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    configureOvsElement (args) {
+      return new Promise((resolve, reject) => {
+        api('configureOvsElement', args).then(json => {
+          const jobId = json.configureovselementresponse.jobid
+          resolve(jobId)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.row-pagination {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  text-align: right;
+}
+</style>
diff --git a/ui/src/views/infra/routers/RouterHealthCheck.vue b/ui/src/views/infra/routers/RouterHealthCheck.vue
new file mode 100644
index 0000000..fdc8737
--- /dev/null
+++ b/ui/src/views/infra/routers/RouterHealthCheck.vue
@@ -0,0 +1,199 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-alert
+      v-if="!routerHealthChecksEnabled"
+      banner
+      :message="$t('message.action.router.health.checks.disabled.warning')" />
+    <div v-else>
+      <a-button :disabled="!('getRouterHealthCheckResults' in $store.getters.apis)" type="primary" icon="play-circle" style="width: 100%; margin-bottom: 15px" @click="showGetHelathCheck">
+        {{ $t('label.action.router.health.checks') }}
+      </a-button>
+      <a-table
+        style="overflow-y: auto"
+        :columns="columns"
+        :dataSource="healthChecks"
+        :pagination="false"
+        :rowKey="record => record.checkname"
+        size="large">
+        <template slot="status" slot-scope="record">
+          <status class="status" :text="record.success === true ? 'True' : 'False'" displayText />
+        </template>
+      </a-table>
+
+      <a-modal
+        v-if="'getRouterHealthCheckResults' in $store.getters.apis"
+        style="top: 20px;"
+        :title="$t('label.action.router.health.checks')"
+        :visible="showGetHealthChecksForm"
+        :closable="true"
+        :maskClosable="false"
+        :okText="$t('label.ok')"
+        :cancelText="$t('label.cancel')"
+        @ok="handleGetHealthChecksSubmit"
+        @cancel="onCloseGetHealthChecksForm"
+        centered>
+        <a-spin :spinning="loading">
+          <a-form
+            :form="form"
+            @submit="handleGetHealthChecksSubmit"
+            layout="vertical">
+            <a-form-item>
+              <span slot="label">
+                {{ $t('label.perform.fresh.checks') }}
+                <a-tooltip :title="apiParams.performfreshchecks.description">
+                  <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                </a-tooltip>
+              </span>
+              <a-switch
+                v-decorator="[$t('performfreshchecks')]"
+                :placeholder="apiParams.performfreshchecks.description" />
+            </a-form-item>
+          </a-form>
+        </a-spin>
+      </a-modal>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'RouterHealthCheck',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      routerHealthChecksEnabled: false,
+      healthChecks: [],
+      loading: false,
+      columns: [
+        {
+          title: this.$t('label.router.health.check.name'),
+          dataIndex: 'checkname'
+        },
+        {
+          title: this.$t('label.type'),
+          dataIndex: 'checktype'
+        },
+        {
+          title: this.$t('label.router.health.check.success'),
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: this.$t('label.router.health.check.last.updated'),
+          dataIndex: 'lastupdated'
+        },
+        {
+          title: this.$t('label.details'),
+          dataIndex: 'details'
+        }
+      ],
+      showGetHealthChecksForm: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfigParams = (this.$store.getters.apis.getRouterHealthCheckResults && this.$store.getters.apis.getRouterHealthCheckResults.params) || []
+    this.apiParams = {}
+    this.apiConfigParams.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.updateResource(newItem)
+    }
+  },
+  mounted () {
+    this.updateResource(this.resource)
+  },
+  methods: {
+    updateResource (resource) {
+      if (!resource) {
+        return
+      }
+      this.resource = resource
+      if (!resource.id) {
+        return
+      }
+      this.checkConfigurationAndGetHealthChecks()
+    },
+    showGetHelathCheck () {
+      this.showGetHealthChecksForm = true
+    },
+    onCloseGetHealthChecksForm () {
+      this.showGetHealthChecksForm = false
+    },
+    handleGetHealthChecksSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.onCloseGetHealthChecksForm()
+        this.checkConfigurationAndGetHealthChecks(values.performfreshchecks)
+      })
+    },
+    checkConfigurationAndGetHealthChecks (performFreshChecks) {
+      var params = { name: 'router.health.checks.enabled' }
+      this.loading = true
+      api('listConfigurations', params).then(json => {
+        this.routerHealthChecksEnabled = false
+        if (json.listconfigurationsresponse.configuration !== null) {
+          var config = json.listconfigurationsresponse.configuration[0]
+          if (config && config.name === params.name) {
+            this.routerHealthChecksEnabled = config.value === 'true'
+          }
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(f => {
+        this.loading = false
+        if (this.routerHealthChecksEnabled) {
+          this.getHealthChecks(performFreshChecks)
+        }
+      })
+    },
+    getHealthChecks (performFreshChecks) {
+      var params = { routerid: this.resource.id }
+      if (performFreshChecks) {
+        params.performfreshchecks = performFreshChecks
+      }
+      this.loading = true
+      api('getRouterHealthCheckResults', params).then(json => {
+        this.healthChecks = json.getrouterhealthcheckresultsresponse.routerhealthchecks.healthchecks
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(f => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue b/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue
new file mode 100644
index 0000000..38ce507
--- /dev/null
+++ b/ui/src/views/infra/zone/AdvancedGuestTrafficForm.vue
@@ -0,0 +1,216 @@
+// 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>
+    <a-card
+      class="ant-form-text"
+      style="text-align: justify; margin: 10px 0; padding: 24px;"
+      v-if="description && description.length > 0"
+      v-html="$t(description)">
+    </a-card>
+    <a-form
+      class="form-content"
+      :form="form"
+      @submit="handleSubmit">
+      <a-form-item
+        :label="$t('label.vlan.range')"
+        v-bind="formItemLayout"
+        :help="validMessage"
+        :validate-status="validStatus"
+        has-feedback>
+        <a-form-item
+          has-feedback
+          :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }">
+          <a-input-number
+            v-decorator="['vlanRangeStart', {
+              rules: [{
+                validator: validateFromTo,
+                fromInput: true,
+                compare: 'vlanRangeEnd',
+                initialValue: getPrefilled('vlanRangeStart')
+              }]
+            }]"
+            style="width: 100%;"
+          />
+        </a-form-item>
+        <span :style="{ display: 'inline-block', width: '24px', textAlign: 'center' }">
+          -
+        </span>
+        <a-form-item
+          has-feedback
+          :style="{ display: 'inline-block', width: 'calc(50% - 12px)' }">
+          <a-input-number
+            v-decorator="['vlanRangeEnd', {
+              rules: [{
+                validator: validateFromTo,
+                toInput: true,
+                compare: 'vlanRangeStart',
+                initialValue: getPrefilled('vlanRangeEnd')
+              }]
+            }]"
+            style="width: 100%;"
+          />
+        </a-form-item>
+      </a-form-item>
+    </a-form>
+    <div class="form-action">
+      <a-button
+        v-if="!isFixError"
+        class="button-prev"
+        @click="handleBack">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button class="button-next" type="primary" @click="handleSubmit">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'AdvancedGuestTrafficForm',
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    description: {
+      type: String,
+      default: 'label.creating.iprange'
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      formItemLayout: {
+        labelCol: { span: 8 },
+        wrapperCol: { span: 12 }
+      },
+      validStatus: '',
+      validMessage: ''
+    }
+  },
+  created () {
+    this.form = this.$form.createForm(this, {
+      onFieldsChange: (_, changedFields) => {
+        this.$emit('fieldsChanged', changedFields)
+      }
+    })
+  },
+  mounted () {
+    this.fillValue()
+  },
+  methods: {
+    fillValue () {
+      const fieldVal = {}
+      fieldVal.vlanRangeStart = this.getPrefilled('vlanRangeStart')
+      this.form.setFieldsValue(fieldVal)
+      fieldVal.vlanRangeEnd = this.getPrefilled('vlanRangeEnd')
+      this.form.setFieldsValue(fieldVal)
+    },
+    getPrefilled (key) {
+      return this.prefillContent[key] ? this.prefillContent[key].value : null
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        this.validStatus = ''
+        this.validMessage = ''
+        if (err) {
+          return
+        }
+        if (!this.checkFromTo(values.vlanRangeStart, values.vlanRangeEnd)) {
+          this.validStatus = 'error'
+          this.validMessage = this.$t('message.error.vlan.range')
+          return
+        }
+        if (this.isFixError) {
+          this.$emit('submitLaunchZone')
+          return
+        }
+        this.$emit('nextPressed')
+      })
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    validateFromTo (rule, value, callback) {
+      let fromVal = ''
+      let toVal = ''
+      this.validStatus = ''
+      this.validMessage = ''
+      if (rule.fromInput) {
+        fromVal = value
+        toVal = this.form.getFieldValue(rule.compare)
+      } else if (rule.toInput) {
+        toVal = value
+        fromVal = this.form.getFieldValue(rule.compare)
+      }
+      if (!this.checkFromTo(fromVal, toVal)) {
+        this.validStatus = 'error'
+        this.validMessage = this.$t('message.error.vlan.range')
+      }
+      callback()
+    },
+    checkFromTo (fromVal, toVal) {
+      if (!fromVal) fromVal = 0
+      if (!toVal) toVal = 0
+      if (fromVal > toVal) {
+        return false
+      }
+      return true
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-content {
+    border: 1px dashed #e9e9e9;
+    border-radius: 6px;
+    background-color: #fafafa;
+    min-height: 200px;
+    text-align: center;
+    vertical-align: center;
+    padding-top: 16px;
+    padding-top: 16px;
+    margin-top: 8px;
+    max-height: 300px;
+    overflow-y: auto;
+
+    /deep/.has-error {
+      .ant-form-explain {
+        text-align: left;
+      }
+    }
+
+    /deep/.ant-form-item-control {
+      text-align: left;
+    }
+  }
+
+  .form-action {
+    margin-top: 16px;
+  }
+</style>
diff --git a/ui/src/views/infra/zone/IpAddressRangeForm.vue b/ui/src/views/infra/zone/IpAddressRangeForm.vue
new file mode 100644
index 0000000..95c17df
--- /dev/null
+++ b/ui/src/views/infra/zone/IpAddressRangeForm.vue
@@ -0,0 +1,261 @@
+// 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>
+    <a-card
+      class="ant-form-text"
+      style="text-align: justify; margin: 10px 0; padding: 24px;"
+      v-html="$t(description)">
+    </a-card>
+    <a-table
+      bordered
+      :dataSource="ipRanges"
+      :columns="columns"
+      :pagination="false"
+      style="margin-bottom: 24px;" >
+      <template slot="actions" slot-scope="text, record">
+        <a-button type="danger" shape="circle" icon="delete" @click="onDelete(record.key)" />
+      </template>
+      <template slot="footer">
+        <a-form
+          layout="inline"
+          :form="form"
+          @submit="handleAddRange">
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-input
+              v-decorator="[ 'gateway', {
+                rules: [{ required: true, message: $t('message.error.gateway') }]
+              }]"
+              :placeholder="$t('label.gateway')"
+            />
+          </a-form-item>
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-input
+              v-decorator="[ 'netmask', {
+                rules: [{ required: true, message: $t('message.error.netmask') }]
+              }]"
+              :placeholder="$t('label.netmask')"
+            />
+          </a-form-item>
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-input
+              v-decorator="[ 'vlan', { rules: [{ required: false }] }]"
+              :placeholder="$t('label.vlan')"
+            />
+          </a-form-item>
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-input
+              v-decorator="[ 'startIp', {
+                rules: [
+                  {
+                    required: true,
+                    message: $t('message.error.startip')
+                  },
+                  {
+                    validator: checkIpFormat,
+                    ipV4: true,
+                    message: $t('message.error.ipv4.address')
+                  }
+                ]
+              }]"
+              :placeholder="$t('label.start.ip')"
+            />
+          </a-form-item>
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-input
+              v-decorator="[ 'endIp', {
+                rules: [
+                  {
+                    required: true,
+                    message: $t('message.error.endip')
+                  },
+                  {
+                    validator: checkIpFormat,
+                    ipV4: true,
+                    message: $t('message.error.ipv4.address')
+                  }]
+              }]"
+              :placeholder="$t('label.end.ip')"
+            />
+          </a-form-item>
+          <a-form-item :style="{ display: 'inline-block', width: '14%' }">
+            <a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
+          </a-form-item>
+        </a-form>
+      </template>
+    </a-table>
+    <div class="form-action">
+      <a-button
+        v-if="!isFixError"
+        class="button-prev"
+        @click="handleBack">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button class="button-next" type="primary" @click="handleSubmit">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+    <a-modal
+      :visible="showError"
+      :maskClosable="false"
+      :title="`${$t('label.error')}!`"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @ok="() => { showError = false }"
+      @cancel="() => { showError = false }"
+      centered
+    >
+      <span>{{ $t('message.required.add.least.ip') }}</span>
+    </a-modal>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    traffic: {
+      type: String,
+      default: '0'
+    },
+    description: {
+      type: String,
+      default: 'label.creating.iprange'
+    },
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      formItemLayout: {
+        wrapperCol: { span: 0 }
+      },
+      ipRanges: [],
+      columns: [
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway',
+          width: 150
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask',
+          width: 150
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlan',
+          width: 120
+        },
+        {
+          title: this.$t('label.start.ip'),
+          dataIndex: 'startIp',
+          width: 130
+        },
+        {
+          title: this.$t('label.end.ip'),
+          dataIndex: 'endIp',
+          width: 130
+        },
+        {
+          title: '',
+          dataIndex: 'actions',
+          scopedSlots: { customRender: 'actions' },
+          width: 50
+        }
+      ],
+      showError: false,
+      ipV4Regex: /^(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,
+      ipV6Regex: /^((([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
+    }
+  },
+  mounted () {
+    const prefilledIpRangesKey = this.traffic + '-ipranges'
+    if (this.prefillContent[prefilledIpRangesKey]) {
+      this.ipRanges = this.prefillContent[prefilledIpRangesKey]
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  methods: {
+    handleAddRange (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          this.ipRanges.push({
+            key: this.ipRanges.length.toString(),
+            gateway: values.gateway,
+            netmask: values.netmask,
+            vlan: values.vlan,
+            startIp: values.startIp,
+            endIp: values.endIp
+          })
+          this.form.resetFields()
+        }
+      })
+      this.emitIpRanges()
+    },
+    isValidSetup () {
+      return this.ipRanges && this.ipRanges.length > 0
+    },
+    handleSubmit (e) {
+      if (this.isValidSetup()) {
+        if (this.isFixError) {
+          this.$emit('submitLaunchZone')
+          return
+        }
+
+        this.$emit('nextPressed', this.ipRanges)
+      } else {
+        this.showError = true
+      }
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    onDelete (key) {
+      const ipRanges = [...this.ipRanges]
+      this.ipRanges = ipRanges.filter(item => item.key !== key)
+      this.emitIpRanges()
+    },
+    emitIpRanges () {
+      const trafficRanges = {}
+      trafficRanges[this.traffic + '-ipranges'] = this.ipRanges
+      this.$emit('fieldsChanged', trafficRanges)
+    },
+    checkIpFormat (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (rule.ipV4 && !this.ipV4Regex.test(value)) {
+        callback(rule.message)
+      } else if (rule.ipV6 && !this.ipV6Regex.test(value)) {
+        callback(rule.message)
+      } else {
+        callback()
+      }
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/infra/zone/PhysicalNetworksTab.vue b/ui/src/views/infra/zone/PhysicalNetworksTab.vue
new file mode 100644
index 0000000..66e8e5c
--- /dev/null
+++ b/ui/src/views/infra/zone/PhysicalNetworksTab.vue
@@ -0,0 +1,151 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-list class="list">
+      <a-list-item v-for="network in networks" :key="network.id" class="list__item">
+        <div class="list__item-outer-container">
+          <div class="list__item-container">
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.name') }}
+              </div>
+              <div>
+                <router-link :to="{ path: '/physicalnetwork/' + network.id }">{{ network.name }}</router-link>
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">{{ $t('label.state') }}</div>
+              <div><status :text="network.state" displayText></status></div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.isolationmethods') }}
+              </div>
+              <div>
+                {{ network.isolationmethods }}
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.vlan') }}
+              </div>
+              <div>{{ network.vlan }}</div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.broadcastdomainrange') }}
+              </div>
+              <div>{{ network.broadcastdomainrange }}</div>
+            </div>
+          </div>
+        </div>
+      </a-list-item>
+    </a-list>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'PhysicalNetworksTab',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      networks: [],
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchLoading = true
+      api('listPhysicalNetworks', { zoneid: this.resource.id }).then(json => {
+        this.networks = json.listphysicalnetworksresponse.physicalnetwork || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__label {
+    font-weight: bold;
+  }
+
+  &__col {
+    flex: 1;
+
+    @media (min-width: 480px) {
+      &:not(:last-child) {
+        margin-right: 20px;
+      }
+    }
+  }
+
+  &__item {
+    margin-right: -8px;
+    align-items: flex-start;
+
+    &-outer-container {
+      width: 100%;
+    }
+
+    &-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 480px) {
+        flex-direction: row;
+        margin-bottom: 10px;
+      }
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/zone/StaticInputsForm.vue b/ui/src/views/infra/zone/StaticInputsForm.vue
new file mode 100644
index 0000000..2aa0f71
--- /dev/null
+++ b/ui/src/views/infra/zone/StaticInputsForm.vue
@@ -0,0 +1,277 @@
+// 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>
+    <a-card
+      class="ant-form-text"
+      v-if="description && description.length > 0"
+      v-html="$t(description)">
+    </a-card>
+    <a-form
+      class="form-content"
+      :form="form"
+      @submit="handleSubmit">
+      <a-form-item
+        v-for="(field, index) in this.fields"
+        :key="index"
+        :label="$t(field.title)"
+        v-if="isDisplayInput(field.display)"
+        v-bind="formItemLayout"
+        :has-feedback="field.switch ? false : true">
+        <a-select
+          v-if="field.select"
+          v-decorator="[field.key, {
+            rules: [
+              {
+                required: field.required,
+                message: $t(field.placeHolder),
+                initialValue: getPrefilled(field.key)
+              }
+            ]
+          }]"
+          :allowClear="true"
+        >
+          <a-select-option
+            v-for="option in field.options"
+            :key="option.id"
+            :value="option.id"
+          >
+            {{ option.name || option.description }}
+          </a-select-option>
+        </a-select>
+        <a-switch
+          v-else-if="field.switch"
+          v-decorator="[field.key]"
+          :default-checked="isChecked(field)"
+        />
+        <a-input
+          v-else-if="field.password"
+          type="password"
+          v-decorator="[field.key, {
+            rules: [
+              {
+                required: field.required,
+                message: $t(field.placeHolder),
+                initialValue: getPrefilled(field.key)
+              }
+            ]
+          }]"
+        />
+        <a-input
+          v-else
+          v-decorator="[field.key, {
+            rules: [
+              {
+                required: field.required,
+                message: $t(field.placeHolder),
+                initialValue: getPrefilled(field.key)
+              },
+              {
+                validator: checkIpFormat,
+                ipV4: field.ipV4,
+                ipV6: field.ipV6,
+                message: $t(field.message)
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+    </a-form>
+    <div class="form-action">
+      <a-button
+        v-if="!isFixError"
+        class="button-prev"
+        @click="handleBack">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button class="button-next" type="primary" @click="handleSubmit">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    fields: {
+      type: Array,
+      default: function () {
+        return []
+      }
+    },
+    description: {
+      type: String,
+      default: 'label.creating.iprange'
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  created () {
+    this.form = this.$form.createForm(this, {
+      onFieldsChange: (_, changedFields) => {
+        this.$emit('fieldsChanged', changedFields)
+      }
+    })
+  },
+  data: () => ({
+    formItemLayout: {
+      labelCol: { span: 8 },
+      wrapperCol: { span: 12 }
+    },
+    ipV4Regex: /^(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,
+    ipV6Regex: /^((([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
+  }),
+  mounted () {
+    this.fillValue(true)
+  },
+  watch: {
+    fields () {
+      this.fillValue(false)
+    }
+  },
+  methods: {
+    fillValue (autoFill) {
+      this.fields.forEach(field => {
+        const fieldExists = this.isDisplayInput(field.display)
+        if (!fieldExists) {
+          return
+        }
+        const fieldVal = {}
+        if (field.key === 'agentUserName' && !this.getPrefilled(field.key)) {
+          fieldVal[field.key] = 'Oracle'
+        } else {
+          fieldVal[field.key] = this.getPrefilled(field.key)
+        }
+        if (autoFill) {
+          this.form.setFieldsValue(fieldVal)
+        } else {
+          this.form.getFieldDecorator(field.key, { initialValue: this.getPrefilled(field.key) })
+        }
+      })
+    },
+    getPrefilled (key) {
+      return this.prefillContent[key] ? this.prefillContent[key].value : null
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        if (this.isFixError) {
+          this.$emit('submitLaunchZone')
+          return
+        }
+        this.$emit('nextPressed')
+      })
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    checkIpFormat (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (rule.ipV4 && !this.ipV4Regex.test(value)) {
+        callback(rule.message)
+      } else if (rule.ipV6 && !this.ipV6Regex.test(value)) {
+        callback(rule.message)
+      } else {
+        callback()
+      }
+    },
+    isDisplayInput (conditions) {
+      if (!conditions || Object.keys(conditions).length === 0) {
+        return true
+      }
+      let isShow = false
+      Object.keys(conditions).forEach(key => {
+        const condition = conditions[key]
+        const fieldVal = this.form.getFieldValue(key)
+          ? this.form.getFieldValue(key)
+          : (this.prefillContent[key] ? this.prefillContent[key].value : null)
+        if (Array.isArray(condition) && condition.includes(fieldVal)) {
+          isShow = true
+          return false
+        } else if (!Array.isArray(condition) && fieldVal === condition) {
+          isShow = true
+          return false
+        }
+
+        return true
+      })
+
+      return isShow
+    },
+    isChecked (field) {
+      if (this.prefillContent[field.key] && this.prefillContent[field.key].value) {
+        return this.prefillContent[field.key].value
+      }
+      if (!field.checked) {
+        return false
+      }
+      return true
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-content {
+    border: 1px dashed #e9e9e9;
+    border-radius: 6px;
+    background-color: #fafafa;
+    min-height: 200px;
+    text-align: center;
+    vertical-align: center;
+    padding-top: 16px;
+    padding-top: 16px;
+    margin-top: 8px;
+    max-height: 300px;
+    overflow-y: auto;
+
+    /deep/.has-error {
+      .ant-form-explain {
+        text-align: left;
+      }
+    }
+
+    /deep/.ant-form-item-control {
+      text-align: left;
+    }
+  }
+
+  .ant-form-text {
+    text-align: justify;
+    margin: 10px 0;
+    padding: 24px;
+    width: 100%;
+  }
+
+  .form-action {
+    margin-top: 16px;
+  }
+</style>
diff --git a/ui/src/views/infra/zone/SystemVmsTab.vue b/ui/src/views/infra/zone/SystemVmsTab.vue
new file mode 100644
index 0000000..c453042
--- /dev/null
+++ b/ui/src/views/infra/zone/SystemVmsTab.vue
@@ -0,0 +1,159 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-list class="list">
+      <a-list-item v-for="vm in vms" :key="vm.id" class="list__item">
+        <div class="list__item-outer-container">
+          <div class="list__item-container">
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.name') }}
+              </div>
+              <div>
+                <router-link :to="{ path: '/systemvm/' + vm.id }">{{ vm.name }}</router-link>
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">{{ $t('label.vmstate') }}</div>
+              <div><status :text="vm.state" displayText></status></div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">{{ $t('label.agentstate') }}</div>
+              <div><status :text="vm.agentstate || $t('label.unknown')" displayText></status></div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.type') }}
+              </div>
+              <div>
+                {{ vm.systemvmtype == 'consoleproxy' ? $t('label.console.proxy.vm') : $t('label.secondary.storage.vm') }}
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.publicip') }}
+              </div>
+              <div>
+                {{ vm.publicip }}
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.hostname') }}
+              </div>
+              <div>
+                <router-link :to="{ path: '/host/' + vm.hostid }">{{ vm.hostname }}</router-link>
+              </div>
+            </div>
+          </div>
+        </div>
+      </a-list-item>
+    </a-list>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'SystemVmsTab',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      vms: [],
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchLoading = true
+      api('listSystemVms', { zoneid: this.resource.id }).then(json => {
+        this.vms = json.listsystemvmsresponse.systemvm || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__label {
+    font-weight: bold;
+  }
+
+  &__col {
+    flex: 1;
+
+    @media (min-width: 480px) {
+      &:not(:last-child) {
+        margin-right: 20px;
+      }
+    }
+  }
+
+  &__item {
+    margin-right: -8px;
+    align-items: flex-start;
+
+    &-outer-container {
+      width: 100%;
+    }
+
+    &-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 480px) {
+        flex-direction: row;
+        margin-bottom: 10px;
+      }
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/infra/zone/ZoneWizard.vue b/ui/src/views/infra/zone/ZoneWizard.vue
new file mode 100644
index 0000000..8fd0852
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizard.vue
@@ -0,0 +1,220 @@
+// 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">
+    <a-steps
+      labelPlacement="vertical"
+      size="small"
+      :current="currentStep">
+      <a-step
+        v-for="(item) in steps"
+        :key="item.title"
+        :title="$t(item.title)">
+      </a-step>
+    </a-steps>
+    <div>
+      <zone-wizard-zone-type-step
+        v-if="currentStep === 0"
+        @nextPressed="nextPressed"
+        @fieldsChanged="onFieldsChanged"
+        :prefillContent="zoneConfig"
+      />
+      <zone-wizard-zone-details-step
+        v-else-if="currentStep === 1"
+        @nextPressed="nextPressed"
+        @backPressed="backPressed"
+        @fieldsChanged="onFieldsChanged"
+        @submitLaunchZone="onLaunchZone"
+        :isFixError="stepFixError"
+        :prefillContent="zoneConfig"
+      />
+      <zone-wizard-network-setup-step
+        v-else-if="currentStep === 2"
+        @nextPressed="nextPressed"
+        @backPressed="backPressed"
+        @fieldsChanged="onFieldsChanged"
+        @submitLaunchZone="onLaunchZone"
+        :stepChild="stepChild"
+        :isFixError="stepFixError"
+        :prefillContent="zoneConfig"
+      />
+      <zone-wizard-add-resources
+        v-else-if="currentStep === 3"
+        @nextPressed="nextPressed"
+        @backPressed="backPressed"
+        @fieldsChanged="onFieldsChanged"
+        @submitLaunchZone="onLaunchZone"
+        :stepChild="stepChild"
+        :isFixError="stepFixError"
+        :prefillContent="zoneConfig"
+      />
+      <zone-wizard-launch-zone
+        v-else
+        @backPressed="backPressed"
+        @closeAction="onCloseAction"
+        @refresh-data="onRefreshData"
+        @stepError="onStepError"
+        :launchZone="launchZone"
+        :stepChild="stepChild"
+        :launchData="launchData"
+        :isFixError="stepFixError"
+        :prefillContent="zoneConfig"
+      />
+    </div>
+  </div>
+</template>
+<script>
+import ZoneWizardZoneTypeStep from '@views/infra/zone/ZoneWizardZoneTypeStep'
+import ZoneWizardZoneDetailsStep from '@views/infra/zone/ZoneWizardZoneDetailsStep'
+import ZoneWizardNetworkSetupStep from '@views/infra/zone/ZoneWizardNetworkSetupStep'
+import ZoneWizardAddResources from '@views/infra/zone/ZoneWizardAddResources'
+import ZoneWizardLaunchZone from '@views/infra/zone/ZoneWizardLaunchZone'
+
+export default {
+  components: {
+    ZoneWizardZoneTypeStep,
+    ZoneWizardZoneDetailsStep,
+    ZoneWizardNetworkSetupStep,
+    ZoneWizardAddResources,
+    ZoneWizardLaunchZone
+  },
+  data () {
+    return {
+      currentStep: 0,
+      stepFixError: false,
+      launchZone: false,
+      launchData: {},
+      stepChild: '',
+      steps: [
+        {
+          title: 'label.zone.type',
+          step: [],
+          description: this.$t('message.select.zone.description'),
+          hint: this.$t('message.select.zone.hint')
+        },
+        {
+          title: 'label.zone.details',
+          step: ['stepAddZone', 'dedicateZone'],
+          description: this.$t('message.zone.detail.description'),
+          hint: this.$t('message.zone.detail.hint')
+        },
+        {
+          title: 'label.network',
+          step: ['physicalNetwork', 'netscaler', 'pod', 'guestTraffic', 'storageTraffic', 'publicTraffic'],
+          description: this.$t('message.network.description'),
+          hint: this.$t('message.network.hint')
+        },
+        {
+          title: 'label.add.resources',
+          step: ['clusterResource', 'hostResource', 'primaryResource', 'secondaryResource'],
+          description: this.$t('message.add.resource.description'),
+          hint: this.$t('message.add.resource.hint')
+        },
+        {
+          title: 'label.launch',
+          step: ['launchZone'],
+          description: this.$t('message.launch.zone.description'),
+          hint: this.$t('message.launch.zone.hint')
+        }
+      ],
+      zoneConfig: {}
+    }
+  },
+  methods: {
+    nextPressed () {
+      this.currentStep++
+    },
+    backPressed (data) {
+      this.currentStep--
+    },
+    onFieldsChanged (data) {
+      if (data.zoneType &&
+        this.zoneConfig.zoneType &&
+        data.zoneType.value !== this.zoneConfig.zoneType.value) {
+        this.zoneConfig.physicalNetworks = null
+      }
+
+      this.zoneConfig = { ...this.zoneConfig, ...data }
+    },
+    onCloseAction () {
+      this.$emit('close-action')
+    },
+    onRefreshData () {
+      this.$message.success(this.$t('message.processing.complete'))
+      this.$emit('refresh-data')
+      this.onCloseAction()
+    },
+    onStepError (step, launchData) {
+      this.currentStep = this.steps.findIndex(item => item.step.includes(step))
+      this.stepChild = step
+      this.launchData = launchData
+      this.launchZone = false
+      this.stepFixError = true
+    },
+    onLaunchZone () {
+      this.stepFixError = false
+      this.launchZone = true
+      this.currentStep = this.steps.findIndex(item => item.step.includes('launchZone'))
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form {
+    width: 95vw;
+    @media (min-width: 1000px) {
+      width: 800px;
+    }
+
+    /deep/.form-action {
+      position: relative;
+      margin-top: 16px;
+      height: 35px;
+    }
+
+    /deep/.button-next {
+      position: absolute;
+      right: 0;
+    }
+
+    /deep/.button-next.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) {
+      position: absolute;
+      right: 0;
+    }
+  }
+
+  /deep/.ant-form-text {
+    width: 100%;
+  }
+
+  .steps-content {
+    border: 1px dashed #e9e9e9;
+    border-radius: 6px;
+    background-color: #fafafa;
+    min-height: 200px;
+    text-align: center;
+    vertical-align: center;
+    padding: 8px;
+    padding-top: 16px;
+  }
+
+  .steps-action {
+    margin-top: 24px;
+  }
+</style>
diff --git a/ui/src/views/infra/zone/ZoneWizardAddResources.vue b/ui/src/views/infra/zone/ZoneWizardAddResources.vue
new file mode 100644
index 0000000..ba8cf20
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardAddResources.vue
@@ -0,0 +1,902 @@
+// 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 style="width: auto;">
+    <a-steps progressDot :current="currentStep" size="small" style="margin-left: 0; margin-top: 16px;">
+      <a-step
+        v-for="step in steps"
+        :key="step.title"
+        :title="$t(step.title)"></a-step>
+    </a-steps>
+    <static-inputs-form
+      v-if="currentStep === 0"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      :fields="clusterFields"
+      :prefillContent="prefillContent"
+      :description="steps[currentStep].description"
+      :isFixError="isFixError"
+    />
+
+    <div v-if="hypervisor !== 'VMware'">
+      <static-inputs-form
+        v-if="currentStep === 1"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="hostFields"
+        :prefillContent="prefillContent"
+        :description="steps[currentStep].description"
+        :isFixError="isFixError"
+      />
+      <static-inputs-form
+        v-if="currentStep === 2"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="primaryStorageFields"
+        :prefillContent="prefillContent"
+        :description="steps[currentStep].description"
+        :isFixError="isFixError"
+      />
+      <static-inputs-form
+        v-if="currentStep === 3"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="secondaryStorageFields"
+        :prefillContent="prefillContent"
+        :description="steps[currentStep].description"
+        :isFixError="isFixError"
+      />
+    </div>
+    <div v-else>
+      <static-inputs-form
+        v-if="currentStep === 1"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="primaryStorageFields"
+        :prefillContent="prefillContent"
+        :description="steps[currentStep].description"
+        :isFixError="isFixError"
+      />
+      <static-inputs-form
+        v-if="currentStep === 2"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="secondaryStorageFields"
+        :prefillContent="prefillContent"
+        :description="steps[currentStep].description"
+        :isFixError="isFixError"
+      />
+    </div>
+  </div>
+</template>
+<script>
+import StaticInputsForm from '@views/infra/zone/StaticInputsForm'
+import { api } from '@/api'
+
+export default {
+  components: {
+    StaticInputsForm
+  },
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    stepChild: {
+      type: String,
+      default: ''
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : null
+    },
+    hypervisor () {
+      return this.prefillContent.hypervisor ? this.prefillContent.hypervisor.value : null
+    },
+    steps () {
+      const steps = []
+      const hypervisor = this.prefillContent.hypervisor ? this.prefillContent.hypervisor.value : null
+      const localStorageEnabled = this.prefillContent.localstorageenabled.value
+      const localStorageEnabledForSystemVM = this.prefillContent.localstorageenabledforsystemvm.value
+      steps.push({
+        title: 'label.cluster',
+        fromKey: 'clusterResource',
+        description: 'message.desc.cluster'
+      })
+      if (hypervisor !== 'VMware') {
+        steps.push({
+          title: 'label.host',
+          fromKey: 'hostResource',
+          description: 'message.desc.host'
+        })
+      }
+      if (!localStorageEnabled || !localStorageEnabledForSystemVM) {
+        steps.push({
+          title: 'label.primary.storage',
+          fromKey: 'primaryResource',
+          description: 'message.desc.primary.storage'
+        })
+      }
+      steps.push({
+        title: 'label.secondary.storage',
+        fromKey: 'secondaryResource',
+        description: 'message.desc.secondary.storage'
+      })
+
+      return steps
+    },
+    clusterFields () {
+      return [
+        {
+          title: 'label.cluster.name',
+          key: 'clusterName',
+          placeHolder: 'message.error.cluster.name',
+          required: true
+        },
+        {
+          title: 'label.vcenter.host',
+          key: 'vCenterHost',
+          placeHolder: 'message.error.vcenter.host',
+          required: true,
+          display: {
+            hypervisor: ['VMware', 'Ovm3']
+          }
+        },
+        {
+          title: 'label.vcenter.username',
+          key: 'vCenterUsername',
+          placeHolder: 'message.error.vcenter.username',
+          required: true,
+          display: {
+            hypervisor: ['VMware', 'Ovm3']
+          }
+        },
+        {
+          title: 'label.vcenter.password',
+          key: 'vCenterPassword',
+          placeHolder: 'message.error.vcenter.password',
+          required: true,
+          password: true,
+          display: {
+            hypervisor: ['VMware', 'Ovm3']
+          }
+        },
+        {
+          title: 'label.vcenter.datacenter',
+          key: 'vCenterDatacenter',
+          placeHolder: 'message.error.vcenter.datacenter',
+          required: true,
+          display: {
+            hypervisor: ['VMware', 'Ovm3']
+          }
+        },
+        {
+          title: 'label.override.public.traffic',
+          key: 'overridepublictraffic',
+          required: false,
+          switch: true,
+          display: {
+            dvSwitchEnabled: true
+          }
+        },
+        {
+          title: 'label.override.guest.traffic',
+          key: 'overrideguesttraffic',
+          required: false,
+          switch: true,
+          display: {
+            dvSwitchEnabled: true
+          }
+        },
+        {
+          title: 'label.cisco.nexus1000v.ip.address',
+          key: 'vsmipaddress',
+          placeHolder: 'message.error.nexus1000v.ipaddess',
+          required: false,
+          display: {
+            vSwitchEnabled: true
+          }
+        },
+        {
+          title: 'label.cisco.nexus1000v.username',
+          key: 'vsmusername',
+          placeHolder: 'message.error.nexus1000v.username',
+          required: false,
+          display: {
+            vSwitchEnabled: true
+          }
+        },
+        {
+          title: 'label.cisco.nexus1000v.password',
+          key: 'vsmpassword',
+          placeHolder: 'message.error.nexus1000v.password',
+          required: false,
+          display: {
+            vSwitchEnabled: true
+          }
+        }
+      ]
+    },
+    hostFields () {
+      return [
+        {
+          title: 'label.host.name',
+          key: 'hostName',
+          placeHolder: 'message.error.host.name',
+          required: true,
+          display: {
+            hypervisor: ['VMware', 'BareMetal', 'Ovm', 'Hyperv', 'KVM', 'XenServer', 'LXC', 'Simulator']
+          }
+        },
+        {
+          title: 'label.username',
+          key: 'hostUserName',
+          placeHolder: 'message.error.host.username',
+          required: true,
+          display: {
+            hypervisor: ['VMware', 'BareMetal', 'Ovm', 'Hyperv', 'KVM', 'XenServer', 'LXC', 'Simulator']
+          }
+        },
+        {
+          title: 'label.password',
+          key: 'hostPassword',
+          placeHolder: 'message.error.host.password',
+          required: true,
+          password: true,
+          display: {
+            hypervisor: ['VMware', 'BareMetal', 'Ovm', 'Hyperv', 'KVM', 'XenServer', 'LXC', 'Simulator']
+          }
+        },
+        {
+          title: 'label.agent.username',
+          key: 'agentUserName',
+          placeHolder: 'message.error.agent.username',
+          required: false,
+          defaultValue: 'Oracle',
+          display: {
+            hypervisor: 'Ovm'
+          }
+        },
+        {
+          title: 'label.agent.password',
+          key: 'agentPassword',
+          placeHolder: 'message.error.agent.password',
+          required: true,
+          password: true,
+          display: {
+            hypervisor: 'Ovm'
+          }
+        },
+        {
+          title: 'label.tags',
+          key: 'hostTags',
+          placeHolder: 'message.error.host.tags',
+          required: false
+        }
+      ]
+    },
+    primaryStorageFields () {
+      return [
+        {
+          title: 'label.name',
+          key: 'primaryStorageName',
+          placeHolder: 'message.error.name',
+          required: true
+        },
+        {
+          title: 'label.scope',
+          key: 'primaryStorageScope',
+          required: false,
+          select: true,
+          options: this.primaryStorageScopes
+        },
+        {
+          title: 'label.protocol',
+          key: 'primaryStorageProtocol',
+          placeHolder: 'message.error.select',
+          required: true,
+          select: true,
+          options: this.primaryStorageProtocols
+        },
+        {
+          title: 'label.server',
+          key: 'primaryStorageServer',
+          placeHolder: 'message.error.server',
+          required: true,
+          display: {
+            primaryStorageProtocol: ['nfs', 'iscsi', 'gluster', 'SMB']
+          }
+        },
+        {
+          title: 'label.path',
+          key: 'primaryStoragePath',
+          placeHolder: 'message.error.path',
+          required: true,
+          display: {
+            primaryStorageProtocol: ['nfs', 'SMB', 'SharedMountPoint', 'ocfs2']
+          }
+        },
+        {
+          title: 'label.SR.name',
+          key: 'primaryStorageSRLabel',
+          placeHolder: 'message.error.sr.namelabel',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'PreSetup'
+          }
+        },
+        {
+          title: 'label.target.iqn',
+          key: 'primaryStorageTargetIQN',
+          placeHolder: 'message.error.target.iqn',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'iscsi'
+          }
+        },
+        {
+          title: 'label.LUN.number',
+          key: 'primaryStorageLUN',
+          placeHolder: 'message.error.lun',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'iscsi'
+          }
+        },
+        {
+          title: 'label.smb.domain',
+          key: 'primaryStorageSMBDomain',
+          placeHolder: 'message.error.sbdomain',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'SMB'
+          }
+        },
+        {
+          title: 'label.smb.username',
+          key: 'primaryStorageSMBUsername',
+          placeHolder: 'message.error.sbdomain.username',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'SMB'
+          }
+        },
+        {
+          title: 'label.smb.password',
+          key: 'primaryStorageSMBPassword',
+          placeHolder: 'message.error.sbdomain.password',
+          required: true,
+          password: true,
+          display: {
+            primaryStorageProtocol: 'SMB'
+          }
+        },
+        {
+          title: 'label.rados.monitor',
+          key: 'primaryStorageRADOSMonitor',
+          placeHolder: 'message.error.rados.monitor',
+          required: false,
+          display: {
+            primaryStorageProtocol: ['rbd']
+          }
+        },
+        {
+          title: 'label.rados.pool',
+          key: 'primaryStorageRADOSPool',
+          placeHolder: 'message.error.rados.pool',
+          required: false,
+          display: {
+            primaryStorageProtocol: ['rbd']
+          }
+        },
+        {
+          title: 'label.rados.user',
+          key: 'primaryStorageRADOSUser',
+          placeHolder: 'message.error.rados.user',
+          required: false,
+          display: {
+            primaryStorageProtocol: ['rbd']
+          }
+        },
+        {
+          title: 'label.rados.secret',
+          key: 'primaryStorageRADOSSecret',
+          placeHolder: 'message.error.rados.secret',
+          required: false,
+          display: {
+            primaryStorageProtocol: ['rbd']
+          }
+        },
+        {
+          title: 'label.volgroup',
+          key: 'primaryStorageVolumeGroup',
+          placeHolder: 'message.error.volumne.group',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'clvm'
+          }
+        },
+        {
+          title: 'label.volume',
+          key: 'primaryStorageVolume',
+          placeHolder: 'message.error.volumne',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'gluster'
+          }
+        },
+        {
+          title: 'label.vcenter.datacenter',
+          key: 'primaryStorageVmfsDatacenter',
+          placeHolder: 'message.error.vcenter.datacenter',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'vmfs'
+          }
+        },
+        {
+          title: 'label.vcenter.datastore',
+          key: 'primaryStorageVmfsDatastore',
+          placeHolder: 'message.error.vcenter.datastore',
+          required: true,
+          display: {
+            primaryStorageProtocol: 'vmfs'
+          }
+        },
+        {
+          title: 'label.storage.tags',
+          key: 'primaryStorageTags',
+          placeHolder: 'message.error.storage.tags',
+          required: false
+        }
+      ]
+    },
+    secondaryStorageFields () {
+      return [
+        {
+          title: 'label.provider',
+          key: 'secondaryStorageProvider',
+          required: false,
+          select: true,
+          options: this.storageProviders
+        },
+        {
+          title: 'label.name',
+          key: 'secondaryStorageName',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['NFS', 'SMB', 'S3', 'Swift']
+          }
+        },
+        {
+          title: 'label.server',
+          key: 'secondaryStorageServer',
+          required: true,
+          placeHolder: 'message.error.server',
+          display: {
+            secondaryStorageProvider: ['NFS', 'SMB']
+          }
+        },
+        {
+          title: 'label.path',
+          key: 'secondaryStoragePath',
+          required: true,
+          placeHolder: 'message.error.path',
+          display: {
+            secondaryStorageProvider: ['NFS', 'SMB']
+          }
+        },
+        {
+          title: 'label.smb.domain',
+          key: 'secondaryStorageSMBDomain',
+          required: true,
+          placeHolder: 'message.error.sbdomain',
+          display: {
+            secondaryStorageProvider: ['SMB']
+          }
+        },
+        {
+          title: 'label.smb.username',
+          key: 'secondaryStorageSMBUsername',
+          required: true,
+          placeHolder: 'message.error.smb.username',
+          display: {
+            secondaryStorageProvider: ['SMB']
+          }
+        },
+        {
+          title: 'label.smb.password',
+          key: 'secondaryStorageSMBPassword',
+          required: true,
+          password: true,
+          placeHolder: 'message.error.smb.password',
+          display: {
+            secondaryStorageProvider: ['SMB']
+          }
+        },
+        {
+          title: 'label.s3.access_key',
+          key: 'secondaryStorageAccessKey',
+          required: true,
+          placeHolder: 'message.error.access.key',
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.secret_key',
+          key: 'secondaryStorageSecretKey',
+          required: true,
+          placeHolder: 'message.error.secret.key',
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.bucket',
+          key: 'secondaryStorageBucket',
+          required: true,
+          placeHolder: 'message.error.bucket',
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.endpoint',
+          key: 'secondaryStorageEndpoint',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.use_https',
+          key: 'secondaryStorageHttps',
+          required: false,
+          switch: true,
+          checked: true,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.connection_timeoutt',
+          key: 'secondaryStorageConnectionTimeout',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.max_error_retry',
+          key: 'secondaryStorageMaxError',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.socket_timeout',
+          key: 'secondaryStorageSocketTimeout',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.create.nfs.secondary.staging.storage',
+          key: 'secondaryStorageNFSStaging',
+          required: false,
+          switch: true,
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.nfs.server',
+          key: 'secondaryStorageNFSServer',
+          required: true,
+          placeHolder: 'message.error.s3nfs.server',
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.s3.nfs.path',
+          key: 'secondaryStorageNFSPath',
+          required: true,
+          placeHolder: 'message.error.s3nfs.path',
+          display: {
+            secondaryStorageProvider: ['S3']
+          }
+        },
+        {
+          title: 'label.url',
+          key: 'secondaryStorageURL',
+          required: true,
+          placeHolder: 'message.error.url',
+          display: {
+            secondaryStorageProvider: ['Swift']
+          }
+        },
+        {
+          title: 'label.account',
+          key: 'secondaryStorageAccount',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['Swift']
+          }
+        },
+        {
+          title: 'label.username',
+          key: 'secondaryStorageUsername',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['Swift']
+          }
+        },
+        {
+          title: 'label.key',
+          key: 'secondaryStorageKey',
+          required: false,
+          display: {
+            secondaryStorageProvider: ['Swift']
+          }
+        }
+      ]
+    }
+  },
+  data () {
+    return {
+      physicalNetworks: null,
+      currentHypervisor: null,
+      primaryStorageScopes: [],
+      primaryStorageProtocols: [],
+      storageProviders: [],
+      currentStep: 0,
+      options: ['primaryStorageScope', 'primaryStorageProtocol', 'provider']
+    }
+  },
+  mounted () {
+    if (this.stepChild && this.stepChild !== '') {
+      this.currentStep = this.steps.findIndex(item => item.fromKey === this.stepChild)
+    }
+    if (this.prefillContent.hypervisor.value === 'BareMetal') {
+      this.$emit('nextPressed')
+    } else {
+      this.fetchConfigurationSwitch()
+      this.options.forEach(this.fetchOptions)
+      if (!this.prefillContent.lastHypervisor) {
+        this.$emit('fieldsChanged', {
+          lastHypervisor: this.prefillContent.hypervisor
+        })
+      } else if (this.prefillContent.lastHypervisor.value !== this.prefillContent.hypervisor.value) {
+        this.$emit('fieldsChanged', {
+          lastHypervisor: this.prefillContent.hypervisor,
+          primaryStorageProtocol: null,
+          primaryStorageScope: null
+        })
+      }
+    }
+  },
+  methods: {
+    nextPressed () {
+      if (this.currentStep === this.steps.length - 1) {
+        this.$emit('nextPressed')
+      } else {
+        this.currentStep++
+      }
+    },
+    handleBack (e) {
+      if (this.currentStep === 0) {
+        this.$emit('backPressed')
+      } else {
+        this.currentStep--
+      }
+    },
+    fieldsChanged (changed) {
+      this.$emit('fieldsChanged', changed)
+    },
+    fetchOptions (name) {
+      switch (name) {
+        case 'primaryStorageScope':
+          this.fetchScope()
+          break
+        case 'primaryStorageProtocol':
+          this.fetchProtocol()
+          break
+        case 'provider':
+          this.fetchProvider()
+          break
+        default:
+          break
+      }
+    },
+    fetchScope () {
+      const hypervisor = this.prefillContent.hypervisor ? this.prefillContent.hypervisor.value : null
+      const scope = []
+      if (['KVM', 'VMware', 'Hyperv'].includes(hypervisor)) {
+        scope.push({
+          id: 'zone',
+          description: this.$t('label.zone')
+        })
+        scope.push({
+          id: 'cluster',
+          description: this.$t('label.cluster')
+        })
+      } else {
+        scope.push({
+          id: 'cluster',
+          description: this.$t('label.cluster')
+        })
+      }
+      this.primaryStorageScopes = scope
+      this.$forceUpdate()
+    },
+    fetchProtocol () {
+      const hypervisor = this.prefillContent.hypervisor ? this.prefillContent.hypervisor.value : null
+      const protocols = []
+      if (hypervisor === 'KVM') {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+        protocols.push({
+          id: 'SharedMountPoint',
+          description: 'SharedMountPoint'
+        })
+        protocols.push({
+          id: 'rbd',
+          description: 'RBD'
+        })
+        protocols.push({
+          id: 'clvm',
+          description: 'CLVM'
+        })
+        protocols.push({
+          id: 'gluster',
+          description: 'Gluster'
+        })
+      } else if (hypervisor === 'XenServer') {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+        protocols.push({
+          id: 'PreSetup',
+          description: 'PreSetup'
+        })
+        protocols.push({
+          id: 'iscsi',
+          description: 'iscsi'
+        })
+      } else if (hypervisor === 'VMware') {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+        protocols.push({
+          id: 'vmfs',
+          description: 'vmfs'
+        })
+      } else if (hypervisor === 'Hyperv') {
+        protocols.push({
+          id: 'SMB',
+          description: 'SMB/CIFS'
+        })
+      } else if (hypervisor === 'Ovm') {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+        protocols.push({
+          id: 'ocfs2',
+          description: 'ocfs2'
+        })
+      } else if (hypervisor === 'LXC') {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+        protocols.push({
+          id: 'SharedMountPoint',
+          description: 'SharedMountPoint'
+        })
+        protocols.push({
+          id: 'rbd',
+          description: 'RBD'
+        })
+      } else {
+        protocols.push({
+          id: 'nfs',
+          description: 'nfs'
+        })
+      }
+
+      this.primaryStorageProtocols = protocols
+      this.$forceUpdate()
+    },
+    async fetchConfigurationSwitch () {
+      const hypervisor = this.prefillContent.hypervisor ? this.prefillContent.hypervisor.value : null
+      this.$emit('fieldsChanged', { dvSwitchEnabled: { value: false } })
+      this.$emit('fieldsChanged', { vSwitchEnabled: { value: false } })
+      if (hypervisor && hypervisor === 'VMware') {
+        await this.fetchNexusSwitchConfig()
+        await this.fetchDvSwitchConfig()
+      }
+    },
+    fetchNexusSwitchConfig () {
+      api('listConfigurations', { name: 'vmware.use.nexus.vswitch' }).then(json => {
+        let vSwitchEnabled = false
+        if (json.listconfigurationsresponse.configuration[0].value) {
+          vSwitchEnabled = true
+        }
+        this.$emit('fieldsChanged', { vSwitchEnabled: { value: vSwitchEnabled } })
+      })
+    },
+    fetchDvSwitchConfig () {
+      let dvSwitchEnabled = false
+      api('listConfigurations', { name: 'vmware.use.dvswitch' }).then(json => {
+        if (json.listconfigurationsresponse.configuration[0].value) {
+          dvSwitchEnabled = true
+        }
+        this.$emit('fieldsChanged', { dvSwitchEnabled: { value: dvSwitchEnabled } })
+      })
+    },
+    fetchProvider () {
+      const storageProviders = []
+      api('listImageStores', { provider: 'S3' }).then(json => {
+        const s3stores = json.listimagestoresresponse.imagestore
+        if (s3stores != null && s3stores.length > 0) {
+          storageProviders.push({ id: 'S3', description: 'S3' })
+        } else {
+          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' })
+        }
+        this.storageProviders = storageProviders
+        this.$forceUpdate()
+      })
+    },
+    submitLaunchZone () {
+      this.$emit('submitLaunchZone')
+    }
+  }
+}
+
+</script>
diff --git a/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
new file mode 100644
index 0000000..49b9103
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardLaunchZone.vue
@@ -0,0 +1,2169 @@
+// 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 v-if="!isLaunchZone">
+    <a-card class="ant-form-text card-waiting-launch">
+      <a-icon
+        type="check-circle"
+        theme="twoTone"
+        twoToneColor="#52c41a"
+        style="font-size: 20px;"/>
+      {{ $t(description.waiting) }}
+    </a-card>
+    <div class="form-action">
+      <a-button class="button-prev" @click="handleBack">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button class="button-next" type="primary" @click="handleSubmit">
+        <a-icon type="rocket" /> {{ $t('label.launch.zone') }}
+      </a-button>
+    </div>
+  </div>
+  <div v-else>
+    <a-card class="ant-form-text card-launch-description">
+      {{ $t(description.launching) }}
+    </a-card>
+    <a-card
+      id="launch-content"
+      class="ant-form-text card-launch-content">
+      <a-steps
+        size="small"
+        direction="vertical"
+        :current="currentStep"
+      >
+        <a-step
+          v-for="(step, index) in steps"
+          :key="index"
+          :title="$t(step.title)"
+          :status="step.status">
+          <a-icon v-if="step.status===status.PROCESS" type="loading" slot="icon" />
+          <a-icon v-else-if="step.status===status.FAILED" type="close-circle" slot="icon" />
+          <a-card
+            slot="description"
+            class="step-error"
+            v-if="step.status===status.FAILED"
+          >
+            <div><strong>{{ $t('label.error.something.went.wrong.please.correct.the.following') }}:</strong></div>
+            <div>{{ messageError }}</div>
+          </a-card>
+        </a-step>
+      </a-steps>
+    </a-card>
+    <div class="form-action">
+      <a-button
+        v-if="processStatus==='finish'"
+        class="button-next"
+        type="primary"
+        icon="play-circle"
+        :loading="loading"
+        @click="enableZoneAction"
+      >{{ $t('label.action.enable.zone') }}</a-button>
+      <a-button
+        v-if="processStatus==='error'"
+        class="button-next"
+        type="primary"
+        @click="handleFixesError"
+      >{{ $t('label.fix.errors') }}</a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+const BASIC_ZONE = 'Basic'
+const ADVANCED_ZONE = 'Advanced'
+const STATUS_PROCESS = 'process'
+const STATUS_FINISH = 'finish'
+const STATUS_FAILED = 'error'
+
+export default {
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    launchZone: {
+      type: Boolean,
+      default: false
+    },
+    launchData: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    stepChild: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      description: {
+        waiting: 'message.launch.zone',
+        launching: 'message.please.wait.while.zone.is.being.created'
+      },
+      isLaunchZone: false,
+      processStatus: null,
+      messageError: '',
+      currentStep: 0,
+      advZoneConfiguredVirtualRouterCount: 0,
+      steps: [],
+      stepData: {},
+      status: {
+        PROCESS: STATUS_PROCESS,
+        FAILED: STATUS_FAILED,
+        FINISH: STATUS_FINISH
+      },
+      loading: false
+    }
+  },
+  updated () {
+    const launchElm = this.$el.querySelector('#launch-content')
+    if (launchElm) {
+      launchElm.scrollTop = launchElm.scrollHeight
+    }
+  },
+  computed: {
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : null
+    },
+    isBasicZone () {
+      return this.zoneType === BASIC_ZONE
+    },
+    isAdvancedZone () {
+      return this.zoneType === ADVANCED_ZONE
+    },
+    isDedicated () {
+      return this.prefillContent.isDedicated ? this.prefillContent.isDedicated.value : false
+    },
+    sgEnabled () {
+      return this.prefillContent.securityGroupsEnabled ? this.prefillContent.securityGroupsEnabled.value : false
+    },
+    havingNetscaler () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.havingNetscaler : false
+    },
+    havingSG () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.havingSG : false
+    },
+    havingEIP () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.havingEIP : false
+    },
+    havingELB () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.havingELB : false
+    },
+    selectedBaremetalProviders () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.selectedBaremetalProviders : []
+    }
+  },
+  mounted () {
+    if (this.launchZone) {
+      this.processStatus = STATUS_PROCESS
+      this.stepData = this.launchData
+      if (this.stepChild === 'publicTraffic') {
+        this.stepData.returnedPublicTraffic = []
+        this.stepData.stepMove = this.stepData.stepMove.filter(item => item.indexOf('createPublicVlanIpRange') === -1)
+      }
+      if (this.stepChild === 'storageTraffic') {
+        this.stepData.tasks = []
+        this.stepData.stepMove = this.stepData.stepMove.filter(item => item.indexOf('createStorageNetworkIpRange') === -1)
+      }
+      this.handleSubmit()
+    }
+  },
+  methods: {
+    addStep (title, step) {
+      this.steps.push({
+        index: this.currentStep,
+        title: title,
+        step: step,
+        status: STATUS_PROCESS
+      })
+      this.setStepStatus(STATUS_PROCESS)
+    },
+    setStepStatus (status) {
+      const index = this.steps.findIndex(step => step.index === this.currentStep)
+      this.steps[index].status = status
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    async handleSubmit () {
+      this.isLaunchZone = true
+      this.advZoneConfiguredVirtualRouterCount = 0
+      this.processStatus = STATUS_PROCESS
+      if (!this.stepData.stepMove) {
+        this.stepData.stepMove = []
+      }
+      await this.stepAddZone()
+    },
+    handleFixesError () {
+      const stepError = this.steps.filter(step => step.index === this.currentStep)
+      if (stepError && stepError.length > 0) {
+        const step = stepError[0].step
+        this.$emit('stepError', step, this.stepData)
+      }
+    },
+    trafficLabelParam (trafficTypeID, physicalNetworkID) {
+      const hypervisor = this.prefillContent.hypervisor.value
+      physicalNetworkID = this.isAdvancedZone ? physicalNetworkID : 0
+      let physicalNetwork = []
+      let trafficConfig = null
+      if (this.prefillContent.physicalNetworks) {
+        physicalNetwork = this.prefillContent.physicalNetworks[0].traffics.filter(traffic => traffic.type === trafficTypeID)
+        trafficConfig = physicalNetwork.length > 0 ? physicalNetwork[0] : null
+      }
+      let 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 = null
+          } else if (trafficLabel.length >= 1) {
+            if (trafficLabel.charAt(trafficLabel.length - 1) === ',') {
+              trafficLabel = trafficLabel.substring(0, trafficLabel.length - 1)
+            }
+          }
+        }
+      }
+
+      let hypervisorAttr
+      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
+      }
+      const trafficLabelParams = {}
+      if (trafficLabel) {
+        trafficLabelParams[hypervisorAttr] = trafficLabel
+      }
+
+      return trafficLabelParams
+    },
+    async stepAddZone () {
+      this.addStep('message.creating.zone', 'stepAddZone')
+
+      const guestcidraddress = this.prefillContent.guestcidraddress ? this.prefillContent.guestcidraddress.value : null
+      const params = {}
+      params.networktype = this.zoneType
+
+      if (this.isBasicZone) {
+        if (this.havingSG) {
+          params.securitygroupenabled = true
+        } else {
+          params.securitygroupenabled = false
+        }
+      } else {
+        if (!this.sgEnabled) {
+          params.securitygroupenabled = false
+          if (guestcidraddress != null && guestcidraddress.length > 0) {
+            params.guestcidraddress = guestcidraddress
+          }
+        } else {
+          params.securitygroupenabled = true
+        }
+      }
+      params.name = this.prefillContent.name.value
+      params.localstorageenabled = this.prefillContent.localstorageenabled ? this.prefillContent.localstorageenabled.value : false
+      params.dns1 = this.prefillContent.ipv4Dns1.value
+      params.dns2 = this.prefillContent.ipv4Dns2 ? this.prefillContent.ipv4Dns2.value : null
+      params.ip6dns1 = this.prefillContent.ipv6Dns1 ? this.prefillContent.ipv6Dns1.value : null
+      params.ip6dns2 = this.prefillContent.ipv6Dns1 ? this.prefillContent.ipv6Dns1.value : null
+      params.internaldns1 = this.prefillContent.internalDns1 ? this.prefillContent.internalDns1.value : null
+      params.internaldns2 = this.prefillContent.internalDns2 ? this.prefillContent.internalDns2.value : null
+      params.domain = this.prefillContent.networkDomain ? this.prefillContent.networkDomain.value : null
+
+      try {
+        if (!this.stepData.stepMove.includes('createZone')) {
+          this.stepData.zoneReturned = await this.createZone(params)
+          this.stepData.stepMove.push('createZone')
+        }
+        await this.stepDedicateZone()
+        await this.stepAddPhysicalNetworks()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepDedicateZone () {
+      if (!this.isDedicated || this.stepData.stepMove.includes('dedicateZone')) {
+        return
+      }
+
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.dedicate.zone', 'dedicateZone')
+
+      const params = {}
+      params.zoneid = this.stepData.zoneReturned.id
+      params.domainid = this.prefillContent.domainId ? this.prefillContent.domainId.value : null
+      params.account = this.prefillContent.account ? this.prefillContent.account.value : null
+
+      try {
+        await this.dedicateZone(params)
+        this.stepData.stepMove.push('dedicateZone')
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepAddPhysicalNetworks () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.physical.networks', 'physicalNetwork')
+
+      const params = {}
+      params.zoneid = this.stepData.zoneReturned.id
+
+      if (this.isBasicZone) {
+        const requestedTrafficTypeCount = this.prefillContent.physicalNetworks[0].traffics.length
+        this.stepData.requestedTrafficTypeCount = requestedTrafficTypeCount
+        this.stepData.returnedTrafficTypes = this.stepData.returnedTrafficTypes ? this.stepData.returnedTrafficTypes : []
+        this.stepData.physicalNetworkReturned = this.stepData.physicalNetworkReturned ? this.stepData.physicalNetworkReturned : {}
+
+        if (this.prefillContent.physicalNetworks && this.prefillContent.physicalNetworks.length > 0) {
+          params.name = this.prefillContent.physicalNetworks[0].name
+        } else {
+          params.name = 'PhysicalNetworkInBasicZone'
+        }
+
+        try {
+          if (!this.stepData.stepMove.includes('createPhysicalNetwork')) {
+            const physicalNetworkResult = await this.createPhysicalNetwork(params)
+            this.stepData.physicalNetworkReturned = physicalNetworkResult.jobresult.physicalnetwork
+            this.stepData.stepMove.push('createPhysicalNetwork')
+          }
+
+          if (!this.stepData.stepMove.includes('Guest')) {
+            const guestTrafficResult = await this.addTrafficType('Guest')
+            this.stepData.returnedTrafficTypes.push(guestTrafficResult.jobresult.traffictype)
+            this.stepData.stepMove.push('Guest')
+          }
+
+          if (!this.stepData.stepMove.includes('Management')) {
+            const managementTrafficResult = await this.addTrafficType('Management')
+            this.stepData.returnedTrafficTypes.push(managementTrafficResult.jobresult.traffictype)
+            this.stepData.stepMove.push('Management')
+          }
+
+          if (!this.stepData.stepMove.includes('Storage')) {
+            // addTrafficType Storage
+            const storageEx = this.prefillContent.physicalNetworks[0].traffics.filter(traffic => traffic.type === 'storage')
+            if (storageEx && storageEx.length > 0) {
+              const storageTrafficResult = await this.addTrafficType('Storage')
+              this.stepData.returnedTrafficTypes.push(storageTrafficResult.jobresult.traffictype)
+              this.stepData.stepMove.push('Storage')
+            }
+          }
+
+          if (!this.stepData.stepMove.includes('Public')) {
+            if (this.havingSG && this.havingEIP && this.havingELB) {
+              const publicTrafficResult = await this.addTrafficType('Public')
+              this.stepData.returnedTrafficTypes.push(publicTrafficResult.jobresult.traffictype)
+            }
+            this.stepData.stepMove.push('Public')
+          }
+
+          if (this.stepData.returnedTrafficTypes.length === requestedTrafficTypeCount) {
+            this.stepData.physicalNetworkReturned.returnedTrafficTypes = this.stepData.returnedTrafficTypes
+            await this.stepConfigurePhysicalNetwork()
+          }
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else {
+        this.stepData.physicalNetworksReturned = this.stepData.physicalNetworksReturned ? this.stepData.physicalNetworksReturned : []
+        this.stepData.physicalNetworkItem = this.stepData.physicalNetworkItem ? this.stepData.physicalNetworkItem : {}
+        let physicalNetworkReturned = {}
+
+        if (this.stepData.physicalNetworksReturned.length === this.prefillContent.physicalNetworks.length) {
+          await this.stepConfigurePhysicalNetwork()
+          return
+        }
+
+        for (let index = 0; index < this.prefillContent.physicalNetworks.length; index++) {
+          const physicalNetwork = this.prefillContent.physicalNetworks[index]
+          params.name = physicalNetwork.name
+
+          if (physicalNetwork.isolationMethod) {
+            params.isolationmethods = physicalNetwork.isolationMethod
+          }
+
+          try {
+            if (!this.stepData.stepMove.includes('createPhysicalNetwork' + index)) {
+              const physicalNetworkResult = await this.createPhysicalNetwork(params)
+              physicalNetworkReturned = physicalNetworkResult.jobresult.physicalnetwork
+              this.stepData.physicalNetworkReturned = physicalNetworkReturned
+              this.stepData.physicalNetworkItem['createPhysicalNetwork' + index] = physicalNetworkReturned
+              this.stepData.stepMove.push('createPhysicalNetwork' + index)
+            } else {
+              this.stepData.physicalNetworkReturned = this.stepData.physicalNetworkItem['createPhysicalNetwork' + index]
+            }
+          } catch (e) {
+            this.messageError = e
+            this.processStatus = STATUS_FAILED
+            this.setStepStatus(STATUS_FAILED)
+            break
+          }
+
+          let advCountTrafficReturn = 0
+
+          for (let key = 0; key < physicalNetwork.traffics.length; key++) {
+            const traffic = physicalNetwork.traffics[key]
+
+            try {
+              if (!this.stepData.stepMove.includes('addTrafficType' + index + key)) {
+                if (traffic.type === 'public') {
+                  await this.addTrafficType('Public')
+                } else if (traffic.type === 'management') {
+                  await this.addTrafficType('Management')
+                } else if (traffic.type === 'guest') {
+                  await this.addTrafficType('Guest')
+                } else if (traffic.type === 'storage') {
+                  await this.addTrafficType('Storage')
+                }
+                this.stepData.stepMove.push('addTrafficType' + index + key)
+              }
+
+              advCountTrafficReturn++
+            } catch (e) {
+              this.messageError = e
+              this.processStatus = STATUS_FAILED
+              this.setStepStatus(STATUS_FAILED)
+              break
+            }
+
+            if (advCountTrafficReturn === physicalNetwork.traffics.length) {
+              if (Object.keys(physicalNetworkReturned).length > 0) {
+                this.stepData.physicalNetworksReturned.push(physicalNetworkReturned)
+              }
+
+              if (this.stepData.physicalNetworksReturned.length === this.prefillContent.physicalNetworks.length) {
+                await this.stepConfigurePhysicalNetwork()
+              }
+            }
+          }
+        }
+      }
+    },
+    async stepConfigurePhysicalNetwork () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.configuring.physical.networks', 'physicalNetwork')
+
+      if (this.isBasicZone) {
+        const updPhysicalParams = {}
+        updPhysicalParams.state = 'Enabled'
+        updPhysicalParams.id = this.stepData.physicalNetworkReturned.id
+
+        try {
+          if (!this.stepData.stepMove.includes('updatePhysicalNetwork')) {
+            await this.updatePhysicalNetwork(updPhysicalParams)
+            this.stepData.stepMove.push('updatePhysicalNetwork')
+          }
+
+          if (!this.stepData.stepMove.includes('basicVirtualRouter')) {
+            const listNetworkParams = {}
+            listNetworkParams.name = 'VirtualRouter'
+            listNetworkParams.physicalNetworkId = this.stepData.physicalNetworkReturned.id
+
+            const providerId = await this.listNetworkServiceProviders(listNetworkParams)
+            const virtualRouterElementId = await this.listVirtualRouterElements(providerId)
+            await this.configureVirtualRouterElement(virtualRouterElementId)
+            await this.updateNetworkServiceProvider(providerId)
+            this.stepData.stepMove.push('basicVirtualRouter')
+          }
+
+          for (let i = 0; i < this.selectedBaremetalProviders.length; i++) {
+            if (!this.stepData.stepMove.includes('basicVirtualRouter' + i)) {
+              const listParams = {}
+              listParams.name = this.selectedBaremetalProviders[i]
+              listParams.physicalNetworkId = this.stepData.physicalNetworkReturned.id
+
+              const providerId = await this.listNetworkServiceProviders(listParams, 'BaremetalProvider')
+              if (providerId !== null) {
+                await this.updateNetworkServiceProvider(providerId)
+              }
+              this.stepData.stepMove.push('basicVirtualRouter' + i)
+            }
+          }
+
+          // need to Enable security group provider first
+          if (this.havingSG) {
+            await this.stepEnableSecurityGroupProvider()
+          } else {
+            await this.stepAddNetscalerProvider()
+          }
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else if (this.isAdvancedZone) {
+        for (let index = 0; index < this.stepData.physicalNetworksReturned.length; index++) {
+          const physicalNetwork = this.stepData.physicalNetworksReturned[index]
+
+          if (!this.stepData.stepMove.includes('advUpdatePhysicalNetwork' + physicalNetwork.id)) {
+            const updPhysicalParams = {}
+            updPhysicalParams.state = 'Enabled'
+            updPhysicalParams.id = physicalNetwork.id
+
+            try {
+              await this.updatePhysicalNetwork(updPhysicalParams)
+              this.stepData.stepMove.push('advUpdatePhysicalNetwork' + physicalNetwork.id)
+            } catch (e) {
+              this.messageError = e
+              this.processStatus = STATUS_FAILED
+              this.setStepStatus(STATUS_FAILED)
+              break
+            }
+          }
+
+          // ***** Virtual Router ***** (begin) *****
+          if (!this.stepData.stepMove.includes('advVirtualRouter' + physicalNetwork.id)) {
+            const listParams = {}
+            listParams.name = 'VirtualRouter'
+            listParams.physicalNetworkId = physicalNetwork.id
+
+            try {
+              const providerId = await this.listNetworkServiceProviders(listParams)
+              const elementId = await this.listVirtualRouterElements(providerId)
+              await this.configureVirtualRouterElement(elementId)
+              await this.updateNetworkServiceProvider(providerId)
+              this.stepData.stepMove.push('advVirtualRouter' + physicalNetwork.id)
+            } catch (e) {
+              this.messageError = e
+              this.processStatus = STATUS_FAILED
+              this.setStepStatus(STATUS_FAILED)
+              break
+            }
+          }
+
+          this.advZoneConfiguredVirtualRouterCount++
+
+          // ***** Virtual Router ***** (end) *****
+
+          // ***** Ovs ***** (begin) *****
+          this.configOvs(physicalNetwork)
+          // ***** Ovs ***** (end) *****
+          // ***** Internal LB ***** (begin) *****
+          this.configInternalLBVM(physicalNetwork)
+          // ***** Internal LB ***** (end) *****
+
+          try {
+            // Advanced SG-disabled zone
+            if (!this.sgEnabled) {
+              // ***** VPC Virtual Router ***** (begin) *****
+              await this.configVpcVirtualRouter(physicalNetwork)
+              // ***** VPC Virtual Router ***** (end) *****
+            } else {
+              this.stepData.physicalNetworkReturned = physicalNetwork
+              await this.stepEnableSecurityGroupProvider()
+            }
+          } catch (e) {
+            this.messageError = e
+            this.processStatus = STATUS_FAILED
+            this.setStepStatus(STATUS_FAILED)
+            break
+          }
+
+          if (this.advZoneConfiguredVirtualRouterCount === this.stepData.physicalNetworksReturned.length) {
+            if (!this.sgEnabled) {
+              await this.stepAddPod()
+            } else {
+              await this.stepAddGuestNetwork()
+            }
+          }
+        }
+      }
+    },
+    async configOvs (physicalNetwork) {
+      if (this.stepData.stepMove.includes('configOvs' + physicalNetwork.id)) {
+        return
+      }
+
+      const listParams = {}
+      listParams.name = 'Ovs'
+      listParams.physicalNetworkId = physicalNetwork.id
+
+      const ovsProviderId = await this.listNetworkServiceProviders(listParams, 'ovsProvider')
+      if (ovsProviderId !== null) {
+        const ovsElementId = await this.listOvsElements(ovsProviderId)
+        if (ovsElementId != null) {
+          await this.configureOvsElement(ovsElementId)
+          await this.updateNetworkServiceProvider(ovsProviderId)
+        }
+      }
+
+      this.stepData.stepMove.push('configOvs' + physicalNetwork.id)
+    },
+    async configInternalLBVM (physicalNetwork) {
+      if (this.stepData.stepMove.includes('configInternalLBVM' + physicalNetwork.id)) {
+        return
+      }
+
+      const listParams = {}
+      listParams.name = 'Internallbvm'
+      listParams.physicalNetworkId = physicalNetwork.id
+
+      const internalLbProviderId = await this.listNetworkServiceProviders(listParams, 'configInternalLBVM')
+      if (internalLbProviderId !== null) {
+        const internalLbElementId = await this.listInternalLoadBalancerElements(internalLbProviderId)
+        if (internalLbElementId !== null) {
+          await this.configureInternalLoadBalancerElement(internalLbElementId)
+          await this.updateNetworkServiceProvider(internalLbProviderId)
+        }
+      }
+
+      this.stepData.stepMove.push('configInternalLBVM' + physicalNetwork.id)
+    },
+    async configVpcVirtualRouter (physicalNetwork) {
+      const listParams = {}
+      listParams.name = 'VpcVirtualRouter'
+      listParams.physicalNetworkId = physicalNetwork.id
+
+      try {
+        if (!this.stepData.stepMove.includes('configVpcVirtualRouter' + physicalNetwork.id)) {
+          const providerId = await this.listNetworkServiceProviders(listParams)
+          const elementId = await this.listVirtualRouterElements(providerId)
+          await this.configureVirtualRouterElement(elementId)
+          await this.updateNetworkServiceProvider(providerId)
+
+          this.stepData.stepMove.push('configVpcVirtualRouter' + physicalNetwork.id)
+        }
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepAddNetscalerProvider () {
+      if (this.havingNetscaler) {
+        this.setStepStatus(STATUS_FINISH)
+        this.currentStep++
+        this.addStep('message.adding.Netscaler.provider', 'netscaler')
+
+        const params = {}
+        params.name = 'Netscaler'
+        params.physicalnetworkid = this.stepData.physicalNetworkReturned.id
+
+        try {
+          if (!this.stepData.stepMove.includes('addNetworkServiceProvider')) {
+            const addResult = await this.addNetworkServiceProvider(params)
+            this.stepData.netscalerProviderReturned = addResult.jobresult.networkserviceprovider
+            this.stepData.stepMove.push('addNetworkServiceProvider')
+          }
+          await this.stepAddNetscalerDevice()
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else {
+        await this.stepAddGuestNetwork()
+      }
+    },
+    async stepAddNetscalerDevice () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.adding.Netscaler.device', 'netscaler')
+
+      const params = {}
+      params.physicalnetworkid = this.stepData.physicalNetworkReturned.id
+      params.username = this.prefillContent.netscalerUsername ? this.prefillContent.netscalerUsername.value : null
+      params.password = this.prefillContent.netscalerPassword ? this.prefillContent.netscalerPassword.value : null
+      params.networkdevicetype = this.prefillContent.netscalerType ? this.prefillContent.netscalerType.value : null
+      params.gslbprovider = this.prefillContent.gslbprovider ? this.prefillContent.gslbprovider.value : false
+      params.gslbproviderpublicip = this.prefillContent.gslbproviderpublicip ? this.prefillContent.gslbproviderpublicip.value : null
+      params.gslbproviderprivateip = this.prefillContent.gslbproviderprivateip ? this.prefillContent.gslbproviderprivateip.value : null
+
+      const url = []
+      const ip = this.prefillContent.netscalerIp.value
+      url.push('https://' + ip)
+      let isQuestionMarkAdded = false
+      const publicInterface = this.prefillContent.publicinterface ? this.prefillContent.publicinterface.value : null
+      if (publicInterface != null && publicInterface.length > 0) {
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('publicinterface=' + publicInterface)
+      }
+
+      const privateInterface = this.prefillContent.privateinterface ? this.prefillContent.privateinterface.value : null
+      if (privateInterface != null && privateInterface.length > 0) {
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('privateinterface=' + publicInterface)
+      }
+
+      const numretries = this.prefillContent.numretries ? this.prefillContent.numretries.value : null
+      if (numretries != null && numretries.length > 0) {
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('numretries=' + numretries)
+      }
+
+      const capacity = this.prefillContent.capacity ? this.prefillContent.capacity.value : null
+      if (capacity != null && capacity.length > 0) {
+        if (!isQuestionMarkAdded) {
+          url.push('?')
+          isQuestionMarkAdded = true
+        } else {
+          url.push('&')
+        }
+        url.push('lbdevicecapacity=' + capacity)
+      }
+
+      params.url = encodeURIComponent(url.join(''))
+
+      try {
+        if (!this.stepData.stepMove.includes('addNetscalerLoadBalancer')) {
+          const addResult = await this.addNetscalerLoadBalancer(params)
+          this.stepData.netscalerProviderReturned.netScalerLoadBalancer = addResult.jobresult.netscalerloadbalancer
+          this.stepData.stepMove.push('addNetscalerLoadBalancer')
+        }
+        if (!this.stepData.stepMove.includes('netUpdateNetwork')) {
+          await this.updateNetworkServiceProvider(this.stepData.netscalerProviderReturned.id, 'netscalerProvider')
+          this.stepData.stepMove.push('netUpdateNetwork')
+        }
+        await this.stepAddGuestNetwork()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepAddPod () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.pod', 'pod')
+
+      const params = {}
+      params.zoneId = this.stepData.zoneReturned.id
+      params.name = this.prefillContent.podName ? this.prefillContent.podName.value : null
+      params.gateway = this.prefillContent.podReservedGateway ? this.prefillContent.podReservedGateway.value : null
+      params.netmask = this.prefillContent.podReservedNetmask ? this.prefillContent.podReservedNetmask.value : null
+      params.startIp = this.prefillContent.podReservedStartIp ? this.prefillContent.podReservedStartIp.value : null
+      params.endIp = this.prefillContent.podReservedStopIp ? this.prefillContent.podReservedStopIp.value : null
+
+      try {
+        if (!this.stepData.stepMove.includes('createPod')) {
+          this.stepData.podReturned = await this.createPod(params)
+          this.stepData.stepMove.push('createPod')
+        }
+        await this.stepConfigurePublicTraffic()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepAddGuestNetwork () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.guest.network', 'guestTraffic')
+
+      const params = {}
+      params.zoneid = this.stepData.zoneReturned.id
+      params.name = 'defaultGuestNetwork'
+      params.displaytext = 'defaultGuestNetwork'
+      params.networkofferingid = this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.id : null
+
+      if (this.isAdvancedZone && this.sgEnabled) {
+        params.gateway = this.prefillContent.guestGateway ? this.prefillContent.guestGateway.value : null
+        params.netmask = this.prefillContent.guestNetmask ? this.prefillContent.guestNetmask.value : null
+        params.startip = this.prefillContent.guestStartIp ? this.prefillContent.guestStartIp.value : null
+        params.endip = this.prefillContent.guestStopIp ? this.prefillContent.guestStopIp.value : null
+        params.vlan = this.prefillContent.guestVlan ? this.prefillContent.guestVlan.value : null
+      }
+
+      try {
+        if (!this.stepData.stepMove.includes('createNetwork')) {
+          this.stepData.networkReturned = await this.createNetwork(params)
+          this.stepData.stepMove.push('createNetwork')
+        }
+        await this.stepAddPod()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepConfigurePublicTraffic () {
+      if (
+        (this.isBasicZone &&
+          (this.havingSG && this.havingEIP && this.havingELB)) ||
+        (this.isAdvancedZone && !this.sgEnabled)) {
+        this.setStepStatus(STATUS_FINISH)
+        this.currentStep++
+        this.addStep('message.configuring.public.traffic', 'publicTraffic')
+
+        let stopNow = false
+        this.stepData.returnedPublicTraffic = this.stepData.returnedPublicTraffic ? this.stepData.returnedPublicTraffic : []
+        for (let index = 0; index < this.prefillContent['public-ipranges'].length; index++) {
+          const publicVlanIpRange = this.prefillContent['public-ipranges'][index]
+          let isExisting = false
+
+          this.stepData.returnedPublicTraffic.forEach(publicVlan => {
+            if (publicVlan.vlan === publicVlanIpRange.vlan &&
+              publicVlan.startIp === publicVlanIpRange.startIp &&
+              publicVlan.netmask === publicVlanIpRange.netmask &&
+              publicVlan.gateway === publicVlanIpRange.gateway) {
+              isExisting = true
+              return false
+            }
+          })
+
+          if (isExisting) {
+            continue
+          }
+
+          const params = {}
+          params.zoneId = this.stepData.zoneReturned.id
+          if (publicVlanIpRange.vlan && publicVlanIpRange.vlan.length > 0) {
+            params.vlan = publicVlanIpRange.vlan
+          } else {
+            params.vlan = 'untagged'
+          }
+          params.gateway = publicVlanIpRange.gateway
+          params.netmask = publicVlanIpRange.netmask
+          params.startip = publicVlanIpRange.startIp
+          params.endip = publicVlanIpRange.endIp
+
+          if (this.isBasicZone) {
+            params.forVirtualNetwork = true
+          } else if (this.isAdvancedZone) {
+            if (!this.sgEnabled) {
+              params.forVirtualNetwork = true
+            } else {
+              params.forVirtualNetwork = false
+            }
+          }
+
+          try {
+            if (!this.stepData.stepMove.includes('createPublicVlanIpRange' + index)) {
+              const vlanIpRangeItem = await this.createVlanIpRange(params)
+              this.stepData.returnedPublicTraffic.push(vlanIpRangeItem)
+              this.stepData.stepMove.push('createPublicVlanIpRange' + index)
+            }
+          } catch (e) {
+            this.messageError = e
+            this.processStatus = STATUS_FAILED
+            this.setStepStatus(STATUS_FAILED)
+            stopNow = true
+          }
+
+          if (stopNow) {
+            break
+          }
+        }
+
+        if (stopNow) {
+          return
+        }
+
+        await this.stepConfigureStorageTraffic()
+      } else if (this.isAdvancedZone && this.sgEnabled) {
+        await this.stepConfigureStorageTraffic()
+      } else {
+        if (this.prefillContent.physicalNetworks) {
+          const storageExists = this.prefillContent.physicalNetworks[0].traffics.filter(traffic => traffic.type === 'storage')
+          if (storageExists && storageExists.length > 0) {
+            await this.stepConfigureStorageTraffic()
+          } else {
+            await this.stepConfigureGuestTraffic()
+          }
+        }
+      }
+    },
+    async stepConfigureStorageTraffic () {
+      let targetNetwork = false
+      this.prefillContent.physicalNetworks.forEach(physicalNetwork => {
+        const storageEx = physicalNetwork.traffics.filter(traffic => traffic.type === 'storage')
+        if (storageEx && storageEx.length > 0) {
+          targetNetwork = true
+          return false
+        }
+      })
+
+      if (!targetNetwork) {
+        await this.stepConfigureGuestTraffic()
+        return
+      }
+
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.configuring.storage.traffic', 'storageTraffic')
+
+      this.stepData.tasks = this.stepData.tasks ? this.stepData.tasks : []
+      await this.prefillContent['storage-ipranges'].map(async (storageIpRange, index) => {
+        const params = {}
+        params.vlan = storageIpRange.vlan
+        params.gateway = storageIpRange.gateway
+        params.netmask = storageIpRange.netmask
+        params.startip = storageIpRange.startIp
+        params.endip = storageIpRange.endIp
+        if (!params.vlan || params.vlan.length === 0) {
+          delete params.vlan
+        }
+        params.zoneid = this.stepData.zoneReturned.id
+        params.podid = this.stepData.podReturned.id
+
+        try {
+          if (!this.stepData.stepMove.includes('createStorageNetworkIpRange' + index)) {
+            const createStorageItem = await this.createStorageNetworkIpRange(params)
+            this.stepData.tasks.push(createStorageItem)
+            this.stepData.stepMove.push('createStorageNetworkIpRange' + index)
+          }
+        } catch (e) {
+          this.stepData.tasks.push({
+            error: true,
+            message: e
+          })
+        }
+      })
+
+      const taskTimer = setInterval(() => {
+        const completedTasks = this.stepData.tasks.filter(item => item.complete || item.error)
+        const errorTasks = this.stepData.tasks.filter(item => item.error)
+
+        if (completedTasks.length === this.prefillContent['storage-ipranges'].length) {
+          clearInterval(taskTimer)
+
+          if (errorTasks.length) {
+            this.messageError = 'configureStorageTraffic. Error: ' + errorTasks[0].message
+            this.processStatus = STATUS_FAILED
+            this.setStepStatus(STATUS_FAILED)
+            return
+          }
+
+          this.stepConfigureGuestTraffic()
+          return
+        }
+
+        if (this.stepData.tasks.length === this.prefillContent['storage-ipranges'].length) {
+          this.stepData.tasks.forEach(async (task) => {
+            if (task.error) {
+              return true
+            }
+
+            const jobResult = await this.pollJob(task.jobid)
+
+            if (jobResult.jobstatus === 1) {
+              task.complete = true
+            } else if (jobResult.jobstatus === 2) {
+              task.error = true
+              task.message = jobResult.jobresult.errortext
+            }
+
+            return true
+          })
+        }
+
+        return true
+      }, 1000)
+
+      return true
+    },
+    async stepConfigureGuestTraffic () {
+      if (this.prefillContent.skipGuestTrafficStep) {
+        await this.stepAddCluster()
+        return
+      }
+
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.configuring.guest.traffic', 'guestTraffic')
+
+      if (this.isBasicZone) {
+        const params = {}
+        params.podid = this.stepData.podReturned.id
+        params.networkid = this.stepData.networkReturned.id
+        params.gateway = this.prefillContent.guestGateway ? this.prefillContent.guestGateway.value : null
+        params.netmask = this.prefillContent.guestNetmask ? this.prefillContent.guestNetmask.value : null
+        params.startip = this.prefillContent.guestStartIp ? this.prefillContent.guestStartIp.value : null
+        params.endip = this.prefillContent.guestStopIp ? this.prefillContent.guestStopIp.value : null
+        params.forVirtualNetwork = false
+
+        try {
+          if (!this.stepData.stepMove.includes('createGuestVlanIpRange')) {
+            this.stepData.returnedGuestNetwork = await this.createVlanIpRange(params)
+            this.stepData.stepMove.push('createGuestVlanIpRange')
+          }
+
+          const hypervisor = this.prefillContent.hypervisor.value
+          if (hypervisor === 'BareMetal') {
+            await this.stepComplete()
+          } else {
+            await this.stepAddCluster()
+          }
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else if (this.isAdvancedZone) {
+        const physicalNetworksHavingGuestIncludingVlan = []
+        await this.prefillContent.physicalNetworks.map(async (network) => {
+          if (this.prefillContent.vlanRangeStart) {
+            physicalNetworksHavingGuestIncludingVlan.push(network)
+          }
+        })
+
+        if (physicalNetworksHavingGuestIncludingVlan.length === 0) {
+          await this.stepAddCluster()
+        } else {
+          let updatedCount = 0
+
+          for (let index = 0; index < physicalNetworksHavingGuestIncludingVlan.length; index++) {
+            let vlan = null
+
+            if (!this.prefillContent.vlanRangeEnd || !this.prefillContent.vlanRangeEnd.value) {
+              vlan = this.prefillContent.vlanRangeStart.value
+            } else {
+              vlan = [this.prefillContent.vlanRangeStart.value, this.prefillContent.vlanRangeEnd.value].join('-')
+            }
+
+            const updateParams = {}
+            updateParams.id = this.stepData.physicalNetworkReturned.id
+            updateParams.vlan = vlan
+
+            try {
+              if (!this.stepData.stepMove.includes('advGuestUpdatePhysicalNetwork' + index)) {
+                await this.updatePhysicalNetwork(updateParams)
+                this.stepData.stepMove.push('advGuestUpdatePhysicalNetwork' + index)
+              }
+              updatedCount++
+              if (updatedCount === physicalNetworksHavingGuestIncludingVlan.length) {
+                await this.stepAddCluster()
+              }
+            } catch (e) {
+              this.messageError = e
+              this.processStatus = STATUS_FAILED
+              this.setStepStatus(STATUS_FAILED)
+              break
+            }
+          }
+        }
+      }
+    },
+    async stepAddCluster () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.cluster', 'clusterResource')
+
+      const hypervisor = this.prefillContent.hypervisor.value
+      const params = {}
+      params.zoneId = this.stepData.zoneReturned.id
+      params.hypervisor = hypervisor
+      let clusterType = null
+
+      if (hypervisor === 'VMware') {
+        clusterType = 'ExternalManaged'
+      } else {
+        clusterType = 'CloudManaged'
+      }
+      params.clustertype = clusterType
+      params.podId = this.stepData.podReturned.id
+      let clusterName = this.prefillContent.clusterName.value
+
+      if (hypervisor === 'VMware') {
+        params.username = this.prefillContent.vCenterUsername ? this.prefillContent.vCenterUsername.value : null
+        params.password = this.prefillContent.vCenterPassword ? this.prefillContent.vCenterPassword.value : null
+        params.vsmipaddress = this.prefillContent.vsmipaddress ? this.prefillContent.vsmipaddress.value : null
+        params.vsmusername = this.prefillContent.vsmusername ? this.prefillContent.vsmusername.value : null
+        params.vsmpassword = this.prefillContent.vsmpassword ? this.prefillContent.vsmpassword.value : null
+
+        const hostname = this.prefillContent.vCenterHost ? this.prefillContent.vCenterHost.value : null
+        const dcName = this.prefillContent.vCenterDatacenter ? this.prefillContent.vCenterDatacenter.value : null
+        let url = null
+        if (hostname.indexOf('http://') === -1) {
+          url = ['http://', hostname].join('')
+        } else {
+          url = hostname
+        }
+
+        url += '/' + dcName + '/' + clusterName
+        params.url = url
+        clusterName = hostname + '/' + dcName + '/' + clusterName
+      }
+      params.clustername = clusterName
+
+      if (hypervisor === 'VMware') {
+        const vmwareData = {}
+        vmwareData.zoneId = this.stepData.zoneReturned.id
+        vmwareData.username = this.prefillContent.vCenterUsername ? this.prefillContent.vCenterUsername.value : null
+        vmwareData.password = this.prefillContent.vCenterPassword ? this.prefillContent.vCenterPassword.value : null
+        vmwareData.name = this.prefillContent.vCenterDatacenter ? this.prefillContent.vCenterDatacenter.value : null
+        vmwareData.vcenter = this.prefillContent.vCenterHost ? this.prefillContent.vCenterHost.value : null
+
+        try {
+          if (!this.stepData.stepMove.includes('addVmwareDc')) {
+            this.stepData.vmWareResult = await this.addVmwareDc(vmwareData)
+            this.stepData.stepMove.push('addVmwareDc')
+          }
+
+          if (this.stepData.vmWareResult.id !== null) {
+            if (!this.stepData.stepMove.includes('addCluster')) {
+              this.stepData.clusterReturned = await this.addCluster(params)
+              this.stepData.stepMove.push('addCluster')
+            }
+            await this.stepAddPrimaryStorage()
+          }
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else {
+        try {
+          if (!this.stepData.stepMove.includes('addCluster')) {
+            this.stepData.clusterReturned = await this.addCluster(params)
+            this.stepData.stepMove.push('addCluster')
+          }
+          await this.stepAddHost()
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      }
+    },
+    async stepAddHost () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.adding.host', 'hostResource')
+
+      const hostData = {}
+      hostData.zoneid = this.stepData.zoneReturned.id
+      hostData.podid = this.stepData.podReturned.id
+      hostData.clusterid = this.stepData.clusterReturned.id
+      hostData.hypervisor = this.stepData.clusterReturned.hypervisortype
+      hostData.clustertype = this.stepData.clusterReturned.clustertype
+      hostData.hosttags = this.prefillContent.hostTags ? this.prefillContent.hostTags.value : null
+      hostData.username = this.prefillContent.hostUserName ? this.prefillContent.hostUserName.value : null
+      hostData.password = this.prefillContent.hostPassword ? this.prefillContent.hostPassword.value : null
+      const hostname = this.prefillContent.hostName ? this.prefillContent.hostName.value : null
+      let url = null
+      if (hostname.indexOf('http://') === -1) {
+        url = ['http://', hostname].join('')
+      } else {
+        url = hostname
+      }
+      hostData.url = url
+      const hypervisor = this.prefillContent.hypervisor.value
+
+      if (hypervisor === 'Ovm') {
+        hostData.agentusername = this.prefillContent.agentUserName ? this.prefillContent.agentUserName.value : null
+        hostData.agentpassword = this.prefillContent.agentPassword ? this.prefillContent.agentPassword.value : null
+      }
+
+      if (this.prefillContent.localstorageenabledforsystemvm.value) {
+        const configParams = {}
+        configParams.name = 'system.vm.use.local.storage'
+        configParams.value = true
+        configParams.zoneid = this.stepData.zoneReturned.id
+
+        try {
+          await this.updateConfiguration(configParams)
+          this.stepData.returnedHost = await this.addHost(hostData)
+          await this.stepAddPrimaryStorage()
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      } else {
+        try {
+          this.stepData.returnedHost = await this.addHost(hostData)
+          await this.stepAddPrimaryStorage()
+        } catch (e) {
+          this.messageError = e
+          this.processStatus = STATUS_FAILED
+          this.setStepStatus(STATUS_FAILED)
+        }
+      }
+    },
+    async stepAddPrimaryStorage () {
+      if (this.prefillContent.localstorageenabled.value &&
+        this.prefillContent.localstorageenabledforsystemvm.value) {
+        await this.stepAddSecondaryStorage()
+        return
+      }
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.primary.storage', 'primaryResource')
+
+      const params = {}
+      params.zoneid = this.stepData.zoneReturned.id
+      params.podId = this.stepData.podReturned.id
+      params.clusterid = this.stepData.clusterReturned.id
+      params.name = this.prefillContent.primaryStorageName ? this.prefillContent.primaryStorageName.value : null
+      params.scope = this.prefillContent.primaryStorageScope ? this.prefillContent.primaryStorageScope.value : null
+
+      if (params.scope === 'zone') {
+        const hypervisor = this.prefillContent.hypervisor.value
+        if (hypervisor !== undefined) {
+          params.hypervisor = hypervisor
+        } else if (this.stepData.clusterReturned.hypervisortype !== undefined) {
+          params.hypervisor = this.stepData.clusterReturned.hypervisortype
+        }
+      }
+
+      const server = this.prefillContent.primaryStorageServer ? this.prefillContent.primaryStorageServer.value : null
+      let url = ''
+      const protocol = this.prefillContent.primaryStorageProtocol.value
+
+      if (protocol === 'nfs') {
+        let path = this.prefillContent.primaryStoragePath.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        url = this.nfsURL(server, path)
+      } else if (protocol === 'SMB') {
+        let path = this.prefillContent.primaryStoragePath.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        url = this.smbURL(server, path)
+        params['details[0].user'] = this.prefillContent.primaryStorageSMBUsername.value
+        params['details[0].password'] = this.prefillContent.primaryStorageSMBPassword.value
+        params['details[0].domain'] = this.prefillContent.primaryStorageSMBDomain.value
+      } else if (protocol === 'PreSetup') {
+        let path = this.prefillContent.primaryStoragePath.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        url = this.presetupURL(server, path)
+      } else if (protocol === 'ocfs2') {
+        let path = this.prefillContent.primaryStoragePath.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        url = this.ocfs2URL(server, path)
+      } else if (protocol === 'SharedMountPoint') {
+        let path = this.prefillContent.primaryStoragePath.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        url = this.sharedMountPointURL(server, path)
+      } else if (protocol === 'clvm') {
+        let vg = this.prefillContent.primaryStorageVolumeGroup.value
+        if (vg.substring(0, 1) !== '/') {
+          vg = '/' + vg
+        }
+        url = this.clvmURL(vg)
+      } else if (protocol === 'rbd') {
+        const rbdmonitor = this.prefillContent.primaryStorageRADOSMonitor.value
+        const rbdpool = this.prefillContent.primaryStorageRADOSPool.value
+        const rbdid = this.prefillContent.primaryStorageRADOSUser.value
+        const rbdsecret = this.prefillContent.primaryStorage.value
+        url = this.rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret)
+      } else if (protocol === 'vmfs') {
+        let path = this.prefillContent.primaryStorageVmfsDatacenter.value
+        if (path.substring(0, 1) !== '/') {
+          path = '/' + path
+        }
+        path += '/' + this.prefillContent.primaryStorageVmfsDatastore.value
+        url = this.vmfsURL('dummy', path)
+      } else {
+        let iqn = this.prefillContent.primaryStorageTargetIQN.value
+        if (iqn.substring(0, 1) !== '/') {
+          iqn = '/' + iqn
+        }
+        const lun = this.prefillContent.primaryStorageLUN.value
+        url = this.iscsiURL(server, iqn, lun)
+      }
+
+      params.url = url
+      params.tags = this.prefillContent.primaryStorageTags.value
+
+      try {
+        if (!this.stepData.stepMove.includes('createStoragePool')) {
+          this.stepData.primaryStorageRetunred = await this.createStoragePool(params)
+          this.stepData.stepMove.push('createStoragePool')
+        }
+        await this.stepAddSecondaryStorage()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepAddSecondaryStorage () {
+      if (!this.prefillContent.secondaryStorageProvider.value ||
+      this.prefillContent.secondaryStorageProvider.value.length === 0) {
+        await this.stepComplete()
+        return
+      }
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.creating.secondary.storage', 'secondaryResource')
+
+      const params = {}
+      params.name = this.prefillContent.secondaryStorageName ? this.prefillContent.secondaryStorageName.value : null
+      if (this.prefillContent.secondaryStorageProvider.value === 'NFS') {
+        const nfsServer = this.prefillContent.secondaryStorageServer.value
+        const path = this.prefillContent.secondaryStoragePath.value
+        const url = this.nfsURL(nfsServer, path)
+
+        params.provider = this.prefillContent.secondaryStorageProvider.value
+        params.zoneid = this.stepData.zoneReturned.id
+        params.url = url
+      } else if (this.prefillContent.secondaryStorageProvider.value === 'SMB') {
+        const nfsServer = this.prefillContent.secondaryStorageServer.value
+        const path = this.prefillContent.secondaryStoragePath.value
+        const url = this.smbURL(nfsServer, path)
+
+        params.provider = this.prefillContent.secondaryStorageProvider.value
+        params.zoneid = this.stepData.zoneReturned.id
+        params.url = url
+        params['details[0].key'] = 'user'
+        params['details[0].value'] = this.prefillContent.secondaryStorageSMBUsername.value
+        params['details[1].key'] = 'password'
+        params['details[1].value'] = this.prefillContent.secondaryStorageSMBPassword.value
+        params['details[2].key'] = 'domain'
+        params['details[2].value'] = this.prefillContent.secondaryStorageSMBDomain.value
+      } else if (this.prefillContent.secondaryStorageProvider.value === 'S3') {
+        params.provider = this.prefillContent.secondaryStorageProvider.value
+        params['details[0].key'] = 'accesskey'
+        params['details[0].value'] = this.prefillContent.secondaryStorageAccessKey.value
+        params['details[1].key'] = 'secretkey'
+        params['details[1].value'] = this.prefillContent.secondaryStorageSecretKey.value
+        params['details[2].key'] = 'bucket'
+        params['details[2].value'] = this.prefillContent.secondaryStorageBucket.value
+        params['details[3].key'] = 'usehttps'
+        params['details[3].value'] = this.prefillContent.secondaryStorageHttps ? this.prefillContent.secondaryStorageHttps.value : false
+
+        let index = 4
+        if (this.prefillContent.secondaryStorageEndpoint &&
+          this.prefillContent.secondaryStorageEndpoint.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'endpoint'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageEndpoint.value
+          index++
+        }
+        if (this.prefillContent.secondaryStorageConnectionTimeout &&
+          this.prefillContent.secondaryStorageConnectionTimeout.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'connectiontimeout'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageConnectionTimeout.value
+          index++
+        }
+        if (this.prefillContent.secondaryStorageMaxError &&
+          this.prefillContent.secondaryStorageMaxError.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'maxerrorretry'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageMaxError.value
+          index++
+        }
+        if (this.prefillContent.secondaryStorageSocketTimeout &&
+          this.prefillContent.secondaryStorageSocketTimeout.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'sockettimeout'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageSocketTimeout.value
+          index++
+        }
+      } else if (this.prefillContent.secondaryStorageProvider.value === 'Swift') {
+        params.provider = this.prefillContent.secondaryStorageProvider.value
+        params.url = this.prefillContent.secondaryStorageURL.value
+
+        let index = 0
+        if (this.prefillContent.secondaryStorageAccount &&
+          this.prefillContent.secondaryStorageAccount.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'account'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageAccount.value
+          index++
+        }
+        if (this.prefillContent.secondaryStorageUsername &&
+          this.prefillContent.secondaryStorageUsername.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'username'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageUsername.value
+          index++
+        }
+        if (this.prefillContent.secondaryStorageKey &&
+          this.prefillContent.secondaryStorageKey.value.length > 0) {
+          params['details[' + index.toString() + '].key'] = 'key'
+          params['details[' + index.toString() + '].value'] = this.prefillContent.secondaryStorageKey.value
+          index++
+        }
+      }
+
+      try {
+        if (!this.stepData.stepMove.includes('addImageStore')) {
+          await this.addImageStore(params)
+          this.stepData.stepMove.push('addImageStore')
+        }
+
+        if (this.prefillContent.secondaryStorageNFSStaging && this.prefillContent.secondaryStorageNFSStaging.value) {
+          const nfsServer = this.prefillContent.secondaryStorageNFSServer.value
+          const path = this.prefillContent.secondaryStorageNFSPath.value
+          const url = this.nfsURL(nfsServer, path)
+
+          const nfsParams = {}
+          nfsParams.provider = 'nfs'
+          nfsParams.zoneid = this.stepData.zoneReturned.id
+          nfsParams.url = url
+
+          if (!this.stepData.stepMove.includes('createSecondaryStagingStore')) {
+            await this.createSecondaryStagingStore(nfsParams)
+            this.stepData.stepMove.push('createSecondaryStagingStore')
+          }
+        }
+
+        await this.stepComplete()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    async stepEnableSecurityGroupProvider () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.enabling.security.group.provider', 'stepZone')
+
+      const listNetworkParams = {}
+      listNetworkParams.name = 'SecurityGroupProvider'
+      listNetworkParams.physicalNetworkId = this.stepData.physicalNetworkReturned.id
+
+      try {
+        if (!this.stepData.stepMove.includes('enableSecurityGroupProvider' + this.stepData.physicalNetworkReturned.id)) {
+          const securityGroupProviderId = await this.listNetworkServiceProviders(listNetworkParams)
+          await this.updateNetworkServiceProvider(securityGroupProviderId, 'enableSecurityGroupProvider')
+          this.stepData.stepMove.push('enableSecurityGroupProvider' + this.stepData.physicalNetworkReturned.id)
+        }
+
+        await this.stepAddNetscalerProvider()
+      } catch (e) {
+        this.messageError = e
+        this.processStatus = STATUS_FAILED
+        this.setStepStatus(STATUS_FAILED)
+      }
+    },
+    stepComplete () {
+      this.setStepStatus(STATUS_FINISH)
+      this.currentStep++
+      this.addStep('message.zone.creation.complete', 'stepComplete')
+      this.setStepStatus(STATUS_FINISH)
+      this.processStatus = STATUS_FINISH
+    },
+    async enableZoneAction () {
+      const params = {}
+      params.allocationstate = 'Enabled'
+      params.id = this.stepData.zoneReturned.id
+      this.loading = true
+
+      try {
+        await this.enableZone(params)
+        await this.$message.success('Success')
+        this.loading = false
+        this.steps = []
+        this.$emit('closeAction')
+        this.$emit('refresh-data')
+      } catch (e) {
+        this.loading = false
+        await this.$notification.error({
+          message: this.$t('message.request.failed'),
+          description: e
+        })
+      }
+    },
+    async pollJob (jobId) {
+      return new Promise(resolve => {
+        const asyncJobInterval = setInterval(() => {
+          api('queryAsyncJobResult', { jobId }).then(async json => {
+            const result = json.queryasyncjobresultresponse
+            if (result.jobstatus === 0) {
+              return
+            }
+
+            clearInterval(asyncJobInterval)
+            resolve(result)
+          })
+        }, 1000)
+      })
+    },
+    createZone (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createZone', args).then(json => {
+          const zone = json.createzoneresponse.zone
+          resolve(zone)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    dedicateZone (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('dedicateZone', args).then(json => {
+          resolve()
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          resolve(message)
+        })
+      })
+    },
+    async createPhysicalNetwork (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createPhysicalNetwork', args).then(async json => {
+          const jobId = json.createphysicalnetworkresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `createPhysicalNetwork ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addTrafficType (trafficType) {
+      const getTrafficParams = this.trafficLabelParam(trafficType.toLowerCase())
+      let params = {}
+
+      params.trafficType = trafficType
+      params.physicalnetworkid = this.stepData.physicalNetworkReturned.id
+      params = { ...params, ...getTrafficParams }
+
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addTrafficType', params).then(async json => {
+          const jobId = json.addtraffictyperesponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              this.setStepStatus(STATUS_FAILED)
+              message = `${this.$t('message.failed.to.add')} ` + trafficType +
+                ` ${this.$t('message.traffic.type.to.basic.zone')}. ${this.$t('label.error')}: ` +
+                result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    updatePhysicalNetwork (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('updatePhysicalNetwork', args).then(async json => {
+          const jobId = json.updatephysicalnetworkresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `updatePhysicalNetwork ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    listNetworkServiceProviders (params, type) {
+      return new Promise((resolve, reject) => {
+        let providerId = null
+        let message = ''
+
+        api('listNetworkServiceProviders', params).then(json => {
+          const items = json.listnetworkserviceprovidersresponse.networkserviceprovider
+          if (items != null && items.length > 0) {
+            providerId = items[0].id
+          }
+          if (!type && providerId == null) {
+            message = this.$t('message.listnsp.not.return.providerid')
+            reject(message)
+            return
+          }
+          resolve(providerId)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    listVirtualRouterElements (virtualRouterProviderId) {
+      return new Promise((resolve, reject) => {
+        let virtualRouterElementId = null
+        let message = ''
+
+        api('listVirtualRouterElements', { nspid: virtualRouterProviderId }).then(json => {
+          const items = json.listvirtualrouterelementsresponse.virtualrouterelement
+          if (items != null && items.length > 0) {
+            virtualRouterElementId = items[0].id
+          }
+          if (virtualRouterElementId === null) {
+            message = this.$t('message.virtual.router.not.return.elementid')
+            reject(message)
+            return
+          }
+          resolve(virtualRouterElementId)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    configureVirtualRouterElement (virtualRouterElementId) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+        const params = {}
+        params.enabled = true
+        params.id = virtualRouterElementId
+
+        api('configureVirtualRouterElement', params).then(async json => {
+          const jobId = json.configurevirtualrouterelementresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `configureVirtualRouterElement ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    updateNetworkServiceProvider (providerId, type) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+        const params = {}
+
+        params.id = providerId
+        params.state = 'Enabled'
+
+        api('updateNetworkServiceProvider', params).then(async json => {
+          const jobId = json.updatenetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `updateNetworkServiceProvider ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: `
+              switch (type) {
+                case 'netscalerProvider':
+                  message = `${this.$t('message.enable.netsacler.provider.failed')}. ${this.$t('label.error')}: `
+                  break
+                case 'enableSecurityGroupProvider':
+                  message = `${this.$t('message.enable.securitygroup.provider.failed')}. ${this.$t('label.error')}: `
+                  break
+              }
+              message += result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    listOvsElements (ovsProviderId) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+        let ovsElementId = null
+
+        api('listOvsElements', { nspid: ovsProviderId }).then(json => {
+          const items = json.listovselementsresponse.ovselement
+          if (items != null && items.length > 0) {
+            ovsElementId = items[0].id
+          }
+          resolve(ovsElementId)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    configureOvsElement (ovsElementId) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('configureOvsElement', { enabled: true, id: ovsElementId }).then(async json => {
+          const jobId = json.configureovselementresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `configureOvsElement ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    listInternalLoadBalancerElements (internalLbProviderId) {
+      return new Promise((resolve, reject) => {
+        let internalLbElementId = null
+        let message = ''
+
+        api('listInternalLoadBalancerElements', { nspid: internalLbProviderId }).then(json => {
+          const items = json.listinternalloadbalancerelementsresponse.internalloadbalancerelement
+          if (items != null && items.length > 0) {
+            internalLbElementId = items[0].id
+          }
+          if (internalLbElementId == null) {
+            message = this.$t('message.interloadbalance.not.return.elementid')
+            reject(message)
+            return
+          }
+          resolve(internalLbElementId)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    configureInternalLoadBalancerElement (internalLbElementId) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+        api('configureInternalLoadBalancerElement', { enabled: true, id: internalLbElementId }).then(async json => {
+          const jobId = json.configureinternalloadbalancerelementresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `configureVirtualRouterElement ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addNetworkServiceProvider (arg) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addNetworkServiceProvider', arg).then(async json => {
+          const jobId = json.addnetworkserviceproviderresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = `addNetworkServiceProvider&name=Netscaler ${this.$t('label.failed').toLowerCase()}. ${this.$t('label.error')}: ` + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createNetwork (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createNetwork', args).then(json => {
+          const returnedGuestNetwork = json.createnetworkresponse.network
+          resolve(returnedGuestNetwork)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createPod (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createPod', args).then(json => {
+          const returnedPod = json.createpodresponse.pod
+          resolve(returnedPod)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createVlanIpRange (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createVlanIpRange', args).then(json => {
+          const item = json.createvlaniprangeresponse.vlan
+          resolve(item)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createStorageNetworkIpRange (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createStorageNetworkIpRange', args).then(async json => {
+          const jobId = json.createstoragenetworkiprangeresponse.jobid
+          resolve({
+            jobid: jobId,
+            complete: false
+          })
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addVmwareDc (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addVmwareDc', {}, 'POST', args).then(json => {
+          const item = json.addvmwaredcresponse.vmwaredc
+          resolve(item)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addCluster (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addCluster', args).then(json => {
+          const result = json.addclusterresponse.cluster[0]
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addHost (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addHost', {}, 'POST', args).then(json => {
+          const result = json.addhostresponse.host[0]
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    updateConfiguration (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('updateConfiguration', args).then(json => {
+          resolve()
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createStoragePool (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createStoragePool', args).then(json => {
+          const result = json.createstoragepoolresponse.storagepool
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addImageStore (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addImageStore', args).then(json => {
+          const result = json.addimagestoreresponse.secondarystorage
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    createSecondaryStagingStore (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('createSecondaryStagingStore', args).then(json => {
+          const result = json.addimagestoreresponse.secondarystorage
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    addNetscalerLoadBalancer (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('addNetscalerLoadBalancer', {}, 'POST', args).then(async json => {
+          const jobId = json.addnetscalerloadbalancerresponse.jobid
+          if (jobId) {
+            const result = await this.pollJob(jobId)
+            if (result.jobstatus === 2) {
+              message = 'addNetscalerDevice ' + result.jobresult.errortext
+              reject(message)
+              return
+            }
+            resolve(result)
+          }
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    enableZone (args) {
+      return new Promise((resolve, reject) => {
+        let message = ''
+
+        api('updateZone', args).then(json => {
+          const result = json.updatezoneresponse.zone
+          resolve(result)
+        }).catch(error => {
+          message = error.response.headers['x-description']
+          reject(message)
+        })
+      })
+    },
+    nfsURL (server, path) {
+      let url = null
+      if (path.substring(0, 1) !== '/') {
+        path = '/' + path
+      }
+      if (server.indexOf('://') === -1) {
+        url = 'nfs://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    smbURL (server, path, smbUsername, smbPassword, smbDomain) {
+      let url = ''
+      if (path.substring(0, 1) !== '/') {
+        path = '/' + path
+      }
+      if (server.indexOf('://') === -1) {
+        url += 'cifs://'
+      }
+      url += (server + path)
+      return url
+    },
+    presetupURL (server, path) {
+      let url = null
+      if (server.indexOf('://') === -1) {
+        url = 'presetup://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    ocfs2URL (server, path) {
+      let url = null
+      if (server.indexOf('://') === -1) {
+        url = 'ocfs2://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    sharedMountPointURL (server, path) {
+      let url = ''
+      if (server.indexOf('://') === -1) {
+        url = 'SharedMountPoint://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    rbdURL (monitor, pool, id, secret) {
+      let url
+      secret = secret.replace('+', '-')
+      secret = secret.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
+    },
+    clvmURL (vgname) {
+      let url = ''
+      if (vgname.indexOf('://') === -1) {
+        url = 'clvm://localhost/' + vgname
+      } else {
+        url = vgname
+      }
+      return url
+    },
+    vmfsURL (server, path) {
+      let url = ''
+      if (server.indexOf('://') === -1) {
+        url = 'vmfs://' + server + path
+      } else {
+        url = server + path
+      }
+      return url
+    },
+    iscsiURL (server, iqn, lun) {
+      let url = ''
+      if (server.indexOf('://') === -1) {
+        url = 'iscsi://' + server + iqn + '/' + lun
+      } else {
+        url = server + iqn + '/' + lun
+      }
+      return url
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .card-waiting-launch {
+    text-align: center;
+    margin: 10px 0;
+    width: 100%;
+    padding: 20px;
+    font-size: 20px;
+  }
+
+  .card-launch-description {
+    text-align: justify;
+    margin: 10px 0;
+    width: 100%;
+    padding: 0;
+  }
+
+  .card-launch-content {
+    text-align: justify;
+    margin: 10px 0;
+    width: 100%;
+    font-size: 15px;
+    max-height: 45vh;
+    overflow-y: auto;
+  }
+
+  /deep/.step-error {
+    color: #f5222d;
+    margin-top: 20px;
+
+    /deep/.ant-card-body {
+      padding: 15px;
+      text-align: justify;
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
new file mode 100644
index 0000000..c717560
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
@@ -0,0 +1,457 @@
+// 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 style="width: auto;">
+    <a-steps progressDot :current="currentStep" size="small" style="margin-left: 0px; margin-top: 16px;">
+      <a-step
+        v-for="step in steps"
+        :key="step.title"
+        :title="$t(step.title)"
+        :style="stepScales"></a-step>
+    </a-steps>
+    <zone-wizard-physical-network-setup-step
+      v-if="steps && steps[currentStep].formKey === 'physicalNetwork'"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      :prefillContent="prefillContent"
+      :isFixError="isFixError"
+    />
+    <static-inputs-form
+      v-if="steps && steps[currentStep].formKey === 'netscaler'"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      :fields="netscalerFields"
+      :prefillContent="prefillContent"
+      :description="netscalerSetupDescription"
+      :isFixError="isFixError"
+    />
+    <ip-address-range-form
+      v-if="steps && steps[currentStep].formKey === 'publicTraffic'"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      traffic="public"
+      :description="publicTrafficDescription[zoneType.toLowerCase()]"
+      :prefillContent="prefillContent"
+      :isFixError="isFixError"
+    />
+
+    <static-inputs-form
+      v-if="steps && steps[currentStep].formKey === 'pod'"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      :fields="podFields"
+      :prefillContent="prefillContent"
+      :description="podSetupDescription"
+      :isFixError="isFixError"
+    />
+
+    <div v-if="guestTrafficRangeMode">
+      <static-inputs-form
+        v-if="steps && steps[currentStep].formKey === 'guestTraffic'"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :fields="guestTrafficFields"
+        :prefillContent="prefillContent"
+        :description="guestTrafficDescription[this.zoneType.toLowerCase()]"
+        :isFixError="isFixError"
+      />
+    </div>
+    <div v-else>
+      <advanced-guest-traffic-form
+        v-if="steps && steps[currentStep].formKey === 'guestTraffic'"
+        @nextPressed="nextPressed"
+        @backPressed="handleBack"
+        @fieldsChanged="fieldsChanged"
+        @submitLaunchZone="submitLaunchZone"
+        :prefillContent="prefillContent"
+        :description="guestTrafficDescription[this.zoneType.toLowerCase()]"
+        :isFixError="isFixError"
+      />
+    </div>
+
+    <ip-address-range-form
+      v-if="steps && steps[currentStep].formKey === 'storageTraffic'"
+      @nextPressed="nextPressed"
+      @backPressed="handleBack"
+      @fieldsChanged="fieldsChanged"
+      @submitLaunchZone="submitLaunchZone"
+      traffic="storage"
+      :description="storageTrafficDescription"
+      :prefillContent="prefillContent"
+      :isFixError="isFixError"
+    />
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import ZoneWizardPhysicalNetworkSetupStep from '@views/infra/zone/ZoneWizardPhysicalNetworkSetupStep'
+import IpAddressRangeForm from '@views/infra/zone/IpAddressRangeForm'
+import StaticInputsForm from '@views/infra/zone/StaticInputsForm'
+import AdvancedGuestTrafficForm from '@views/infra/zone/AdvancedGuestTrafficForm'
+
+export default {
+  components: {
+    ZoneWizardPhysicalNetworkSetupStep,
+    IpAddressRangeForm,
+    StaticInputsForm,
+    AdvancedGuestTrafficForm
+  },
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    stepChild: {
+      type: String,
+      default: ''
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : null
+    },
+    sgEnabled () {
+      return this.prefillContent.securityGroupsEnabled ? this.prefillContent.securityGroupsEnabled.value : false
+    },
+    havingNetscaler () {
+      return this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.havingNetscaler : false
+    },
+    guestTrafficRangeMode () {
+      return this.zoneType === 'Basic' ||
+        (this.zoneType === 'Advanced' && this.sgEnabled)
+    },
+    allSteps () {
+      const steps = []
+      steps.push({
+        title: 'label.physical.network',
+        formKey: 'physicalNetwork'
+      })
+      if (this.havingNetscaler) {
+        steps.push({
+          title: 'label.netScaler',
+          formKey: 'netscaler'
+        })
+      }
+      steps.push({
+        title: 'label.public.traffic',
+        formKey: 'publicTraffic',
+        trafficType: 'public'
+      })
+      steps.push({
+        title: 'label.pod',
+        formKey: 'pod'
+      })
+      steps.push({
+        title: 'label.guest.traffic',
+        formKey: 'guestTraffic',
+        trafficType: 'guest'
+      })
+      steps.push({
+        title: 'label.storage.traffic',
+        formKey: 'storageTraffic',
+        trafficType: 'storage'
+      })
+
+      return steps
+    },
+    stepScales () {
+      if (this.allSteps.length > 4) {
+        return { width: 'calc(100% / ' + this.allSteps.length + ')' }
+      }
+      return {}
+    },
+    netscalerFields () {
+      return [
+        {
+          title: 'label.guest.ip',
+          key: 'netscalerIp',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        },
+        {
+          title: 'label.username',
+          key: 'netscalerUsername',
+          required: false
+        },
+        {
+          title: 'label.password',
+          key: 'netscalerPassword',
+          required: false,
+          password: true
+        },
+        {
+          title: 'label.type',
+          key: 'netscalerType',
+          required: false,
+          select: true,
+          options: this.netscalerType
+        },
+        {
+          title: 'label.public.interface',
+          key: 'publicinterface',
+          required: false
+        },
+        {
+          title: 'label.private.interface',
+          key: 'privateinterface',
+          required: false
+        },
+        {
+          title: 'label.gslb.service',
+          key: 'gslbprovider',
+          required: false,
+          switch: true
+        },
+        {
+          title: 'label.gslb.service.public.ip',
+          key: 'gslbproviderpublicip',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        },
+        {
+          title: 'label.gslb.service.private.ip',
+          key: 'gslbproviderprivateip',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        },
+        {
+          title: 'label.numretries',
+          key: 'numretries',
+          required: false
+        },
+        {
+          title: 'label.capacity',
+          key: 'capacity',
+          required: false
+        }
+      ]
+    },
+    guestTrafficFields () {
+      const fields = [
+        {
+          title: 'label.guest.gateway',
+          key: 'guestGateway',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestgateway',
+          required: false
+        },
+        {
+          title: 'label.guest.netmask',
+          key: 'guestNetmask',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestnetmask',
+          required: false
+        },
+        {
+          title: 'label.guest.start.ip',
+          key: 'guestStartIp',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.gueststartip',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        },
+        {
+          title: 'label.guest.end.ip',
+          key: 'guestStopIp',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestendip',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        }
+      ]
+
+      if (this.sgEnabled) {
+        fields.push({
+          title: 'label.vlanid',
+          key: 'guestVlan',
+          required: false,
+          ipV4: false
+        })
+      }
+
+      return fields
+    }
+  },
+  data () {
+    return {
+      physicalNetworks: null,
+      currentStep: 0,
+      steps: null,
+      skipGuestTrafficStep: false,
+      netscalerType: [],
+      publicTrafficDescription: {
+        advanced: 'message.public.traffic.in.advanced.zone',
+        basic: 'message.public.traffic.in.basic.zone'
+      },
+      guestTrafficDescription: {
+        advanced: 'message.guest.traffic.in.advanced.zone',
+        basic: 'message.guest.traffic.in.basic.zone'
+      },
+      podSetupDescription: 'message.add.pod.during.zone.creation',
+      netscalerSetupDescription: 'label.please.specify.netscaler.info',
+      storageTrafficDescription: 'label.zonewizard.traffictype.storage',
+      podFields: [
+        {
+          title: 'label.pod.name',
+          key: 'podName',
+          placeHolder: 'message.installwizard.tooltip.addpod.name',
+          required: true
+        },
+        {
+          title: 'label.reserved.system.gateway',
+          key: 'podReservedGateway',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemgateway',
+          required: true
+        },
+        {
+          title: 'label.reserved.system.netmask',
+          key: 'podReservedNetmask',
+          placeHolder: 'message.tooltip.reserved.system.netmask',
+          required: true
+        },
+        {
+          title: 'label.start.reserved.system.ip',
+          key: 'podReservedStartIp',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemstartip',
+          required: true,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        },
+        {
+          title: 'label.end.reserved.system.ip',
+          key: 'podReservedStopIp',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemendip',
+          required: false,
+          ipV4: true,
+          message: 'message.error.ipv4.address'
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.physicalNetworks = this.prefillContent.physicalNetworks
+    this.steps = this.filteredSteps()
+    this.currentStep = this.prefillContent.networkStep ? this.prefillContent.networkStep : 0
+    if (this.stepChild && this.stepChild !== '') {
+      this.currentStep = this.steps.findIndex(item => item.formKey === this.stepChild)
+    }
+    if (this.zoneType === 'Basic' ||
+      (this.zoneType === 'Advanced' && this.sgEnabled)) {
+      this.skipGuestTrafficStep = false
+    } else {
+      this.fetchConfiguration()
+    }
+    this.$emit('fieldsChanged', { skipGuestTrafficStep: this.skipGuestTrafficStep })
+    this.fetchNetscalerType()
+  },
+  methods: {
+    fetchNetscalerType () {
+      const 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'
+      })
+      this.netscalerType = items
+      this.$forceUpdate()
+    },
+    nextPressed () {
+      if (this.currentStep === this.steps.length - 1) {
+        this.$emit('nextPressed')
+      } else {
+        this.currentStep++
+        this.$emit('fieldsChanged', { networkStep: this.currentStep })
+      }
+    },
+    handleBack (e) {
+      if (this.currentStep === 0) {
+        this.$emit('backPressed')
+      } else {
+        this.currentStep--
+        this.$emit('fieldsChanged', { networkStep: this.currentStep })
+      }
+    },
+    submitLaunchZone () {
+      this.$emit('submitLaunchZone')
+    },
+    fieldsChanged (changed) {
+      if (changed.physicalNetworks) {
+        this.physicalNetworks = changed.physicalNetworks
+        this.steps = this.filteredSteps()
+      }
+      this.$emit('fieldsChanged', changed)
+    },
+    filteredSteps () {
+      return this.allSteps.filter(step => {
+        if (!step.trafficType) return true
+        if (this.physicalNetworks) {
+          let neededTraffic = false
+          this.physicalNetworks.forEach(net => {
+            net.traffics.forEach(traffic => {
+              if (traffic.type === step.trafficType) {
+                neededTraffic = true
+              }
+            })
+          })
+          if (neededTraffic) return true
+        }
+        return false
+      })
+    },
+    fetchConfiguration () {
+      this.skipGuestTrafficStep = false
+      api('listConfigurations', { name: 'sdn.ovs.controller' }).then(json => {
+        const items = json.listconfigurationsresponse.configuration
+        items.forEach(item => {
+          if (item.name === 'sdn.ovs.controller') {
+            if (item.value) {
+              this.skipGuestTrafficStep = true
+            }
+            return false
+          }
+        })
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
new file mode 100644
index 0000000..19b580f
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
@@ -0,0 +1,507 @@
+// 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>
+    <a-card
+      class="ant-form-text"
+      style="text-align: justify; margin: 10px 0; padding: 20px;"
+      v-html="zoneType !== null ? $t(zoneDescription[zoneType]) : $t('message.error.select.zone.type')">
+    </a-card>
+    <a-table
+      bordered
+      :dataSource="physicalNetworks"
+      :columns="columns"
+      :pagination="false"
+      style="margin-bottom: 24px;">
+      <template slot="name" slot-scope="text, record">
+        <a-input :value="text" @change="e => onCellChange(record.key, 'name', e.target.value)" />
+      </template>
+      <template slot="isolationMethod" slot-scope="text, record">
+        <a-select
+          style="width: 100%"
+          :defaultValue="text"
+          @change="value => onCellChange(record.key, 'isolationMethod', value)"
+        >
+          <a-select-option value="VLAN"> VLAN </a-select-option>
+          <a-select-option value="VXLAN"> VXLAN </a-select-option>
+          <a-select-option value="GRE"> GRE </a-select-option>
+          <a-select-option value="STT"> STT </a-select-option>
+          <a-select-option value="BCF_SEGMENT"> BCF_SEGMENT </a-select-option>
+          <a-select-option value="ODL"> ODL </a-select-option>
+          <a-select-option value="L3VPN"> L3VPN </a-select-option>
+          <a-select-option value="VSP"> VSP </a-select-option>
+          <a-select-option value="VCS"> VCS </a-select-option>
+        </a-select>
+      </template>
+      <template slot="traffics" slot-scope="traffics, record">
+        <div v-for="traffic in traffics" :key="traffic.type">
+          <a-tag
+            :color="trafficColors[traffic.type]"
+            style="margin:2px"
+          >
+            {{ traffic.type.toUpperCase() }}
+            <a-icon type="edit" class="traffic-type-action" @click="editTraffic(record.key, traffic, $event)"/>
+            <a-icon type="delete" class="traffic-type-action" @click="deleteTraffic(record.key, traffic, $event)"/>
+          </a-tag>
+        </div>
+        <a-modal
+          :title="$t('label.edit.traffic.type')"
+          :visible="showEditTraffic"
+          :closable="true"
+          :maskClosable="false"
+          :okText="$t('label.ok')"
+          :cancelText="$t('label.cancel')"
+          @ok="updateTrafficLabel(trafficInEdit)"
+          @cancel="cancelEditTraffic"
+          centered
+        >
+          <a-form :form="form">
+            <span class="ant-form-text"> {{ $t('message.edit.traffic.type') }} </span>
+            <a-form-item v-bind="formItemLayout" style="margin-top:16px;" :label="$t('label.traffic.label')">
+              <a-input
+                v-decorator="['trafficLabel', {
+                  rules: [{
+                    required: true,
+                    message: $t('message.error.traffic.label'),
+                  }]
+                }]"
+              />
+            </a-form-item>
+          </a-form>
+        </a-modal>
+        <div v-if="isShowAddTraffic(record.traffics)">
+          <div class="traffic-select-item" v-if="addingTrafficForKey === record.key">
+            <a-select
+              :defaultValue="trafficLabelSelected"
+              @change="val => { trafficLabelSelected = val }"
+              style="min-width: 120px;"
+            >
+              <a-select-option
+                v-for="(traffic, index) in availableTrafficToAdd"
+                :value="traffic"
+                :key="index"
+                :disabled="isDisabledTraffic(record.traffics, traffic)"
+              >
+                {{ traffic.toUpperCase() }}
+              </a-select-option>
+            </a-select>
+            <a-button
+              class="icon-button"
+              shape="circle"
+              icon="plus"
+              size="small"
+              @click="trafficAdded" />
+            <a-button
+              class="icon-button"
+              type="danger"
+              shape="circle"
+              icon="close"
+              size="small"
+              @click="() => { addingTrafficForKey = null }" />
+          </div>
+          <a-tag
+            key="addingTraffic"
+            style="margin:2px;"
+            v-else
+            @click="addingTraffic(record.key, record.traffics)"
+          >
+            <a-icon type="plus" />
+            {{ $t('label.add.traffic') }}
+          </a-tag>
+        </div>
+      </template>
+      <template slot="actions" slot-scope="text, record">
+        <a-button v-if="physicalNetworks.indexOf(record) > 0" type="danger" shape="circle" icon="delete" @click="onDelete(record)" />
+      </template>
+      <template slot="footer" v-if="isAdvancedZone">
+        <a-button
+          @click="handleAddPhysicalNetwork">
+          {{ $t('label.add.physical.network') }}
+        </a-button>
+      </template>
+    </a-table>
+    <div class="form-action">
+      <a-button
+        v-if="!isFixError"
+        class="button-right"
+        @click="handleBack">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button
+        class="button-next"
+        type="primary"
+        @click="handleSubmit">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+    <a-modal
+      :visible="showError"
+      :title="`${$t('label.error')}!`"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @ok="() => { showError = false }"
+      @cancel="() => { showError = false }"
+      centered
+    >
+      <span>{{ $t('message.required.traffic.type') }}</span>
+    </a-modal>
+  </div>
+</template>
+<script>
+
+export default {
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      formItemLayout: {
+        labelCol: { span: 10 },
+        wrapperCol: { span: 12 }
+      },
+      physicalNetworks: [],
+      count: 0,
+      zoneDescription: {
+        Basic: 'message.setup.physical.network.during.zone.creation.basic',
+        Advanced: 'message.setup.physical.network.during.zone.creation'
+      },
+      hasUnusedPhysicalNetwork: false,
+      trafficColors: {
+        public: 'orange',
+        guest: 'green',
+        management: 'blue',
+        storage: 'red'
+      },
+      showEditTraffic: false,
+      trafficInEdit: null,
+      availableTrafficToAdd: ['storage'],
+      addingTrafficForKey: '-1',
+      trafficLabelSelected: null,
+      showError: false,
+      defaultTrafficOptions: []
+    }
+  },
+  computed: {
+    columns () {
+      const columns = []
+      columns.push({
+        title: this.$t('label.network.name'),
+        dataIndex: 'name',
+        width: '30%',
+        scopedSlots: { customRender: 'name' }
+      })
+      columns.push({
+        title: this.$t('label.isolation.method'),
+        dataIndex: 'isolationMethod',
+        width: '20%',
+        scopedSlots: { customRender: 'isolationMethod' }
+      })
+      columns.push({
+        title: this.$t('label.traffic.types'),
+        key: 'traffics',
+        dataIndex: 'traffics',
+        scopedSlots: { customRender: 'traffics' }
+      })
+      if (this.isAdvancedZone) {
+        columns.push({
+          title: '',
+          dataIndex: 'actions',
+          scopedSlots: { customRender: 'actions' },
+          width: 50
+        })
+      }
+
+      return columns
+    },
+    isAdvancedZone () {
+      return this.zoneType === 'Advanced'
+    },
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : null
+    },
+    securityGroupsEnabled () {
+      return this.isAdvancedZone && (this.prefillContent.securityGroupsEnabled ? this.prefillContent.securityGroupsEnabled.value : false)
+    },
+    networkOfferingSelected () {
+      return this.prefillContent.networkOfferingSelected
+    },
+    needsPublicTraffic () {
+      if (!this.isAdvancedZone) { // Basic zone
+        return (this.networkOfferingSelected && (this.networkOfferingSelected.havingEIP || this.networkOfferingSelected.havingELB))
+      } else {
+        return !this.securityGroupsEnabled
+      }
+    },
+    requiredTrafficTypes () {
+      const traffics = ['management', 'guest']
+      if (this.needsPublicTraffic) {
+        traffics.push('public')
+      }
+      return traffics
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  created () {
+    this.defaultTrafficOptions = ['management', 'guest', 'storage']
+    if (this.isAdvancedZone || this.needsPublicTraffic) {
+      this.defaultTrafficOptions.push('public')
+    }
+    this.physicalNetworks = this.prefillContent.physicalNetworks
+    this.hasUnusedPhysicalNetwork = this.getHasUnusedPhysicalNetwork()
+    const requiredTrafficTypes = this.requiredTrafficTypes
+    if (this.physicalNetworks && this.physicalNetworks.length > 0) {
+      this.count = this.physicalNetworks.length
+      requiredTrafficTypes.forEach(type => {
+        let foundType = false
+        this.physicalNetworks.forEach(net => {
+          for (const index in net.traffics) {
+            const traffic = net.traffics[index]
+            if (traffic.type === 'storage') {
+              const idx = this.availableTrafficToAdd.indexOf(traffic.type)
+              if (idx > -1) this.availableTrafficToAdd.splice(idx, 1)
+            }
+            if (traffic.type === type) {
+              foundType = true
+            }
+          }
+        })
+        if (!foundType) this.availableTrafficToAdd.push(type)
+      })
+    } else {
+      const traffics = requiredTrafficTypes.map(item => {
+        return { type: item, label: '' }
+      })
+      this.count = 1
+      this.physicalNetworks = [{ key: this.randomKeyTraffic(this.count), name: 'Physical Network 1', isolationMethod: 'VLAN', traffics: traffics }]
+    }
+    if (this.isAdvancedZone) {
+      this.availableTrafficToAdd.push('guest')
+    }
+    this.emitPhysicalNetworks()
+  },
+  methods: {
+    onCellChange (key, dataIndex, value) {
+      const physicalNetworks = [...this.physicalNetworks]
+      const target = physicalNetworks.find(item => item.key === key)
+      if (target) {
+        target[dataIndex] = value
+        this.physicalNetworks = physicalNetworks
+      }
+      this.emitPhysicalNetworks()
+    },
+    onDelete (record) {
+      record.traffics.forEach(traffic => {
+        if (!this.availableTrafficToAdd.includes(traffic.type)) {
+          this.availableTrafficToAdd.push(traffic.type)
+        }
+      })
+      const physicalNetworks = [...this.physicalNetworks]
+      this.physicalNetworks = physicalNetworks.filter(item => item.key !== record.key)
+      this.hasUnusedPhysicalNetwork = this.getHasUnusedPhysicalNetwork()
+      this.emitPhysicalNetworks()
+    },
+    handleAddPhysicalNetwork () {
+      const { count, physicalNetworks } = this
+      const newData = {
+        key: this.randomKeyTraffic(count + 1),
+        name: `Physical Network ${count + 1}`,
+        isolationMethod: 'VLAN',
+        traffics: []
+      }
+      this.physicalNetworks = [...physicalNetworks, newData]
+      this.count = count + 1
+      this.hasUnusedPhysicalNetwork = this.getHasUnusedPhysicalNetwork()
+    },
+    isValidSetup () {
+      const shouldHaveLabels = this.physicalNetworks.length > 1
+      let isValid = true
+      this.requiredTrafficTypes.forEach(type => {
+        let foundType = false
+        this.physicalNetworks.forEach(net => {
+          net.traffics.forEach(traffic => {
+            if (traffic.type === type) {
+              foundType = true
+            }
+            if (shouldHaveLabels && (!traffic.label || traffic.label.length === 0)) {
+              isValid = false
+            }
+          })
+        })
+        if (!foundType || !isValid) {
+          isValid = false
+        }
+      })
+      return isValid
+    },
+    handleSubmit (e) {
+      if (this.isValidSetup()) {
+        if (this.isFixError) {
+          this.$emit('submitLaunchZone')
+          return
+        }
+        this.$emit('nextPressed', this.physicalNetworks)
+      } else {
+        this.showError = true
+      }
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    addingTraffic (key, traffics) {
+      this.addingTrafficForKey = key
+      this.availableTrafficToAdd.forEach(type => {
+        const trafficEx = traffics.filter(traffic => traffic.type === type)
+        if (!trafficEx || trafficEx.length === 0) {
+          this.trafficLabelSelected = type
+          return false
+        }
+      })
+    },
+    trafficAdded (trafficType) {
+      const trafficKey = this.physicalNetworks.findIndex(network => network.key === this.addingTrafficForKey)
+      this.physicalNetworks[trafficKey].traffics.push({
+        type: this.trafficLabelSelected.toLowerCase(),
+        label: ''
+      })
+      if (!this.isAdvancedZone || this.trafficLabelSelected !== 'guest') {
+        this.availableTrafficToAdd = this.availableTrafficToAdd.filter(item => item !== this.trafficLabelSelected)
+      }
+      this.addingTrafficForKey = null
+      this.trafficLabelSelected = null
+      this.emitPhysicalNetworks()
+    },
+    editTraffic (key, traffic, $event) {
+      this.trafficInEdit = {
+        key: key,
+        traffic: traffic
+      }
+      this.showEditTraffic = true
+      this.form.setFieldsValue({
+        trafficLabel: this.trafficInEdit !== null ? this.trafficInEdit.traffic.label : null
+      })
+    },
+    deleteTraffic (key, traffic, $event) {
+      const trafficKey = this.physicalNetworks.findIndex(network => network.key === key)
+      this.physicalNetworks[trafficKey].traffics = this.physicalNetworks[trafficKey].traffics.filter(tr => {
+        return tr.type !== traffic.type
+      })
+      if (!this.isAdvancedZone || traffic.type !== 'guest') {
+        this.availableTrafficToAdd.push(traffic.type)
+      }
+      this.hasUnusedPhysicalNetwork = this.getHasUnusedPhysicalNetwork()
+      this.emitPhysicalNetworks()
+    },
+    updateTrafficLabel (trafficInEdit) {
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          this.showEditTraffic = false
+          trafficInEdit.traffic.label = values.trafficLabel
+          this.trafficInEdit = null
+        }
+      })
+      this.emitPhysicalNetworks()
+    },
+    cancelEditTraffic () {
+      this.showEditTraffic = false
+      this.trafficInEdit = null
+    },
+    getHasUnusedPhysicalNetwork () {
+      let hasUnused = false
+      if (this.physicalNetworks && this.physicalNetworks.length > 0) {
+        this.physicalNetworks.forEach(item => {
+          if (!item.traffics || item.traffics.length === 0) {
+            hasUnused = true
+          }
+        })
+      }
+      return hasUnused
+    },
+    emitPhysicalNetworks () {
+      if (this.physicalNetworks) {
+        this.$emit('fieldsChanged', { physicalNetworks: this.physicalNetworks })
+      }
+    },
+    isDisabledTraffic (traffics, traffic) {
+      const trafficEx = traffics.filter(item => item.type === traffic)
+      if (trafficEx && trafficEx.length > 0) {
+        return true
+      }
+
+      return false
+    },
+    isShowAddTraffic (traffics) {
+      if (!this.availableTrafficToAdd || this.availableTrafficToAdd.length === 0) {
+        return false
+      }
+
+      if (traffics.length === this.defaultTrafficOptions.length) {
+        return false
+      }
+
+      if (this.isAdvancedZone && this.availableTrafficToAdd.length === 1) {
+        const guestEx = traffics.filter(traffic => traffic.type === 'guest')
+        if (guestEx && guestEx.length > 0) {
+          return false
+        }
+      }
+
+      return true
+    },
+    randomKeyTraffic (key) {
+      const now = new Date()
+      const random = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
+      return [key, random, now.getTime()].join('')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-action {
+    margin-top: 16px;
+  }
+
+  .traffic-type-action {
+    margin-left: 2px;
+    margin-right: 2px;
+    padding-left: 1px;
+    padding-right: 1px;
+  }
+
+  .physical-network-support {
+    margin: 10px 0;
+  }
+
+  .traffic-select-item {
+    /deep/.icon-button {
+      margin: 0 0 0 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue b/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue
new file mode 100644
index 0000000..e44d334
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardZoneDetailsStep.vue
@@ -0,0 +1,642 @@
+// 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>
+    <a-card
+      class="ant-form-text"
+      style="text-align: justify; margin: 10px 0; padding: 24px;"
+      v-html="$t(description)">
+    </a-card>
+    <a-form class="form-content" :form="form" @submit="handleSubmit">
+      <a-form-item
+        :label="$t('label.name')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['name', {
+            rules: [{
+              required: true,
+              message: $t('message.error.zone.name'),
+              initialValue: name
+            }]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ipv4.dns1')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['ipv4Dns1', {
+            rules: [
+              {
+                required: true,
+                message: $t('message.error.ipv4.dns1'),
+                initialValue: ipv4Dns1
+              },
+              {
+                validator: checkIpFormat,
+                ipV4: true,
+                message: $t('message.error.ipv4.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ipv4.dns2')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['ipv4Dns2', {
+            rules: [
+              {
+                message: $t('message.error.ipv4.dns2'),
+                initialValue: ipv4Dns2
+              },
+              {
+                validator: checkIpFormat,
+                ipV4: true,
+                message: $t('message.error.ipv4.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ipv6.dns1')"
+        v-bind="formItemLayout"
+        v-if="isAdvancedZone"
+        has-feedback>
+        <a-input
+          v-decorator="['ipv6Dns1', {
+            rules: [
+              {
+                message: $t('message.error.ipv6.dns1'),
+                initialValue: ipv6Dns1
+              },
+              {
+                validator: checkIpFormat,
+                ipV6: true,
+                message: $t('message.error.ipv6.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ipv6.dns2')"
+        v-bind="formItemLayout"
+        v-if="isAdvancedZone"
+        has-feedback>
+        <a-input
+          v-decorator="['ipv6Dns2', {
+            rules: [
+              {
+                message: $t('message.error.ipv6.dns2'),
+                initialValue: ipv6Dns2
+              },
+              {
+                validator: checkIpFormat,
+                ipV6: true,
+                message: $t('message.error.ipv6.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ip6cidr')"
+        v-bind="formItemLayout"
+        v-if="isAdvancedZone && securityGroupsEnabled"
+        has-feedback>
+        <a-input
+          v-decorator="['ipv6Cidr', {
+            rules: [
+              {
+                message: $t('message.error.ipv6.cidr'),
+                initialValue: ipv6Cidr
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ip6gateway')"
+        v-bind="formItemLayout"
+        v-if="isAdvancedZone && securityGroupsEnabled"
+        has-feedback>
+        <a-input
+          v-decorator="['ip6gateway', {
+            rules: [
+              {
+                message: $t('message.error.ipv6.gateway'),
+                initialValue: ip6gateway
+              },
+              {
+                validator: checkIpFormat,
+                ipV6: true,
+                message: $t('message.error.ipv6.gateway.format')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.internal.dns.1')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['internalDns1', {
+            rules: [
+              {
+                required: true,
+                message: $t('message.error.internal.dns1'),
+                initialValue: internalDns1
+              },
+              {
+                validator: checkIpFormat,
+                ipV4: true,
+                message: $t('message.error.ipv4.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.internal.dns.2')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['internalDns2', {
+            rules: [
+              {
+                message: $t('message.error.internal.dns2'),
+                initialValue: internalDns2
+              },
+              {
+                validator: checkIpFormat,
+                ipV4: true,
+                message: $t('message.error.ipv4.address')
+              }
+            ]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.hypervisor')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-select
+          :loading="hypervisors === null"
+          showSearch
+          v-decorator="['hypervisor',{
+            rules: [{
+              required: true,
+              message: $t('message.error.hypervisor.type'),
+              initialValue: currentHypervisor
+            }]
+          }]"
+          :placeholder="$t('message.error.hypervisor.type')"
+        >
+          <a-select-option v-for="hypervisor in hypervisors" :key="hypervisor.name">
+            {{ hypervisor.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.network.offering')"
+        v-bind="formItemLayout"
+        v-if="!isAdvancedZone || securityGroupsEnabled"
+        has-feedback>
+        <a-select
+          :loading="availableNetworkOfferings === null"
+          v-decorator="['networkOfferingId', {
+            rules: [{
+              message: $t('message.error.network.offering'),
+              initialValue: currentNetworkOfferingId
+            }]
+          }]"
+          :placeholder="$t('message.error.network.offering')"
+        >
+          <a-select-option
+            v-for="networkOffering in availableNetworkOfferings"
+            :key="networkOffering.id">
+            {{ networkOffering.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.network.domain')"
+        v-bind="formItemLayout"
+        has-feedback>
+        <a-input
+          v-decorator="['networkDomain', {
+            rules: [{
+              message: $t('message.error.network.domain'),
+              intialValue: networkDomain
+            }]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.guest.cidr')"
+        v-bind="formItemLayout"
+        v-if="isAdvancedZone && !securityGroupsEnabled"
+        has-feedback>
+        <a-input
+          v-decorator="['guestcidraddress', {
+            rules: [{
+              intialValue: guestcidraddress
+            }]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.dedicated')"
+        v-bind="formItemLayout">
+        <a-switch
+          v-decorator="['isDedicated', { valuePropName: 'checked' }]"
+          :value="isDedicated"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.domains')"
+        v-bind="formItemLayout"
+        has-feedback
+        v-if="isDedicated">
+        <a-select
+          :loading="domains === null"
+          v-decorator="['domainId', {
+            rules: [{
+              initialValue: domain
+            }]
+          }]"
+          :placeholder="$t('message.error.select.domain.to.dedicate')"
+        >
+          <a-select-option v-for="dom in domains" :key="dom.id">
+            {{ dom.path }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.account')"
+        v-bind="formItemLayout"
+        v-if="isDedicated">
+        <a-input
+          v-decorator="['account', {
+            rules: [{
+              intialValue: guestcidraddress
+            }]
+          }]"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.local.storage.enabled')"
+        v-bind="formItemLayout">
+        <a-switch
+          v-decorator="['localstorageenabled', { valuePropName: 'checked' }]"
+          :value="localstorageenabled"
+        />
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.local.storage.enabled.system.vms')"
+        v-bind="formItemLayout">
+        <a-switch
+          v-decorator="['localstorageenabledforsystemvm', { valuePropName: 'checked' }]"
+          :value="localstorageenabledforsystemvm"
+        />
+      </a-form-item>
+    </a-form>
+    <div class="form-action">
+      <a-button
+        @click="handleBack"
+        class="button-back"
+        v-if="!isFixError">
+        {{ $t('label.previous') }}
+      </a-button>
+      <a-button type="primary" @click="handleSubmit" class="button-next">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import { api } from '@/api'
+
+export default {
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    isFixError: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data: () => ({
+    description: 'message.desc.zone',
+    formItemLayout: {
+      labelCol: { span: 8 },
+      wrapperCol: { span: 12 }
+    },
+    hypervisors: null,
+    networkOfferings: null,
+    domains: null,
+    baremetalProviders: ['BaremetalDhcpProvider', 'BaremetalPxeProvider', 'BaremetalUserdataProvider'],
+    selectedBaremetalProviders: [],
+    availableNetworkOfferings: null,
+    ipV4Regex: /^(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,
+    ipV6Regex: /^((([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
+  }),
+  created () {
+    this.hypervisors = this.prefillContent.hypervisors ? this.prefillContent.hypervisors : null
+    this.networkOfferings = this.prefillContent.networkOfferings ? this.prefillContent.networkOfferings : null
+    this.form = this.$form.createForm(this, {
+      onFieldsChange: (_, changedFields) => {
+        if (changedFields.networkOfferingId && this.prefillContent.networkOfferingSelected) {
+          if (this.prefillContent.networkOfferingSelected.id !== changedFields.networkOfferingId.value) {
+            changedFields.physicalNetworks = []
+          }
+        }
+        if (this.networkOfferings && changedFields.networkOfferingId) {
+          changedFields.networkOfferings = this.networkOfferings
+          changedFields.networkOfferingSelected = this.networkOfferings[changedFields.networkOfferingId.value]
+        }
+        if (this.hypervisors && changedFields.hypervisor) {
+          changedFields.hypervisors = this.hypervisors
+          this.availableNetworkOfferings = this.getAvailableNetworkOfferings(changedFields.hypervisor)
+        }
+        if (this.domains && changedFields.domain) {
+          changedFields.domains = this.domains
+        }
+        this.$emit('fieldsChanged', changedFields)
+      }
+    })
+  },
+  mounted () {
+    this.form.setFieldsValue({
+      name: this.name,
+      ipv4Dns1: this.ipv4Dns1,
+      ipv4Dns2: this.ipv4Dns2,
+      ipv6Dns1: this.ipv6Dns1,
+      ipv6Dns2: this.ipv6Dns2,
+      internalDns1: this.internalDns1,
+      internalDns2: this.internalDns2,
+      hypervisor: this.currentHypervisor,
+      networkOfferingId: this.currentNetworkOfferingId,
+      networkDomain: this.networkDomain,
+      guestcidraddress: this.isAdvancedZone && !this.securityGroupsEnabled ? this.guestcidraddress : null,
+      isDedicated: this.isDedicated,
+      domain: this.domain,
+      account: this.account,
+      localstorageenabled: this.localstorageenabled,
+      localstorageenabledforsystemvm: this.localstorageenabledforsystemvm
+    })
+
+    const cForm = this.form
+    api('listHypervisors', { listAll: true }).then(json => {
+      this.hypervisors = json.listhypervisorsresponse.hypervisor
+      if ('listSimulatorHAStateTransitions' in this.$store.getters.apis) {
+        this.hypervisors.push({ name: 'Simulator' })
+      }
+      cForm.setFieldsValue({
+        hypervisor: this.currentHypervisor
+      })
+    })
+
+    if (!this.isAdvancedZone || this.securityGroupsEnabled) {
+      api('listNetworkOfferings', { state: 'Enabled', guestiptype: 'Shared' }).then(json => {
+        this.networkOfferings = {}
+        json.listnetworkofferingsresponse.networkoffering.forEach(offering => {
+          this.setupNetworkOfferingAdditionalFlags(offering)
+          this.networkOfferings[offering.id] = offering
+        })
+        this.availableNetworkOfferings = this.getAvailableNetworkOfferings(this.currentHypervisor)
+        cForm.setFieldsValue({
+          networkOfferingId: this.currentNetworkOfferingId
+        })
+      })
+    }
+
+    api('listDomains', { listAll: true }).then(json => {
+      this.domains = {}
+      json.listdomainsresponse.domain.forEach(dom => {
+        this.domains[dom.id] = dom
+      })
+      cForm.setFieldsValue({
+        domain: this.domain
+      })
+    })
+  },
+  computed: {
+    isAdvancedZone () {
+      return this.zoneType === 'Advanced'
+    },
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : null
+    },
+    securityGroupsEnabled () {
+      return this.isAdvancedZone && (this.prefillContent.securityGroupsEnabled ? this.prefillContent.securityGroupsEnabled.value : false)
+    },
+    name () {
+      return this.prefillContent.name ? this.prefillContent.name.value : null
+    },
+    ipv4Dns1 () {
+      return this.prefillContent.ipv4Dns1 ? this.prefillContent.ipv4Dns1.value : null
+    },
+    ipv4Dns2 () {
+      return this.prefillContent.ipv4Dns2 ? this.prefillContent.ipv4Dns2.value : null
+    },
+    ipv6Dns1 () {
+      return this.prefillContent.ipv6Dns1 ? this.prefillContent.ipv6Dns1.value : null
+    },
+    ipv6Dns2 () {
+      return this.prefillContent.ipv6Dns2 ? this.prefillContent.ipv6Dns2.value : null
+    },
+    internalDns1 () {
+      return this.prefillContent.internalDns1 ? this.prefillContent.internalDns1.value : null
+    },
+    internalDns2 () {
+      return this.prefillContent.internalDns2 ? this.prefillContent.internalDns2.value : null
+    },
+    ipv6Cidr () {
+      return this.prefillContent.ipv6Cidr ? this.prefillContent.ipv6Cidr.value : null
+    },
+    ip6gateway () {
+      return this.prefillContent.ip6gateway ? this.prefillContent.ip6gateway.value : null
+    },
+    currentHypervisor () {
+      if (this.prefillContent.hypervisor) {
+        return this.prefillContent.hypervisor.value
+      } else if (this.hypervisors && this.hypervisors.length > 0) {
+        return this.hypervisors[0]
+      }
+      return null
+    },
+    currentNetworkOfferingId () {
+      const lastNetworkOfferingId = this.prefillContent.networkOfferingSelected ? this.prefillContent.networkOfferingSelected.id : null
+      if (this.networkOfferings) {
+        if (lastNetworkOfferingId !== null && this.networkOfferings[lastNetworkOfferingId]) {
+          return lastNetworkOfferingId
+        }
+        return this.availableNetworkOfferings[0].id
+      }
+      return null
+    },
+    networkDomain () {
+      return this.prefillContent.networkDomain ? this.prefillContent.networkDomain.value : null
+    },
+    guestcidraddress () {
+      return this.prefillContent.guestcidraddress ? this.prefillContent.guestcidraddress.value : '10.1.1.0/24'
+    },
+    isDedicated () {
+      return this.prefillContent.isDedicated ? this.prefillContent.isDedicated.value : false
+    },
+    domain () {
+      const lastDomainId = this.prefillContent.domainId ? this.prefillContent.domainId.value : null
+      if (this.domains !== null && lastDomainId !== null && this.domains[lastDomainId]) {
+        return lastDomainId
+      }
+      return null
+    },
+    account () {
+      return this.prefillContent.account ? this.prefillContent.account.value : null
+    },
+    localstorageenabled () {
+      return this.prefillContent.localstorageenabled ? this.prefillContent.localstorageenabled.value : false
+    },
+    localstorageenabledforsystemvm () {
+      return this.prefillContent.localstorageenabledforsystemvm ? this.prefillContent.localstorageenabledforsystemvm.value : false
+    }
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        if (this.isFixError) {
+          this.$emit('submitLaunchZone')
+          return
+        }
+
+        this.$emit('nextPressed')
+      })
+    },
+    handleBack (e) {
+      this.$emit('backPressed')
+    },
+    setupNetworkOfferingAdditionalFlags (nOffering) {
+      nOffering.havingNetscaler = false
+      nOffering.havingSG = false
+      nOffering.havingEIP = false
+      nOffering.havingELB = false
+      nOffering.selectedBaremetalProviders = []
+
+      nOffering.service.forEach(service => {
+        service.provider.forEach(provider => {
+          if (provider.name === 'Netscaler') {
+            nOffering.havingNetscaler = true
+          } else if (this.baremetalProviders.includes(provider.name)) {
+            this.selectedBaremetalProviders.push(this.name)
+            nOffering.selectedBaremetalProviders = this.selectedBaremetalProviders
+          }
+        })
+
+        if (service.name === 'SecurityGroup') {
+          nOffering.havingSG = true
+        } else if (service.name === 'StaticNat') {
+          service.capability.forEach(capability => {
+            if (capability.name === 'ElasticIp' && capability.value === 'true') {
+              nOffering.havingEIP = true
+            }
+          })
+        } else if (service.name === 'Lb') {
+          service.capability.forEach(capability => {
+            if (capability.name === 'ElasticLb' && capability.value === 'true') {
+              nOffering.havingELB = true
+            }
+          })
+        }
+      })
+    },
+    getAvailableNetworkOfferings (hypervisor) {
+      if (this.networkOfferings) {
+        return Object.values(this.networkOfferings).filter(nOffering => {
+          if ((hypervisor === 'VMware' ||
+            (this.isAdvancedZone && this.securityGroupsEnabled)) &&
+            (nOffering.havingEIP && nOffering.havingELB)) {
+            return false
+          }
+
+          if (this.isAdvancedZone && this.securityGroupsEnabled && !nOffering.havingSG) {
+            return false
+          }
+
+          return true
+        })
+      }
+      return null
+    },
+    checkIpFormat (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (rule.ipV4 && !this.ipV4Regex.test(value)) {
+        callback(rule.message)
+      } else if (rule.ipV6 && !this.ipV6Regex.test(value)) {
+        callback(rule.message)
+      } else {
+        callback()
+      }
+    }
+  }
+}
+</script>
+<style scoped lang="less">
+  .form-content {
+    border: 1px dashed #e9e9e9;
+    border-radius: 6px;
+    background-color: #fafafa;
+    min-height: 200px;
+    text-align: center;
+    vertical-align: center;
+    padding: 8px;
+    padding-top: 16px;
+    margin-top: 8px;
+    max-height: 40vh;
+    overflow-y: auto;
+
+    /deep/.has-error {
+      .ant-form-explain {
+        text-align: left;
+      }
+    }
+
+    /deep/.ant-form-item-control {
+      text-align: left;
+    }
+  }
+</style>
diff --git a/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue b/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue
new file mode 100644
index 0000000..913b8fa
--- /dev/null
+++ b/ui/src/views/infra/zone/ZoneWizardZoneTypeStep.vue
@@ -0,0 +1,157 @@
+// 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>
+    <a-form
+      class="form-content"
+      :form="form"
+      @submit="handleSubmit">
+      <a-form-item>
+        <a-radio-group
+          v-decorator="['zoneType', {
+            rules: [{
+              required: true,
+              message: $t('message.error.zone.type'),
+              initialValue: zoneType
+            }]
+          }]">
+          <a-card :gutter="12" class="card-item">
+            <a-col :md="6" :lg="6">
+              <a-radio style="display: none;" class="card-form-item" value="Advanced">{{ $t('label.advanced') }}</a-radio>
+              <span style="margin-top: 20px" class="card-form-item">
+                <a-icon type="setting" style="margin-right: 10px" />
+                {{ $t('label.advanced') }}
+              </span>
+            </a-col>
+            <a-col :md="18" :lg="18">
+              <a-card class="ant-form-text zone-support">{{ $t(zoneDescription.Advanced) }}</a-card>
+            </a-col>
+            <a-col :md="6" :lg="6" style="margin-top: 15px">
+              <a-form-item
+                class="card-form-item"
+                v-bind="formItemLayout">
+                <a-switch
+                  class="card-form-item"
+                  v-decorator="['securityGroupsEnabled', { valuePropName: 'checked' }]"
+                  :value="securityGroupsEnabled"
+                  :disabled="!isAdvancedZone"
+                />
+              </a-form-item>
+              <span>{{ $t('label.menu.security.groups') }}</span>
+            </a-col>
+            <a-col :md="18" :lg="18" style="margin-top: 15px;">
+              <a-card class="zone-support">{{ $t(zoneDescription.SecurityGroups) }}</a-card>
+            </a-col>
+          </a-card>
+        </a-radio-group>
+      </a-form-item>
+    </a-form>
+    <div class="form-action">
+      <a-button type="primary" @click="handleSubmit" class="button-next">
+        {{ $t('label.next') }}
+      </a-button>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    prefillContent: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data: () => ({
+    formItemLayout: {
+      labelCol: { span: 6 },
+      wrapperCol: { span: 14 }
+    },
+    zoneDescription: {
+      Advanced: 'message.desc.advanced.zone',
+      SecurityGroups: 'message.advanced.security.group'
+    }
+  }),
+  beforeCreate () {
+    this.form = this.$form.createForm(this, {
+      onFieldsChange: (_, changedFields) => {
+        this.$emit('fieldsChanged', changedFields)
+      }
+    })
+  },
+  mounted () {
+    this.form.setFieldsValue({
+      zoneType: this.zoneType,
+      securityGroupsEnabled: this.securityGroupsEnabled
+    })
+  },
+  computed: {
+    isAdvancedZone () {
+      return this.zoneType === 'Advanced'
+    },
+    zoneType () {
+      return this.prefillContent.zoneType ? this.prefillContent.zoneType.value : 'Advanced'
+    },
+    securityGroupsEnabled () {
+      return this.isAdvancedZone && (this.prefillContent.securityGroupsEnabled ? this.prefillContent.securityGroupsEnabled.value : false)
+    }
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          this.$emit('nextPressed')
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped lang="less">
+  .form-content {
+    border: 1px dashed #e9e9e9;
+    border-radius: 6px;
+    background-color: #fafafa;
+    min-height: 200px;
+    text-align: center;
+    vertical-align: center;
+    padding: 8px;
+    padding-top: 16px;
+    margin-top: 8px;
+  }
+
+  .card-item {
+    margin-top: 10px;
+
+    .card-form-item {
+      float: left;
+    }
+
+    .checkbox-advance {
+      margin-top: 10px;
+    }
+
+    .zone-support {
+      text-align: justify;
+      background: #fafafa;
+    }
+  }
+</style>
diff --git a/ui/src/views/network/AclListRulesTab.vue b/ui/src/views/network/AclListRulesTab.vue
new file mode 100644
index 0000000..62448d7
--- /dev/null
+++ b/ui/src/views/network/AclListRulesTab.vue
@@ -0,0 +1,703 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <div style="width: 100%; display: flex">
+      <a-button
+        type="dashed"
+        icon="plus"
+        style="width: 100%; margin-right: 10px"
+        :disabled="!('createNetworkACL' in $store.getters.apis)"
+        @click="openAddRuleModal">
+        {{ $t('label.add') }} {{ $t('label.aclid') }}
+      </a-button>
+
+      <a-button type="dashed" @click="exportAclList" style="width: 100%" icon="download">
+        {{ $t('label.acl.export') }}
+      </a-button>
+    </div>
+
+    <div class="list">
+      <draggable
+        v-model="acls"
+        @change="changeOrder"
+        handle=".drag-handle"
+        animation="200"
+        ghostClass="drag-ghost">
+        <transition-group type="transition">
+          <div v-for="acl in acls" :key="acl.id" class="list__item">
+            <div class="drag-handle">
+              <a-icon type="drag"></a-icon>
+            </div>
+            <div class="list__container">
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.rule.number') }}</div>
+                <div>{{ acl.number }}</div>
+              </div>
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.cidrlist') }}</div>
+                <div>{{ acl.cidrlist }}</div>
+              </div>
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.action') }}</div>
+                <div>{{ acl.action }}</div>
+              </div>
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.protocol') }}</div>
+                <div>{{ acl.protocol }}</div>
+              </div>
+              <div class="list__col" v-if="acl.startport">
+                <div class="list__label">{{ $t('label.startport') }}</div>
+                <div>{{ acl.startport }}</div>
+              </div>
+              <div class="list__col" v-if="acl.endport">
+                <div class="list__label">{{ $t('label.endport') }}</div>
+                <div>{{ acl.endport }}</div>
+              </div>
+              <div class="list__col" v-if="acl.icmpcode">
+                <div class="list__label">{{ $t('label.icmpcode') }}</div>
+                <div>{{ acl.icmpcode }}</div>
+              </div>
+              <div class="list__col" v-if="acl.icmptype">
+                <div class="list__label">{{ $t('label.icmptype') }}</div>
+                <div>{{ acl.icmptype }}</div>
+              </div>
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.traffictype') }}</div>
+                <div>{{ acl.traffictype }}</div>
+              </div>
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.reason') }}</div>
+                <div>{{ acl.reason }}</div>
+              </div>
+            </div>
+            <div class="list__actions">
+              <a-button shape="circle" icon="tag" @click="() => openTagsModal(acl)"></a-button>
+              <a-button shape="circle" icon="edit" @click="() => openEditRuleModal(acl)"></a-button>
+              <a-button shape="circle" icon="delete" type="danger" :disabled="!('deleteNetworkACL' in $store.getters.apis)" @click="() => handleDeleteRule(acl.id)"></a-button>
+            </div>
+          </div>
+        </transition-group>
+      </draggable>
+    </div>
+
+    <a-modal :title="$t('label.edit.tags')" v-model="tagsModalVisible" :footer="null" :maskClosable="false">
+      <a-spin v-if="tagsLoading"></a-spin>
+
+      <div v-else>
+        <a-form :form="newTagsForm" class="add-tags" @submit="handleAddTag">
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.key') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['key', { rules: [{ required: true, message: $t('message.specifiy.tag.key')}] }]" />
+            </a-form-item>
+          </div>
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.value') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['value', { rules: [{ required: true, message: $t('message.specifiy.tag.value')}] }]" />
+            </a-form-item>
+          </div>
+          <a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
+        </a-form>
+
+        <a-divider style="margin-top: 0;"></a-divider>
+
+        <div class="tags-container">
+          <div class="tags" v-for="(tag, index) in tags" :key="index">
+            <a-tag :key="index" :closable="true" :afterClose="() => handleDeleteTag(tag)">
+              {{ tag.key }} = {{ tag.value }}
+            </a-tag>
+          </div>
+        </div>
+
+        <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </a-modal>
+    <a-modal :title="ruleModalTitle" :maskClosable="false" v-model="ruleModalVisible" @ok="handleRuleModalForm">
+      <a-form :form="ruleForm" @submit="handleRuleModalForm">
+        <a-form-item :label="$t('label.number')">
+          <a-input-number style="width: 100%" v-decorator="['number']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.cidrlist')">
+          <a-input v-decorator="['cidrlist']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.action')">
+          <a-select v-decorator="['action']">
+            <a-select-option value="allow">{{ $t('label.allow') }}</a-select-option>
+            <a-select-option value="deny">{{ $t('label.deny') }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.protocol')">
+          <a-select v-decorator="['protocol']">
+            <a-select-option value="tcp">{{ $t('label.tcp') | capitalise }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') | capitalise }}</a-select-option>
+            <a-select-option value="icmp">{{ $t('label.icmp') | capitalise }}</a-select-option>
+            <a-select-option value="all">{{ $t('label.all') }}</a-select-option>
+            <a-select-option value="protocolnumber">{{ $t('label.protocol.number') }}</a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item v-if="ruleForm.getFieldValue('protocol') === 'protocolnumber'" :label="$t('label.protocolnumber')">
+          <a-input v-decorator="['protocolnumber' , { rules: [{ required: true, message: `${$t('label.required')}` }]}]" />
+        </a-form-item>
+
+        <div v-if="ruleForm.getFieldValue('protocol') === 'icmp' || ruleForm.getFieldValue('protocol') === 'protocolnumber'">
+          <a-form-item :label="$t('label.icmptype')">
+            <a-input v-decorator="['icmptype']" :placeholder="$t('icmp.type.desc')" />
+          </a-form-item>
+          <a-form-item :label="$t('label.icmpcode')">
+            <a-input v-decorator="['icmpcode']" :placeholder="$t('icmp.code.desc')" />
+          </a-form-item>
+        </div>
+
+        <div v-show="ruleForm.getFieldValue('protocol') === 'tcp' || ruleForm.getFieldValue('protocol') === 'udp' || ruleForm.getFieldValue('protocol') === 'protocolnumber'">
+          <a-form-item :label="$t('label.startport')">
+            <a-input-number style="width: 100%" v-decorator="['startport']" />
+          </a-form-item>
+          <a-form-item :label="$t('label.endport')">
+            <a-input-number style="width: 100%" v-decorator="['endport']" />
+          </a-form-item>
+        </div>
+
+        <a-form-item :label="$t('label.traffictype')">
+          <a-select v-decorator="['traffictype']">
+            <a-select-option value="ingress">{{ $t('label.ingress') }}</a-select-option>
+            <a-select-option value="egress">{{ $t('label.egress') }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.reason')">
+          <a-textarea
+            v-decorator="['reason']"
+            :autosize="{ minRows: 2 }"
+            :placeholder="$t('label.acl.reason.description')" />
+        </a-form-item>
+      </a-form>
+    </a-modal>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import draggable from 'vuedraggable'
+
+export default {
+  name: 'AclListRulesTab',
+  components: {
+    draggable
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      acls: [],
+      fetchLoading: false,
+      tags: [],
+      selectedAcl: null,
+      tagsModalVisible: false,
+      newTagsForm: this.$form.createForm(this),
+      ruleForm: this.$form.createForm(this),
+      tagsLoading: false,
+      ruleModalVisible: false,
+      ruleModalTitle: this.$t('label.edit.rule'),
+      ruleFormMode: 'edit'
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return this.$t('label.all')
+      return val.toUpperCase()
+    }
+  },
+  methods: {
+    csv ({ data = null, columnDelimiter = ',', lineDelimiter = '\n' }) {
+      let result = null
+      let ctr = null
+      let keys = null
+
+      if (data === null || !data.length) {
+        return null
+      }
+
+      keys = Object.keys(data[0])
+
+      result = ''
+      result += keys.join(columnDelimiter)
+      result += lineDelimiter
+
+      data.forEach(item => {
+        ctr = 0
+        keys.forEach(key => {
+          if (ctr > 0) {
+            result += columnDelimiter
+          }
+
+          result += typeof item[key] === 'string' && item[key].includes(columnDelimiter) ? `"${item[key]}"` : item[key]
+          ctr++
+        })
+        result += lineDelimiter
+      })
+
+      return result
+    },
+    fetchData () {
+      this.fetchLoading = true
+      api('listNetworkACLs', { aclid: this.resource.id }).then(json => {
+        this.acls = json.listnetworkaclsresponse.networkacl || []
+        if (this.acls.length > 0) {
+          this.acls.sort((a, b) => a.number - b.number)
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchTags (acl) {
+      api('listTags', {
+        resourceId: acl.id,
+        resourceType: 'NetworkACL',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag || []
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    openTagsModal (acl) {
+      this.selectedAcl = acl
+      this.newTagsForm.resetFields()
+      this.fetchTags(this.selectedAcl)
+      this.tagsModalVisible = true
+    },
+    handleDeleteTag (tag) {
+      this.tagsLoading = true
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: this.selectedAcl.id,
+        resourceType: 'NetworkACL'
+      }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.delete.tag.for.networkacl'),
+          jobid: response.deletetagsresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.fetchTags(this.selectedAcl)
+            this.tagsLoading = false
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.fetchTags(this.selectedAcl)
+            this.tagsLoading = false
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchTags(this.selectedAcl)
+            this.tagsLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.tagsLoading = false
+      })
+    },
+    handleAddTag (e) {
+      this.tagsLoading = true
+
+      e.preventDefault()
+      this.newTagsForm.validateFields((err, values) => {
+        if (err) {
+          this.tagsLoading = false
+          return
+        }
+
+        api('createTags', {
+          'tags[0].key': values.key,
+          'tags[0].value': values.value,
+          resourceIds: this.selectedAcl.id,
+          resourceType: 'NetworkACL'
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.add.tag.for.networkacl'),
+            jobid: response.createtagsresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createtagsresponse.jobid,
+            successMessage: this.$t('message.success.add.tag'),
+            successMethod: () => {
+              this.fetchTags(this.selectedAcl)
+              this.tagsLoading = false
+            },
+            errorMessage: this.$t('message.add.tag.failed'),
+            errorMethod: () => {
+              this.fetchTags(this.selectedAcl)
+              this.tagsLoading = false
+            },
+            loadingMessage: this.$t('message.add.tag.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchTags(this.selectedAcl)
+              this.tagsLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+          this.tagsLoading = false
+        })
+      })
+    },
+    openEditRuleModal (acl) {
+      this.ruleModalTitle = this.$t('label.edit.rule')
+      this.ruleFormMode = 'edit'
+      this.ruleForm.resetFields()
+      this.ruleModalVisible = true
+      this.selectedAcl = acl
+      setTimeout(() => {
+        this.ruleForm.setFieldsValue({
+          number: acl.number,
+          cidrlist: acl.cidrlist,
+          action: acl.action,
+          protocol: acl.protocol,
+          startport: acl.startport,
+          endport: acl.endport,
+          traffictype: acl.traffictype,
+          reason: acl.reason
+        })
+      }, 200)
+    },
+    getDataFromForm (values) {
+      const data = {
+        cidrlist: values.cidrlist || '',
+        number: values.number || '',
+        protocol: values.protocol || '',
+        traffictype: values.traffictype || '',
+        action: values.action || '',
+        reason: values.reason || ''
+      }
+
+      if (values.protocol === 'tcp' || values.protocol === 'udp' || values.protocol === 'protocolnumber') {
+        data.startport = values.startport || ''
+        data.endport = values.endport || ''
+      }
+
+      if (values.protocol === 'icmp') {
+        data.icmptype = values.icmptype || -1
+        data.icmpcode = values.icmpcode || -1
+      }
+
+      if (values.protocol === 'protocolnumber') {
+        data.protocol = values.protocolnumber
+      }
+
+      return data
+    },
+    handleEditRule (e) {
+      e.preventDefault()
+      this.ruleForm.validateFields((err, values) => {
+        if (err) return
+
+        this.fetchLoading = true
+        this.ruleModalVisible = false
+
+        const data = this.getDataFromForm(values)
+        data.id = this.selectedAcl.id
+        data.partialupgrade = false
+
+        api('updateNetworkACLItem', {}, 'POST', data).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.edit.acl.rule'),
+            jobid: response.createnetworkaclresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createnetworkaclresponse.jobid,
+            successMessage: this.$t('message.success.edit.acl'),
+            successMethod: () => {
+              this.fetchData()
+              this.fetchLoading = false
+            },
+            errorMessage: this.$t('message.edit.acl.failed'),
+            errorMethod: () => {
+              this.fetchData()
+              this.fetchLoading = false
+            },
+            loadingMessage: this.$t('message.edit.acl.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchData()
+              this.fetchLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+          this.fetchLoading = false
+        })
+      })
+    },
+    handleDeleteRule (id) {
+      this.fetchLoading = true
+      api('deleteNetworkACL', { id }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.delete.acl.rule'),
+          jobid: response.deletenetworkaclresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.deletenetworkaclresponse.jobid,
+          successMessage: this.$t('message.success.delete.acl.rule'),
+          successMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          },
+          errorMessage: this.$t('message.delete.acl.rule.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          },
+          loadingMessage: this.$t('message.delete.acl.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchLoading = false
+      })
+    },
+    handleRuleModalForm (e) {
+      if (this.ruleFormMode === 'edit') {
+        this.handleEditRule(e)
+        return
+      }
+      if (this.ruleFormMode === 'add') this.handleAddRule(e)
+    },
+    openAddRuleModal () {
+      this.ruleModalTitle = this.$t('label.add.rule')
+      this.ruleModalVisible = true
+      this.ruleFormMode = 'add'
+      this.ruleForm.resetFields()
+      setTimeout(() => {
+        this.ruleForm.setFieldsValue({
+          action: 'allow',
+          protocol: 'tcp',
+          traffictype: 'ingress'
+        })
+      }, 200)
+    },
+    handleAddRule (e) {
+      e.preventDefault()
+      this.ruleForm.validateFields((err, values) => {
+        if (err) return
+
+        this.fetchLoading = true
+        this.ruleModalVisible = false
+
+        const data = this.getDataFromForm(values)
+        data.aclid = this.resource.id
+
+        api('createNetworkACL', {}, 'POST', data).then(() => {
+          this.$notification.success({
+            message: this.$t('label.success'),
+            description: this.$t('message.success.add.rule')
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.fetchLoading = false
+          this.fetchData()
+        })
+      })
+    },
+    changeOrder (e) {
+      const id = e.moved.element.id
+      let previousaclruleid = null
+      let nextaclruleid = null
+
+      if (e.moved.newIndex - 1 >= 0) previousaclruleid = this.acls[e.moved.newIndex - 1].id
+
+      if (e.moved.newIndex + 1 < this.acls.length) nextaclruleid = this.acls[e.moved.newIndex + 1].id
+
+      this.fetchLoading = true
+      api('moveNetworkAclItem', {
+        id,
+        previousaclruleid,
+        nextaclruleid
+      }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.move.acl.order'),
+          jobid: response.moveNetworkAclItemResponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.moveNetworkAclItemResponse.jobid,
+          successMessage: this.$t('message.success.move.acl.order'),
+          successMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          },
+          errorMessage: this.$t('message.move.acl.order.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          },
+          loadingMessage: this.$t('message.move.acl.order.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.fetchLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchLoading = false
+      })
+    },
+    exportAclList () {
+      const csvData = this.csv({ data: this.acls })
+
+      const hiddenElement = document.createElement('a')
+      hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvData)
+      hiddenElement.target = '_blank'
+      hiddenElement.download = 'AclRules-' + this.resource.name + '-' + this.resource.id + '.csv'
+      hiddenElement.click()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__item {
+    display: flex;
+    padding-top: 20px;
+    padding-bottom: 20px;
+
+    &:not(:last-child) {
+      border-bottom: 1px solid #d9d9d9;
+    }
+
+  }
+
+  &__container {
+    display: flex;
+    flex-wrap: wrap;
+    width: 100%;
+  }
+
+  &__col {
+    margin-right: 20px;
+    margin-bottom: 20px;
+    flex-basis: calc(50% - 20px);
+
+    @media (min-width: 760px) {
+      flex-basis: calc(25% - 20px);
+    }
+
+  }
+
+  &__label {
+    font-weight: bold;
+  }
+
+  &__actions {
+    display: flex;
+    flex-direction: column;
+
+    button {
+      &:not(:last-child) {
+        margin-bottom: 10px;
+      }
+    }
+
+  }
+
+}
+
+.tags {
+  margin-bottom: 10px;
+}
+.add-tags {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  &__input {
+    margin-right: 10px;
+  }
+  &__label {
+    margin-bottom: 5px;
+    font-weight: bold;
+  }
+}
+.tags-container {
+  display: flex;
+  flex-wrap: wrap;
+  margin-bottom: 10px;
+}
+.add-tags-done {
+  display: block;
+  margin-left: auto;
+}
+
+.drag-handle {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+  padding-right: 20px;
+}
+
+.drag-ghost {
+  opacity: 0.5;
+  background: #f0f2f5;
+}
+
+.download {
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+  margin-left: auto;
+}
+</style>
diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue
new file mode 100644
index 0000000..b40c241
--- /dev/null
+++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue
@@ -0,0 +1,557 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <div class="form">
+        <a-form
+          :form="form"
+          layout="vertical"
+          @submit="handleSubmit">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.name') }}
+              <a-tooltip :title="apiParams.name.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['name', {
+                rules: [{ required: true, message: $t('message.error.name') }]
+              }]"
+              :placeholder="this.$t('label.name')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.displaytext') }}
+              <a-tooltip :title="apiParams.displaytext.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['displaytext', {
+                rules: [{ required: true, message: $t('message.error.display.text') }]
+              }]"
+              :placeholder="this.$t('label.display.text')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.zoneid') }}
+              <a-tooltip :title="apiParams.zoneid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['zoneid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading"
+              :placeholder="this.$t('label.zoneid')"
+              @change="val => { this.handleZoneChange(this.zones[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="this.isAdminOrDomainAdmin()">
+            <span slot="label">
+              {{ $t('label.domain') }}
+              <a-tooltip :title="apiParams.domainid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['domainid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="domainLoading"
+              :placeholder="this.$t('label.domainid')"
+              @change="val => { this.handleDomainChange(this.domains[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.networkofferingid') }}
+              <a-tooltip :title="apiParams.networkofferingid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['networkofferingid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="networkOfferingLoading"
+              :placeholder="this.$t('label.networkofferingid')"
+              @change="val => { this.handleNetworkOfferingChange(this.networkOfferings[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.networkOfferings" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.specifyvlan">
+            <span slot="label">
+              {{ $t('label.vlan') }}
+              <a-tooltip :title="apiParams.vlan.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['vlanid', {
+                rules: [{ required: true, message: $t('message.please.enter.value') }]
+              }]"
+              :placeholder="this.$t('label.vlanid')"/>
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.forvpc">
+            <span slot="label">
+              {{ $t('label.vpcid') }}
+              <a-tooltip :title="apiParams.vpcid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['vpcid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="vpcLoading"
+              :placeholder="this.$t('label.vpcid')"
+              @change="val => { this.selectedVpc = this.vpcs[val] }">
+              <a-select-option v-for="(opt, optIndex) in this.vpcs" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.externalid') }}
+              <a-tooltip :title="apiParams.externalid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['externalid', {}]"
+              :placeholder="$t('label.externalid')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.gateway') }}
+              <a-tooltip :title="apiParams.gateway.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['gateway', {}]"
+              :placeholder="this.$t('label.gateway')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.netmask') }}
+              <a-tooltip :title="apiParams.netmask.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['netmask', {}]"
+              :placeholder="this.$t('label.netmask')"/>
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && !this.selectedNetworkOffering.forvpc">
+            <span slot="label">
+              {{ $t('label.networkdomain') }}
+              <a-tooltip :title="apiParams.networkdomain.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['networkdomain', {}]"
+              :placeholder="this.$t('label.networkdomain')"/>
+          </a-form-item>
+          <a-form-item v-if="this.accountVisible">
+            <span slot="label">
+              {{ $t('label.account') }}
+              <a-tooltip :title="apiParams.account.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['account']"
+              :placeholder="this.$t('label.account')"/>
+          </a-form-item>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="actionLoading"
+              @click="closeAction">
+              {{ this.$t('label.cancel') }}
+            </a-button>
+            <a-button
+              :loading="actionLoading"
+              type="primary"
+              @click="handleSubmit">
+              {{ this.$t('label.ok') }}
+            </a-button>
+          </div>
+        </a-form>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateIsolatedNetworkForm',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    vpc: {
+      type: Object,
+      default: null
+    },
+    resource: {
+      type: Object,
+      default: () => { return {} }
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      domains: [],
+      domainLoading: false,
+      selectedDomain: {},
+      zones: [],
+      zoneLoading: false,
+      selectedZone: {},
+      networkOfferings: [],
+      networkOfferingLoading: false,
+      selectedNetworkOffering: {},
+      vpcs: [],
+      vpcLoading: false,
+      selectedVpc: {},
+      accountVisible: this.isAdminOrDomainAdmin()
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      this.fetchData()
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createNetwork || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.domains = [
+      {
+        id: '-1',
+        name: ' '
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isObjectEmpty (obj) {
+      return !(obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object)
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    isValidTextValueForKey (obj, key) {
+      return key in obj && obj[key] != null && obj[key].length > 0
+    },
+    fetchZoneData () {
+      this.zones = []
+      const params = {}
+      if (this.resource.zoneid && this.$route.name === 'deployVirtualMachine') {
+        params.id = this.resource.zoneid
+      }
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        for (const i in json.listzonesresponse.zone) {
+          const zone = json.listzonesresponse.zone[i]
+          if (zone.networktype === 'Advanced' && zone.securitygroupsenabled !== true) {
+            this.zones.push(zone)
+          }
+        }
+        this.zoneLoading = false
+        if (this.arrayHasItems(this.zones)) {
+          this.form.setFieldsValue({
+            zoneid: 0
+          })
+          this.handleZoneChange(this.zones[0])
+        }
+      })
+    },
+    handleZoneChange (zone) {
+      this.selectedZone = zone
+      this.updateVPCCheckAndFetchNetworkOfferingData()
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+        this.form.setFieldsValue({
+          domainid: 0
+        })
+        this.handleDomainChange(this.domains[0])
+      })
+    },
+    handleDomainChange (domain) {
+      this.selectedDomain = domain
+      this.accountVisible = domain.id !== '-1'
+      if (this.isAdminOrDomainAdmin()) {
+        this.updateVPCCheckAndFetchNetworkOfferingData()
+      }
+    },
+    updateVPCCheckAndFetchNetworkOfferingData () {
+      if (this.vpc !== null) { // from VPC section
+        this.fetchNetworkOfferingData(true)
+      } else { // from guest network section
+        var params = {}
+        this.networkOfferingLoading = true
+        api('listVPCs', params).then(json => {
+          const listVPCs = json.listvpcsresponse.vpc
+          var vpcAvailable = this.arrayHasItems(listVPCs)
+          if (vpcAvailable === false) {
+            this.fetchNetworkOfferingData(false)
+          } else {
+            this.fetchNetworkOfferingData()
+          }
+        })
+      }
+    },
+    fetchNetworkOfferingData (forVpc) {
+      this.networkOfferingLoading = true
+      var params = {
+        zoneid: this.selectedZone.id,
+        guestiptype: 'Isolated',
+        supportedServices: 'SourceNat',
+        state: 'Enabled'
+      }
+      if (this.isAdminOrDomainAdmin() && this.selectedDomain.id !== '-1') { // domain is visible only for admins
+        params.domainid = this.selectedDomain.id
+      }
+      if (!this.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
+        params.specifyvlan = false
+      }
+      if (forVpc !== null) {
+        params.forvpc = forVpc
+      }
+      this.networkOfferings = []
+      this.selectedNetworkOffering = {}
+      api('listNetworkOfferings', params).then(json => {
+        this.networkOfferings = json.listnetworkofferingsresponse.networkoffering
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.networkOfferingLoading = false
+        if (this.arrayHasItems(this.networkOfferings)) {
+          this.form.setFieldsValue({
+            networkofferingid: 0
+          })
+          this.handleNetworkOfferingChange(this.networkOfferings[0])
+        }
+      })
+    },
+    handleNetworkOfferingChange (networkOffering) {
+      this.selectedNetworkOffering = networkOffering
+      if (networkOffering.forvpc) {
+        this.fetchVpcData()
+      }
+    },
+    fetchVpcData () {
+      this.vpcLoading = true
+      var params = {
+        listAll: true,
+        details: 'min'
+      }
+      if (this.vpc !== null) {
+        params.id = this.vpc.id
+      }
+      api('listVPCs', params).then(json => {
+        this.vpcs = json.listvpcsresponse.vpc
+      }).finally(() => {
+        this.vpcLoading = false
+        if (this.arrayHasItems(this.vpcs)) {
+          this.form.setFieldsValue({
+            vpcid: 0
+          })
+          this.selectedVpc = this.vpcs[0]
+        }
+      })
+    },
+    handleSubmit (e) {
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+        this.actionLoading = true
+        var params = {
+          zoneId: this.selectedZone.id,
+          name: values.name,
+          displayText: values.displaytext,
+          networkOfferingId: this.selectedNetworkOffering.id
+        }
+        if (this.isValidTextValueForKey(values, 'gateway')) {
+          params.gateway = values.gateway
+        }
+        if (this.isValidTextValueForKey(values, 'netmask')) {
+          params.netmask = values.netmask
+        }
+        if (this.isValidTextValueForKey(values, 'externalid')) {
+          params.externalid = values.externalid
+        }
+        if (this.isValidTextValueForKey(values, 'vpcid')) {
+          params.vpcid = this.selectedVpc.id
+        }
+        if (this.isValidTextValueForKey(values, 'vlanid')) {
+          params.vlan = values.vlanid
+        }
+        if (this.isValidTextValueForKey(values, 'networkdomain')) {
+          params.networkdomain = values.networkdomain
+        }
+        if ('domainid' in values && values.domainid > 0) {
+          params.domainid = this.selectedDomain.id
+          if (this.isValidTextValueForKey(values, 'account')) {
+            params.account = values.account
+          }
+        }
+        api('createNetwork', params).then(json => {
+          this.$notification.success({
+            message: 'Network',
+            description: this.$t('message.success.create.isolated.network')
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    resetForm () {
+      this.form.setFieldsValue({
+      })
+      this.tags = []
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.form-layout {
+  .ant-tag {
+    margin-bottom: 10px;
+  }
+
+  /deep/.custom-time-select .ant-time-picker {
+    width: 100%;
+  }
+
+  /deep/.ant-divider-horizontal {
+    margin-top: 0;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.tagsTitle {
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/network/CreateL2NetworkForm.vue b/ui/src/views/network/CreateL2NetworkForm.vue
new file mode 100644
index 0000000..b21bce0
--- /dev/null
+++ b/ui/src/views/network/CreateL2NetworkForm.vue
@@ -0,0 +1,499 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <div class="form">
+        <a-form
+          :form="form"
+          layout="vertical"
+          @submit="handleSubmit">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.name') }}
+              <a-tooltip :title="apiParams.name.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['name', {
+                rules: [{ required: true, message: $t('message.error.name') }]
+              }]"
+              :placeholder="this.$t('label.name')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.displaytext') }}
+              <a-tooltip :title="apiParams.displaytext.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['displaytext', {
+                rules: [{ required: true, message: $t('message.error.display.text') }]
+              }]"
+              :placeholder="this.$t('label.displaytext')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.zoneid') }}
+              <a-tooltip :title="apiParams.zoneid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['zoneid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading"
+              :placeholder="this.$t('label.zoneid')"
+              @change="val => { this.handleZoneChange(this.zones[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="this.isAdminOrDomainAdmin()">
+            <span slot="label">
+              {{ $t('label.domain') }}
+              <a-tooltip :title="apiParams.domainid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['domainid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="domainLoading"
+              :placeholder="this.$t('label.domainid')"
+              @change="val => { this.handleDomainChange(this.domains[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.networkofferingid') }}
+              <a-tooltip :title="apiParams.networkofferingid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['networkofferingid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="networkOfferingLoading"
+              :placeholder="this.$t('label.networkofferingid')"
+              @change="val => { this.handleNetworkOfferingChange(this.networkOfferings[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.networkOfferings" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.specifyvlan">
+            <span slot="label">
+              {{ $t('label.vlan') }}
+              <a-tooltip :title="apiParams.vlan.description" v-if="'vlan' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['vlanid', {
+                rules: [{ required: true, message: $t('message.please.enter.value') }]
+              }]"
+              :placeholder="this.$t('label.vlanid')"/>
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.specifyvlan">
+            <span slot="label">
+              {{ $t('label.bypassvlanoverlapcheck') }}
+              <a-tooltip :title="apiParams.bypassvlanoverlapcheck.description" v-if="'bypassvlanoverlapcheck' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-switch v-decorator="['bypassvlanoverlapcheck']" />
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.specifyvlan">
+            <span slot="label">
+              {{ $t('label.isolatedpvlantype') }}
+              <a-tooltip :title="apiParams.isolatedpvlantype.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-radio-group
+              v-decorator="['isolatedpvlantype', {
+                initialValue: this.isolatePvlanType
+              }]"
+              buttonStyle="solid"
+              @change="selected => { this.isolatePvlanType = selected.target.value }">
+              <a-radio-button value="none">
+                {{ $t('label.none') }}
+              </a-radio-button>
+              <a-radio-button value="community">
+                {{ $t('label.community') }}
+              </a-radio-button>
+              <a-radio-button value="isolated">
+                {{ $t('label.secondary.isolated.vlan.type.isolated') }}
+              </a-radio-button>
+              <a-radio-button value="promiscuous">
+                {{ $t('label.secondary.isolated.vlan.type.promiscuous') }}
+              </a-radio-button>
+            </a-radio-group>
+          </a-form-item>
+          <a-form-item v-if="this.isolatePvlanType=='community' || this.isolatePvlanType=='isolated'">
+            <span slot="label">
+              {{ $t('label.isolatedpvlanid') }}
+              <a-tooltip :title="apiParams.isolatedpvlan.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['isolatedpvlan', {}]"
+              :placeholder="this.$t('label.isolatedpvlanid')"/>
+          </a-form-item>
+          <a-form-item v-if="this.accountVisible">
+            <span slot="label">
+              {{ $t('label.account') }}
+              <a-tooltip :title="apiParams.account.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['account']"
+              :placeholder="this.$t('label.account')"/>
+          </a-form-item>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="actionLoading"
+              @click="closeAction">
+              {{ this.$t('label.cancel') }}
+            </a-button>
+            <a-button
+              :loading="actionLoading"
+              type="primary"
+              @click="handleSubmit">
+              {{ this.$t('label.ok') }}
+            </a-button>
+          </div>
+        </a-form>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateL2NetworkForm',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    vpc: {
+      type: Object,
+      default: null
+    },
+    resource: {
+      type: Object,
+      default: () => { return {} }
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      domains: [],
+      domainLoading: false,
+      selectedDomain: {},
+      zones: [],
+      zoneLoading: false,
+      selectedZone: {},
+      networkOfferings: [],
+      networkOfferingLoading: false,
+      selectedNetworkOffering: {},
+      accountVisible: this.isAdminOrDomainAdmin(),
+      isolatePvlanType: 'none'
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      this.fetchData()
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createNetwork || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.domains = [
+      {
+        id: '-1',
+        name: ' '
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isObjectEmpty (obj) {
+      return !(obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object)
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    isValidTextValueForKey (obj, key) {
+      return this.isValidValueForKey(obj, key) && obj[key].length > 0
+    },
+    fetchZoneData () {
+      this.zones = []
+      const params = {}
+      if (this.resource.zoneid && this.$route.name === 'deployVirtualMachine') {
+        params.id = this.resource.zoneid
+      }
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        for (const i in json.listzonesresponse.zone) {
+          const zone = json.listzonesresponse.zone[i]
+          if (zone.networktype === 'Advanced') {
+            this.zones.push(zone)
+          }
+        }
+        this.zoneLoading = false
+        if (this.arrayHasItems(this.zones)) {
+          this.form.setFieldsValue({
+            zoneid: 0
+          })
+          this.handleZoneChange(this.zones[0])
+        }
+      })
+    },
+    handleZoneChange (zone) {
+      this.selectedZone = zone
+      this.updateVPCCheckAndFetchNetworkOfferingData()
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+        this.form.setFieldsValue({
+          domainid: 0
+        })
+        this.handleDomainChange(this.domains[0])
+      })
+    },
+    handleDomainChange (domain) {
+      this.selectedDomain = domain
+      this.accountVisible = domain.id !== '-1'
+      if (this.isAdminOrDomainAdmin()) {
+        this.updateVPCCheckAndFetchNetworkOfferingData()
+      }
+    },
+    updateVPCCheckAndFetchNetworkOfferingData () {
+      if (this.vpc !== null) { // from VPC section
+        this.fetchNetworkOfferingData(true)
+      } else { // from guest network section
+        var params = {}
+        this.networkOfferingLoading = true
+        api('listVPCs', params).then(json => {
+          const listVPCs = json.listvpcsresponse.vpc
+          var vpcAvailable = this.arrayHasItems(listVPCs)
+          if (vpcAvailable === false) {
+            this.fetchNetworkOfferingData(false)
+          } else {
+            this.fetchNetworkOfferingData()
+          }
+        })
+      }
+    },
+    fetchNetworkOfferingData (forVpc) {
+      this.networkOfferingLoading = true
+      var params = {
+        zoneid: this.selectedZone.id,
+        guestiptype: 'L2',
+        state: 'Enabled'
+      }
+      if (this.isAdminOrDomainAdmin() && this.selectedDomain.id !== '-1') { // domain is visible only for admins
+        params.domainid = this.selectedDomain.id
+      }
+      if (!this.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
+        params.specifyvlan = false
+      }
+      if (forVpc !== null) {
+        params.forvpc = forVpc
+      }
+      api('listNetworkOfferings', params).then(json => {
+        this.networkOfferings = json.listnetworkofferingsresponse.networkoffering
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.networkOfferingLoading = false
+        if (this.arrayHasItems(this.networkOfferings)) {
+          this.form.setFieldsValue({
+            networkofferingid: 0
+          })
+          this.handleNetworkOfferingChange(this.networkOfferings[0])
+        }
+      })
+    },
+    handleNetworkOfferingChange (networkOffering) {
+      this.selectedNetworkOffering = networkOffering
+    },
+    handleSubmit (e) {
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+        this.actionLoading = true
+        var params = {
+          zoneId: this.selectedZone.id,
+          name: values.name,
+          displayText: values.displaytext,
+          networkOfferingId: this.selectedNetworkOffering.id
+        }
+        if (this.isValidTextValueForKey(values, 'vlanid')) {
+          params.vlan = values.vlanid
+        }
+        if (this.isValidValueForKey(values, 'bypassvlanoverlapcheck')) {
+          params.bypassvlanoverlapcheck = values.bypassvlanoverlapcheck
+        }
+        if ('domainid' in values && values.domainid > 0) {
+          params.domainid = this.selectedDomain.id
+          if (this.isValidTextValueForKey(values, 'account')) {
+            params.account = values.account
+          }
+        }
+        if (this.isValidValueForKey(values, 'isolatedpvlantype') && values.isolatedpvlantype !== 'none') {
+          params.isolatedpvlantype = values.isolatedpvlantype
+          if (this.isValidValueForKey(values, 'isolatedpvlan')) {
+            params.isolatedpvlan = values.isolatedpvlan
+          }
+        }
+        api('createNetwork', params).then(json => {
+          this.$notification.success({
+            message: 'Network',
+            description: this.$t('message.success.create.l2.network')
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    resetForm () {
+      this.form.setFieldsValue({
+      })
+      this.tags = []
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.form-layout {
+  .ant-tag {
+    margin-bottom: 10px;
+  }
+
+  /deep/.custom-time-select .ant-time-picker {
+    width: 100%;
+  }
+
+  /deep/.ant-divider-horizontal {
+    margin-top: 0;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.tagsTitle {
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/network/CreateNetwork.vue b/ui/src/views/network/CreateNetwork.vue
new file mode 100644
index 0000000..0c62041
--- /dev/null
+++ b/ui/src/views/network/CreateNetwork.vue
@@ -0,0 +1,143 @@
+// 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>
+  <a-spin :spinning="loading" class="form-layout">
+    <a-tabs defaultActiveKey="1" :animated="false" v-if="!loading">
+      <a-tab-pane :tab="$t('label.isolated')" key="1" v-if="isAdvancedZoneWithoutSGAvailable">
+        <CreateIsolatedNetworkForm
+          :loading="loading"
+          :resource="resource"
+          @close-action="closeAction"
+          @refresh-data="refreshParent"
+          @refresh="handleRefresh"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.l2')" key="2">
+        <CreateL2NetworkForm
+          :loading="loading"
+          :resource="resource"
+          @close-action="closeAction"
+          @refresh-data="refreshParent"
+          @refresh="handleRefresh"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.shared')" key="3" v-if="this.isAdmin()">
+        <CreateSharedNetworkForm
+          :loading="loading"
+          :resource="resource"
+          @close-action="closeAction"
+          @refresh-data="refreshParent"
+          @refresh="handleRefresh"/>
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import CreateIsolatedNetworkForm from '@/views/network/CreateIsolatedNetworkForm'
+import CreateL2NetworkForm from '@/views/network/CreateL2NetworkForm'
+import CreateSharedNetworkForm from '@/views/network/CreateSharedNetworkForm'
+
+export default {
+  name: 'CreateNetwork',
+  components: {
+    CreateIsolatedNetworkForm,
+    CreateL2NetworkForm,
+    CreateSharedNetworkForm
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      isAdvancedZoneWithoutSGAvailable: true,
+      defaultNetworkTypeTabKey: '1',
+      loading: false,
+      actionZones: [],
+      actionZoneLoading: false
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      this.fetchData()
+    }
+  },
+  created () {
+    const promises = []
+    promises.push(this.fetchActionZoneData())
+    Promise.all(promises).then(() => {
+      for (const i in this.actionZones) {
+        const zone = this.actionZones[i]
+        if (zone.networktype === 'Advanced' && zone.securitygroupsenabled !== true) {
+          this.isAdvancedZoneWithoutSGAvailable = true
+          return
+        }
+      }
+      this.isAdvancedZoneWithoutSGAvailable = false
+    })
+  },
+  methods: {
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    fetchActionZoneData () {
+      this.loading = true
+      const params = {}
+      if (this.resource && this.resource.zoneid) {
+        params.id = this.resource.zoneid
+      }
+      params.listAll = true
+      this.actionZonesLoading = true
+      return api('listZones', params).then(json => {
+        this.actionZones = json.listzonesresponse.zone
+      }).finally(() => {
+        this.actionZoneLoading = false
+        this.loading = false
+      })
+    },
+    handleRefresh () {
+      this.fetchData()
+    },
+    refreshParent () {
+      this.$emit('refresh-data')
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+    @media (min-width: 700px) {
+      width: 600px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue
new file mode 100644
index 0000000..e91a563
--- /dev/null
+++ b/ui/src/views/network/CreateSharedNetworkForm.vue
@@ -0,0 +1,877 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <div class="form">
+        <a-form
+          :form="form"
+          layout="vertical"
+          @submit="handleSubmit">
+          <a-form-item :label="$t('label.name')">
+            <span slot="label">
+              {{ $t('label.name') }}
+              <a-tooltip :title="apiParams.name.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['name', {
+                rules: [{ required: true, message: $t('message.error.name') }]
+              }]"
+              :placeholder="this.$t('label.name')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.displaytext') }}
+              <a-tooltip :title="apiParams.displaytext.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['displaytext', {
+                rules: [{ required: true, message: $t('message.error.display.text') }]
+              }]"
+              :placeholder="this.$t('label.display.text')"/>
+          </a-form-item>
+          <a-form-item v-if="this.isObjectEmpty(this.zone)">
+            <span slot="label">
+              {{ $t('label.zoneid') }}
+              <a-tooltip :title="apiParams.zoneid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['zoneid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading"
+              :placeholder="this.$t('label.zoneid')"
+              @change="val => { this.handleZoneChange(this.zones[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="this.isObjectEmpty(this.zone)">
+            <span slot="label">
+              {{ $t('label.physicalnetworkid') }}
+              <a-tooltip :title="apiParams.physicalnetworkid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['physicalnetworkid', {}]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="zoneLoading"
+              :placeholder="this.$t('label.physicalnetworkid')"
+              @change="val => { this.handlePhysicalNetworkChange(this.formPhysicalNetworks[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.formPhysicalNetworks" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.vlan') }}
+              <a-tooltip :title="apiParams.vlan.description" v-if="'vlan' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['vlanid', {
+                rules: [{ required: true, message: $t('message.please.enter.value') }]
+              }]"
+              :placeholder="this.$t('label.vlanid')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.bypassvlanoverlapcheck') }}
+              <a-tooltip :title="apiParams.bypassvlanoverlapcheck.description" v-if="'bypassvlanoverlapcheck' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-switch v-decorator="['bypassvlanoverlapcheck']" />
+          </a-form-item>
+          <a-form-item v-if="!this.isObjectEmpty(this.selectedNetworkOffering) && this.selectedNetworkOffering.specifyvlan">
+            <span slot="label">
+              {{ $t('label.isolatedpvlantype') }}
+              <a-tooltip :title="apiParams.isolatedpvlantype.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-radio-group
+              v-decorator="['isolatedpvlantype', {
+                initialValue: this.isolatePvlanType
+              }]"
+              buttonStyle="solid"
+              @change="selected => { this.handleIsolatedPvlanTypeChange(selected.target.value) }">
+              <a-radio-button value="none">
+                {{ $t('label.none') }}
+              </a-radio-button>
+              <a-radio-button value="community">
+                {{ $t('label.community') }}
+              </a-radio-button>
+              <a-radio-button value="isolated">
+                {{ $t('label.secondary.isolated.vlan.type.isolated') }}
+              </a-radio-button>
+              <a-radio-button value="promiscuous">
+                {{ $t('label.secondary.isolated.vlan.type.promiscuous') }}
+              </a-radio-button>
+            </a-radio-group>
+          </a-form-item>
+          <a-form-item v-if="this.isolatePvlanType=='community' || this.isolatePvlanType=='isolated'">
+            <span slot="label">
+              {{ $t('label.isolatedpvlanid') }}
+              <a-tooltip :title="apiParams.isolatedpvlan.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['isolatedpvlan', {}]"
+              :placeholder="this.$t('label.isolatedpvlanid')"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.scope')">
+            <a-radio-group
+              v-decorator="['scope', {
+                initialValue: this.scopeType
+              }]"
+              buttonStyle="solid"
+              @change="selected => { this.handleScopeTypeChange(selected.target.value) }">
+              <a-radio-button value="all">
+                {{ $t('label.all') }}
+              </a-radio-button>
+              <a-radio-button value="domain" v-if="!this.parseBooleanValueForKey(this.selectedZone, 'securitygroupsenabled')">
+                {{ $t('label.domain') }}
+              </a-radio-button>
+              <a-radio-button value="account" v-if="!this.parseBooleanValueForKey(this.selectedZone, 'securitygroupsenabled')">
+                {{ $t('label.account') }}
+              </a-radio-button>
+              <a-radio-button value="project" v-if="!this.parseBooleanValueForKey(this.selectedZone, 'securitygroupsenabled')">
+                {{ $t('label.project') }}
+              </a-radio-button>
+            </a-radio-group>
+          </a-form-item>
+          <a-form-item v-if="this.scopeType !== 'all'">
+            <span slot="label">
+              {{ $t('label.domain') }}
+              <a-tooltip :title="apiParams.domainid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['domainid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="domainLoading"
+              :placeholder="this.$t('label.domainid')"
+              @change="val => { this.handleDomainChange(this.domains[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="this.scopeType === 'domain'">
+            <span slot="label">
+              {{ $t('label.subdomainaccess') }}
+              <a-tooltip :title="apiParams.subdomainaccess.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-switch v-decorator="['subdomainaccess']" />
+          </a-form-item>
+          <a-form-item v-if="this.scopeType === 'account'">
+            <span slot="label">
+              {{ $t('label.account') }}
+              <a-tooltip :title="apiParams.account.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['account', {}]"
+              :placeholder="this.$t('label.account')"/>
+          </a-form-item>
+          <a-form-item v-if="this.scopeType === 'project'">
+            <span slot="label">
+              {{ $t('label.projectid') }}
+              <a-tooltip :title="apiParams.projectid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['projectid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="projectLoading"
+              :placeholder="this.$t('label.projectid')"
+              @change="val => { this.handleProjectChange(this.projects[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.projects" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.networkofferingid') }}
+              <a-tooltip :title="apiParams.networkofferingid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              v-decorator="['networkofferingid', {
+                rules: [
+                  {
+                    required: true,
+                    message: `${this.$t('message.error.select')}`
+                  }
+                ]
+              }]"
+              showSearch
+              optionFilterProp="children"
+              :filterOption="(input, option) => {
+                return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+              }"
+              :loading="networkOfferingLoading"
+              :placeholder="this.$t('label.networkofferingid')"
+              @change="val => { this.handleNetworkOfferingChange(this.networkOfferings[val]) }">
+              <a-select-option v-for="(opt, optIndex) in this.networkOfferings" :key="optIndex">
+                {{ opt.name || opt.description }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip4gateway') }}
+              <a-tooltip :title="apiParams.gateway.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['ip4gateway', {}]"
+              :placeholder="this.$t('label.ip4gateway')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip4netmask') }}
+              <a-tooltip :title="apiParams.netmask.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['netmask', {}]"
+              :placeholder="this.$t('label.netmask')"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.startipv4')">
+            <span slot="label">
+              {{ $t('label.startipv4') }}
+              <a-tooltip :title="apiParams.startip.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['startipv4', {}]"
+              :placeholder="this.$t('label.startipv4')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.endipv4') }}
+              <a-tooltip :title="apiParams.endip.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['endipv4', {}]"
+              :placeholder="this.$t('label.endipv4')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip6gateway') }}
+              <a-tooltip :title="apiParams.ip6gateway.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['ip6gateway', {}]"
+              :placeholder="this.$t('label.ip6gateway')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip6cidr') }}
+              <a-tooltip :title="apiParams.ip6cidr.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['ip6cidr', {}]"
+              :placeholder="this.$t('label.ip6cidr')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.startipv6') }}
+              <a-tooltip :title="apiParams.startipv6.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['startipv6', {}]"
+              :placeholder="this.$t('label.startipv6')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.endipv6') }}
+              <a-tooltip :title="apiParams.endipv6.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['endipv6', {}]"
+              :placeholder="this.$t('label.endipv6')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.networkdomain') }}
+              <a-tooltip :title="apiParams.networkdomain.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['networkdomain', {}]"
+              :placeholder="this.$t('label.networkdomain')"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.hideipaddressusage') }}
+              <a-tooltip :title="apiParams.hideipaddressusage.description" v-if="'hideipaddressusage' in apiParams">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-switch v-decorator="['hideipaddressusage']" />
+          </a-form-item>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="actionLoading"
+              @click="closeAction">
+              {{ this.$t('label.cancel') }}
+            </a-button>
+            <a-button
+              :loading="actionLoading"
+              type="primary"
+              @click="handleSubmit">
+              {{ this.$t('label.ok') }}
+            </a-button>
+          </div>
+        </a-form>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateGuestNetworkForm',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    zone: {
+      type: Object,
+      default: null
+    },
+    physicalNetworks: {
+      type: Array,
+      default: null
+    },
+    resource: {
+      type: Object,
+      default: () => { return {} }
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      zones: [],
+      zoneLoading: false,
+      selectedZone: {},
+      formPhysicalNetworks: [],
+      formPhysicalNetworkLoading: false,
+      formSelectedPhysicalNetwork: {},
+      isolatePvlanType: 'none',
+      scopeType: 'all',
+      domains: [],
+      domainLoading: false,
+      selectedDomain: {},
+      networkOfferings: [],
+      networkOfferingLoading: false,
+      selectedNetworkOffering: {},
+      projects: [],
+      projectLoading: false,
+      selectedProject: {}
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      this.fetchData()
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createNetwork || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.isObjectEmpty(this.zone)) {
+        this.fetchZoneData()
+      } else {
+        this.fetchNetworkOfferingData()
+      }
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isAdminOrDomainAdmin () {
+      return ['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isObjectEmpty (obj) {
+      return !(obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object)
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    isValidValueForKey (obj, key) {
+      return key in obj && obj[key] != null
+    },
+    parseBooleanValueForKey (obj, key) {
+      return this.isValidValueForKey(obj, key) && obj[key] === true
+    },
+    isValidTextValueForKey (obj, key) {
+      return this.isValidValueForKey(obj, key) && obj[key].length > 0
+    },
+    fetchZoneData () {
+      this.zones = []
+      if (this.zone !== null) {
+        this.zones.push(this.zone)
+        if (this.arrayHasItems(this.zones)) {
+          this.form.setFieldsValue({
+            zoneid: 0
+          })
+          this.handleZoneChange(this.zones[0])
+        }
+      } else {
+        const params = {}
+        if (this.resource.zoneid && this.$route.name === 'deployVirtualMachine') {
+          params.id = this.resource.zoneid
+        }
+        params.listAll = true
+        this.zoneLoading = true
+        api('listZones', params).then(json => {
+          for (const i in json.listzonesresponse.zone) {
+            const zone = json.listzonesresponse.zone[i]
+            if (zone.networktype === 'Advanced') {
+              this.zones.push(zone)
+            }
+          }
+        }).finally(() => {
+          this.zoneLoading = false
+          if (this.arrayHasItems(this.zones)) {
+            this.form.setFieldsValue({
+              zoneid: 0
+            })
+            this.handleZoneChange(this.zones[0])
+          }
+        })
+      }
+    },
+    handleZoneChange (zone) {
+      this.selectedZone = zone
+      this.fetchPhysicalNetworkData()
+    },
+    fetchPhysicalNetworkData () {
+      if (this.physicalNetworks != null) {
+        this.formPhysicalNetworks = this.physicalNetworks
+        if (this.arrayHasItems(this.formPhysicalNetworks)) {
+          this.form.setFieldsValue({
+            physicalnetworkid: 0
+          })
+          this.handlePhysicalNetworkChange(this.formPhysicalNetworks[0])
+        }
+      } else {
+        if (this.selectedZone === null || this.selectedZone === undefined) {
+          return
+        }
+        const params = {}
+        params.zoneid = this.selectedZone.id
+        this.formPhysicalNetworksLoading = true
+        api('listPhysicalNetworks', params).then(json => {
+          this.formPhysicalNetworks = []
+          var networks = json.listphysicalnetworksresponse.physicalnetwork
+          if (this.arrayHasItems(networks)) {
+            for (const i in networks) {
+              this.addPhysicalNetworkForGuestTrafficType(networks[i], i * 1 === networks.length - 1)
+            }
+          } else {
+            this.formPhysicalNetworkLoading = false
+          }
+        }).finally(() => {
+        })
+      }
+    },
+    addPhysicalNetworkForGuestTrafficType (physicalNetwork, isLastNetwork) {
+      const params = {}
+      params.physicalnetworkid = physicalNetwork.id
+      api('listTrafficTypes', params).then(json => {
+        var trafficTypes = json.listtraffictypesresponse.traffictype
+        if (this.arrayHasItems(trafficTypes)) {
+          for (const i in trafficTypes) {
+            if (trafficTypes[i].traffictype === 'Guest') {
+              this.formPhysicalNetworks.push(physicalNetwork)
+              break
+            }
+          }
+        } else {
+          this.formPhysicalNetworkLoading = false
+        }
+      }).finally(() => {
+        if (isLastNetwork) {
+          this.form.setFieldsValue({
+            physicalnetworkid: 0
+          })
+          this.handlePhysicalNetworkChange(this.formPhysicalNetworks[0])
+        }
+      })
+    },
+    handlePhysicalNetworkChange (physicalNet) {
+      this.formSelectedPhysicalNetwork = physicalNet
+      this.fetchNetworkOfferingData()
+    },
+    handleIsolatedPvlanTypeChange (pvlan) {
+      this.isolatePvlanType = pvlan
+    },
+    handleScopeTypeChange (scope) {
+      this.scopeType = scope
+      switch (scope) {
+        case 'domain':
+        {
+          this.fetchDomainData()
+          break
+        }
+        case 'project':
+        {
+          this.fetchDomainData()
+          this.fetchProjectData()
+          this.fetchNetworkOfferingData()
+          break
+        }
+        default:
+        {
+          this.fetchNetworkOfferingData()
+        }
+      }
+    },
+    fetchNetworkOfferingData () {
+      if (this.isObjectEmpty(this.selectedZone)) {
+        return
+      }
+      this.networkOfferingLoading = true
+      var params = {
+        zoneid: this.selectedZone.id,
+        state: 'Enabled'
+      }
+      if (!this.isObjectEmpty(this.formSelectedPhysicalNetwork) &&
+        this.formSelectedPhysicalNetwork.tags &&
+        this.formSelectedPhysicalNetwork.tags.length > 0) {
+        params.tags = this.formSelectedPhysicalNetwork.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 (this.scopeType === 'all' || this.scopeType === 'domain') {
+        params.guestiptype = 'Shared'
+        if (this.scopeType === 'domain') {
+          params.domainid = this.selectedDomain.id
+        }
+      }
+      this.handleNetworkOfferingChange(null)
+      this.networkOfferings = []
+      api('listNetworkOfferings', params).then(json => {
+        this.networkOfferings = json.listnetworkofferingsresponse.networkoffering
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.networkOfferingLoading = false
+        if (this.arrayHasItems(this.networkOfferings)) {
+          this.form.setFieldsValue({
+            networkofferingid: 0
+          })
+          this.handleNetworkOfferingChange(this.networkOfferings[0])
+        } else {
+          this.form.setFieldsValue({
+            networkofferingid: null
+          })
+        }
+      })
+    },
+    handleNetworkOfferingChange (networkOffering) {
+      this.selectedNetworkOffering = networkOffering
+    },
+    fetchDomainData () {
+      const params = {}
+      if (!this.isObjectEmpty(this.selectedZone) && this.selectedZone.domainid != null) {
+        params.id = this.selectedZone.id
+        params.isrecursive = true
+      } else {
+        params.listall = true
+      }
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+        this.form.setFieldsValue({
+          domainid: 0
+        })
+        this.handleDomainChange(this.domains[0])
+      })
+    },
+    handleDomainChange (domain) {
+      this.selectedDomain = domain
+      if (!this.isObjectEmpty(domain)) {
+        this.fetchNetworkOfferingData()
+      }
+    },
+    fetchProjectData () {
+      this.projects = []
+      const params = {}
+      params.listall = true
+      params.details = 'min'
+      this.projectLoading = true
+      api('listProjects', params).then(json => {
+        const listProjects = json.listprojectsresponse.project
+        this.projects = this.projects.concat(listProjects)
+      }).finally(() => {
+        this.projectLoading = false
+        if (this.arrayHasItems(this.projects)) {
+          this.form.setFieldsValue({
+            projectid: 0
+          })
+          this.handleProjectChange(this.projects[0])
+        }
+      })
+    },
+    handleProjectChange (project) {
+      this.selectedProject = project
+    },
+    handleSubmit (e) {
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+        if (
+          (!this.isValidTextValueForKey(values, 'ip4gateway') && !this.isValidTextValueForKey(values, 'netmask') &&
+            !this.isValidTextValueForKey(values, 'startipv4') && !this.isValidTextValueForKey(values, 'endipv4') &&
+            !this.isValidTextValueForKey(values, 'ip6gateway') && !this.isValidTextValueForKey(values, 'ip6cidr') &&
+            !this.isValidTextValueForKey(values, 'startipv6') && !this.isValidTextValueForKey(values, 'endipv6'))
+        ) {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: this.$t('message.error.add.guest.network')
+          })
+        }
+        this.actionLoading = true
+        var params = {
+          zoneId: this.selectedZone.id,
+          name: values.name,
+          displayText: values.displaytext,
+          networkOfferingId: this.selectedNetworkOffering.id
+        }
+        if (this.selectedNetworkOffering.guestiptype === 'Shared') {
+          params.physicalnetworkid = this.formSelectedPhysicalNetwork.id
+        }
+        if (this.isValidTextValueForKey(values, 'vlanid')) {
+          params.vlan = values.vlanid
+        }
+        if (this.isValidValueForKey(values, 'bypassvlanoverlapcheck')) {
+          params.bypassvlanoverlapcheck = values.bypassvlanoverlapcheck
+        }
+        if (this.isValidValueForKey(values, 'isolatedpvlantype') && values.isolatedpvlantype !== 'none') {
+          params.isolatedpvlantype = values.isolatedpvlantype
+          if (this.isValidValueForKey(values, 'isolatedpvlan')) {
+            params.isolatedpvlan = values.isolatedpvlan
+          }
+        }
+        if (this.scopeType !== 'all') {
+          params.domainid = this.selectedDomain.id
+          params.acltype = this.scopeType
+          if (this.scopeType === 'account') { // account-specific
+            params.account = values.account
+          } else if (this.scopeType === 'project') { // project-specific
+            params.projectid = this.selectedProject.id
+          } else { // domain-specific
+            params.subdomainaccess = this.parseBooleanValueForKey(values, 'subdomainaccess')
+          }
+        } else { // zone-wide
+          params.acltype = 'domain' // server-side will make it Root domain (i.e. domainid=1)
+        }
+        // IPv4 (begin)
+        if (this.isValidTextValueForKey(values, 'ip4gateway')) {
+          params.gateway = values.ip4gateway
+        }
+        if (this.isValidTextValueForKey(values, 'netmask')) {
+          params.netmask = values.netmask
+        }
+        if (this.isValidTextValueForKey(values, 'startipv4')) {
+          params.startip = values.startipv4
+        }
+        if (this.isValidTextValueForKey(values, 'endipv4')) {
+          params.endip = values.endipv4
+        }
+        // IPv4 (end)
+
+        // IPv6 (begin)
+        if (this.isValidTextValueForKey(values, 'ip4gateway')) {
+          params.ip6gateway = values.ip6gateway
+        }
+        if (this.isValidTextValueForKey(values, 'ip6cidr')) {
+          params.ip6cidr = values.ip6cidr
+        }
+        if (this.isValidTextValueForKey(values, 'startipv6')) {
+          params.startipv6 = values.startipv6
+        }
+        if (this.isValidTextValueForKey(values, 'endipv6')) {
+          params.endipv6 = values.endipv6
+        }
+        // IPv6 (end)
+
+        if (this.isValidTextValueForKey(values, 'networkdomain')) {
+          params.networkdomain = values.networkdomain
+        }
+        var hideipaddressusage = this.parseBooleanValueForKey(values, 'hideipaddressusage')
+        if (hideipaddressusage) {
+          params.hideipaddressusage = true
+        }
+        api('createNetwork', params).then(json => {
+          this.$notification.success({
+            message: this.$t('label.network'),
+            description: this.$t('message.success.add.guest.network')
+          })
+          this.resetForm()
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    resetForm () {
+      this.form.setFieldsValue({
+      })
+      this.tags = []
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.form-layout {
+  .ant-tag {
+    margin-bottom: 10px;
+  }
+
+  /deep/.custom-time-select .ant-time-picker {
+    width: 100%;
+  }
+
+  /deep/.ant-divider-horizontal {
+    margin-top: 0;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.tagsTitle {
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/network/CreateVlanIpRange.vue b/ui/src/views/network/CreateVlanIpRange.vue
new file mode 100644
index 0000000..8a4be18
--- /dev/null
+++ b/ui/src/views/network/CreateVlanIpRange.vue
@@ -0,0 +1,285 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <div class="form">
+        <a-form
+          :form="form"
+          @submit="handleSubmit"
+          layout="vertical">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.gateway') }}
+              <a-tooltip :title="apiParams.gateway.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['gateway', {
+                rules: [{ required: true, message: $t('message.error.gateway') }]
+              }]"
+              :placeholder="apiParams.gateway.description"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.netmask') }}
+              <a-tooltip :title="apiParams.netmask.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['netmask', {
+                rules: [{ required: true, message: $t('message.error.netmask') }]
+              }]"
+              :placeholder="apiParams.netmask.description"/>
+          </a-form-item>
+          <a-row :gutter="12">
+            <a-col :md="12" lg="12">
+              <a-form-item>
+                <span slot="label">
+                  {{ $t('label.startipv4') }}
+                  <a-tooltip :title="apiParams.startip.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-input
+                  v-decorator="['startip', {
+                    rules: [
+                      { required: true, message: $t('message.error.startip') },
+                      {
+                        validator: checkIpFormat,
+                        ipV4: true,
+                        message: $t('message.error.ipv4.address')
+                      }
+                    ]
+                  }]"
+                  :placeholder="apiParams.startip.description"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="12" :lg="12">
+              <a-form-item>
+                <span slot="label">
+                  {{ $t('label.endipv4') }}
+                  <a-tooltip :title="apiParams.endip.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-input
+                  v-decorator="['endip', {
+                    rules: [
+                      { required: true, message: $t('message.error.endip') },
+                      {
+                        validator: checkIpFormat,
+                        ipV4: true,
+                        message: $t('message.error.ipv4.address')
+                      }
+                    ]
+                  }]"
+                  :placeholder="apiParams.endip.description"/>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip6cidr') }}
+              <a-tooltip :title="apiParams.ip6cidr.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['ip6cidr']"
+              :placeholder="apiParams.ip6cidr.description"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.ip6gateway') }}
+              <a-tooltip :title="apiParams.ip6gateway.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['ip6gateway']"
+              :placeholder="apiParams.ip6gateway.description"/>
+          </a-form-item>
+          <a-row :gutter="12">
+            <a-col :md="12" :lg="12">
+              <a-form-item>
+                <span slot="label">
+                  {{ $t('label.startipv6') }}
+                  <a-tooltip :title="apiParams.startipv6.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-input
+                  v-decorator="['startipv6', {
+                    rules: [
+                      {
+                        validator: checkIpFormat,
+                        ipV6: true,
+                        message: $t('message.error.ipv6.address')
+                      }
+                    ]
+                  }]"
+                  :placeholder="apiParams.startipv6.description"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="12" :lg="12">
+              <a-form-item>
+                <span slot="label">
+                  {{ $t('label.endipv6') }}
+                  <a-tooltip :title="apiParams.endipv6.description">
+                    <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+                  </a-tooltip>
+                </span>
+                <a-input
+                  v-decorator="['endipv6', {
+                    rules: [
+                      {
+                        validator: checkIpFormat,
+                        ipV6: true,
+                        message: $t('message.error.ipv6.address')
+                      }
+                    ]
+                  }]"
+                  :placeholder="apiParams.endip.description"/>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="loading"
+              @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>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateVlanIpRange',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      ipV4Regex: /^(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,
+      ipV6Regex: /^((([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
+    }
+  },
+  created () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createVlanIpRange || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        const params = {}
+        params.forVirtualNetwork = false
+        params.networkid = this.resource.id
+        params.gateway = values.gateway
+        params.netmask = values.netmask
+        params.startip = values.startip
+        params.endip = values.endip
+        params.ip6cidr = values.ip6cidr
+        params.ip6gateway = values.ip6gateway
+        params.startipv6 = values.startipv6
+        params.endipv6 = values.endipv6
+
+        this.loading = true
+
+        api('createVlanIpRange', params)
+          .then(() => {
+            this.$notification.success({
+              message: this.$t('message.success.add.iprange')
+            })
+            this.closeAction()
+            this.$emit('refresh-data')
+          }).catch(error => {
+            this.$notification.error({
+              message: `${this.$t('label.error')} ${error.response.status}`,
+              description: error.response.data.createvlaniprangeresponse
+                ? error.response.data.createvlaniprangeresponse.errortext : error.response.data.errorresponse.errortext,
+              duration: 0
+            })
+          }).finally(() => {
+            this.loading = false
+          })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    checkIpFormat (rule, value, callback) {
+      if (!value || value === '') {
+        callback()
+      } else if (rule.ipV4 && !this.ipV4Regex.test(value)) {
+        callback(rule.message)
+      } else if (rule.ipV6 && !this.ipV6Regex.test(value)) {
+        callback(rule.message)
+      } else {
+        callback()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.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/network/CreateVpc.vue b/ui/src/views/network/CreateVpc.vue
new file mode 100644
index 0000000..d3697f3
--- /dev/null
+++ b/ui/src/views/network/CreateVpc.vue
@@ -0,0 +1,254 @@
+// 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"
+        layout="vertical">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.name.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.displaytext') }}
+            <a-tooltip :title="apiParams.displaytext.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.displaytext.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            :loading="loadingZone"
+            v-decorator="['zoneid', {
+              initialValue: this.selectedZone,
+              rules: [{ required: true, message: `${this.$t('label.required')}`}]
+            }]"
+            @change="val => changeZone(val)">
+            <a-select-option v-for="zone in zones" :key="zone.id">
+              {{ zone.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.cidr') }}
+            <a-tooltip :title="apiParams.cidr.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['cidr', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="apiParams.cidr.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.networkdomain') }}
+            <a-tooltip :title="apiParams.networkdomain.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['networkdomain']"
+            :placeholder="apiParams.networkdomain.description"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.vpcofferingid') }}
+            <a-tooltip :title="apiParams.vpcofferingid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            :loading="loadingOffering"
+            v-decorator="['vpcofferingid', {
+              initialValue: this.selectedOffering,
+              rules: [{ required: true, message: `${this.$t('label.required')}`}]}]">
+            <a-select-option :value="offering.id" v-for="offering in vpcOfferings" :key="offering.id">
+              {{ offering.name }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.start') }}
+            <a-tooltip :title="apiParams.start.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['start', {initialValue: true}]" defaultChecked />
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+export default {
+  name: 'CreateVpc',
+  data () {
+    return {
+      loading: false,
+      loadingZone: false,
+      loadingOffering: false,
+      selectedZone: '',
+      zones: [],
+      vpcOfferings: [],
+      selectedOffering: ''
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createVPC || []
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchZones()
+    },
+    fetchZones () {
+      this.loadingZone = true
+      api('listZones', { listAll: true }).then((response) => {
+        const listZones = response.listzonesresponse.zone || []
+        this.zones = listZones.filter(zone => !zone.securitygroupsenabled)
+        this.selectedZone = ''
+        if (this.zones.length > 0) {
+          this.selectedZone = this.zones[0].id
+          this.changeZone(this.selectedZone)
+        }
+      }).finally(() => {
+        this.loadingZone = false
+      })
+    },
+    changeZone (value) {
+      this.selectedZone = value
+      if (this.selectedZone === '') {
+        this.selectedOffering = ''
+        return
+      }
+      this.fetchOfferings()
+    },
+    fetchOfferings () {
+      this.loadingOffering = true
+      api('listVPCOfferings', { zoneid: this.selectedZone, state: 'Enabled' }).then((reponse) => {
+        this.vpcOfferings = reponse.listvpcofferingsresponse.vpcoffering
+        this.selectedOffering = this.vpcOfferings[0].id || ''
+      }).finally(() => {
+        this.loadingOffering = false
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (input === '' || input === null || input === undefined) {
+            continue
+          }
+          params[key] = input
+        }
+        this.loading = true
+        const title = this.$t('label.add.vpc')
+        const description = this.$t('message.success.add.vpc.network')
+        api('createVPC', params).then(json => {
+          const jobId = json.createvpcresponse.jobid
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                this.$store.dispatch('AddAsyncJob', {
+                  title: title,
+                  jobid: jobId,
+                  description: description,
+                  status: this.$t('progress')
+                })
+              },
+              loadingMessage: `${title} ${this.$t('label.in.progress')}`,
+              catchMessage: this.$t('error.fetching.async.job.result')
+            })
+            this.$emit('refresh-data')
+          }
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 80vw;
+  @media (min-width: 700px) {
+    width: 600px;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/network/CreateVpnCustomerGateway.vue b/ui/src/views/network/CreateVpnCustomerGateway.vue
new file mode 100644
index 0000000..ebbb7be
--- /dev/null
+++ b/ui/src/views/network/CreateVpnCustomerGateway.vue
@@ -0,0 +1,371 @@
+// 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>
+    <a-form class="form-layout" :form="form" layout="vertical">
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.name') }}
+          <a-tooltip :title="apiParams.name.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'name',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}` }],
+            }
+          ]"
+          :placeholder="$t('label.vpncustomergatewayname')" />
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.gateway') }}
+          <a-tooltip :title="apiParams.gateway.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'gateway',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}`}],
+            }
+          ]"
+          :placeholder="$t('label.vpncustomergateway')" />
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.cidrlist') }}
+          <a-tooltip :title="apiParams.cidrlist.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'cidrlist',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}`}],
+            }
+          ]"
+          :placeholder="$t('label.vpncustomergateway.cidrlist')" />
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.ipsecpsk') }}
+          <a-tooltip :title="apiParams.ipsecpsk.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'ipsecpsk',
+            {
+              rules: [{ required: true, message: `${$t('label.required')}`}],
+            }
+          ]"
+          :placeholder="$t('label.vpncustomergateway.secretkey')" />
+      </a-form-item>
+      <a-form-item :label="$t('label.ikeencryption')">
+        <a-select
+          v-decorator="[
+            'ikeEncryption',
+            {
+              initialValue: 'aes128',
+            },
+          ]">
+          <a-select-option :value="algo" v-for="(algo, idx) in encryptionAlgo" :key="idx">
+            {{ algo }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item :label="$t('label.ikehash')">
+        <a-select
+          v-decorator="[
+            'ikeHash',
+            {
+              initialValue: 'sha1',
+            },
+          ]">
+          <a-select-option :value="h" v-for="(h, idx) in hash" :key="idx">
+            {{ h }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.ikedh')">
+        <a-select
+          v-decorator="[
+            'ikeDh',
+            {
+              initialValue: 'Group 5(modp1536)',
+            },
+          ]">
+          <a-select-option :value="DHGroups[group]" v-for="(group, idx) in Object.keys(DHGroups)" :key="idx">
+            <div v-if="group !== ''">
+              {{ group+"("+DHGroups[group]+")" }}
+            </div>
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.espencryption')">
+        <a-select
+          v-decorator="[
+            'espEncryption',
+            {
+              initialValue: 'aes128',
+            },
+          ]">
+          <a-select-option :value="algo" v-for="(algo, idx) in encryptionAlgo" :key="idx">
+            {{ algo }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.esphash')">
+        <a-select
+          v-decorator="[
+            'espHash',
+            {
+              initialValue: 'sha1',
+            },
+          ]">
+          <a-select-option :value="h" v-for="(h, idx) in hash" :key="idx">
+            {{ h }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+        :label="$t('label.perfectforwardsecrecy')">
+        <a-select
+          v-decorator="[
+            'perfectForwardSecrecy',
+            {
+              initialValue: 'None',
+            },
+          ]">
+          <a-select-option :value="DHGroups[group]" v-for="(group, idx) in Object.keys(DHGroups)" :key="idx">
+            <div v-if="group === ''">
+              {{ DHGroups[group] }}
+            </div>
+            <div v-else>
+              {{ group+"("+DHGroups[group]+")" }}
+            </div>
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.ikelifetime') }}
+          <a-tooltip :title="apiParams.ikelifetime.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'ikelifetime',
+            {
+              initialValue: '86400',
+            },
+          ]"
+          :placeholder="$t('label.vpncustomergateway.ikelifetime')"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.esplifetime') }}
+          <a-tooltip :title="apiParams.esplifetime.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="[
+            'esplifetime',
+            {
+              initialValue: '3600',
+            },
+          ]"
+          :placeholder="$t('label.vpncustomergateway.esplifetime')"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.dpd') }}
+          <a-tooltip :title="apiParams.dpd.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-switch
+          v-decorator="[
+            'dpd',
+            {
+              initialValue: 'false',
+            },
+          ]"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.forceencap') }}
+          <a-tooltip :title="apiParams.forceencap.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-switch
+          v-decorator="[
+            'forceencap',
+            {
+              initialValue: 'false',
+            },
+          ]"/>
+      </a-form-item>
+      <div class="actions">
+        <a-button @click="closeModal">
+          {{ $t('label.cancel') }}
+        </a-button>
+        <a-button type="primary" @click="handleSubmit">
+          {{ $t('label.ok') }}
+        </a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+export default {
+  name: 'CreateVpnCustomerGateway',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      encryptionAlgo: [
+        'aes128',
+        'aes192',
+        'aes256',
+        '3des'
+      ],
+      hash: [
+        'sha1',
+        'sha256',
+        'sha384',
+        'sha512',
+        'md5'
+      ],
+      DHGroups: {
+        '': 'None',
+        'Group 2': 'modp1024',
+        'Group 5': 'modp1536',
+        'Group 14': 'modp2048',
+        'Group 15': 'modp3072',
+        'Group 16': 'modp4096',
+        'Group 17': 'modp6144',
+        'Group 18': 'modp8192'
+      },
+      ikeDhGroupInitialValue: 'Group 5(modp1536)'
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createVpnCustomerGateway || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  methods: {
+    closeModal () {
+      this.$parent.$parent.close()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        let ikepolicy = values.ikeEncryption + '-' + values.ikeHash + ';'
+        ikepolicy += (values.ikeDh !== this.ikeDhGroupInitialValue) ? values.ikeDh : (values.ikeDh.split('(')[1]).split(')')[0]
+        let esppolicy = values.espEncryption + '-' + values.espHash
+        if (values.perfectForwardSecrecy !== 'None') {
+          esppolicy += ';' + (values.perfectForwardSecrecy)
+        }
+        api('createVpnCustomerGateway', {
+          name: values.name,
+          gateway: values.gateway,
+          cidrlist: values.cidrlist,
+          ipsecpsk: values.ipsecpsk,
+          ikelifetime: values.ikelifetime,
+          esplifetime: values.esplifetime,
+          dpd: values.dpd,
+          forceencap: values.forceencap,
+          ikepolicy: ikepolicy,
+          esppolicy: esppolicy
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.add.vpn.customer.gateway'),
+            jobid: response.createvpncustomergatewayresponse.jobid,
+            description: values.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createvpncustomergatewayresponse.jobid,
+            successMessage: this.$t('message.success.add.vpn.customer.gateway'),
+            successMethod: () => {
+              this.closeModal()
+              this.parentFetchData()
+            },
+            errorMessage: `${this.$t('message.create.vpn.customer.gateway.failed')} ` + response,
+            errorMethod: () => {
+              this.closeModal()
+              this.parentFetchData()
+            },
+            loadingMessage: this.$t('message.add.vpn.customer.gateway.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.closeModal()
+            }
+          })
+          this.closeModal()
+          this.form.resetFields()
+        }).catch(error => {
+          console.error(error)
+          this.$message.error(this.$t('message.success.add.vpn.customer.gateway'))
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 500px;
+}
+
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+  button {
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/network/EgressRulesTab.vue b/ui/src/views/network/EgressRulesTab.vue
new file mode 100644
index 0000000..b77d7c9
--- /dev/null
+++ b/ui/src/views/network/EgressRulesTab.vue
@@ -0,0 +1,352 @@
+// 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>
+    <div>
+      <div class="form">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.sourcecidr') }}</div>
+          <a-input v-model="newRule.cidrlist"></a-input>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.destcidr') }}</div>
+          <a-input v-model="newRule.destcidrlist"></a-input>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.protocol') }}</div>
+          <a-select v-model="newRule.protocol" style="width: 100%;" @change="resetRulePorts">
+            <a-select-option value="tcp">{{ $t('label.tcp') | capitalise }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') | capitalise }}</a-select-option>
+            <a-select-option value="icmp">{{ $t('label.icmp') | capitalise }}</a-select-option>
+            <a-select-option value="all">{{ $t('label.all') }}</a-select-option>
+          </a-select>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.startport') }}</div>
+          <a-input v-model="newRule.startport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.endport') }}</div>
+          <a-input v-model="newRule.endport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmptype') }}</div>
+          <a-input v-model="newRule.icmptype"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmpcode') }}</div>
+          <a-input v-model="newRule.icmpcode"></a-input>
+        </div>
+        <div class="form__item">
+          <a-button :disabled="!('createEgressFirewallRule' in $store.getters.apis)" type="primary" icon="plus" @click="addRule">{{ $t('label.add') }}</a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-divider/>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="egressRules"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <template slot="protocol" slot-scope="record">
+        {{ record.protocol | capitalise }}
+      </template>
+      <template slot="startport" slot-scope="record">
+        {{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : 'All' }}
+      </template>
+      <template slot="endport" slot-scope="record">
+        {{ record.icmpcode || record.endport >= 0 ? record.icmpcode || record.endport : 'All' }}
+      </template>
+      <template slot="actions" slot-scope="record">
+        <a-button :disabled="!('deleteEgressFirewallRule' in $store.getters.apis)" shape="circle" type="danger" icon="delete" @click="deleteRule(record)" />
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'EgressRulesTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: true,
+      egressRules: [],
+      newRule: {
+        protocol: 'tcp',
+        cidrlist: null,
+        destcidrlist: null,
+        networkid: this.resource.id,
+        icmptype: null,
+        icmpcode: null,
+        startport: null,
+        endport: null
+      },
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.sourcecidr'),
+          dataIndex: 'cidrlist'
+        },
+        {
+          title: this.$t('label.destcidr'),
+          dataIndex: 'destcidrlist'
+        },
+        {
+          title: this.$t('label.protocol'),
+          scopedSlots: { customRender: 'protocol' }
+        },
+        {
+          title: this.$t('label.icmptype.start.port'),
+          scopedSlots: { customRender: 'startport' }
+        },
+        {
+          title: this.$t('label.icmpcode.end.port'),
+          scopedSlots: { customRender: 'endport' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return this.$t('label.all')
+      return val.toUpperCase()
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listEgressFirewallRules', {
+        listAll: true,
+        networkid: this.resource.id,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.egressRules = response.listegressfirewallrulesresponse.firewallrule || []
+        this.totalCount = response.listegressfirewallrulesresponse.count || 0
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    deleteRule (rule) {
+      this.loading = true
+      api('deleteEgressFirewallRule', { id: rule.id }).then(response => {
+        this.$pollJob({
+          jobId: response.deleteegressfirewallruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.egress.rule'),
+          successMethod: () => this.fetchData(),
+          errorMessage: this.$t('message.remove.egress.rule.failed'),
+          errorMethod: () => this.fetchData(),
+          loadingMessage: this.$t('message.remove.egress.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => this.fetchData()
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+      })
+    },
+    addRule () {
+      this.loading = true
+      api('createEgressFirewallRule', { ...this.newRule }).then(response => {
+        this.$pollJob({
+          jobId: response.createegressfirewallruleresponse.jobid,
+          successMessage: this.$t('message.success.add.egress.rule'),
+          successMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.add.egress.rule.failed'),
+          errorMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.add.egress.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.resetAllRules()
+        this.fetchData()
+      })
+    },
+    resetAllRules () {
+      this.newRule.protocol = 'tcp'
+      this.newRule.cidrlist = null
+      this.newRule.destcidrlist = null
+      this.newRule.networkid = this.resource.id
+      this.resetRulePorts()
+    },
+    resetRulePorts () {
+      this.newRule.icmptype = null
+      this.newRule.icmpcode = null
+      this.newRule.startport = null
+      this.newRule.endport = null
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .rule {
+
+    &-container {
+      display: flex;
+      width: 100%;
+      flex-wrap: wrap;
+      margin-right: -20px;
+      margin-bottom: -10px;
+    }
+
+    &__item {
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        flex: 1;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+  }
+
+  .add-btn {
+    width: 100%;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    height: auto;
+  }
+
+  .add-actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-right: -20px;
+    margin-bottom: 20px;
+
+    @media (min-width: 760px) {
+      margin-top: 20px;
+    }
+
+    button {
+      margin-right: 20px;
+    }
+
+  }
+
+  .form {
+    display: flex;
+    margin-right: -20px;
+    margin-bottom: 20px;
+    flex-direction: column;
+    align-items: flex-end;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      flex: 1;
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        margin-bottom: 0;
+      }
+
+      input,
+      .ant-select {
+        margin-top: auto;
+      }
+
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+  .pagination {
+    margin-top: 20px;
+  }
+</style>
diff --git a/ui/src/views/network/EnableStaticNat.vue b/ui/src/views/network/EnableStaticNat.vue
new file mode 100644
index 0000000..d03e67b
--- /dev/null
+++ b/ui/src/views/network/EnableStaticNat.vue
@@ -0,0 +1,400 @@
+// 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="list" :loading="loading">
+    <div class="list__header">
+      <div class="list__header__col" v-if="tiersSelect">
+        <a-select @change="handleTierSelect" v-model="vpcTiers" :placeholder="$t('label.select.tier')">
+          <a-select-option v-for="network in networksList" :key="network.id" :value="network.id">
+            {{ network.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+
+      <div class="list__header__col list__header__col--full">
+        <a-input-search
+          :placeholder="$t('label.search')"
+          v-model="searchQuery"
+          @search="fetchData" />
+      </div>
+    </div>
+
+    <a-table
+      size="small"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="vmsList"
+      :pagination="false"
+      :rowKey="record => record.id || record.account">
+      <template slot="name" slot-scope="record">
+        <div>
+          {{ record.name }}
+        </div>
+        <a-select
+          v-if="nicsList.length && selectedVm && selectedVm === record.id"
+          class="nic-select"
+          :defaultValue="selectedNic.ipaddress">
+          <a-select-option
+            @click="selectedNic = item"
+            v-for="item in nicsList"
+            :key="item.id">
+            {{ item.ipaddress }}
+          </a-select-option>
+        </a-select>
+      </template>
+      <template slot="state" slot-scope="text">
+        <status :text="text ? text : ''" displayText />
+      </template>
+      <template slot="radio" slot-scope="text">
+        <a-radio
+          class="list__radio"
+          :value="text"
+          :checked="selectedVm && selectedVm === text"
+          @change="fetchNics"></a-radio>
+      </template>
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="vmsList.length"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <div class="list__footer">
+      <a-button @click="handleClose">{{ $t('label.cancel') }}</a-button>
+      <a-button @click="handleSubmit" type="primary" :disabled="!selectedVm || !selectedNic">{{ $t('label.ok') }}</a-button>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+    Status
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      loading: false,
+      vmsList: [],
+      selectedVm: null,
+      nicsList: [],
+      searchQuery: null,
+      selectedNic: null,
+      columns: [
+        {
+          title: this.$t('label.name'),
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.displayname'),
+          dataIndex: 'displayname'
+        },
+        {
+          title: this.$t('label.account'),
+          dataIndex: 'account'
+        },
+        {
+          title: this.$t('label.zonenamelabel'),
+          dataIndex: 'zonename'
+        },
+        {
+          title: this.$t('label.select'),
+          dataIndex: 'id',
+          scopedSlots: { customRender: 'radio' }
+        }
+      ],
+      tiersSelect: false,
+      networksList: [],
+      vpcTiers: [],
+      selectedVpcTier: null,
+      page: 1,
+      pageSize: 10
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      if (this.resource.vpcid) {
+        this.handleTiers()
+        if (this.selectedVpcTier) this.fetchDataTiers(this.selectedVpcTier)
+        return
+      }
+
+      this.loading = true
+      api('listVirtualMachines', {
+        page: this.page,
+        pageSize: this.pageSize,
+        listAll: true,
+        networkid: this.resource.associatednetworkid,
+        account: this.resource.account,
+        domainid: this.resource.domainid,
+        keyword: this.searchQuery
+      }).then(response => {
+        this.vmsList = response.listvirtualmachinesresponse.virtualmachine || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchDataTiers (e) {
+      this.loading = true
+      api('listVirtualMachines', {
+        page: this.page,
+        pageSize: this.pageSize,
+        listAll: true,
+        networkid: e,
+        account: this.resource.account,
+        domainid: this.resource.domainid,
+        vpcid: this.resource.vpcid,
+        keyword: this.searchQuery
+      }).then(response => {
+        this.vmsList = response.listvirtualmachinesresponse.virtualmachine || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchNics (e) {
+      this.selectedVm = e.target.value
+      this.nicsList = []
+      this.loading = true
+      api('listNics', {
+        virtualmachineid: this.selectedVm,
+        networkid: this.resource.associatednetworkid || this.selectedVpcTier
+      }).then(response => {
+        this.nicsList = response.listnicsresponse.nic || []
+
+        let secondaryIps = this.nicsList.map(item => item.secondaryip)
+
+        if (secondaryIps[0]) {
+          secondaryIps = secondaryIps[0]
+          this.nicsList = [...this.nicsList, ...secondaryIps]
+        }
+
+        this.selectedNic = this.nicsList[0]
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchNetworks () {
+      this.loading = true
+      api('listNetworks', {
+        vpcid: this.resource.vpcid,
+        domainid: this.resource.domainid,
+        account: this.resource.account,
+        supportedservices: 'StaticNat'
+      }).then(response => {
+        this.networksList = response.listnetworksresponse.network
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit () {
+      this.loading = true
+      api('enableStaticNat', {
+        ipaddressid: this.resource.id,
+        virtualmachineid: this.selectedVm,
+        vmguestip: this.selectedNic.ipaddress,
+        networkid: this.selectedVpcTier
+      }).then(() => {
+        this.parentFetchData()
+        this.handleClose()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleClose () {
+      this.$parent.$parent.close()
+    },
+    handleTiers () {
+      this.tiersSelect = true
+      this.fetchNetworks()
+    },
+    handleTierSelect (tier) {
+      this.selectedVpcTier = tier
+      this.fetchDataTiers(tier)
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+
+  .list {
+    max-height: 95vh;
+    width: 95vw;
+    overflow-y: scroll;
+    margin: -24px;
+
+    @media (min-width: 1000px) {
+      max-height: 70vh;
+      width: 900px;
+    }
+
+    &__header,
+    &__footer {
+      padding: 20px;
+    }
+
+    &__header {
+      display: flex;
+
+      .ant-select {
+        min-width: 200px;
+      }
+
+      &__col {
+
+        &:not(:last-child) {
+          margin-right: 20px;
+        }
+
+        &--full {
+          flex: 1;
+        }
+
+      }
+
+    }
+
+    &__footer {
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        &:not(:last-child) {
+          margin-right: 10px;
+        }
+      }
+    }
+
+    &__item {
+      padding-right: 20px;
+      padding-left: 20px;
+
+      &--selected {
+        background-color: #e6f7ff;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__outer-container {
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+    }
+
+    &__container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      cursor: pointer;
+
+      @media (min-width: 760px) {
+        flex-direction: row;
+        align-items: center;
+      }
+
+    }
+
+    &__row {
+      margin-bottom: 10px;
+
+      @media (min-width: 760px) {
+        margin-right: 20px;
+        margin-bottom: 0;
+      }
+    }
+
+    &__radio {
+      display: flex;
+      justify-content: flex-end;
+    }
+
+  }
+
+  .nic-select {
+    margin-top: 10px;
+    margin-right: auto;
+    min-width: 150px;
+  }
+
+  .pagination {
+    margin-top: 20px;
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+
+  .table {
+    margin-top: 20px;
+    overflow-y: auto;
+  }
+
+  /deep/ .ant-table-small {
+    border: 0
+  }
+</style>
diff --git a/ui/src/views/network/FirewallRules.vue b/ui/src/views/network/FirewallRules.vue
new file mode 100644
index 0000000..48e30a6
--- /dev/null
+++ b/ui/src/views/network/FirewallRules.vue
@@ -0,0 +1,524 @@
+// 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>
+    <div>
+      <div class="form">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.sourcecidr') }}</div>
+          <a-input v-model="newRule.cidrlist"></a-input>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.protocol') }}</div>
+          <a-select v-model="newRule.protocol" style="width: 100%;" @change="resetRulePorts">
+            <a-select-option value="tcp">{{ $t('label.tcp') }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') }}</a-select-option>
+            <a-select-option value="icmp">{{ $t('label.icmp') }}</a-select-option>
+          </a-select>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.startport') }}</div>
+          <a-input v-model="newRule.startport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.endport') }}</div>
+          <a-input v-model="newRule.endport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmptype') }}</div>
+          <a-input v-model="newRule.icmptype"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmpcode') }}</div>
+          <a-input v-model="newRule.icmpcode"></a-input>
+        </div>
+        <div class="form__item" style="margin-left: auto;">
+          <a-button :disabled="!('createFirewallRule' in $store.getters.apis)" type="primary" @click="addRule">{{ $t('label.add') }}</a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-divider/>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="firewallRules"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <template slot="protocol" slot-scope="record">
+        {{ record.protocol | capitalise }}
+      </template>
+      <template slot="startport" slot-scope="record">
+        {{ record.icmptype || record.startport >= 0 ? record.icmptype || record.startport : $t('label.all') }}
+      </template>
+      <template slot="endport" slot-scope="record">
+        {{ record.icmpcode || record.endport >= 0 ? record.icmpcode || record.endport : $t('label.all') }}
+      </template>
+      <template slot="actions" slot-scope="record">
+        <div class="actions">
+          <a-button shape="circle" icon="tag" class="rule-action" @click="() => openTagsModal(record.id)" />
+          <a-button
+            shape="circle"
+            type="danger"
+            icon="delete"
+            class="rule-action"
+            :disabled="!('deleteFirewallRule' in $store.getters.apis)"
+            @click="deleteRule(record)" />
+        </div>
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      :title="$t('label.edit.tags')"
+      v-model="tagsModalVisible"
+      :footer="null"
+      :afterClose="closeModal"
+      :maskClosable="false">
+      <div class="add-tags">
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.key') }}</p>
+          <a-input v-model="newTag.key"></a-input>
+        </div>
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.value') }}</p>
+          <a-input v-model="newTag.value"></a-input>
+        </div>
+        <a-button type="primary" :disabled="!('createTags' in $store.getters.apis)" @click="() => handleAddTag()" :loading="addTagLoading">{{ $t('label.add') }}</a-button>
+      </div>
+
+      <a-divider></a-divider>
+
+      <div class="tags-container">
+        <template class="tags" v-for="(tag) in tags">
+          <a-tag :key="tag.key" :closable="'deleteTags' in $store.getters.apis" :afterClose="() => handleDeleteTag(tag)">
+            {{ tag.key }} = {{ tag.value }}
+          </a-tag>
+        </template>
+      </div>
+
+      <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.done') }}</a-button>
+    </a-modal>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      loading: true,
+      addTagLoading: false,
+      firewallRules: [],
+      newRule: {
+        protocol: 'tcp',
+        cidrlist: null,
+        ipaddressid: this.resource.id,
+        icmptype: null,
+        icmpcode: null,
+        startport: null,
+        endport: null
+      },
+      tagsModalVisible: false,
+      selectedRule: null,
+      tags: [],
+      newTag: {
+        key: null,
+        value: null
+      },
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.sourcecidr'),
+          dataIndex: 'cidrlist'
+        },
+        {
+          title: this.$t('label.protocol'),
+          scopedSlots: { customRender: 'protocol' }
+        },
+        {
+          title: `${this.$t('label.startport')}/${this.$t('label.icmptype')}`,
+          scopedSlots: { customRender: 'startport' }
+        },
+        {
+          title: `${this.$t('label.endport')}/${this.$t('label.icmpcode')}`,
+          scopedSlots: { customRender: 'endport' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state'
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return 'All'
+      return val.toUpperCase()
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listFirewallRules', {
+        listAll: true,
+        ipaddressid: this.resource.id,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.firewallRules = response.listfirewallrulesresponse.firewallrule || []
+        this.totalCount = response.listfirewallrulesresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    deleteRule (rule) {
+      this.loading = true
+      api('deleteFirewallRule', { id: rule.id }).then(response => {
+        this.$pollJob({
+          jobId: response.deletefirewallruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.firewall.rule'),
+          successMethod: () => this.fetchData(),
+          errorMessage: this.$t('message.remove.firewall.rule.failed'),
+          errorMethod: () => this.fetchData(),
+          loadingMessage: this.$t('message.remove.firewall.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => this.fetchData()
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+      })
+    },
+    addRule () {
+      this.loading = true
+      api('createFirewallRule', { ...this.newRule }).then(response => {
+        this.$pollJob({
+          jobId: response.createfirewallruleresponse.jobid,
+          successMessage: this.$t('message.success.add.firewall.rule'),
+          successMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.add.firewall.rule.failed'),
+          errorMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.add.firewall.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.resetAllRules()
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.resetAllRules()
+        this.fetchData()
+      })
+    },
+    resetAllRules () {
+      this.newRule.protocol = 'tcp'
+      this.newRule.cidrlist = null
+      this.newRule.networkid = this.resource.id
+      this.resetRulePorts()
+    },
+    resetRulePorts () {
+      this.newRule.icmptype = null
+      this.newRule.icmpcode = null
+      this.newRule.startport = null
+      this.newRule.endport = null
+    },
+    closeModal () {
+      this.selectedRule = null
+      this.tagsModalVisible = false
+      this.newTag.key = null
+      this.newTag.value = null
+    },
+    openTagsModal (id) {
+      this.selectedRule = id
+      this.tagsModalVisible = true
+      api('listTags', {
+        resourceId: id,
+        resourceType: 'FirewallRule',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag || []
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    handleAddTag () {
+      this.addTagLoading = true
+      api('createTags', {
+        'tags[0].key': this.newTag.key,
+        'tags[0].value': this.newTag.value,
+        resourceIds: this.selectedRule,
+        resourceType: 'FirewallRule'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createtagsresponse.jobid,
+          successMessage: this.$t('message.success.add.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.openTagsModal(this.selectedRule)
+          },
+          errorMessage: this.$t('message.add.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.add.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.addTagLoading = false
+      })
+    },
+    handleDeleteTag (tag) {
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: this.selectedRule,
+        resourceType: 'FirewallRule'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.openTagsModal(this.selectedRule)
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .rule {
+
+    &-container {
+      display: flex;
+      width: 100%;
+      flex-wrap: wrap;
+      margin-right: -20px;
+      margin-bottom: -10px;
+    }
+
+    &__item {
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        flex: 1;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+  }
+
+  .add-btn {
+    width: 100%;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    height: auto;
+  }
+
+  .add-actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-right: -20px;
+    margin-bottom: 20px;
+
+    @media (min-width: 760px) {
+      margin-top: 20px;
+    }
+
+    button {
+      margin-right: 20px;
+    }
+
+  }
+
+  .form {
+    display: flex;
+    align-items: flex-end;
+    margin-right: -20px;
+    flex-direction: column;
+    margin-bottom: 20px;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      /*flex: 1;*/
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        margin-bottom: 0;
+      }
+
+      input,
+      .ant-select {
+        margin-top: auto;
+      }
+
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+
+  .rule-action {
+
+    &:not(:last-of-type) {
+      margin-right: 10px;
+    }
+
+  }
+
+  .tags {
+    margin-bottom: 10px;
+  }
+
+  .add-tags {
+    display: flex;
+    align-items: flex-end;
+    justify-content: space-between;
+
+    &__input {
+      margin-right: 10px;
+    }
+
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+
+  }
+
+  .tags-container {
+    display: flex;
+    flex-wrap: wrap;
+    margin-bottom: 10px;
+  }
+
+  .add-tags-done {
+    display: block;
+    margin-left: auto;
+  }
+  .pagination {
+    margin-top: 20px;
+  }
+
+</style>
diff --git a/ui/src/views/network/GuestIpRanges.vue b/ui/src/views/network/GuestIpRanges.vue
new file mode 100644
index 0000000..a2e364a
--- /dev/null
+++ b/ui/src/views/network/GuestIpRanges.vue
@@ -0,0 +1,196 @@
+// 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>
+    <a-spin :spinning="fetchLoading">
+      <a-button
+        icon="plus"
+        shape="round"
+        style="float: right;margin-bottom: 10px; z-index: 8"
+        @click="() => { showCreateForm = true }">
+        {{ $t('label.add.ip.range') }}
+      </a-button>
+      <br />
+      <br />
+
+      <a-table
+        size="small"
+        style="overflow-y: auto; width: 100%;"
+        :columns="columns"
+        :dataSource="ipranges"
+        :rowKey="item => item.id"
+        :pagination="false" >
+
+        <template slot="action" slot-scope="text, record">
+          <a-tooltip placement="bottom">
+            <template slot="title">
+              {{ $t('label.action.delete.ip.range') }}
+            </template>
+            <a-popconfirm
+              :title="$t('message.confirm.remove.ip.range')"
+              @confirm="removeIpRange(record.id)"
+              :okText="$t('label.yes')"
+              :cancelText="$t('label.no')" >
+              <a-button
+                type="danger"
+                icon="delete"
+                shape="circle" />
+            </a-popconfirm>
+          </a-tooltip>
+        </template>
+
+      </a-table>
+      <a-divider/>
+      <a-pagination
+        class="row-element pagination"
+        size="small"
+        :current="page"
+        :pageSize="pageSize"
+        :total="total"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100']"
+        @change="changePage"
+        @showSizeChange="changePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </a-spin>
+    <a-modal
+      v-if="showCreateForm"
+      :visible="showCreateForm"
+      :title="$t('label.add.ip.range')"
+      :maskClosable="false"
+      :footer="null"
+      :cancelText="$t('label.cancel')"
+      @cancel="() => { showCreateForm = false }"
+      centered
+      width="auto">
+      <CreateVlanIpRange
+        :resource="resource"
+        @refresh-data="fetchData"
+        @close-action="showCreateForm = false" />
+    </a-modal>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+import CreateVlanIpRange from '@/views/network/CreateVlanIpRange'
+export default {
+  name: 'GuestIpRanges',
+  components: {
+    CreateVlanIpRange
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      showCreateForm: false,
+      total: 0,
+      ipranges: [],
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.startipv4'),
+          dataIndex: 'startip'
+        },
+        {
+          title: this.$t('label.endipv4'),
+          dataIndex: 'endip'
+        },
+        {
+          title: this.$t('label.startipv6'),
+          dataIndex: 'startipv6'
+        },
+        {
+          title: this.$t('label.endipv6'),
+          dataIndex: 'endipv6'
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: '',
+          scopedSlots: { customRender: 'action' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {
+        zoneid: this.resource.zoneid,
+        networkid: this.resource.id,
+        listall: true,
+        page: this.page,
+        pagesize: this.pageSize
+      }
+      this.fetchLoading = true
+      api('listVlanIpRanges', params).then(json => {
+        this.total = json.listvlaniprangesresponse.count || 0
+        this.ipranges = json.listvlaniprangesresponse.vlaniprange || []
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    removeIpRange (id) {
+      api('deleteVlanIpRange', { id: id }).then(json => {
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/network/IngressEgressRuleConfigure.vue b/ui/src/views/network/IngressEgressRuleConfigure.vue
new file mode 100644
index 0000000..7b9965a
--- /dev/null
+++ b/ui/src/views/network/IngressEgressRuleConfigure.vue
@@ -0,0 +1,536 @@
+// 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>
+
+    <div>
+      <div style="margin-bottom: 20px;">
+        <div class="form__label">{{ $t('label.add.by') }}:</div>
+        <a-radio-group @change="resetAllRules" v-model="addType">
+          <a-radio value="cidr">{{ $t('label.cidr') }}</a-radio>
+          <a-radio value="account">{{ $t('label.account') }}</a-radio>
+        </a-radio-group>
+      </div>
+
+      <div class="form">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.protocol') }}</div>
+          <a-select v-model="newRule.protocol" style="width: 100%;" @change="resetRulePorts">
+            <a-select-option value="tcp">{{ $t('label.tcp') | capitalise }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') | capitalise }}</a-select-option>
+            <a-select-option value="icmp">{{ $t('label.icmp') | capitalise }}</a-select-option>
+            <a-select-option value="all">{{ $t('label.all') | capitalise }}</a-select-option>
+            <a-select-option value="protocolnumber">{{ $t('label.protocol.number') | capitalise }}</a-select-option>
+          </a-select>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.startport') }}</div>
+          <a-input v-model="newRule.startport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'tcp' || newRule.protocol === 'udp'" class="form__item">
+          <div class="form__label">{{ $t('label.endport') }}</div>
+          <a-input v-model="newRule.endport"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'protocolnumber'" class="form__item">
+          <div class="form__label">{{ $t('label.protocol.number') }}</div>
+          <a-input v-model="newRule.protocolnumber"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmptype') }}</div>
+          <a-input v-model="newRule.icmptype"></a-input>
+        </div>
+        <div v-show="newRule.protocol === 'icmp'" class="form__item">
+          <div class="form__label">{{ $t('label.icmpcode') }}</div>
+          <a-input v-model="newRule.icmpcode"></a-input>
+        </div>
+        <div class="form__item" v-if="addType === 'cidr'">
+          <div class="form__label">{{ $t('label.cidr') }}</div>
+          <a-input v-model="newRule.cidrlist"></a-input>
+        </div>
+        <template v-if="addType === 'account'">
+          <div class="form__item">
+            <div class="form__label">{{ $t('label.account') }}</div>
+            <a-input v-model="newRule.usersecuritygrouplist.account" style="margin-right: 10px;"></a-input>
+          </div>
+          <div class="form__item">
+            <div class="form__label">{{ $t('label.securitygroup') }}</div>
+            <a-input v-model="newRule.usersecuritygrouplist.group"></a-input>
+          </div>
+        </template>
+        <div class="form__item" style="flex: 0">
+          <a-button :disabled="!('authorizeSecurityGroupInress' in $store.getters.apis) && !('authorizeSecurityGroupEgress' in $store.getters.apis)" type="primary" @click="handleAddRule">{{ $t('label.add') }}</a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :columns="columns"
+      :dataSource="rules"
+      :pagination="{ pageSizeOptions: ['10', '20', '40', '80', '100', '200'], showSizeChanger: true}"
+      :rowKey="record => record.ruleid">
+      <template slot="protocol" slot-scope="record">
+        {{ record.protocol | capitalise }}
+      </template>
+      <template slot="account" slot-scope="record">
+        <div v-if="record.account && record.securitygroupname">
+          {{ record.account }} - {{ record.securitygroupname }}
+        </div>
+      </template>
+      <template slot="startport" slot-scope="text, record">
+        <div v-if="!['tcp', 'udp', 'icmp'].includes(record.protocol)">{{ $t('label.all') }}</div>
+        <div v-else>{{ text }}</div>
+      </template>
+      <template slot="endport" slot-scope="text, record">
+        <div v-if="!['tcp', 'udp', 'icmp'].includes(record.protocol)">{{ $t('label.all') }}</div>
+        <div v-else>{{ text }}</div>
+      </template>
+      <template slot="actions" slot-scope="record">
+        <a-button shape="circle" icon="tag" class="rule-action" @click="() => openTagsModal(record)" />
+        <a-popconfirm
+          :title="$t('label.delete') + '?'"
+          @confirm="handleDeleteRule(record)"
+          :okText="$t('label.yes')"
+          :cancelText="$t('label.no')"
+        >
+          <a-button :disabled="!('revokeSecurityGroupIngress' in $store.getters.apis) && !('revokeSecurityGroupEgress' in $store.getters.apis)" shape="circle" type="danger" icon="delete" class="rule-action" />
+        </a-popconfirm>
+      </template>
+    </a-table>
+
+    <a-modal
+      :title="$t('label.edit.tags')"
+      v-model="tagsModalVisible"
+      :footer="null"
+      :afterClose="closeModal"
+      :maskClosable="false">
+      <a-spin v-if="tagsLoading"></a-spin>
+
+      <div v-else>
+        <a-form :form="newTagsForm" class="add-tags" @submit="handleAddTag">
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.key') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['key', { rules: [{ required: true, message: this.$t('message.specifiy.tag.key')}] }]" />
+            </a-form-item>
+          </div>
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.value') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['value', { rules: [{ required: true, message: this.$t('message.specifiy.tag.value')}] }]" />
+            </a-form-item>
+          </div>
+          <a-button type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
+        </a-form>
+
+        <a-divider style="margin-top: 0;"></a-divider>
+
+        <div class="tags-container">
+          <div class="tags" v-for="(tag, index) in tags" :key="index">
+            <a-tag :key="index" :closable="true" :afterClose="() => handleDeleteTag(tag)">
+              {{ tag.key }} = {{ tag.value }}
+            </a-tag>
+          </div>
+        </div>
+
+        <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </a-modal>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      rules: [],
+      newRule: {
+        protocol: 'tcp',
+        startport: null,
+        endport: null,
+        protocolnumber: null,
+        cidrlist: null,
+        icmptype: null,
+        icmpcode: null,
+        usersecuritygrouplist: {
+          account: null,
+          group: null
+        }
+      },
+      newTagsForm: this.$form.createForm(this),
+      tagsModalVisible: false,
+      tags: [],
+      newTag: {
+        key: null,
+        value: null
+      },
+      selectedRule: null,
+      tagsLoading: false,
+      addType: 'cidr',
+      tabType: null,
+      page: 1,
+      pagesize: 10,
+      columns: [
+        {
+          title: this.$t('label.protocol'),
+          scopedSlots: { customRender: 'protocol' }
+        },
+        {
+          title: this.$t('label.startport'),
+          dataIndex: 'startport',
+          scopedSlots: { customRender: 'startport' }
+        },
+        {
+          title: this.$t('label.endport'),
+          dataIndex: 'endport',
+          scopedSlots: { customRender: 'endport' }
+        },
+        {
+          title: this.$t('label.icmptype'),
+          dataIndex: 'icmptype'
+        },
+        {
+          title: this.$t('label.icmpcode'),
+          dataIndex: 'icmpcode'
+        },
+        {
+          title: this.$t('label.cidr'),
+          dataIndex: 'cidr'
+        },
+        {
+          title: this.$t('label.account.and.security.group'),
+          scopedSlots: { customRender: 'account' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ]
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return this.$t('label.all')
+      return val.toUpperCase()
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.tabType = this.$parent.tab === 'Ingress Rule' ? 'ingress' : 'egress'
+      this.rules = this.tabType === 'ingress' ? this.resource.ingressrule : this.resource.egressrule
+    },
+    handleAddRule () {
+      this.parentToggleLoading()
+      api(this.tabType === 'ingress' ? 'authorizeSecurityGroupIngress' : 'authorizeSecurityGroupEgress', {
+        securitygroupid: this.resource.id,
+        domainid: this.resource.domainid,
+        account: this.resource.account,
+        protocol: this.newRule.protocol === 'protocolnumber' ? this.newRule.protocolnumber : this.newRule.protocol,
+        startport: this.newRule.startport,
+        endport: this.newRule.endport,
+        cidrlist: this.newRule.cidrlist,
+        icmptype: this.newRule.icmptype,
+        icmpcode: this.newRule.icmpcode,
+        'usersecuritygrouplist[0].account': this.newRule.usersecuritygrouplist.account,
+        'usersecuritygrouplist[0].group': this.newRule.usersecuritygrouplist.group
+      }).then(response => {
+        this.$pollJob({
+          jobId: this.tabType === 'ingress' ? response.authorizesecuritygroupingressresponse.jobid
+            : response.authorizesecuritygroupegressresponse.jobid,
+          successMessage: this.$t('message.success.add.rule'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          errorMessage: this.$t('message.add.rule.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          loadingMessage: this.$t('message.add.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.parentToggleLoading()
+      })
+    },
+    handleDeleteRule (rule) {
+      this.parentToggleLoading()
+      api(this.tabType === 'ingress' ? 'revokeSecurityGroupIngress' : 'revokeSecurityGroupEgress', {
+        id: rule.ruleid,
+        domainid: this.resource.domainid,
+        account: this.resource.account
+      }).then(response => {
+        this.$pollJob({
+          jobId: this.tabType === 'ingress' ? response.revokesecuritygroupingressresponse.jobid
+            : response.revokesecuritygroupegressresponse.jobid,
+          successMessage: this.$t('message.success.remove.rule'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          errorMessage: this.$t('message.remove.rule.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          loadingMessage: this.$t('message.remove.securitygroup.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.parentToggleLoading()
+      })
+    },
+    fetchTags (rule) {
+      api('listTags', {
+        resourceId: rule.ruleid,
+        resourceType: 'SecurityGroupRule',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleDeleteTag (tag) {
+      this.parentToggleLoading()
+      this.tagsLoading = true
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: this.selectedRule.ruleid,
+        resourceType: 'SecurityGroupRule'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.parentToggleLoading()
+        this.tagsLoading = false
+      })
+    },
+    handleAddTag (e) {
+      this.tagsLoading = true
+
+      e.preventDefault()
+      this.newTagsForm.validateFields((err, values) => {
+        if (err) {
+          this.tagsLoading = false
+          return
+        }
+
+        this.parentToggleLoading()
+        api('createTags', {
+          'tags[0].key': values.key,
+          'tags[0].value': values.value,
+          resourceIds: this.selectedRule.ruleid,
+          resourceType: 'SecurityGroupRule'
+        }).then(response => {
+          this.$pollJob({
+            jobId: response.createtagsresponse.jobid,
+            successMessage: this.$t('message.success.add.tag'),
+            successMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            },
+            errorMessage: this.$t('message.add.tag.failed'),
+            errorMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            },
+            loadingMessage: this.$t('message.add.tag.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+          this.parentToggleLoading()
+          this.tagsLoading = false
+        })
+      })
+    },
+    openTagsModal (rule) {
+      this.selectedRule = rule
+      this.newTagsForm.resetFields()
+      this.fetchTags(this.selectedRule)
+      this.tagsModalVisible = true
+    },
+    closeModal () {
+      this.newTag.key = null
+      this.newTag.value = null
+      this.selectedRule = null
+    },
+    resetRulePorts () {
+      this.newRule.startport = null
+      this.newRule.endport = null
+      this.newRule.icmptype = null
+      this.newRule.icmpcode = null
+    },
+    resetAllRules () {
+      this.newRule.protocol = 'tcp'
+      this.newRule.cidrlist = null
+      this.newRule.usersecuritygrouplist.account = null
+      this.newRule.usersecuritygrouplist.group = null
+      this.resetRulePorts()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .list {
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__col {
+      flex: 1;
+    }
+
+  }
+
+  .actions {
+    display: flex;
+    align-items: center;
+  }
+
+  .form {
+    display: flex;
+    align-items: flex-end;
+    margin-right: -20px;
+    flex-direction: column;
+    margin-bottom: 20px;
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+    &__item {
+      display: flex;
+      flex-direction: column;
+      flex: 1;
+      padding-right: 20px;
+      margin-bottom: 20px;
+      @media (min-width: 760px) {
+        margin-bottom: 0;
+      }
+      input,
+      .ant-select {
+        margin-top: auto;
+      }
+    }
+    &__label {
+      font-weight: bold;
+    }
+  }
+
+  .rule-action {
+    &:not(:last-of-type) {
+      margin-right: 10px;
+    }
+  }
+  .tags {
+    margin-bottom: 10px;
+  }
+  .add-tags {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    &__input {
+      margin-right: 10px;
+    }
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+  }
+  .tags-container {
+    display: flex;
+    flex-wrap: wrap;
+    margin-bottom: 10px;
+  }
+  .add-tags-done {
+    display: block;
+    margin-left: auto;
+  }
+</style>
diff --git a/ui/src/views/network/InternalLBAssignVmForm.vue b/ui/src/views/network/InternalLBAssignVmForm.vue
new file mode 100644
index 0000000..b1e1fa2
--- /dev/null
+++ b/ui/src/views/network/InternalLBAssignVmForm.vue
@@ -0,0 +1,283 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <div>
+      <div class="vm-modal__header">
+        <span style="min-width: 200px;">{{ $t('label.name') }}</span>
+        <span>{{ $t('label.state') }}</span>
+        <span>{{ $t('label.instancename') }}</span>
+        <span>{{ $t('label.displayname') }}</span>
+        <span>{{ $t('label.ip') }}</span>
+        <span>{{ $t('label.account') }}</span>
+        <span>{{ $t('label.zonenamelabel') }}</span>
+        <span>{{ $t('label.select') }}</span>
+      </div>
+
+      <a-checkbox-group style="width: 100%;">
+        <div v-for="(vm, index) in vms" :key="index" class="vm-modal__item">
+          <span style="min-width: 200px;">
+            <span>
+              {{ vm.name }}
+            </span>
+            <a-icon v-if="addVmModalNicLoading" type="loading"></a-icon>
+            <a-select
+              v-else-if="!addVmModalNicLoading && iLb.virtualmachineid[index] === vm.id"
+              mode="multiple"
+              v-model="iLb.vmguestip[index]"
+            >
+              <a-select-option v-for="(nic, nicIndex) in nics[index]" :key="nic" :value="nic">
+                {{ nic }}{{ nicIndex === 0 ? ` (${this.$t('label.primary')})` : null }}
+              </a-select-option>
+            </a-select>
+          </span>
+          <span><status :text="vm.state" displayText /></span>
+          <span>{{ vm.instancename }}</span>
+          <span>{{ vm.displayname }}</span>
+          <span></span>
+          <span>{{ vm.account }}</span>
+          <span>{{ vm.zonename }}</span>
+          <a-checkbox :value="vm.id" @change="e => fetchNics(e, index)" />
+        </div>
+        <a-divider/>
+        <a-pagination
+          class="row-element pagination"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="vmCounts"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+      </a-checkbox-group>
+    </div>
+    <div class="actions">
+      <a-button @click="closeModal">
+        {{ $t('label.cancel') }}
+      </a-button>
+      <a-button type="primary" @click="handleSubmit">
+        {{ $t('label.ok') }}
+      </a-button>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'InternalLBAssignVmForm',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      page: 1,
+      pageSize: 10,
+      vmCounts: 0,
+      addVmModalNicLoading: false,
+      vms: [],
+      nics: [],
+      params: {},
+      assignedVMs: [],
+      iLb: {
+        virtualmachineid: [],
+        vmguestip: []
+      },
+      fetchLoading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchLoadBalancers()
+      this.fetchVirtualMachines()
+    },
+    fetchLoadBalancers () {
+      this.fetchLoading = true
+      api('listLoadBalancers', {
+        id: this.resource.id
+      }).then(response => {
+        const lb = response.listloadbalancersresponse.loadbalancer
+        this.assignedVMs = []
+        if (Array.isArray(lb) && lb.length) {
+          this.assignedVMs = lb[0].loadbalancerinstance || []
+        }
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    differenceBy (array1, array2, key) {
+      return array1.filter(a => !array2.some(b => b[key] === a[key]))
+    },
+    fetchVirtualMachines () {
+      this.fetchLoading = true
+      api('listVirtualMachines', {
+        listAll: true,
+        networkid: this.resource.networkid,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        var vms = response.listvirtualmachinesresponse.virtualmachine || []
+        this.vms = this.differenceBy(vms, this.assignedVMs, 'id')
+        this.vmCounts = this.vms.length || 0
+        this.vms.forEach((vm, index) => {
+          this.iLb.virtualmachineid[index] = null
+          this.nics[index] = null
+          this.iLb.vmguestip[index] = null
+        })
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchNics (e, index) {
+      if (!e.target.checked) {
+        this.iLb.virtualmachineid[index] = null
+        this.nics[index] = null
+        this.iLb.vmguestip[index] = null
+        return
+      }
+      this.iLb.virtualmachineid[index] = e.target.value
+      this.addVmModalNicLoading = true
+      api('listNics', {
+        virtualmachineid: e.target.value,
+        networkid: this.resource.networkid
+      }).then(response => {
+        if (!response.listnicsresponse.nic[0]) return
+        const newItem = []
+        newItem.push(response.listnicsresponse.nic[0].ipaddress)
+        if (response.listnicsresponse.nic[0].secondaryip) {
+          newItem.push(...response.listnicsresponse.nic[0].secondaryip.map(ip => ip.ipaddress))
+        }
+        this.nics[index] = newItem
+        this.iLb.vmguestip[index] = this.nics[index][0]
+        this.addVmModalNicLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    closeModal () {
+      this.$emit('close-action')
+    },
+    handleSubmit () {
+      var j = 0
+      this.params = {}
+      for (var i = 0; i < this.iLb.virtualmachineid.length; i++) {
+        if (this.iLb.virtualmachineid[i] !== null) {
+          this.params['vmidipmap[' + j + '].vmid'] = this.iLb.virtualmachineid[i]
+          this.params['vmidipmap[' + j + '].vmip'] = this.iLb.vmguestip[i]
+          j++
+        }
+      }
+      this.params.id = this.resource.id
+      this.fetchLoading = true
+      api('assignToLoadBalancerRule', this.params).then(response => {
+        this.$pollJob({
+          jobId: response.assigntoloadbalancerruleresponse.jobid,
+          successMessage: `${this.$t('message.success.assigned.vms')} ${this.$t('label.to')} ${this.resource.name}`,
+          successMethod: () => {
+            this.$emit('refresh-data')
+          },
+          errorMessage: `${this.$t('message.failed.to.assign.vms')} ${this.$t('label.to')} ${this.resource.name}`,
+          errorMethod: () => {
+            this.$emit('refresh-data')
+          },
+          loadingMessage: `${this.$t('label.assigning.vms')} ${this.$t('label.to')} ${this.resource.name}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+        this.$emit('refresh-data')
+        this.closeModal()
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+.vm-modal {
+
+  &__header {
+    display: flex;
+
+    span {
+      flex: 1;
+      font-weight: bold;
+      margin-right: 10px;
+    }
+  }
+
+  &__item {
+    display: flex;
+    margin-top: 10px;
+
+    span,
+    label {
+      display: block;
+      flex: 1;
+      margin-right: 10px;
+    }
+  }
+}
+
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+
+  button {
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/network/InternalLBAssignedVmTab.vue b/ui/src/views/network/InternalLBAssignedVmTab.vue
new file mode 100644
index 0000000..9971a40
--- /dev/null
+++ b/ui/src/views/network/InternalLBAssignedVmTab.vue
@@ -0,0 +1,162 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-table
+      size="small"
+      style="overflow-y: auto; margin-bottom: 15px"
+      :columns="columns"
+      :dataSource="assignedVms"
+      :rowKey="item => item.id"
+      :pagination="false"
+    >
+      <template slot="displayname" slot-scope="text, record">
+        <router-link :to="{ path: '/vm/' + record.id }">{{ record.displayname || record.name }}</router-link>
+      </template>
+      <template slot="ipaddress" slot-scope="text, record">
+        <span v-for="nic in record.nic" :key="nic.id">
+          <span v-if="nic.networkid === resource.networkid">
+            {{ nic.ipaddress }} <br/>
+          </span>
+        </span>
+      </template>
+      <template slot="remove" slot-scope="text, record">
+        <a-button
+          type="danger"
+          icon="delete"
+          shape="circle"
+          @click="removeVmFromLB(record)" />
+      </template>
+      <a-divider />
+    </a-table>
+    <a-pagination
+      class="row-element pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalInstances"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="changePage"
+      @showSizeChange="changePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+  </a-spin>
+</template>
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'InternalLBAssignedVmTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      assignedVms: [],
+      page: 1,
+      pageSize: 10,
+      totalInstances: 0,
+      columns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'displayname',
+          scopedSlots: { customRender: 'displayname' }
+        },
+        {
+          title: this.$t('label.ipaddress'),
+          dataIndex: 'ipaddress',
+          scopedSlots: { customRender: 'ipaddress' }
+        },
+        {
+          title: '',
+          scopedSlots: { customRender: 'remove' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchLoading = true
+      api('listLoadBalancerRuleInstances', {
+        id: this.resource.id,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(response => {
+        this.totalInstances = response.listloadbalancerruleinstancesresponse.count || 0
+        this.assignedVms = response.listloadbalancerruleinstancesresponse.loadbalancerruleinstance || []
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    removeVmFromLB (vm) {
+      this.fetchLoading = true
+      api('removeFromLoadBalancerRule', {
+        id: this.resource.id,
+        virtualmachineids: vm.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.removefromloadbalancerruleresponse.jobid,
+          successMessage: `${this.$t('message.success.remove.ip')} ${vm.name} ${this.$t('label.from')} ${this.resource.name}`,
+          successMethod: () => {
+            this.fetchLoading = false
+            this.fetchData()
+          },
+          errorMessage: `${this.$t('message.failed.to.remove')} ${vm.name} ${this.$t('label.from.lb')}`,
+          errorMethod: () => {
+            this.fetchLoading = false
+            this.fetchData()
+          },
+          loadingMessage: `${this.$t('label.removing')} ${vm.name} ${this.$t('label.from.lb')} ${this.$t('label.in.progress')}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+</style>
diff --git a/ui/src/views/network/IpAddressesTab.vue b/ui/src/views/network/IpAddressesTab.vue
new file mode 100644
index 0000000..2d4c014
--- /dev/null
+++ b/ui/src/views/network/IpAddressesTab.vue
@@ -0,0 +1,448 @@
+// 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>
+    <a-spin :spinning="fetchLoading">
+      <a-button
+        :disabled="!('associateIpAddress' in $store.getters.apis)"
+        type="dashed"
+        icon="plus"
+        style="width: 100%; margin-bottom: 15px"
+        @click="onShowAcquireIp">
+        {{ $t('label.acquire.new.ip') }}
+      </a-button>
+      <div v-if="$route.path.startsWith('/vpc')">
+        Select Tier:
+        <a-select
+          style="width: 40%; margin-left: 15px;margin-bottom: 15px"
+          :loading="fetchLoading"
+          defaultActiveFirstOption
+          :value="vpcTier"
+          @change="handleTierSelect"
+        >
+          <a-select-option key="all" value="">
+            {{ $t('label.view.all') }}
+          </a-select-option>
+          <a-select-option v-for="network in networksList" :key="network.id" :value="network.id">
+            {{ network.name }}
+          </a-select-option>
+        </a-select>
+      </div>
+      <a-table
+        size="small"
+        style="overflow-y: auto"
+        :columns="columns"
+        :dataSource="ips"
+        :rowKey="item => item.id"
+        :pagination="false" >
+        <template slot="ipaddress" slot-scope="text, record">
+          <router-link :to="{ path: '/publicip/' + record.id }" >{{ text }} </router-link>
+          <a-tag v-if="record.issourcenat === true">source-nat</a-tag>
+        </template>
+
+        <template slot="state" slot-scope="text, record">
+          <status :text="record.state" displayText />
+        </template>
+
+        <template slot="virtualmachineid" slot-scope="text, record">
+          <a-icon type="desktop" v-if="record.virtualmachineid" />
+          <router-link :to="{ path: '/vm/' + record.virtualmachineid }" > {{ record.virtualmachinename || record.virtualmachineid }} </router-link>
+        </template>
+
+        <template slot="associatednetworkname" slot-scope="text, record">
+          <router-link :to="{ path: '/guestnetwork/' + record.associatednetworkid }" > {{ record.associatednetworkname || record.associatednetworkid }} </router-link>
+        </template>
+
+        <template slot="action" slot-scope="text, record">
+          <a-button
+            v-if="record.issourcenat !== true"
+            type="danger"
+            icon="delete"
+            shape="circle"
+            :disabled="!('disassociateIpAddress' in $store.getters.apis)"
+            @click="releaseIpAddress(record)" />
+        </template>
+      </a-table>
+      <a-divider/>
+      <a-pagination
+        class="row-element pagination"
+        size="small"
+        :current="page"
+        :pageSize="pageSize"
+        :total="totalIps"
+        :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+        :pageSizeOptions="['10', '20', '40', '80', '100']"
+        @change="changePage"
+        @showSizeChange="changePageSize"
+        showSizeChanger>
+        <template slot="buildOptionText" slot-scope="props">
+          <span>{{ props.value }} / {{ $t('label.page') }}</span>
+        </template>
+      </a-pagination>
+    </a-spin>
+    <a-modal
+      v-if="showAcquireIp"
+      :visible="showAcquireIp"
+      :title="$t('label.acquire.new.ip')"
+      :closable="true"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      @cancel="onCloseModal"
+      @ok="acquireIpAddress"
+      centered
+      width="450px">
+      <a-spin :spinning="acquireLoading">
+        <a-alert :message="$t('message.action.acquire.ip')" type="warning" />
+        <a-form-item :label="$t('label.ipaddress')">
+          <a-select
+            style="width: 100%;"
+            showSearch
+            v-model="acquireIp">
+            <a-select-option
+              v-for="ip in listPublicIpAddress"
+              :key="ip.ipaddress">{{ ip.ipaddress }}</a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'IpAddressesTab',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      ips: [],
+      ipsTiers: [],
+      networksList: [],
+      defaultNetwork: '',
+      vpcTier: '',
+      page: 1,
+      pageSize: 10,
+      totalIps: 0,
+      tiersSelect: false,
+      columns: [
+        {
+          title: this.$t('label.ipaddress'),
+          dataIndex: 'ipaddress',
+          scopedSlots: { customRender: 'ipaddress' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.vm'),
+          dataIndex: 'virtualmachineid',
+          scopedSlots: { customRender: 'virtualmachineid' }
+        },
+        {
+          title: this.$t('label.network'),
+          dataIndex: 'associatednetworkname',
+          scopedSlots: { customRender: 'associatednetworkname' }
+        },
+        {
+          title: '',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      showAcquireIp: false,
+      acquireLoading: false,
+      acquireIp: null,
+      listPublicIpAddress: []
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {
+        listall: true,
+        page: this.page,
+        pagesize: this.pageSize
+      }
+      if (this.$route.path.startsWith('/vpc')) {
+        this.networksList = this.resource.network
+        params.vpcid = this.resource.id
+        params.forvirtualnetwork = true
+        if (this.vpcTier) {
+          params.associatednetworkid = this.vpcTier
+        }
+      } else {
+        params.associatednetworkid = this.resource.id
+      }
+      this.fetchLoading = true
+      api('listPublicIpAddresses', params).then(json => {
+        this.totalIps = json.listpublicipaddressesresponse.count || 0
+        this.ips = json.listpublicipaddressesresponse.publicipaddress || []
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchListPublicIpAddress () {
+      return new Promise((resolve, reject) => {
+        const params = {
+          zoneid: this.resource.zoneid,
+          domainid: this.resource.domainid,
+          account: this.resource.account,
+          forvirtualnetwork: true,
+          allocatedonly: false
+        }
+        api('listPublicIpAddresses', params).then(json => {
+          const listPublicIps = json.listpublicipaddressesresponse.publicipaddress || []
+          resolve(listPublicIps)
+        }).catch(reject)
+      })
+    },
+    handleTierSelect (tier) {
+      this.vpcTier = tier
+      this.fetchData()
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    acquireIpAddress () {
+      const params = {}
+      if (this.$route.path.startsWith('/vpc')) {
+        params.vpcid = this.resource.id
+        if (this.vpcTier) {
+          params.networkid = this.vpcTier
+        }
+      } else {
+        params.networkid = this.resource.id
+      }
+      params.ipaddress = this.acquireIp
+      this.acquireLoading = true
+
+      api('associateIpAddress', params).then(response => {
+        this.$pollJob({
+          jobId: response.associateipaddressresponse.jobid,
+          successMessage: `${this.$t('message.success.acquire.ip')} ${this.$t('label.for')} ${this.resource.name}`,
+          successMethod: () => {
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.acquire.ip.failed'),
+          errorMethod: () => {
+            this.fetchData()
+          },
+          loadingMessage: `${this.$t('label.acquiring.ip')} ${this.$t('label.for')} ${this.resource.name} ${this.$t('label.is.in.progress')}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+        this.onCloseModal()
+      }).catch(error => {
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+      }).finally(() => {
+        this.acquireLoading = false
+      })
+    },
+    releaseIpAddress (ip) {
+      this.fetchLoading = true
+      api('disassociateIpAddress', {
+        id: ip.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.disassociateipaddressresponse.jobid,
+          successMessage: this.$t('message.success.release.ip'),
+          successMethod: () => {
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.release.ip.failed'),
+          errorMethod: () => {
+            this.fetchData()
+          },
+          loadingMessage: `${this.$t('label.releasing.ip')} ${this.$t('label.for')} ${this.resource.name} ${this.$t('label.is.in.progress')}`,
+          catchMessage: this.$t('error.fetching.async.job.result')
+        })
+      }).catch(error => {
+        this.fetchLoading = false
+        this.$notification.error({
+          message: `${this.$t('label.error')} ${error.response.status}`,
+          description: error.response.data.errorresponse.errortext,
+          duration: 0
+        })
+      })
+    },
+    async onShowAcquireIp () {
+      this.showAcquireIp = true
+      this.acquireLoading = true
+      this.listPublicIpAddress = []
+
+      try {
+        const listPublicIpAddress = await this.fetchListPublicIpAddress()
+        listPublicIpAddress.forEach(item => {
+          if (item.state === 'Free') {
+            this.listPublicIpAddress.push({
+              ipaddress: item.ipaddress
+            })
+          }
+        })
+        this.listPublicIpAddress.sort(function (a, b) {
+          if (a.ipaddress < b.ipaddress) { return -1 }
+          if (a.ipaddress > b.ipaddress) { return 1 }
+          return 0
+        })
+        this.acquireIp = this.listPublicIpAddress && this.listPublicIpAddress.length > 0 ? this.listPublicIpAddress[0].ipaddress : null
+        this.acquireLoading = false
+      } catch (e) {
+        this.acquireLoading = false
+        this.$notifyError(e)
+      }
+    },
+    onCloseModal () {
+      this.showAcquireIp = false
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+    max-height: 95vh;
+    width: 95vw;
+    overflow-y: scroll;
+    margin: -24px;
+
+    @media (min-width: 1000px) {
+      max-height: 70vh;
+      width: 900px;
+    }
+
+    &__header,
+    &__footer {
+      padding: 20px;
+    }
+
+    &__header {
+      display: flex;
+
+      .ant-select {
+        min-width: 200px;
+      }
+
+      &__col {
+
+        &:not(:last-child) {
+          margin-right: 20px;
+        }
+
+        &--full {
+          flex: 1;
+        }
+
+      }
+
+    }
+
+    &__footer {
+      display: flex;
+      justify-content: flex-end;
+
+      button {
+        &:not(:last-child) {
+          margin-right: 10px;
+        }
+      }
+    }
+
+    &__item {
+      padding-right: 20px;
+      padding-left: 20px;
+
+      &--selected {
+        background-color: #e6f7ff;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+    &__outer-container {
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+    }
+
+    &__container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+      cursor: pointer;
+
+      @media (min-width: 760px) {
+        flex-direction: row;
+        align-items: center;
+      }
+
+    }
+
+    &__row {
+      margin-bottom: 10px;
+
+      @media (min-width: 760px) {
+        margin-right: 20px;
+        margin-bottom: 0;
+      }
+    }
+
+    &__radio {
+      display: flex;
+      justify-content: flex-end;
+    }
+
+  }
+</style>
diff --git a/ui/src/views/network/LoadBalancing.vue b/ui/src/views/network/LoadBalancing.vue
new file mode 100644
index 0000000..ea99132
--- /dev/null
+++ b/ui/src/views/network/LoadBalancing.vue
@@ -0,0 +1,1522 @@
+// 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>
+    <div>
+      <div class="form">
+        <div class="form__item" ref="newRuleName">
+          <div class="form__label"><span class="form__required">*</span>{{ $t('label.name') }}</div>
+          <a-input v-model="newRule.name"></a-input>
+          <span class="error-text">{{ $t('label.required') }}</span>
+        </div>
+        <div class="form__item" ref="newRulePublicPort">
+          <div class="form__label"><span class="form__required">*</span>{{ $t('label.publicport') }}</div>
+          <a-input v-model="newRule.publicport"></a-input>
+          <span class="error-text">{{ $t('label.required') }}</span>
+        </div>
+        <div class="form__item" ref="newRulePrivatePort">
+          <div class="form__label"><span class="form__required">*</span>{{ $t('label.privateport') }}</div>
+          <a-input v-model="newRule.privateport"></a-input>
+          <span class="error-text">{{ $t('label.required') }}</span>
+        </div>
+      </div>
+      <div class="form">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.algorithm') }}</div>
+          <a-select v-model="newRule.algorithm">
+            <a-select-option value="roundrobin">{{ $t('label.lb.algorithm.roundrobin') }}</a-select-option>
+            <a-select-option value="leastconn">{{ $t('label.lb.algorithm.leastconn') }}</a-select-option>
+            <a-select-option value="source">{{ $t('label.lb.algorithm.source') }}</a-select-option>
+          </a-select>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.protocol') }}</div>
+          <a-select v-model="newRule.protocol" style="min-width: 100px">
+            <a-select-option value="tcp-proxy">{{ $t('label.tcp.proxy') }}</a-select-option>
+            <a-select-option value="tcp">{{ $t('label.tcp') }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') }}</a-select-option>
+          </a-select>
+        </div>
+        <div class="form__item">
+          <div class="form__label" style="white-space: nowrap;">{{ $t('label.add.vms') }}</div>
+          <a-button :disabled="!('createLoadBalancerRule' in $store.getters.apis)" type="primary" @click="handleOpenAddVMModal">
+            {{ $t('label.add') }}
+          </a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-divider />
+
+    <a-table
+      size="small"
+      class="list-view"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="lbRules"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <template slot="algorithm" slot-scope="record">
+        {{ returnAlgorithmName(record.algorithm) }}
+      </template>
+      <template slot="protocol" slot-scope="record">
+        {{ record.protocol | capitalise }}
+      </template>
+      <template slot="stickiness" slot-scope="record">
+        <a-button @click="() => openStickinessModal(record.id)">
+          {{ returnStickinessLabel(record.id) }}
+        </a-button>
+      </template>
+      <template slot="add" slot-scope="record">
+        <a-button type="primary" icon="plus" @click="() => { selectedRule = record; handleOpenAddVMModal() }">
+          {{ $t('label.add') }}
+        </a-button>
+      </template>
+      <template slot="expandedRowRender" slot-scope="record">
+        <div class="rule-instance-list">
+          <div v-for="instance in record.ruleInstances" :key="instance.loadbalancerruleinstance.id">
+            <div v-for="ip in instance.lbvmipaddresses" :key="ip" class="rule-instance-list__item">
+              <div>
+                <status :text="instance.loadbalancerruleinstance.state" />
+                <a-icon type="desktop" />
+                <router-link :to="{ path: '/vm/' + instance.loadbalancerruleinstance.id }">
+                  {{ instance.loadbalancerruleinstance.displayname }}
+                </router-link>
+              </div>
+              <div>{{ ip }}</div>
+              <a-button
+                shape="circle"
+                type="danger"
+                icon="delete"
+                @click="() => handleDeleteInstanceFromRule(instance, record, ip)" />
+            </div>
+          </div>
+        </div>
+      </template>
+      <template slot="actions" slot-scope="record">
+        <div class="actions">
+          <a-button shape="circle" icon="edit" @click="() => openEditRuleModal(record)"></a-button>
+          <a-button :disabled="!('updateLoadBalancerRule' in $store.getters.apis)" shape="circle" icon="tag" @click="() => openTagsModal(record.id)" />
+          <a-popconfirm
+            :title="$t('label.delete') + '?'"
+            @confirm="handleDeleteRule(record)"
+            :okText="$t('label.yes')"
+            :cancelText="$t('label.no')"
+          >
+            <a-button :disabled="!('deleteLoadBalancerRule' in $store.getters.apis)" shape="circle" type="danger" icon="delete" />
+          </a-popconfirm>
+        </div>
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      :title="$t('label.edit.tags')"
+      v-model="tagsModalVisible"
+      :footer="null"
+      :afterClose="closeModal"
+      :maskClosable="false"
+      class="tags-modal">
+      <span v-show="tagsModalLoading" class="modal-loading">
+        <a-icon type="loading"></a-icon>
+      </span>
+
+      <a-form :form="newTagsForm" class="add-tags" @submit="handleAddTag">
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.key') }}</p>
+          <a-form-item>
+            <a-input v-decorator="['key', { rules: [{ required: true, message: this.$t('message.specifiy.tag.key')}] }]" />
+          </a-form-item>
+        </div>
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.value') }}</p>
+          <a-form-item>
+            <a-input v-decorator="['value', { rules: [{ required: true, message: this.$t('message.specifiy.tag.value')}] }]" />
+          </a-form-item>
+        </div>
+        <a-button :disabled="!('createTags' in $store.getters.apis)" type="primary" html-type="submit">{{ $t('label.add') }}</a-button>
+      </a-form>
+
+      <a-divider></a-divider>
+
+      <div v-show="!tagsModalLoading" class="tags-container">
+        <div class="tags" v-for="(tag, index) in tags" :key="index">
+          <a-tag :key="index" :closable="'deleteTags' in $store.getters.apis" :afterClose="() => handleDeleteTag(tag)">
+            {{ tag.key }} = {{ tag.value }}
+          </a-tag>
+        </div>
+      </div>
+
+      <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.done') }}</a-button>
+    </a-modal>
+
+    <a-modal
+      :title="$t('label.configure.sticky.policy')"
+      v-model="stickinessModalVisible"
+      :footer="null"
+      :afterClose="closeModal"
+      :maskClosable="false"
+      :okButtonProps="{ props: {htmlType: 'submit'}}">
+
+      <span v-show="stickinessModalLoading" class="modal-loading">
+        <a-icon type="loading"></a-icon>
+      </span>
+
+      <a-form :form="stickinessPolicyForm" @submit="handleSubmitStickinessForm" class="custom-ant-form">
+        <a-form-item :label="$t('label.stickiness.method')">
+          <a-select v-decorator="['methodname']" @change="handleStickinessMethodSelectChange">
+            <a-select-option value="LbCookie">{{ $t('label.lb.cookie') }}</a-select-option>
+            <a-select-option value="AppCookie">{{ $t('label.app.cookie') }}</a-select-option>
+            <a-select-option value="SourceBased">{{ $t('label.source.based') }}</a-select-option>
+            <a-select-option value="none">{{ $t('label.none') }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item
+          :label="$t('label.sticky.name')"
+          v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
+            'AppCookie' || stickinessPolicyMethod === 'SourceBased'">
+          <a-input v-decorator="['name', { rules: [{ required: true, message: $t('message.error.specify.sticky.name')}] }]" />
+        </a-form-item>
+        <a-form-item
+          :label="$t('label.sticky.cookie-name')"
+          v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
+            'AppCookie'">
+          <a-input v-decorator="['cookieName']" />
+        </a-form-item>
+        <a-form-item
+          :label="$t('label.sticky.mode')"
+          v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
+            'AppCookie'">
+          <a-input v-decorator="['mode']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.nocache')" v-show="stickinessPolicyMethod === 'LbCookie'">
+          <a-checkbox v-decorator="['nocache']" v-model="stickinessNoCache"></a-checkbox>
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.indirect')" v-show="stickinessPolicyMethod === 'LbCookie'">
+          <a-checkbox v-decorator="['indirect']" v-model="stickinessIndirect"></a-checkbox>
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.postonly')" v-show="stickinessPolicyMethod === 'LbCookie'">
+          <a-checkbox v-decorator="['postonly']" v-model="stickinessPostOnly"></a-checkbox>
+        </a-form-item>
+        <a-form-item :label="$t('label.domain')" v-show="stickinessPolicyMethod === 'LbCookie'">
+          <a-input v-decorator="['domain']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.length')" v-show="stickinessPolicyMethod === 'AppCookie'">
+          <a-input v-decorator="['length']" type="number" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.holdtime')" v-show="stickinessPolicyMethod === 'AppCookie'">
+          <a-input v-decorator="['holdtime']" type="number" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.request-learn')" v-show="stickinessPolicyMethod === 'AppCookie'">
+          <a-checkbox v-decorator="['requestLearn']" v-model="stickinessRequestLearn"></a-checkbox>
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.prefix')" v-show="stickinessPolicyMethod === 'AppCookie'">
+          <a-checkbox v-decorator="['prefix']" v-model="stickinessPrefix"></a-checkbox>
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.tablesize')" v-show="stickinessPolicyMethod === 'SourceBased'">
+          <a-input v-decorator="['tablesize']" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sticky.expire')" v-show="stickinessPolicyMethod === 'SourceBased'">
+          <a-input v-decorator="['expire']" />
+        </a-form-item>
+        <a-button type="primary" html-type="submit">{{ $t('label.ok') }}</a-button>
+      </a-form>
+    </a-modal>
+
+    <a-modal
+      :title="$t('label.edit.rule')"
+      v-model="editRuleModalVisible"
+      :afterClose="closeModal"
+      :maskClosable="false"
+      @ok="handleSubmitEditForm">
+      <span v-show="editRuleModalLoading" class="modal-loading">
+        <a-icon type="loading"></a-icon>
+      </span>
+
+      <div class="edit-rule" v-if="selectedRule">
+        <div class="edit-rule__item">
+          <p class="edit-rule__label">{{ $t('label.name') }}</p>
+          <a-input v-model="editRuleDetails.name" />
+        </div>
+        <div class="edit-rule__item">
+          <p class="edit-rule__label">{{ $t('label.algorithm') }}</p>
+          <a-select v-model="editRuleDetails.algorithm">
+            <a-select-option value="roundrobin">{{ $t('label.lb.algorithm.roundrobin') }}</a-select-option>
+            <a-select-option value="leastconn">{{ $t('label.lb.algorithm.leastconn') }}</a-select-option>
+            <a-select-option value="source">{{ $t('label.lb.algorithm.source') }}</a-select-option>
+          </a-select>
+        </div>
+        <div class="edit-rule__item">
+          <p class="edit-rule__label">{{ $t('label.protocol') }}</p>
+          <a-select v-model="editRuleDetails.protocol">
+            <a-select-option value="tcp-proxy">{{ $t('label.tcp.proxy') }}</a-select-option>
+            <a-select-option value="tcp">{{ $t('label.tcp') }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') }}</a-select-option>
+          </a-select>
+        </div>
+      </div>
+    </a-modal>
+
+    <a-modal
+      :title="$t('label.add.vms')"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      v-model="addVmModalVisible"
+      class="vm-modal"
+      width="60vw"
+      @ok="handleAddNewRule"
+      :okButtonProps="{ props:
+        {disabled: newRule.virtualmachineid === [] } }"
+      @cancel="closeModal"
+    >
+      <div>
+        <span
+          v-if="'vpcid' in resource && !('associatednetworkid' in resource)">
+          <strong>{{ $t('label.select.tier') }} </strong>
+          <a-select
+            v-model="selectedTier"
+            @change="fetchVirtualMachines()"
+            :placeholder="$t('label.select.tier')" >
+            <a-select-option
+              v-for="tier in tiers.data"
+              :loading="tiers.loading"
+              :key="tier.id">
+              {{ tier.displaytext }}
+            </a-select-option>
+          </a-select>
+        </span>
+        <a-input-search
+          class="input-search"
+          :placeholder="$t('label.search')"
+          v-model="searchQuery"
+          allowClear
+          @search="onSearch" />
+        <a-table
+          size="small"
+          class="list-view"
+          :loading="addVmModalLoading"
+          :columns="vmColumns"
+          :dataSource="vms"
+          :pagination="false"
+          :rowKey="record => record.id"
+          :scroll="{ y: 300 }">
+          <div slot="name" slot-scope="text, record, index">
+            <span>
+              {{ text }}
+            </span>
+            <a-icon v-if="addVmModalNicLoading" type="loading"></a-icon>
+            <a-select
+              style="display: block"
+              v-else-if="!addVmModalNicLoading && newRule.virtualmachineid[index] === record.id"
+              mode="multiple"
+              v-model="newRule.vmguestip[index]"
+            >
+              <a-select-option v-for="(nic, nicIndex) in nics[index]" :key="nic" :value="nic">
+                {{ nic }}{{ nicIndex === 0 ? ` (${$t('label.primary')})` : null }}
+              </a-select-option>
+            </a-select>
+          </div>
+
+          <div slot="state" slot-scope="text">
+            <status :text="text ? text : ''" displayText></status>
+          </div>
+
+          <div slot="action" slot-scope="text, record, index" style="text-align: center">
+            <a-checkbox :value="record.id" @change="e => fetchNics(e, index)" />
+          </div>
+        </a-table>
+        <a-pagination
+          class="pagination"
+          size="small"
+          :current="vmPage"
+          :pageSize="vmPageSize"
+          :total="vmCount"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="handleChangePage"
+          @showSizeChange="handleChangePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+      </div>
+
+    </a-modal>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'LoadBalancing',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      loading: true,
+      lbRules: [],
+      newTagsForm: this.$form.createForm(this),
+      tagsModalVisible: false,
+      tagsModalLoading: false,
+      tags: [],
+      selectedRule: null,
+      selectedTier: null,
+      stickinessModalVisible: false,
+      stickinessPolicies: [],
+      stickinessPolicyForm: this.$form.createForm(this),
+      stickinessModalLoading: false,
+      selectedStickinessPolicy: null,
+      stickinessPolicyMethod: 'LbCookie',
+      stickinessNoCache: null,
+      stickinessIndirect: null,
+      stickinessPostOnly: null,
+      stickinessRequestLearn: null,
+      stickinessPrefix: null,
+      editRuleModalVisible: false,
+      editRuleModalLoading: false,
+      editRuleDetails: {
+        name: '',
+        algorithm: '',
+        protocol: ''
+      },
+      newRule: {
+        algorithm: 'roundrobin',
+        name: '',
+        privateport: '',
+        publicport: '',
+        protocol: 'tcp',
+        virtualmachineid: [],
+        vmguestip: []
+      },
+      addVmModalVisible: false,
+      addVmModalLoading: false,
+      addVmModalNicLoading: false,
+      vms: [],
+      nics: [],
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name'
+        },
+        {
+          title: this.$t('label.publicport'),
+          dataIndex: 'publicport'
+        },
+        {
+          title: this.$t('label.privateport'),
+          dataIndex: 'privateport'
+        },
+        {
+          title: this.$t('label.algorithm'),
+          scopedSlots: { customRender: 'algorithm' }
+        },
+        {
+          title: this.$t('label.protocol'),
+          scopedSlots: { customRender: 'protocol' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state'
+        },
+        {
+          title: this.$t('label.action.configure.stickiness'),
+          scopedSlots: { customRender: 'stickiness' }
+        },
+        {
+          title: this.$t('label.add.vms'),
+          scopedSlots: { customRender: 'add' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ],
+      tiers: {
+        loading: false,
+        data: []
+      },
+      vmColumns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' },
+          width: 220
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.displayname'),
+          dataIndex: 'displayname'
+        },
+        {
+          title: this.$t('label.account'),
+          dataIndex: 'account'
+        },
+        {
+          title: this.$t('label.zonename'),
+          dataIndex: 'zonename'
+        },
+        {
+          title: this.$t('label.select'),
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          width: 80
+        }
+      ],
+      vmPage: 1,
+      vmPageSize: 10,
+      vmCount: 0,
+      searchQuery: null
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return this.$t('label.all')
+      return val.toUpperCase()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchListTiers()
+      this.fetchLBRules()
+    },
+    fetchListTiers () {
+      this.tiers.loading = true
+
+      api('listNetworks', {
+        account: this.resource.account,
+        domainid: this.resource.domainid,
+        supportedservices: 'Lb',
+        vpcid: this.resource.vpcid
+      }).then(json => {
+        this.tiers.data = json.listnetworksresponse.network || []
+        this.selectedTier = this.tiers.data && this.tiers.data[0].id ? this.tiers.data[0].id : null
+        this.$forceUpdate()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => { this.tiers.loading = false })
+    },
+    fetchLBRules () {
+      this.loading = true
+      this.lbRules = []
+      this.stickinessPolicies = []
+
+      api('listLoadBalancerRules', {
+        listAll: true,
+        publicipid: this.resource.id,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.lbRules = response.listloadbalancerrulesresponse.loadbalancerrule || []
+        this.totalCount = response.listloadbalancerrulesresponse.count || 0
+      }).then(() => {
+        if (this.lbRules.length > 0) {
+          setTimeout(() => {
+            this.fetchLBRuleInstances()
+          }, 100)
+          this.fetchLBStickinessPolicies()
+          return
+        }
+        this.loading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loading = false
+      })
+    },
+    fetchLBRuleInstances () {
+      for (const rule of this.lbRules) {
+        this.loading = true
+        api('listLoadBalancerRuleInstances', {
+          listAll: true,
+          lbvmips: true,
+          id: rule.id
+        }).then(response => {
+          this.$set(rule, 'ruleInstances', response.listloadbalancerruleinstancesresponse.lbrulevmidip)
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      }
+    },
+    fetchLBStickinessPolicies () {
+      this.loading = true
+      this.lbRules.forEach(rule => {
+        api('listLBStickinessPolicies', {
+          listAll: true,
+          lbruleid: rule.id
+        }).then(response => {
+          this.stickinessPolicies.push(...response.listlbstickinesspoliciesresponse.stickinesspolicies)
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    returnAlgorithmName (name) {
+      switch (name) {
+        case 'leastconn':
+          return 'Least connections'
+        case 'roundrobin' :
+          return 'Round-robin'
+        case 'source':
+          return 'Source'
+        default :
+          return ''
+      }
+    },
+    returnStickinessLabel (id) {
+      const match = this.stickinessPolicies.filter(policy => policy.lbruleid === id)
+      if (match.length > 0 && match[0].stickinesspolicy.length > 0) {
+        return match[0].stickinesspolicy[0].methodname
+      }
+      return 'Configure'
+    },
+    openTagsModal (id) {
+      this.tagsModalLoading = true
+      this.tagsModalVisible = true
+      this.tags = []
+      this.selectedRule = id
+      this.newTagsForm.resetFields()
+      api('listTags', {
+        resourceId: id,
+        resourceType: 'LoadBalancer',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag
+        this.tagsModalLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    handleAddTag (e) {
+      this.tagsModalLoading = true
+
+      e.preventDefault()
+      this.newTagsForm.validateFields((err, values) => {
+        if (err) {
+          this.tagsModalLoading = false
+          return
+        }
+
+        api('createTags', {
+          'tags[0].key': values.key,
+          'tags[0].value': values.value,
+          resourceIds: this.selectedRule,
+          resourceType: 'LoadBalancer'
+        }).then(response => {
+          this.$pollJob({
+            jobId: response.createtagsresponse.jobid,
+            successMessage: this.$t('message.success.add.tag'),
+            successMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.openTagsModal(this.selectedRule)
+            },
+            errorMessage: this.$t('message.add.tag.failed'),
+            errorMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.closeModal()
+            },
+            loadingMessage: this.$t('message.add.tag.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.parentFetchData()
+              this.parentToggleLoading()
+              this.closeModal()
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        })
+      })
+    },
+    handleDeleteTag (tag) {
+      this.tagsModalLoading = true
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: tag.resourceid,
+        resourceType: 'LoadBalancer'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.openTagsModal(this.selectedRule)
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    openStickinessModal (id) {
+      this.stickinessModalVisible = true
+      this.selectedRule = id
+      const match = this.stickinessPolicies.find(policy => policy.lbruleid === id)
+
+      if (match && match.stickinesspolicy.length > 0) {
+        this.selectedStickinessPolicy = match.stickinesspolicy[0]
+        this.stickinessPolicyMethod = this.selectedStickinessPolicy.methodname
+        this.$nextTick(() => {
+          this.stickinessPolicyForm.setFieldsValue({ methodname: this.selectedStickinessPolicy.methodname })
+          this.stickinessPolicyForm.setFieldsValue({ name: this.selectedStickinessPolicy.name })
+          this.stickinessPolicyForm.setFieldsValue({ cookieName: this.selectedStickinessPolicy.params['cookie-name'] })
+          this.stickinessPolicyForm.setFieldsValue({ mode: this.selectedStickinessPolicy.params.mode })
+          this.stickinessPolicyForm.setFieldsValue({ domain: this.selectedStickinessPolicy.params.domain })
+          this.stickinessPolicyForm.setFieldsValue({ length: this.selectedStickinessPolicy.params.length })
+          this.stickinessPolicyForm.setFieldsValue({ holdtime: this.selectedStickinessPolicy.params.holdtime })
+          this.stickinessNoCache = !!this.selectedStickinessPolicy.params.nocache
+          this.stickinessIndirect = !!this.selectedStickinessPolicy.params.indirect
+          this.stickinessPostOnly = !!this.selectedStickinessPolicy.params.postonly
+          this.stickinessRequestLearn = !!this.selectedStickinessPolicy.params['request-learn']
+          this.stickinessPrefix = !!this.selectedStickinessPolicy.params.prefix
+        })
+      }
+    },
+    handleAddStickinessPolicy (data, values) {
+      api('createLBStickinessPolicy', {
+        ...data,
+        lbruleid: this.selectedRule,
+        name: values.name,
+        methodname: values.methodname
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createLBStickinessPolicy.jobid,
+          successMessage: this.$t('message.success.config.sticky.policy'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          errorMessage: this.$t('message.config.sticky.policy.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.config.sticky.policy.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleDeleteStickinessPolicy () {
+      this.stickinessModalLoading = true
+      api('deleteLBStickinessPolicy', { id: this.selectedStickinessPolicy.id }).then(response => {
+        this.$pollJob({
+          jobId: response.deleteLBstickinessrruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.sticky.policy'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          errorMessage: this.$t('message.remove.sticky.policy.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.remove.sticky.policy.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleSubmitStickinessForm (e) {
+      this.stickinessModalLoading = true
+      e.preventDefault()
+      this.stickinessPolicyForm.validateFields((err, values) => {
+        if (err) {
+          this.stickinessModalLoading = false
+          return
+        }
+        if (values.methodname === 'none') {
+          this.handleDeleteStickinessPolicy()
+          return
+        }
+
+        values.nocache = this.stickinessNoCache
+        values.indirect = this.stickinessIndirect
+        values.postonly = this.stickinessPostOnly
+        values.requestLearn = this.stickinessRequestLearn
+        values.prefix = this.stickinessPrefix
+
+        let data = {}
+        let count = 0
+        Object.entries(values).forEach(([key, val]) => {
+          if (val && key !== 'name' && key !== 'methodname') {
+            if (key === 'cookieName') {
+              data = { ...data, ...{ [`param[${count}].name`]: 'cookie-name' } }
+            } else if (key === 'requestLearn') {
+              data = { ...data, ...{ [`param[${count}].name`]: 'request-learn' } }
+            } else {
+              data = { ...data, ...{ [`param[${count}].name`]: key } }
+            }
+            data = { ...data, ...{ [`param[${count}].value`]: val } }
+            count++
+          }
+        })
+
+        this.handleAddStickinessPolicy(data, values)
+      })
+    },
+    handleStickinessMethodSelectChange (e) {
+      this.stickinessPolicyMethod = e
+    },
+    handleDeleteInstanceFromRule (instance, rule, ip) {
+      this.loading = true
+      api('removeFromLoadBalancerRule', {
+        id: rule.id,
+        'vmidipmap[0].vmid': instance.loadbalancerruleinstance.id,
+        'vmidipmap[0].vmip': ip
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.removefromloadbalancerruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.instance.rule'),
+          successMethod: () => {
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.remove.instance.failed'),
+          errorMethod: () => {
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.remove.instance.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+      })
+    },
+    openEditRuleModal (rule) {
+      this.selectedRule = rule
+      this.editRuleModalVisible = true
+      this.editRuleDetails.name = this.selectedRule.name
+      this.editRuleDetails.algorithm = this.selectedRule.algorithm
+      this.editRuleDetails.protocol = this.selectedRule.protocol
+    },
+    handleSubmitEditForm () {
+      this.loading = true
+      this.editRuleModalLoading = true
+      api('updateLoadBalancerRule', {
+        ...this.editRuleDetails,
+        id: this.selectedRule.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.updateloadbalancerruleresponse.jobid,
+          successMessage: this.$t('message.success.edit.rule'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          errorMessage: this.$t('message.edit.rule.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.edit.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loading = false
+      })
+    },
+    handleDeleteRule (rule) {
+      this.loading = true
+      api('deleteLoadBalancerRule', {
+        id: rule.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deleteloadbalancerruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.rule'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          errorMessage: this.$t('message.remove.rule.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.delete.rule.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loading = false
+      })
+    },
+    handleOpenAddVMModal () {
+      if (!this.selectedRule) {
+        if (!this.newRule.name) {
+          this.$refs.newRuleName.classList.add('error')
+        } else {
+          this.$refs.newRuleName.classList.remove('error')
+        }
+        if (!this.newRule.publicport) {
+          this.$refs.newRulePublicPort.classList.add('error')
+        } else {
+          this.$refs.newRulePublicPort.classList.remove('error')
+        }
+        if (!this.newRule.privateport) {
+          this.$refs.newRulePrivatePort.classList.add('error')
+        } else {
+          this.$refs.newRulePrivatePort.classList.remove('error')
+        }
+        if (!this.newRule.name || !this.newRule.publicport || !this.newRule.privateport) return
+      }
+      this.addVmModalVisible = true
+      this.fetchVirtualMachines()
+    },
+    fetchNics (e, index) {
+      if (!e.target.checked) {
+        this.newRule.virtualmachineid[index] = null
+        this.nics[index] = null
+        this.newRule.vmguestip[index] = null
+        return
+      }
+      this.newRule.virtualmachineid[index] = e.target.value
+      this.addVmModalNicLoading = true
+
+      api('listNics', {
+        virtualmachineid: e.target.value,
+        networkid: ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      }).then(response => {
+        if (!response || !response.listnicsresponse || !response.listnicsresponse.nic[0]) return
+        const newItem = []
+        newItem.push(response.listnicsresponse.nic[0].ipaddress)
+        if (response.listnicsresponse.nic[0].secondaryip) {
+          newItem.push(...response.listnicsresponse.nic[0].secondaryip.map(ip => ip.ipaddress))
+        }
+        this.nics[index] = newItem
+        this.newRule.vmguestip[index] = this.nics[index][0]
+        this.addVmModalNicLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    fetchVirtualMachines () {
+      this.vmCount = 0
+      this.vms = []
+      this.addVmModalLoading = true
+      const networkId = ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      api('listVirtualMachines', {
+        listAll: true,
+        keyword: this.searchQuery,
+        page: this.vmPage,
+        pagesize: this.vmPageSize,
+        networkid: networkId,
+        account: this.resource.account,
+        domainid: this.resource.domainid
+      }).then(response => {
+        this.vmCount = response.listvirtualmachinesresponse.count || 0
+        this.vms = response.listvirtualmachinesresponse.virtualmachine || []
+        this.vms.forEach((vm, index) => {
+          this.newRule.virtualmachineid[index] = null
+          this.nics[index] = null
+          this.newRule.vmguestip[index] = null
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.addVmModalLoading = false
+      })
+    },
+    handleAssignToLBRule (data) {
+      const vmIDIpMap = {}
+
+      let count = 0
+      let innerCount = 0
+      this.newRule.vmguestip.forEach(ip => {
+        if (Array.isArray(ip)) {
+          ip.forEach(i => {
+            vmIDIpMap[`vmidipmap[${innerCount}].vmid`] = this.newRule.virtualmachineid[count]
+            vmIDIpMap[`vmidipmap[${innerCount}].vmip`] = i
+            innerCount++
+          })
+        } else {
+          vmIDIpMap[`vmidipmap[${innerCount}].vmid`] = this.newRule.virtualmachineid[count]
+          vmIDIpMap[`vmidipmap[${innerCount}].vmip`] = ip
+          innerCount++
+        }
+        count++
+      })
+
+      this.loading = true
+      api('assignToLoadBalancerRule', {
+        id: data,
+        ...vmIDIpMap
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.assigntoloadbalancerruleresponse.jobid,
+          successMessage: this.$t('message.success.asign.vm'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          errorMessage: this.$t('message.assign.vm.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.assign.vm.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.fetchData()
+            this.closeModal()
+          }
+        })
+      })
+    },
+    handleAddNewRule () {
+      this.loading = true
+
+      if (this.selectedRule) {
+        this.handleAssignToLBRule(this.selectedRule.id)
+        return
+      }
+
+      const networkId = ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      api('createLoadBalancerRule', {
+        openfirewall: false,
+        networkid: networkId,
+        publicipid: this.resource.id,
+        algorithm: this.newRule.algorithm,
+        name: this.newRule.name,
+        privateport: this.newRule.privateport,
+        protocol: this.newRule.protocol,
+        publicport: this.newRule.publicport
+      }).then(response => {
+        this.addVmModalVisible = false
+        this.handleAssignToLBRule(response.createloadbalancerruleresponse.id)
+      }).catch(error => {
+        this.$notifyError(error)
+        this.loading = false
+      })
+
+      // assigntoloadbalancerruleresponse.jobid
+    },
+    closeModal () {
+      this.selectedRule = null
+      this.tagsModalVisible = false
+      this.stickinessModalVisible = false
+      this.stickinessModalLoading = false
+      this.selectedStickinessPolicy = null
+      this.stickinessPolicyMethod = 'LbCookie'
+      this.stickinessNoCache = null
+      this.stickinessIndirect = null
+      this.stickinessPostOnly = null
+      this.editRuleModalVisible = false
+      this.editRuleModalLoading = false
+      this.addVmModalLoading = false
+      this.addVmModalNicLoading = false
+      this.vms = []
+      this.nics = []
+      this.addVmModalVisible = false
+      this.newRule.virtualmachineid = []
+      this.newTagsForm.resetFields()
+      this.stickinessPolicyForm.resetFields()
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    onSearch (value) {
+      this.searchQuery = value
+      this.fetchVirtualMachines()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .rule {
+
+    &-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 760px) {
+        margin-right: -20px;
+        margin-bottom: -10px;
+      }
+
+    }
+
+    &__row {
+      display: flex;
+      flex-wrap: wrap;
+    }
+
+    &__item {
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        flex: 1;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+  }
+
+  .add-btn {
+    width: 100%;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    height: auto;
+  }
+
+  .add-actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-right: -20px;
+    margin-bottom: 20px;
+
+    @media (min-width: 760px) {
+      margin-top: 20px;
+    }
+
+    button {
+      margin-right: 20px;
+    }
+
+  }
+
+  .form {
+    display: flex;
+    margin-right: -20px;
+    flex-direction: column;
+    align-items: flex-start;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+
+    &__required {
+      margin-right: 5px;
+      color: red;
+    }
+
+    .error-text {
+      display: none;
+      color: red;
+      font-size: 0.8rem;
+    }
+
+    .error {
+
+      input {
+        border-color: red;
+      }
+
+      .error-text {
+        display: block;
+      }
+
+    }
+
+    &--column {
+      flex-direction: column;
+      margin-right: 0;
+      align-items: flex-end;
+
+      .form__item {
+        width: 100%;
+        padding-right: 0;
+      }
+
+    }
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 1200px) {
+        margin-bottom: 0;
+        flex: 1;
+      }
+
+      input,
+      .ant-select {
+        margin-top: auto;
+      }
+
+      &__input-container {
+        display: flex;
+
+        input {
+
+          &:not(:last-child) {
+            margin-right: 10px;
+          }
+
+        }
+
+      }
+
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+
+  .rule-action {
+    margin-bottom: 10px;
+  }
+
+  .tags-modal {
+
+    .ant-divider {
+      margin-top: 0;
+    }
+
+  }
+
+  .tags {
+    margin-bottom: 10px;
+  }
+
+  .add-tags {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+
+    &__input {
+      margin-right: 10px;
+    }
+
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+
+  }
+
+  .tags-container {
+    display: flex;
+    flex-wrap: wrap;
+    margin-bottom: 10px;
+  }
+
+  .add-tags-done {
+    display: block;
+    margin-left: auto;
+  }
+
+  .modal-loading {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background-color: rgba(0,0,0,0.5);
+    z-index: 1;
+    color: #1890ff;
+    font-size: 2rem;
+  }
+
+  .ant-list-item {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+      align-items: center;
+    }
+
+  }
+
+  .rule-instance-collapse {
+    width: 100%;
+    margin-left: -15px;
+
+    .ant-collapse-item {
+      border: 0;
+    }
+
+  }
+
+  .rule-instance-list {
+    display: flex;
+    flex-direction: column;
+
+    &__item {
+      display: flex;
+      flex-wrap: wrap;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 10px;
+
+      div {
+        margin-left: 25px;
+        margin-bottom: 10px;
+      }
+    }
+  }
+
+  .edit-rule {
+
+    .ant-select {
+      width: 100%;
+    }
+
+    &__item {
+      margin-bottom: 10px;
+    }
+
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+
+  }
+
+  .vm-modal {
+
+    &__header {
+      display: flex;
+
+      span {
+        flex: 1;
+        font-weight: bold;
+        margin-right: 10px;
+      }
+
+    }
+
+    &__item {
+      display: flex;
+      margin-top: 10px;
+
+      span,
+      label {
+        display: block;
+        flex: 1;
+        margin-right: 10px;
+      }
+
+    }
+
+  }
+
+  .custom-ant-form {
+    .ant-form-item-label {
+      font-weight: bold;
+      line-height: 1;
+    }
+    .ant-form-item {
+      margin-bottom: 10px;
+    }
+  }
+
+  .custom-ant-list {
+    .ant-list-item-action {
+      margin-top: 10px;
+      margin-left: 0;
+
+      @media (min-width: 760px) {
+        margin-top: 0;
+        margin-left: 24px;
+      }
+
+    }
+  }
+
+  .rule-instance-collapse {
+    .ant-collapse-header,
+    .ant-collapse-content {
+      margin-left: -12px;
+    }
+  }
+
+  .rule {
+    .ant-list-item-content-single {
+      width: 100%;
+
+      @media (min-width: 760px) {
+        width: auto;
+      }
+
+    }
+  }
+
+  .pagination {
+    margin-top: 20px;
+    text-align: right;
+  }
+
+  .actions {
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .list-view {
+    overflow-y: auto;
+    display: block;
+    width: 100%;
+  }
+
+  .filter {
+    display: block;
+    width: 240px;
+    margin-bottom: 10px;
+  }
+
+  .input-search {
+    margin-bottom: 10px;
+    width: 50%;
+    float: right;
+  }
+</style>
diff --git a/ui/src/views/network/NicsTable.vue b/ui/src/views/network/NicsTable.vue
new file mode 100644
index 0000000..f3b3181
--- /dev/null
+++ b/ui/src/views/network/NicsTable.vue
@@ -0,0 +1,123 @@
+// 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>
+  <a-table
+    size="small"
+    :columns="nicColumns"
+    :dataSource="resource.nic"
+    :rowKey="item => item.id"
+    :pagination="false"
+  >
+    <p slot="expandedRowRender" slot-scope="record">
+      <slot name="actions" :nic="record" />
+      <a-descriptions style="margin-top: 10px" layout="vertical" :column="1" :bordered="false" size="small">
+        <a-descriptions-item :label="$t('label.id')">
+          {{ record.id }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.networkid')" v-if="record.networkid">
+          {{ record.networkid }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.type')" v-if="record.type">
+          {{ record.type }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.traffictype')" v-if="record.traffictype">
+          {{ record.traffictype }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.secondaryips')" v-if="record.secondaryip && record.secondaryip.length > 0 && record.type !== 'L2'">
+          {{ record.secondaryip.map(x => x.ipaddress).join(', ') }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.ip6address')" v-if="record.ip6address">
+          {{ record.ip6address }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.ip6gateway')" v-if="record.ip6gateway">
+          {{ record.ip6gateway }}
+        </a-descriptions-item>
+        <a-descriptions-item :label="$t('label.ip6cidr')" v-if="record.ip6cidr">
+          {{ record.ip6cidr }}
+        </a-descriptions-item>
+        <template v-if="['Admin', 'DomainAdmin'].includes($store.getters.userInfo.roletype)">
+          <a-descriptions-item :label="$t('label.broadcasturi')" v-if="record.broadcasturi">
+            {{ record.broadcasturi }}
+          </a-descriptions-item>
+          <a-descriptions-item :label="$t('label.isolationuri')" v-if="record.isolationuri">
+            {{ record.isolationuri }}
+          </a-descriptions-item>
+        </template>
+      </a-descriptions>
+    </p>
+    <template slot="networkname" slot-scope="text, item">
+      <a-icon type="apartment" />
+      <router-link :to="{ path: '/guestnetwork/' + item.networkid }">
+        {{ text }}
+      </router-link>
+      <a-tag v-if="item.isdefault">
+        {{ $t('label.default') }}
+      </a-tag>
+    </template>
+  </a-table>
+</template>
+
+<script>
+
+export default {
+  name: 'NicsTable',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      nicColumns: [
+        {
+          title: this.$t('label.networkname'),
+          dataIndex: 'networkname',
+          scopedSlots: { customRender: 'networkname' }
+        },
+        {
+          title: this.$t('label.macaddress'),
+          dataIndex: 'macaddress'
+        },
+        {
+          title: this.$t('label.ipaddress'),
+          dataIndex: 'ipaddress'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        }
+      ]
+    }
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      this.resource = newItem
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/network/PortForwarding.vue b/ui/src/views/network/PortForwarding.vue
new file mode 100644
index 0000000..9d17695
--- /dev/null
+++ b/ui/src/views/network/PortForwarding.vue
@@ -0,0 +1,857 @@
+// 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>
+    <div>
+      <div class="form">
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.privateport') }}</div>
+          <a-input-group class="form__item__input-container" compact>
+            <a-input
+              v-model="newRule.privateport"
+              :placeholder="$t('label.start')"
+              style="border-right: 0; width: 60px; margin-right: 0;"></a-input>
+            <a-input
+              placeholder="-"
+              disabled
+              style="width: 30px; border-left: 0; border-right: 0; pointer-events: none; backgroundColor: #fff; text-align:
+              center; margin-right: 0;"></a-input>
+            <a-input
+              v-model="newRule.privateendport"
+              :placeholder="$t('label.end')"
+              style="border-left: 0; width: 60px; text-align: right; margin-right: 0;"></a-input>
+          </a-input-group>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.publicport') }}</div>
+          <a-input-group class="form__item__input-container" compact>
+            <a-input
+              v-model="newRule.publicport"
+              :placeholder="$t('label.start')"
+              style="border-right: 0; width: 60px; margin-right: 0;"></a-input>
+            <a-input
+              placeholder="-"
+              disabled
+              style="width: 30px; border-left: 0; border-right: 0; pointer-events: none; backgroundColor: #fff;
+              text-align: center; margin-right: 0;"></a-input>
+            <a-input
+              v-model="newRule.publicendport"
+              :placeholder="$t('label.end')"
+              style="border-left: 0; width: 60px; text-align: right; margin-right: 0;"></a-input>
+          </a-input-group>
+        </div>
+        <div class="form__item">
+          <div class="form__label">{{ $t('label.protocol') }}</div>
+          <a-select v-model="newRule.protocol" style="width: 100%;">
+            <a-select-option value="tcp">{{ $t('label.tcp') }}</a-select-option>
+            <a-select-option value="udp">{{ $t('label.udp') }}</a-select-option>
+          </a-select>
+        </div>
+        <div class="form__item" style="margin-left: auto;">
+          <div class="form__label">{{ $t('label.add.vm') }}</div>
+          <a-button :disabled="!('createPortForwardingRule' in $store.getters.apis)" type="primary" @click="openAddVMModal">{{ $t('label.add') }}</a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-divider/>
+
+    <a-table
+      size="small"
+      style="overflow-y: auto"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="portForwardRules"
+      :pagination="false"
+      :rowKey="record => record.id">
+      <template slot="privateport" slot-scope="record">
+        {{ record.privateport }} - {{ record.privateendport }}
+      </template>
+      <template slot="publicport" slot-scope="record">
+        {{ record.publicport }} - {{ record.publicendport }}
+      </template>
+      <template slot="protocol" slot-scope="record">
+        {{ record.protocol | capitalise }}
+      </template>
+      <template slot="vm" slot-scope="record">
+        <div><a-icon type="desktop"/>
+          <router-link
+            :to="{ path: '/vm/' + record.virtualmachineid }">
+            {{ record.virtualmachinename }}</router-link> ({{ record.vmguestip }})</div>
+      </template>
+      <template slot="actions" slot-scope="record">
+        <div class="actions">
+          <a-button shape="circle" icon="tag" class="rule-action" @click="() => openTagsModal(record.id)" />
+          <a-button
+            shape="circle"
+            type="danger"
+            icon="delete"
+            class="rule-action"
+            :disabled="!('deletePortForwardingRule' in $store.getters.apis)"
+            @click="deleteRule(record)" />
+        </div>
+      </template>
+    </a-table>
+    <a-pagination
+      class="pagination"
+      size="small"
+      :current="page"
+      :pageSize="pageSize"
+      :total="totalCount"
+      :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+      :pageSizeOptions="['10', '20', '40', '80', '100']"
+      @change="handleChangePage"
+      @showSizeChange="handleChangePageSize"
+      showSizeChanger>
+      <template slot="buildOptionText" slot-scope="props">
+        <span>{{ props.value }} / {{ $t('label.page') }}</span>
+      </template>
+    </a-pagination>
+
+    <a-modal
+      :title="$t('label.edit.tags')"
+      v-model="tagsModalVisible"
+      :footer="null"
+      :maskClosable="false"
+      :afterClose="closeModal">
+      <span v-show="tagsModalLoading" class="tags-modal-loading">
+        <a-icon type="loading"></a-icon>
+      </span>
+
+      <div class="add-tags">
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.key') }}</p>
+          <a-input v-model="newTag.key"></a-input>
+        </div>
+        <div class="add-tags__input">
+          <p class="add-tags__label">{{ $t('label.value') }}</p>
+          <a-input v-model="newTag.value"></a-input>
+        </div>
+        <a-button type="primary" @click="() => handleAddTag()">{{ $t('label.add') }}</a-button>
+      </div>
+
+      <a-divider></a-divider>
+
+      <div v-show="!tagsModalLoading" class="tags-container">
+        <div class="tags" v-for="(tag, index) in tags" :key="index">
+          <a-tag :key="index" :closable="true" :afterClose="() => handleDeleteTag(tag)">
+            {{ tag.key }} = {{ tag.value }}
+          </a-tag>
+        </div>
+      </div>
+
+      <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.done') }}</a-button>
+    </a-modal>
+
+    <a-modal
+      :title="$t('label.add.vm')"
+      :maskClosable="false"
+      :okText="$t('label.ok')"
+      :cancelText="$t('label.cancel')"
+      v-model="addVmModalVisible"
+      class="vm-modal"
+      width="60vw"
+      @ok="addRule"
+      :okButtonProps="{ props:
+        {disabled: newRule.virtualmachineid === null } }"
+      @cancel="closeModal"
+    >
+      <div>
+        <span
+          v-if="'vpcid' in resource && !('associatednetworkid' in resource)">
+          <strong>{{ $t('label.select.tier') }} </strong>
+          <a-select
+            v-model="selectedTier"
+            @change="fetchVirtualMachines()"
+            :placeholder="$t('label.select.tier')" >
+            <a-select-option
+              v-for="tier in tiers.data"
+              :loading="tiers.loading"
+              :key="tier.id">
+              {{ tier.displaytext }}
+            </a-select-option>
+          </a-select>
+        </span>
+        <a-input-search
+          class="input-search"
+          :placeholder="$t('label.search')"
+          v-model="searchQuery"
+          allowClear
+          @search="onSearch" />
+        <a-table
+          size="small"
+          class="list-view"
+          :loading="addVmModalLoading"
+          :columns="vmColumns"
+          :dataSource="vms"
+          :pagination="false"
+          :rowKey="record => record.id"
+          :scroll="{ y: 300 }">
+          <div slot="name" slot-scope="text, record">
+            <span>
+              {{ text }}
+            </span>
+            <a-icon v-if="addVmModalNicLoading" type="loading"></a-icon>
+            <a-select
+              style="display: block"
+              v-else-if="!addVmModalNicLoading && newRule.virtualmachineid === record.id"
+              v-model="newRule.vmguestip"
+            >
+              <a-select-option v-for="(nic, nicIndex) in nics" :key="nic" :value="nic">
+                {{ nic }}{{ nicIndex === 0 ? ` (${$t('label.primary')})` : null }}
+              </a-select-option>
+            </a-select>
+          </div>
+
+          <div slot="state" slot-scope="text">
+            <status :text="text ? text : ''" displayText></status>
+          </div>
+
+          <div slot="action" slot-scope="text, record" style="text-align: center">
+            <a-radio :value="record.id" @change="e => fetchNics(e)" />
+          </div>
+        </a-table>
+        <a-pagination
+          class="pagination"
+          size="small"
+          :current="vmPage"
+          :pageSize="vmPageSize"
+          :total="vmCount"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="handleChangePage"
+          @showSizeChange="handleChangePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+      </div>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  data () {
+    return {
+      loading: true,
+      portForwardRules: [],
+      newRule: {
+        protocol: 'tcp',
+        privateport: null,
+        privateendport: null,
+        publicport: null,
+        publicendport: null,
+        openfirewall: false,
+        vmguestip: null,
+        virtualmachineid: null
+      },
+      tagsModalVisible: false,
+      selectedRule: null,
+      selectedTier: null,
+      tags: [],
+      newTag: {
+        key: null,
+        value: null
+      },
+      tagsModalLoading: false,
+      addVmModalVisible: false,
+      addVmModalLoading: false,
+      addVmModalNicLoading: false,
+      vms: [],
+      nics: [],
+      totalCount: 0,
+      page: 1,
+      pageSize: 10,
+      columns: [
+        {
+          title: this.$t('label.privateport'),
+          scopedSlots: { customRender: 'privateport' }
+        },
+        {
+          title: this.$t('label.publicport'),
+          scopedSlots: { customRender: 'publicport' }
+        },
+        {
+          title: this.$t('label.protocol'),
+          scopedSlots: { customRender: 'protocol' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state'
+        },
+        {
+          title: this.$t('label.vm'),
+          scopedSlots: { customRender: 'vm' }
+        },
+        {
+          title: this.$t('label.action'),
+          scopedSlots: { customRender: 'actions' }
+        }
+      ],
+      tiers: {
+        loading: false,
+        data: []
+      },
+      vmColumns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' },
+          width: 210
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.displayname'),
+          dataIndex: 'displayname'
+        },
+        {
+          title: this.$t('label.ip'),
+          dataIndex: 'ip',
+          width: 100
+        },
+        {
+          title: this.$t('label.account'),
+          dataIndex: 'account'
+        },
+        {
+          title: this.$t('label.zone'),
+          dataIndex: 'zonename'
+        },
+        {
+          title: this.$t('label.select'),
+          dataIndex: 'action',
+          scopedSlots: { customRender: 'action' },
+          width: 80
+        }
+      ],
+      vmPage: 1,
+      vmPageSize: 10,
+      vmCount: 0,
+      searchQuery: null
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  filters: {
+    capitalise: val => {
+      if (val === 'all') return this.$t('label.all')
+      return val.toUpperCase()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchListTiers()
+      this.fetchPFRules()
+    },
+    fetchListTiers () {
+      if ('vpcid' in this.resource && 'associatednetworkid' in this.resource) {
+        return
+      }
+      this.tiers.loading = true
+      api('listNetworks', {
+        account: this.resource.account,
+        domainid: this.resource.domainid,
+        supportedservices: 'PortForwarding',
+        vpcid: this.resource.vpcid
+      }).then(json => {
+        this.tiers.data = json.listnetworksresponse.network || []
+        this.selectedTier = this.tiers.data && this.tiers.data[0].id ? this.tiers.data[0].id : null
+        this.$forceUpdate()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => { this.tiers.loading = false })
+    },
+    fetchPFRules () {
+      this.loading = true
+      api('listPortForwardingRules', {
+        listAll: true,
+        ipaddressid: this.resource.id,
+        page: this.page,
+        pageSize: this.pageSize
+      }).then(response => {
+        this.portForwardRules = response.listportforwardingrulesresponse.portforwardingrule || []
+        this.totalCount = response.listportforwardingrulesresponse.count || 0
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    deleteRule (rule) {
+      this.loading = true
+      api('deletePortForwardingRule', { id: rule.id }).then(response => {
+        this.$pollJob({
+          jobId: response.deleteportforwardingruleresponse.jobid,
+          successMessage: this.$t('message.success.remove.port.forward'),
+          successMethod: () => this.fetchData(),
+          errorMessage: this.$t('message.remove.port.forward.failed'),
+          errorMethod: () => this.fetchData(),
+          loadingMessage: this.$t('message.delete.port.forward.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => this.fetchData()
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+      })
+    },
+    addRule () {
+      this.loading = true
+      this.addVmModalVisible = false
+      const networkId = ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      api('createPortForwardingRule', {
+        ...this.newRule,
+        ipaddressid: this.resource.id,
+        networkid: networkId
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createportforwardingruleresponse.jobid,
+          successMessage: this.$t('message.success.add.port.forward'),
+          successMethod: () => {
+            this.closeModal()
+            this.parentFetchData()
+            this.fetchData()
+          },
+          errorMessage: this.$t('message.add.port.forward.failed'),
+          errorMethod: () => {
+            this.closeModal()
+            this.parentFetchData()
+            this.fetchData()
+          },
+          loadingMessage: this.$t('message.add.port.forward.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.closeModal()
+            this.fetchData()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+      })
+    },
+    resetAllRules () {
+      this.newRule.protocol = 'tcp'
+      this.newRule.privateport = null
+      this.newRule.privateendport = null
+      this.newRule.publicport = null
+      this.newRule.publicendport = null
+      this.newRule.openfirewall = false
+      this.newRule.vmguestip = null
+      this.newRule.virtualmachineid = null
+    },
+    resetTagInputs () {
+      this.newTag.key = null
+      this.newTag.value = null
+    },
+    closeModal () {
+      this.selectedRule = null
+      this.tagsModalVisible = false
+      this.addVmModalVisible = false
+      this.newRule.virtualmachineid = null
+      this.addVmModalLoading = false
+      this.addVmModalNicLoading = false
+      this.nics = []
+      this.resetTagInputs()
+      this.resetAllRules()
+    },
+    openTagsModal (id) {
+      this.tagsModalLoading = true
+      this.selectedRule = id
+      this.tagsModalVisible = true
+      this.tags = []
+      this.resetTagInputs()
+      api('listTags', {
+        resourceId: id,
+        resourceType: 'PortForwardingRule',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag
+        this.tagsModalLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    handleAddTag () {
+      this.tagsModalLoading = true
+      api('createTags', {
+        'tags[0].key': this.newTag.key,
+        'tags[0].value': this.newTag.value,
+        resourceIds: this.selectedRule,
+        resourceType: 'PortForwardingRule'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createtagsresponse.jobid,
+          successMessage: this.$t('message.success.add.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.openTagsModal(this.selectedRule)
+          },
+          errorMessage: this.$t('message.add.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.add.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleDeleteTag (tag) {
+      this.tagsModalLoading = true
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: this.selectedRule,
+        resourceType: 'PortForwardingRule'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.openTagsModal(this.selectedRule)
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+            this.parentToggleLoading()
+            this.closeModal()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    openAddVMModal () {
+      this.addVmModalVisible = true
+      this.fetchVirtualMachines()
+    },
+    fetchNics (e) {
+      this.addVmModalNicLoading = true
+      this.newRule.virtualmachineid = e.target.value
+      api('listNics', {
+        virtualmachineid: e.target.value,
+        networkId: ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      }).then(response => {
+        if (!response.listnicsresponse.nic || response.listnicsresponse.nic.length < 1) return
+        const nic = response.listnicsresponse.nic[0]
+        this.nics.push(nic.ipaddress)
+        if (nic.secondaryip && nic.secondaryip.length > 0) {
+          this.nics.push(...nic.secondaryip.map(ip => ip.ipaddress))
+        }
+        this.newRule.vmguestip = this.nics[0]
+        this.addVmModalNicLoading = false
+      }).catch(error => {
+        console.log(error)
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    fetchVirtualMachines () {
+      this.vmCount = 0
+      this.vms = []
+      this.addVmModalLoading = true
+      const networkId = ('vpcid' in this.resource && !('associatednetworkid' in this.resource)) ? this.selectedTier : this.resource.associatednetworkid
+      api('listVirtualMachines', {
+        listAll: true,
+        keyword: this.searchQuery,
+        page: this.vmPage,
+        pagesize: this.vmPageSize,
+        networkid: networkId,
+        account: this.resource.account,
+        domainid: this.resource.domainid
+      }).then(response => {
+        this.vmCount = response.listvirtualmachinesresponse.count || 0
+        this.vms = response.listvirtualmachinesresponse.virtualmachine
+        this.addVmModalLoading = false
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleChangePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    handleChangePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    onSearch (value) {
+      this.searchQuery = value
+      this.fetchVirtualMachines()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .rule {
+
+    &-container {
+      display: flex;
+      width: 100%;
+      flex-wrap: wrap;
+      margin-right: -20px;
+      margin-bottom: -10px;
+    }
+
+    &__item {
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        flex: 1;
+      }
+
+    }
+
+    &__title {
+      font-weight: bold;
+    }
+
+  }
+
+  .add-btn {
+    width: 100%;
+    padding-top: 15px;
+    padding-bottom: 15px;
+    height: auto;
+  }
+
+  .add-actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-right: -20px;
+    margin-bottom: 20px;
+
+    @media (min-width: 760px) {
+      margin-top: 20px;
+    }
+
+    button {
+      margin-right: 20px;
+    }
+
+  }
+
+  .form {
+    display: flex;
+    margin-right: -20px;
+    margin-bottom: 20px;
+    flex-direction: column;
+
+    @media (min-width: 760px) {
+      flex-direction: row;
+    }
+
+    &__item {
+      display: flex;
+      flex-direction: column;
+      /*flex: 1;*/
+      padding-right: 20px;
+      margin-bottom: 20px;
+
+      @media (min-width: 760px) {
+        margin-bottom: 0;
+      }
+
+      input,
+      .ant-select {
+        margin-top: auto;
+      }
+
+      &__input-container {
+        display: flex;
+
+        input {
+
+          &:not(:last-child) {
+            margin-right: 10px;
+          }
+
+        }
+
+      }
+
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+
+  .rule-action {
+
+    &:not(:last-of-type) {
+      margin-right: 10px;
+    }
+
+  }
+
+  .tags {
+    margin-bottom: 10px;
+  }
+
+  .add-tags {
+    display: flex;
+    align-items: flex-end;
+    justify-content: space-between;
+
+    &__input {
+      margin-right: 10px;
+    }
+
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+
+  }
+
+  .tags-container {
+    display: flex;
+    flex-wrap: wrap;
+    margin-bottom: 10px;
+  }
+
+  .add-tags-done {
+    display: block;
+    margin-left: auto;
+  }
+
+  .tags-modal-loading {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background-color: rgba(0,0,0,0.5);
+    z-index: 1;
+    color: #1890ff;
+    font-size: 2rem;
+  }
+
+  .vm-modal {
+
+    &__header {
+      display: flex;
+
+      span {
+        flex: 1;
+        font-weight: bold;
+        margin-right: 10px;
+      }
+
+    }
+
+    &__item {
+      display: flex;
+      margin-top: 10px;
+
+      span,
+      label {
+        display: block;
+        flex: 1;
+        margin-right: 10px;
+      }
+
+    }
+
+  }
+
+  .pagination {
+    margin-top: 20px;
+    text-align: right;
+  }
+
+  .list-view {
+    overflow-y: auto;
+    display: block;
+    width: 100%;
+  }
+
+  .filter {
+    display: block;
+    width: 240px;
+    margin-bottom: 10px;
+
+    .form__item {
+      width: 100%;
+    }
+  }
+
+  .input-search {
+    margin-bottom: 10px;
+    width: 50%;
+    float: right;
+  }
+</style>
diff --git a/ui/src/views/network/PublicIpResource.vue b/ui/src/views/network/PublicIpResource.vue
new file mode 100644
index 0000000..84c62eb
--- /dev/null
+++ b/ui/src/views/network/PublicIpResource.vue
@@ -0,0 +1,174 @@
+// 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>
+    <autogen-view @change-resource="changeResource">
+      <div slot="action">
+        <action-button
+          :style="{ float: device === 'mobile' ? 'left' : 'right' }"
+          :loading="loading"
+          :actions="actions"
+          :selectedRowKeys="selectedRowKeys"
+          :dataView="true"
+          :resource="resource"
+          @exec-action="(action) => execAction(action, action.groupAction && !dataView)" />
+      </div>
+      <div slot="resource">
+        <resource-view
+          v-if="isPublicIpAddress && 'id' in resource"
+          :loading="loading"
+          :resource="resource"
+          :tabs="tabs" />
+      </div>
+    </autogen-view>
+  </div>
+</template>
+
+<script>
+import { api } from '@api'
+import { mixinDevice } from '@/utils/mixin.js'
+import eventBus from '@/config/eventBus'
+import AutogenView from '@/views/AutogenView.vue'
+import ResourceView from '@/components/view/ResourceView'
+import ActionButton from '@/components/view/ActionButton'
+
+export default {
+  name: 'PublicIpResource',
+  components: {
+    AutogenView,
+    ResourceView,
+    ActionButton
+  },
+  data () {
+    return {
+      loading: false,
+      selectedRowKeys: [],
+      actions: [],
+      resource: {},
+      tabs: [{
+        name: 'details',
+        component: () => import('@/components/view/DetailsTab.vue')
+      }]
+    }
+  },
+  mixins: [mixinDevice],
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData(),
+      parentToggleLoading: this.toggleLoading
+    }
+  },
+  computed: {
+    isPublicIpAddress () {
+      return this.$route.path.startsWith('/publicip') && this.$route.path.includes('/publicip/')
+    }
+  },
+  watch: {
+    resource () {
+      if ('id' in this.resource) {
+        this.fetchData()
+      }
+    }
+  },
+  mounted () {
+    if ('id' in this.resource) {
+      this.fetchData()
+    }
+  },
+  methods: {
+    async fetchData () {
+      if (Object.keys(this.resource).length === 0) {
+        return
+      }
+
+      this.loading = true
+      this.portFWRuleCount = await this.fetchPortFWRule()
+
+      // disable load balancing rules only if port forwarding is enabled and
+      // network belongs to VPC
+      if (this.portFWRuleCount > 0 && this.resource.vpcid) {
+        this.tabs = this.$route.meta.tabs.filter(tab => tab.name !== 'loadbalancing')
+      } else {
+        this.loadBalancerRuleCount = await this.fetchLoadBalancerRule()
+
+        // for isolated networks, display both LB and PF
+        // for VPC they are mutually exclusive
+        if (this.loadBalancerRuleCount > 0) {
+          this.tabs =
+            this.resource.vpcid ? this.$route.meta.tabs.filter(tab => tab.name !== 'portforwarding') : this.$route.meta.tabs
+          this.loading = false
+        } else {
+          this.tabs = this.$route.meta.tabs
+        }
+      }
+
+      await this.fetchAction()
+      this.loading = false
+    },
+    fetchAction () {
+      this.actions = []
+      if (this.$route.meta.actions) {
+        this.actions = this.$route.meta.actions
+      }
+
+      if (this.portFWRuleCount > 0 || this.loadBalancerRuleCount > 0) {
+        this.actions = this.actions.filter(action => action.api !== 'enableStaticNat')
+      }
+    },
+    fetchPortFWRule () {
+      return new Promise((resolve, reject) => {
+        api('listPortForwardingRules', {
+          listAll: true,
+          ipaddressid: this.resource.id,
+          page: 1,
+          pagesize: 1
+        }).then(json => {
+          const portFWRuleCount = json.listportforwardingrulesresponse.count || 0
+          resolve(portFWRuleCount)
+        }).catch(e => {
+          reject(e)
+        })
+      })
+    },
+    fetchLoadBalancerRule () {
+      return new Promise((resolve, reject) => {
+        api('listLoadBalancerRules', {
+          listAll: true,
+          publicipid: this.resource.id,
+          page: 1,
+          pagesize: 1
+        }).then(json => {
+          const loadBalancerRuleCount = json.listloadbalancerrulesresponse.count || 0
+          resolve(loadBalancerRuleCount)
+        }).catch(e => {
+          reject(e)
+        })
+      })
+    },
+    changeResource (resource) {
+      this.resource = resource
+    },
+    toggleLoading () {
+      this.loading = !this.loading
+    },
+    execAction (action, isGroupAction) {
+      eventBus.$emit('exec-action', action, isGroupAction)
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/network/RoutersTab.vue b/ui/src/views/network/RoutersTab.vue
new file mode 100644
index 0000000..876a77a
--- /dev/null
+++ b/ui/src/views/network/RoutersTab.vue
@@ -0,0 +1,147 @@
+// 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>
+  <a-table
+    size="small"
+    style="overflow-y: auto"
+    :columns="columns"
+    :dataSource="routers"
+    :rowKey="item => item.id"
+    :pagination="false"
+    :loading="fetchLoading"
+  >
+    <template slot="name" slot-scope="text,item">
+      <router-link :to="{ path: '/router/' + item.id }" >{{ text }}</router-link>
+    </template>
+    <template slot="status" slot-scope="text, item">
+      <status class="status" :text="item.state" displayText />
+    </template>
+    <template slot="requiresupgrade" slot-scope="text, item">
+      {{ item.requiresupgrade ? $t('label.yes') : $t('label.no') }}
+    </template>
+    <template slot="isredundantrouter" slot-scope="text, record">
+      {{ record.isredundantrouter ? record.redundantstate : record.isredundantrouter }}
+    </template>
+    <template slot="hostname" slot-scope="text, record">
+      <router-link :to="{ path: '/host/' + record.hostid }" >{{ record.hostname || record.hostid }}</router-link>
+    </template>
+  </a-table>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'RoutersTab',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      routers: [],
+      columns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.status'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: this.$t('label.ip'),
+          dataIndex: 'publicip'
+        },
+        {
+          title: this.$t('label.version'),
+          dataIndex: 'version'
+        },
+        {
+          title: this.$t('label.requiresupgrade'),
+          dataIndex: 'requiresupgrade',
+          scopedSlots: { customRender: 'requiresupgrade' }
+        },
+        {
+          title: this.$t('label.isredundantrouter'),
+          dataIndex: 'isredundantrouter',
+          scopedSlots: { customRender: 'isredundantrouter' }
+        },
+        {
+          title: this.$t('label.hostname'),
+          dataIndex: 'hostname',
+          scopedSlots: { customRender: 'hostname' }
+        }
+      ]
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      var params = {
+        listAll: true
+      }
+      if (this.$route.fullPath.startsWith('/vpc')) {
+        params.vpcid = this.resource.id
+      } else {
+        params.networkid = this.resource.id
+      }
+      this.fetchLoading = true
+      api('listRouters', params).then(json => {
+        this.routers = json.listroutersresponse.router || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.status {
+  margin-top: -5px;
+
+  &--end {
+    margin-left: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/network/StaticRoutesTab.vue b/ui/src/views/network/StaticRoutesTab.vue
new file mode 100644
index 0000000..814dd07
--- /dev/null
+++ b/ui/src/views/network/StaticRoutesTab.vue
@@ -0,0 +1,361 @@
+// 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>
+  <a-spin :spinning="componentLoading">
+    <div class="new-route">
+      <a-input v-model="newRoute" icon="plus" :placeholder="$t('label.cidr.destination.network')"></a-input>
+      <a-button type="primary" :disabled="!('createStaticRoute' in $store.getters.apis)" @click="handleAdd">{{ $t('label.add.route') }}</a-button>
+    </div>
+
+    <div class="list">
+      <div v-for="(route, index) in routes" :key="index" class="list__item">
+        <div class="list__col">
+          <div class="list__label">{{ $t('label.cidr.destination.network') }}</div>
+          <div>{{ route.cidr }}</div>
+        </div>
+        <div class="actions">
+          <a-button shape="circle" icon="tag" @click="() => openTagsModal(route)"></a-button>
+          <a-button :disabled="!('deleteStaticRoute' in $store.getters.apis)" shape="circle" icon="delete" type="danger" @click="() => handleDelete(route)"></a-button>
+        </div>
+      </div>
+    </div>
+
+    <a-modal title="Edit Tags" v-model="tagsModalVisible" :footer="null" :maskClosable="false">
+      <a-spin v-if="tagsLoading"></a-spin>
+
+      <div v-else>
+        <a-form :form="newTagsForm" class="add-tags" @submit="handleAddTag">
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.key') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['key', { rules: [{ required: true, message: this.$t('message.specifiy.tag.key')}] }]" />
+            </a-form-item>
+          </div>
+          <div class="add-tags__input">
+            <p class="add-tags__label">{{ $t('label.value') }}</p>
+            <a-form-item>
+              <a-input v-decorator="['value', { rules: [{ required: true, message: this.$t('message.specifiy.tag.value')}] }]" />
+            </a-form-item>
+          </div>
+          <a-button type="primary" :disabled="!('createTags' in $store.getters.apis)" html-type="submit">{{ $t('label.add') }}</a-button>
+        </a-form>
+
+        <a-divider style="margin-top: 0;"></a-divider>
+
+        <div class="tags-container">
+          <div class="tags" v-for="(tag, index) in tags" :key="index">
+            <a-tag :key="index" :closable="'deleteTags' in $store.getters.apis" :afterClose="() => handleDeleteTag(tag)">
+              {{ tag.key }} = {{ tag.value }}
+            </a-tag>
+          </div>
+        </div>
+
+        <a-button class="add-tags-done" @click="tagsModalVisible = false" type="primary">{{ $t('label.ok') }}</a-button>
+      </div>
+
+    </a-modal>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'StaticRoutesTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      routes: [],
+      componentLoading: false,
+      selectedRule: null,
+      tagsModalVisible: false,
+      newTagsForm: this.$form.createForm(this),
+      tags: [],
+      tagsLoading: false,
+      newRoute: null
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  methods: {
+    fetchData () {
+      this.componentLoading = true
+      api('listStaticRoutes', { gatewayid: this.resource.id }).then(json => {
+        this.routes = json.liststaticroutesresponse.staticroute
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.componentLoading = false
+      })
+    },
+    handleAdd () {
+      if (!this.newRoute) return
+
+      this.componentLoading = true
+      api('createStaticRoute', {
+        cidr: this.newRoute,
+        gatewayid: this.resource.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createstaticrouteresponse.jobid,
+          successMethod: () => {
+            this.fetchData()
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.success.add.static.route'),
+              jobid: response.createstaticrouteresponse.jobid,
+              status: 'progress'
+            })
+            this.componentLoading = false
+            this.newRoute = null
+          },
+          errorMessage: this.$t('message.add.static.route.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.componentLoading = false
+          },
+          loadingMessage: this.$t('message.add.static.route.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.componentLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+        this.componentLoading = false
+      })
+    },
+    handleDelete (route) {
+      this.componentLoading = true
+      api('deleteStaticRoute', {
+        id: route.id
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletestaticrouteresponse.jobid,
+          successMethod: () => {
+            this.fetchData()
+            this.$store.dispatch('AddAsyncJob', {
+              title: this.$t('message.success.delete.static.route'),
+              jobid: response.deletestaticrouteresponse.jobid,
+              status: 'progress'
+            })
+            this.componentLoading = false
+          },
+          errorMessage: this.$t('message.delete.static.route.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.componentLoading = false
+          },
+          loadingMessage: this.$t('message.delete.static.route.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.componentLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+        this.componentLoading = false
+      })
+    },
+    fetchTags (route) {
+      api('listTags', {
+        resourceId: route.id,
+        resourceType: 'StaticRoute',
+        listAll: true
+      }).then(response => {
+        this.tags = response.listtagsresponse.tag
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    handleDeleteTag (tag) {
+      this.tagsLoading = true
+      api('deleteTags', {
+        'tags[0].key': tag.key,
+        'tags[0].value': tag.value,
+        resourceIds: this.selectedRule.id,
+        resourceType: 'StaticRoute'
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deletetagsresponse.jobid,
+          successMessage: this.$t('message.success.delete.tag'),
+          successMethod: () => {
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          },
+          errorMessage: this.$t('message.delete.tag.failed'),
+          errorMethod: () => {
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          },
+          loadingMessage: this.$t('message.delete.tag.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchTags(this.selectedRule)
+            this.tagsLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.tagsLoading = false
+      })
+    },
+    handleAddTag (e) {
+      this.tagsLoading = true
+
+      e.preventDefault()
+      this.newTagsForm.validateFields((err, values) => {
+        if (err) {
+          this.tagsLoading = false
+          return
+        }
+
+        api('createTags', {
+          'tags[0].key': values.key,
+          'tags[0].value': values.value,
+          resourceIds: this.selectedRule.id,
+          resourceType: 'StaticRoute'
+        }).then(response => {
+          this.$pollJob({
+            jobId: response.createtagsresponse.jobid,
+            successMessage: this.$t('message.success.add.tag'),
+            successMethod: () => {
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            },
+            errorMessage: this.$t('message.add.tag.failed'),
+            errorMethod: () => {
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            },
+            loadingMessage: this.$t('message.add.tag.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchTags(this.selectedRule)
+              this.tagsLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+          this.tagsLoading = false
+        })
+      })
+    },
+    openTagsModal (route) {
+      this.selectedRule = route
+      this.newTagsForm.resetFields()
+      this.fetchTags(this.selectedRule)
+      this.tagsModalVisible = true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+  .list {
+    padding-top: 20px;
+
+    &__item {
+      display: flex;
+      justify-content: space-between;
+
+      &:not(:last-child) {
+        margin-bottom: 20px;
+      }
+    }
+
+    &__label {
+      font-weight: bold;
+    }
+
+  }
+
+  .actions {
+    display: flex;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+
+  }
+
+  .tags {
+    margin-bottom: 10px;
+  }
+  .add-tags {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    &__input {
+      margin-right: 10px;
+    }
+    &__label {
+      margin-bottom: 5px;
+      font-weight: bold;
+    }
+  }
+  .tags-container {
+    display: flex;
+    flex-wrap: wrap;
+    margin-bottom: 10px;
+  }
+  .add-tags-done {
+    display: block;
+    margin-left: auto;
+  }
+
+  .new-route {
+    display: flex;
+    padding-top: 10px;
+
+    input {
+      margin-right: 10px;
+    }
+
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+
+  }
+
+</style>
diff --git a/ui/src/views/network/VpcTab.vue b/ui/src/views/network/VpcTab.vue
new file mode 100644
index 0000000..d75dae8
--- /dev/null
+++ b/ui/src/views/network/VpcTab.vue
@@ -0,0 +1,791 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-tabs
+      :activeKey="currentTab"
+      :tabPosition="device === 'mobile' ? 'top' : 'left'"
+      :animated="false"
+      @change="handleChangeTab">
+      <a-tab-pane :tab="$t('label.details')" key="details">
+        <DetailsTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.networks')" key="tier">
+        <VpcTiersTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.public.ips')" key="ip" v-if="'listPublicIpAddresses' in $store.getters.apis">
+        <IpAddressesTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.network.acl.lists')" key="acl" v-if="'listNetworkACLLists' in $store.getters.apis">
+        <a-button
+          type="dashed"
+          icon="plus"
+          style="width: 100%"
+          :disabled="!('createNetworkACLList' in $store.getters.apis)"
+          @click="() => handleOpenModals('networkAcl')">
+          {{ $t('label.add.network.acl.list') }}
+        </a-button>
+        <a-table
+          class="table"
+          size="small"
+          :columns="networkAclsColumns"
+          :dataSource="networkAcls"
+          :rowKey="item => item.id"
+          :pagination="false"
+        >
+          <template slot="name" slot-scope="text, item">
+            <router-link :to="{ path: '/acllist/' + item.id }">
+              {{ text }}
+            </router-link>
+          </template>
+        </a-table>
+        <a-pagination
+          class="row-element pagination"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="itemCounts.networkAcls"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+        <a-modal
+          v-model="modals.networkAcl"
+          :title="$t('label.add.acl.list')"
+          :maskClosable="false"
+          @ok="handleNetworkAclFormSubmit">
+          <a-form @submit.prevent="handleNetworkAclFormSubmit" :form="networkAclForm">
+            <a-form-item :label="$t('label.add.list.name')">
+              <a-input v-decorator="['name', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"></a-input>
+            </a-form-item>
+            <a-form-item :label="$t('label.description')">
+              <a-input v-decorator="['description', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"></a-input>
+            </a-form-item>
+          </a-form>
+        </a-modal>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.private.gateway')" key="pgw" v-if="'listPrivateGateways' in $store.getters.apis">
+        <a-button
+          type="dashed"
+          icon="plus"
+          style="width: 100%"
+          :disabled="!('createPrivateGateway' in $store.getters.apis)"
+          @click="() => handleOpenModals('privateGateways')">{{ $t('label.add.private.gateway') }}</a-button>
+        <a-table
+          class="table"
+          size="small"
+          :columns="privateGatewaysColumns"
+          :dataSource="privateGateways"
+          :rowKey="item => item.id"
+          :pagination="false"
+        >
+          <template slot="ipaddress" slot-scope="text, item">
+            <router-link :to="{ path: '/privategw/' + item.id }">{{ text }}</router-link>
+          </template>
+          <template slot="state" slot-scope="text, item">
+            <status :text="item.state" displayText></status>
+          </template>
+        </a-table>
+        <a-pagination
+          class="row-element pagination"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="itemCounts.privateGateways"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+
+        <a-modal
+          v-model="modals.gateway"
+          :title="$t('label.add.new.gateway')"
+          :maskClosable="false"
+          @ok="handleGatewayFormSubmit">
+          <a-spin :spinning="modals.gatewayLoading">
+            <p>{{ $t('message.add.new.gateway.to.vpc') }}</p>
+            <a-form @submit.prevent="handleGatewayFormSubmit" :form="gatewayForm">
+              <a-form-item :label="$t('label.physicalnetworkid')">
+                <a-select v-decorator="['physicalnetwork']">
+                  <a-select-option v-for="item in physicalnetworks" :key="item.id" :value="item.id">
+                    {{ item.name }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+              <a-form-item :label="$t('label.vlan')" :required="true">
+                <a-input
+                  :placeholder="placeholders.vlan"
+                  v-decorator="['vlan', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"
+                ></a-input>
+              </a-form-item>
+              <a-form-item
+                :label="$t('label.bypassvlanoverlapcheck')"
+                v-if="$store.getters.apis.createPrivateGateway && $store.getters.apis.createPrivateGateway.params.filter(x => x.name === 'bypassvlanoverlapcheck').length > 0" >
+                <a-checkbox
+                  v-decorator="['bypassvlanoverlapcheck']"
+                ></a-checkbox>
+              </a-form-item>
+              <a-form-item :label="$t('label.publicip')" :required="true">
+                <a-input
+                  :placeholder="placeholders.ipaddress"
+                  v-decorator="['ipaddress', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"
+                ></a-input>
+              </a-form-item>
+              <a-form-item :label="$t('label.gateway')" :required="true">
+                <a-input
+                  :placeholder="placeholders.gateway"
+                  v-decorator="['gateway', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"
+                ></a-input>
+              </a-form-item>
+              <a-form-item :label="$t('label.netmask')" :required="true">
+                <a-input
+                  :placeholder="placeholders.netmask"
+                  v-decorator="['netmask', {rules: [{ required: true, message: `${$t('label.required')}` }]}]"
+                ></a-input>
+              </a-form-item>
+              <a-form-item :label="$t('label.sourcenat')">
+                <a-checkbox v-decorator="['nat']"></a-checkbox>
+              </a-form-item>
+              <a-form-item :label="$t('label.aclid')">
+                <a-select v-decorator="['acl']">
+                  <a-select-option v-for="item in networkAcls" :key="item.id" :value="item.id">
+                    {{ item.name }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-form>
+          </a-spin>
+        </a-modal>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.vpn.gateway')" key="vpngw" v-if="'listVpnGateways' in $store.getters.apis">
+        <a-button
+          v-if="vpnGateways.length === 0"
+          type="dashed"
+          icon="plus"
+          style="width: 100%"
+          :disabled="!('createVpnGateway' in $store.getters.apis)"
+          @click="handleCreateVpnGateway">
+          {{ $t('label.create.site.vpn.gateway') }}
+        </a-button>
+        <a-list class="list">
+          <a-list-item v-for="item in vpnGateways" :key="item.id">
+            <div class="list__item">
+              <div class="list__col">
+                <div class="list__label">{{ $t('label.ip') }}</div>
+                <div>
+                  <router-link :to="{ path: '/s2svpn/' + item.id }">
+                    {{ item.publicip }}
+                  </router-link>
+                </div>
+              </div>
+            </div>
+          </a-list-item>
+        </a-list>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.vpn.connection')" key="vpnc" v-if="'listVpnConnections' in $store.getters.apis">
+        <a-button
+          type="dashed"
+          icon="plus"
+          style="width: 100%"
+          :disabled="!('createVpnConnection' in $store.getters.apis)"
+          @click="handleOpenModals('vpnConnection')">
+          {{ $t('label.create.site.vpn.connection') }}
+        </a-button>
+        <a-table
+          class="table"
+          size="small"
+          :columns="vpnConnectionsColumns"
+          :dataSource="vpnConnections"
+          :pagination="false"
+          :rowKey="record => record.id">
+          <a slot="publicip" slot-scope="text, record" href="javascript:;">
+            <router-link :to="{ path: '/s2svpnconn/' + record.id }">
+              {{ text }}
+            </router-link>
+          </a>
+          <template slot="state" slot-scope="text">
+            <status :text="text ? text : ''" displayText />
+          </template>
+        </a-table>
+        <a-pagination
+          class="row-element pagination"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="itemCounts.vpnConnections"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+        <a-modal
+          v-model="modals.vpnConnection"
+          :title="$t('label.create.vpn.connection')"
+          :maskClosable="false"
+          @ok="handleVpnConnectionFormSubmit">
+          <a-spin :spinning="modals.vpnConnectionLoading">
+            <a-form @submit.prevent="handleVpnConnectionFormSubmit" :form="vpnConnectionForm">
+              <a-form-item :label="$t('label.vpncustomergatewayid')">
+                <a-select v-decorator="['vpncustomergateway']">
+                  <a-select-option v-for="item in vpncustomergateways" :key="item.id" :value="item.id">
+                    {{ item.name }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+              <a-form-item :label="$t('label.passive')">
+                <a-checkbox v-decorator="['passive']"></a-checkbox>
+              </a-form-item>
+            </a-form>
+          </a-spin>
+        </a-modal>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.virtual.routers')" key="vr" v-if="$store.getters.userInfo.roletype === 'Admin'">
+        <RoutersTab :resource="resource" :loading="loading" />
+      </a-tab-pane>
+    </a-tabs>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import { mixinDevice } from '@/utils/mixin.js'
+import DetailsTab from '@/components/view/DetailsTab'
+import Status from '@/components/widgets/Status'
+import IpAddressesTab from './IpAddressesTab'
+import RoutersTab from './RoutersTab'
+import VpcTiersTab from './VpcTiersTab'
+
+export default {
+  name: 'VpcTab',
+  components: {
+    DetailsTab,
+    Status,
+    IpAddressesTab,
+    RoutersTab,
+    VpcTiersTab
+  },
+  mixins: [mixinDevice],
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      fetchLoading: false,
+      privateGateways: [],
+      vpnGateways: [],
+      vpnConnections: [],
+      networkAcls: [],
+      modals: {
+        gateway: false,
+        gatewayLoading: false,
+        vpnConnection: false,
+        vpnConnectionLoading: false,
+        networkAcl: false
+      },
+      placeholders: {
+        vlan: null,
+        ipaddress: null,
+        gateway: null,
+        netmask: null
+      },
+      physicalnetworks: [],
+      vpncustomergateways: [],
+      privateGatewaysColumns: [
+        {
+          title: this.$t('label.ip'),
+          dataIndex: 'ipaddress',
+          scopedSlots: { customRender: 'ipaddress' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.netmask'),
+          dataIndex: 'netmask'
+        },
+        {
+          title: this.$t('label.vlan'),
+          dataIndex: 'vlan'
+        }
+      ],
+      vpnConnectionsColumns: [
+        {
+          title: this.$t('label.ip'),
+          dataIndex: 'publicip',
+          scopedSlots: { customRender: 'publicip' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.gateway'),
+          dataIndex: 'gateway'
+        },
+        {
+          title: this.$t('label.ipsecpsk'),
+          dataIndex: 'ipsecpsk'
+        }
+      ],
+      networkAclsColumns: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.description'),
+          dataIndex: 'description'
+        }
+      ],
+      itemCounts: {
+        privateGateways: 0,
+        vpnConnections: 0,
+        networkAcls: 0
+      },
+      page: 1,
+      pageSize: 10,
+      currentTab: 'details'
+    }
+  },
+  beforeCreate () {
+    this.gatewayForm = this.$form.createForm(this)
+    this.vpnConnectionForm = this.$form.createForm(this)
+    this.networkAclForm = this.$form.createForm(this)
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.handleFetchData()
+      }
+    },
+    $route: function (newItem, oldItem) {
+      this.setCurrentTab()
+    }
+  },
+  mounted () {
+    this.handleFetchData()
+    this.setCurrentTab()
+  },
+  methods: {
+    setCurrentTab () {
+      this.currentTab = this.$route.query.tab ? this.$route.query.tab : 'details'
+    },
+    handleChangeTab (e) {
+      this.currentTab = e
+      this.page = 1
+      this.pageSize = 10
+      this.handleFetchData()
+      const query = Object.assign({}, this.$route.query)
+      query.tab = e
+      history.replaceState(
+        {},
+        null,
+        '#' + this.$route.path + '?' + Object.keys(query).map(key => {
+          return (
+            encodeURIComponent(key) + '=' + encodeURIComponent(query[key])
+          )
+        }).join('&')
+      )
+    },
+    handleFetchData () {
+      switch (this.currentTab) {
+        case 'pgw':
+          this.fetchPrivateGateways()
+          break
+        case 'vpngw':
+          this.fetchVpnGateways()
+          break
+        case 'vpnc':
+          this.fetchVpnConnections()
+          break
+        case 'acl':
+          this.fetchAclList()
+          break
+      }
+    },
+    fetchPrivateGateways () {
+      this.fetchLoading = true
+      api('listPrivateGateways', {
+        vpcid: this.resource.id,
+        listAll: true,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(json => {
+        this.privateGateways = json.listprivategatewaysresponse.privategateway
+        this.itemCounts.privateGateways = json.listprivategatewaysresponse.count
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchVpnGateways () {
+      this.fetchLoading = true
+      api('listVpnGateways', {
+        vpcid: this.resource.id,
+        listAll: true
+      }).then(json => {
+        this.vpnGateways = json.listvpngatewaysresponse.vpngateway ? json.listvpngatewaysresponse.vpngateway : []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchVpnConnections () {
+      this.fetchLoading = true
+      api('listVpnConnections', {
+        vpcid: this.resource.id,
+        listAll: true,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(json => {
+        this.vpnConnections = json.listvpnconnectionsresponse.vpnconnection
+        this.itemCounts.vpnConnections = json.listvpnconnectionsresponse.count
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchAclList () {
+      this.fetchLoading = true
+      api('listNetworkACLLists', {
+        vpcid: this.resource.id,
+        listAll: true,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(json => {
+        this.networkAcls = json.listnetworkacllistsresponse.networkacllist
+        this.itemCounts.networkAcls = json.listnetworkacllistsresponse.count
+        if (this.modals.gateway === true) {
+          this.$nextTick(() => {
+            this.gatewayForm.setFieldsValue({ acl: this.networkAcls[0].id })
+          })
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchPhysicalNetworks () {
+      this.modals.gatewayLoading = true
+      api('listPhysicalNetworks', { zoneid: this.resource.zoneid }).then(json => {
+        this.physicalnetworks = json.listphysicalnetworksresponse.physicalnetwork
+        if (this.modals.gateway === true) {
+          this.$nextTick(() => {
+            this.gatewayForm.setFieldsValue({ physicalnetwork: this.physicalnetworks[0].id })
+          })
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.modals.gatewayLoading = false
+      })
+    },
+    fetchVpnCustomerGateways () {
+      this.modals.vpnConnectionLoading = true
+      api('listVpnCustomerGateways', { listAll: true }).then(json => {
+        this.vpncustomergateways = json.listvpncustomergatewaysresponse.vpncustomergateway
+        if (this.modals.vpnConnection === true) {
+          this.$nextTick(() => {
+            this.vpnConnectionForm.setFieldsValue({ vpncustomergateway: this.vpncustomergateways[0].id })
+          })
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.modals.vpnConnectionLoading = false
+      })
+    },
+    handleOpenModals (e) {
+      switch (e) {
+        case 'privateGateways':
+          this.modals.gateway = true
+          this.gatewayForm.resetFields()
+          this.fetchAclList()
+          this.fetchPhysicalNetworks()
+          break
+        case 'vpnConnection':
+          this.modals.vpnConnection = true
+          this.vpnConnectionForm.resetFields()
+          this.fetchVpnCustomerGateways()
+          this.fetchVpnGateways()
+          break
+        case 'networkAcl':
+          this.modals.networkAcl = true
+          this.networkAclForm.resetFields()
+          break
+      }
+    },
+    handleGatewayFormSubmit () {
+      this.modals.gatewayLoading = true
+
+      this.gatewayForm.validateFields(errors => {
+        if (errors) {
+          this.modals.gatewayLoading = false
+          return
+        }
+
+        const data = this.gatewayForm.getFieldsValue()
+        const params = {
+          sourcenatsupported: data.nat,
+          physicalnetworkid: data.physicalnetwork,
+          vpcid: this.resource.id,
+          ipaddress: data.ipaddress,
+          gateway: data.gateway,
+          netmask: data.netmask,
+          vlan: data.vlan,
+          aclid: data.acl
+        }
+        if (data.bypassvlanoverlapcheck) {
+          params.bypassvlanoverlapcheck = data.bypassvlanoverlapcheck
+        }
+
+        api('createPrivateGateway', params).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.success.add.private.gateway'),
+            jobid: response.createprivategatewayresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createprivategatewayresponse.jobid,
+            successMethod: () => {
+              this.modals.gateway = false
+              this.handleFetchData()
+            },
+            errorMessage: this.$t('message.add.private.gateway.failed'),
+            errorMethod: () => {
+              this.modals.gateway = false
+              this.handleFetchData()
+            },
+            loadingMessage: this.$t('message.add.private.gateway.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.modals.gateway = false
+              this.handleFetchData()
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.modals.gatewayLoading = false
+          this.modals.gateway = false
+          this.handleFetchData()
+        })
+      })
+    },
+    handleVpnConnectionFormSubmit () {
+      this.fetchLoading = true
+      this.modals.vpnConnection = false
+
+      this.vpnConnectionForm.validateFields((errors, values) => {
+        if (errors) {
+          this.fetchLoading = false
+          return
+        }
+
+        api('createVpnConnection', {
+          s2svpngatewayid: this.vpnGateways[0].id,
+          s2scustomergatewayid: values.vpncustomergateway,
+          passive: values.passive ? values.passive : false
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.vpn.connection'),
+            jobid: response.createvpnconnectionresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createvpnconnectionresponse.jobid,
+            successMethod: () => {
+              this.fetchVpnConnections()
+              this.fetchLoading = false
+            },
+            errorMessage: this.$t('message.add.vpn.connection.failed'),
+            errorMethod: () => {
+              this.fetchVpnConnections()
+              this.fetchLoading = false
+            },
+            loadingMessage: this.$t('message.add.vpn.connection.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchVpnConnections()
+              this.fetchLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.fetchVpnConnections()
+          this.fetchLoading = false
+        })
+      })
+    },
+    handleNetworkAclFormSubmit () {
+      this.fetchLoading = true
+      this.modals.networkAcl = false
+
+      this.networkAclForm.validateFields((errors, values) => {
+        if (errors) {
+          this.fetchLoading = false
+        }
+
+        api('createNetworkACLList', {
+          name: values.name,
+          description: values.description,
+          vpcid: this.resource.id
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.success.add.network.acl'),
+            jobid: response.createnetworkacllistresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createnetworkacllistresponse.jobid,
+            successMethod: () => {
+              this.fetchLoading = false
+            },
+            errorMessage: this.$t('message.add.network.acl.failed'),
+            errorMethod: () => {
+              this.fetchLoading = false
+            },
+            loadingMessage: this.$t('message.add.network.acl.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchLoading = false
+            }
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.fetchLoading = false
+          this.fetchAclList()
+        })
+      })
+    },
+    handleCreateVpnGateway () {
+      this.fetchLoading = true
+      api('createVpnGateway', {
+        vpcid: this.resource.id
+      }).then(response => {
+        this.$store.dispatch('AddAsyncJob', {
+          title: this.$t('message.success.add.vpn.gateway'),
+          jobid: response.createvpngatewayresponse.jobid,
+          status: 'progress'
+        })
+        this.$pollJob({
+          jobId: response.createvpngatewayresponse.jobid,
+          successMethod: () => {
+            this.fetchLoading = false
+          },
+          errorMessage: this.$t('message.add.vpn.gateway.failed'),
+          errorMethod: () => {
+            this.fetchLoading = false
+          },
+          loadingMessage: this.$t('message.add.vpn.gateway.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchLoading = false
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+        this.handleFetchData()
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.handleFetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.handleFetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__item,
+  &__row {
+    display: flex;
+    flex-wrap: wrap;
+    width: 100%;
+  }
+
+  &__item {
+    margin-bottom: -20px;
+  }
+
+  &__col {
+    flex: 1;
+    margin-right: 20px;
+    margin-bottom: 20px;
+  }
+
+  &__label {
+    font-weight: bold;
+  }
+
+}
+
+.pagination {
+  margin-top: 20px;
+}
+
+.table {
+  margin-top: 20px;
+  overflow-y: auto;
+}
+</style>
diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue
new file mode 100644
index 0000000..bfadf75
--- /dev/null
+++ b/ui/src/views/network/VpcTiersTab.vue
@@ -0,0 +1,617 @@
+// 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>
+  <a-spin :spinning="fetchLoading">
+    <a-button
+      type="dashed"
+      icon="plus"
+      style="width: 100%;margin-bottom: 20px;"
+      :disabled="!('createNetwork' in $store.getters.apis)"
+      @click="handleOpenModal">{{ $t('label.add.network') }}</a-button>
+    <a-list class="list">
+      <a-list-item v-for="(network, idx) in networks" :key="idx" class="list__item">
+        <div class="list__item-outer-container">
+          <div class="list__item-container">
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.name') }}
+              </div>
+              <div>
+                <router-link :to="{ path: '/guestnetwork/' + network.id }">{{ network.name }} </router-link>
+                <a-tag v-if="network.broadcasturi">{{ network.broadcasturi }}</a-tag>
+              </div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">{{ $t('label.state') }}</div>
+              <div><status :text="network.state" displayText></status></div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.cidr') }}
+              </div>
+              <div>{{ network.cidr }}</div>
+            </div>
+            <div class="list__col">
+              <div class="list__label">
+                {{ $t('label.aclid') }}
+              </div>
+              <div>
+                <router-link :to="{ path: '/acllist/' + network.aclid }">
+                  {{ network.aclname }}
+                </router-link>
+              </div>
+            </div>
+          </div>
+          <a-collapse :bordered="false" style="margin-left: -18px">
+            <template v-slot:expandIcon="props">
+              <a-icon type="caret-right" :rotate="props.isActive ? 90 : 0" />
+            </template>
+            <a-collapse-panel :header="$t('label.instances')" key="vm" :style="customStyle">
+              <a-button
+                icon="plus"
+                type="dashed"
+                style="margin-bottom: 15px; width: 100%"
+                :disabled="!('deployVirtualMachine' in $store.getters.apis)"
+                @click="$router.push({ path: '/action/deployVirtualMachine?networkid=' + network.id + '&zoneid=' + network.zoneid })">
+                {{ $t('label.vm.add') }}
+              </a-button>
+              <a-table
+                class="table"
+                size="small"
+                :columns="vmCols"
+                :dataSource="vms[network.id]"
+                :rowKey="item => item.id"
+                :pagination="false"
+                :loading="fetchLoading">
+                <template slot="name" slot-scope="text, item">
+                  <router-link
+                    :to="{ path: '/vm/'+item.id}">{{ item.name }}
+                  </router-link>
+                </template>
+                <template slot="state" slot-scope="text, item">
+                  <status :text="item.state" displayText></status>
+                </template>
+                <template slot="ip" slot-scope="text, item">
+                  <div v-for="nic in item.nic" :key="nic.id">
+                    {{ nic.networkid === network.id ? nic.ipaddress : '' }}
+                  </div>
+                </template>
+              </a-table>
+              <a-divider/>
+              <a-pagination
+                class="row-element pagination"
+                size="small"
+                :current="page"
+                :pageSize="pageSize"
+                :total="itemCounts.vms[network.id]"
+                :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+                :pageSizeOptions="['10', '20', '40', '80', '100']"
+                @change="changePage"
+                @showSizeChange="changePageSize"
+                showSizeChanger>
+                <template slot="buildOptionText" slot-scope="props">
+                  <span>{{ props.value }} / {{ $t('label.page') }}</span>
+                </template>
+              </a-pagination>
+            </a-collapse-panel>
+            <a-collapse-panel :header="$t('label.internal.lb')" key="ilb" :style="customStyle" :disabled="!showIlb(network)" >
+              <a-button
+                icon="plus"
+                type="dashed"
+                style="margin-bottom: 15px; width: 100%"
+                :disabled="!('createLoadBalancer' in $store.getters.apis)"
+                @click="handleAddInternalLB(network.id)">
+                {{ $t('label.add.internal.lb') }}
+              </a-button>
+              <a-table
+                class="table"
+                size="small"
+                :columns="internalLbCols"
+                :dataSource="internalLB[network.id]"
+                :rowKey="item => item.id"
+                :pagination="false"
+                :loading="fetchLoading">
+                <template slot="name" slot-scope="text, item">
+                  <router-link
+                    :to="{ path: '/ilb/'+item.id}">{{ item.name }}
+                  </router-link>
+                </template>
+              </a-table>
+              <a-divider/>
+              <a-pagination
+                class="row-element pagination"
+                size="small"
+                :current="page"
+                :pageSize="pageSize"
+                :total="itemCounts.internalLB[network.id]"
+                :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+                :pageSizeOptions="['10', '20', '40', '80', '100']"
+                @change="changePage"
+                @showSizeChange="changePageSize"
+                showSizeChanger>
+                <template slot="buildOptionText" slot-scope="props">
+                  <span>{{ props.value }} / {{ $t('label.page') }}</span>
+                </template>
+              </a-pagination>
+            </a-collapse-panel>
+          </a-collapse>
+        </div>
+      </a-list-item>
+    </a-list>
+
+    <a-modal
+      v-model="showCreateNetworkModal"
+      :title="$t('label.add.new.tier')"
+      :maskClosable="false"
+      @ok="handleAddNetworkSubmit">
+      <a-spin :spinning="modalLoading">
+        <a-form @submit.prevent="handleAddNetworkSubmit" :form="form">
+          <a-form-item :label="$t('label.name')">
+            <a-input
+              :placeholder="$t('label.unique.name.tier')"
+              v-decorator="['name',{rules: [{ required: true, message: `${$t('label.required')}` }]}]"></a-input>
+          </a-form-item>
+          <a-form-item :label="$t('label.networkofferingid')">
+            <a-select
+              v-decorator="['networkOffering',{rules: [{ required: true, message: `${$t('label.required')}` }]}]">
+              <a-select-option v-for="item in networkOfferings" :key="item.id" :value="item.id">
+                {{ item.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item :label="$t('label.gateway')">
+            <a-input
+              :placeholder="$t('label.create.network.gateway.description')"
+              v-decorator="['gateway',{rules: [{ required: true, message: `${$t('label.required')}` }]}]"></a-input>
+          </a-form-item>
+          <a-form-item :label="$t('label.netmask')">
+            <a-input
+              :placeholder="$t('label.create.network.netmask.description')"
+              v-decorator="['netmask',{rules: [{ required: true, message: `${$t('label.required')}` }]}]"></a-input>
+          </a-form-item>
+          <a-form-item :label="$t('label.externalid')">
+            <a-input
+              v-decorator="['externalId']"></a-input>
+          </a-form-item>
+          <a-form-item :label="$t('label.aclid')">
+            <a-select v-decorator="['acl']">
+              <a-select-option v-for="item in networkAclList" :key="item.id" :value="item.id">
+                {{ item.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+
+    <a-modal
+      v-model="showAddInternalLB"
+      :title="$t('label.add.internal.lb')"
+      :maskClosable="false"
+      @ok="handleAddInternalLBSubmit">
+      <a-spin :spinning="modalLoading">
+        <a-form @submit.prevent="handleAddInternalLBSubmit" :form="form">
+          <a-form-item :label="$t('label.name')">
+            <a-input
+              :placeholder="$t('label.internallb.name.description')"
+              v-decorator="['name', { rules: [{ required: true, message: $t('message.error.internallb.name')}] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.description')">
+            <a-input
+              :placeholder="$t('label.internallb.description')"
+              v-decorator="['description']"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.sourceipaddress')">
+            <a-input
+              :placeholder="$t('label.internallb.sourceip.description')"
+              v-decorator="['sourceIP']"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.sourceport')">
+            <a-input
+              v-decorator="['sourcePort', { rules: [{ required: true, message: $t('message.error.internallb.source.port')}] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.instanceport')">
+            <a-input
+              v-decorator="['instancePort', { rules: [{ required: true, message: $t('message.error.internallb.instance.port')}] }]"/>
+          </a-form-item>
+          <a-form-item :label="$t('label.algorithm')">
+            <a-select
+              v-decorator="[
+                'algorithm',
+                {
+                  initialValue: 'Source',
+                  rules: [{ required: true, message: `${$t('label.required')}`}]
+                }]">
+              <a-select-option v-for="(key, idx) in Object.keys(algorithms)" :key="idx" :value="algorithms[key]">
+                {{ key }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-form>
+      </a-spin>
+    </a-modal>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'VpcTiersTab',
+  components: {
+    Status
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      networks: [],
+      networkid: '',
+      fetchLoading: false,
+      showCreateNetworkModal: false,
+      showAddInternalLB: false,
+      networkOfferings: [],
+      networkAclList: [],
+      modalLoading: false,
+      internalLB: {},
+      LBPublicIPs: {},
+      staticNats: {},
+      vms: {},
+      algorithms: {
+        Source: 'source',
+        'Round-robin': 'roundrobin',
+        'Least connections': 'leastconn'
+      },
+      internalLbCols: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.sourceipaddress'),
+          dataIndex: 'sourceipaddress'
+        },
+        {
+          title: this.$t('label.algorithm'),
+          dataIndex: 'algorithm'
+        },
+        {
+          title: this.$t('label.account'),
+          dataIndex: 'account'
+        }
+      ],
+      LBPublicIPCols: [
+        {
+          title: this.$t('label.ip'),
+          dataIndex: 'ipaddress',
+          scopedSlots: { customRender: 'ipaddress' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state'
+        },
+        {
+          title: this.$t('label.networkid'),
+          dataIndex: 'associatedNetworkName'
+        },
+        {
+          title: this.$t('label.vm'),
+          dataIndex: 'virtualmachinename'
+        }
+      ],
+      StaticNatCols: [
+        {
+          title: this.$t('label.ips'),
+          dataIndex: 'ipaddress',
+          scopedSlots: { customRender: 'ipaddress' }
+        },
+        {
+          title: this.$t('label.zoneid'),
+          dataIndex: 'zonename'
+        },
+        {
+          title: this.$t('label.networkid'),
+          dataIndex: 'associatedNetworkName'
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state'
+        }
+      ],
+      vmCols: [
+        {
+          title: this.$t('label.name'),
+          dataIndex: 'name',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.state'),
+          dataIndex: 'state',
+          scopedSlots: { customRender: 'state' }
+        },
+        {
+          title: this.$t('label.ip'),
+          scopedSlots: { customRender: 'ip' }
+        }
+      ],
+      customStyle: 'margin-bottom: -10px; border-bottom-style: none',
+      page: 1,
+      pageSize: 10,
+      itemCounts: {
+        internalLB: {},
+        publicIps: {},
+        snats: {},
+        vms: {}
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    loading (newData, oldData) {
+      if (!newData && this.resource.id) {
+        this.fetchData()
+      }
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  methods: {
+    showIlb (network) {
+      return network.service.filter(s => (s.name === 'Lb') && (s.capability.filter(c => c.name === 'LbSchemes' && c.value === 'Internal').length > 0)).length > 0 || false
+    },
+    fetchData () {
+      this.networks = this.resource.network
+      for (const network of this.networks) {
+        this.fetchLoadBalancers(network.id)
+        this.fetchVMs(network.id)
+      }
+    },
+    fetchNetworkAclList () {
+      this.fetchLoading = true
+      this.modalLoading = true
+      api('listNetworkACLLists', { vpcid: this.resource.id }).then(json => {
+        this.networkAclList = json.listnetworkacllistsresponse.networkacllist || []
+        this.$nextTick(function () {
+          this.form.setFieldsValue({
+            acl: this.networkAclList[0].id
+          })
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+        this.modalLoading = false
+      })
+    },
+    fetchNetworkOfferings () {
+      this.fetchLoading = true
+      this.modalLoading = true
+      api('listNetworkOfferings', {
+        forvpc: true,
+        guestiptype: 'Isolated',
+        supportedServices: 'SourceNat',
+        state: 'Enabled'
+      }).then(json => {
+        this.networkOfferings = json.listnetworkofferingsresponse.networkoffering || []
+        this.$nextTick(function () {
+          this.form.setFieldsValue({
+            networkOffering: this.networkOfferings[0].id
+          })
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.fetchLoading = false
+        this.modalLoading = false
+      })
+    },
+    fetchLoadBalancers (id) {
+      this.fetchLoading = true
+      api('listLoadBalancers', {
+        networkid: id,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(json => {
+        this.internalLB[id] = json.listloadbalancersresponse.loadbalancer || []
+        this.itemCounts.internalLB[id] = json.listloadbalancersresponse.count || 0
+        this.$forceUpdate()
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    fetchVMs (id) {
+      this.fetchLoading = true
+      api('listVirtualMachines', {
+        listAll: true,
+        vpcid: this.resource.id,
+        networkid: id,
+        page: this.page,
+        pagesize: this.pageSize
+      }).then(json => {
+        this.vms[id] = json.listvirtualmachinesresponse.virtualmachine || []
+        this.itemCounts.vms[id] = json.listvirtualmachinesresponse.count || 0
+        this.$forceUpdate()
+      }).finally(() => {
+        this.fetchLoading = false
+      })
+    },
+    closeModal () {
+      this.$emit('close-action')
+    },
+    handleOpenModal () {
+      this.form = this.$form.createForm(this)
+      this.fetchNetworkAclList()
+      this.fetchNetworkOfferings()
+      this.showCreateNetworkModal = true
+    },
+    handleAddInternalLB (id) {
+      this.form = this.$form.createForm(this)
+      this.showAddInternalLB = true
+      this.networkid = id
+    },
+    handleAddNetworkSubmit () {
+      this.fetchLoading = true
+
+      this.form.validateFields((errors, values) => {
+        if (errors) {
+          this.fetchLoading = false
+          return
+        }
+
+        this.showCreateNetworkModal = false
+        api('createNetwork', {
+          vpcid: this.resource.id,
+          domainid: this.resource.domainid,
+          account: this.resource.account,
+          networkOfferingId: values.networkOffering,
+          name: values.name,
+          displayText: values.name,
+          gateway: values.gateway,
+          netmask: values.netmask,
+          zoneId: this.resource.zoneid,
+          externalid: values.externalId,
+          aclid: values.acl
+        }).then(() => {
+          this.$notification.success({
+            message: this.$t('message.success.add.vpc.network')
+          })
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.parentFetchData()
+          this.fetchData()
+          this.fetchLoading = false
+        })
+      })
+    },
+    handleAddInternalLBSubmit () {
+      this.fetchLoading = true
+      this.modalLoading = true
+      this.form.validateFields((errors, values) => {
+        if (errors) {
+          this.fetchLoading = false
+          return
+        }
+        api('createLoadBalancer', {
+          name: values.name,
+          sourceport: values.sourcePort,
+          instanceport: values.instancePort,
+          algorithm: values.algorithm,
+          networkid: this.networkid,
+          sourceipaddressnetworkid: this.networkid,
+          scheme: 'Internal'
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('message.create.internallb'),
+            jobid: response.createloadbalancerresponse.jobid,
+            description: values.name,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.createloadbalancerresponse.jobid,
+            successMessage: this.$t('message.success.create.internallb'),
+            successMethod: () => {
+              this.fetchData()
+            },
+            errorMessage: `${this.$t('message.create.internallb.failed')} ` + response,
+            errorMethod: () => {
+              this.fetchData()
+            },
+            loadingMessage: this.$t('message.create.internallb.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.fetchData()
+            }
+          })
+        }).catch(error => {
+          console.error(error)
+          this.$message.error(this.$t('message.create.internallb.failed'))
+        }).finally(() => {
+          this.modalLoading = false
+          this.fetchLoading = false
+          this.showAddInternalLB = false
+          this.fetchData()
+        })
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.list {
+
+  &__label {
+    font-weight: bold;
+  }
+
+  &__col {
+    flex: 1;
+
+    @media (min-width: 480px) {
+      &:not(:last-child) {
+        margin-right: 20px;
+      }
+    }
+  }
+
+  &__item {
+    margin-right: -8px;
+    align-items: flex-start;
+
+    &-outer-container {
+      width: 100%;
+    }
+
+    &-container {
+      display: flex;
+      flex-direction: column;
+      width: 100%;
+
+      @media (min-width: 480px) {
+        flex-direction: row;
+        margin-bottom: 10px;
+      }
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/network/VpnDetails.vue b/ui/src/views/network/VpnDetails.vue
new file mode 100644
index 0000000..0159f6e
--- /dev/null
+++ b/ui/src/views/network/VpnDetails.vue
@@ -0,0 +1,208 @@
+// 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 v-if="remoteAccessVpn">
+    <div>
+      <p>{{ $t('message.enabled.vpn') }} <strong>{{ remoteAccessVpn.publicip }}</strong></p>
+      <p>{{ $t('message.enabled.vpn.ip.sec') }} <strong>{{ remoteAccessVpn.presharedkey }}</strong></p>
+      <a-divider/>
+      <a-button><router-link :to="{ path: '/vpnuser'}">{{ $t('label.manage.vpn.user') }}</router-link></a-button>
+      <a-button style="margin-left: 10px" type="danger" @click="disableVpn = true" :disabled="!('deleteRemoteAccessVpn' in $store.getters.apis)">
+        {{ $t('label.disable.vpn') }}
+      </a-button>
+    </div>
+
+    <a-modal
+      v-model="disableVpn"
+      :footer="null"
+      oncancel="disableVpn = false"
+      :title="$t('label.disable.vpn')"
+      :maskClosable="false">
+      <p>{{ $t('message.disable.vpn') }}</p>
+
+      <a-divider></a-divider>
+
+      <div class="actions">
+        <a-button @click="() => disableVpn = false">{{ $t('label.cancel') }}</a-button>
+        <a-button type="primary" @click="handleDisableVpn">{{ $t('label.yes') }}</a-button>
+      </div>
+    </a-modal>
+
+  </div>
+  <div v-else>
+    <a-button :disabled="!('createRemoteAccessVpn' in $store.getters.apis)" type="primary" @click="enableVpn = true">
+      {{ $t('label.enable.vpn') }}
+    </a-button>
+
+    <a-modal
+      v-model="enableVpn"
+      :footer="null"
+      onCancel="enableVpn = false"
+      :title="$t('label.enable.vpn')"
+      :maskClosable="false">
+      <p>{{ $t('message.enable.vpn') }}</p>
+
+      <a-divider></a-divider>
+
+      <div class="actions">
+        <a-button @click="() => enableVpn = false">{{ $t('label.cancel') }}</a-button>
+        <a-button type="primary" @click="handleCreateVpn">{{ $t('label.yes') }}</a-button>
+      </div>
+    </a-modal>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      remoteAccessVpn: null,
+      enableVpn: false,
+      disableVpn: false
+    }
+  },
+  inject: ['parentFetchData', 'parentToggleLoading'],
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource: function (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      api('listRemoteAccessVpns', {
+        publicipid: this.resource.id,
+        listAll: true
+      }).then(response => {
+        this.remoteAccessVpn = response.listremoteaccessvpnsresponse.remoteaccessvpn
+          ? response.listremoteaccessvpnsresponse.remoteaccessvpn[0] : null
+      }).catch(error => {
+        console.log(error)
+        this.$notifyError(error)
+      })
+    },
+    handleCreateVpn () {
+      this.parentToggleLoading()
+      this.enableVpn = false
+      api('createRemoteAccessVpn', {
+        publicipid: this.resource.id,
+        domainid: this.resource.domainid,
+        account: this.resource.account
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.createremoteaccessvpnresponse.jobid,
+          successMethod: result => {
+            const res = result.jobresult.remoteaccessvpn
+            this.$notification.success({
+              message: this.$t('label.status'),
+              description:
+                `${this.$t('message.enabled.vpn')} ${res.publicip}. ${this.$t('message.enabled.vpn.ip.sec')} ${res.presharedkey}`,
+              duration: 0
+            })
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          errorMessage: this.$t('message.enable.vpn.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          loadingMessage: this.$t('message.enable.vpn.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+        this.parentFetchData()
+        this.parentToggleLoading()
+      })
+    },
+    handleDisableVpn () {
+      this.parentToggleLoading()
+      this.disableVpn = false
+      api('deleteRemoteAccessVpn', {
+        publicipid: this.resource.id,
+        domainid: this.resource.domainid
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.deleteremoteaccessvpnresponse.jobid,
+          successMessage: this.$t('message.success.disable.vpn'),
+          successMethod: () => {
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          errorMessage: this.$t('message.disable.vpn.failed'),
+          errorMethod: () => {
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          },
+          loadingMessage: this.$t('message.disable.vpn.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.fetchData()
+            this.parentFetchData()
+            this.parentToggleLoading()
+          }
+        })
+      }).catch(error => {
+        this.$notifyError(error)
+        this.fetchData()
+        this.parentFetchData()
+        this.parentToggleLoading()
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 20px;
+      }
+    }
+  }
+</style>
diff --git a/ui/src/views/offering/AddComputeOffering.vue b/ui/src/views/offering/AddComputeOffering.vue
new file mode 100644
index 0000000..eafa875
--- /dev/null
+++ b/ui/src/views/offering/AddComputeOffering.vue
@@ -0,0 +1,1123 @@
+// 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.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="this.$t('label.name')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.displaytext') }}
+            <a-tooltip :title="apiParams.displaytext.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="this.$t('label.displaytext')"/>
+        </a-form-item>
+        <a-form-item v-if="this.isSystem">
+          <span slot="label">
+            {{ $t('label.systemvmtype') }}
+            <a-tooltip :title="apiParams.systemvmtype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['systemvmtype', {
+              initialValue: 'domainrouter'
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :placeholder="this.$t('label.systemvmtype')">
+            <a-select-option key="domainrouter">{{ $t('label.domain.router') }}</a-select-option>
+            <a-select-option key="consoleproxy">{{ $t('label.console.proxy') }}</a-select-option>
+            <a-select-option key="secondarystoragevm">{{ $t('label.secondary.storage.vm') }}</a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.storagetype') }}
+            <a-tooltip :title="apiParams.storagetype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['storagetype', {
+              initialValue: this.storageType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleStorageTypeChange(selected.target.value) }">
+            <a-radio-button value="shared">
+              {{ $t('label.shared') }}
+            </a-radio-button>
+            <a-radio-button value="local">
+              {{ $t('label.local') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.provisioningtype') }}
+            <a-tooltip :title="apiParams.provisioningtype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['provisioningtype', {
+              initialValue: this.provisioningType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleProvisioningTypeChange(selected.target.value) }">
+            <a-radio-button value="thin">
+              {{ $t('label.provisioningtype.thin') }}
+            </a-radio-button>
+            <a-radio-button value="sparse">
+              {{ $t('label.provisioningtype.sparse') }}
+            </a-radio-button>
+            <a-radio-button value="fat">
+              {{ $t('label.provisioningtype.fat') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.cachemode') }}
+            <a-tooltip :title="apiParams.cachemode.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['cachemode', {
+              initialValue: this.cacheMode
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleCacheModeChange(selected.target.value) }">
+            <a-radio-button value="none">
+              {{ $t('label.nodiskcache') }}
+            </a-radio-button>
+            <a-radio-button value="writeback">
+              {{ $t('label.writeback') }}
+            </a-radio-button>
+            <a-radio-button value="writethrough">
+              {{ $t('label.writethrough') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.offeringtype')" v-show="!this.isSystem">
+          <a-radio-group
+            v-decorator="['offeringtype', {
+              initialValue: this.offeringType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleComputeOfferingTypeChange(selected.target.value) }">
+            <a-radio-button value="fixed">
+              {{ $t('label.fixed') }}
+            </a-radio-button>
+            <a-radio-button value="customconstrained">
+              {{ $t('label.customconstrained') }}
+            </a-radio-button>
+            <a-radio-button value="customunconstrained">
+              {{ $t('label.customunconstrained') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'fixed'">
+          <span slot="label">
+            {{ $t('label.cpunumber') }}
+            <a-tooltip :title="apiParams.cpunumber.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['cpunumber', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.cpunumber')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType !== 'customunconstrained'">
+          <span slot="label">
+            {{ $t('label.cpuspeed') }}
+            <a-tooltip :title="apiParams.cpuspeed.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['cpuspeed', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.cpuspeed')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'customconstrained'">
+          <span slot="label">
+            {{ $t('label.mincpunumber') }}
+            <a-tooltip :title="apiParams.mincpunumber.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['mincpunumber', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.mincpunumber')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'customconstrained'">
+          <span slot="label">
+            {{ $t('label.maxcpunumber') }}
+            <a-tooltip :title="apiParams.maxcpunumber.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['maxcpunumber', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.maxcpunumber')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'fixed'">
+          <span slot="label">
+            {{ $t('label.memory.mb') }}
+            <a-tooltip :title="apiParams.memory.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['memory', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.memory')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'customconstrained'">
+          <span slot="label">
+            {{ $t('label.minmemory') }}
+            <a-tooltip :title="apiParams.minmemory.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['minmemory', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.minmemory')"/>
+        </a-form-item>
+        <a-form-item v-if="this.offeringType === 'customconstrained'">
+          <span slot="label">
+            {{ $t('label.maxmemory') }}
+            <a-tooltip :title="apiParams.maxmemory.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['maxmemory', {
+              rules: [{ required: true, message: $t('message.error.required.input') },
+                      {
+                        validator: (rule, value, callback) => {
+                          if (value && (isNaN(value) || value <= 0)) {
+                            callback(this.$t('message.error.number'))
+                          }
+                          callback()
+                        }
+                      }
+              ]
+            }]"
+            :placeholder="this.$t('label.maxmemory')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.networkrate') }}
+            <a-tooltip :title="apiParams.networkrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['networkrate', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && (isNaN(value) || value <= 0)) {
+                      callback(this.$t('message.error.number'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            :placeholder="this.$t('label.networkrate')"/>
+        </a-form-item>
+        <a-form-item v-if="apiParams.rootdisksize">
+          <span slot="label">
+            {{ $t('label.root.disk.size') }}
+            <a-tooltip :title="apiParams.rootdisksize.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['rootdisksize', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && (isNaN(value) || value <= 0)) {
+                      callback(this.$t('message.error.number'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            :placeholder="this.$t('label.root.disk.size')"/>
+        </a-form-item>
+        <a-form-item :label="$t('label.qostype')">
+          <a-radio-group
+            v-decorator="['qostype', {
+              initialValue: this.qosType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleQosTypeChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="hypervisor">
+              {{ $t('label.hypervisor') }}
+            </a-radio-button>
+            <a-radio-button value="storage">
+              {{ $t('label.storage') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskbytesreadrate') }}
+            <a-tooltip :title="apiParams.bytesreadrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskbytesreadrate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskbytesreadrate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskbyteswriterate') }}
+            <a-tooltip :title="apiParams.byteswriterate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskbyteswriterate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskbyteswriterate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskiopsreadrate') }}
+            <a-tooltip :title="apiParams.iopsreadrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsreadrate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsreadrate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskiopswriterate') }}
+            <a-tooltip :title="apiParams.iopswriterate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopswriterate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopswriterate')"/>
+        </a-form-item>
+        <a-form-item v-if="!this.isSystem && this.qosType === 'storage'">
+          <span slot="label">
+            {{ $t('label.iscustomizeddiskiops') }}
+            <a-tooltip :title="apiParams.customizediops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['iscustomizeddiskiops', {initialValue: this.isCustomizedDiskIops}]" :defaultChecked="this.isCustomizedDiskIops" @change="val => { this.isCustomizedDiskIops = val }" />
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage' && !this.isCustomizedDiskIops">
+          <span slot="label">
+            {{ $t('label.diskiopsmin') }}
+            <a-tooltip :title="apiParams.miniops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsmin', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsmin')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage' && !this.isCustomizedDiskIops">
+          <span slot="label">
+            {{ $t('label.diskiopsmax') }}
+            <a-tooltip :title="apiParams.maxiops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsmax', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsmax')"/>
+        </a-form-item>
+        <a-form-item v-if="!this.isSystem && this.qosType === 'storage'">
+          <span slot="label">
+            {{ $t('label.hypervisorsnapshotreserve') }}
+            <a-tooltip :title="apiParams.hypervisorsnapshotreserve.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['hypervisorsnapshotreserve', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.hypervisorsnapshotreserve')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.offerha') }}
+            <a-tooltip :title="apiParams.offerha.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['offerha', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item v-if="this.isAdmin()">
+          <span slot="label">
+            {{ $t('label.hosttags') }}
+            <a-tooltip :title="apiParams.hosttags.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['hosttags', {}]"
+            :placeholder="this.$t('label.hosttags')"/>
+        </a-form-item>
+        <a-form-item v-if="this.isAdmin()">
+          <span slot="label">
+            {{ $t('label.storagetags') }}
+            <a-tooltip :title="apiParams.tags.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="tags"
+            v-decorator="['storagetags', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="storageTagLoading"
+            :placeholder="$t('label.storagetags')"
+            v-if="this.isAdmin()">
+            <a-select-option v-for="opt in storageTags" :key="opt">
+              {{ opt }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.limitcpuuse') }}
+            <a-tooltip :title="apiParams.limitcpuuse.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['limitcpuuse', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item v-if="!this.isSystem">
+          <span slot="label">
+            {{ $t('label.isvolatile') }}
+            <a-tooltip :title="apiParams.isvolatile.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['isvolatile', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item v-if="!this.isSystem && this.isAdmin()">
+          <span slot="label">
+            {{ $t('label.deploymentplanner') }}
+            <a-tooltip :title="apiParams.deploymentplanner.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['deploymentplanner', {
+              initialValue: this.deploymentPlanners.length > 0 ? this.deploymentPlanners[0].name : ''
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="deploymentPlannerLoading"
+            :placeholder="this.$t('label.deploymentplanner')"
+            @change="val => { this.handleDeploymentPlannerChange(val) }">
+            <a-select-option v-for="(opt) in this.deploymentPlanners" :key="opt.name">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.plannermode')" v-if="this.plannerModeVisible">
+          <a-radio-group
+            v-decorator="['plannermode', {
+              initialValue: this.plannerMode
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handlePlannerModeChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="strict">
+              {{ $t('label.strict') }}
+            </a-radio-button>
+            <a-radio-button value="preferred">
+              {{ $t('label.preferred') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.gpu')" v-if="!this.isSystem">
+          <a-radio-group
+            v-decorator="['pcidevice', {
+              initialValue: this.selectedGpu
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleGpuChange(selected.target.value) }">
+            <a-radio-button v-for="(opt, optIndex) in this.gpuTypes" :key="optIndex" :value="opt.value">
+              {{ opt.title }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.vgputype')" v-if="this.vGpuVisible">
+          <a-select
+            v-decorator="['vgputype', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :placeholder="this.$t('label.vgputype')">
+            <a-select-option v-for="(opt, optIndex) in this.vGpuTypes" :key="optIndex">
+              {{ opt }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.ispublic')" v-show="this.isAdmin()">
+          <a-switch v-decorator="['ispublic', {initialValue: this.isPublic}]" :checked="this.isPublic" @change="val => { this.isPublic = val }" />
+        </a-form-item>
+        <a-form-item v-if="!this.isPublic">
+          <span slot="label">
+            {{ $t('label.domain') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="multiple"
+            v-decorator="['domainid', {
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.error.select')
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="this.$t('label.domainid')">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="!this.isSystem">
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            mode="multiple"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback(this.$t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            @select="val => fetchvSphereStoragePolicies(val)"
+            :loading="zoneLoading"
+            :placeholder="this.$t('label.zoneid')">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="'listVsphereStoragePolicies' in $store.getters.apis && storagePolicies !== null">
+          <span slot="label">
+            {{ $t('label.vmware.storage.policy') }}
+            <a-tooltip :title="apiParams.storagetype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['storagepolicy']"
+            :placeholder="apiParams.storagepolicy.description">
+            <a-select-option v-for="policy in this.storagePolicies" :key="policy.id">
+              {{ policy.name || policy.id }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddServiceOffering',
+  props: {
+  },
+  components: {
+  },
+  data () {
+    return {
+      isSystem: false,
+      storageType: 'shared',
+      provisioningType: 'thin',
+      cacheMode: 'none',
+      offeringType: 'fixed',
+      qosType: '',
+      isCustomizedDiskIops: false,
+      isPublic: true,
+      selectedDomains: [],
+      domains: [],
+      domainLoading: false,
+      selectedZones: [],
+      selectedZoneIndex: [],
+      zones: [],
+      zoneLoading: false,
+      selectedDeployementPlanner: null,
+      storagePolicies: null,
+      storageTags: [],
+      storageTagLoading: false,
+      deploymentPlanners: [],
+      deploymentPlannerLoading: false,
+      plannerModeVisible: false,
+      plannerMode: '',
+      selectedGpu: '',
+      gpuTypes: [
+        {
+          value: '',
+          title: this.$t('label.none'),
+          vgpu: []
+        },
+        {
+          value: 'Group of NVIDIA Corporation GK107GL [GRID K1] GPUs',
+          title: 'NVIDIA GRID K1',
+          vgpu: ['', 'passthrough', 'GRID K100', 'GRID K120Q', 'GRID K140Q', 'GRID K160Q', 'GRID K180Q']
+        },
+        {
+          value: 'Group of NVIDIA Corporation GK104GL [GRID K2] GPUs',
+          title: 'NVIDIA GRID K2',
+          vgpu: ['', 'passthrough', 'GRID K200', 'GRID K220Q', 'GRID K240Q', 'GRID K260Q', 'GRID K280Q']
+        }
+      ],
+      vGpuVisible: false,
+      vGpuTypes: [],
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, {
+      onValuesChange: (_, values) => {
+        this.selectedZoneIndex = values.zoneid
+      }
+    })
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createServiceOffering || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: null,
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    if (this.$route.meta.name === 'systemoffering') {
+      this.isSystem = true
+    }
+    this.fetchData()
+    this.isPublic = this.isAdmin()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+      if (this.isAdmin()) {
+        this.fetchStorageTagData()
+        this.fetchDeploymentPlannerData()
+      }
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    fetchStorageTagData () {
+      const params = {}
+      params.listAll = true
+      this.storageTagLoading = true
+      this.storageTags = []
+      api('listStorageTags', params).then(json => {
+        const tags = json.liststoragetagsresponse.storagetag || []
+        for (const tag of tags) {
+          if (!this.storageTags.includes(tag.name)) {
+            this.storageTags.push(tag.name)
+          }
+        }
+      }).finally(() => {
+        this.storageTagLoading = false
+      })
+    },
+    fetchDeploymentPlannerData () {
+      const params = {}
+      params.listAll = true
+      this.deploymentPlannerLoading = true
+      api('listDeploymentPlanners', params).then(json => {
+        const planners = json.listdeploymentplannersresponse.deploymentPlanner
+        this.deploymentPlanners = this.deploymentPlanners.concat(planners)
+        this.deploymentPlanners.unshift({ name: '' })
+      }).finally(() => {
+        this.deploymentPlannerLoading = false
+      })
+    },
+    fetchvSphereStoragePolicies (zoneIndex) {
+      if (zoneIndex === 0 || this.selectedZoneIndex.length > 1) {
+        this.storagePolicies = null
+        return
+      }
+      const zoneid = this.zones[zoneIndex].id
+      if ('importVsphereStoragePolicies' in this.$store.getters.apis) {
+        this.storagePolicies = []
+        api('listVsphereStoragePolicies', {
+          zoneid: zoneid
+        }).then(response => {
+          this.storagePolicies = response.listvspherestoragepoliciesresponse.StoragePolicy || []
+        })
+      }
+    },
+    handleStorageTypeChange (val) {
+      this.storageType = val
+    },
+    handleProvisioningTypeChange (val) {
+      this.provisioningType = val
+    },
+    handleCacheModeChange (val) {
+      this.cacheMode = val
+    },
+    handleComputeOfferingTypeChange (val) {
+      this.offeringType = val
+    },
+    handleQosTypeChange (val) {
+      this.qosType = val
+    },
+    handleDeploymentPlannerChange (planner) {
+      this.selectedDeployementPlanner = planner
+      this.plannerModeVisible = false
+      if (this.selectedDeployementPlanner === 'ImplicitDedicationPlanner') {
+        this.plannerModeVisible = this.isAdmin()
+      }
+    },
+    handlePlannerModeChange (val) {
+      this.plannerMode = val
+    },
+    handleGpuChange (val) {
+      this.vGpuTypes = []
+      for (var i in this.gpuTypes) {
+        if (this.gpuTypes[i].value === val) {
+          this.vGpuTypes = this.gpuTypes[i].vgpu
+          break
+        }
+      }
+      this.vGpuVisible = true
+      if (!this.arrayHasItems(this.vGpuTypes)) {
+        this.vGpuVisible = false
+      }
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {
+          issystem: this.isSystem,
+          name: values.name,
+          displaytext: values.displaytext,
+          storagetype: values.storagetype,
+          provisioningtype: values.provisioningtype,
+          cachemode: values.cachemode,
+          customized: values.offeringtype !== 'fixed',
+          offerha: values.offerha === true,
+          limitcpuuse: values.limitcpuuse === true
+        }
+
+        // custom fields (begin)
+        if (values.offeringtype === 'fixed') {
+          params.cpunumber = values.cpunumber
+          params.cpuspeed = values.cpuspeed
+          params.memory = values.memory
+        } else {
+          if (values.cpuspeed != null &&
+              values.mincpunumber != null &&
+              values.maxcpunumber != null &&
+              values.minmemory != null &&
+              values.maxmemory != null) {
+            params.cpuspeed = values.cpuspeed
+            params.mincpunumber = values.mincpunumber
+            params.maxcpunumber = values.maxcpunumber
+            params.minmemory = values.minmemory
+            params.maxmemory = values.maxmemory
+          }
+        }
+        // custom fields (end)
+
+        if (values.networkrate != null && values.networkrate.length > 0) {
+          params.networkrate = values.networkrate
+        }
+        if (values.rootdisksize != null && values.rootdisksize.length > 0) {
+          params.rootdisksize = values.rootdisksize
+        }
+        if (values.qostype === 'storage') {
+          var customIops = values.iscustomizeddiskiops === true
+          params.customizediops = customIops
+          if (!customIops) {
+            if (values.diskiopsmin != null && values.diskiopsmin.length > 0) {
+              params.miniops = values.diskiopsmin
+            }
+            if (values.diskiopsmax != null && values.diskiopsmax.length > 0) {
+              params.maxiops = values.diskiopsmax
+            }
+            if (values.hypervisorsnapshotreserve !== undefined &&
+              values.hypervisorsnapshotreserve != null && values.hypervisorsnapshotreserve.length > 0) {
+              params.hypervisorsnapshotreserve = values.hypervisorsnapshotreserve
+            }
+          }
+        } else if (values.qostype === 'hypervisor') {
+          if (values.diskbytesreadrate != null && values.diskbytesreadrate.length > 0) {
+            params.bytesreadrate = values.diskbytesreadrate
+          }
+          if (values.diskbyteswriterate != null && values.diskbyteswriterate.length > 0) {
+            params.byteswriterate = values.diskbyteswriterate
+          }
+          if (values.diskiopsreadrate != null && values.diskiopsreadrate.length > 0) {
+            params.iopsreadrate = values.diskiopsreadrate
+          }
+          if (values.diskiopswriterate != null && values.diskiopswriterate.length > 0) {
+            params.iopswriterate = values.diskiopswriterate
+          }
+        }
+        if (values.storagetags != null && values.storagetags.length > 0) {
+          var tags = values.storagetags.join(',')
+          params.tags = tags
+        }
+        if (values.hosttags != null && values.hosttags.length > 0) {
+          params.hosttags = values.hosttags
+        }
+        if ('deploymentplanner' in values &&
+          values.deploymentplanner !== undefined &&
+          values.deploymentplanner != null && values.deploymentplanner.length > 0) {
+          params.deploymentplanner = values.deploymentplanner
+        }
+        if ('deploymentplanner' in values &&
+          values.deploymentplanner !== undefined &&
+          values.deploymentplanner === 'ImplicitDedicationPlanner' &&
+          values.plannermode !== undefined &&
+          values.plannermode !== '') {
+          params['serviceofferingdetails[0].key'] = 'ImplicitDedicationMode'
+          params['serviceofferingdetails[0].value'] = values.plannermode
+        }
+        if ('pcidevice' in values &&
+          values.pcidevice !== undefined && values.pcidevice !== '') {
+          params['serviceofferingdetails[1].key'] = 'pciDevice'
+          params['serviceofferingdetails[1].value'] = values.pcidevice
+        }
+        if ('vgputype' in values &&
+          this.vGpuTypes != null && this.vGpuTypes !== undefined &&
+          values.vgputype > this.vGpuTypes.length) {
+          params['serviceofferingdetails[2].key'] = 'vgpuType'
+          params['serviceofferingdetails[2].value'] = this.vGpuTypes[values.vgputype]
+        }
+        if ('isvolatile' in values && values.isvolatile !== undefined) {
+          params.isvolatile = values.isvolatile === true
+        }
+        if ('systemvmtype' in values && values.systemvmtype !== undefined) {
+          params.systemvmtype = values.systemvmtype
+        }
+        if (values.ispublic !== true) {
+          var domainIndexes = values.domainid
+          var domainId = null
+          if (domainIndexes && domainIndexes.length > 0) {
+            var domainIds = []
+            for (var i = 0; i < domainIndexes.length; i++) {
+              domainIds = domainIds.concat(this.domains[domainIndexes[i]].id)
+            }
+            domainId = domainIds.join(',')
+          }
+          if (domainId) {
+            params.domainid = domainId
+          }
+        }
+        var zoneIndexes = values.zoneid
+        var zoneId = null
+        if (zoneIndexes && zoneIndexes.length > 0) {
+          var zoneIds = []
+          for (var j = 0; j < zoneIndexes.length; j++) {
+            zoneIds = zoneIds.concat(this.zones[zoneIndexes[j]].id)
+          }
+          zoneId = zoneIds.join(',')
+        }
+        if (zoneId) {
+          params.zoneid = zoneId
+        }
+        if (values.storagepolicy) {
+          params.storagepolicy = values.storagepolicy
+        }
+        api('createServiceOffering', params).then(json => {
+          const message = this.isSystem
+            ? `${this.$t('message.create.service.offering')}: `
+            : `${this.$t('message.create.compute.offering')}: `
+          this.$message.success(message + values.name)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+    @media (min-width: 800px) {
+      width: 500px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/offering/AddDiskOffering.vue b/ui/src/views/offering/AddDiskOffering.vue
new file mode 100644
index 0000000..267c5ef
--- /dev/null
+++ b/ui/src/views/offering/AddDiskOffering.vue
@@ -0,0 +1,683 @@
+// 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.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="this.$t('label.name')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.displaytext') }}
+            <a-tooltip :title="apiParams.displaytext.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: $t('message.error.required.input') }]
+            }]"
+            :placeholder="this.$t('label.displaytext')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.storagetype') }}
+            <a-tooltip :title="apiParams.storagetype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['storagetype', {
+              initialValue: this.storageType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleStorageTypeChange(selected.target.value) }">
+            <a-radio-button value="shared">
+              {{ $t('label.shared') }}
+            </a-radio-button>
+            <a-radio-button value="local">
+              {{ $t('label.local') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.provisioningtype') }}
+            <a-tooltip :title="apiParams.provisioningtype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['provisioningtype', {
+              initialValue: this.provisioningType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleProvisioningTypeChange(selected.target.value) }">
+            <a-radio-button value="thin">
+              {{ $t('label.provisioningtype.thin') }}
+            </a-radio-button>
+            <a-radio-button value="sparse">
+              {{ $t('label.provisioningtype.sparse') }}
+            </a-radio-button>
+            <a-radio-button value="fat">
+              {{ $t('label.provisioningtype.fat') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.customdisksize') }}
+            <a-tooltip :title="apiParams.customized.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['customdisksize', { initialValue: this.isCustomDiskSize }]" :checked="this.isCustomDiskSize" @change="val => { this.isCustomDiskSize = val }" />
+        </a-form-item>
+        <a-form-item v-if="!this.isCustomDiskSize">
+          <span slot="label">
+            {{ $t('label.disksize') }}
+            <a-tooltip :title="apiParams.disksize.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['disksize', {
+              rules: [
+                { required: true, message: $t('message.error.required.input') },
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && (isNaN(value) || value <= 0)) {
+                      callback(this.$t('message.error.number'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            :placeholder="this.$t('label.disksize')"/>
+        </a-form-item>
+        <a-form-item :label="$t('label.qostype')">
+          <a-radio-group
+            v-decorator="['qostype', {
+              initialValue: this.qosType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleQosTypeChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="hypervisor">
+              {{ $t('label.hypervisor') }}
+            </a-radio-button>
+            <a-radio-button value="storage">
+              {{ $t('label.storage') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskbytesreadrate') }}
+            <a-tooltip :title="apiParams.bytesreadrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskbytesreadrate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskbytesreadrate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskbyteswriterate') }}
+            <a-tooltip :title="apiParams.byteswriterate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskbyteswriterate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskbyteswriterate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskiopsreadrate') }}
+            <a-tooltip :title="apiParams.iopsreadrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsreadrate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsreadrate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'hypervisor'">
+          <span slot="label">
+            {{ $t('label.diskiopswriterate') }}
+            <a-tooltip :title="apiParams.iopswriterate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopswriterate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopswriterate')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage'">
+          <span slot="label">
+            {{ $t('label.iscustomizeddiskiops') }}
+            <a-tooltip :title="apiParams.customizediops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['iscustomizeddiskiops']" :checked="this.isCustomizedDiskIops" @change="val => { this.isCustomizedDiskIops = val }" />
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage' && !this.isCustomizedDiskIops">
+          <span slot="label">
+            {{ $t('label.diskiopsmin') }}
+            <a-tooltip :title="apiParams.miniops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsmin', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsmin')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage' && !this.isCustomizedDiskIops">
+          <span slot="label">
+            {{ $t('label.diskiopsmax') }}
+            <a-tooltip :title="apiParams.maxiops.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['diskiopsmax', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.diskiopsmax')"/>
+        </a-form-item>
+        <a-form-item v-if="this.qosType === 'storage'">
+          <span slot="label">
+            {{ $t('label.hypervisorsnapshotreserve') }}
+            <a-tooltip :title="apiParams.hypervisorsnapshotreserve.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['hypervisorsnapshotreserve', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.error.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.hypervisorsnapshotreserve')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.writecachetype') }}
+            <a-tooltip :title="apiParams.cachemode.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['writecachetype', {
+              initialValue: this.writeCacheType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleWriteCacheTypeChange(selected.target.value) }">
+            <a-radio-button value="none">
+              {{ $t('label.nodiskcache') }}
+            </a-radio-button>
+            <a-radio-button value="writeback">
+              {{ $t('label.writeback') }}
+            </a-radio-button>
+            <a-radio-button value="writethrough">
+              {{ $t('label.writethrough') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.isAdmin()">
+          <span slot="label">
+            {{ $t('label.storagetags') }}
+            <a-tooltip :title="apiParams.tags.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="tags"
+            v-decorator="['tags', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="storageTagLoading"
+            :placeholder="this.$t('label.tags')"
+            v-if="this.isAdmin()">
+            <a-select-option v-for="(opt) in this.storageTags" :key="opt">
+              {{ opt }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.ispublic')" v-show="this.isAdmin()">
+          <a-switch v-decorator="['ispublic', {initialValue: this.isPublic}]" :checked="this.isPublic" @change="val => { this.isPublic = val }" />
+        </a-form-item>
+        <a-form-item v-if="!this.isPublic">
+          <span slot="label">
+            {{ $t('label.domainid') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="multiple"
+            v-decorator="['domainid', {
+              rules: [
+                {
+                  required: true,
+                  message: $t('message.error.select')
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="this.$t('label.domainid')">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            mode="multiple"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback(this.$t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            @select="val => fetchvSphereStoragePolicies(val)"
+            :loading="zoneLoading"
+            :placeholder="this.$t('label.zoneid')">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="'listVsphereStoragePolicies' in $store.getters.apis && storagePolicies !== null">
+          <span slot="label">
+            {{ $t('label.vmware.storage.policy') }}
+            <a-tooltip :title="apiParams.storagetype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['storagepolicy']"
+            :placeholder="apiParams.storagepolicy.description">
+            <a-select-option v-for="policy in this.storagePolicies" :key="policy.id">
+              {{ policy.name || policy.id }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AddDiskOffering',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+  },
+  data () {
+    return {
+      storageType: 'shared',
+      provisioningType: 'thin',
+      isCustomDiskSize: true,
+      qosType: '',
+      isCustomizedDiskIops: false,
+      writeCacheType: 'none',
+      selectedDomains: [],
+      selectedZoneIndex: [],
+      storageTags: [],
+      storagePolicies: null,
+      storageTagLoading: false,
+      isPublic: true,
+      domains: [],
+      domainLoading: false,
+      zones: [],
+      zoneLoading: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, {
+      onValuesChange: (_, values) => {
+        this.selectedZoneIndex = values.zoneid
+      }
+    })
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createDiskOffering || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: null,
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+    this.isPublic = this.isAdmin()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+      if (this.isAdmin()) {
+        this.fetchStorageTagData()
+      }
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    arrayHasItems (array) {
+      return array !== null && array !== undefined && Array.isArray(array) && array.length > 0
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    fetchStorageTagData () {
+      const params = {}
+      params.listAll = true
+      this.storageTagLoading = true
+      api('listStorageTags', params).then(json => {
+        const tags = json.liststoragetagsresponse.storagetag || []
+        for (const tag of tags) {
+          if (!this.storageTags.includes(tag.name)) {
+            this.storageTags.push(tag.name)
+          }
+        }
+      }).finally(() => {
+        this.storageTagLoading = false
+      })
+    },
+    fetchvSphereStoragePolicies (zoneIndex) {
+      if (zoneIndex === 0 || this.selectedZoneIndex.length > 1) {
+        this.storagePolicies = null
+        return
+      }
+      const zoneid = this.zones[zoneIndex].id
+      if ('importVsphereStoragePolicies' in this.$store.getters.apis) {
+        this.storagePolicies = []
+        api('listVsphereStoragePolicies', {
+          zoneid: zoneid
+        }).then(response => {
+          this.storagePolicies = response.listvspherestoragepoliciesresponse.StoragePolicy || []
+        })
+      }
+    },
+    handleStorageTypeChange (val) {
+      this.storageType = val
+    },
+    handleProvisioningTypeChange (val) {
+      this.provisioningType = val
+    },
+    handleQosTypeChange (val) {
+      this.qosType = val
+    },
+    handleWriteCacheTypeChange (val) {
+      this.writeCacheType = val
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {
+          isMirrored: false,
+          name: values.name,
+          displaytext: values.displaytext,
+          storageType: values.storagetype,
+          cacheMode: values.writecachetype,
+          provisioningType: values.provisioningtype,
+          customized: values.customdisksize
+        }
+        if (values.customdisksize !== true) {
+          params.disksize = values.disksize
+        }
+        if (values.qostype === 'storage') {
+          var customIops = values.iscustomizeddiskiops === true
+          params.customizediops = customIops
+          if (!customIops) {
+            if (values.diskiopsmin != null && values.diskiopsmin.length > 0) {
+              params.miniops = values.diskiopsmin
+            }
+            if (values.diskiopsmax != null && values.diskiopsmax.length > 0) {
+              params.maxiops = values.diskiopsmax
+            }
+            if (values.hypervisorsnapshotreserve != null && values.hypervisorsnapshotreserve.length > 0) {
+              params.hypervisorsnapshotreserve = values.hypervisorsnapshotreserve
+            }
+          }
+        } else if (values.qostype === 'hypervisor') {
+          if (values.diskbytesreadrate != null && values.diskbytesreadrate.length > 0) {
+            params.bytesreadrate = values.diskbytesreadrate
+          }
+          if (values.diskbyteswriterate != null && values.diskbyteswriterate.length > 0) {
+            params.byteswriterate = values.diskbyteswriterate
+          }
+          if (values.diskiopsreadrate != null && values.diskiopsreadrate.length > 0) {
+            params.iopsreadrate = values.diskiopsreadrate
+          }
+          if (values.diskiopswriterate != null && values.diskiopswriterate.length > 0) {
+            params.iopswriterate = values.diskiopswriterate
+          }
+        }
+        if (values.tags != null && values.tags.length > 0) {
+          var tags = values.tags.join(',')
+          params.tags = tags
+        }
+        if (values.ispublic !== true) {
+          var domainIndexes = values.domainid
+          var domainId = null
+          if (domainIndexes && domainIndexes.length > 0) {
+            var domainIds = []
+            for (var i = 0; i < domainIndexes.length; i++) {
+              domainIds = domainIds.concat(this.domains[domainIndexes[i]].id)
+            }
+            domainId = domainIds.join(',')
+          }
+          if (domainId) {
+            params.domainid = domainId
+          }
+        }
+        var zoneIndexes = values.zoneid
+        var zoneId = null
+        if (zoneIndexes && zoneIndexes.length > 0) {
+          var zoneIds = []
+          for (var j = 0; j < zoneIndexes.length; j++) {
+            zoneIds = zoneIds.concat(this.zones[zoneIndexes[j]].id)
+          }
+          zoneId = zoneIds.join(',')
+        }
+        if (zoneId) {
+          params.zoneid = zoneId
+        }
+        if (values.storagepolicy) {
+          params.storagepolicy = values.storagepolicy
+        }
+        api('createDiskOffering', params).then(json => {
+          this.$message.success(`${this.$t('message.disk.offering.created')} ${values.name}`)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 800px) {
+      width: 430px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/offering/AddNetworkOffering.vue b/ui/src/views/offering/AddNetworkOffering.vue
new file mode 100644
index 0000000..6e56f5b
--- /dev/null
+++ b/ui/src/views/offering/AddNetworkOffering.vue
@@ -0,0 +1,983 @@
+// 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.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.name') }]
+            }]"
+            :placeholder="this.$t('label.name')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.displaytext') }}
+            <a-tooltip :title="apiParams.displaytext.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: $t('message.error.description') }]
+            }]"
+            :placeholder="this.$t('label.displaytext')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.networkrate') }}
+            <a-tooltip :title="apiParams.networkrate.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['networkrate', {
+              rules: [{
+                validator: (rule, value, callback) => {
+                  if (value && (isNaN(value) || value <= 0)) {
+                    callback(this.$t('message.validate.number'))
+                  }
+                  callback()
+                }
+              }]
+            }]"
+            :placeholder="this.$t('label.networkrate')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.guestiptype') }}
+            <a-tooltip :title="apiParams.guestiptype.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['guestiptype', {
+              initialValue: this.guestType
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleGuestTypeChange(selected.target.value) }">
+            <a-radio-button value="isolated">
+              {{ $t('label.isolated') }}
+            </a-radio-button>
+            <a-radio-button value="l2">
+              {{ $t('label.l2') }}
+            </a-radio-button>
+            <a-radio-button value="shared">
+              {{ $t('label.shared') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.guestType !== 'shared'">
+          <span slot="label">
+            {{ $t('label.ispersistent') }}
+            <a-tooltip :title="apiParams.ispersistent.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['ispersistent', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item v-if="this.guestType !== 'shared'">
+          <span slot="label">
+            {{ $t('label.specifyvlan') }}
+            <a-tooltip :title="apiParams.specifyvlan.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['specifyvlan', {initialValue: true}]" :defaultChecked="true" />
+        </a-form-item>
+        <a-form-item v-if="this.guestType === 'isolated'">
+          <span slot="label">
+            {{ $t('label.vpc') }}
+            <a-tooltip :title="apiParams.forvpc.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['forvpc', {initialValue: this.forVpc}]" :defaultChecked="this.forVpc" @change="val => { this.handleForVpcChange(val) }" />
+        </a-form-item>
+        <a-form-item :label="$t('label.userdatal2')" v-if="this.guestType === 'l2'">
+          <a-switch v-decorator="['userdatal2', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.lbtype')" v-if="this.forVpc && this.lbServiceChecked">
+          <a-radio-group
+            v-decorator="[' ', {
+              initialValue: 'publicLb'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="publicLb">
+              {{ $t('label.public.lb') }}
+            </a-radio-button>
+            <a-radio-button value="internalLb">
+              {{ $t('label.internal.lb') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.promiscuousmode')">
+          <a-radio-group
+            v-decorator="['promiscuousmode', {
+              initialValue: this.promiscuousMode
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handlePromiscuousModeChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="true">
+              {{ $t('label.accept') }}
+            </a-radio-button>
+            <a-radio-button value="false">
+              {{ $t('label.reject') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.macaddresschanges')">
+          <a-radio-group
+            v-decorator="['macaddresschanges', {
+              initialValue: this.macAddressChanges
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleMacAddressChangesChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="true">
+              {{ $t('label.accept') }}
+            </a-radio-button>
+            <a-radio-button value="false">
+              {{ $t('label.reject') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.forgedtransmits')">
+          <a-radio-group
+            v-decorator="['forgedtransmits', {
+              initialValue: this.forgedTransmits
+            }]"
+            buttonStyle="solid"
+            @change="selected => { this.handleForgedTransmitsChange(selected.target.value) }">
+            <a-radio-button value="">
+              {{ $t('label.none') }}
+            </a-radio-button>
+            <a-radio-button value="true">
+              {{ $t('label.accept') }}
+            </a-radio-button>
+            <a-radio-button value="false">
+              {{ $t('label.reject') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.guestType !== 'l2'">
+          <span slot="label">
+            {{ $t('label.supportedservices') }}
+            <a-tooltip :title="apiParams.supportedservices.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <div class="supported-services-container" scroll-to="last-child">
+            <a-list itemLayout="horizontal" :dataSource="this.supportedServices">
+              <a-list-item slot="renderItem" slot-scope="item">
+                <CheckBoxSelectPair
+                  v-decorator="['service.'+item.name, {}]"
+                  :resourceKey="item.name"
+                  :checkBoxLabel="item.description"
+                  :checkBoxDecorator="'service.' + item.name"
+                  :selectOptions="item.provider"
+                  :selectDecorator="item.name + '.provider'"
+                  @handle-checkpair-change="handleSupportedServiceChange"/>
+              </a-list-item>
+            </a-list>
+          </div>
+        </a-form-item>
+        <a-form-item v-if="this.isVirtualRouterForAtLeastOneService">
+          <span slot="label">
+            {{ $t('label.serviceofferingid') }}
+            <a-tooltip :title="apiParams.serviceofferingid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['serviceofferingid', {
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ],
+              initialValue: 0
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="serviceOfferingLoading"
+            :placeholder="this.$t('label.serviceofferingid')">
+            <a-select-option v-for="(opt, optIndex) in this.serviceOfferings" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.redundantrouter')" v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && this.sourceNatServiceChecked && !this.isVpcVirtualRouterForAtLeastOneService">
+          <a-switch v-decorator="['redundantroutercapability', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.sourcenattype')" v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && this.sourceNatServiceChecked">
+          <a-radio-group
+            v-decorator="['sourcenattype', {
+              initialValue: 'peraccount'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="peraccount">
+              {{ $t('label.per.account') }}
+            </a-radio-button>
+            <a-radio-button value="perzone">
+              {{ $t('label.per.zone') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.lb.elasticlbcheckbox')" v-if="this.guestType == 'shared' && this.lbServiceChecked && this.lbServiceProvider === 'Netscaler'">
+          <a-switch v-decorator="['elasticlb', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.service.lb.inlinemodedropdown')" v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && this.lbServiceChecked && this.firewallServiceChecked && this.lbServiceProvider === 'F5BigIp' && this.firewallServiceProvider === 'JuniperSRX'">
+          <a-radio-group
+            v-decorator="['inlinemode', {
+              initialValue: 'false'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="false">
+              {{ $t('side.by.side') }}
+            </a-radio-button>
+            <a-radio-button value="true">
+              {{ $t('inline') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.lb.netscaler.servicepackages')" v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && this.lbServiceChecked && this.lbServiceProvider === 'Netscaler'">
+          <a-select
+            v-decorator="['netscalerservicepackages', {}]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="registeredServicePackageLoading"
+            :placeholder="this.$t('label.service.lb.netscaler.servicepackages')">
+            <a-select-option v-for="(opt, optIndex) in this.registeredServicePackages" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.lb.netscaler.servicepackages.description')" v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && this.lbServiceChecked && this.lbServiceProvider === 'Netscaler'">
+          <a-input
+            v-decorator="['netscalerservicepackagesdescription', {}]"
+            :placeholder="this.$t('label.service.lb.netscaler.servicepackages.description')"/>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.lb.lbisolationdropdown')" v-show="false">
+          <a-radio-group
+            v-decorator="['isolation', {
+              initialValue: 'dedicated'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="dedicated">
+              {{ $t('label.dedicated') }}
+            </a-radio-button>
+            <a-radio-button value="shared">
+              {{ $t('label.shared') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.staticnat.elasticipcheckbox')" v-if="this.guestType == 'shared' && this.staticNatServiceChecked && this.staticNatServiceProvider === 'Netscaler'">
+          <a-switch v-decorator="['elasticip', {initialValue: this.isElasticIp}]" :defaultChecked="this.isElasticIp" @change="val => { this.isElasticIp = val }" />
+        </a-form-item>
+        <a-form-item :label="$t('label.service.staticnat.associatepublicip')" v-if="this.isElasticIp && this.staticNatServiceChecked && this.staticNatServiceProvider === 'Netscaler'">
+          <a-switch v-decorator="['associatepublicip', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.supportsstrechedl2subnet')" v-if="this.connectivityServiceChecked">
+          <a-switch v-decorator="['supportsstrechedl2subnet', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.supportspublicaccess')" v-show="false">
+          <a-switch v-decorator="['supportspublicaccess', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item v-if="(this.guestType === 'shared' || this.guestType === 'isolated') && !this.isVpcVirtualRouterForAtLeastOneService">
+          <span slot="label">
+            {{ $t('label.conservemode') }}
+            <a-tooltip :title="apiParams.conservemode.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['conservemode', {initialValue: true}]" :defaultChecked="true" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.tags') }}
+            <a-tooltip :title="apiParams.tags.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['tags', {}]"
+            :placeholder="this.$t('label.tags')"/>
+        </a-form-item>
+        <a-form-item v-if="this.requiredNetworkOfferingExists && this.guestType === 'isolated' && this.sourceNatServiceChecked">
+          <span slot="label">
+            {{ $t('label.availability') }}
+            <a-tooltip :title="apiParams.availability.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['availability', {
+              initialValue: 'optional'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="optional">
+              {{ $t('label.optional') }}
+            </a-radio-button>
+            <a-radio-button value="required">
+              {{ $t('label.required') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item v-if="this.firewallServiceChecked">
+          <span slot="label">
+            {{ $t('label.egressdefaultpolicy') }}
+            <a-tooltip :title="apiParams.egressdefaultpolicy.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-radio-group
+            v-decorator="['egressdefaultpolicy', {
+              initialValue: 'allow'
+            }]"
+            buttonStyle="solid">
+            <a-radio-button value="allow">
+              {{ $t('label.allow') }}
+            </a-radio-button>
+            <a-radio-button value="deny">
+              {{ $t('label.deny') }}
+            </a-radio-button>
+          </a-radio-group>
+        </a-form-item>
+        <a-form-item :label="$t('label.ispublic')" v-show="this.isAdmin()">
+          <a-switch v-decorator="['ispublic', {initialValue: this.isPublic}]" :defaultChecked="this.isPublic" @change="val => { this.isPublic = val }" />
+        </a-form-item>
+        <a-form-item v-if="!this.isPublic">
+          <span slot="label">
+            {{ $t('label.domainid') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="multiple"
+            v-decorator="['domainid', {
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="this.$t('label.domain')">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            mode="multiple"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback($t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="this.$t('label.zone')">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="apiParams.enable">
+          <span slot="label">
+            {{ $t('label.enable.network.offering') }}
+            <a-tooltip :title="apiParams.enable.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['enable', {initialValue: false}]" />
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import CheckBoxSelectPair from '@/components/CheckBoxSelectPair'
+
+export default {
+  name: 'AddNetworkOffering',
+  components: {
+    CheckBoxSelectPair
+  },
+  data () {
+    return {
+      hasAdvanceZone: false,
+      requiredNetworkOfferingExists: false,
+      guestType: 'isolated',
+      promiscuousMode: '',
+      macAddressChanges: '',
+      forgedTransmits: '',
+      selectedDomains: [],
+      selectedZones: [],
+      forVpc: false,
+      supportedServices: [],
+      supportedServiceLoading: false,
+      isVirtualRouterForAtLeastOneService: false,
+      isVpcVirtualRouterForAtLeastOneService: false,
+      serviceOfferings: [],
+      serviceOfferingLoading: false,
+      sourceNatServiceChecked: false,
+      lbServiceChecked: false,
+      lbServiceProvider: '',
+      isElasticIp: false,
+      staticNatServiceChecked: false,
+      staticNatServiceProvider: '',
+      connectivityServiceChecked: false,
+      firewallServiceChecked: false,
+      firewallServiceProvider: '',
+      selectedServiceProviderMap: {},
+      isPublic: true,
+      domains: [],
+      domainLoading: false,
+      zones: [],
+      zoneLoading: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createNetworkOffering || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: null,
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+      this.fetchSupportedServiceData()
+      this.fetchServiceOfferingData()
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isSupportedServiceObject (obj) {
+      return (obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object && 'provider' in obj)
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    handleGuestTypeChange (val) {
+      this.guestType = val
+    },
+    handlePromiscuousModeChange (val) {
+      this.promiscuousMode = val
+    },
+    handleMacAddressChangesChange (val) {
+      this.macAddressChanges = val
+    },
+    handleForgedTransmitsChange (val) {
+      this.forgedTransmits = val
+    },
+    fetchSupportedServiceData () {
+      const params = {}
+      params.listAll = true
+      this.supportedServiceLoading = true
+      this.supportedServices = []
+      api('listSupportedNetworkServices', params).then(json => {
+        this.supportedServices = json.listsupportednetworkservicesresponse.networkservice
+        for (var i in this.supportedServices) {
+          var networkServiceObj = this.supportedServices[i]
+          var serviceName = networkServiceObj.name
+          var serviceDisplayName = serviceName
+
+          // Sanitize names
+          // switch (serviceName) {
+          //   case 'Vpn':
+          //     serviceDisplayName = this.$t('label.vpn')
+          //     break
+          //   case 'Dhcp':
+          //     serviceDisplayName = this.$t('label.dhcp')
+          //     break
+          //   case 'Dns':
+          //     serviceDisplayName = this.$t('label.dns')
+          //     break
+          //   case 'Lb':
+          //     serviceDisplayName = this.$t('label.load.balancer')
+          //     break
+          //   case 'SourceNat':
+          //     serviceDisplayName = this.$t('label.source.nat')
+          //     break
+          //   case 'StaticNat':
+          //     serviceDisplayName = this.$t('label.static.nat')
+          //     break
+          //   case 'PortForwarding':
+          //     serviceDisplayName = this.$t('label.port.forwarding')
+          //     break
+          //   case 'UserData':
+          //     serviceDisplayName = this.$t('label.user.data')
+          //     break
+          //   case 'Connectivity':
+          //     serviceDisplayName = this.$t('label.virtual.networking')
+          //     break
+          //   default:
+          //     serviceDisplayName = serviceName
+          //     break
+          // }
+          var providers = []
+          for (var j in this.supportedServices[i].provider) {
+            var provider = this.supportedServices[i].provider[j]
+            provider.description = provider.name
+            provider.enabled = true
+            if (provider.name === 'VpcVirtualRouter') {
+              provider.enabled = false
+            }
+            if (provider.name === 'VirtualRouter') {
+              providers.unshift(provider)
+            } else {
+              providers.push(provider)
+            }
+          }
+          this.supportedServices[i].provider = providers
+          this.supportedServices[i].description = serviceDisplayName
+        }
+      })
+    },
+    fetchServiceOfferingData () {
+      const params = {}
+      params.issystem = true
+      params.systemvmtype = 'domainrouter'
+      this.supportedServiceLoading = true
+      api('listServiceOfferings', params).then(json => {
+        const listServiceOfferings = json.listserviceofferingsresponse.serviceoffering
+        this.serviceOfferings = this.serviceOfferings.concat(listServiceOfferings)
+      }).finally(() => {
+        this.supportedServiceLoading = false
+      })
+    },
+    fetchRegisteredServicePackageData () {
+      this.registeredServicePackageLoading = true
+      this.registeredServicePackages = []
+      api('listRegisteredServicePackages', {}).then(json => {
+        var servicePackages = json.listregisteredservicepackage.registeredServicepackage
+        if (servicePackages === undefined || servicePackages == null || !servicePackages) {
+          servicePackages = json.listregisteredservicepackage
+        }
+        for (var i in servicePackages) {
+          this.registeredServicePackages.push({
+            id: servicePackages[i].id,
+            description: servicePackages[i].name,
+            desc: servicePackages[i].description
+          })
+        }
+      }).finally(() => {
+        this.registeredServicePackageLoading = false
+      })
+    },
+    handleForVpcChange (forVpc) {
+      var self = this
+      this.forVpc = forVpc
+      this.supportedServices.forEach(function (svc, index) {
+        if (svc !== 'Connectivity') {
+          var providers = svc.provider
+          providers.forEach(function (provider, providerIndex) {
+            if (self.forVpc) { // *** vpc ***
+              if (provider.name === 'InternalLbVm' || provider.name === 'VpcVirtualRouter' || provider.name === 'Netscaler' || provider.name === 'BigSwitchBcf' || provider.name === 'ConfigDrive') {
+                provider.enabled = true
+              } else {
+                provider.enabled = false
+              }
+            } else { // *** non-vpc ***
+              if (provider.name === 'InternalLbVm' || provider.name === 'VpcVirtualRouter') {
+                provider.enabled = false
+              } else {
+                provider.enabled = true
+              }
+            }
+            providers[providerIndex] = provider
+          })
+          svc.provider = providers
+          self.supportedServices[index] = svc
+        }
+      })
+    },
+    handleSupportedServiceChange (service, checked, provider) {
+      if (service === 'SourceNat') {
+        this.sourceNatServiceChecked = checked
+      } else if (service === 'Lb') {
+        if (checked) {
+          this.fetchRegisteredServicePackageData()
+          if (provider != null & provider !== undefined) {
+            this.lbServiceProvider = provider
+          }
+        } else {
+          this.lbServiceProvider = ''
+        }
+        this.lbServiceChecked = checked
+      } else if (service === 'StaticNat') {
+        this.staticNatServiceChecked = checked
+        if (checked && provider != null & provider !== undefined) {
+          this.staticNatServiceProvider = provider
+        } else {
+          this.staticNatServiceProvider = ''
+        }
+      } else if (service === 'Connectivity') {
+        this.connectivityServiceChecked = checked
+      } else if (service === 'Firewall') {
+        this.firewallServiceChecked = checked
+        if (checked && provider != null & provider !== undefined) {
+          this.staticNatServiceProvider = provider
+        } else {
+          this.staticNatServiceProvider = ''
+        }
+      }
+      if (checked && provider != null & provider !== undefined) {
+        this.selectedServiceProviderMap[service] = provider
+      } else {
+        delete this.selectedServiceProviderMap[service]
+      }
+      var providers = Object.values(this.selectedServiceProviderMap)
+      this.isVirtualRouterForAtLeastOneService = false
+      this.isVpcVirtualRouterForAtLeastOneService = false
+      var self = this
+      providers.forEach(function (prvdr, idx) {
+        if (prvdr === 'VirtualRouter') {
+          self.isVirtualRouterForAtLeastOneService = true
+          if (self.serviceOfferings.length === 0) {
+            self.fetchServiceOfferingData()
+          }
+        }
+        if (prvdr === 'VpcVirtualRouter') {
+          self.isVpcVirtualRouterForAtLeastOneService = true
+        }
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {}
+
+        var self = this
+        var selectedServices = null
+        var keys = Object.keys(values)
+        var ignoredKeys = ['state', 'status', 'allocationstate', 'forvpc', 'specifyvlan', 'ispublic', 'domainid', 'zoneid', 'egressdefaultpolicy', 'promiscuousmode', 'macaddresschanges', 'forgedtransmits', 'isolation', 'supportspublicaccess']
+        keys.forEach(function (key, keyIndex) {
+          if (self.isSupportedServiceObject(values[key])) {
+            if (selectedServices == null) {
+              selectedServices = {}
+            }
+            selectedServices[key] = values[key]
+          } else {
+            if (!ignoredKeys.includes(key) &&
+              values[key] != null && values[key] !== undefined &&
+              !(key === 'availability' && values[key] === 'Optional')) {
+              params[key] = values[key]
+            }
+          }
+        })
+
+        if (values.guestiptype === 'shared') { // specifyVlan checkbox is disabled, so inputData won't include specifyVlan
+          params.specifyvlan = true
+          params.specifyipranges = true
+          delete params.ispersistent
+        } else if (values.guestiptype === 'isolated') { // specifyVlan checkbox is shown
+          if (values.specifyvlan === true) {
+            params.specifyvlan = true
+          }
+          if (values.ispersistent) {
+            params.ispersistent = true
+          } else { // Isolated Network with Non-persistent network
+            delete params.ispersistent
+          }
+        } else if (values.guestiptype === 'l2') {
+          if (values.specifyvlan === true) {
+            params.specifyvlan = true
+          }
+          if (values.userdatal2 === true) {
+            params['serviceProviderList[0].service'] = 'UserData'
+            params['serviceProviderList[0].provider'] = 'ConfigDrive'
+            params.supportedservices = 'UserData'
+          }
+          // 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 params.conservemode
+        }
+
+        if (values.forvpc === true) {
+          params.forvpc = true
+        }
+        if (values.guestiptype === 'shared' || values.guestiptype === 'isolated') {
+          if (values.conservemode !== true) {
+            params.conservemode = false
+          }
+        }
+        if (selectedServices != null) {
+          var supportedServices = Object.keys(selectedServices)
+          params.supportedservices = supportedServices.join(',')
+          for (var k in supportedServices) {
+            params['serviceProviderList[' + k + '].service'] = supportedServices[k]
+            params['serviceProviderList[' + k + '].provider'] = selectedServices[supportedServices[k]].provider
+          }
+          var serviceCapabilityIndex = 0
+          if (supportedServices.includes('Connectivity')) {
+            if (values.supportsstrechedl2subnet === true) {
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RegionLevelVpc'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            if (values.supportspublicaccess === true) {
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'DistributedRouter'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            delete params.supportsstrechedl2subnet
+            delete params.supportspublicaccess
+          }
+          if (supportedServices.includes('SourceNat')) {
+            if (values.redundantroutercapability === true) {
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'SourceNat'
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedSourceNatTypes'
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.sourcenattype
+            serviceCapabilityIndex++
+            delete params.redundantroutercapability
+            delete params.sourcenattype
+          }
+          if (supportedServices.includes('SourceNat')) {
+            if (values.elasticip === true) {
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticIp'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            if (values.elasticip === true || values.associatepublicip === true) {
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'StaticNat'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'associatePublicIP'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.associatepublicip
+              serviceCapabilityIndex++
+            }
+            delete params.elasticip
+            delete params.associatepublicip
+          }
+          if (supportedServices.includes('Lb')) {
+            if (values.elasticlb === true) {
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'ElasticLb'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            if (values.inlinemode === true && ((selectedServices.Lb.provider === 'F5BigIp') || (selectedServices.Lb.provider === 'Netscaler'))) {
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'InlineMode'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.inlinemode
+              serviceCapabilityIndex++
+            }
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb'
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'SupportedLbIsolation'
+            params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = values.isolation
+            serviceCapabilityIndex++
+            if (selectedServices.Lb.provider === 'InternalLbVm') {
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].service'] = 'lb'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilitytype'] = 'lbSchemes'
+              params['servicecapabilitylist[' + serviceCapabilityIndex + '].capabilityvalue'] = 'internal'
+              serviceCapabilityIndex++
+            }
+            if ('netscalerservicepackages' in values &&
+              this.registeredServicePackages.length > values.netscalerservicepackages &&
+              'netscalerservicepackagesdescription' in values) {
+              params['details[' + 0 + '].servicepackageuuid'] = this.registeredServicePackages[values.netscalerservicepackages].id
+              params['details[' + 1 + '].servicepackagedescription'] = values.netscalerservicepackagesdescription
+            }
+          }
+        } else {
+          if (!('supportedservices' in params)) {
+            params.supportedservices = ''
+          }
+        }
+
+        if ('egressdefaultpolicy' in values && values.egressdefaultpolicy !== 'allow') {
+          params.egressdefaultpolicy = false
+        }
+        if (values.promiscuousmode) {
+          params['details[0].promiscuousMode'] = values.promiscuousmode
+        }
+        if (values.macaddresschanges) {
+          params['details[0].macaddresschanges'] = values.macaddresschanges
+        }
+        if (values.forgedtransmits) {
+          params['details[0].forgedtransmits'] = values.forgedtransmits
+        }
+        if (values.ispublic !== true) {
+          var domainIndexes = values.domainid
+          var domainId = null
+          if (domainIndexes && domainIndexes.length > 0) {
+            var domainIds = []
+            for (var i = 0; i < domainIndexes.length; i++) {
+              domainIds = domainIds.concat(this.domains[domainIndexes[i]].id)
+            }
+            domainId = domainIds.join(',')
+          }
+          if (domainId) {
+            params.domainid = domainId
+          }
+        }
+        var zoneIndexes = values.zoneid
+        var zoneId = null
+        if (zoneIndexes && zoneIndexes.length > 0) {
+          var zoneIds = []
+          for (var j = 0; j < zoneIndexes.length; j++) {
+            zoneIds = zoneIds.concat(this.zones[zoneIndexes[j]].id)
+          }
+          zoneId = zoneIds.join(',')
+        }
+        if (zoneId) {
+          params.zoneid = zoneId
+        }
+        if (values.enable) {
+          params.enable = values.enable
+        }
+        params.traffictype = 'GUEST' // traffic type dropdown has been removed since it has only one option ('Guest'). Hardcode traffic type value here.
+        api('createNetworkOffering', params).then(json => {
+          this.$message.success('Network offering created: ' + values.name)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 800px) {
+      width: 500px;
+    }
+  }
+  .supported-services-container {
+    height: 250px;
+    overflow: auto;
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/offering/AddVpcOffering.vue b/ui/src/views/offering/AddVpcOffering.vue
new file mode 100644
index 0000000..99fafa8
--- /dev/null
+++ b/ui/src/views/offering/AddVpcOffering.vue
@@ -0,0 +1,454 @@
+// 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.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.name') }]
+            }]"
+            :placeholder="this.$t('label.name')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.displaytext') }}
+            <a-tooltip :title="apiParams.displaytext.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['displaytext', {
+              rules: [{ required: true, message: $t('message.error.description') }]
+            }]"
+            :placeholder="this.$t('label.displaytext')"/>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.supportedservices') }}
+            <a-tooltip :title="apiParams.supportedservices.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <div class="supported-services-container" scroll-to="last-child">
+            <a-list itemLayout="horizontal" :dataSource="this.supportedServices">
+              <a-list-item slot="renderItem" slot-scope="item">
+                <CheckBoxSelectPair
+                  v-decorator="['service.'+item.name, {}]"
+                  :resourceKey="item.name"
+                  :checkBoxLabel="item.description"
+                  :checkBoxDecorator="'service.' + item.name"
+                  :selectOptions="item.provider"
+                  :selectDecorator="item.name + '.provider'"
+                  @handle-checkpair-change="handleSupportedServiceChange"/>
+              </a-list-item>
+            </a-list>
+          </div>
+        </a-form-item>
+        <a-form-item :label="$t('label.service.connectivity.regionlevelvpccapabilitycheckbox')" v-if="this.connectivityServiceChecked">
+          <a-switch v-decorator="['regionlevelvpc', {initialValue: true}]" defaultChecked />
+        </a-form-item>
+        <a-form-item :label="$t('label.service.connectivity.distributedroutercapabilitycheckbox')" v-if="this.connectivityServiceChecked">
+          <a-switch v-decorator="['distributedrouter', {initialValue: true}]" defaultChecked />
+        </a-form-item>
+        <a-form-item :label="$t('label.redundantrouter')" v-if="this.sourceNatServiceChecked">
+          <a-switch v-decorator="['redundantrouter', {initialValue: false}]" />
+        </a-form-item>
+        <a-form-item :label="$t('label.ispublic')" v-if="this.isAdmin()">
+          <a-switch v-decorator="['ispublic', {initialValue: this.isPublic}]" :defaultChecked="this.isPublic" @change="val => { this.isPublic = val }" />
+        </a-form-item>
+        <a-form-item v-if="!this.isPublic">
+          <span slot="label">
+            {{ $t('label.domainid') }}
+            <a-tooltip :title="apiParams.domainid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            mode="multiple"
+            v-decorator="['domainid', {
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="this.$t('label.domain')">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zoneid') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            id="zone-selection"
+            mode="multiple"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback($t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="this.$t('label.zone')">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item v-if="apiParams.enable">
+          <span slot="label">
+            {{ $t('label.enable.vpc.offering') }}
+            <a-tooltip :title="apiParams.enable.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-switch v-decorator="['enable', {initialValue: false}]" />
+        </a-form-item>
+      </a-form>
+      <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-spin>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import CheckBoxSelectPair from '@/components/CheckBoxSelectPair'
+
+export default {
+  name: 'AddVpcOffering',
+  components: {
+    CheckBoxSelectPair
+  },
+  data () {
+    return {
+      selectedDomains: [],
+      selectedZones: [],
+      isConserveMode: true,
+      isPublic: true,
+      domains: [],
+      domainLoading: false,
+      zones: [],
+      zoneLoading: false,
+      loading: false,
+      supportedServices: [],
+      supportedServiceLoading: false,
+      connectivityServiceChecked: false,
+      sourceNatServiceChecked: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createVPCOffering || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: null,
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchDomainData()
+      this.fetchZoneData()
+      this.fetchSupportedServiceData()
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    isSupportedServiceObject (obj) {
+      return (obj !== null && obj !== undefined && Object.keys(obj).length > 0 && obj.constructor === Object && 'provider' in obj)
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+      })
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+      })
+    },
+    fetchSupportedServiceData () {
+      this.supportedServices = []
+      this.supportedServices.push({
+        name: 'Dhcp',
+        provider: [
+          { name: 'VpcVirtualRouter' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'Dns',
+        provider: [{ name: 'VpcVirtualRouter' }]
+      })
+      this.supportedServices.push({
+        name: 'Lb',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'InternalLbVm' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'Gateway',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'BigSwitchBcf' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'StaticNat',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'BigSwitchBcf' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'SourceNat',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'BigSwitchBcf' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'NetworkACL',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'BigSwitchBcf' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'PortForwarding',
+        provider: [{ name: 'VpcVirtualRouter' }]
+      })
+      this.supportedServices.push({
+        name: 'UserData',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'ConfigDrive' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'Vpn',
+        provider: [
+          { name: 'VpcVirtualRouter' },
+          { name: 'BigSwitchBcf' }
+        ]
+      })
+      this.supportedServices.push({
+        name: 'Connectivity',
+        provider: [
+          { name: 'BigSwitchBcf' },
+          { name: 'NiciraNvp' },
+          { name: 'Ovs' },
+          { name: 'JuniperContrailVpcRouter' }
+        ]
+      })
+      for (var i in this.supportedServices) {
+        var serviceName = this.supportedServices[i].name
+        var serviceDisplayName = serviceName
+        // Sanitize names
+        this.supportedServices[i].description = serviceDisplayName
+      }
+    },
+    handleSupportedServiceChange (service, checked, provider) {
+      if (service === 'Connectivity') {
+        this.connectivityServiceChecked = checked
+      }
+      if (service === 'SourceNat') {
+        this.sourceNatServiceChecked = checked
+      }
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {}
+        params.name = values.name
+        params.displaytext = values.displaytext
+        if (values.ispublic !== true) {
+          var domainIndexes = values.domainid
+          var domainId = null
+          if (domainIndexes && domainIndexes.length > 0) {
+            var domainIds = []
+            for (var i = 0; i < domainIndexes.length; i++) {
+              domainIds = domainIds.concat(this.domains[domainIndexes[i]].id)
+            }
+            domainId = domainIds.join(',')
+          }
+          if (domainId) {
+            params.domainid = domainId
+          }
+        }
+        var zoneIndexes = values.zoneid
+        var zoneId = null
+        if (zoneIndexes && zoneIndexes.length > 0) {
+          var zoneIds = []
+          for (var j = 0; j < zoneIndexes.length; j++) {
+            zoneIds = zoneIds.concat(this.zones[zoneIndexes[j]].id)
+          }
+          zoneId = zoneIds.join(',')
+        }
+        if (zoneId) {
+          params.zoneid = zoneId
+        }
+        var selectedServices = null
+        var keys = Object.keys(values)
+        var self = this
+        keys.forEach(function (key, keyIndex) {
+          if (self.isSupportedServiceObject(values[key])) {
+            if (selectedServices == null) {
+              selectedServices = {}
+            }
+            selectedServices[key] = values[key]
+          }
+        })
+        if (selectedServices != null) {
+          var supportedServices = Object.keys(selectedServices)
+          params.supportedservices = supportedServices.join(',')
+          for (var k in supportedServices) {
+            params['serviceProviderList[' + k + '].service'] = supportedServices[k]
+            params['serviceProviderList[' + k + '].provider'] = selectedServices[supportedServices[k]].provider
+          }
+          var serviceCapabilityIndex = 0
+          if (supportedServices.includes('Connectivity')) {
+            if (values.regionlevelvpc === true) {
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RegionLevelVpc'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+            if (values.distributedrouter === true) {
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'Connectivity'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'DistributedRouter'
+              params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+              serviceCapabilityIndex++
+            }
+          }
+          if (supportedServices.includes('SourceNat') && values.redundantrouter === true) {
+            params['serviceCapabilityList[' + serviceCapabilityIndex + '].service'] = 'SourceNat'
+            params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilitytype'] = 'RedundantRouter'
+            params['serviceCapabilityList[' + serviceCapabilityIndex + '].capabilityvalue'] = true
+            serviceCapabilityIndex++
+          }
+        } else {
+          params.supportedservices = ''
+        }
+        if (values.enable) {
+          params.enable = values.enable
+        }
+        api('createVPCOffering', params).then(json => {
+          this.$message.success(`${this.$t('message.create.vpc.offering')}: ` + values.name)
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 800px) {
+      width: 500px;
+    }
+  }
+
+  .supported-services-container {
+    height: 250px;
+    overflow: auto;
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/offering/ImportBackupOffering.vue b/ui/src/views/offering/ImportBackupOffering.vue
new file mode 100644
index 0000000..782df3a
--- /dev/null
+++ b/ui/src/views/offering/ImportBackupOffering.vue
@@ -0,0 +1,242 @@
+// 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-form
+      layout="vertical"
+      :form="form"
+      @submit="handleSubmit">
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.name') }}
+          <a-tooltip :title="apiParams.name.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="['name', {
+            rules: [{ required: true, message: $t('message.error.required.input') }]
+          }]"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.description') }}
+          <a-tooltip :title="apiParams.description.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="['description', {
+            rules: [{ required: true, message: $t('message.error.required.input') }]
+          }]"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.zoneid') }}
+          <a-tooltip :title="apiParams.zoneid.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-select
+          showSearch
+          allowClear
+          v-decorator="['zoneid', {
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+          }]"
+          :loading="zones.loading"
+          @change="onChangeZone">
+          <a-select-option v-for="zone in zones.opts" :key="zone.name">
+            {{ zone.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.externalid') }}
+          <a-tooltip :title="apiParams.externalid.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-select
+          allowClear
+          v-decorator="['externalid', {
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+          }] "
+          :loading="externals.loading">
+          <a-select-option v-for="opt in externals.opts" :key="opt.id">
+            {{ opt.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.allowuserdrivenbackups') }}
+          <a-tooltip :title="apiParams.allowuserdrivenbackups.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-switch
+          v-decorator="['allowuserdrivenbackups']"
+          :default-checked="true"/>
+      </a-form-item>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading" @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>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'ImportBackupOffering',
+  data () {
+    return {
+      loading: false,
+      zones: {
+        loading: false,
+        opts: []
+      },
+      externals: {
+        loading: false,
+        opts: []
+      }
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.importBackupOffering || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  inject: ['parentFetchData'],
+  methods: {
+    fetchData () {
+      this.fetchZone()
+    },
+    fetchZone () {
+      this.zones.loading = true
+      api('listZones', { available: true }).then(json => {
+        this.zones.opts = json.listzonesresponse.zone || []
+        this.$forceUpdate()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(f => {
+        this.zones.loading = false
+      })
+    },
+    fetchExternal (zoneId) {
+      if (!zoneId) {
+        this.externals.opts = []
+        return
+      }
+      this.externals.loading = true
+      api('listBackupProviderOfferings', { zoneid: zoneId }).then(json => {
+        this.externals.opts = json.listbackupproviderofferingsresponse.backupoffering || []
+        this.$forceUpdate()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(f => {
+        this.externals.loading = false
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (key === 'zoneid') {
+            params[key] = this.zones.opts.filter(zone => zone.name === input)[0].id || null
+          } else {
+            params[key] = input
+          }
+        }
+        params.allowuserdrivenbackups = values.allowuserdrivenbackups ? values.allowuserdrivenbackups : true
+        this.loading = true
+        const title = this.$t('label.import.offering')
+        api('importBackupOffering', params).then(json => {
+          const jobId = json.importbackupofferingresponse.jobid
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                const successDescription = result.jobresult.backupoffering.name
+                this.$store.dispatch('AddAsyncJob', {
+                  title: title,
+                  jobid: jobId,
+                  description: successDescription,
+                  status: 'progress'
+                })
+                this.parentFetchData()
+                this.closeAction()
+              },
+              loadingMessage: `${title} ${this.$t('label.in.progress')} ${this.$t('label.for')} ${params.name}`,
+              catchMessage: this.$t('error.fetching.async.job.result')
+            })
+          }
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(f => {
+          this.loading = false
+        })
+      })
+    },
+    onChangeZone (value) {
+      if (!value) {
+        this.externals.opts = []
+        return
+      }
+      const zoneId = this.zones.opts.filter(zone => zone.name === value)[0].id || null
+      this.fetchExternal(zoneId)
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 30vw;
+
+  @media (min-width: 500px) {
+    width: 450px;
+  }
+
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/offering/UpdateOfferingAccess.vue b/ui/src/views/offering/UpdateOfferingAccess.vue
new file mode 100644
index 0000000..e5fc8c3
--- /dev/null
+++ b/ui/src/views/offering/UpdateOfferingAccess.vue
@@ -0,0 +1,318 @@
+// 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 :label="$t('label.ispublic')" v-show="this.isAdmin()">
+          <a-switch v-decorator="['ispublic', { initialValue: this.offeringIsPublic }]" :checked="this.offeringIsPublic" @change="val => { this.offeringIsPublic = val }" />
+        </a-form-item>
+
+        <a-form-item :label="$t('label.domainid')" v-if="!this.offeringIsPublic">
+          <a-select
+            mode="multiple"
+            v-decorator="['domainid', {
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ],
+              initialValue: this.selectedDomains
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="domainLoading"
+            :placeholder="this.apiParams.domainid.description">
+            <a-select-option v-for="(opt, optIndex) in this.domains" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <a-form-item :label="$t('label.zoneid')">
+          <a-select
+            id="zone-selection"
+            mode="multiple"
+            v-decorator="['zoneid', {
+              rules: [
+                {
+                  validator: (rule, value, callback) => {
+                    if (value && value.length > 1 && value.indexOf(0) !== -1) {
+                      callback($t('message.error.zone.combined'))
+                    }
+                    callback()
+                  }
+                }
+              ]
+            }]"
+            showSearch
+            optionFilterProp="children"
+            :filterOption="(input, option) => {
+              return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+            }"
+            :loading="zoneLoading"
+            :placeholder="this.apiParams.zoneid.description">
+            <a-select-option v-for="(opt, optIndex) in this.zones" :key="optIndex">
+              {{ opt.name || opt.description }}
+            </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: 'UpdateOfferingAccess',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      formOffering: {},
+      selectedDomains: [],
+      selectedZones: [],
+      offeringIsPublic: false,
+      domains: [],
+      domainLoading: false,
+      zones: [],
+      zoneLoading: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    switch (this.$route.meta.name) {
+      case 'computeoffering':
+        this.offeringType = 'ServiceOffering'
+        break
+      case 'diskoffering':
+        this.offeringType = 'DiskOffering'
+        break
+      case 'networkoffering':
+        this.offeringType = 'NetworkOffering'
+        break
+      case 'vpcoffering':
+        this.offeringType = 'VPCOffering'
+        break
+      default:
+        this.offeringType = this.$route.meta.name
+    }
+    this.apiParams = {}
+    this.apiParamsConfig = this.$store.getters.apis['update' + this.offeringType] || {}
+    this.apiParamsConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  created () {
+    this.zones = [
+      {
+        id: 'all',
+        name: this.$t('label.all.zone')
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.fetchOfferingData()
+      this.fetchDomainData()
+      this.fetchZoneData()
+    },
+    isAdmin () {
+      return ['Admin'].includes(this.$store.getters.userInfo.roletype)
+    },
+    fetchOfferingData () {
+      this.loading = true
+      const params = {}
+      params.id = this.resource.id
+      params.isrecursive = true
+      var apiName = 'list' + this.offeringType + 's'
+      api(apiName, params).then(json => {
+        const offerings = json[apiName.toLowerCase() + 'response'][this.offeringType.toLowerCase()]
+        this.formOffering = offerings[0]
+      }).finally(() => {
+        this.updateDomainSelection()
+        this.updateZoneSelection()
+        this.loading = false
+      })
+    },
+    fetchDomainData () {
+      const params = {}
+      params.listAll = true
+      params.details = 'min'
+      this.domainLoading = true
+      api('listDomains', params).then(json => {
+        const listDomains = json.listdomainsresponse.domain
+        this.domains = this.domains.concat(listDomains)
+      }).finally(() => {
+        this.domainLoading = false
+        this.updateDomainSelection()
+      })
+    },
+    fetchZoneData () {
+      const params = {}
+      params.listAll = true
+      this.zoneLoading = true
+      api('listZones', params).then(json => {
+        const listZones = json.listzonesresponse.zone
+        this.zones = this.zones.concat(listZones)
+      }).finally(() => {
+        this.zoneLoading = false
+        this.updateZoneSelection()
+      })
+    },
+    updateDomainSelection () {
+      if (!this.formOffering || Object.keys(this.formOffering).length === 0) return
+      var offeringDomainIds = this.formOffering.domainid
+      this.selectedDomains = []
+      if (offeringDomainIds) {
+        this.offeringIsPublic = false
+        offeringDomainIds = offeringDomainIds.indexOf(',') !== -1 ? offeringDomainIds.split(',') : [offeringDomainIds]
+        for (var i = 0; i < offeringDomainIds.length; i++) {
+          for (var j = 0; j < this.domains.length; j++) {
+            if (offeringDomainIds[i] === this.domains[j].id) {
+              this.selectedDomains.push(j)
+            }
+          }
+        }
+      } else {
+        if (this.isAdmin()) {
+          this.offeringIsPublic = true
+        }
+      }
+      if ('domainid' in this.form.fieldsStore.fieldsMeta) {
+        this.form.setFieldsValue({
+          domainid: this.selectedDomains
+        })
+      }
+    },
+    updateZoneSelection () {
+      if (!this.formOffering || Object.keys(this.formOffering).length === 0) return
+      var offeringZoneIds = this.formOffering.zoneid
+      this.selectedZones = []
+      if (offeringZoneIds) {
+        offeringZoneIds = offeringZoneIds.indexOf(',') !== -1 ? offeringZoneIds.split(',') : [offeringZoneIds]
+        for (var i = 0; i < offeringZoneIds.length; i++) {
+          for (var j = 0; j < this.zones.length; j++) {
+            if (offeringZoneIds[i] === this.zones[j].id) {
+              this.selectedZones.push(j)
+            }
+          }
+        }
+      }
+      this.form.setFieldsValue({
+        zoneid: this.selectedZones
+      })
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        const params = {}
+        params.id = this.resource.id
+        var ispublic = values.ispublic
+        if (ispublic === true) {
+          params.domainid = 'public'
+        } else {
+          var domainIndexes = values.domainid
+          var domainId = 'public'
+          if (domainIndexes && domainIndexes.length > 0) {
+            var domainIds = []
+            for (var i = 0; i < domainIndexes.length; i++) {
+              domainIds = domainIds.concat(this.domains[domainIndexes[i]].id)
+            }
+            domainId = domainIds.join(',')
+          }
+          params.domainid = domainId
+        }
+        var zoneIndexes = values.zoneid
+        var zoneId = 'all'
+        if (zoneIndexes && zoneIndexes.length > 0) {
+          var zoneIds = []
+          for (var j = 0; j < zoneIndexes.length; j++) {
+            zoneIds = zoneIds.concat(this.zones[zoneIndexes[j]].id)
+          }
+          zoneId = zoneIds.join(',')
+        }
+        params.zoneid = zoneId
+
+        this.loading = true
+        api('update' + this.offeringType, params).then(json => {
+          this.$emit('refresh-data')
+          this.$notification.success({
+            message: this.$t('label.action.update.offering.access'),
+            description: this.$t('label.action.update.offering.access')
+          })
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 600px) {
+      width: 25vw;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/plugins/CloudianPlugin.vue b/ui/src/views/plugins/CloudianPlugin.vue
new file mode 100644
index 0000000..f5a37ce
--- /dev/null
+++ b/ui/src/views/plugins/CloudianPlugin.vue
@@ -0,0 +1,59 @@
+// 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>
+    <span v-if="showError">
+      <a-alert type="error" :message="$t('message.error.cloudian.console')" showIcon />
+      <br/>
+      <a-button @click="doSso()">{{ $t('label.try.again') }}</a-button>
+    </span>
+    <span v-else>
+      <a-alert type="info" :message="$t('message.info.cloudian.console')" showIcon />
+    </span>
+    <br/>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CloudianPlugin',
+  mounted () {
+    this.doSso()
+  },
+  data () {
+    return {
+      showError: false
+    }
+  },
+  methods: {
+    doSso () {
+      this.showError = false
+      api('cloudianSsoLogin').then(json => {
+        const url = json.cloudianssologinresponse.cloudianssologin.url
+        const cmcWindow = window.open(url, 'CMCWindow')
+        cmcWindow.focus()
+      }).catch(error => {
+        this.$notifyError(error)
+        this.showError = true
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/plugins/IFramePlugin.vue b/ui/src/views/plugins/IFramePlugin.vue
new file mode 100644
index 0000000..3e07ba7
--- /dev/null
+++ b/ui/src/views/plugins/IFramePlugin.vue
@@ -0,0 +1,30 @@
+// 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>
+    <iframe :src="$route.meta.path" width="100%" frameBorder="0" style="height: 90vh">
+    </iframe>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'IFramePlugin'
+}
+</script>
diff --git a/ui/src/views/plugins/quota/EditTariffValueWizard.vue b/ui/src/views/plugins/quota/EditTariffValueWizard.vue
new file mode 100644
index 0000000..7293f2e
--- /dev/null
+++ b/ui/src/views/plugins/quota/EditTariffValueWizard.vue
@@ -0,0 +1,139 @@
+// 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>
+  <a-modal
+    v-if="showAction"
+    style="top: 20px;"
+    centered
+    :confirmLoading="loading"
+    :title="$t('label.quota.configuration')"
+    :closable="true"
+    :maskClosable="false"
+    :visible="showAction"
+    :okText="$t('label.ok')"
+    :cancelText="$t('label.cancel')"
+    @ok="submitTariff"
+    @cancel="onClose"
+  >
+    <a-form
+      :form="form"
+      layout="vertical"
+      @submit="submitTariff">
+      <a-form-item :label="$t('label.quota.value')">
+        <a-input
+          v-decorator="['value', {
+            rules: [{
+              required: true,
+              message: `${$t('message.error.required.input')}`
+            }]
+          }]"></a-input>
+      </a-form-item>
+      <a-form-item :label="$t('label.quota.tariff.effectivedate')">
+        <a-date-picker
+          :disabledDate="disabledDate"
+          style="width: 100%"
+          v-decorator="['startdate', {
+            rules: [{
+              type: 'object',
+              required: true,
+              message: `${$t('message.error.date')}`
+            }]
+          }]"></a-date-picker>
+      </a-form-item>
+    </a-form>
+  </a-modal>
+</template>
+
+<script>
+import { api } from '@/api'
+import moment from 'moment'
+
+export default {
+  name: 'EditTariffValueWizard',
+  props: {
+    showAction: {
+      type: Boolean,
+      default: () => false
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      pattern: 'YYYY-MM-DD'
+    }
+  },
+  inject: ['parentEditTariffAction', 'parentFetchData'],
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.form.getFieldDecorator('value', {
+      initialValue: this.resource.tariffValue
+    })
+  },
+  methods: {
+    onClose () {
+      this.parentEditTariffAction(false)
+    },
+    submitTariff (e) {
+      e.preventDefault()
+      this.form.validateFields((error, values) => {
+        if (error) return
+
+        const params = {}
+        params.usageType = this.resource.usageType
+        params.value = values.value
+        params.startdate = values.startdate.format(this.pattern)
+
+        this.loading = true
+
+        api('quotaTariffUpdate', {}, 'POST', params).then(json => {
+          const tariffResponse = json.quotatariffupdateresponse.quotatariff || {}
+          if (Object.keys(tariffResponse).length > 0) {
+            const effectiveDate = moment(tariffResponse.effectiveDate).format(this.pattern)
+            const query = this.$route.query
+            if (query.startdate !== effectiveDate) {
+              this.$router.replace({ path: 'quotatariff', query: { startdate: effectiveDate } })
+            }
+            this.parentFetchData()
+          }
+
+          this.onClose()
+        }).catch(error => {
+          this.$notification.error({
+            message: this.$t('message.request.failed'),
+            description: (error.response && error.response.headers && error.response.headers['x-description']) || error.message
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    disabledDate (current) {
+      return current && current < moment().endOf('day')
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/plugins/quota/EmailTemplateDetails.vue b/ui/src/views/plugins/quota/EmailTemplateDetails.vue
new file mode 100644
index 0000000..1d05ccd
--- /dev/null
+++ b/ui/src/views/plugins/quota/EmailTemplateDetails.vue
@@ -0,0 +1,121 @@
+// 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>
+  <a-spin :spinning="loading || loading">
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-form-item :label="$t('label.templatesubject')">
+          <a-textarea v-model="formModel.templatesubject" />
+        </a-form-item>
+      </a-col>
+    </a-row>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-form-item :label="$t('label.templatebody')">
+          <a-textarea v-model="formModel.templatebody" />
+        </a-form-item>
+      </a-col>
+    </a-row>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-form-item :label="$t('label.last.updated')">
+          <label>{{ resource.last_updated }}</label>
+        </a-form-item>
+      </a-col>
+    </a-row>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-button
+          style="float: right; margin-left: 10px;"
+          :disabled="!('quotaEmailTemplateUpdate' in $store.getters.apis)"
+          :loading="loading"
+          type="primary"
+          @click="handleSubmit">{{ $t('label.apply') }}</a-button>
+        <a-button
+          style="float: right;"
+          :disabled="!('quotaEmailTemplateUpdate' in $store.getters.apis)"
+          :loading="loading"
+          type="default"
+          @click="() => { $router.go(-1) }">{{ $t('label.cancel') }}</a-button>
+      </a-col>
+    </a-row>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'EmailTemplateDetails',
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  data () {
+    return {
+      resource: {},
+      formModel: {
+        templatesubject: null,
+        templatebody: null
+      },
+      loading: false
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      const params = {}
+      params.templatetype = this.$route.params.id
+
+      api('quotaEmailTemplateList', params).then(json => {
+        const listTemplates = json.quotaemailtemplatelistresponse.quotaemailtemplate || []
+        this.resource = listTemplates && listTemplates.length > 0 ? listTemplates[0] : {}
+        this.preFillDataValues()
+      }).catch(e => {
+        this.$notifyError(e)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    preFillDataValues () {
+      console.log(this.resource)
+      this.formModel.templatesubject = this.resource.templatesubject || null
+      this.formModel.templatebody = this.resource.templatebody || null
+    },
+    handleSubmit () {
+      const params = {}
+      params.templatesubject = this.formModel.templatesubject
+      params.templatebody = this.formModel.templatebody
+      params.templatetype = this.resource.templatetype
+
+      this.loading = true
+
+      api('quotaEmailTemplateUpdate', params).then(json => {
+        this.$message.success(this.$t('label.quota.email.edit') + ' - ' + this.resource.templatetype)
+        this.$router.go(-1)
+      }).catch(e => {
+        this.$notifyError(e)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/plugins/quota/QuotaBalance.vue b/ui/src/views/plugins/quota/QuotaBalance.vue
new file mode 100644
index 0000000..10a4621
--- /dev/null
+++ b/ui/src/views/plugins/quota/QuotaBalance.vue
@@ -0,0 +1,172 @@
+// 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>
+    <a-table
+      size="small"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="dataSource"
+      :rowKey="record => record.name"
+      :pagination="false"
+      :scroll="{ y: '55vh' }"
+    >
+      <template slot="quota" slot-scope="text">
+        <span v-if="text!==null">{{ `${currency} ${text}` }}</span>
+      </template>
+      <template slot="credit" slot-scope="text">
+        <span v-if="text!==null">{{ `${currency} ${text}` }}</span>
+      </template>
+    </a-table>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import moment from 'moment'
+
+export default {
+  name: 'QuotaBalance',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    tab: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      pattern: 'YYYY-MM-DD',
+      currency: '',
+      dataSource: [],
+      account: null
+    }
+  },
+  computed: {
+    columns () {
+      return [
+        {
+          title: this.$t('label.date'),
+          dataIndex: 'date',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'date' }
+        },
+        {
+          title: this.$t('label.quota.value'),
+          dataIndex: 'quota',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'quota' }
+        },
+        {
+          title: this.$t('label.credit'),
+          dataIndex: 'credit',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'credit' }
+        }
+      ]
+    }
+  },
+  watch: {
+    tab (newTab, oldTab) {
+      this.tab = newTab
+      if (this.tab === 'quota.statement.balance') {
+        this.fetchData()
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    async fetchData () {
+      this.dataSource = []
+      this.loading = true
+      this.account = this.$route.query && this.$route.query.account ? this.$route.query.account : null
+
+      try {
+        const resource = await this.fetchResource()
+        const quotaBalance = await this.quotaBalance(resource)
+        this.currency = quotaBalance.currency
+        this.dataSource = await this.createDataSource(quotaBalance)
+        this.loading = false
+      } catch (e) {
+        console.log(e)
+        this.loading = false
+      }
+    },
+    createDataSource (quotaBalance) {
+      const dataSource = []
+      const credits = quotaBalance.credits || []
+
+      dataSource.push({
+        date: moment(quotaBalance.enddate).format(this.pattern),
+        quota: quotaBalance.endquota,
+        credit: null
+      })
+      dataSource.push({
+        date: moment(quotaBalance.startdate).format(this.pattern),
+        quota: quotaBalance.startquota,
+        credit: null
+      })
+      credits.map(item => {
+        dataSource.push({
+          date: moment(item.updated_on).format(this.pattern),
+          quota: null,
+          credit: item.credits
+        })
+      })
+
+      return dataSource
+    },
+    fetchResource () {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        params.domainid = this.resource.domainid
+        params.account = this.account
+
+        api('quotaBalance', params).then(json => {
+          const quotaBalance = json.quotabalanceresponse.balance || {}
+          resolve(quotaBalance)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    quotaBalance (resource) {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        params.domainid = this.resource.domainid
+        params.account = this.account
+        params.startdate = moment(this.resource.startdate).format(this.pattern)
+        params.enddate = moment(resource.startdate).format(this.pattern)
+
+        api('quotaBalance', params).then(json => {
+          const quotaBalance = json.quotabalanceresponse.balance || {}
+          resolve(quotaBalance)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/plugins/quota/QuotaSummary.vue b/ui/src/views/plugins/quota/QuotaSummary.vue
new file mode 100644
index 0000000..df16c52
--- /dev/null
+++ b/ui/src/views/plugins/quota/QuotaSummary.vue
@@ -0,0 +1,66 @@
+// 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>
+    <autogen-view
+      @change-resource="changeResource"/>
+    <quota-summary-resource
+      v-if="isSummaryResouce"
+      :resource="resource"
+      :tabs="$route.meta.tabs"/>
+  </div>
+</template>
+
+<script>
+import AutogenView from '@/views/AutogenView.vue'
+import QuotaSummaryResource from '@/views/plugins/quota/QuotaSummaryResource'
+
+export default {
+  name: 'QuotaSummary',
+  components: {
+    AutogenView,
+    QuotaSummaryResource
+  },
+  data () {
+    return {
+      resource: {}
+    }
+  },
+  provide: function () {
+    return {
+      parentChangeResource: this.changeResource
+    }
+  },
+  computed: {
+    isSummaryResouce () {
+      if (this.$route.path.startsWith('/quotasummary')) {
+        if (this.$route.query && 'quota' in this.$route.query && this.$route.query.quota) {
+          return true
+        }
+      }
+      return false
+    }
+  },
+  methods: {
+    changeResource (resource) {
+      console.log(resource)
+      this.resource = resource
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/plugins/quota/QuotaSummaryResource.vue b/ui/src/views/plugins/quota/QuotaSummaryResource.vue
new file mode 100644
index 0000000..1a41780
--- /dev/null
+++ b/ui/src/views/plugins/quota/QuotaSummaryResource.vue
@@ -0,0 +1,92 @@
+// 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>
+  <resource-view
+    :loading="loading"
+    :resource="quotaResource"
+    :tabs="tabs"/>
+</template>
+
+<script>
+import { api } from '@/api'
+import moment from 'moment'
+
+import ResourceView from '@/components/view/ResourceView'
+
+export default {
+  name: 'QuotaSummaryResource',
+  components: {
+    ResourceView
+  },
+  props: {
+    resource: {
+      type: Object,
+      default: () => {}
+    },
+    tabs: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      quotaResource: {},
+      networkService: null,
+      pattern: 'YYYY-MM-DD'
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource () {
+      if (Object.keys(this.resource).length === 0) {
+        this.fetchData()
+      }
+    }
+  },
+  inject: ['parentChangeResource'],
+  methods: {
+    fetchData () {
+      const params = {}
+      if (Object.keys(this.$route.query).length > 0) {
+        Object.assign(params, this.$route.query)
+      }
+      this.loading = true
+
+      api('quotaBalance', params).then(json => {
+        const quotaBalance = json.quotabalanceresponse.balance || {}
+        if (Object.keys(quotaBalance).length > 0) {
+          quotaBalance.currency = `${quotaBalance.currency} ${quotaBalance.startquota}`
+          quotaBalance.startdate = moment(quotaBalance.startdate).format(this.pattern)
+          quotaBalance.account = this.$route.params.id ? this.$route.params.id : null
+          quotaBalance.domainid = this.$route.query.domainid ? this.$route.query.domainid : null
+        }
+        this.quotaResource = Object.assign({}, this.quotaResource, quotaBalance)
+        this.parentChangeResource(this.quotaResource)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/plugins/quota/QuotaTariff.vue b/ui/src/views/plugins/quota/QuotaTariff.vue
new file mode 100644
index 0000000..786d74e
--- /dev/null
+++ b/ui/src/views/plugins/quota/QuotaTariff.vue
@@ -0,0 +1,60 @@
+// 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>
+    <autogen-view ref="autogenview" />
+    <edit-tariff-value-wizard
+      v-if="tariffAction"
+      :showAction="tariffAction"
+      :resource="tariffResource" />
+  </div>
+</template>
+
+<script>
+import AutogenView from '@/views/AutogenView.vue'
+import EditTariffValueWizard from '@/views/plugins/quota/EditTariffValueWizard'
+
+export default {
+  name: 'QuotaTariff',
+  components: {
+    AutogenView,
+    EditTariffValueWizard
+  },
+  data () {
+    return {
+      tariffAction: false,
+      tariffResource: {}
+    }
+  },
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData,
+      parentEditTariffAction: this.showTariffAction
+    }
+  },
+  methods: {
+    fetchData () {
+      this.$refs.autogenview.fetchData()
+    },
+    showTariffAction (showAction, resource) {
+      this.tariffAction = showAction
+      this.tariffResource = resource
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/plugins/quota/QuotaUsage.vue b/ui/src/views/plugins/quota/QuotaUsage.vue
new file mode 100644
index 0000000..a42bc8c
--- /dev/null
+++ b/ui/src/views/plugins/quota/QuotaUsage.vue
@@ -0,0 +1,157 @@
+// 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>
+    <a-table
+      size="small"
+      :loading="loading"
+      :columns="columns"
+      :dataSource="dataSource"
+      :rowKey="record => record.name"
+      :pagination="false"
+      :scroll="{ y: '55vh' }"
+    >
+      <template slot="quota" slot-scope="text">
+        <span v-if="text!==undefined">{{ `${currency} ${text}` }}</span>
+      </template>
+    </a-table>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import moment from 'moment'
+
+export default {
+  name: 'QuotaUsage',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    tab: {
+      type: String,
+      default: () => ''
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      dataSource: [],
+      pattern: 'YYYY-MM-DD',
+      currency: '',
+      totalQuota: 0,
+      account: null
+    }
+  },
+  computed: {
+    columns () {
+      return [
+        {
+          title: this.$t('label.quota.type.name'),
+          dataIndex: 'name',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'name' }
+        },
+        {
+          title: this.$t('label.quota.type.unit'),
+          dataIndex: 'unit',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'unit' }
+        },
+        {
+          title: this.$t('label.quota.usage'),
+          dataIndex: 'quota',
+          width: 'calc(100% / 3)',
+          scopedSlots: { customRender: 'quota' }
+        }
+      ]
+    }
+  },
+  watch: {
+    tab (newTab, oldTab) {
+      this.tab = newTab
+      if (this.tab === 'quota.statement.quota') {
+        this.fetchData()
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    async fetchData () {
+      this.loading = true
+      this.dataSource = []
+      this.account = this.$route.query && this.$route.query.account ? this.$route.query.account : null
+
+      try {
+        const resource = await this.quotaBalance()
+        const quotaStatement = await this.quotaStatement(resource)
+        const quotaUsage = quotaStatement.quotausage
+        this.dataSource = this.dataSource.concat(quotaUsage)
+        this.currency = quotaStatement.currency
+        this.totalQuota = quotaStatement.totalquota
+        this.dataSource.push({
+          name: `${this.$t('label.quota.total')}: `,
+          quota: this.totalQuota
+        })
+        this.dataSource.unshift({
+          type: 0,
+          name: `${this.$t('startdate')}: ${moment(this.resource.startdate).format(this.pattern)}`,
+          unit: `${this.$t('enddate')}: ${moment(this.resource.enddate).format(this.pattern)}`
+        })
+        this.loading = false
+      } catch (e) {
+        console.log(e)
+        this.loading = false
+      }
+    },
+    quotaBalance () {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        params.domainid = this.resource.domainid
+        params.account = this.account
+
+        api('quotaBalance', params).then(json => {
+          const quotaBalance = json.quotabalanceresponse.balance || {}
+          resolve(quotaBalance)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+    quotaStatement (resource) {
+      return new Promise((resolve, reject) => {
+        const params = {}
+        params.domainid = this.resource.domainid
+        params.account = this.account
+        params.startdate = moment(this.resource.startdate).format(this.pattern)
+        params.enddate = moment(resource.startdate).format(this.pattern)
+
+        api('quotaStatement', params).then(json => {
+          const quotaStatement = json.quotastatementresponse.statement || {}
+          resolve(quotaStatement)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/project/AccountsTab.vue b/ui/src/views/project/AccountsTab.vue
new file mode 100644
index 0000000..8c986c5
--- /dev/null
+++ b/ui/src/views/project/AccountsTab.vue
@@ -0,0 +1,392 @@
+// 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>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-table
+          size="small"
+          :loading="loading.table"
+          :columns="columns"
+          :dataSource="dataSource"
+          :pagination="false"
+          :rowKey="record => record.userid ? record.userid : (record.accountid || record.account)">
+          <span slot="user" slot-scope="text, record" v-if="record.userid">
+            {{ record.username }}
+          </span>
+          <span slot="projectrole" slot-scope="text, record" v-if="record.projectroleid">
+            {{ getProjectRole(record) }}
+          </span>
+          <span v-if="imProjectAdmin && dataSource.length > 1" slot="action" slot-scope="text, record" class="account-button-action">
+            <a-tooltip
+              slot="title"
+              placement="top"
+              :title="record.userid ? $t('label.make.user.project.owner') : $t('label.make.project.owner')">
+              <a-button
+                v-if="record.role !== owner"
+                type="default"
+                shape="circle"
+                icon="arrow-up"
+                size="small"
+                @click="promoteAccount(record)" />
+            </a-tooltip>
+            <a-tooltip
+              slot="title"
+              placement="top"
+              :title="record.userid ? $t('label.demote.project.owner.user') : $t('label.demote.project.owner')"
+              v-if="updateProjectApi.params.filter(x => x.name === 'swapowner').length > 0">
+              <a-button
+                v-if="record.role === owner"
+                type="default"
+                shape="circle"
+                icon="arrow-down"
+                size="small"
+                @click="demoteAccount(record)" />
+            </a-tooltip>
+            <a-tooltip
+              slot="title"
+              placement="top"
+              :title="record.userid ? $t('label.remove.project.user') : $t('label.remove.project.account')">
+              <a-button
+                type="danger"
+                shape="circle"
+                icon="delete"
+                size="small"
+                :disabled="!('deleteAccountFromProject' in $store.getters.apis)"
+                @click="onShowConfirmDelete(record)"/>
+            </a-tooltip>
+          </span>
+        </a-table>
+        <a-pagination
+          class="row-element"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="itemCount"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AccountsTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      imProjectAdmin: false,
+      loading: {
+        user: false,
+        projectAccount: false,
+        roles: false,
+        table: false
+      },
+      page: 1,
+      pageSize: 10,
+      itemCount: 0,
+      users: [],
+      projectRoles: [],
+      owner: 'Admin',
+      role: 'Regular'
+    }
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.account'),
+        dataIndex: 'account',
+        scopedSlots: { customRender: 'account' }
+      },
+      {
+        title: this.$t('label.roletype'),
+        dataIndex: 'role',
+        scopedSlots: { customRender: 'role' }
+      },
+      {
+        title: this.$t('label.action'),
+        dataIndex: 'action',
+        scopedSlots: { customRender: 'action' }
+      }
+    ]
+    if (this.isProjectRolesSupported()) {
+      this.columns.splice(1, 0, {
+        title: this.$t('label.user'),
+        dataIndex: 'userid',
+        scopedSlots: { customRender: 'user' }
+      })
+      this.columns.splice(this.columns.length - 1, 0, {
+        title: this.$t('label.project.role'),
+        dataIndex: 'projectroleid',
+        scopedSlots: { customRender: 'projectrole' }
+      })
+    }
+    this.page = 1
+    this.pageSize = 10
+    this.itemCount = 0
+  },
+  inject: ['parentFetchData'],
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      params.projectId = this.resource.id
+      params.page = this.page
+      params.pageSize = this.pageSize
+      this.updateProjectApi = this.$store.getters.apis.updateProject
+      this.fetchUsers()
+      this.fetchProjectAccounts(params)
+      if (this.isProjectRolesSupported()) {
+        this.fetchProjectRoles()
+      }
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = 0
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    isLoggedInUserProjectAdmin (user) {
+      if (['Admin', 'DomainAdmin'].includes(this.$store.getters.userInfo.roletype)) {
+        return true
+      }
+      // If I'm the logged in user Or if I'm the logged in account And I'm the owner
+      if (((user.userid && user.userid === this.$store.getters.userInfo.id) ||
+        user.account === this.$store.getters.userInfo.account) &&
+        user.role === this.owner) {
+        return true
+      }
+      return false
+    },
+    isProjectRolesSupported () {
+      return ('listProjectRoles' in this.$store.getters.apis)
+    },
+    getProjectRole (record) {
+      const projectRole = this.projectRoles.filter(role => role.id === record.projectroleid)
+      return projectRole[0].name || projectRole[0].id || null
+    },
+    fetchUsers () {
+      this.loading.user = true
+      api('listUsers', { listall: true }).then(response => {
+        this.users = response.listusersresponse.user || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading.user = false
+      })
+    },
+    fetchProjectRoles () {
+      this.loading.roles = true
+      api('listProjectRoles', { projectId: this.resource.id }).then(response => {
+        this.projectRoles = response.listprojectrolesresponse.projectrole || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading.roles = false
+      })
+    },
+    fetchProjectAccounts (params) {
+      this.loading.projectAccount = true
+      api('listProjectAccounts', params).then(json => {
+        const listProjectAccount = json.listprojectaccountsresponse.projectaccount
+        const itemCount = json.listprojectaccountsresponse.count
+        if (!listProjectAccount || listProjectAccount.length === 0) {
+          this.dataSource = []
+          return
+        }
+        for (const projectAccount of listProjectAccount) {
+          this.imProjectAdmin = this.isLoggedInUserProjectAdmin(projectAccount)
+          if (this.imProjectAdmin) {
+            break
+          }
+        }
+
+        this.itemCount = itemCount
+        this.dataSource = listProjectAccount
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading.projectAccount = false
+      })
+    },
+    onMakeProjectOwner (record) {
+      const title = this.$t('label.make.project.owner')
+      const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + record.account, 0)
+      const params = {}
+      params.id = this.resource.id
+      params.account = record.account
+      this.updateProject(record, params, title, loading)
+    },
+    promoteAccount (record) {
+      var title = this.$t('label.make.project.owner')
+      const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + record.account, 0)
+      const params = {}
+
+      params.id = this.resource.id
+      if (record.userid) {
+        params.userid = record.userid
+        // params.accountid = (record.user && record.user[0].accountid) || record.accountid
+        title = this.$t('label.make.user.project.owner')
+      } else {
+        params.account = record.account
+      }
+      params.roletype = this.owner
+      params.swapowner = false
+      this.updateProject(record, params, title, loading)
+    },
+    demoteAccount (record) {
+      var title = this.$t('label.demote.project.owner')
+      const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + record.account, 0)
+      const params = {}
+      if (record.userid) {
+        params.userid = record.userid
+        // params.accountid = (record.user && record.user[0].accountid) || record.accountid
+        title = this.$t('label.demote.project.owner.user')
+      } else {
+        params.account = record.account
+      }
+
+      params.id = this.resource.id
+      params.roletype = 'Regular'
+      params.swapowner = false
+      this.updateProject(record, params, title, loading)
+    },
+    updateProject (record, params, title, loading) {
+      api('updateProject', params).then(json => {
+        const hasJobId = this.checkForAddAsyncJob(json, title, record.account)
+        if (hasJobId) {
+          this.fetchData()
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        setTimeout(loading, 1000)
+        this.parentFetchData()
+      })
+    },
+    onShowConfirmDelete (record) {
+      const self = this
+      const title = `${this.$t('label.deleteconfirm')} ${this.$t('label.account')}`
+
+      this.$confirm({
+        title: title,
+        okText: this.$t('label.ok'),
+        okType: 'danger',
+        cancelText: this.$t('label.cancel'),
+        onOk () {
+          self.removeAccount(record)
+        }
+      })
+    },
+    removeAccount (record) {
+      const title = this.$t('label.remove.project.account')
+      const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + record.account, 0)
+      const params = {}
+      params.projectid = this.resource.id
+      if (record.userid) {
+        params.userid = record.userid
+        this.deleteOperation('deleteUserFromProject', params, record, title, loading)
+      } else {
+        params.account = record.account
+        this.deleteOperation('deleteAccountFromProject', params, record, title, loading)
+      }
+    },
+    deleteOperation (apiName, params, record, title, loading) {
+      api(apiName, params).then(json => {
+        const hasJobId = this.checkForAddAsyncJob(json, title, record.account)
+        if (hasJobId) {
+          this.fetchData()
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        setTimeout(loading, 1000)
+      })
+    },
+    checkForAddAsyncJob (json, title, description) {
+      let hasJobId = false
+
+      for (const obj in json) {
+        if (obj.includes('response')) {
+          for (const res in json[obj]) {
+            if (res === 'jobid') {
+              hasJobId = true
+              const jobId = json[obj][res]
+              this.$store.dispatch('AddAsyncJob', {
+                title: title,
+                jobid: jobId,
+                description: description,
+                status: 'progress'
+              })
+            }
+          }
+        }
+      }
+
+      return hasJobId
+    }
+  }
+}
+</script>
+
+<style scoped>
+  /deep/.ant-table-fixed-right {
+    z-index: 5;
+  }
+
+  .row-element {
+    margin-top: 10px;
+    margin-bottom: 10px;
+  }
+
+  .account-button-action button {
+    margin-right: 5px;
+  }
+</style>
diff --git a/ui/src/views/project/AddAccountOrUserToProject.vue b/ui/src/views/project/AddAccountOrUserToProject.vue
new file mode 100644
index 0000000..dcd0ba9
--- /dev/null
+++ b/ui/src/views/project/AddAccountOrUserToProject.vue
@@ -0,0 +1,336 @@
+// 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>
+    <a-tabs class="form-layout">
+      <a-tab-pane key="1" :tab="$t('label.action.project.add.account')">
+        <a-form
+          :form="form"
+          @submit="addAccountToProject"
+          layout="vertical">
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.account') }}
+              <a-tooltip :title="apiParams.addAccountToProject.account.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['account']"
+              :placeholder="apiParams.addAccountToProject.account.description"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.email') }}
+              <a-tooltip :title="apiParams.addAccountToProject.email.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['email']"
+              :placeholder="apiParams.addAccountToProject.email.description"></a-input>
+          </a-form-item>
+          <a-form-item v-if="apiParams.addAccountToProject.projectroleid">
+            <span slot="label">
+              {{ $t('label.project.role') }}
+              <a-tooltip :title="apiParams.addAccountToProject.projectroleid.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              showSearch
+              v-decorator="['projectroleid']"
+              :loading="loading"
+              :placeholder="$t('label.project.role')"
+            >
+              <a-select-option v-for="role in projectRoles" :key="role.id">
+                {{ role.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item v-if="apiParams.addAccountToProject.roletype">
+            <span slot="label">
+              {{ $t('label.roletype') }}
+              <a-tooltip :title="apiParams.addAccountToProject.roletype.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              showSearch
+              v-decorator="['roletype']"
+              :placeholder="$t('label.roletype')">
+              <a-select-option value="Admin">Admin</a-select-option>
+              <a-select-option value="Regular">Regular</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 type="primary" @click="addAccountToProject" :loading="loading">{{ $t('label.ok') }}</a-button>
+          </div>
+        </a-form>
+      </a-tab-pane>
+      <a-tab-pane key="2" :tab="$t('label.action.project.add.user')" v-if="apiParams.addUserToProject">
+        <a-form
+          :form="form"
+          @submit="addUserToProject"
+          layout="vertical">
+          <p v-html="$t('message.add.user.to.project')"></p>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.user') }}
+              <a-tooltip :title="apiParams.addUserToProject.username.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['username']"
+              :placeholder="apiParams.addUserToProject.username.description"/>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.email') }}
+              <a-tooltip :title="apiParams.addUserToProject.email.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-input
+              v-decorator="['email']"
+              :placeholder="apiParams.addUserToProject.email.description"></a-input>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.project.role') }}
+              <a-tooltip :title="apiParams.addUserToProject.roletype.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              showSearch
+              v-decorator="['projectroleid']"
+              :loading="loading"
+              :placeholder="$t('label.project.role')"
+            >
+              <a-select-option v-for="role in projectRoles" :key="role.id">
+                {{ role.name }}
+              </a-select-option>
+            </a-select>
+          </a-form-item>
+          <a-form-item>
+            <span slot="label">
+              {{ $t('label.roletype') }}
+              <a-tooltip :title="apiParams.addUserToProject.roletype.description">
+                <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+              </a-tooltip>
+            </span>
+            <a-select
+              showSearch
+              v-decorator="['roletype']"
+              :placeholder="$t('label.roletype')">
+              <a-select-option value="Admin">Admin</a-select-option>
+              <a-select-option value="Regular">Regular</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 type="primary" @click="addUserToProject" :loading="loading">{{ $t('label.ok') }}</a-button>
+          </div>
+        </a-form>
+      </a-tab-pane>
+    </a-tabs>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+export default {
+  name: 'AddAccountOrUserToProject',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      users: [],
+      accounts: [],
+      projectRoles: [],
+      selectedUser: null,
+      selectedAccount: null,
+      loading: false,
+      load: {
+        users: false,
+        accounts: false,
+        projectRoles: false
+      }
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    const apis = ['addAccountToProject']
+    if ('addUserToProject' in this.$store.getters.apis) {
+      apis.push('addUserToProject')
+    }
+    this.apiParams = {}
+    for (var api of apis) {
+      const details = {}
+      const apiConfig = this.$store.getters.apis[api]
+      apiConfig.params.forEach(param => {
+        details[param.name] = param
+      })
+      this.apiParams[api] = details
+    }
+  },
+  methods: {
+    fetchData () {
+      this.fetchUsers()
+      this.fetchAccounts()
+      if (this.isProjectRolesSupported()) {
+        this.fetchProjectRoles()
+      }
+    },
+    fetchUsers () {
+      this.load.users = true
+      api('listUsers', { listall: true }).then(response => {
+        this.users = response.listusersresponse.user ? response.listusersresponse.user : []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.load.users = false
+      })
+    },
+    fetchAccounts () {
+      this.load.accounts = true
+      api('listAccounts', {
+        domainid: this.resource.domainid
+      }).then(response => {
+        this.accounts = response.listaccountsresponse.account || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.load.accounts = false
+      })
+    },
+    fetchProjectRoles () {
+      this.load.projectRoles = true
+      api('listProjectRoles', {
+        projectid: this.resource.id
+      }).then(response => {
+        this.projectRoles = response.listprojectrolesresponse.projectrole || []
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.load.projectRoles = false
+      })
+    },
+    isProjectRolesSupported () {
+      return ('listProjectRoles' in this.$store.getters.apis)
+    },
+    addAccountToProject (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        var params = {
+          projectid: this.resource.id
+        }
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          params[key] = input
+        }
+        api('addAccountToProject', params).then(response => {
+          this.$pollJob({
+            jobId: response.addaccounttoprojectresponse.jobid,
+            successMessage: `Successfully added account ${params.account} to project`,
+            errorMessage: `Failed to add account: ${params.account} to project`,
+            loadingMessage: `Adding Account: ${params.account} to project...`,
+            catchMessage: 'Error encountered while fetching async job result'
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    addUserToProject (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        this.loading = true
+        var params = {
+          projectid: this.resource.id
+        }
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          params[key] = input
+        }
+        api('addUserToProject', params).then(response => {
+          this.$pollJob({
+            jobId: response.addusertoprojectresponse.jobid,
+            successMessage: `Successfully added user ${params.username} to project`,
+            errorMessage: `Failed to add user: ${params.username} to project`,
+            loadingMessage: `Adding User ${params.username} to project...`,
+            catchMessage: 'Error encountered while fetching async job result'
+          })
+          this.$emit('refresh-data')
+          this.closeAction()
+        }).catch(error => {
+          console.log('catch')
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 600px) {
+      width: 450px;
+    }
+  }
+.action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/project/InvitationTokenTemplate.vue b/ui/src/views/project/InvitationTokenTemplate.vue
new file mode 100644
index 0000000..2c249f2
--- /dev/null
+++ b/ui/src/views/project/InvitationTokenTemplate.vue
@@ -0,0 +1,134 @@
+// 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="row-project-invitation">
+    <a-spin :spinning="loading">
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item :label="$t('label.projectid')">
+          <a-input
+            v-decorator="['projectid', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]"
+            :placeholder="apiParams.projectid.description"
+          />
+        </a-form-item>
+        <a-form-item :label="$t('label.token')">
+          <a-input
+            v-decorator="['token', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
+            }]"
+            :placeholder="apiParams.token.description"
+          />
+        </a-form-item>
+        <div class="card-footer">
+          <!-- ToDo extract as component -->
+          <a-button @click="() => $emit('close-action')">{{ 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: 'InvitationTokenTemplate',
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.updateProjectInvitation || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  data () {
+    return {
+      loading: false
+    }
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        const title = this.$t('label.accept.project.invitation')
+        const description = this.$t('label.projectid') + ' ' + values.projectid
+        const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + description, 0)
+
+        this.loading = true
+
+        api('updateProjectInvitation', values).then(json => {
+          this.checkForAddAsyncJob(json, title, description)
+          this.$emit('close-action')
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.$emit('refresh-data')
+          this.loading = false
+          setTimeout(loading, 1000)
+        })
+      })
+    },
+    checkForAddAsyncJob (json, title, description) {
+      let hasJobId = false
+
+      for (const obj in json) {
+        if (obj.includes('response')) {
+          for (const res in json[obj]) {
+            if (res === 'jobid') {
+              hasJobId = true
+              const jobId = json[obj][res]
+              this.$store.dispatch('AddAsyncJob', {
+                title: title,
+                jobid: jobId,
+                description: description,
+                status: 'progress'
+              })
+            }
+          }
+        }
+      }
+
+      return hasJobId
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.row-project-invitation {
+  min-width: 450px;
+}
+
+.card-footer {
+  text-align: right;
+
+  button + button {
+    margin-left: 8px;
+  }
+}
+</style>
diff --git a/ui/src/views/project/InvitationsTemplate.vue b/ui/src/views/project/InvitationsTemplate.vue
new file mode 100644
index 0000000..b640457
--- /dev/null
+++ b/ui/src/views/project/InvitationsTemplate.vue
@@ -0,0 +1,349 @@
+// 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="row-invitation">
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-input-search
+          class="input-search-invitation"
+          style="width: unset"
+          :placeholder="$t('label.search')"
+          v-model="searchQuery"
+          @search="onSearch" />
+      </a-col>
+      <a-col :md="24" :lg="24">
+        <a-table
+          size="small"
+          :loading="loading"
+          :columns="columns"
+          :dataSource="dataSource"
+          :pagination="false"
+          :rowKey="record => record.id || record.account"
+          @change="onChangeTable">
+          <template slot="state" slot-scope="text">
+            <status :text="text ? text : ''" displayText />
+          </template>
+          <span slot="action" v-if="record.state===stateAllow" slot-scope="text, record" class="account-button-action">
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.accept.project.invitation') }}
+              </template>
+              <a-button
+                type="success"
+                shape="circle"
+                icon="check"
+                size="small"
+                @click="onShowConfirmAcceptInvitation(record)"/>
+            </a-tooltip>
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.decline.invitation') }}
+              </template>
+              <a-button
+                type="danger"
+                shape="circle"
+                icon="close"
+                size="small"
+                @click="onShowConfirmRevokeInvitation(record)"/>
+            </a-tooltip>
+          </span>
+        </a-table>
+        <a-pagination
+          class="row-element"
+          size="small"
+          :current="page"
+          :pageSize="pageSize"
+          :total="itemCount"
+          :showTotal="total => `${$t('label.total')} ${total} ${$t('label.items')}`"
+          :pageSizeOptions="['10', '20', '40', '80', '100']"
+          @change="changePage"
+          @showSizeChange="changePageSize"
+          showSizeChanger>
+          <template slot="buildOptionText" slot-scope="props">
+            <span>{{ props.value }} / {{ $t('label.page') }}</span>
+          </template>
+        </a-pagination>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import Status from '@/components/widgets/Status'
+
+export default {
+  name: 'InvitationsTemplate',
+  components: {
+    Status
+  },
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      listDomains: [],
+      loading: false,
+      page: 1,
+      pageSize: 10,
+      itemCount: 0,
+      state: undefined,
+      domainid: undefined,
+      projectid: undefined,
+      searchQuery: undefined,
+      stateAllow: 'Pending'
+    }
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.project'),
+        dataIndex: 'project',
+        scopedSlots: { customRender: 'project' }
+      },
+      {
+        title: this.$t('label.account'),
+        dataIndex: 'account',
+        scopedSlots: { customRender: 'account' }
+      },
+      {
+        title: this.$t('label.domain'),
+        dataIndex: 'domain',
+        scopedSlots: { customRender: 'domain' }
+      },
+      {
+        title: this.$t('label.state'),
+        dataIndex: 'state',
+        width: 130,
+        scopedSlots: { customRender: 'state' },
+        filters: [
+          {
+            text: this.$t('state.pending'),
+            value: 'Pending'
+          },
+          {
+            text: this.$t('state.completed'),
+            value: 'Completed'
+          },
+          {
+            text: this.$t('state.declined'),
+            value: 'Declined'
+          },
+          {
+            text: this.$t('state.expired'),
+            value: 'Expired'
+          }
+        ],
+        filterMultiple: false
+      },
+      {
+        title: this.$t('label.action'),
+        dataIndex: 'action',
+        width: 80,
+        scopedSlots: { customRender: 'action' }
+      }
+    ]
+
+    this.page = 1
+    this.pageSize = 10
+    this.itemCount = 0
+    this.apiConfig = this.$store.getters.apis.listProjectInvitations || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+    if (this.apiParams.userid) {
+      this.columns.splice(2, 0, {
+        title: this.$t('label.user'),
+        dataIndex: 'userid',
+        scopedSlots: { customRender: 'user' }
+      })
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+
+      params.page = this.page
+      params.pageSize = this.pageSize
+      params.state = this.state
+      params.domainid = this.domainid
+      params.projectid = this.projectid
+      params.keyword = this.searchQuery
+      params.listAll = true
+
+      this.loading = true
+      this.dataSource = []
+      this.itemCount = 0
+
+      api('listProjectInvitations', params).then(json => {
+        const listProjectInvitations = json.listprojectinvitationsresponse.projectinvitation
+        const itemCount = json.listprojectinvitationsresponse.count
+
+        if (!listProjectInvitations || listProjectInvitations.length === 0) {
+          return
+        }
+
+        this.dataSource = listProjectInvitations
+        this.itemCount = itemCount
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    changePage (page, pageSize) {
+      this.page = page
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    changePageSize (currentPage, pageSize) {
+      this.page = currentPage
+      this.pageSize = pageSize
+      this.fetchData()
+    },
+    onShowConfirmAcceptInvitation (record) {
+      const self = this
+      const title = this.$t('label.confirmacceptinvitation')
+
+      this.$confirm({
+        title: title,
+        okText: this.$t('label.ok'),
+        okType: 'danger',
+        cancelText: this.$t('label.cancel'),
+        onOk () {
+          self.updateProjectInvitation(record, true)
+        }
+      })
+    },
+    updateProjectInvitation (record, state) {
+      let title = ''
+
+      if (state) {
+        title = this.$t('label.accept.project.invitation')
+      } else {
+        title = this.$t('label.decline.invitation')
+      }
+
+      const loading = this.$message.loading(title + `${this.$t('label.in.progress.for')} ` + record.project, 0)
+      const params = {}
+
+      params.projectid = record.projectid
+      if (record.userid && record.userid !== null) {
+        params.userid = record.userid
+      } else {
+        params.account = record.account
+      }
+      params.domainid = record.domainid
+      params.accept = state
+
+      api('updateProjectInvitation', params).then(json => {
+        const hasJobId = this.checkForAddAsyncJob(json, title, record.project)
+
+        if (hasJobId) {
+          this.fetchData()
+          this.$emit('refresh-data')
+        }
+      }).catch(error => {
+        // show error
+        this.$notifyError(error)
+      }).finally(() => {
+        setTimeout(loading, 1000)
+      })
+    },
+    onShowConfirmRevokeInvitation (record) {
+      const self = this
+      const title = this.$t('label.confirmdeclineinvitation')
+
+      this.$confirm({
+        title: title,
+        okText: this.$t('label.ok'),
+        okType: 'danger',
+        cancelText: this.$t('label.cancel'),
+        onOk () {
+          self.updateProjectInvitation(record, false)
+        }
+      })
+    },
+    onChangeTable (pagination, filters, sorter) {
+      if (!filters || Object.keys(filters).length === 0) {
+        return
+      }
+
+      this.state = filters.state && filters.state.length > 0 ? filters.state[0] : undefined
+      this.domainid = filters.domain && filters.domain.length > 0 ? filters.domain[0] : undefined
+      this.projectid = filters.project && filters.project.length > 0 ? filters.project[0] : undefined
+
+      this.fetchData()
+    },
+    onSearch (value) {
+      this.searchQuery = value
+      this.fetchData()
+    },
+    checkForAddAsyncJob (json, title, description) {
+      let hasJobId = false
+
+      for (const obj in json) {
+        if (obj.includes('response')) {
+          for (const res in json[obj]) {
+            if (res === 'jobid') {
+              hasJobId = true
+              const jobId = json[obj][res]
+              this.$store.dispatch('AddAsyncJob', {
+                title: title,
+                jobid: jobId,
+                description: description,
+                status: 'progress'
+              })
+            }
+          }
+        }
+      }
+
+      return hasJobId
+    }
+  }
+}
+</script>
+
+<style scoped>
+  /deep/.ant-table-fixed-right {
+    z-index: 5;
+  }
+
+  .row-invitation {
+    min-width: 500px;
+    max-width: 768px;
+  }
+
+  .row-element {
+    margin-top: 15px;
+    margin-bottom: 15px;
+  }
+
+  .account-button-action button {
+    margin-right: 5px;
+  }
+
+  .input-search-invitation {
+    float: right;
+    margin-bottom: 10px;
+  }
+</style>
diff --git a/ui/src/views/project/ProjectDetailsTab.vue b/ui/src/views/project/ProjectDetailsTab.vue
new file mode 100644
index 0000000..bdb0842
--- /dev/null
+++ b/ui/src/views/project/ProjectDetailsTab.vue
@@ -0,0 +1,58 @@
+// 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>
+  <DetailsTab :resource="resource" />
+</template>
+<script>
+import DetailsTab from '@/components/view/DetailsTab'
+export default {
+  name: 'ProjectDetailsTab',
+  components: {
+    DetailsTab
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.determineOwner()
+    }
+  },
+  methods: {
+    determineOwner () {
+      var owner = this.resource.owner || []
+      // If current backend does not support multiple project admins
+      if (owner.length === 0) {
+        this.$set(this.resource, 'isCurrentUserProjectAdmin', this.resource.account === this.$store.getters.userInfo.account)
+        return
+      }
+      owner = owner.filter(projectaccount => {
+        return (projectaccount.userid && projectaccount.userid === this.$store.getters.userInfo.id) ||
+          projectaccount.account === this.$store.getters.userInfo.account
+      })
+      this.$set(this.resource, 'isCurrentUserProjectAdmin', owner.length > 0)
+    }
+  }
+}
+</script>
diff --git a/ui/src/views/project/iam/ProjectRolePermissionTab.vue b/ui/src/views/project/iam/ProjectRolePermissionTab.vue
new file mode 100644
index 0000000..b986108
--- /dev/null
+++ b/ui/src/views/project/iam/ProjectRolePermissionTab.vue
@@ -0,0 +1,442 @@
+// 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>
+  <a-icon v-if="loadingTable" type="loading" class="main-loading-spinner"></a-icon>
+  <div v-else>
+    <div v-if="updateTable" class="loading-overlay">
+      <a-icon type="loading" />
+    </div>
+    <div
+      class="rules-list ant-list ant-list-bordered"
+      :class="{'rules-list--overflow-hidden' : updateTable}" >
+
+      <div class="rules-table-item ant-list-item">
+        <div class="rules-table__col rules-table__col--grab"></div>
+        <div class="rules-table__col rules-table__col--rule rules-table__col--new">
+          <a-auto-complete
+            :autoFocus="true"
+            :filterOption="filterOption"
+            :dataSource="apis"
+            :value="newRule"
+            @change="val => newRule = val"
+            placeholder="Rule"
+            :class="{'rule-dropdown-error' : newRuleSelectError}" />
+        </div>
+        <div class="rules-table__col rules-table__col--permission">
+          <permission-editable
+            :defaultValue="newRulePermission"
+            @change="onPermissionChange(null, $event)" />
+        </div>
+        <div class="rules-table__col rules-table__col--description">
+          <a-input v-model="newRuleDescription" placeholder="Description"></a-input>
+        </div>
+        <div class="rules-table__col rules-table__col--actions">
+          <a-tooltip
+            placement="bottom">
+            <template slot="title">
+              Save new Rule
+            </template>
+            <a-button
+              icon="plus"
+              type="primary"
+              shape="circle"
+              @click="onRuleSave"
+            >
+            </a-button>
+          </a-tooltip>
+        </div>
+      </div>
+
+      <draggable
+        v-model="rules"
+        @change="changeOrder"
+        handle=".drag-handle"
+        animation="200"
+        ghostClass="drag-ghost">
+        <transition-group type="transition">
+          <div
+            v-for="(record, index) in rules"
+            :key="`item-${index}`"
+            class="rules-table-item ant-list-item">
+            <div class="rules-table__col rules-table__col--grab drag-handle">
+              <a-icon type="drag"></a-icon>
+            </div>
+            <div class="rules-table__col rules-table__col--rule">
+              {{ record.rule }}
+            </div>
+            <div class="rules-table__col rules-table__col--permission">
+              <permission-editable
+                :defaultValue="record.permission"
+                @change="onPermissionChange(record, $event)" />
+            </div>
+            <div class="rules-table__col rules-table__col--description">
+              <template v-if="record.description">
+                {{ record.description }}
+              </template>
+              <div v-else class="no-description">
+                No description entered.
+              </div>
+            </div>
+            <div class="rules-table__col rules-table__col--actions">
+              <rule-delete
+                :record="record"
+                @delete="onRuleDelete(record.id)" />
+            </div>
+          </div>
+        </transition-group>
+      </draggable>
+    </div>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import draggable from 'vuedraggable'
+import PermissionEditable from '@/views/iam/PermissionEditable'
+import RuleDelete from '@/views/iam/RuleDelete'
+
+export default {
+  name: 'ProjectRolePermissionTab',
+  components: {
+    RuleDelete,
+    PermissionEditable,
+    draggable
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    role: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loadingTable: true,
+      updateTable: false,
+      rules: null,
+      newRule: '',
+      newRulePermission: 'allow',
+      newRuleDescription: '',
+      newRuleSelectError: false,
+      drag: false,
+      apis: []
+    }
+  },
+  mounted () {
+    this.apis = Object.keys(this.$store.getters.apis).sort((a, b) => a.localeCompare(b))
+    this.fetchData()
+  },
+  watch: {
+    resource: function () {
+      this.fetchData(() => {
+        this.resetNewFields()
+      })
+    }
+  },
+  methods: {
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toUpperCase().indexOf(input.toUpperCase()) >= 0
+      )
+    },
+    resetNewFields () {
+      this.newRule = ''
+      this.newRulePermission = 'allow'
+      this.newRuleDescription = ''
+      this.newRuleSelectError = false
+    },
+    fetchData (callback = null) {
+      if (!this.resource.id) return
+      api('listProjectRolePermissions', {
+        projectid: this.resource.id,
+        projectroleid: this.role.id
+      }).then(response => {
+        this.rules = response.listprojectrolepermissionsresponse.projectrolepermission
+      }).catch(error => {
+        console.error(error)
+      }).finally(() => {
+        this.loadingTable = false
+        this.updateTable = false
+        if (callback) callback()
+      })
+    },
+    changeOrder () {
+      api('updateProjectRolePermission', {}, 'POST', {
+        projectid: this.resource.id,
+        projectroleid: this.role.id,
+        ruleorder: this.rules.map(rule => rule.id)
+      }).catch(error => {
+        console.error(error)
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    onRuleDelete (key) {
+      this.updateTable = true
+      api('deleteProjectRolePermission', {
+        id: key,
+        projectid: this.resource.id
+      }).catch(error => {
+        console.error(error)
+      }).finally(() => {
+        this.fetchData()
+      })
+    },
+    onPermissionChange (record, value) {
+      this.newRulePermission = value
+      if (!record) return
+      this.updateTable = true
+      api('updateProjectRolePermission', {
+        projectid: this.resource.id,
+        projectroleid: this.role.id,
+        projectrolepermissionid: record.id,
+        permission: value
+      }).then(() => {
+        this.fetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    },
+    onRuleSelect (value) {
+      this.newRule = value
+    },
+    onRuleSave () {
+      if (!this.newRule) {
+        this.newRuleSelectError = true
+        return
+      }
+      this.updateTable = true
+      api('createProjectRolePermission', {
+        rule: this.newRule,
+        permission: this.newRulePermission,
+        description: this.newRuleDescription,
+        projectroleid: this.role.id,
+        projectid: this.resource.id
+      }).then(() => {
+      }).catch(error => {
+        console.error(error)
+        this.$notifyError(error)
+      }).finally(() => {
+        this.resetNewFields()
+        this.fetchData()
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .main-loading-spinner {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 30px;
+  }
+  .role-add-btn {
+    margin-bottom: 15px;
+  }
+  .new-role-controls {
+    display: flex;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 5px;
+      }
+    }
+
+  }
+
+  .rules-list {
+    max-height: 600px;
+    overflow: auto;
+
+    &--overflow-hidden {
+      overflow: hidden;
+    }
+
+  }
+
+  .rules-table {
+
+    &-item {
+      position: relative;
+      display: flex;
+      align-items: stretch;
+      padding: 0;
+      flex-wrap: wrap;
+
+      @media (min-width: 760px) {
+        flex-wrap: nowrap;
+        padding-right: 25px;
+      }
+
+    }
+
+    &__col {
+      display: flex;
+      align-items: center;
+      padding: 15px;
+
+      @media (min-width: 760px) {
+        padding: 15px 0;
+
+        &:not(:first-child) {
+          padding-left: 20px;
+        }
+
+        &:not(:last-child) {
+          border-right: 1px solid #e8e8e8;
+          padding-right: 20px;
+        }
+      }
+
+      &--grab {
+        position: absolute;
+        top: 4px;
+        left: 0;
+        width: 100%;
+
+        @media (min-width: 760px) {
+          position: relative;
+          top: auto;
+          width: 35px;
+          padding-left: 25px;
+          justify-content: center;
+        }
+
+      }
+
+      &--rule,
+      &--description {
+        word-break: break-all;
+        flex: 1;
+        width: 100%;
+
+        @media (min-width: 760px) {
+          width: auto;
+        }
+
+      }
+
+      &--rule {
+        padding-left: 60px;
+        background-color: rgba(#e6f7ff, 0.7);
+
+        @media (min-width: 760px) {
+          padding-left: 0;
+          background: none;
+        }
+
+      }
+
+      &--permission {
+        justify-content: center;
+        width: 100%;
+
+        .ant-select {
+          width: 100%;
+        }
+
+        @media (min-width: 760px) {
+          width: auto;
+
+          .ant-select {
+            width: auto;
+          }
+
+        }
+
+      }
+
+      &--actions {
+        max-width: 60px;
+        width: 100%;
+        padding-right: 0;
+
+        @media (min-width: 760px) {
+          width: auto;
+          max-width: 70px;
+          padding-right: 15px;
+        }
+
+      }
+
+      &--new {
+        padding-left: 15px;
+        background-color: transparent;
+
+        div {
+          width: 100%;
+        }
+
+      }
+
+    }
+
+  }
+
+  .no-description {
+    opacity: 0.4;
+    font-size: 0.7rem;
+
+    @media (min-width: 760px) {
+      display: none;
+    }
+
+  }
+
+  .drag-handle {
+    cursor: pointer;
+  }
+
+  .drag-ghost {
+    opacity: 0.5;
+    background: #f0f2f5;
+  }
+
+  .loading-overlay {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 5;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 3rem;
+    color: #39A7DE;
+    background-color: rgba(#fff, 0.8);
+  }
+</style>
+
+<style lang="scss">
+  .rules-table__col--new {
+    .ant-select {
+      width: 100%;
+    }
+  }
+  .rule-dropdown-error {
+    .ant-input {
+      border-color: #ff0000
+    }
+  }
+</style>
diff --git a/ui/src/views/project/iam/ProjectRoleTab.vue b/ui/src/views/project/iam/ProjectRoleTab.vue
new file mode 100644
index 0000000..e34f02e
--- /dev/null
+++ b/ui/src/views/project/iam/ProjectRoleTab.vue
@@ -0,0 +1,318 @@
+// 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>
+    <a-button type="dashed" icon="plus" style="width: 100%; margin-bottom: 15px" @click="openCreateModal">
+      {{ $t('label.create.project.role') }}
+    </a-button>
+    <a-row :gutter="12">
+      <a-col :md="24" :lg="24">
+        <a-table
+          size="small"
+          :loading="loading"
+          :columns="columns"
+          :dataSource="dataSource"
+          :rowKey="(record,idx) => record.projectid + '-' + idx"
+          :pagination="false">
+          <template slot="expandedRowRender" slot-scope="record">
+            <ProjectRolePermissionTab class="table" :resource="resource" :role="record"/>
+          </template>
+          <template slot="name" slot-scope="record"> {{ record }} </template>
+          <template slot="description" slot-scope="record">
+            {{ record }}
+          </template>
+          <span slot="action" slot-scope="text, record">
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.update.project.role') }}
+              </template>
+              <a-button
+                type="default"
+                shape="circle"
+                icon="edit"
+                size="small"
+                style="margin:10px"
+                @click="openUpdateModal(record)" />
+            </a-tooltip>
+            <a-tooltip placement="top">
+              <template slot="title">
+                {{ $t('label.remove.project.role') }}
+              </template>
+              <a-button
+                type="danger"
+                shape="circle"
+                icon="delete"
+                size="small"
+                @click="deleteProjectRole(record)"/>
+            </a-tooltip>
+          </span>
+        </a-table>
+        <a-modal
+          :title="$t('label.edit.project.role')"
+          v-model="editModalVisible"
+          :footer="null"
+          :afterClose="closeAction"
+          :maskClosable="false">
+          <a-form
+            :form="form"
+            @submit="updateProjectRole"
+            layout="vertical">
+            <a-form-item :label="$t('label.name')">
+              <a-input v-decorator="[ 'name' ]"></a-input>
+            </a-form-item>
+            <a-form-item :label="$t('label.description')">
+              <a-input v-decorator="[ 'description' ]"></a-input>
+            </a-form-item>
+            <div :span="24" class="action-button">
+              <a-button @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
+              <a-button type="primary" @click="updateProjectRole" :loading="loading">{{ $t('label.ok') }}</a-button>
+            </div>
+            <span slot="action" slot-scope="text, record">
+              <a-tooltip placement="top">
+                <template slot="title">
+                  {{ $t('label.update.project.role') }}
+                </template>
+                <a-button
+                  type="default"
+                  shape="circle"
+                  icon="edit"
+                  size="small"
+                  style="margin:10px"
+                  @click="openUpdateModal(record)" />
+              </a-tooltip>
+              <a-tooltip placement="top">
+                <template slot="title">
+                  {{ $t('label.remove.project.role') }}
+                </template>
+                <a-button
+                  type="danger"
+                  shape="circle"
+                  icon="delete"
+                  size="small"
+                  @click="deleteProjectRole(record)"/>
+              </a-tooltip>
+            </span>
+          </a-form>
+        </a-modal>
+        <a-modal
+          :title="$t('label.create.project.role')"
+          v-model="createModalVisible"
+          :footer="null"
+          :afterClose="closeAction"
+          :maskClosable="false">
+          <a-form
+            :form="form"
+            @submit="createProjectRole"
+            layout="vertical">
+            <a-form-item :label="$t('label.name')">
+              <a-input v-decorator="[ 'name', { rules: [{ required: true, message: 'Please provide input' }] }]"></a-input>
+            </a-form-item>
+            <a-form-item :label="$t('label.description')">
+              <a-input v-decorator="[ 'description' ]"></a-input>
+            </a-form-item>
+            <div :span="24" class="action-button">
+              <a-button @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
+              <a-button type="primary" @click="createProjectRole" :loading="loading">{{ $t('label.ok') }}</a-button>
+            </div>
+          </a-form>
+        </a-modal>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+import ProjectRolePermissionTab from '@/views/project/iam/ProjectRolePermissionTab'
+export default {
+  name: 'ProjectRoleTab',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  components: {
+    ProjectRolePermissionTab
+  },
+  data () {
+    return {
+      columns: [],
+      dataSource: [],
+      loading: false,
+      createModalVisible: false,
+      editModalVisible: false,
+      selectedRole: null,
+      projectPermisssions: [],
+      customStyle: 'margin-bottom: -10px; border-bottom-style: none'
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  created () {
+    this.columns = [
+      {
+        title: this.$t('label.name'),
+        dataIndex: 'name',
+        width: '35%',
+        scopedSlots: { customRender: 'name' }
+      },
+      {
+        title: this.$t('label.description'),
+        dataIndex: 'description'
+      },
+      {
+        title: this.$t('label.action'),
+        dataIndex: 'action',
+        width: 100,
+        scopedSlots: { customRender: 'action' }
+      }
+    ]
+  },
+  mounted () {
+    this.fetchData()
+  },
+  watch: {
+    resource (newItem, oldItem) {
+      if (!newItem || !newItem.id) {
+        return
+      }
+      this.resource = newItem
+      this.fetchData()
+    }
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listProjectRoles', { projectid: this.resource.id }).then(json => {
+        const projectRoles = json.listprojectrolesresponse.projectrole
+        if (!projectRoles || projectRoles.length === 0) {
+          this.dataSource = []
+          return
+        }
+        this.dataSource = projectRoles
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    openUpdateModal (role) {
+      this.selectedRole = role
+      this.editModalVisible = true
+    },
+    openCreateModal () {
+      this.createModalVisible = true
+    },
+    updateProjectRole (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        var params = {}
+        this.loading = true
+        params.projectid = this.resource.id
+        params.id = this.selectedRole.id
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          params[key] = input
+        }
+        api('updateProjectRole', params).then(response => {
+          this.$notification.success({
+            message: this.$t('label.update.project.role'),
+            description: this.$t('label.update.project.role')
+          })
+          this.fetchData()
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      if (this.editModalVisible) {
+        this.editModalVisible = false
+      }
+      if (this.createModalVisible) {
+        this.createModalVisible = false
+      }
+    },
+    createProjectRole (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        var params = {}
+        params.projectid = this.resource.id
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          params[key] = input
+        }
+        api('createProjectRole', params).then(response => {
+          this.$notification.success({
+            message: this.$t('label.create.project.role'),
+            description: this.$t('label.create.project.role')
+          })
+          this.fetchData()
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    deleteProjectRole (role) {
+      this.loading = true
+      api('deleteProjectRole', {
+        projectid: this.resource.id,
+        id: role.id
+      }).then(response => {
+        this.$notification.success({
+          message: this.$t('label.delete.project.role'),
+          description: this.$t('label.delete.project.role')
+        })
+        this.fetchData()
+        this.closeAction()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.loading = false
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.action-button {
+    text-align: right;
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/src/views/setting/ResourceSettingsTab.vue b/ui/src/views/setting/ResourceSettingsTab.vue
new file mode 100644
index 0000000..cd5260f
--- /dev/null
+++ b/ui/src/views/setting/ResourceSettingsTab.vue
@@ -0,0 +1,58 @@
+// 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>
+    TODO: Implement agnostic resource settings table etc.
+
+    <list-view
+      :columns="columns"
+      :items="settings " />
+  </div>
+</template>
+
+<script>
+import ListView from '@/components/view/ListView'
+
+export default {
+  name: 'ResourceSettingsTab',
+  components: {
+    ListView
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      columns: [],
+      settings: []
+    }
+  },
+  methods: {
+  }
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/ui/src/views/storage/AttachVolume.vue b/ui/src/views/storage/AttachVolume.vue
new file mode 100644
index 0000000..43ca3cd
--- /dev/null
+++ b/ui/src/views/storage/AttachVolume.vue
@@ -0,0 +1,160 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-form class="form" :form="form" @submit="handleSubmit" layout="vertical">
+      <div style="margin-bottom: 10px">
+        <a-alert type="warning">
+          <span slot="message" v-html="$t('message.confirm.attach.disk')" />
+        </a-alert>
+      </div>
+      <a-form-item :label="$t('label.virtualmachineid')">
+        <a-select
+          v-decorator="['virtualmachineid', {
+            rules: [{ required: true, message: $t('message.error.select') }]
+          }]"
+          :placeholder="apiParams.virtualmachineid.description">
+          <a-select-option v-for="vm in virtualmachines" :key="vm.id">
+            {{ vm.name || vm.displayname }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+    </a-form>
+    <div class="actions">
+      <a-button @click="closeAction">{{ $t('label.cancel') }}</a-button>
+      <a-button type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+    </div>
+  </a-spin>
+</template>
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'AttachVolume',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      virtualmachines: [],
+      loading: true
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.attachVolume || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      var params = {
+        zoneid: this.resource.zoneid
+      }
+      if (this.resource.hypervisor && this.resource.hypervisor !== 'None') {
+        params.hypervisor = this.resource.hypervisor
+      }
+      if (this.resource.projectid) {
+        params.projectid = this.resource.projectid
+      } else {
+        params.account = this.resource.account
+        params.domainid = this.resource.domainid
+      }
+
+      this.loading = true
+      var vmStates = ['Running', 'Stopped']
+      vmStates.forEach((state) => {
+        params.state = state
+        api('listVirtualMachines', params).then(response => {
+          this.virtualmachines = this.virtualmachines.concat(response.listvirtualmachinesresponse.virtualmachine || [])
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+
+        this.loading = true
+        api('attachVolume', {
+          id: this.resource.id,
+          virtualmachineid: values.virtualmachineid
+        }).then(response => {
+          this.$store.dispatch('AddAsyncJob', {
+            title: this.$t('label.action.attach.disk'),
+            jobid: response.attachvolumeresponse.jobid,
+            status: 'progress'
+          })
+          this.$pollJob({
+            jobId: response.attachvolumeresponse.jobid,
+            successMethod: () => {
+              this.parentFetchData()
+            },
+            errorMessage: `${this.$t('message.attach.volume.failed')}: ${this.resource.name || this.resource.id}`,
+            loadingMessage: `${this.$t('message.attach.volume.progress')}: ${this.resource.name || this.resource.id}`,
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+          this.parentFetchData()
+        })
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form {
+  width: 80vw;
+
+  @media (min-width: 500px) {
+    width: 400px;
+  }
+}
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+  button {
+    &:not(:last-child) {
+      margin-right: 10px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue b/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue
new file mode 100644
index 0000000..93d2e29
--- /dev/null
+++ b/ui/src/views/storage/CreateSnapshotFromVMSnapshot.vue
@@ -0,0 +1,151 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-form class="form" :form="form" @submit="handleSubmit" layout="vertical">
+      <a-form-item :label="$t('label.name')">
+        <a-input
+          v-decorator="['name', {
+            rules: [{ required: true, message: $t('message.error.name') }]
+          }]"
+          :placeholder="$t('label.snapshot.name')"/>
+      </a-form-item>
+      <a-form-item :label="$t('label.volume')">
+        <a-select
+          v-decorator="['volumeid', {
+            initialValue: selectedVolumeId,
+            rules: [{ required: true, message: $t('message.error.select') }]}]"
+          :loading="loading"
+          @change="id => (volumes.filter(x => x.id === id))"
+        >
+          <a-select-option
+            v-for="(volume, index) in volumes"
+            :value="volume.id"
+            :key="index">
+            {{ volume.displaytext || volume.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <div :span="24" class="action-button">
+        <a-button @click="closeModal">{{ $t('label.cancel') }}</a-button>
+        <a-button type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateSnapshotFromVMSnapshot',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      volumes: [],
+      selectedVolumeId: '',
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listVolumes', {
+        virtualmachineid: this.resource.virtualmachineid,
+        listall: true
+      }).then(json => {
+        this.volumes = json.listvolumesresponse.volume || []
+        this.selectedVolumeId = this.volumes[0].id || ''
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit (e) {
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        api('createSnapshotFromVMSnapshot', {
+          name: values.name,
+          volumeid: values.volumeid,
+          vmsnapshotid: this.resource.id
+        }).then(response => {
+          this.$pollJob({
+            jobId: response.createsnapshotfromvmsnapshotresponse.jobid,
+            successMessage: this.$t('message.success.create.snapshot.from.vmsnapshot'),
+            successMethod: () => {
+              this.$store.dispatch('AddAsyncJob', {
+                title: this.$t('message.success.create.snapshot.from.vmsnapshot'),
+                jobid: response.createsnapshotfromvmsnapshotresponse.jobid,
+                description: values.name,
+                status: 'progress'
+              })
+              this.$emit('refresh-data')
+            },
+            errorMessage: this.$t('message.create.snapshot.from.vmsnapshot.failed'),
+            errorMethod: () => {
+              this.$emit('refresh-data')
+            },
+            loadingMessage: this.$t('message.create.snapshot.from.vmsnapshot.progress'),
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+          this.$emit('refresh-data')
+          this.closeModal()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeModal () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.form {
+  width: 80vw;
+
+  @media (min-width: 500px) {
+    width: 400px;
+  }
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/storage/CreateVolume.vue b/ui/src/views/storage/CreateVolume.vue
new file mode 100644
index 0000000..ef22b07
--- /dev/null
+++ b/ui/src/views/storage/CreateVolume.vue
@@ -0,0 +1,207 @@
+// 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>
+  <a-spin :spinning="loading">
+    <a-form class="form" :form="form" @submit="handleSubmit" layout="vertical">
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.name') }}
+          <a-tooltip :title="apiParams.name.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-input
+          v-decorator="['name', {
+            rules: [{ required: true, message: $t('message.error.volume.name') }]
+          }]"
+          :placeholder="$t('label.volumename')"/>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.zoneid') }}
+          <a-tooltip :title="apiParams.zoneid.description">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-select
+          v-decorator="['zoneid', {
+            initialValue: selectedZoneId,
+            rules: [{ required: true, message: $t('message.error.zone') }] }]"
+          :loading="loading"
+          @change="zone => fetchDiskOfferings(zone)">
+          <a-select-option
+            v-for="(zone, index) in zones"
+            :value="zone.id"
+            :key="index">
+            {{ zone.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item>
+        <span slot="label">
+          {{ $t('label.diskoffering') }}
+          <a-tooltip :title="apiParams.diskofferingid.description || 'Disk Offering'">
+            <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+          </a-tooltip>
+        </span>
+        <a-select
+          v-decorator="['diskofferingid', {
+            initialValue: selectedDiskOfferingId,
+            rules: [{ required: true, message: $t('message.error.select') }]}]"
+          :loading="loading"
+          @change="id => (customDiskOffering = offerings.filter(x => x.id === id)[0].iscustomized || false)"
+        >
+          <a-select-option
+            v-for="(offering, index) in offerings"
+            :value="offering.id"
+            :key="index">
+            {{ offering.displaytext || offering.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <span v-if="customDiskOffering">
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.sizegb') }}
+            <a-tooltip :title="apiParams.size.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['size', {
+              rules: [{ required: true, message: $t('message.error.custom.disk.size') }]}]"
+            :placeholder="$t('label.disksize')"/>
+        </a-form-item>
+      </span>
+      <div :span="24" class="action-button">
+        <a-button @click="closeModal">{{ $t('label.cancel') }}</a-button>
+        <a-button type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'CreateVolume',
+  data () {
+    return {
+      zones: [],
+      offerings: [],
+      selectedZoneId: '',
+      selectedDiskOfferingId: '',
+      customDiskOffering: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.createVolume || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listZones').then(json => {
+        this.zones = json.listzonesresponse.zone || []
+        this.selectedZoneId = this.zones[0].id || ''
+        this.fetchDiskOfferings(this.selectedZoneId)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    fetchDiskOfferings (zoneId) {
+      this.loading = true
+      api('listDiskOfferings', {
+        zoneid: zoneId,
+        listall: true
+      }).then(json => {
+        this.offerings = json.listdiskofferingsresponse.diskoffering || []
+        this.selectedDiskOfferingId = this.offerings[0].id || ''
+        this.customDiskOffering = this.offerings[0].iscustomized || false
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit (e) {
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        api('createVolume', values).then(response => {
+          this.$pollJob({
+            jobId: response.createvolumeresponse.jobid,
+            successMessage: this.$t('message.success.create.volume'),
+            successMethod: () => {
+              this.$store.dispatch('AddAsyncJob', {
+                title: this.$t('message.success.create.volume'),
+                jobid: response.createvolumeresponse.jobid,
+                description: values.name,
+                status: 'progress'
+              })
+              this.$emit('refresh-data')
+            },
+            errorMessage: this.$t('message.create.volume.failed'),
+            errorMethod: () => {
+              this.$emit('refresh-data')
+            },
+            loadingMessage: this.$t('message.create.volume.processing'),
+            catchMessage: this.$t('error.fetching.async.job.result')
+          })
+          this.$emit('refresh-data')
+          this.closeModal()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeModal () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.form {
+  width: 80vw;
+
+  @media (min-width: 500px) {
+    width: 400px;
+  }
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/storage/FormSchedule.vue b/ui/src/views/storage/FormSchedule.vue
new file mode 100644
index 0000000..603ec61
--- /dev/null
+++ b/ui/src/views/storage/FormSchedule.vue
@@ -0,0 +1,435 @@
+// 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>
+  <a-spin :spinning="loading">
+    <div class="form-layout">
+      <label>
+        {{ $t('label.header.volume.snapshot') }}
+      </label>
+      <div class="form">
+        <a-form
+          :form="form"
+          layout="vertical"
+          @submit="handleSubmit">
+          <a-row :gutter="12">
+            <a-col :md="24" :lg="24">
+              <a-form-item :label="$t('label.intervaltype')">
+                <a-radio-group
+                  v-decorator="['intervaltype', {
+                    initialValue: intervalType
+                  }]"
+                  buttonStyle="solid"
+                  @change="handleChangeIntervalType">
+                  <a-radio-button value="hourly" :disabled="handleVisibleInterval(0)">
+                    {{ $t('label.hourly') }}
+                  </a-radio-button>
+                  <a-radio-button value="daily" :disabled="handleVisibleInterval(1)">
+                    {{ $t('label.daily') }}
+                  </a-radio-button>
+                  <a-radio-button value="weekly" :disabled="handleVisibleInterval(2)">
+                    {{ $t('label.weekly') }}
+                  </a-radio-button>
+                  <a-radio-button value="monthly" :disabled="handleVisibleInterval(3)">
+                    {{ $t('label.monthly') }}
+                  </a-radio-button>
+                </a-radio-group>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='hourly'">
+              <a-form-item :label="$t('label.time')">
+                <a-tooltip
+                  placement="right"
+                  :title="$t('label.minute.past.hour')">
+                  <a-input-number
+                    style="width: 100%"
+                    v-decorator="['time', {
+                      rules: [{required: true, message: `${this.$t('message.error.required.input')}`}]
+                    }]"
+                    :min="1"
+                    :max="59"/>
+                </a-tooltip>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="['daily', 'weekly', 'monthly'].includes(intervalType)">
+              <a-form-item
+                class="custom-time-select"
+                :label="$t('label.time')">
+                <a-time-picker
+                  use12Hours
+                  format="h:mm A"
+                  v-decorator="['timeSelect', {
+                    rules: [{
+                      type: 'object',
+                      required: true,
+                      message: $t('message.error.time')
+                    }]
+                  }]" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='weekly'">
+              <a-form-item :label="$t('label.day.of.week')">
+                <a-select
+                  v-decorator="['day-of-week', {
+                    rules: [{
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }]
+                  }]" >
+                  <a-select-option v-for="(opt, optIndex) in dayOfWeek" :key="optIndex">
+                    {{ opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12" v-if="intervalType==='monthly'">
+              <a-form-item :label="$t('label.day.of.month')">
+                <a-select
+                  v-decorator="['day-of-month', {
+                    rules: [{
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }]
+                  }]">
+                  <a-select-option v-for="opt in dayOfMonth" :key="opt.name">
+                    {{ opt.name }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="12">
+              <a-form-item :label="$t('label.keep')">
+                <a-tooltip
+                  placement="right"
+                  :title="$t('label.snapshots')">
+                  <a-input-number
+                    style="width: 100%"
+                    v-decorator="['maxsnaps', {
+                      rules: [{ required: true, message: $t('message.error.required.input')}]
+                    }]"
+                    :min="1"
+                    :max="8" />
+                </a-tooltip>
+              </a-form-item>
+            </a-col>
+            <a-col :md="24" :lg="24">
+              <a-form-item :label="$t('label.timezone')">
+                <a-select
+                  showSearch
+                  v-decorator="['timezone', {
+                    rules: [{
+                      required: true,
+                      message: `${this.$t('message.error.select')}`
+                    }]
+                  }]"
+                  :loading="fetching">
+                  <a-select-option v-for="opt in timeZoneMap" :key="opt.id">
+                    {{ opt.name || opt.description }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-divider/>
+          <div class="tagsTitle">{{ $t('label.tags') }}</div>
+          <div>
+            <template v-for="(tag, index) in tags">
+              <a-tag :key="index" :closable="'deleteTags' in $store.getters.apis" :afterClose="() => handleDeleteTag(tag)">
+                {{ tag.key }} = {{ tag.value }}
+              </a-tag>
+            </template>
+            <div v-if="inputVisible">
+              <a-input-group
+                type="text"
+                size="small"
+                @blur="handleInputConfirm"
+                @keyup.enter="handleInputConfirm"
+                compact>
+                <a-input ref="input" :value="inputKey" @change="handleKeyChange" style="width: 100px; text-align: center" :placeholder="$t('label.key')" />
+                <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled />
+                <a-input :value="inputValue" @change="handleValueChange" style="width: 100px; text-align: center; border-left: 0" :placeholder="$t('label.value')" />
+                <a-button shape="circle" size="small" @click="handleInputConfirm">
+                  <a-icon type="check"/>
+                </a-button>
+                <a-button shape="circle" size="small" @click="inputVisible=false">
+                  <a-icon type="close"/>
+                </a-button>
+              </a-input-group>
+            </div>
+            <a-tag v-else @click="showInput" style="background: #fff; borderStyle: dashed;">
+              <a-icon type="plus" /> {{ $t('label.new.tag') }}
+            </a-tag>
+          </div>
+          <div :span="24" class="action-button">
+            <a-button
+              :loading="actionLoading"
+              @click="closeAction">
+              {{ this.$t('label.cancel') }}
+            </a-button>
+            <a-button
+              v-if="handleShowButton()"
+              :loading="actionLoading"
+              type="primary"
+              @click="handleSubmit">
+              {{ this.$t('label.ok') }}
+            </a-button>
+          </div>
+        </a-form>
+      </div>
+    </div>
+  </a-spin>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZone } from '@/utils/timezone'
+import debounce from 'lodash/debounce'
+
+export default {
+  name: 'FormSchedule',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    dataSource: {
+      type: Array,
+      required: true
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    this.fetchTimeZone = debounce(this.fetchTimeZone, 800)
+
+    return {
+      actionLoading: false,
+      volumeId: '',
+      inputKey: '',
+      inputVisible: '',
+      inputValue: '',
+      intervalType: 'hourly',
+      intervalValue: 0,
+      tags: [],
+      dayOfWeek: [],
+      dayOfMonth: [],
+      timeZoneMap: [],
+      fetching: false,
+      listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.volumeId = this.resource.id
+    this.fetchTimeZone()
+  },
+  methods: {
+    fetchTimeZone (value) {
+      this.timeZoneMap = []
+      this.fetching = true
+
+      timeZone(value).then(json => {
+        this.timeZoneMap = json
+        this.fetching = false
+      })
+    },
+    fetchDayOfWeek () {
+      this.dayOfWeek = []
+
+      for (const index in this.listDayOfWeek) {
+        const dayName = this.listDayOfWeek[index]
+        this.dayOfWeek.push({
+          id: dayName,
+          name: this.$t('label.' + dayName)
+        })
+      }
+    },
+    fetchDayOfMonth () {
+      this.dayOfMonth = []
+      const maxDayOfMonth = 28
+      for (let num = 1; num <= maxDayOfMonth; num++) {
+        this.dayOfMonth.push({
+          id: num,
+          name: num
+        })
+      }
+    },
+    handleChangeIntervalType (e) {
+      this.intervalType = e.target.value
+
+      switch (this.intervalType) {
+        case 'hourly':
+          this.intervalValue = 0
+          break
+        case 'daily':
+          this.intervalValue = 1
+          break
+        case 'weekly':
+          this.intervalValue = 2
+          this.fetchDayOfWeek()
+          break
+        case 'monthly':
+          this.intervalValue = 3
+          this.fetchDayOfMonth()
+          break
+      }
+    },
+    handleVisibleInterval (intervalType) {
+      if (this.dataSource.length === 0) {
+        return false
+      }
+      const dataSource = this.dataSource.filter(item => item.intervaltype === intervalType)
+      if (dataSource && dataSource.length > 0) {
+        return true
+      }
+      return false
+    },
+    handleShowButton () {
+      if (this.dataSource.length === 0) {
+        return true
+      }
+      const dataSource = this.dataSource.filter(item => item.intervaltype === this.intervalValue)
+      if (dataSource && dataSource.length > 0) {
+        return false
+      }
+      return true
+    },
+    handleKeyChange (e) {
+      this.inputKey = e.target.value
+    },
+    handleValueChange (e) {
+      this.inputValue = e.target.value
+    },
+    handleInputConfirm () {
+      this.tags.push({
+        key: this.inputKey,
+        value: this.inputValue
+      })
+      this.inputVisible = false
+      this.inputKey = ''
+      this.inputValue = ''
+    },
+    handleDeleteTag (tag) {
+    },
+    handleSubmit (e) {
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+
+        let params = {}
+        params.volumeid = this.volumeId
+        params.intervaltype = values.intervaltype
+        params.timezone = values.timezone
+        params.maxsnaps = values.maxsnaps
+        switch (values.intervaltype) {
+          case 'hourly':
+            params.schedule = values.time
+            break
+          case 'daily':
+            params.schedule = values.timeSelect.format('mm:HH')
+            break
+          case 'weekly':
+            params.schedule = [values.timeSelect.format('mm:HH'), (values['day-of-week'] + 1)].join(':')
+            break
+          case 'monthly':
+            params.schedule = [values.timeSelect.format('mm:HH'), values['day-of-month']].join(':')
+            break
+        }
+        for (let i = 0; i < this.tags.length; i++) {
+          const formattedTagData = {}
+          const tag = this.tags[i]
+          formattedTagData['tags[' + i + '].key'] = tag.key
+          formattedTagData['tags[' + i + '].value'] = tag.value
+          params = Object.assign({}, params, formattedTagData)
+        }
+        this.actionLoading = true
+        api('createSnapshotPolicy', params).then(json => {
+          this.$emit('refresh')
+          this.$notification.success({
+            message: this.$t('label.action.recurring.snapshot'),
+            description: this.$t('message.success.recurring.snapshot')
+          })
+          this.resetForm()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    resetForm () {
+      this.form.setFieldsValue({
+        time: undefined,
+        timezone: undefined,
+        timeSelect: undefined,
+        maxsnaps: undefined,
+        'day-of-week': undefined,
+        'day-of-month': undefined
+      })
+      this.tags = []
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.form-layout {
+  .ant-tag {
+    margin-bottom: 10px;
+  }
+
+  /deep/.custom-time-select .ant-time-picker {
+    width: 100%;
+  }
+
+  /deep/.ant-divider-horizontal {
+    margin-top: 0;
+  }
+}
+
+.form {
+  margin: 10px 0;
+}
+
+.tagsTitle {
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/storage/MigrateVolume.vue b/ui/src/views/storage/MigrateVolume.vue
new file mode 100644
index 0000000..88a8266
--- /dev/null
+++ b/ui/src/views/storage/MigrateVolume.vue
@@ -0,0 +1,200 @@
+// 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="migrate-volume-container">
+
+    <div class="modal-form">
+      <div v-if="storagePools.length > 0">
+        <p class="modal-form__label">{{ $t('label.storagepool') }}</p>
+        <a-select v-model="selectedStoragePool" style="width: 100%;">
+          <a-select-option v-for="(storagePool, index) in storagePools" :value="storagePool.id" :key="index">
+            {{ storagePool.name }} <span v-if="resource.virtualmachineid">{{ storagePool.suitableformigration ? `(${$t('label.suitable')})` : `(${$t('label.not.suitable')})` }}</span>
+          </a-select-option>
+        </a-select>
+        <template v-if="this.resource.virtualmachineid">
+          <p class="modal-form__label" @click="replaceDiskOffering = !replaceDiskOffering" style="cursor:pointer;">
+            {{ $t('label.usenewdiskoffering') }}
+          </p>
+          <a-checkbox v-model="replaceDiskOffering" />
+
+          <template v-if="replaceDiskOffering">
+            <p class="modal-form__label">{{ $t('label.newdiskoffering') }}</p>
+            <a-select v-model="selectedDiskOffering" style="width: 100%;">
+              <a-select-option v-for="(diskOffering, index) in diskOfferings" :value="diskOffering.id" :key="index">
+                {{ diskOffering.displaytext }}
+              </a-select-option>
+            </a-select>
+          </template>
+        </template>
+      </div>
+      <a-alert style="margin-top: 15px" type="warning" v-else>
+        <span slot="message" v-html="$t('message.no.primary.stores')" />
+      </a-alert>
+    </div>
+
+    <a-divider />
+
+    <div class="actions">
+      <a-button @click="closeModal">
+        {{ $t('label.cancel') }}
+      </a-button>
+      <a-button type="primary" @click="submitMigrateVolume">
+        {{ $t('label.ok') }}
+      </a-button>
+    </div>
+
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'MigrateVolume',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  inject: ['parentFetchData'],
+  data () {
+    return {
+      storagePools: [],
+      selectedStoragePool: null,
+      diskOfferings: [],
+      replaceDiskOffering: false,
+      selectedDiskOffering: null
+    }
+  },
+  mounted () {
+    this.fetchStoragePools()
+    this.resource.virtualmachineid && this.fetchDiskOfferings()
+  },
+  methods: {
+    fetchStoragePools () {
+      if (this.resource.virtualmachineid) {
+        api('findStoragePoolsForMigration', {
+          id: this.resource.id
+        }).then(response => {
+          this.storagePools = response.findstoragepoolsformigrationresponse.storagepool || []
+          if (Array.isArray(this.storagePools) && this.storagePools.length) {
+            this.selectedStoragePool = this.storagePools[0].id || ''
+          }
+        }).catch(error => {
+          this.$notifyError(error)
+          this.closeModal()
+        })
+      } else {
+        api('listStoragePools', {
+          zoneid: this.resource.zoneid
+        }).then(response => {
+          this.storagePools = response.liststoragepoolsresponse.storagepool || []
+          this.storagePools = this.storagePools.filter(pool => { return pool.id !== this.resource.storageid })
+          if (Array.isArray(this.storagePools) && this.storagePools.length) {
+            this.selectedStoragePool = this.storagePools[0].id || ''
+          }
+        }).catch(error => {
+          this.$notifyError(error)
+          this.closeModal()
+        })
+      }
+    },
+    fetchDiskOfferings () {
+      api('listDiskOfferings', {
+        listall: true
+      }).then(response => {
+        this.diskOfferings = response.listdiskofferingsresponse.diskoffering
+        this.selectedDiskOffering = this.diskOfferings[0].id
+      }).catch(error => {
+        this.$notifyError(error)
+        this.closeModal()
+      })
+    },
+    closeModal () {
+      this.$parent.$parent.close()
+    },
+    submitMigrateVolume () {
+      if (this.storagePools.length === 0) {
+        this.closeModal()
+        return
+      }
+      api('migrateVolume', {
+        livemigrate: this.resource.vmstate === 'Running',
+        storageid: this.selectedStoragePool,
+        volumeid: this.resource.id,
+        newdiskofferingid: this.replaceDiskOffering ? this.selectedDiskOffering : null
+      }).then(response => {
+        this.$pollJob({
+          jobId: response.migratevolumeresponse.jobid,
+          successMessage: this.$t('message.success.migrate.volume'),
+          successMethod: () => {
+            this.parentFetchData()
+          },
+          errorMessage: this.$t('message.migrate.volume.failed'),
+          errorMethod: () => {
+            this.parentFetchData()
+          },
+          loadingMessage: this.$t('message.migrate.volume.processing'),
+          catchMessage: this.$t('error.fetching.async.job.result'),
+          catchMethod: () => {
+            this.parentFetchData()
+          }
+        })
+        this.closeModal()
+        this.parentFetchData()
+      }).catch(error => {
+        this.$notifyError(error)
+      })
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+  .migrate-volume-container {
+    width: 95vw;
+    max-width: 100%;
+
+    @media (min-width: 760px) {
+      width: 50vw;
+    }
+  }
+
+  .actions {
+    display: flex;
+    justify-content: flex-end;
+    margin-top: 20px;
+
+    button {
+      &:not(:last-child) {
+        margin-right: 10px;
+      }
+    }
+  }
+
+  .modal-form {
+    margin-top: -20px;
+
+    &__label {
+      margin-top: 10px;
+      margin-bottom: 5px;
+    }
+
+  }
+</style>
diff --git a/ui/src/views/storage/RecurringSnapshotVolume.vue b/ui/src/views/storage/RecurringSnapshotVolume.vue
new file mode 100644
index 0000000..113cc35
--- /dev/null
+++ b/ui/src/views/storage/RecurringSnapshotVolume.vue
@@ -0,0 +1,95 @@
+// 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="snapshot-layout">
+    <a-tabs defaultActiveKey="1" :animated="false">
+      <a-tab-pane :tab="$t('label.schedule')" key="1">
+        <FormSchedule
+          :loading="loading"
+          :resource="resource"
+          :dataSource="dataSource"
+          @close-action="closeAction"
+          @refresh="handleRefresh"/>
+      </a-tab-pane>
+      <a-tab-pane :tab="$t('label.scheduled.snapshots')" key="2">
+        <ScheduledSnapshots
+          :loading="loading"
+          :resource="resource"
+          :dataSource="dataSource"
+          @refresh="handleRefresh"
+          @close-action="closeAction"/>
+      </a-tab-pane>
+    </a-tabs>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import FormSchedule from '@/views/storage/FormSchedule'
+import ScheduledSnapshots from '@/views/storage/ScheduledSnapshots'
+
+export default {
+  name: 'RecurringSnapshotVolume',
+  components: {
+    FormSchedule,
+    ScheduledSnapshots
+  },
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      loading: false,
+      dataSource: []
+    }
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      const params = {}
+      this.dataSource = []
+      this.loading = true
+      params.volumeid = this.resource.id
+      api('listSnapshotPolicies', params).then(json => {
+        this.loading = false
+        const listSnapshotPolicies = json.listsnapshotpoliciesresponse.snapshotpolicy
+        if (listSnapshotPolicies && listSnapshotPolicies.length > 0) {
+          this.dataSource = listSnapshotPolicies
+        }
+      })
+    },
+    handleRefresh () {
+      this.fetchData()
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .snapshot-layout {
+    max-width: 600px;
+  }
+</style>
diff --git a/ui/src/views/storage/ResizeVolume.vue b/ui/src/views/storage/ResizeVolume.vue
new file mode 100644
index 0000000..b30514a
--- /dev/null
+++ b/ui/src/views/storage/ResizeVolume.vue
@@ -0,0 +1,156 @@
+// 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-form :form="form" layout="vertical">
+      <a-form-item :label="$t('label.diskoffering')" v-if="resource.type !== 'ROOT'">
+        <a-select
+          v-decorator="['diskofferingid', {
+            initialValue: selectedDiskOfferingId,
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]}]"
+          :loading="loading"
+          :placeholder="$t('label.diskoffering')"
+          @change="id => (customDiskOffering = offerings.filter(x => x.id === id)[0].iscustomized || false)"
+        >
+          <a-select-option
+            v-for="(offering, index) in offerings"
+            :value="offering.id"
+            :key="index"
+          >{{ offering.displaytext || offering.name }}</a-select-option>
+        </a-select>
+      </a-form-item>
+      <div v-if="customDiskOffering || resource.type === 'ROOT'">
+        <a-form-item :label="$t('label.sizegb')">
+          <a-input
+            v-decorator="['size', {
+              rules: [{ required: true, message: $t('message.error.size') }]}]"
+            :placeholder="$t('label.disksize')"/>
+        </a-form-item>
+      </div>
+      <a-form-item :label="$t('label.shrinkok')">
+        <a-checkbox v-decorator="['shrinkok']" />
+      </a-form-item>
+      <div :span="24" class="action-button">
+        <a-button @click="closeModal">{{ $t('label.cancel') }}</a-button>
+        <a-button :loading="loading" type="primary" @click="handleSubmit">{{ $t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'ResizeVolume',
+  props: {
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      offerings: [],
+      selectedDiskOfferingId: '',
+      customDiskOffering: false,
+      loading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      this.loading = true
+      api('listDiskOfferings', {
+        zoneid: this.resource.zoneid,
+        listall: true
+      }).then(json => {
+        this.offerings = json.listdiskofferingsresponse.diskoffering || []
+        this.selectedDiskOfferingId = this.offerings[0].id || ''
+        this.customDiskOffering = this.offerings[0].iscustomized || false
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleSubmit (e) {
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        this.loading = true
+        values.id = this.resource.id
+        api('resizeVolume', values).then(response => {
+          this.$pollJob({
+            jobId: response.resizevolumeresponse.jobid,
+            successMessage: this.$t('message.success.resize.volume'),
+            successMethod: () => {
+              this.$store.dispatch('AddAsyncJob', {
+                title: this.$t('message.success.resize.volume'),
+                jobid: response.resizevolumeresponse.jobid,
+                description: values.name,
+                status: 'progress'
+              })
+            },
+            errorMessage: this.$t('message.resize.volume.failed'),
+            errorMethod: () => {
+              this.closeModal()
+            },
+            loadingMessage: `Volume resize is in progress`,
+            catchMessage: this.$t('error.fetching.async.job.result'),
+            catchMethod: () => {
+              this.loading = false
+              this.closeModal()
+            }
+          })
+          this.closeModal()
+        }).catch(error => {
+          this.$notification.error({
+            message: `${this.$t('label.error')} ${error.response.status}`,
+            description: error.response.data.errorresponse.errortext,
+            duration: 0
+          })
+        }).finally(() => {
+          this.loading = false
+        })
+      })
+    },
+    closeModal () {
+      this.$emit('refresh-data')
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.form-layout {
+  width: 75vw;
+  @media (min-width: 700px) {
+    width: 40vw;
+  }
+}
+.action-button {
+  text-align: right;
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/storage/RestoreAttachBackupVolume.vue b/ui/src/views/storage/RestoreAttachBackupVolume.vue
new file mode 100644
index 0000000..d56b75d
--- /dev/null
+++ b/ui/src/views/storage/RestoreAttachBackupVolume.vue
@@ -0,0 +1,192 @@
+// 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-form layout="vertical" :form="form">
+      <a-form-item :label="$t('label.volume')">
+        <a-select
+          allowClear
+          v-decorator="['volumeid', {
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+          }]"
+          :loading="volumeOptions.loading">
+          <a-select-option
+            v-for="(opt) in volumeOptions.opts"
+            :key="opt.id">
+            {{ opt.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item :label="$t('label.vm')">
+        <a-select
+          showSearch
+          allowClear
+          v-decorator="['virtualmachineid', {
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
+          }]"
+          :loading="virtualMachineOptions.loading">
+          <a-select-option
+            v-for="(opt) in virtualMachineOptions.opts"
+            :key="opt.name">
+            {{ opt.name }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <div :span="24" class="action-button">
+        <a-button :loading="loading || actionLoading" @click="closeAction">{{ this.$t('label.cancel') }}</a-button>
+        <a-button :loading="loading || actionLoading" type="primary" @click="handleSubmit">{{ this.$t('label.ok') }}</a-button>
+      </div>
+    </a-form>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+
+export default {
+  name: 'RestoreAttachBackupVolume',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    resource: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data () {
+    return {
+      virtualMachineOptions: {
+        loading: false,
+        opts: []
+      },
+      volumeOptions: {
+        loading: false,
+        opts: []
+      },
+      actionLoading: false
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+  },
+  mounted () {
+    this.fetchData()
+  },
+  inject: ['parentFetchData'],
+  methods: {
+    fetchData () {
+      this.fetchVirtualMachine()
+      this.fetchVolumes()
+    },
+    fetchVirtualMachine () {
+      this.virtualMachineOptions.loading = true
+      api('listVirtualMachines', { zoneid: this.resource.zoneid }).then(json => {
+        this.virtualMachineOptions.opts = json.listvirtualmachinesresponse.virtualmachine || []
+        this.$forceUpdate()
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.virtualMachineOptions.loading = false
+      })
+    },
+    async fetchVolumes () {
+      if (!this.resource || Object.keys(this.resource).length === 0) {
+        return
+      }
+      if (!this.resource.volumes || typeof this.resource.volumes !== 'string') {
+        return
+      }
+      const volumes = JSON.parse(this.resource.volumes)
+      this.volumeOptions.loading = true
+      this.volumeOptions.opts = await volumes.map(volume => {
+        return {
+          id: volume.uuid,
+          name: ['(', volume.type, ') ', volume.uuid].join('')
+        }
+      })
+      this.volumeOptions.loading = false
+      this.$forceUpdate()
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        params.backupid = this.resource.id
+        params.volumeid = values.volumeid
+        params.virtualmachineid = this.virtualMachineOptions.opts.filter(opt => opt.name === values.virtualmachineid)[0].id || null
+
+        this.actionLoading = true
+        const title = this.$t('label.restore.volume.attach')
+        api('restoreVolumeFromBackupAndAttachToVM', params).then(json => {
+          const jobId = json.restorevolumefrombackupandattachtovmresponse.jobid || null
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                const successDescription = result.jobresult.storagebackup.name
+                this.$store.dispatch('AddAsyncJob', {
+                  title: title,
+                  jobid: jobId,
+                  description: successDescription,
+                  status: 'progress'
+                })
+                this.parentFetchData()
+                this.closeAction()
+              },
+              loadingMessage: `${title} ${this.$t('label.in.progress.for')} ${this.resource.id}`,
+              catchMessage: this.$t('error.fetching.async.job.result')
+            })
+          }
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+.form-layout {
+  width: 30vw;
+
+  @media (min-width: 500px) {
+    width: 400px;
+  }
+
+  .action-button {
+    text-align: right;
+    margin-top: 20px;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+}
+</style>
diff --git a/ui/src/views/storage/ScheduledSnapshots.vue b/ui/src/views/storage/ScheduledSnapshots.vue
new file mode 100644
index 0000000..7193231
--- /dev/null
+++ b/ui/src/views/storage/ScheduledSnapshots.vue
@@ -0,0 +1,223 @@
+// 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="list-schedule">
+    <a-table
+      size="small"
+      :columns="columns"
+      :dataSource="dataSchedules"
+      :rowKey="record => record.id"
+      :pagination="false"
+      :loading="loading">
+      <div slot="icon" slot-scope="text, record">
+        <label class="interval-icon">
+          <span v-if="record.intervaltype===0">
+            <a-icon type="clock-circle" />
+          </span>
+          <span class="custom-icon icon-daily" v-else-if="record.intervaltype===1">
+            <a-icon type="calendar" />
+          </span>
+          <span class="custom-icon icon-weekly" v-else-if="record.intervaltype===2">
+            <a-icon type="calendar" />
+          </span>
+          <span class="custom-icon icon-monthly" v-else-if="record.intervaltype===3">
+            <a-icon type="calendar" />
+          </span>
+        </label>
+      </div>
+      <div slot="time" slot-scope="text, record">
+        <label class="interval-content">
+          <span v-if="record.intervaltype===0">{{ record.schedule + $t('label.min.past.hour') }}</span>
+          <span v-else>{{ record.schedule.split(':')[1] + ':' + record.schedule.split(':')[0] }}</span>
+        </label>
+      </div>
+      <div slot="interval" slot-scope="text, record">
+        <span v-if="record.intervaltype===2">
+          {{ `${$t('label.every')} ${$t(listDayOfWeek[record.schedule.split(':')[2] - 1])}` }}
+        </span>
+        <span v-else-if="record.intervaltype===3">
+          {{ `${$t('label.day')} ${record.schedule.split(':')[2]} ${$t('label.of.month')}` }}
+        </span>
+      </div>
+      <div slot="timezone" slot-scope="text, record">
+        <label>{{ getTimeZone(record.timezone) }}</label>
+      </div>
+      <div slot="tags" slot-scope="text, record">
+        <a-tag v-for="(tag, index) in record.tags" :key="index">{{ tag.key + '=' + tag.value }}</a-tag>
+      </div>
+      <div slot="action" class="account-button-action" slot-scope="text, record">
+        <a-tooltip placement="top">
+          <template slot="title">
+            {{ $t('label.delete') }}
+          </template>
+          <a-button
+            type="danger"
+            shape="circle"
+            icon="close"
+            size="small"
+            :loading="actionLoading"
+            @click="handleClickDelete(record)"/>
+        </a-tooltip>
+      </div>
+    </a-table>
+  </div>
+</template>
+
+<script>
+import { api } from '@/api'
+import { timeZoneName } from '@/utils/timezone'
+
+export default {
+  name: 'ScheduledSnapshots',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    dataSource: {
+      type: Array,
+      required: true
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      columns: [],
+      dataSchedules: [],
+      listDayOfWeek: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
+    }
+  },
+  created () {
+    this.columns = [
+      {
+        title: '',
+        dataIndex: 'icon',
+        width: 30,
+        scopedSlots: { customRender: 'icon' }
+      },
+      {
+        title: this.$t('label.time'),
+        dataIndex: 'schedule',
+        scopedSlots: { customRender: 'time' }
+      },
+      {
+        title: '',
+        dataIndex: 'interval',
+        scopedSlots: { customRender: 'interval' }
+      },
+      {
+        title: this.$t('label.timezone'),
+        dataIndex: 'timezone',
+        scopedSlots: { customRender: 'timezone' }
+      },
+      {
+        title: this.$t('label.keep'),
+        dataIndex: 'maxsnaps',
+        scopedSlots: { customRender: 'keep' }
+      },
+      {
+        title: this.$t('label.tags'),
+        dataIndex: 'tags',
+        scopedSlots: { customRender: 'tags' }
+      },
+      {
+        title: this.$t('label.action'),
+        dataIndex: 'action',
+        width: 50,
+        scopedSlots: { customRender: 'action' }
+      }
+    ]
+  },
+  mounted () {
+    this.dataSchedules = this.dataSource
+  },
+  watch: {
+    dataSource (newData, oldData) {
+      this.dataSchedules = newData
+    }
+  },
+  methods: {
+    handleClickDelete (record) {
+      const params = {}
+      params.id = record.id
+      this.actionLoading = true
+      api('deleteSnapshotPolicies', params).then(json => {
+        if (json.deletesnapshotpoliciesresponse.success) {
+          this.$notification.success({
+            message: this.$t('label.delete.snapshot.policy'),
+            description: this.$t('message.success.delete.snapshot.policy')
+          })
+
+          this.$emit('refresh')
+        }
+      }).catch(error => {
+        this.$notifyError(error)
+      }).finally(() => {
+        this.actionLoading = false
+      })
+    },
+    getTimeZone (timeZone) {
+      return timeZoneName(timeZone)
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .interval-icon {
+    span {
+      position: relative;
+      font-size: 18px;
+    }
+
+    .custom-icon:before {
+      font-size: 8px;
+      position: absolute;
+      top: 8px;
+      left: 3.5px;
+      color: #000;
+      font-weight: 700;
+      line-height: 1.7;
+    }
+
+    .icon-daily:before {
+      content: "01";
+      left: 5px;
+      top: 7px;
+      line-height: 1.9;
+    }
+
+    .icon-weekly:before {
+      content: "1-7";
+      left: 3px;
+      line-height: 1.7;
+    }
+
+    .icon-monthly:before {
+      content: "***";
+    }
+  }
+
+  /deep/.ant-btn > .anticon {
+    line-height: 1.8;
+  }
+</style>
diff --git a/ui/src/views/storage/TakeSnapshot.vue b/ui/src/views/storage/TakeSnapshot.vue
new file mode 100644
index 0000000..8aec236
--- /dev/null
+++ b/ui/src/views/storage/TakeSnapshot.vue
@@ -0,0 +1,274 @@
+// 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="take-snapshot">
+    <a-spin :spinning="loading || actionLoading">
+      <label>
+        {{ $t('label.header.volume.take.snapshot') }}
+      </label>
+      <a-form
+        class="form"
+        :form="form"
+        layout="vertical"
+        @submit="handleSubmit">
+        <a-row :gutter="12">
+          <a-col :md="24" :lg="24">
+            <a-form-item :label="$t('label.name')">
+              <a-input
+                v-decorator="['name']"
+                :placeholder="apiParams.name.description" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="24">
+            <a-form-item :label="$t('label.asyncbackup')">
+              <a-switch v-decorator="['asyncbackup']" />
+            </a-form-item>
+          </a-col>
+          <a-col :md="24" :lg="24" v-if="quiescevm">
+            <a-form-item :label="$t('label.quiescevm')">
+              <a-switch v-decorator="['quiescevm']" />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-divider/>
+        <div class="tagsTitle">{{ $t('label.tags') }}</div>
+        <div>
+          <template v-for="(tag, index) in tags">
+            <a-tag :key="index" :closable="true">
+              {{ tag.key }} = {{ tag.value }}
+            </a-tag>
+          </template>
+          <div v-if="inputVisible">
+            <a-input-group
+              type="text"
+              size="small"
+              @blur="handleInputConfirm"
+              @keyup.enter="handleInputConfirm"
+              compact>
+              <a-input ref="input" :value="inputKey" @change="handleKeyChange" style="width: 100px; text-align: center" :placeholder="$t('label.key')" />
+              <a-input style=" width: 30px; border-left: 0; pointer-events: none; backgroundColor: #fff" placeholder="=" disabled />
+              <a-input :value="inputValue" @change="handleValueChange" style="width: 100px; text-align: center; border-left: 0" :placeholder="$t('label.value')" />
+              <a-button shape="circle" size="small" @click="handleInputConfirm">
+                <a-icon type="check"/>
+              </a-button>
+              <a-button shape="circle" size="small" @click="inputVisible=false">
+                <a-icon type="close"/>
+              </a-button>
+            </a-input-group>
+          </div>
+          <a-tag v-else @click="showInput" style="background: #fff; borderStyle: dashed;">
+            <a-icon type="plus" /> {{ $t('label.new.tag') }}
+          </a-tag>
+        </div>
+        <div :span="24" class="action-button">
+          <a-button
+            :loading="actionLoading"
+            @click="closeAction">
+            {{ this.$t('label.cancel') }}
+          </a-button>
+          <a-button
+            v-if="handleShowButton()"
+            :loading="actionLoading"
+            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: 'TakeSnapshot',
+  props: {
+    loading: {
+      type: Boolean,
+      default: false
+    },
+    resource: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      actionLoading: false,
+      quiescevm: false,
+      inputValue: '',
+      inputKey: '',
+      inputVisible: '',
+      tags: [],
+      dataSource: []
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiConfig = this.$store.getters.apis.createSnapshot || {}
+    this.apiParams = {}
+    this.apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.quiescevm = this.resource.quiescevm
+  },
+  methods: {
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((error, values) => {
+        if (error) {
+          return
+        }
+
+        let params = {}
+        params.volumeId = this.resource.id
+        if (values.name) {
+          params.name = values.name
+        }
+        params.asyncBackup = false
+        if (values.asyncbackup) {
+          params.asyncBackup = values.asyncbackup
+        }
+        params.quiescevm = false
+        if (values.quiescevm) {
+          params.quiescevm = values.quiescevm
+        }
+        for (let i = 0; i < this.tags.length; i++) {
+          const formattedTagData = {}
+          const tag = this.tags[i]
+          formattedTagData['tags[' + i + '].key'] = tag.key
+          formattedTagData['tags[' + i + '].value'] = tag.value
+          params = Object.assign({}, params, formattedTagData)
+        }
+
+        this.actionLoading = true
+        const title = this.$t('label.action.take.snapshot')
+        const description = this.$t('label.volume') + ' ' + this.resource.id
+        api('createSnapshot', params).then(json => {
+          const jobId = json.createsnapshotresponse.jobid
+          if (jobId) {
+            this.$pollJob({
+              jobId,
+              successMethod: result => {
+                const successDescription = result.jobresult.snapshot.name
+                this.$store.dispatch('AddAsyncJob', {
+                  title: title,
+                  jobid: jobId,
+                  description: successDescription,
+                  status: 'progress'
+                })
+              },
+              loadingMessage: `${title} ${this.$t('label.in.progress.for')} ${description}`,
+              catchMessage: this.$t('error.fetching.async.job.result')
+            })
+          }
+          this.closeAction()
+        }).catch(error => {
+          this.$notifyError(error)
+        }).finally(() => {
+          this.actionLoading = false
+        })
+      })
+    },
+    handleVisibleInterval (intervalType) {
+      if (this.dataSource.length === 0) {
+        return false
+      }
+      const dataSource = this.dataSource.filter(item => item.intervaltype === intervalType)
+      if (dataSource && dataSource.length > 0) {
+        return true
+      }
+      return false
+    },
+    handleShowButton () {
+      if (this.dataSource.length === 0) {
+        return true
+      }
+      const dataSource = this.dataSource.filter(item => item.intervaltype === this.intervalValue)
+      if (dataSource && dataSource.length > 0) {
+        return false
+      }
+      return true
+    },
+    handleKeyChange (e) {
+      this.inputKey = e.target.value
+    },
+    handleValueChange (e) {
+      this.inputValue = e.target.value
+    },
+    handleInputConfirm () {
+      this.tags.push({
+        key: this.inputKey,
+        value: this.inputValue
+      })
+      this.inputVisible = false
+      this.inputKey = ''
+      this.inputValue = ''
+    },
+    showInput () {
+      this.inputVisible = true
+      this.$nextTick(function () {
+        this.$refs.input.focus()
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.form {
+  margin-top: 10px;
+}
+
+.take-snapshot {
+  width: 85vw;
+
+  @media (min-width: 760px) {
+    width: 500px;
+  }
+}
+
+.ant-tag {
+  margin-bottom: 10px;
+}
+
+.ant-divider {
+  margin-top: 0;
+}
+
+.tagsTitle {
+  font-weight: 500;
+  color: rgba(0, 0, 0, 0.85);
+  margin-bottom: 12px;
+}
+
+.action-button {
+  text-align: right;
+
+  button {
+    margin-right: 5px;
+  }
+}
+</style>
diff --git a/ui/src/views/storage/UploadLocalVolume.vue b/ui/src/views/storage/UploadLocalVolume.vue
new file mode 100644
index 0000000..66633db
--- /dev/null
+++ b/ui/src/views/storage/UploadLocalVolume.vue
@@ -0,0 +1,261 @@
+// 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">
+    <span v-if="uploadPercentage > 0">
+      <a-icon type="loading" />
+      {{ $t('message.upload.file.processing') }}
+      <a-progress :percent="uploadPercentage" />
+    </span>
+    <a-spin :spinning="loading" v-else>
+      <a-form
+        :form="form"
+        @submit="handleSubmit"
+        layout="vertical">
+        <a-form-item :label="$t('label.templatefileupload')">
+          <a-upload-dragger
+            :multiple="false"
+            :fileList="fileList"
+            :remove="handleRemove"
+            :beforeUpload="beforeUpload"
+            v-decorator="['file', {
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}`}]
+            }]">
+            <p class="ant-upload-drag-icon">
+              <a-icon type="cloud-upload" />
+            </p>
+            <p class="ant-upload-text" v-if="fileList.length === 0">
+              {{ $t('label.volume.volumefileupload.description') }}
+            </p>
+          </a-upload-dragger>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.name') }}
+            <a-tooltip :title="apiParams.name.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['name', {
+              rules: [{ required: true, message: $t('message.error.volume.name') }]
+            }]"
+            :placeholder="$t('label.volumename')" />
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.zone') }}
+            <a-tooltip :title="apiParams.zoneid.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['zoneId', {
+              initialValue: zoneSelected,
+              rules: [
+                {
+                  required: true,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ]
+            }]">
+            <a-select-option :value="zone.id" v-for="zone in zones" :key="zone.id">
+              {{ zone.name || zone.description }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.format') }}
+            <a-tooltip :title="apiParams.format.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-select
+            v-decorator="['format', {
+              initialValue: formats[0],
+              rules: [
+                {
+                  required: false,
+                  message: `${this.$t('message.error.select')}`
+                }
+              ]
+            }]">
+            <a-select-option v-for="format in formats" :key="format">
+              {{ format }}
+            </a-select-option>
+          </a-select>
+        </a-form-item>
+        <a-form-item>
+          <span slot="label">
+            {{ $t('label.volumechecksum') }}
+            <a-tooltip :title="apiParams.checksum.description">
+              <a-icon type="info-circle" style="color: rgba(0,0,0,.45)" />
+            </a-tooltip>
+          </span>
+          <a-input
+            v-decorator="['checksum']"
+            :placeholder="$t('label.volumechecksum.description')"
+          />
+        </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'
+import { axios } from '../../utils/request'
+
+export default {
+  name: 'UploadLocalVolume',
+  data () {
+    return {
+      fileList: [],
+      zones: [],
+      formats: ['RAW', 'VHD', 'VHDX', 'OVA', 'QCOW2'],
+      zoneSelected: '',
+      uploadParams: null,
+      loading: false,
+      uploadPercentage: 0
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this)
+    this.apiParams = {}
+    var apiConfig = this.$store.getters.apis.getUploadParamsForVolume || {}
+    apiConfig.params.forEach(param => {
+      this.apiParams[param.name] = param
+    })
+  },
+  mounted () {
+    this.listZones()
+  },
+  methods: {
+    listZones () {
+      api('listZones').then(json => {
+        if (json && json.listzonesresponse && json.listzonesresponse.zone) {
+          this.zones = json.listzonesresponse.zone
+          if (this.zones.length > 0) {
+            this.zoneSelected = this.zones[0].id
+          }
+        }
+      })
+    },
+    handleRemove (file) {
+      const index = this.fileList.indexOf(file)
+      const newFileList = this.fileList.slice()
+      newFileList.splice(index, 1)
+      this.fileList = newFileList
+    },
+    beforeUpload (file) {
+      this.fileList = [...this.fileList, file]
+      return false
+    },
+    handleSubmit (e) {
+      e.preventDefault()
+      this.form.validateFields((err, values) => {
+        if (err) {
+          return
+        }
+        const params = {}
+        for (const key in values) {
+          const input = values[key]
+          if (input === undefined) {
+            continue
+          }
+          if (key === 'file') {
+            continue
+          }
+          params[key] = input
+        }
+        api('getUploadParamsForVolume', params).then(json => {
+          this.uploadParams = (json.postuploadvolumeresponse && json.postuploadvolumeresponse.getuploadparams) ? json.postuploadvolumeresponse.getuploadparams : ''
+          const { fileList } = this
+          if (this.fileList.length > 1) {
+            this.$notification.error({
+              message: this.$t('message.upload.volume.failed'),
+              description: this.$t('message.upload.file.limit'),
+              duration: 0
+            })
+          }
+          const formData = new FormData()
+          fileList.forEach(file => {
+            formData.append('files[]', file)
+          })
+          this.loading = true
+          this.uploadPercentage = 0
+          axios.post(this.uploadParams.postURL,
+            formData,
+            {
+              headers: {
+                'Content-Type': 'multipart/form-data',
+                'X-signature': this.uploadParams.signature,
+                'X-expires': this.uploadParams.expires,
+                'X-metadata': this.uploadParams.metadata
+              },
+              onUploadProgress: (progressEvent) => {
+                this.uploadPercentage = Number(parseFloat(100 * progressEvent.loaded / progressEvent.total).toFixed(1))
+              },
+              timeout: 86400000
+            }).then((json) => {
+            this.$notification.success({
+              message: this.$t('message.success.upload'),
+              description: this.$t('message.success.upload.volume.description')
+            })
+            this.closeAction()
+          }).catch(e => {
+            this.$notification.error({
+              message: this.$t('message.upload.failed'),
+              description: `${this.$t('message.upload.iso.failed.description')} -  ${e}`,
+              duration: 0
+            })
+          }).finally(() => {
+            this.loading = false
+          })
+        })
+      })
+    },
+    closeAction () {
+      this.$emit('close-action')
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+  .form-layout {
+    width: 80vw;
+
+    @media (min-width: 700px) {
+      width: 550px;
+    }
+  }
+
+  .action-button {
+    text-align: right;
+
+    button {
+      margin-right: 5px;
+    }
+  }
+</style>
diff --git a/ui/tests/.eslintrc.js b/ui/tests/.eslintrc.js
new file mode 100644
index 0000000..7a26e36
--- /dev/null
+++ b/ui/tests/.eslintrc.js
@@ -0,0 +1,22 @@
+// 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.
+
+module.exports = {
+  env: {
+    jest: true
+  }
+}
diff --git a/ui/tests/common/index.js b/ui/tests/common/index.js
new file mode 100644
index 0000000..544c66e
--- /dev/null
+++ b/ui/tests/common/index.js
@@ -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.
+
+import mockI18n from '../mock/mockI18n'
+import mockStore from '../mock/mockStore'
+import mockRouter from '../mock/mockRouter'
+
+import localVue from '../setup'
+import { mount } from '@vue/test-utils'
+import { pollJobPlugin, notifierPlugin } from '@/utils/plugins'
+
+localVue.use(pollJobPlugin)
+localVue.use(notifierPlugin)
+
+function createMockRouter (newRoutes = []) {
+  let routes = []
+  if (!newRoutes || Object.keys(newRoutes).length === 0) {
+    return mockRouter.mock(routes)
+  }
+
+  routes = [...newRoutes]
+
+  return mockRouter.mock(routes)
+}
+
+function createMockI18n (locale = 'en', messages = {}) {
+  return mockI18n.mock(locale, messages)
+}
+
+function createMockStore (state = {}, actions = {}) {
+  return mockStore.mock(state, actions)
+}
+
+function decodeHtml (html) {
+  const text = document.createElement('textarea')
+  text.innerHTML = html
+
+  return text.value
+}
+
+function createFactory (component, options) {
+  var {
+    router = null,
+    i18n = null,
+    store = null,
+    props = {},
+    data = {},
+    mocks = {}
+  } = options
+
+  if (!router) router = createMockRouter()
+  if (!i18n) i18n = createMockI18n()
+  if (!store) store = createMockStore()
+
+  return mount(component, {
+    localVue,
+    router,
+    i18n,
+    store,
+    propsData: props,
+    mocks,
+    data () {
+      return { ...data }
+    }
+  })
+}
+
+export default {
+  createFactory,
+  createMockRouter,
+  createMockI18n,
+  createMockStore,
+  decodeHtml
+}
diff --git a/ui/tests/mock/mockAxios.js b/ui/tests/mock/mockAxios.js
new file mode 100644
index 0000000..9463ecf
--- /dev/null
+++ b/ui/tests/mock/mockAxios.js
@@ -0,0 +1,22 @@
+// 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.
+
+const mockAxios = jest.genMockFromModule('axios')
+
+mockAxios.create = jest.fn(() => mockAxios)
+
+export default mockAxios
diff --git a/ui/tests/mock/mockI18n.js b/ui/tests/mock/mockI18n.js
new file mode 100644
index 0000000..869b6aa
--- /dev/null
+++ b/ui/tests/mock/mockI18n.js
@@ -0,0 +1,29 @@
+// 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 VueI18n from 'vue-i18n'
+
+const mockI18n = {
+  mock: (locale = 'en', message = {}) => {
+    return new VueI18n({
+      locale: locale,
+      messages: message
+    })
+  }
+}
+
+export default mockI18n
diff --git a/ui/tests/mock/mockRouter.js b/ui/tests/mock/mockRouter.js
new file mode 100644
index 0000000..2063934
--- /dev/null
+++ b/ui/tests/mock/mockRouter.js
@@ -0,0 +1,64 @@
+// 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 VueRouter from 'vue-router'
+
+const mockRouter = {
+  routes: [
+    {
+      path: '/',
+      name: 'home',
+      meta: { icon: 'home' },
+      children: []
+    }
+  ],
+  mock: (routes = []) => {
+    mockRouter.routes[0].children = [
+      {
+        path: '/exception',
+        name: 'exception',
+        children: [
+          {
+            path: '/exception/403',
+            name: 403,
+            hidden: true,
+            meta: { icon: 'icon-error-test' }
+          },
+          {
+            path: '/exception/404',
+            name: 404,
+            hidden: true,
+            meta: { icon: 'icon-error-test' }
+          },
+          {
+            path: '/exception/500',
+            name: 500,
+            hidden: true,
+            meta: { icon: 'icon-error-test' }
+          }
+        ]
+      }
+    ]
+    if (routes && routes.length > 0) {
+      mockRouter.routes[0].children = [...mockRouter.routes[0].children, ...routes]
+    }
+
+    return new VueRouter({ routes: mockRouter.routes, mode: 'history' })
+  }
+}
+
+export default mockRouter
diff --git a/ui/tests/mock/mockStore.js b/ui/tests/mock/mockStore.js
new file mode 100644
index 0000000..6d94906
--- /dev/null
+++ b/ui/tests/mock/mockStore.js
@@ -0,0 +1,50 @@
+// 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 Vuex from 'vuex'
+
+const mockStore = {
+  state: {},
+  mock: (state, actions) => {
+    mockStore.state = {
+      app: {
+        device: 'desktop'
+      },
+      user: {},
+      permission: {}
+    }
+
+    if (state && Object.keys(state).length > 0) {
+      mockStore.state = { ...mockStore.state, ...state }
+    }
+
+    if (!actions) {
+      actions = {}
+    }
+
+    return new Vuex.Store({
+      state: mockStore.state,
+      getters: {
+        apis: () => mockStore.state.user.apis,
+        userInfo: () => mockStore.state.user.info
+      },
+      actions
+    })
+  }
+}
+
+export default mockStore
diff --git a/ui/tests/mockData/ActionButton.mock.json b/ui/tests/mockData/ActionButton.mock.json
new file mode 100644
index 0000000..c0934d0
--- /dev/null
+++ b/ui/tests/mockData/ActionButton.mock.json
@@ -0,0 +1,30 @@
+{
+  "messages": {
+    "en": { "label.action": "action-en" },
+    "de": { "label.action": "action-de" }
+  },
+  "apis": {
+    "test-api-case-1": {},
+    "test-api-case-2": {},
+    "test-api-case-3": {},
+    "test-api-case-4": {},
+    "test-api-case-5": {},
+    "test-api-case-6": {}
+  },
+  "routes": [
+    {
+      "name": "testRouter1",
+      "path": "/test-router-1",
+      "meta": {
+        "name": "systemvm"
+      }
+    },
+    {
+      "name": "testRouter2",
+      "path": "/test-router-2",
+      "meta": {
+        "name": "test-name"
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/ui/tests/mockData/AutogenView.mock.json b/ui/tests/mockData/AutogenView.mock.json
new file mode 100644
index 0000000..d1df58f
--- /dev/null
+++ b/ui/tests/mockData/AutogenView.mock.json
@@ -0,0 +1,198 @@
+{
+  "messages": {
+    "en": {
+      "labelname": "test-name-en",
+      "displaytext": "description-en",
+      "label.column1": "column1-en",
+      "label.column2": "column2-en",
+      "label.column3": "column3-en",
+      "label.id": "uuid-en",
+      "label.name": "name-en",
+      "label.domainid": "domain-en",
+      "label.self": "self-en",
+      "label.all": "all-en",
+      "label.tags": "tags-en",
+      "label.account": "account-en",
+      "label.domainids": "domainids-en",
+      "label.keypair": "keypair-en",
+      "label.filterby": "filterby-en",
+      "label.refresh": "refresh-en",
+      "message.error.required.input": "required-en",
+      "message.error.select": "select-en",
+      "label.search": "search-en",
+      "label.quota.configuration": "quota-configuration-en",
+      "label.quota.value": "quota-value-en",
+      "label.quota.tariff.effectivedate": "quota-effectivedate-en",
+      "label.confirmpassword": "confirmpassword-en",
+      "label.confirmpassword.description": "confirmpassword-description-en",
+      "label.open.documentation": "open",
+      "label.metrics": "metrics",
+      "label.showing": "Showing",
+      "label.of": "of",
+      "label.items": "items",
+      "label.page": "page",
+      "label.view.console": "view-console-en",
+      "error.fetching.async.job.result": "Error encountered while fetching async job result",
+      "label.cancel": "cancel",
+      "label.ok": "ok"
+    },
+    "de": {
+      "labelname": "test-name-de",
+      "displaytext": "description-de",
+      "label.column1": "column1-de",
+      "label.column2": "column2-de",
+      "label.column3": "column3-de",
+      "label.id": "uuid-de",
+      "label.name": "name-de",
+      "label.domainid": "domain-de",
+      "label.self": "self-de",
+      "label.all": "all-de",
+      "label.tags": "tags-de",
+      "label.account": "account-de",
+      "label.domainids": "domainids-de",
+      "label.keypair": "keypair-de",
+      "label.filterby": "filterby-de",
+      "label.refresh": "refresh-de",
+      "message.error.required.input": "required-de",
+      "message.error.select": "select-de",
+      "label.search": "search-de",
+      "label.quota.configuration": "quota-configuration-de",
+      "label.quota.value": "quota-value-de",
+      "label.quota.tariff.effectivedate": "quota-effectivedate-de",
+      "label.confirmpassword": "confirmpassword-de",
+      "label.confirmpassword.description": "confirmpassword-description-de",
+      "label.open.documentation": "open",
+      "label.metrics": "metrics",
+      "label.showing": "Showing",
+      "label.of": "of",
+      "label.items": "items",
+      "label.page": "page",
+      "label.view.console": "view-console-de",
+      "error.fetching.async.job.result": "Error encountered while fetching async job result",
+      "label.cancel": "cancel",
+      "label.ok": "ok"
+    }
+  },
+  "apis": {
+    "testApiNameCase1": {
+      "params": {},
+      "response": []
+    },
+    "testApiNameCase2": {
+      "params": {},
+      "response": []
+    },
+    "testApiNameCase3": {
+      "params": {},
+      "response": []
+    },
+    "testApiNameCase4": {
+      "params": {},
+      "response": [
+        {
+          "name": "column2",
+          "type": "string"
+        },
+        {
+          "name": "column1",
+          "type": "string"
+        },
+        {
+          "name": "column3",
+          "type": "string"
+        }
+      ]
+    },
+    "testApiNameCase5": {
+      "params": [
+        {
+          "name": "column2",
+          "type": "string"
+        },
+        {
+          "name": "column1",
+          "type": "string"
+        },
+        {
+          "name": "column3",
+          "type": "string"
+        },
+        {
+          "name": "name",
+          "type": "string"
+        },
+        {
+          "name": "id",
+          "type": "string"
+        }
+      ],
+      "response": []
+    },
+    "testApiNameCase6": {
+      "params": [
+        {
+          "name": "id",
+          "type": "uuid"
+        },
+        {
+          "name": "tags",
+          "type": "list"
+        },
+        {
+          "name": "column1",
+          "type": "list"
+        },
+        {
+          "name": "column2",
+          "type": "string"
+        },
+        {
+          "name": "account",
+          "type": "string"
+        },
+        {
+          "name": "confirmpassword",
+          "type": "string"
+        }
+      ],
+      "response": []
+    },
+    "listTemplates": {
+      "params": {},
+      "response": []
+    },
+    "listIsos": {
+      "params": {},
+      "response": []
+    },
+    "listRoles": {
+      "params": {},
+      "response": []
+    },
+    "listHosts": {
+      "params": {},
+      "response": []
+    },
+    "listTestApiNames": {
+      "params": {},
+      "response": []
+    },
+    "createAccount": {
+      "params": {},
+      "response": []
+    },
+    "addAccountToProject": {
+      "params": {},
+      "response": []
+    },
+    "quotaEmailTemplateList": {
+      "params": {},
+      "response": []
+    }
+  },
+  "info": {
+    "roletype": "Normal",
+    "account": "test-account",
+    "domainid": "test-domain-id"
+  }
+}
\ No newline at end of file
diff --git a/ui/tests/mockData/MigrateWizard.mock.json b/ui/tests/mockData/MigrateWizard.mock.json
new file mode 100644
index 0000000..0c581f17
--- /dev/null
+++ b/ui/tests/mockData/MigrateWizard.mock.json
@@ -0,0 +1,24 @@
+{
+  "messages": {
+    "en": {
+      "name": "name-en",
+      "Suitability": "Suitability-en",
+      "cpuused": "cpuused-en",
+      "memused": "memused-en",
+      "select": "select-en",
+      "ok": "ok-en",
+      "message.load.host.failed": "Failed to load hosts",
+      "message.migrating.vm.to.host.failed": "Failed to migrate VM to host"
+    },
+    "de": {
+      "name": "name-de",
+      "Suitability": "Suitability-de",
+      "cpuused": "cpuused-de",
+      "memused": "memused-de",
+      "select": "select-de",
+      "ok": "ok-de",
+      "message.load.host.failed": "Failed to load hosts",
+      "message.migrating.vm.to.host.failed": "Failed to migrate VM to host"
+    }
+  }
+}
\ No newline at end of file
diff --git a/ui/tests/mockData/Status.mock.json b/ui/tests/mockData/Status.mock.json
new file mode 100644
index 0000000..179cb63
--- /dev/null
+++ b/ui/tests/mockData/Status.mock.json
@@ -0,0 +1,38 @@
+{
+  "messages": {
+    "en": {
+      "state.running": "Running",
+      "state.migrating": "Migrating",
+      "state.stopped": "Stopped",
+      "state.starting": "Starting",
+      "state.stopping": "Stopping",
+      "state.suspended": "Suspended",
+      "state.pending": "Pending",
+      "state.expunging": "Expunging",
+      "state.error": "Error",
+      "message.publicip.state.allocated": "Allocated",
+      "message.publicip.state.created": "Created",
+      "message.vmsnapshot.state.active": "Active",
+      "message.vm.state.active": "Active",
+      "message.volume.state.active": "Active",
+      "message.guestnetwork.state.active": "Active",
+      "message.publicip.state.active": "Active",
+      "Created": "Created",
+      "Active": "Active",
+      "Allocated": "Allocated",
+      "Error": "Error",
+      "Expunging": "Expunging",
+      "Suspended": "Suspended",
+      "Pending": "Pending",
+      "Running": "Running",
+      "Starting": "Starting",
+      "Another": "Another",
+      "Ready": "Ready",
+      "Disabled": "Disabled",
+      "Migrating": "Migrating",
+      "Stopping": "Stopping",
+      "Alert": "Alert",
+      "Stopped": "Stopped"
+    }
+  }
+}
\ No newline at end of file
diff --git a/ui/tests/setup.js b/ui/tests/setup.js
new file mode 100644
index 0000000..0f532ff
--- /dev/null
+++ b/ui/tests/setup.js
@@ -0,0 +1,49 @@
+// 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 Vue from 'vue'
+import Vuex from 'vuex'
+import Antd from 'ant-design-vue'
+import VueRouter from 'vue-router'
+import VueI18n from 'vue-i18n'
+import VueStorage from 'vue-ls'
+import VueClipboard from 'vue-clipboard2'
+import config from '@/config/settings'
+import { createLocalVue } from '@vue/test-utils'
+import registerRequireContextHook from 'babel-plugin-require-context-hook/register'
+
+const localVue = createLocalVue()
+
+Vue.use(Antd)
+Vue.use(VueStorage, config.storageOptions)
+
+localVue.use(VueRouter)
+localVue.use(VueI18n)
+localVue.use(Vuex)
+localVue.use(VueClipboard)
+
+registerRequireContextHook()
+
+window.matchMedia = window.matchMedia || function () {
+  return {
+    matches: false,
+    addListener: function () {},
+    removeListener: function () {}
+  }
+}
+
+module.exports = localVue
diff --git a/ui/tests/unit/components/view/ActionButton.spec.js b/ui/tests/unit/components/view/ActionButton.spec.js
new file mode 100644
index 0000000..db7bd81
--- /dev/null
+++ b/ui/tests/unit/components/view/ActionButton.spec.js
@@ -0,0 +1,337 @@
+// 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 mockAxios from '../../../mock/mockAxios'
+import ActionButton from '@/components/view/ActionButton'
+import common from '../../../common'
+import mockData from '../../../mockData/ActionButton.mock.json'
+
+jest.mock('axios', () => mockAxios)
+
+let router, store, i18n
+const state = {
+  user: {
+    apis: mockData.apis
+  }
+}
+router = common.createMockRouter(mockData.routes)
+store = common.createMockStore(state)
+i18n = common.createMockI18n('en', mockData.messages)
+
+const factory = (opts = {}) => {
+  router = opts.router || router
+  store = opts.store || store
+  i18n = opts.i18n || i18n
+
+  return common.createFactory(ActionButton, {
+    router,
+    store,
+    i18n,
+    props: opts.props || {},
+    data: opts.data || {}
+  })
+}
+
+describe('Components > View > ActionButton.vue', () => {
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
+
+  describe('Template', () => {
+    it('Button action is show', () => {
+      const expected = '<i aria-label="icon: plus" class="anticon anticon-plus">'
+      const wrapper = factory()
+
+      wrapper.vm.$nextTick(() => {
+        const received = wrapper.html()
+
+        expect(received).not.toContain(expected)
+      })
+    })
+
+    it('Normal button action is show', () => {
+      const expected = '<i aria-label="icon: plus" class="anticon anticon-plus">'
+      const propsData = {
+        actions: [
+          {
+            label: 'label.action',
+            api: 'test-api-case-1',
+            showBadge: false,
+            icon: 'plus',
+            dataView: false,
+            listView: true
+          }
+        ],
+        dataView: false,
+        listView: true
+      }
+
+      const wrapper = factory({ props: propsData })
+
+      wrapper.vm.$nextTick(() => {
+        const received = wrapper.html()
+
+        expect(received).toContain(expected)
+      })
+    })
+
+    it('Badge button action is show', (done) => {
+      const expected = '<span class="button-action-badge ant-badge">'
+      const propsData = {
+        actions: [
+          {
+            label: 'label.action',
+            api: 'test-api-case-2',
+            showBadge: true,
+            icon: 'plus',
+            dataView: true
+          }
+        ],
+        dataView: true
+      }
+      const dataMock = {
+        testapinameresponse: {
+          count: 0,
+          testapiname: []
+        }
+      }
+
+      mockAxios.mockImplementation(() => Promise.resolve(dataMock))
+
+      const wrapper = factory({ props: propsData })
+
+      wrapper.vm.$nextTick(() => {
+        const wrapperHtml = wrapper.html()
+        const received = common.decodeHtml(wrapperHtml)
+
+        expect(received).toContain(expected)
+
+        done()
+      })
+    })
+  })
+
+  describe('Method', () => {
+    describe('handleShowBadge()', () => {
+      it('check the api is called and returned is not null', (done) => {
+        const postData = new URLSearchParams()
+        const expected = { 'test-api-case-3': { badgeNum: 2 } }
+        const dataMock = { testapinameresponse: { count: 2 } }
+        const propsData = {
+          actions: [
+            {
+              label: 'label.action',
+              api: 'test-api-case-3',
+              showBadge: true,
+              icon: 'plus',
+              dataView: true
+            }
+          ],
+          dataView: true
+        }
+
+        mockAxios.mockResolvedValue(dataMock)
+
+        const wrapper = factory({ props: propsData })
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            data: postData,
+            method: 'GET',
+            params: {
+              command: 'test-api-case-3',
+              response: 'json'
+            },
+            url: '/'
+          })
+          expect(wrapper.vm.actionBadge).toEqual(expected)
+
+          done()
+        })
+      })
+
+      it('check the api is called returned is null', (done) => {
+        const postData = new URLSearchParams()
+        const expected = { 'test-api-case-4': { badgeNum: 0 } }
+        const dataMock = { data: [] }
+        const propsData = {
+          actions: [
+            {
+              label: 'label.action',
+              api: 'test-api-case-4',
+              showBadge: true,
+              icon: 'plus',
+              dataView: true
+            }
+          ],
+          dataView: true
+        }
+
+        mockAxios.mockResolvedValue(dataMock)
+
+        const wrapper = factory({ props: propsData })
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            data: postData,
+            method: 'GET',
+            params: {
+              command: 'test-api-case-4',
+              response: 'json'
+            },
+            url: '/'
+          })
+          expect(wrapper.vm.actionBadge).toEqual(expected)
+
+          done()
+        })
+      })
+
+      it('check the api is called and throws error', (done) => {
+        const postData = new URLSearchParams()
+        const propsData = {
+          actions: [
+            {
+              label: 'label.action',
+              api: 'test-api-case-5',
+              showBadge: true,
+              icon: 'plus',
+              dataView: true
+            }
+          ],
+          dataView: true
+        }
+        const errorMessage = 'errMethodMessage'
+
+        mockAxios.mockImplementationOnce(() => Promise.reject(errorMessage))
+
+        const wrapper = factory({ props: propsData })
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            data: postData,
+            method: 'GET',
+            params: {
+              command: 'test-api-case-5',
+              response: 'json'
+            },
+            url: '/'
+          })
+          expect(wrapper.vm.actionBadge).toEqual({})
+
+          done()
+        })
+      })
+    })
+
+    describe('execAction()', () => {
+      it('check emitted events are executed', async () => {
+        const expected = {
+          icon: 'plus',
+          label: 'label.action',
+          api: 'test-api-case-6',
+          showBadge: false,
+          dataView: true,
+          resource: {
+            id: 'test-resource-id'
+          }
+        }
+        const propsData = {
+          actions: [
+            {
+              icon: 'plus',
+              label: 'label.action',
+              api: 'test-api-case-6',
+              showBadge: false,
+              dataView: true
+            }
+          ],
+          dataView: true,
+          resource: {
+            id: 'test-resource-id'
+          }
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        await wrapper.find('button').trigger('click')
+        await wrapper.vm.$nextTick()
+
+        expect(wrapper.emitted()['exec-action'][0]).toEqual([expected])
+      })
+    })
+  })
+
+  describe('Watcher', () => {
+    describe('handleShowBadge()', () => {
+      it('check handleShowBadge() is not called with empty resource', async () => {
+        const wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id'
+            }
+          }
+        })
+        const handleShowBadge = jest.spyOn(wrapper.vm, 'handleShowBadge')
+        wrapper.setProps({
+          resource: null
+        })
+        await wrapper.vm.$nextTick()
+        expect(handleShowBadge).not.toBeCalled()
+      })
+
+      it('check handleShowBadge() is not called with resource containing id null', async () => {
+        const wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id'
+            }
+          }
+        })
+
+        const handleShowBadge = jest.spyOn(wrapper.vm, 'handleShowBadge')
+        wrapper.setProps({
+          resource: { id: null }
+        })
+        await wrapper.vm.$nextTick()
+        expect(handleShowBadge).not.toBeCalled()
+      })
+
+      it('check handleShowBadge() is not called with changed resource data', async () => {
+        const wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id-1'
+            }
+          }
+        })
+
+        wrapper.setProps({
+          resource: {
+            id: 'test-resource-id-2'
+          }
+        })
+        const handleShowBadge = jest.spyOn(wrapper.vm, 'handleShowBadge')
+        await wrapper.vm.$nextTick()
+        expect(handleShowBadge).toHaveBeenCalledTimes(1)
+      })
+    })
+  })
+})
diff --git a/ui/tests/unit/components/widgets/Status.spec.js b/ui/tests/unit/components/widgets/Status.spec.js
new file mode 100644
index 0000000..a2de5ef
--- /dev/null
+++ b/ui/tests/unit/components/widgets/Status.spec.js
@@ -0,0 +1,395 @@
+// 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 Status from '@/components/widgets/Status'
+import common from '../../../common'
+import mockData from '../../../mockData/Status.mock.json'
+
+let router, i18n
+
+router = common.createMockRouter()
+i18n = common.createMockI18n('en', mockData.messages)
+
+const factory = (opts = {}) => {
+  router = opts.router || router
+  i18n = opts.i18n || i18n
+
+  return common.createFactory(Status, {
+    router,
+    i18n,
+    props: opts.props || {},
+    data: opts.data || {}
+  })
+}
+
+describe('Components > Widgets > Status.vue', () => {
+  describe('Methods', () => {
+    describe('getText()', () => {
+      it('getText() is called and the value returned is null', () => {
+        const propsData = {
+          text: 'Running',
+          displayText: false
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text"></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Running', () => {
+        const propsData = {
+          text: 'Running',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Running</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Stopped', () => {
+        const propsData = {
+          text: 'Stopped',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Stopped</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Starting', () => {
+        const propsData = {
+          text: 'Starting',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Starting</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Stopping', () => {
+        const propsData = {
+          text: 'Stopping',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Stopping</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Suspended', () => {
+        const propsData = {
+          text: 'Suspended',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Suspended</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Pending', () => {
+        const propsData = {
+          text: 'Pending',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Pending</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Expunging', () => {
+        const propsData = {
+          text: 'Expunging',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Expunging</span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getText() is called with state equal Error', () => {
+        const propsData = {
+          text: 'Error',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-text">Error</span>'
+
+        expect(received).toContain(expected)
+      })
+    })
+
+    describe('getBadgeStatus()', () => {
+      it('getBadgeStatus() is called and the value returned is default status', () => {
+        const propsData = {
+          text: 'Another',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-dot ant-badge-status-default"></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is success status', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-dot ant-badge-status-success"></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is error status', () => {
+        const propsData = {
+          text: 'Disabled',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-dot ant-badge-status-error"></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is processing status', () => {
+        const propsData = {
+          text: 'Migrating',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge-status-dot ant-badge-status-processing"></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is error status', () => {
+        const propsData = {
+          text: 'Alert',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-error"></span><span class="ant-badge-status-text">Alert</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is warning status with state equal Allocated', () => {
+        const propsData = {
+          text: 'Allocated',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-warning"></span><span class="ant-badge-status-text">Allocated</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is success status with state equal Allocated', () => {
+        const propsData = {
+          text: 'Allocated',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/publicip',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Allocated</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getBadgeStatus() is called and the value returned is warning status with state equal Created', () => {
+        const propsData = {
+          text: 'Created',
+          displayText: true
+        }
+
+        const wrapper = factory({ props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-warning"></span><span class="ant-badge-status-text">Created</span></span>'
+
+        expect(received).toContain(expected)
+      })
+    })
+
+    describe('getTooltip()', () => {
+      it('getTooltip() is called with `$route.path` equal `/vmsnapshot`', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/vmsnapshot',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Active</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getTooltip() is called with `$route.path` equal `/vm`', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/vm',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Active</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getTooltip() is called with `$route.path` equal `/volume`', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/volume',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Active</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getTooltip() is called with `$route.path` equal `/guestnetwork`', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/guestnetwork',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Active</span></span>'
+
+        expect(received).toContain(expected)
+      })
+
+      it('getTooltip() is called with `$route.path` equal `/publicip`', () => {
+        const propsData = {
+          text: 'Active',
+          displayText: true
+        }
+
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/publicip',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        router.push({ name: 'testRouter1' })
+
+        const wrapper = factory({ router: router, props: propsData })
+        const received = wrapper.html()
+        const expected = '<span class="ant-badge ant-badge-status ant-badge-not-a-wrapper" style="display: inline-flex;"><span class="ant-badge-status-dot ant-badge-status-success"></span><span class="ant-badge-status-text">Active</span></span>'
+
+        expect(received).toContain(expected)
+      })
+    })
+  })
+})
diff --git a/ui/tests/unit/views/AutogenView.spec.js b/ui/tests/unit/views/AutogenView.spec.js
new file mode 100644
index 0000000..8823894
--- /dev/null
+++ b/ui/tests/unit/views/AutogenView.spec.js
@@ -0,0 +1,2934 @@
+// 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 mockAxios from '../../mock/mockAxios'
+import AutogenView from '@/views/AutogenView'
+import user from '@/store/modules/user'
+import common from '../../common'
+import mockData from '../../mockData/AutogenView.mock.json'
+
+jest.mock('axios', () => mockAxios)
+user.state.apis = mockData.apis
+
+let router, store, i18n, mocks
+
+const state = {
+  user: {
+    apis: mockData.apis,
+    info: mockData.info
+  }
+}
+
+store = common.createMockStore(state)
+i18n = common.createMockI18n('en', mockData.messages)
+
+const actions = {
+  AddAsyncJob: jest.fn((jobId) => {})
+}
+const spyConsole = {
+  log: null,
+  warn: null
+}
+mocks = {
+  $notifyError: jest.fn((error) => {
+    return error
+  }),
+  $notification: {
+    info: jest.fn((option) => {
+      return {
+        message: option.message,
+        description: 'test-description',
+        duration: option.duration
+      }
+    }),
+    success: jest.fn((option) => {
+      return {
+        message: option.message,
+        description: option.description
+      }
+    })
+  },
+  $message: {
+    success: jest.fn((obj) => {
+      return obj
+    })
+  }
+}
+
+const factory = (opts = {}) => {
+  router = opts.router || router
+  i18n = opts.i18n || i18n
+  store = opts.store || store
+  mocks = opts.mocks || mocks
+
+  return common.createFactory(AutogenView, {
+    router,
+    i18n,
+    store,
+    mocks,
+    props: opts.props || {},
+    data: opts.data || {}
+  })
+}
+
+describe('Views > AutogenView.vue', () => {
+  let wrapper
+
+  beforeEach(() => {
+    jest.clearAllMocks()
+
+    if (wrapper) wrapper.destroy()
+    if (router && router.currentRoute.name !== 'home') {
+      router.replace({ name: 'home' })
+    }
+    state.user.info.roletype = 'Normal'
+    if (i18n.locale !== 'en') i18n.locale = 'en'
+    if (spyConsole.log) {
+      spyConsole.log.mockClear()
+      spyConsole.log.mockRestore()
+    }
+    if (spyConsole.warn) {
+      spyConsole.warn.mockClear()
+      spyConsole.warn.mockRestore()
+    }
+  })
+
+  describe('Navigation Guard', () => {
+    it('check beforeRouteUpdate() is called', () => {
+      router = common.createMockRouter([{
+        name: 'testRouter1',
+        path: '/test-router-1',
+        meta: {
+          icon: 'test-router-1'
+        }
+      }])
+      wrapper = factory({ router: router })
+      router.push({ name: 'testRouter1' })
+
+      const beforeRouteUpdate = wrapper.vm.$options.beforeRouteUpdate
+      const nextFun = jest.fn()
+
+      beforeRouteUpdate[0].call(wrapper.vm, {}, {}, nextFun)
+
+      wrapper.vm.$nextTick(() => {
+        expect(wrapper.vm.currentPath).toEqual('/test-router-1')
+        expect(nextFun).toHaveBeenCalled()
+      })
+    })
+
+    it('check beforeRouteLeave() is called', () => {
+      router = common.createMockRouter([{
+        name: 'testRouter1',
+        path: '/test-router-1',
+        meta: {
+          icon: 'test-router-1'
+        }
+      }])
+      wrapper = factory({ router: router })
+      router.push({ name: 'testRouter1' })
+
+      const beforeRouteLeave = wrapper.vm.$options.beforeRouteLeave
+      const nextFun = jest.fn()
+
+      beforeRouteLeave[0].call(wrapper.vm, {}, {}, nextFun)
+
+      wrapper.vm.$nextTick(() => {
+        expect(wrapper.vm.currentPath).toEqual('/test-router-1')
+        expect(nextFun).toHaveBeenCalled()
+      })
+    })
+  })
+
+  describe('Watchers', () => {
+    describe('$route', () => {
+      it('The wrapper data does not change when $router do not change', () => {
+        wrapper = factory()
+
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        wrapper.setData({
+          page: 2,
+          itemCount: 10
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.page).toEqual(2)
+          expect(wrapper.vm.itemCount).toEqual(10)
+          expect(spy).not.toBeCalled()
+        })
+      })
+
+      it('The wrapper data changes when $router changes', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter2',
+          path: '/test-router-2',
+          meta: {
+            icon: 'test-router-2'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        wrapper.setData({
+          page: 2,
+          itemCount: 10
+        })
+
+        router.push({ name: 'testRouter2' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.page).toEqual(1)
+          expect(wrapper.vm.itemCount).toEqual(0)
+          expect(spy).toBeCalled()
+        })
+      })
+    })
+
+    describe('$i18n.locale', () => {
+      it('Test language and fetchData() when not changing locale', () => {
+        wrapper = factory()
+
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.$t('labelname')).toEqual('test-name-en')
+          expect(spy).not.toBeCalled()
+        })
+      })
+
+      it('Test languages and fetchData() when changing locale', async () => {
+        wrapper = factory()
+
+        i18n.locale = 'de'
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.$t('labelname')).toEqual('test-name-de')
+          expect(spy).toBeCalled()
+        })
+      })
+    })
+  })
+
+  describe('Methods', () => {
+    describe('fetchData()', () => {
+      it('check routeName when fetchData() is called with $route.name is not empty', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter1',
+          path: '/test-router-1',
+          meta: {
+            icon: 'test-router-1'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter1' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.routeName).toEqual('testRouter1')
+          expect(wrapper.vm.items).toEqual([])
+        })
+      })
+
+      it('check routeName when fetchData() is called with $route.name is empty', () => {
+        router = common.createMockRouter([{
+          path: '/test-router-3',
+          meta: {
+            icon: 'test-router-3'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.replace('/test-router-3')
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.routeName).toEqual('home')
+        })
+      })
+
+      it('check resource, dataView when fetchData() is called with $route.meta.params is not empty', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter4',
+          path: '/test-router-4/:id',
+          meta: {
+            icon: 'test-router-4'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter4', params: { id: 'test-id' } })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.resource).toEqual({})
+          expect(wrapper.vm.dataView).toBeTruthy()
+        })
+      })
+
+      it('check columnKeys, actions when fetchData() is called with $route.meta.actions, route.meta.columns is not empty', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter5',
+          path: '/test-router-5',
+          meta: {
+            icon: 'test-router-5',
+            permission: ['testApiNameCase1'],
+            columns: ['column1', 'column2', 'column3'],
+            actions: [
+              {
+                name: 'labelname',
+                icon: 'plus',
+                listView: true
+              }
+            ]
+          }
+        }])
+        wrapper = factory({ router: router })
+        const mockData = {
+          testapinamecase1response: {
+            count: 0,
+            testapinamecase1: []
+          }
+        }
+
+        mockAxios.mockImplementation(() => Promise.resolve(mockData))
+        router.push({ name: 'testRouter5' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.columnKeys.length).toEqual(3)
+          expect(wrapper.vm.actions.length).toEqual(1)
+          expect(wrapper.vm.columnKeys).toEqual(['column1', 'column2', 'column3'])
+          expect(wrapper.vm.actions).toEqual([{
+            name: 'labelname',
+            icon: 'plus',
+            listView: true
+          }])
+        })
+      })
+
+      it('check columnKeys assign by store.getters.apis when fetchData() is called', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter6',
+          path: 'test-router-6',
+          meta: {
+            icon: 'test-router-6',
+            permission: ['testApiNameCase4']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase4response: {
+            count: 0,
+            testapinamecase4: []
+          }
+        }
+
+        mockAxios.mockImplementation(() => Promise.resolve(mockData))
+        router.push({ name: 'testRouter6' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.columnKeys.length).toEqual(3)
+          expect(wrapper.vm.columnKeys).toEqual(['column1', 'column2', 'column3'])
+        })
+      })
+
+      it('check columnKeys assign by $route.meta.columns when fetchData() is called', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter7',
+          path: 'test-router-7',
+          meta: {
+            icon: 'test-router-7',
+            permission: ['testApiNameCase1'],
+            columns: [{ name: 'string' }]
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 0,
+            testapinamecase1: []
+          }
+        }
+
+        mockAxios.mockImplementation(() => Promise.resolve(mockData))
+        router.push({ name: 'testRouter7' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.columns.length).toEqual(1)
+          expect(wrapper.vm.columns[0].title).toEqual('name-en')
+          expect(wrapper.vm.columns[0].dataIndex).toEqual('name')
+          expect(wrapper.vm.columns[0].scopedSlots).toEqual({ customRender: 'name' })
+          expect(typeof wrapper.vm.columns[0].sorter).toBe('function')
+        })
+      })
+
+      it('check api is called with params assign by $route.query', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter8',
+          path: '/test-router-8',
+          meta: {
+            icon: 'test-router-8',
+            permission: ['testApiNameCase2']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const postData = new URLSearchParams()
+        const mockData = {
+          testapinamecase2response: {
+            count: 0,
+            testapinamecase2: []
+          }
+        }
+
+        mockAxios.mockImplementation(() => Promise.resolve(mockData))
+        router.push({ name: 'testRouter8', query: { key: 'test-value' } })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            data: postData,
+            method: 'GET',
+            params: {
+              command: 'testApiNameCase2',
+              listall: true,
+              key: 'test-value',
+              page: 1,
+              pagesize: 20,
+              response: 'json'
+            },
+            url: '/'
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params assign by $route.meta.params', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter9',
+          path: '/test-router-9',
+          meta: {
+            icon: 'test-router-9',
+            permission: ['testApiNameCase3'],
+            params: {
+              key: 'test-value'
+            }
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const postData = new URLSearchParams()
+        const mockData = {
+          testapinamecase3response: {
+            count: 0,
+            testapinamecase3: []
+          }
+        }
+
+        mockAxios.mockImplementation(() => Promise.resolve(mockData))
+        router.push({ name: 'testRouter9' })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            data: postData,
+            method: 'GET',
+            params: {
+              command: 'testApiNameCase3',
+              listall: true,
+              key: 'test-value',
+              page: 1,
+              pagesize: 20,
+              response: 'json'
+            },
+            url: '/'
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item id, name when $route.path startWith /ssh/', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter17',
+          path: '/ssh/:id',
+          meta: {
+            icon: 'test-router-17',
+            permission: ['testApiNameCase1']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 0,
+            testapinamecase1: []
+          }
+        }
+
+        router.push({ name: 'testRouter17', params: { id: 'test-id' } })
+        mockAxios.mockResolvedValue(mockData)
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              listall: true,
+              id: 'test-id',
+              name: 'test-id',
+              page: 1,
+              pagesize: 20,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item id, hostname when $route.path startWith /ldapsetting/', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter18',
+          path: '/ldapsetting/:id',
+          meta: {
+            icon: 'test-router-18',
+            permission: ['testApiNameCase1']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 0,
+            testapinamecase1: []
+          }
+        }
+
+        router.push({ name: 'testRouter18', params: { id: 'test-id' } })
+        mockAxios.mockResolvedValue(mockData)
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              listall: true,
+              id: 'test-id',
+              hostname: 'test-id',
+              page: 1,
+              pagesize: 20,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check items, resource when api is called with result is not empty', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter19',
+          path: '/templates',
+          meta: {
+            icon: 'test-router-19',
+            permission: ['listTemplates']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          listtemplatesresponse: {
+            count: 2,
+            templates: [{
+              id: 'uuid1',
+              templateid: 'templateid-1',
+              name: 'template-test-1'
+            }, {
+              id: 'uuid2',
+              templateid: 'templateid-2',
+              name: 'template-test-2'
+            }]
+          }
+        }
+
+        router.push({ name: 'testRouter19' })
+        mockAxios.mockResolvedValue(mockData)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenLastCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'listTemplates',
+              listall: true,
+              page: 1,
+              pagesize: 20,
+              response: 'json'
+            }
+          })
+
+          expect(wrapper.vm.items.length).toEqual(2)
+          expect(wrapper.vm.items).toEqual([
+            {
+              id: 'uuid1',
+              templateid: 'templateid-1',
+              name: 'template-test-1',
+              key: 0
+            },
+            {
+              id: 'uuid2',
+              templateid: 'templateid-2',
+              name: 'template-test-2',
+              key: 1
+            }
+          ])
+          expect(wrapper.vm.resource).toEqual({
+            id: 'uuid1',
+            templateid: 'templateid-1',
+            name: 'template-test-1',
+            key: 0
+          })
+
+          done()
+        })
+      })
+
+      it('check items, resource when api is called and $route.meta.columns has function', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter20',
+          path: '/test-router-20',
+          meta: {
+            icon: 'test-router-20',
+            permission: ['testApiNameCase1'],
+            columns: [
+              'id',
+              'name',
+              {
+                column1: (record) => {
+                  return record.name
+                }
+              }
+            ]
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              id: 'test-id',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        router.push({ name: 'testRouter20' })
+        mockAxios.mockResolvedValue(mockData)
+
+        setTimeout(() => {
+          expect(wrapper.vm.items).toEqual([{
+            id: 'test-id',
+            name: 'test-name-value',
+            key: 0,
+            column1: 'test-name-value'
+          }])
+          expect(wrapper.vm.resource).toEqual({
+            id: 'test-id',
+            name: 'test-name-value',
+            key: 0,
+            column1: 'test-name-value'
+          })
+
+          done()
+        })
+      })
+
+      it('check items, resource when api is called and $route.path startWith /ssh', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter21',
+          path: '/ssh',
+          meta: {
+            icon: 'test-router-21',
+            permission: ['testApiNameCase1']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        router.push({ name: 'testRouter21' })
+        mockAxios.mockResolvedValue(mockData)
+
+        setTimeout(() => {
+          expect(wrapper.vm.items).toEqual([{
+            id: 'test-name-value',
+            name: 'test-name-value',
+            key: 0
+          }])
+          expect(wrapper.vm.resource).toEqual({
+            id: 'test-name-value',
+            name: 'test-name-value',
+            key: 0
+          })
+
+          done()
+        })
+      })
+
+      it('check items, resource when api is called and $route.path startWith /ldapsetting', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter22',
+          path: '/ldapsetting',
+          meta: {
+            icon: 'test-router-22',
+            permission: ['testApiNameCase1']
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              name: 'test-name-value',
+              hostname: 'test-hostname-value'
+            }]
+          }
+        }
+
+        router.push({ name: 'testRouter22' })
+        mockAxios.mockResolvedValue(mockData)
+
+        setTimeout(() => {
+          expect(wrapper.vm.items).toEqual([{
+            id: 'test-hostname-value',
+            name: 'test-name-value',
+            hostname: 'test-hostname-value',
+            key: 0
+          }])
+          expect(wrapper.vm.resource).toEqual({
+            id: 'test-hostname-value',
+            name: 'test-name-value',
+            hostname: 'test-hostname-value',
+            key: 0
+          })
+
+          done()
+        })
+      })
+
+      it('check $notifyError is called when api is called with throw error', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter22',
+          path: '/test-router-22',
+          meta: {
+            icon: 'test-router-22',
+            permission: ['testApiNameCase1']
+          }
+        }])
+
+        wrapper = factory({ router: router })
+
+        const errorMock = {
+          response: {},
+          message: 'Error: throw exception error'
+        }
+        router.push({ name: 'testRouter22' })
+        mockAxios.mockRejectedValue(errorMock)
+
+        setTimeout(() => {
+          expect(mocks.$notifyError).toHaveBeenCalledTimes(1)
+          expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock)
+          done()
+        })
+      })
+
+      it('check $notifyError is called and router path = /exception/404 when api is called with throw error', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter23',
+          path: '/test-router-23',
+          meta: {
+            icon: 'test-router-23',
+            permission: ['testApiNameCase1']
+          }
+        }])
+
+        wrapper = factory({ router: router })
+
+        const errorMock = {
+          response: {
+            status: 430
+          },
+          message: 'Error: Request Header Fields Too Large'
+        }
+        router.push({ name: 'testRouter23' })
+        mockAxios.mockRejectedValue(errorMock)
+
+        setTimeout(() => {
+          expect(mocks.$notifyError).toHaveBeenCalledTimes(1)
+          expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock)
+          expect(router.currentRoute.path).toEqual('/exception/404')
+
+          done()
+        })
+      })
+
+      it('check $notifyError is called and router path = /exception/500 when api is called with throw error', (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter23',
+          path: '/test-router-23',
+          meta: {
+            icon: 'test-router-23',
+            permission: ['testApiNameCase1']
+          }
+        }])
+
+        wrapper = factory({ router: router })
+
+        const errorMock = {
+          response: {
+            status: 530
+          },
+          message: 'Error: Site is frozen'
+        }
+        router.push({ name: 'testRouter23' })
+        mockAxios.mockRejectedValue(errorMock)
+
+        setTimeout(() => {
+          expect(mocks.$notifyError).toHaveBeenCalledTimes(1)
+          expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock)
+          expect(router.currentRoute.path).toEqual('/exception/500')
+
+          done()
+        })
+      })
+    })
+
+    describe('onSearch()', () => {
+      it('check fetchData() is called when onSearch() is called', async () => {
+        router = common.createMockRouter([{
+          name: 'testRouter24',
+          path: '/test-router-24',
+          meta: {
+            icon: 'test-router-24'
+          }
+        }])
+        wrapper = factory({ router: router })
+        router.push({ name: 'testRouter24', query: { page: 1, pagesize: 20 } })
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch()
+        expect(spy).toHaveBeenCalled()
+      })
+
+      it('check onSearch() is called with searchParams have item', async () => {
+        router = common.createMockRouter([{
+          name: 'testRouter24',
+          path: '/test-router-24',
+          meta: {
+            icon: 'test-router-24'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter24' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch()
+        expect(router.currentRoute.query).toEqual({
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery not in opts', async () => {
+        router = common.createMockRouter([{
+          name: 'testRouter25',
+          path: '/test-router-25',
+          meta: {
+            icon: 'test-router-25'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter25' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          key1: 'key1-value'
+        })
+        expect(router.currentRoute.query).toEqual({
+          key1: 'key1-value',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery in opts but this is empty', async () => {
+        router = common.createMockRouter([{
+          name: 'testRouter26',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          },
+          query: {}
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter26' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          searchQuery: null
+        })
+        expect(router.currentRoute.query).toEqual({
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery in opts', async () => {
+        router = common.createMockRouter([{
+          name: 'testRouter26',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          },
+          query: {}
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'testRouter26' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          searchQuery: 'test-query'
+        })
+        expect(router.currentRoute.query).toEqual({
+          keyword: 'test-query',
+          q: 'test-query',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery in opts and route.name equal `role`', async () => {
+        router = common.createMockRouter([{
+          name: 'role',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          },
+          query: {}
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'role' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          searchQuery: 'test-query'
+        })
+        expect(router.currentRoute.query).toEqual({
+          name: 'test-query',
+          q: 'test-query',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery in opts and route.name equal `templatetype`', async () => {
+        router = common.createMockRouter([{
+          name: 'quotaemailtemplate',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          },
+          query: {}
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'quotaemailtemplate' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          searchQuery: 'test-query'
+        })
+        expect(router.currentRoute.query).toEqual({
+          templatetype: 'test-query',
+          q: 'test-query',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check onSearch() is called with searchQuery in opts and route.name equal `globalsetting`', async () => {
+        router = common.createMockRouter([{
+          name: 'globalsetting',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          },
+          query: {}
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'globalsetting' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.onSearch({
+          searchQuery: 'test-query'
+        })
+        expect(router.currentRoute.query).toEqual({
+          name: 'test-query',
+          q: 'test-query',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+    })
+
+    describe('closeAction()', () => {
+      it('check currentAction, showAction when closeAction() is called', () => {
+        const data = {
+          currentAction: {
+            loading: true
+          },
+          showAction: true
+        }
+        wrapper = factory({ data: data })
+
+        expect(wrapper.vm.currentAction).toEqual({ loading: true })
+        expect(wrapper.vm.showAction).toBeTruthy()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.closeAction()
+
+          expect(wrapper.vm.currentAction).toEqual({})
+          expect(wrapper.vm.showAction).toBeFalsy()
+        })
+      })
+    })
+
+    describe('execAction()', () => {
+      it('check showAction, actionData and router name when execAction() is called', () => {
+        router = common.createMockRouter([{
+          name: 'testRouter26',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          }
+        }])
+        const data = {
+          actionData: {
+            name: 'test-add-action'
+          }
+        }
+        wrapper = factory({ router: router, data: data })
+
+        expect(router.currentRoute.name).toEqual('home')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            label: 'labelname',
+            icon: 'plus',
+            component: () => jest.fn(),
+            api: 'testRouter26',
+            popup: false
+          })
+
+          expect(wrapper.vm.showAction).toBeFalsy()
+          expect(router.currentRoute.name).toEqual('testRouter26')
+        })
+      })
+
+      it('check currentAction params and paramsField when execAction() is called', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase5'
+          })
+
+          expect(wrapper.vm.currentAction.params).toEqual([
+            { name: 'column1', type: 'string' },
+            { name: 'column2', type: 'string' },
+            { name: 'column3', type: 'string' },
+            { name: 'name', type: 'string' },
+            { name: 'id', type: 'string' }
+          ])
+          expect(wrapper.vm.currentAction.paramFields).toEqual([])
+          expect(wrapper.vm.showAction).toBeTruthy()
+        })
+      })
+
+      it('check currentAction params and paramsField when execAction() is called with args is exists', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase5',
+            args: ['column1', 'column2', 'column3']
+          })
+
+          expect(wrapper.vm.currentAction.params).toEqual([
+            { name: 'column1', type: 'string' },
+            { name: 'column2', type: 'string' },
+            { name: 'column3', type: 'string' },
+            { name: 'name', type: 'string' },
+            { name: 'id', type: 'string' }
+          ])
+          expect(wrapper.vm.currentAction.paramFields).toEqual([
+            { name: 'column1', type: 'string' },
+            { name: 'column2', type: 'string' },
+            { name: 'column3', type: 'string' }
+          ])
+          expect(wrapper.vm.showAction).toBeTruthy()
+        })
+      })
+
+      it('check currentAction params and paramsField when execAction() is called with args is function', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase5',
+            resource: { id: 'test-id-value', name: 'test-name-value' },
+            args: (record, store) => {
+              return ['Admin'].includes(store.userInfo.roletype) ? ['column1', 'column2', 'column3'] : ['id', 'name']
+            }
+          })
+
+          expect(wrapper.vm.currentAction.params).toEqual([
+            { name: 'column1', type: 'string' },
+            { name: 'column2', type: 'string' },
+            { name: 'column3', type: 'string' },
+            { name: 'name', type: 'string' },
+            { name: 'id', type: 'string' }
+          ])
+          expect(wrapper.vm.currentAction.paramFields).toEqual([
+            { name: 'id', type: 'string' },
+            { name: 'name', type: 'string' }
+          ])
+          expect(wrapper.vm.showAction).toBeTruthy()
+        })
+      })
+
+      it('check currentAction paramsField and listUuidOpts() is called when execAction() is called', () => {
+        wrapper = factory()
+        const spy = jest.spyOn(wrapper.vm, 'listUuidOpts')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase6',
+            args: ['id', 'tags', 'column1', 'column2', 'account'],
+            mapping: {
+              column2: () => {
+                return 'test-value'
+              }
+            }
+          })
+
+          expect(wrapper.vm.currentAction.paramFields).toEqual([
+            { name: 'id', type: 'uuid' },
+            { name: 'tags', type: 'string' },
+            { name: 'column1', type: 'list' },
+            { name: 'column2', type: 'string' },
+            { name: 'account', type: 'string' }
+          ])
+          expect(wrapper.vm.showAction).toBeTruthy()
+          expect(spy).toHaveBeenCalled()
+          expect(spy).toHaveBeenCalledWith({ name: 'id', type: 'uuid' })
+          expect(spy).toHaveBeenCalledWith({ name: 'column1', type: 'list' })
+          expect(spy).toHaveBeenCalledWith({ name: 'column2', type: 'string' })
+          expect(spy).toHaveBeenCalledWith({ name: 'account', type: 'string' })
+        })
+      })
+
+      it('check fillEditFormFieldValues() is called when execAction() is called', () => {
+        wrapper = factory()
+        const spy = jest.spyOn(wrapper.vm, 'fillEditFormFieldValues')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase6',
+            dataView: true,
+            icon: 'edit'
+          })
+
+          expect(spy).toHaveBeenCalled()
+        })
+      })
+
+      it('check currentAction paramFields when execAction() is called args has confirmpassword field', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.execAction({
+            api: 'testApiNameCase6',
+            args: ['confirmpassword'],
+            mapping: {}
+          })
+
+          expect(wrapper.vm.currentAction.paramFields).toEqual([
+            { name: 'confirmpassword', type: 'password', required: true, description: 'confirmpassword-description-en' }
+          ])
+        })
+      })
+    })
+
+    describe('listUuidOpts()', () => {
+      it('check api not called when listUuidOpts() is called with currentAction.mapping.id is null', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              mapping: {
+                id: () => { return '' }
+              }
+            }
+          }
+        })
+
+        wrapper.vm.listUuidOpts({ name: 'id', type: 'uuid' })
+
+        setTimeout(() => {
+          expect(mockAxios).not.toHaveBeenCalled()
+          done()
+        })
+      })
+
+      it('check api not called when listUuidOpts() is called with currentAction.mapping is empty', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              mapping: {}
+            }
+          }
+        })
+
+        wrapper.vm.listUuidOpts({ name: 'test-name', type: 'uuid' })
+
+        setTimeout(() => {
+          expect(mockAxios).not.toHaveBeenCalled()
+          done()
+        })
+      })
+
+      it('check api is called and param.opts when listUuidOpts() is called with currentAction.mapping[param.name].api', (done) => {
+        const param = { name: 'template', type: 'uuid' }
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory({
+          data: {
+            currentAction: {
+              mapping: {
+                template: {
+                  api: 'testApiNameCase1'
+                }
+              }
+            }
+          }
+        })
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              listall: true,
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'template',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when listUuidOpts() is called with store apis has api startWith param.name', (done) => {
+        const param = { name: 'testapiname', type: 'uuid' }
+        const mockData = {
+          listtestapinamesresponse: {
+            count: 1,
+            testapiname: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory()
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'listTestApiNames',
+              listall: true,
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'testapiname',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item name and value assign by resource', (done) => {
+        const param = { name: 'template', type: 'uuid' }
+        const mockData = {
+          testapinamecase1response: {
+            count: 0,
+            testapinamecase1: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory({
+          data: {
+            currentAction: {
+              mapping: {
+                template: {
+                  api: 'testApiNameCase1',
+                  params: (record) => {
+                    return {
+                      name: record.name
+                    }
+                  }
+                }
+              }
+            }
+          }
+        })
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.setData({
+          resource: {
+            id: 'test-id-value',
+            name: 'test-name-value'
+          }
+        })
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              listall: true,
+              name: 'test-name-value',
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'template',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item templatefilter when apiName is listTemplates', (done) => {
+        const param = { name: 'id', type: 'uuid' }
+        const mockData = {
+          listtemplateresponse: {
+            count: 1,
+            templates: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory()
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.setData({
+          apiName: 'listTemplates'
+        })
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'listTemplates',
+              listall: true,
+              templatefilter: 'executable',
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'id',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item isofilter when apiName is listIsos', (done) => {
+        const param = { name: 'id', type: 'uuid' }
+        const mockData = {
+          listisosresponse: {
+            count: 1,
+            iso: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory()
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.setData({
+          apiName: 'listIsos'
+        })
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'listIsos',
+              listall: true,
+              isofilter: 'executable',
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'id',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called with params has item type = routing when apiName is listHosts', (done) => {
+        const param = { name: 'id', type: 'uuid' }
+        const mockData = {
+          listhostresponse: {
+            count: 1,
+            hosts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        wrapper = factory()
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.setData({
+          apiName: 'listHosts'
+        })
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'listHosts',
+              listall: true,
+              type: 'routing',
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'id',
+            type: 'uuid',
+            loading: false,
+            opts: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called and param.opts is empty when api throw error', (done) => {
+        const param = { name: 'id', type: 'uuid', loading: true }
+        const errorMock = {
+          response: {},
+          stack: 'Error: throw exception error'
+        }
+
+        wrapper = factory()
+
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+        mockAxios.mockRejectedValue(errorMock)
+        wrapper.setData({
+          apiName: 'testApiNameCase1'
+        })
+        wrapper.vm.listUuidOpts(param)
+
+        setTimeout(() => {
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              listall: true,
+              response: 'json'
+            }
+          })
+          expect(param).toEqual({
+            name: 'id',
+            type: 'uuid',
+            loading: false,
+            opts: []
+          })
+
+          done()
+        })
+      })
+    })
+
+    describe('pollActionCompletion()', () => {
+      it('check $notification, fetchData() when pollActionCompletion() is called with action is empty', (done) => {
+        const mockData = {
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+
+        wrapper = factory()
+
+        const jobId = 'test-job-id'
+        const action = {}
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.vm.pollActionCompletion(jobId, action)
+
+        setTimeout(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(mocks.$notification.info).not.toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'queryAsyncJobResult',
+              jobId: jobId,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check $notification, fetchData() when pollActionCompletion() is called with action is not empty', (done) => {
+        const mockData = {
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+
+        wrapper = factory()
+
+        const jobId = 'test-job-id'
+        const action = {
+          label: 'labelname',
+          response: (jobResult) => {
+            return jobResult.name
+          }
+        }
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.vm.pollActionCompletion(jobId, action)
+
+        setTimeout(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(mocks.$notification.info).toHaveBeenCalled()
+          expect(mocks.$notification.info).toHaveLastReturnedWith({
+            message: 'test-name-en',
+            description: 'test-description',
+            duration: 0
+          })
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'queryAsyncJobResult',
+              jobId: jobId,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check fetchData() is called when $pollJob error response', (done) => {
+        const mockData = {
+          queryasyncjobresultresponse: {
+            jobstatus: 2,
+            jobresult: {
+              errortext: 'test-error-message'
+            }
+          }
+        }
+
+        wrapper = factory()
+
+        const jobId = 'test-job-id'
+        const action = {
+          label: 'labelname',
+          response: (jobResult) => {
+            return jobResult.name
+          }
+        }
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper.vm.pollActionCompletion(jobId, action)
+
+        setTimeout(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'queryAsyncJobResult',
+              jobId: jobId,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+    })
+
+    describe('fillEditFormFieldValues()', () => {
+      it('check form getFieldDecorator() is called and formModel when currentAction.paramFields has item type = list', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'domainids', type: 'list' }
+              ],
+              mapping: {
+                column1: () => { return 'test-column' }
+              }
+            },
+            resource: {
+              domainname: ['test-domain-value-1', 'test-domain-value-2']
+            }
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.fillEditFormFieldValues()
+
+        wrapper.vm.$nextTick(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(spy).toBeCalledWith('domainids', {
+            initialValue: ['test-domain-value-1', 'test-domain-value-2']
+          })
+          expect(wrapper.vm.formModel).toEqual({ domainids: ['test-domain-value-1', 'test-domain-value-2'] })
+
+          done()
+        })
+      })
+
+      it('check form getFieldDecorator() is called and formModel when currentAction.paramFields has item name = account', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'account', type: 'string' }
+              ],
+              mapping: {
+                column1: () => { return 'test-column' }
+              }
+            },
+            resource: {
+              account: 'test-account-value'
+            }
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.fillEditFormFieldValues()
+
+        wrapper.vm.$nextTick(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(spy).toBeCalledWith('account', {
+            initialValue: 'test-account-value'
+          })
+          expect(wrapper.vm.formModel).toEqual({ account: 'test-account-value' })
+
+          done()
+        })
+      })
+
+      it('check form getFieldDecorator() is called and formModel when currentAction.paramFields has item exists in currentAction. mapping', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'column1', type: 'string' }
+              ],
+              mapping: {
+                column1: () => { return 'test-column' }
+              }
+            },
+            resource: {
+              column1: 'test-column-value'
+            }
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.fillEditFormFieldValues()
+
+        wrapper.vm.$nextTick(() => {
+          expect(spy).toHaveBeenCalled()
+          expect(spy).toBeCalledWith('column1', {
+            initialValue: 'test-column-value'
+          })
+          expect(wrapper.vm.formModel).toEqual({ column1: 'test-column-value' })
+
+          done()
+        })
+      })
+
+      it('check form getFieldDecorator() is called and formModel when currentAction.paramFields has item exists in resource', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'column1', type: 'string' }
+              ]
+            },
+            resource: {
+              column1: 'test-column-value'
+            }
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.fillEditFormFieldValues()
+
+          expect(spy).toHaveBeenCalled()
+          expect(spy).toBeCalledWith('column1', {
+            initialValue: 'test-column-value'
+          })
+          expect(wrapper.vm.formModel).toEqual({ column1: 'test-column-value' })
+
+          done()
+        })
+      })
+
+      it('check form getFieldDecorator() is called and formModel when currentAction.paramFields have not item in resource', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'column1', type: 'string' }
+              ]
+            },
+            resource: {}
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.fillEditFormFieldValues()
+
+          expect(spy).not.toHaveBeenCalled()
+          expect(wrapper.vm.formModel).toEqual({})
+
+          done()
+        })
+      })
+
+      it('check form getFieldDecorator() is not called when field value is null', (done) => {
+        wrapper = factory({
+          data: {
+            currentAction: {
+              paramFields: [
+                { name: 'column1', type: 'string' }
+              ]
+            },
+            resource: {
+              column1: null
+            }
+          }
+        })
+
+        const spy = jest.spyOn(wrapper.vm.form, 'getFieldDecorator')
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.fillEditFormFieldValues()
+
+          expect(spy).not.toHaveBeenCalled()
+
+          done()
+        })
+      })
+    })
+
+    describe('changeFilter()', () => {
+      it('check `route.query` when changeFilter() is called with filter', async () => {
+        wrapper = factory()
+
+        await wrapper.vm.$nextTick()
+        wrapper.vm.changeFilter('test')
+
+        expect(router.currentRoute.query).toEqual({
+          filter: 'test',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check `route.query` when changeFilter() is called with `$route.name` equal `template`', async () => {
+        router = common.createMockRouter([{
+          name: 'template',
+          path: '/test-router-1',
+          meta: {
+            icon: 'test'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'template' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.changeFilter('test')
+
+        expect(router.currentRoute.query).toEqual({
+          templatefilter: 'test',
+          filter: 'test',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check `route.query` when changeFilter() is called with `$route.name` equal `iso`', async () => {
+        router = common.createMockRouter([{
+          name: 'iso',
+          path: '/test-router-1',
+          meta: {
+            icon: 'test'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'iso' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.changeFilter('test')
+
+        expect(router.currentRoute.query).toEqual({
+          isofilter: 'test',
+          filter: 'test',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check `route.query` when changeFilter() is called with `$route.name` equal `vm` and `filter` equal `self`', async () => {
+        router = common.createMockRouter([{
+          name: 'vm',
+          path: '/test-router-1',
+          meta: {
+            icon: 'test'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'vm' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.changeFilter('self')
+
+        expect(router.currentRoute.query).toEqual({
+          account: 'test-account',
+          domainid: 'test-domain-id',
+          filter: 'self',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+
+      it('check `route.query` when changeFilter() is called with `$route.name` equal `vm` and `filter` equal `running`', async () => {
+        router = common.createMockRouter([{
+          name: 'vm',
+          path: '/test-router-1',
+          meta: {
+            icon: 'test'
+          }
+        }])
+        wrapper = factory({ router: router })
+
+        router.push({ name: 'vm' })
+        await wrapper.vm.$nextTick()
+        wrapper.vm.changeFilter('running')
+
+        expect(router.currentRoute.query).toEqual({
+          state: 'running',
+          filter: 'running',
+          page: '1',
+          pagesize: '20'
+        })
+      })
+    })
+
+    describe('changePage()', () => {
+      it('check page, pageSize when changePage() is called', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          expect(router.currentRoute.query).toEqual({})
+          wrapper.vm.changePage(1, 10)
+          expect(router.currentRoute.query).toEqual({
+            page: '1',
+            pagesize: '10'
+          })
+        })
+      })
+    })
+
+    describe('changePageSize()', () => {
+      it('check page, pageSize and fetchData() when changePageSize() is called', () => {
+        wrapper = factory()
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.changePageSize(2, 20)
+          expect(router.currentRoute.query).toEqual({
+            page: '2',
+            pagesize: '20'
+          })
+        })
+      })
+    })
+
+    describe('start()', () => {
+      it('check loading, selectedRowKeys, fetchData() when start() is called', async (done) => {
+        wrapper = factory()
+
+        const spy = jest.spyOn(wrapper.vm, 'fetchData')
+        await wrapper.vm.$nextTick()
+        await wrapper.vm.start()
+
+        expect(spy).toBeCalled()
+
+        setTimeout(() => {
+          expect(wrapper.vm.loading).toBeFalsy()
+          expect(wrapper.vm.selectedRowKeys).toEqual([])
+
+          done()
+        }, 1000)
+      })
+    })
+
+    describe('toggleLoading()', () => {
+      it('check loading when toggleLoading() is called', () => {
+        wrapper = factory({
+          data: {
+            loading: false
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.loading).toBeFalsy()
+
+          wrapper.vm.toggleLoading()
+
+          expect(wrapper.vm.loading).toBeTruthy()
+        })
+      })
+    })
+
+    describe('startLoading()', () => {
+      it('check loading when startLoading() is called', () => {
+        wrapper = factory({
+          data: {
+            loading: false
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.loading).toBeFalsy()
+
+          wrapper.vm.startLoading()
+
+          expect(wrapper.vm.loading).toBeTruthy()
+        })
+      })
+    })
+
+    describe('finishLoading()', () => {
+      it('check loading when finishLoading() is called', () => {
+        wrapper = factory({
+          data: {
+            loading: true
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(wrapper.vm.loading).toBeTruthy()
+
+          wrapper.vm.finishLoading()
+
+          expect(wrapper.vm.loading).toBeFalsy()
+        })
+      })
+    })
+
+    describe('execSubmit()', () => {
+      it('check error from validateFields', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'id', type: 'uuid' }
+              ],
+              paramFields: [
+                { name: 'id', type: 'uuid', description: '', required: true }
+              ],
+              mapping: {}
+            },
+            resource: {
+              id: 'test-id-value'
+            }
+          }
+        })
+
+        spyConsole.warn = jest.spyOn(console, 'warn').mockImplementation(() => {})
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).not.toBeCalled()
+          done()
+        })
+      })
+
+      it('check api is called with params has item id equal resource.id', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'id', type: 'uuid' }
+              ],
+              paramFields: [
+              ],
+              mapping: {}
+            },
+            resource: {
+              id: 'test-id-value'
+            }
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              id: 'test-id-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key not exist in currentAction.params', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'id', type: 'uuid' }
+              ],
+              paramFields: [
+                { name: 'name', type: 'string', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {
+              id: 'test-id-value'
+            }
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              id: 'test-id-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key exist in currentAction.params, type is boolean and value is undefined', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'boolean' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'boolean', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: null })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: false,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key exist in currentAction.params, type is boolean and value is null', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'boolean' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'boolean', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: null })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: false,
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key exist in currentAction.mapping', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'list' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'list', description: '', required: false }
+              ],
+              mapping: {
+                column1: {
+                  options: ['column-value1', 'column-value2']
+                }
+              }
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: 1 })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: 'column-value2',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key not exist in currentAction.mapping, type is list and currentAction.params[input] has id', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                {
+                  name: 'column1',
+                  type: 'list',
+                  opts: [
+                    { id: 'test-id-1', value: 'test-value-1' },
+                    { id: 'test-id-2', value: 'test-value-2' },
+                    { id: 'test-id-3', value: 'test-value-3' }
+                  ]
+                }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'list', description: '', required: false }
+              ],
+              mapping: {
+              }
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: [1, 2] })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: 'test-id-2,test-id-3',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key has name = account, currentAction.api = createAccount', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'createAccount',
+              loading: false,
+              label: 'labelname',
+              params: [
+                {
+                  name: 'account',
+                  type: 'string'
+                }
+              ],
+              paramFields: [
+                { name: 'account', type: 'string', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('account', { initialValue: 'test-account-value' })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'createAccount',
+              account: 'test-account-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key has name = keypair, currentAction.api = addAccountToProject', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'addAccountToProject',
+              loading: false,
+              label: 'labelname',
+              params: [
+                {
+                  name: 'keypair',
+                  type: 'string'
+                }
+              ],
+              paramFields: [
+                { name: 'keypair', type: 'string', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('keypair', { initialValue: 'test-keypair-value' })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'addAccountToProject',
+              keypair: 'test-keypair-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key name = (account | keypair), currentAction.api != (addAccountToProject | createAccount)', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                {
+                  name: 'keypair',
+                  type: 'string',
+                  opts: [
+                    { id: 'test-id-1', name: 'test-name-1' },
+                    { id: 'test-id-2', name: 'test-name-2' }
+                  ]
+                }
+              ],
+              paramFields: [
+                { name: 'keypair', type: 'string', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('keypair', { initialValue: 1 })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              keypair: 'test-name-2',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when form has input key do not fall under special condition.', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                {
+                  name: 'column1',
+                  type: 'string'
+                }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'string', description: '', required: false }
+              ],
+              mapping: {}
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column-value' })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: 'test-column-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when currentAction has defaultArgs', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'string' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'string', description: '', required: false }
+              ],
+              mapping: {},
+              defaultArgs: {
+                column2: 'test-column2-value'
+              }
+            },
+            resource: {}
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column1-value' })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: 'test-column1-value',
+              column2: 'test-column2-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when currentAction.mapping has value and value is function', (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'string' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'string', description: '', required: false }
+              ],
+              mapping: {
+                column2: {
+                  value: (record, params) => {
+                    return record.name
+                  }
+                }
+              }
+            },
+            resource: {
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            testapinamecase1: {}
+          }
+        }
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column1-value' })
+          const event = document.createEvent('Event')
+          wrapper.vm.execSubmit(event)
+
+          expect(mockAxios).toHaveBeenCalledTimes(1)
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'testApiNameCase1',
+              column1: 'test-column1-value',
+              column2: 'test-name-value',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check router name when api is called and currentAction.icon = delete and dataView is true', async (done) => {
+        router = common.createMockRouter([{
+          name: 'testRouter26',
+          path: '/test-router-26',
+          meta: {
+            icon: 'test-router-26'
+          }
+        }])
+        wrapper = factory({ router: router })
+        router.push({ name: 'testRouter26' })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              id: 'test-id-value',
+              name: 'test-name-value'
+            }]
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+        await wrapper.vm.$nextTick()
+
+        expect(router.currentRoute.name).toEqual('testRouter26')
+
+        wrapper.setData({
+          currentAction: {
+            icon: 'delete',
+            api: 'testApiNameCase1',
+            loading: false,
+            label: 'labelname',
+            params: [
+              { name: 'column1', type: 'string' }
+            ],
+            paramFields: [
+              { name: 'column1', type: 'string', description: '', required: false }
+            ]
+          },
+          dataView: true
+        })
+
+        wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column1-value' })
+        const event = document.createEvent('Event')
+        await wrapper.vm.execSubmit(event)
+
+        setTimeout(() => {
+          expect(router.currentRoute.name).toEqual('home')
+          done()
+        }, 1000)
+      })
+
+      it('check pollActionCompletion() and action AddAsyncJob is called when api is called and response have jobId result', async (done) => {
+        store = common.createMockStore(state, actions)
+        wrapper = factory({
+          store: store,
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'string' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'string', description: '', required: false }
+              ]
+            },
+            resource: {}
+          }
+        })
+
+        const spyPollAction = jest.spyOn(wrapper.vm, 'pollActionCompletion').mockImplementation(() => {})
+        const mockData = {
+          testapinamecase1response: {
+            jobid: 'test-job-id'
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        await wrapper.vm.$nextTick()
+        wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column1-value' })
+        const event = document.createEvent('Event')
+        wrapper.vm.execSubmit(event)
+
+        setTimeout(() => {
+          expect(actions.AddAsyncJob).toHaveBeenCalled()
+          expect(spyPollAction).toHaveBeenCalled()
+
+          done()
+        })
+      })
+
+      it('check $notification when api is called and response have not jobId result', async (done) => {
+        wrapper = factory({
+          data: {
+            showAction: true,
+            currentAction: {
+              api: 'testApiNameCase1',
+              loading: false,
+              label: 'labelname',
+              params: [
+                { name: 'column1', type: 'string' }
+              ],
+              paramFields: [
+                { name: 'column1', type: 'string', description: '', required: false }
+              ]
+            },
+            resource: {
+              name: 'test-name-value'
+            }
+          }
+        })
+
+        const mockData = {
+          testapinamecase1response: {
+            count: 1,
+            testapinamecase1: [{
+              id: 'test-id-value'
+            }]
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        await wrapper.vm.$nextTick()
+        wrapper.vm.form.getFieldDecorator('column1', { initialValue: 'test-column1-value' })
+        const event = document.createEvent('Event')
+        wrapper.vm.execSubmit(event)
+
+        setTimeout(() => {
+          expect(mocks.$message.success).toHaveBeenCalled()
+          expect(mocks.$message.success).toHaveLastReturnedWith({
+            content: 'test-name-en - test-name-value',
+            key: 'labelnametest-name-value',
+            duration: 2
+          })
+
+          done()
+        })
+      })
+
+      it('check $notifyError is called when api is called with throw error', async (done) => {
+        wrapper = factory()
+
+        const errorMock = {
+          response: {},
+          message: 'Error: throw exception error'
+        }
+        mockAxios.mockRejectedValue(errorMock)
+        spyConsole.log = jest.spyOn(console, 'log').mockImplementation(() => {})
+
+        await wrapper.vm.$nextTick()
+        const event = document.createEvent('Event')
+        await wrapper.vm.execSubmit(event)
+
+        setTimeout(() => {
+          expect(mocks.$notifyError).toHaveBeenCalledTimes(1)
+          expect(mocks.$notifyError).toHaveBeenCalledWith(errorMock)
+
+          done()
+        })
+      })
+    })
+  })
+})
diff --git a/ui/tests/unit/views/compute/MigrateWizard.spec.js b/ui/tests/unit/views/compute/MigrateWizard.spec.js
new file mode 100644
index 0000000..14c8a89
--- /dev/null
+++ b/ui/tests/unit/views/compute/MigrateWizard.spec.js
@@ -0,0 +1,686 @@
+// 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 mockAxios from '../../../mock/mockAxios'
+import MigrateWizard from '@/views/compute/MigrateWizard'
+import common from '../../../common'
+import mockData from '../../../mockData/MigrateWizard.mock'
+
+jest.mock('axios', () => mockAxios)
+
+let wrapper, i18n, store, mocks
+
+const state = {}
+const actions = {
+  AddAsyncJob: jest.fn((jobObject) => {})
+}
+mocks = {
+  $message: {
+    error: jest.fn((message) => {})
+  },
+  $notification: {
+    error: jest.fn((message) => {})
+  },
+  $pollJob: jest.fn((obj) => {
+    switch (obj.jobId) {
+      case 'test-job-id-case-1':
+        if ('successMethod' in obj) {
+          obj.successMethod()
+        }
+        break
+      case 'test-job-id-case-2':
+        if ('errorMethod' in obj) {
+          obj.errorMethod()
+        }
+        break
+      case 'test-job-id-case-3':
+        if ('catchMethod' in obj) {
+          obj.catchMethod()
+        }
+        break
+    }
+  })
+}
+i18n = common.createMockI18n('en', mockData.messages)
+store = common.createMockStore(state, actions)
+
+const factory = (opts = {}) => {
+  i18n = opts.i18n || i18n
+  store = opts.store || store
+  mocks = opts.mocks || mocks
+
+  return common.createFactory(MigrateWizard, {
+    i18n,
+    store,
+    mocks,
+    props: opts.props || {},
+    data: opts.data || {}
+  })
+}
+
+describe('Views > compute > MigrateWizard.vue', () => {
+  jest.spyOn(console, 'warn').mockImplementation(() => {})
+
+  beforeEach(() => {
+    jest.clearAllMocks()
+
+    if (wrapper) {
+      wrapper.destroy()
+    }
+
+    if (i18n.locale !== 'en') {
+      i18n.locale = 'en'
+    }
+  })
+
+  describe('Methods', () => {
+    describe('fetchData()', () => {
+      it('check api is called with resource is empty and searchQuery is null', () => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({
+          props: {
+            resource: {}
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'findHostsForMigration',
+              virtualmachineid: undefined,
+              keyword: '',
+              page: 1,
+              pagesize: 10,
+              response: 'json'
+            }
+          })
+        })
+      })
+
+      it('check api is called with resource.id is null and searchQuery is null', () => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({
+          props: {
+            resource: { id: null }
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'findHostsForMigration',
+              virtualmachineid: null,
+              keyword: '',
+              page: 1,
+              pagesize: 10,
+              response: 'json'
+            }
+          })
+        })
+      })
+
+      it('check api is called with resource.id is not null and searchQuery is null', () => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({
+          props: {
+            resource: { id: 'test-id-value' }
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'findHostsForMigration',
+              virtualmachineid: 'test-id-value',
+              keyword: '',
+              page: 1,
+              pagesize: 10,
+              response: 'json'
+            }
+          })
+        })
+      })
+
+      it('check api is called with resource.id is not null and searchQuery is not null', () => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({
+          props: { resource: { id: 'test-id-value' } },
+          data: { searchQuery: 'test-query-value' }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'findHostsForMigration',
+              virtualmachineid: 'test-id-value',
+              keyword: 'test-query-value',
+              page: 1,
+              pagesize: 10,
+              response: 'json'
+            }
+          })
+        })
+      })
+
+      it('check api is called with params assign by resource, searchQuery, page, pageSize', () => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({
+          props: { resource: { id: 'test-id-value' } },
+          data: {
+            searchQuery: 'test-query-value',
+            page: 2,
+            pageSize: 20
+          }
+        })
+
+        wrapper.vm.$nextTick(() => {
+          expect(mockAxios).toHaveBeenCalled()
+          expect(mockAxios).toHaveBeenCalledWith({
+            url: '/',
+            method: 'GET',
+            data: new URLSearchParams(),
+            params: {
+              command: 'findHostsForMigration',
+              virtualmachineid: 'test-id-value',
+              keyword: 'test-query-value',
+              page: 2,
+              pagesize: 20,
+              response: 'json'
+            }
+          })
+        })
+      })
+
+      it('check hosts, totalCount when api is called with response result is empty', async (done) => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 0,
+            host: []
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({ props: { resource: {} } })
+
+        await wrapper.vm.$nextTick()
+
+        setTimeout(() => {
+          expect(wrapper.vm.hosts).toEqual([])
+          expect(wrapper.vm.totalCount).toEqual(0)
+
+          done()
+        })
+      })
+
+      it('check hosts, totalCount when api is called with response result is not empty', async (done) => {
+        const mockData = {
+          findhostsformigrationresponse: {
+            count: 1,
+            host: [{
+              id: 'test-host-id',
+              name: 'test-host-name',
+              suitability: 'test-host-suitability',
+              cpuused: 'test-host-cpuused',
+              memused: 'test-host-memused',
+              select: 'test-host-select'
+            }]
+          }
+        }
+
+        mockAxios.mockResolvedValue(mockData)
+        wrapper = factory({ props: { resource: {} } })
+
+        await wrapper.vm.$nextTick()
+
+        setTimeout(() => {
+          expect(wrapper.vm.hosts).toEqual([{
+            id: 'test-host-id',
+            name: 'test-host-name',
+            suitability: 'test-host-suitability',
+            cpuused: 'test-host-cpuused',
+            memused: 'test-host-memused',
+            select: 'test-host-select'
+          }])
+          expect(wrapper.vm.totalCount).toEqual(1)
+
+          done()
+        })
+      })
+
+      it('check $message.error is called when api is called with throw error', async (done) => {
+        const mockError = 'Error: throw error message'
+        console.error = jest.fn()
+
+        mockAxios.mockRejectedValue(mockError)
+        wrapper = factory({ props: { resource: {} } })
+
+        await wrapper.vm.$nextTick()
+
+        setTimeout(() => {
+          expect(mocks.$message.error).toHaveBeenCalled()
+          expect(mocks.$message.error).toHaveBeenCalledWith(`${i18n.t('message.load.host.failed')}: ${mockError}`)
+
+          done()
+        })
+      })
+    })
+
+    describe('submitForm()', () => {
+      it('check api is called when selectedHost.requiresStorageMotion is true', async (done) => {
+        const mockData = {
+          migratevirtualmachineresponse: {
+            jobid: 'test-job-id'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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: 'migrateVirtualMachineWithVolume',
+              hostid: 'test-host-id',
+              virtualmachineid: 'test-resource-id',
+              response: 'json'
+            }
+          })
+
+          done()
+        })
+      })
+
+      it('check api is called when selectedHost.requiresStorageMotion is false', async (done) => {
+        const mockData = {
+          migratevirtualmachineresponse: {
+            jobid: 'test-job-id'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: false,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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: 'migrateVirtualMachine',
+              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'
+            }
+          }
+        }
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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 requiresStorageMotion is false', async (done) => {
+        const mockData = {
+          migratevirtualmachineresponse: {
+            jobid: 'test-job-id-case-2'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 1,
+            jobresult: {
+              name: 'test-name-value'
+            }
+          }
+        }
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: false,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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 errorMethod() is called', async (done) => {
+        const mockData = {
+          migratevirtualmachinewithvolumeresponse: {
+            jobid: 'test-job-id-case-3'
+          },
+          queryasyncjobresultresponse: {
+            jobstatus: 2,
+            jobresult: {
+              errortext: 'test-error-message'
+            }
+          }
+        }
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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 catchMethod() is called', async (done) => {
+        const mockData = {
+          migratevirtualmachinewithvolumeresponse: {
+            jobid: 'test-job-id-case-4'
+          }
+        }
+        wrapper = factory({
+          props: {
+            resource: {
+              id: 'test-resource-id',
+              name: 'test-resource-name'
+            }
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        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 $message.error is called when api is called with throw error', async (done) => {
+        const mockError = {
+          message: 'Error: throw error message'
+        }
+
+        wrapper = factory({
+          props: {
+            resource: {}
+          },
+          data: {
+            selectedHost: {
+              requiresStorageMotion: true,
+              id: 'test-host-id',
+              name: 'test-host-name'
+            }
+          }
+        })
+        jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+
+        mockAxios.mockRejectedValue(mockError)
+
+        await wrapper.vm.$nextTick()
+        await wrapper.vm.submitForm()
+
+        setTimeout(() => {
+          expect(mocks.$notification.error).toHaveBeenCalled()
+          expect(mocks.$notification.error).toHaveBeenCalledWith({
+            message: i18n.t('message.request.failed'),
+            description: 'Error: throw error message',
+            duration: 0
+          })
+
+          done()
+        })
+      })
+    })
+
+    describe('handleChangePage()', () => {
+      it('check page, pageSize and fetchData() when handleChangePage() is called', () => {
+        wrapper = factory({
+          props: {
+            resource: {}
+          },
+          data: {
+            page: 1,
+            pageSize: 10
+          }
+        })
+        const spyFetchData = jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.handleChangePage(2, 20)
+
+          expect(wrapper.vm.page).toEqual(2)
+          expect(wrapper.vm.pageSize).toEqual(20)
+          expect(spyFetchData).toBeCalled()
+        })
+      })
+    })
+
+    describe('handleChangePageSize()', () => {
+      it('check page, pageSize and fetchData() when handleChangePageSize() is called', () => {
+        wrapper = factory({
+          props: {
+            resource: {}
+          },
+          data: {
+            page: 1,
+            pageSize: 10
+          }
+        })
+        const spyFetchData = jest.spyOn(wrapper.vm, 'fetchData').mockImplementation(() => {})
+
+        wrapper.vm.$nextTick(() => {
+          wrapper.vm.handleChangePageSize(2, 20)
+
+          expect(wrapper.vm.page).toEqual(2)
+          expect(wrapper.vm.pageSize).toEqual(20)
+          expect(spyFetchData).toBeCalled()
+        })
+      })
+    })
+  })
+})
diff --git a/ui/theme.config.js b/ui/theme.config.js
new file mode 100644
index 0000000..8a41c49
--- /dev/null
+++ b/ui/theme.config.js
@@ -0,0 +1,58 @@
+// 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.
+
+const path = require('path')
+const AntDesignThemePlugin = require('antd-theme-webpack-plugin')
+
+function resolve (dir) {
+  return path.join(__dirname, dir)
+}
+
+const options = {
+  stylesDir: resolve('./src/style'),
+  antDir: resolve('./node_modules/ant-design-vue'),
+  varFile: resolve('./src/style/vars.less'),
+  themeVariables: [
+    '@logo-background-color',
+    '@project-nav-background-color',
+    '@project-nav-text-color',
+    '@navigation-background-color',
+    '@navigation-text-color',
+    '@primary-color',
+    '@link-color',
+    '@link-hover-color',
+    '@loading-color',
+    '@success-color',
+    '@warning-color',
+    '@processing-color',
+    '@error-color',
+    '@heading-color',
+    '@text-color',
+    '@text-color-secondary',
+    '@disabled-color',
+    '@border-color-base',
+    '@border-radius-base',
+    '@box-shadow-base'
+  ],
+  indexFileName: 'index.html',
+  publicPath: '.',
+  generateOnce: false
+}
+
+const createThemeColorReplacerPlugin = () => new AntDesignThemePlugin(options)
+
+module.exports = createThemeColorReplacerPlugin
diff --git a/ui/vue.config.js b/ui/vue.config.js
new file mode 100644
index 0000000..b087d68
--- /dev/null
+++ b/ui/vue.config.js
@@ -0,0 +1,179 @@
+// 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.
+
+const path = require('path')
+const webpack = require('webpack')
+const fs = require('fs')
+const packageJson = fs.readFileSync('./package.json')
+const version = JSON.parse(packageJson).version || 'master'
+const createThemeColorReplacerPlugin = require('./theme.config')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+function resolve (dir) {
+  return path.join(__dirname, dir)
+}
+
+// vue.config.js
+const vueConfig = {
+  publicPath: './',
+  /*
+    Vue-cli3:
+    Crashed when using Webpack `import()` #2463
+    https://github.com/vuejs/vue-cli/issues/2463
+
+   */
+  /*
+  pages: {
+    index: {
+      entry: 'src/main.js',
+      chunks: ['chunk-vendors', 'chunk-common', 'index']
+    }
+  },
+  */
+  configureWebpack: {
+    plugins: [
+      // Ignore all locale files of moment.js
+      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
+      new webpack.IgnorePlugin(/@antv\/g2/),
+      new webpack.DefinePlugin({
+        'process.env': {
+          PACKAGE_VERSION: '"' + version + '"'
+        }
+      })
+    ],
+    optimization: {
+      minimizer: [
+        new UglifyJsPlugin({
+          cache: true,
+          parallel: true,
+          uglifyOptions: {
+            compress: false,
+            ecma: 6,
+            mangle: true
+          },
+          sourceMap: true
+        })
+      ],
+      splitChunks: {
+        cacheGroups: {
+          commons: {
+            test: /[\\/]node_modules[\\/]/,
+            name: 'vendors',
+            chunks: 'all'
+          }
+        }
+      }
+    }
+  },
+
+  chainWebpack: (config) => {
+    config.resolve.alias
+      .set('@public', resolve('public'))
+      .set('@$', resolve('src'))
+      .set('@api', resolve('src/api'))
+      .set('@assets', resolve('src/assets'))
+      .set('@comp', resolve('src/components'))
+      .set('@views', resolve('src/views'))
+      .set('@layout', resolve('src/layout'))
+      .set('@static', resolve('src/static'))
+
+    // do not emit errors as a warning
+    config.module.rule('eslint').use('eslint-loader').tap(
+      opts => ({ ...opts, emitWarning: false })
+    )
+
+    const svgRule = config.module.rule('svg')
+    svgRule.uses.clear()
+    svgRule
+      .oneOf('inline')
+      .resourceQuery(/inline/)
+      .use('vue-svg-icon-loader')
+      .loader('vue-svg-icon-loader')
+      .end()
+      .end()
+      .oneOf('external')
+      .use('file-loader')
+      .loader('file-loader')
+      .options({
+        name: 'assets/[name].[hash:8].[ext]'
+      })
+    /* svgRule.oneOf('inline')
+      .resourceQuery(/inline/)
+      .use('vue-svg-loader')
+      .loader('vue-svg-loader')
+      .end()
+      .end()
+      .oneOf('external')
+      .use('file-loader')
+      .loader('file-loader')
+      .options({
+        name: 'assets/[name].[hash:8].[ext]'
+      })
+    */
+  },
+
+  css: {
+    loaderOptions: {
+      less: {
+        modifyVars: {
+          // https://ant.design/docs/spec/colors
+          // https://vue.ant.design/docs/vue/customize-theme/
+        },
+        javascriptEnabled: true
+      }
+    }
+  },
+
+  devServer: {
+    port: 5050,
+    proxy: {
+      '/client': {
+        target: process.env.CS_URL || 'http://localhost:8080',
+        secure: false,
+        ws: false,
+        changeOrigin: true,
+        proxyTimeout: 10 * 60 * 1000 // 10 minutes
+      }
+    },
+    https: process.env.HTTPS_KEY ? {
+      key: process.env.HTTPS_KEY ? fs.readFileSync(process.env.HTTPS_KEY) : undefined,
+      cert: process.env.HTTPS_CERT ? fs.readFileSync(process.env.HTTPS_CERT) : undefined,
+      ca: process.env.HTTPS_CA ? fs.readFileSync(process.env.HTTPS_CA) : undefined,
+      dhparam: process.env.HTTPS_DHPARAM ? fs.readFileSync(process.env.HTTPS_DHPARAM) : undefined
+    } : false,
+    public: process.env.PUBLIC_HOST || undefined,
+    allowedHosts: process.env.ALLOWED_HOSTS ? JSON.parse(process.env.ALLOWED_HOSTS) : undefined
+  },
+
+  lintOnSave: undefined,
+
+  // babel-loader no-ignore node_modules/*
+  transpileDependencies: [],
+
+  pluginOptions: {
+    i18n: {
+      locale: 'en',
+      fallbackLocale: 'en',
+      localeDir: 'locales',
+      enableInSFC: true
+    }
+  }
+}
+
+vueConfig.configureWebpack.plugins.push(createThemeColorReplacerPlugin())
+
+module.exports = vueConfig
diff --git a/ui/webstorm.config.js b/ui/webstorm.config.js
new file mode 100644
index 0000000..5b86eb6
--- /dev/null
+++ b/ui/webstorm.config.js
@@ -0,0 +1,37 @@
+// 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 path = require('path')
+
+function resolve (dir) {
+  return path.join(__dirname, '.', dir)
+}
+
+module.exports = {
+  context: path.resolve(__dirname, './'),
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      '@': resolve('src'),
+      '@views': resolve('src/views'),
+      '@comp': resolve('src/components'),
+      '@core': resolve('src/core'),
+      '@utils': resolve('src/utils')
+    }
+  }
+}
diff --git a/usage/pom.xml b/usage/pom.xml
index ceb3712..853828c 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
@@ -64,14 +64,6 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-        </dependency>
-        <dependency>
             <groupId>org.dbunit</groupId>
             <artifactId>dbunit</artifactId>
             <version>${cs.dbunit.version}</version>
@@ -83,11 +75,6 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>com/cloud/usage/UsageManagerTest.java</exclude>
-                    </excludes>
-                </configuration>
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
index 98b94e4..899f558 100644
--- a/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/main/java/com/cloud/usage/UsageManagerImpl.java
@@ -37,6 +37,7 @@
 import org.apache.cloudstack.quota.QuotaManager;
 import org.apache.cloudstack.quota.QuotaStatement;
 import org.apache.cloudstack.utils.usage.UsageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -95,6 +96,8 @@
 import com.cloud.utils.db.SearchCriteria;
 import com.cloud.utils.db.TransactionLegacy;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class UsageManagerImpl extends ManagerBase implements UsageManager, Runnable {
     public static final Logger s_logger = Logger.getLogger(UsageManagerImpl.class.getName());
@@ -275,7 +278,14 @@
             s_logger.error("Unhandled exception configuring UsageManger", e);
             throw new ConfigurationException("Unhandled exception configuring UsageManager " + e.toString());
         }
-        _pid = Integer.parseInt(System.getProperty("pid"));
+
+        try {
+            _pid = (int) ProcessHandle.current().pid();
+        } catch (Exception e) {
+            String msg = String.format("Unable to get process Id for %s!", e.toString());
+            s_logger.debug(msg);
+            throw new ConfigurationException(msg);
+        }
         return true;
     }
 
@@ -990,11 +1000,11 @@
         } else if (isNetworkOfferingEvent(eventType)) {
             createNetworkOfferingEvent(event);
         } else if (isVPNUserEvent(eventType)) {
-            createVPNUserEvent(event);
+            handleVpnUserEvent(event);
         } else if (isSecurityGroupEvent(eventType)) {
             createSecurityGroupEvent(event);
         } else if (isVmSnapshotEvent(eventType)) {
-            createVMSnapshotEvent(event);
+            handleVMSnapshotEvent(event);
         } else if (isVmSnapshotOnPrimaryEvent(eventType)) {
             createVmSnapshotOnPrimaryEvent(event);
         } else if (isBackupEvent(eventType)) {
@@ -1297,7 +1307,7 @@
         if (usageNetworkStats != null) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("getting current accounted bytes for... accountId: " + usageNetworkStats.getAccountId() + " in zone: " + userStat.getDataCenterId() +
-                        "; abr: " + usageNetworkStats.getAggBytesReceived() + "; abs: " + usageNetworkStats.getAggBytesSent());
+                        "; abr: " + toHumanReadableSize(usageNetworkStats.getAggBytesReceived()) + "; abs: " + toHumanReadableSize(usageNetworkStats.getAggBytesSent()));
             }
             currentAccountedBytesSent = usageNetworkStats.getAggBytesSent();
             currentAccountedBytesReceived = usageNetworkStats.getAggBytesReceived();
@@ -1306,13 +1316,13 @@
         long bytesReceived = userStat.getAggBytesReceived() - currentAccountedBytesReceived;
 
         if (bytesSent < 0) {
-            s_logger.warn("Calculated negative value for bytes sent: " + bytesSent + ", user stats say: " + userStat.getAggBytesSent() +
-                    ", previous network usage was: " + currentAccountedBytesSent);
+            s_logger.warn("Calculated negative value for bytes sent: " + toHumanReadableSize(bytesSent) + ", user stats say: " + toHumanReadableSize(userStat.getAggBytesSent()) +
+                    ", previous network usage was: " + toHumanReadableSize(currentAccountedBytesSent));
             bytesSent = 0;
         }
         if (bytesReceived < 0) {
-            s_logger.warn("Calculated negative value for bytes received: " + bytesReceived + ", user stats say: " + userStat.getAggBytesReceived() +
-                    ", previous network usage was: " + currentAccountedBytesReceived);
+            s_logger.warn("Calculated negative value for bytes received: " + toHumanReadableSize(bytesReceived) + ", user stats say: " + toHumanReadableSize(userStat.getAggBytesReceived()) +
+                    ", previous network usage was: " + toHumanReadableSize(currentAccountedBytesReceived));
             bytesReceived = 0;
         }
 
@@ -1341,8 +1351,8 @@
         if (usageVmDiskStat != null) {
             if (s_logger.isDebugEnabled()) {
                 s_logger.debug("getting current accounted bytes for... accountId: " + usageVmDiskStat.getAccountId() + " in zone: " + vmDiskStat.getDataCenterId() +
-                        "; aiw: " + vmDiskStat.getAggIOWrite() + "; air: " + usageVmDiskStat.getAggIORead() + "; abw: " + vmDiskStat.getAggBytesWrite() + "; abr: " +
-                        usageVmDiskStat.getAggBytesRead());
+                        "; aiw: " + toHumanReadableSize(vmDiskStat.getAggIOWrite()) + "; air: " + toHumanReadableSize(usageVmDiskStat.getAggIORead()) + "; abw: " + toHumanReadableSize(vmDiskStat.getAggBytesWrite()) + "; abr: " +
+                        toHumanReadableSize(usageVmDiskStat.getAggBytesRead()));
             }
             currentAccountedIORead = usageVmDiskStat.getAggIORead();
             currentAccountedIOWrite = usageVmDiskStat.getAggIOWrite();
@@ -1355,23 +1365,23 @@
         long bytesWrite = vmDiskStat.getAggBytesWrite() - currentAccountedBytesWrite;
 
         if (ioRead < 0) {
-            s_logger.warn("Calculated negative value for io read: " + ioRead + ", vm disk stats say: " + vmDiskStat.getAggIORead() + ", previous vm disk usage was: " +
-                    currentAccountedIORead);
+            s_logger.warn("Calculated negative value for io read: " + toHumanReadableSize(ioRead) + ", vm disk stats say: " + toHumanReadableSize(vmDiskStat.getAggIORead()) + ", previous vm disk usage was: " +
+                    toHumanReadableSize(currentAccountedIORead));
             ioRead = 0;
         }
         if (ioWrite < 0) {
-            s_logger.warn("Calculated negative value for io write: " + ioWrite + ", vm disk stats say: " + vmDiskStat.getAggIOWrite() + ", previous vm disk usage was: " +
-                    currentAccountedIOWrite);
+            s_logger.warn("Calculated negative value for io write: " + toHumanReadableSize(ioWrite) + ", vm disk stats say: " + toHumanReadableSize(vmDiskStat.getAggIOWrite()) + ", previous vm disk usage was: " +
+                    toHumanReadableSize(currentAccountedIOWrite));
             ioWrite = 0;
         }
         if (bytesRead < 0) {
-            s_logger.warn("Calculated negative value for bytes read: " + bytesRead + ", vm disk stats say: " + vmDiskStat.getAggBytesRead() +
-                    ", previous vm disk usage was: " + currentAccountedBytesRead);
+            s_logger.warn("Calculated negative value for bytes read: " + toHumanReadableSize(bytesRead) + ", vm disk stats say: " + toHumanReadableSize(vmDiskStat.getAggBytesRead()) +
+                    ", previous vm disk usage was: " + toHumanReadableSize(currentAccountedBytesRead));
             bytesRead = 0;
         }
         if (bytesWrite < 0) {
-            s_logger.warn("Calculated negative value for bytes write: " + bytesWrite + ", vm disk stats say: " + vmDiskStat.getAggBytesWrite() +
-                    ", previous vm disk usage was: " + currentAccountedBytesWrite);
+            s_logger.warn("Calculated negative value for bytes write: " + toHumanReadableSize(bytesWrite) + ", vm disk stats say: " + toHumanReadableSize(vmDiskStat.getAggBytesWrite()) +
+                    ", previous vm disk usage was: " + toHumanReadableSize(currentAccountedBytesWrite));
             bytesWrite = 0;
         }
 
@@ -1386,9 +1396,9 @@
                         vmDiskStat.getAggIOWrite(), bytesRead, bytesWrite, vmDiskStat.getAggBytesRead(), vmDiskStat.getAggBytesWrite(), timestamp);
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("creating vmDiskHelperEntry... accountId: " + vmDiskStat.getAccountId() + " in zone: " + vmDiskStat.getDataCenterId() + "; aiw: " +
-                    vmDiskStat.getAggIOWrite() + "; air: " + vmDiskStat.getAggIORead() + "; curAIR: " + currentAccountedIORead + "; curAIW: " + currentAccountedIOWrite +
-                    "; uir: " + ioRead + "; uiw: " + ioWrite + "; abw: " + vmDiskStat.getAggBytesWrite() + "; abr: " + vmDiskStat.getAggBytesRead() + "; curABR: " +
-                    currentAccountedBytesRead + "; curABW: " + currentAccountedBytesWrite + "; ubr: " + bytesRead + "; ubw: " + bytesWrite);
+                    toHumanReadableSize(vmDiskStat.getAggIOWrite()) + "; air: " + toHumanReadableSize(vmDiskStat.getAggIORead()) + "; curAIR: " + toHumanReadableSize(currentAccountedIORead) + "; curAIW: " + toHumanReadableSize(currentAccountedIOWrite) +
+                    "; uir: " + toHumanReadableSize(ioRead) + "; uiw: " + toHumanReadableSize(ioWrite) + "; abw: " + toHumanReadableSize(vmDiskStat.getAggBytesWrite()) + "; abr: " + toHumanReadableSize(vmDiskStat.getAggBytesRead()) + "; curABR: " +
+                    toHumanReadableSize(currentAccountedBytesRead) + "; curABW: " + toHumanReadableSize(currentAccountedBytesWrite) + "; ubr: " + toHumanReadableSize(bytesRead) + "; ubw: " + toHumanReadableSize(bytesWrite));
         }
         usageVmDisks.add(usageVmDiskVO);
     }
@@ -1407,8 +1417,10 @@
             long sourceNat = event.getSize();
             boolean isSourceNat = (sourceNat == 1) ? true : false;
             boolean isSystem = (event.getTemplateId() == null || event.getTemplateId() == 0) ? false : true;
+            final UsageEventDetailsVO hiddenDetail = _usageEventDetailsDao.findDetail(event.getId(), "hidden");
+            final boolean isHidden = hiddenDetail != null && "true".equals(hiddenDetail.getValue());
             UsageIPAddressVO ipAddressVO =
-                    new UsageIPAddressVO(id, event.getAccountId(), acct.getDomainId(), zoneId, ipAddress, isSourceNat, isSystem, event.getCreateDate(), null);
+                    new UsageIPAddressVO(id, event.getAccountId(), acct.getDomainId(), zoneId, ipAddress, isSourceNat, isSystem, event.getCreateDate(), null, isHidden);
             _usageIPAddressDao.persist(ipAddressVO);
         } else if (EventTypes.EVENT_NET_IP_RELEASE.equals(event.getType())) {
             SearchCriteria<UsageIPAddressVO> sc = _usageIPAddressDao.createSearchCriteria();
@@ -1766,39 +1778,92 @@
         }
     }
 
-    private void createVPNUserEvent(UsageEventVO event) {
-
-        long zoneId = 0L;
-
+    /**
+     * Handles VPN user create and remove events:
+     * <ul>
+     *     <li>EventTypes#EVENT_VPN_USER_ADD</li>
+     *     <li>EventTypes#EVENT_VPN_USER_ADD</li>
+     * </ul>
+     * if the event received by this method is neither add nor remove, we ignore it.
+     */
+    protected void handleVpnUserEvent(UsageEventVO event) {
+        long accountId = event.getAccountId();
+        Account account = _accountDao.findByIdIncludingRemoved(accountId);
+        long zoneId = event.getZoneId();
         long userId = event.getResourceId();
 
-        if (EventTypes.EVENT_VPN_USER_ADD.equals(event.getType())) {
-            if (s_logger.isDebugEnabled()) {
-                s_logger.debug("Creating VPN user: " + userId + " for account: " + event.getAccountId());
-            }
-            Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId());
-            String userName = event.getResourceName();
-            UsageVPNUserVO vpnUser = new UsageVPNUserVO(zoneId, event.getAccountId(), acct.getDomainId(), userId, userName, event.getCreateDate(), null);
-            _usageVPNUserDao.persist(vpnUser);
-        } else if (EventTypes.EVENT_VPN_USER_REMOVE.equals(event.getType())) {
-            SearchCriteria<UsageVPNUserVO> sc = _usageVPNUserDao.createSearchCriteria();
-            sc.addAnd("accountId", SearchCriteria.Op.EQ, event.getAccountId());
-            sc.addAnd("userId", SearchCriteria.Op.EQ, userId);
-            sc.addAnd("deleted", SearchCriteria.Op.NULL);
-            List<UsageVPNUserVO> vuVOs = _usageVPNUserDao.search(sc, null);
-            if (vuVOs.size() > 1) {
-                s_logger.warn("More that one usage entry for vpn user: " + userId + " assigned to account: " + event.getAccountId() + "; marking them all as deleted...");
-            }
-            for (UsageVPNUserVO vuVO : vuVOs) {
-                if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("deleting vpn user: " + vuVO.getUserId());
-                }
-                vuVO.setDeleted(event.getCreateDate()); // there really shouldn't be more than one
-                _usageVPNUserDao.update(vuVO);
-            }
+        switch (event.getType()) {
+            case EventTypes.EVENT_VPN_USER_ADD:
+                createUsageVpnUser(event, account);
+                break;
+            case EventTypes.EVENT_VPN_USER_REMOVE:
+                deleteUsageVpnUser(event, account);
+                break;
+            default:
+                s_logger.debug(String.format("The event [type=%s, zoneId=%s, accountId=%s, userId=%s, resourceName=%s, createDate=%s] is neither of type [%s] nor [%s]",
+                        event.getType(), zoneId, accountId, userId, event.getResourceName(), event.getCreateDate(), EventTypes.EVENT_VPN_USER_ADD, EventTypes.EVENT_VPN_USER_REMOVE));
         }
     }
 
+    /**
+     * Find and delete, if exists, usage VPN user entries
+     */
+    protected void deleteUsageVpnUser(UsageEventVO event, Account account) {
+        long accountId = account.getId();
+        long userId = event.getResourceId();
+        long zoneId = event.getZoneId();
+        long domainId = account.getDomainId();
+
+        List<UsageVPNUserVO> usageVpnUsers = findUsageVpnUsers(accountId, zoneId, userId, domainId);
+
+        if (CollectionUtils.isEmpty(usageVpnUsers)) {
+            s_logger.warn(String.format("No usage entry for vpn user [%s] assigned to account [%s] domain [%s] and zone [%s] was found.",
+                    userId, accountId, domainId, zoneId));
+        }
+        if (usageVpnUsers.size() > 1) {
+            s_logger.warn(String.format("More than one usage entry for vpn user [%s] assigned to account [%s] domain [%s] and zone [%s]; marking them all as deleted.", userId,
+                    accountId, domainId, zoneId));
+        }
+        for (UsageVPNUserVO vpnUser : usageVpnUsers) {
+            s_logger.debug(String.format("Deleting vpn user [%s] assigned to account [%s] domain [%s] and zone [%s] that was created at [%s].", vpnUser.getUserId(),
+                    vpnUser.getAccountId(), vpnUser.getDomainId(), vpnUser.getZoneId(), vpnUser.getCreated()));
+            vpnUser.setDeleted(new Date());
+            _usageVPNUserDao.update(vpnUser);
+        }
+    }
+
+    /**
+     * Creates an entry for the Usage VPN User.
+     * If there is already an entry in the database with the same accountId, domainId, userId and zoneId, we do not persist a new entry.
+     */
+    protected void createUsageVpnUser(UsageEventVO event, Account account) {
+        long accountId = account.getId();
+        long userId = event.getResourceId();
+        long zoneId = event.getZoneId();
+        long domainId = account.getDomainId();
+
+        List<UsageVPNUserVO> usageVpnUsers = findUsageVpnUsers(accountId, zoneId, userId, domainId);
+
+        if (usageVpnUsers.size() > 0) {
+            s_logger.debug(String.format("We do not need to create the usage VPN user [%s] assigned to account [%s] because it already exists.", userId, accountId));
+        } else {
+            s_logger.debug(String.format("Creating VPN user user [%s] assigned to account [%s] domain [%s], zone [%s], and created at [%s]", userId, accountId, domainId, zoneId,
+                    event.getCreateDate()));
+            UsageVPNUserVO vpnUser = new UsageVPNUserVO(zoneId, accountId, domainId, userId, event.getResourceName(), event.getCreateDate(), null);
+            _usageVPNUserDao.persist(vpnUser);
+        }
+    }
+
+    protected List<UsageVPNUserVO> findUsageVpnUsers(long accountId, long zoneId, long userId, long domainId) {
+        SearchCriteria<UsageVPNUserVO> sc = _usageVPNUserDao.createSearchCriteria();
+        sc.addAnd("zoneId", SearchCriteria.Op.EQ, zoneId);
+        sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
+        sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
+        sc.addAnd("userId", SearchCriteria.Op.EQ, userId);
+        sc.addAnd("deleted", SearchCriteria.Op.NULL);
+        return _usageVPNUserDao.search(sc, null);
+    }
+
     private void createSecurityGroupEvent(UsageEventVO event) {
 
         long zoneId = -1L;
@@ -1835,29 +1900,93 @@
         }
     }
 
-    private void createVMSnapshotEvent(UsageEventVO event) {
-        Long vmId = event.getResourceId();
-        Long volumeId = event.getTemplateId();
-        Long offeringId = event.getOfferingId();
-        Long zoneId = event.getZoneId();
-        Long accountId = event.getAccountId();
-        //Size could be null for VM snapshot delete events
-        long size = (event.getSize() == null) ? 0 : event.getSize();
-        Date created = event.getCreateDate();
+    /**
+     * Handles Vm Snapshot create and delete events:
+     * <ul>
+     *     <li>EventTypes#EVENT_VM_SNAPSHOT_CREATE</li>
+     *     <li>EventTypes#EVENT_VM_SNAPSHOT_DELETE</li>
+     * </ul>
+     * if the event received by this method is neither add nor remove, we ignore it.
+     */
+    protected void handleVMSnapshotEvent(UsageEventVO event) {
+        switch (event.getType()) {
+            case EventTypes.EVENT_VM_SNAPSHOT_CREATE:
+                createUsageVMSnapshot(event);
+                break;
+            case EventTypes.EVENT_VM_SNAPSHOT_DELETE:
+                deleteUsageVMSnapshot(event);
+                break;
+            default:
+                s_logger.debug(String.format("The event [type=%s, zoneId=%s, accountId=%s, resourceName=%s, diskOfferingId=%s, createDate=%s] is neither of type [%s] nor [%s]",
+                        event.getType(), event.getZoneId(), event.getAccountId(), event.getResourceName(), event.getOfferingId(), event.getCreateDate(), EventTypes.EVENT_VM_SNAPSHOT_CREATE, EventTypes.EVENT_VM_SNAPSHOT_DELETE));
+        }
+    }
+
+    /**
+     * Creates an entry for the Usage VM Snapshot.
+     */
+    protected void createUsageVMSnapshot(UsageEventVO event) {
+        long accountId = event.getAccountId();
         Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId());
-        Long domainId = acct.getDomainId();
+        long domainId = acct.getDomainId();
+        Long offeringId = event.getOfferingId();
+        long vmId = event.getResourceId();
+        long volumeId = event.getTemplateId();
+        long zoneId = event.getZoneId();
+        Date created = event.getCreateDate();
+        long size = (event.getSize() == null) ? 0 : event.getSize();
 
         UsageEventDetailsVO detailVO = _usageEventDetailsDao.findDetail(event.getId(), UsageEventVO.DynamicParameters.vmSnapshotId.name());
         Long vmSnapshotId = null;
         if (detailVO != null) {
             String snapId = detailVO.getValue();
-             vmSnapshotId = Long.valueOf(snapId);
+            vmSnapshotId = Long.valueOf(snapId);
         }
+        s_logger.debug(String.format("Creating usage VM Snapshot for VM id [%s] assigned to account [%s] domain [%s], zone [%s], and created at [%s]", vmId, accountId, domainId, zoneId,
+                event.getCreateDate()));
         UsageVMSnapshotVO vsVO = new UsageVMSnapshotVO(volumeId, zoneId, accountId, domainId, vmId, offeringId, size, created, null);
         vsVO.setVmSnapshotId(vmSnapshotId);
         _usageVMSnapshotDao.persist(vsVO);
     }
 
+    /**
+     * Find and delete, if exists, usage VM Snapshots entries
+     */
+    protected void deleteUsageVMSnapshot(UsageEventVO event) {
+        long accountId = event.getAccountId();
+        Account acct = _accountDao.findByIdIncludingRemoved(event.getAccountId());
+        Long domainId = acct.getDomainId();
+        Long diskOfferingId = event.getOfferingId();
+        long vmId = event.getResourceId();
+        long zoneId = event.getZoneId();
+        List<UsageVMSnapshotVO> usageVMSnapshots = findUsageVMSnapshots(accountId, zoneId, domainId, vmId, diskOfferingId);
+        if (CollectionUtils.isEmpty(usageVMSnapshots)){
+            s_logger.warn(String.format("No usage entry for VM snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s] was found.",
+                    vmId, accountId, domainId, zoneId));
+        }
+        if (usageVMSnapshots.size() > 1) {
+            s_logger.warn(String.format("More than one usage entry for VM snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s]; marking them all as deleted.", vmId,
+                    accountId, domainId, zoneId));
+        }
+        for (UsageVMSnapshotVO vmSnapshots : usageVMSnapshots) {
+            s_logger.debug(String.format("Deleting VM Snapshot for VM id [%s] assigned to account [%s] domain [%s] and zone [%s] that was created at [%s].", vmSnapshots.getVmId(),
+                    vmSnapshots.getAccountId(), vmSnapshots.getDomainId(), vmSnapshots.getZoneId(), vmSnapshots.getCreated()));
+            vmSnapshots.setProcessed(event.getCreateDate());
+            _usageVMSnapshotDao.update(vmSnapshots);
+        }
+    }
+
+    protected List<UsageVMSnapshotVO> findUsageVMSnapshots(long accountId, long zoneId, long domainId, long vmId, Long diskOfferingId) {
+        SearchCriteria<UsageVMSnapshotVO> sc = _usageVMSnapshotDao.createSearchCriteria();
+        sc.addAnd("zoneId", SearchCriteria.Op.EQ, zoneId);
+        sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId);
+        sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId);
+        sc.addAnd("vmId", SearchCriteria.Op.EQ, vmId);
+        sc.addAnd("diskOfferingId", SearchCriteria.Op.EQ, diskOfferingId);
+        sc.addAnd("processed", SearchCriteria.Op.NULL);
+        return _usageVMSnapshotDao.search(sc, null);
+    }
+
     private void createVmSnapshotOnPrimaryEvent(UsageEventVO event) {
         Long vmId = event.getResourceId();
         String name = event.getResourceName();
diff --git a/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java b/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
index feee16b..4844143 100644
--- a/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/IPAddressUsageParser.java
@@ -87,7 +87,7 @@
             String key = "" + IpId;
 
             // store the info in the IP map
-            IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat(), usageIp.isSystem()));
+            IPMap.put(key, new IpInfo(usageIp.getZoneId(), IpId, usageIp.getAddress(), usageIp.isSourceNat(), usageIp.isSystem(), usageIp.isHidden()));
 
             Date IpAssignDate = usageIp.getAssigned();
             Date IpReleaseDeleteDate = usageIp.getReleased();
@@ -118,7 +118,7 @@
             // Only create a usage record if we have a runningTime of bigger than zero.
             if (useTime > 0L) {
                 IpInfo info = IPMap.get(ipIdKey);
-                createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat(), info.isSystem);
+                createUsageRecord(info.getZoneId(), useTime, startDate, endDate, account, info.getIpId(), info.getIPAddress(), info.isSourceNat(), info.isSystem, info.isHidden());
             }
         }
 
@@ -138,7 +138,7 @@
     }
 
     private static void createUsageRecord(long zoneId, long runningTime, Date startDate, Date endDate, AccountVO account, long ipId, String ipAddress,
-        boolean isSourceNat, boolean isSystem) {
+        boolean isSourceNat, boolean isSystem, boolean isHidden) {
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Total usage time " + runningTime + "ms");
         }
@@ -159,7 +159,7 @@
 
         UsageVO usageRecord =
             new UsageVO(zoneId, account.getAccountId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", UsageTypes.IP_ADDRESS, new Double(usage), ipId,
-                (isSystem ? 1 : 0), (isSourceNat ? "SourceNat" : ""), startDate, endDate);
+                (isSystem ? 1 : 0), (isSourceNat ? "SourceNat" : ""), startDate, endDate, isHidden);
         s_usageDao.persist(usageRecord);
     }
 
@@ -169,13 +169,15 @@
         private String ipAddress;
         private boolean isSourceNat;
         private boolean isSystem;
+        private boolean isHidden;
 
-        public IpInfo(long zoneId, long ipId, String ipAddress, boolean isSourceNat, boolean isSystem) {
+        public IpInfo(long zoneId, long ipId, String ipAddress, boolean isSourceNat, boolean isSystem, boolean isHidden) {
             this.zoneId = zoneId;
             this.ipId = ipId;
             this.ipAddress = ipAddress;
             this.isSourceNat = isSourceNat;
             this.isSystem = isSystem;
+            this.isHidden = isHidden;
         }
 
         public long getZoneId() {
@@ -193,5 +195,9 @@
         public boolean isSourceNat() {
             return isSourceNat;
         }
+
+        public boolean isHidden() {
+            return isHidden;
+        }
     }
 }
diff --git a/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java b/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
index a54cb3e..a19f621 100644
--- a/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/NetworkUsageParser.java
@@ -37,6 +37,8 @@
 import com.cloud.user.AccountVO;
 import com.cloud.utils.db.SearchCriteria;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class NetworkUsageParser {
     public static final Logger s_logger = Logger.getLogger(NetworkUsageParser.class.getName());
@@ -101,7 +103,7 @@
 
             if ((totalBytesSent > 0L) || (totalBytesReceived > 0L)) {
                 if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Creating usage record, total bytes sent:" + totalBytesSent + ", total bytes received: " + totalBytesReceived + " for account: " +
+                    s_logger.debug("Creating usage record, total bytes sent: " + toHumanReadableSize(totalBytesSent) + ", total bytes received: " + toHumanReadableSize(totalBytesReceived) + " for account: " +
                         account.getId() + " in availability zone " + networkInfo.getZoneId() + ", start: " + startDate + ", end: " + endDate);
                 }
 
diff --git a/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java b/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
index 8231756..cd9b03c 100644
--- a/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/StorageUsageParser.java
@@ -38,6 +38,8 @@
 import com.cloud.user.AccountVO;
 import com.cloud.utils.Pair;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class StorageUsageParser {
     public static final Logger s_logger = Logger.getLogger(StorageUsageParser.class.getName());
@@ -186,9 +188,9 @@
                 break;
         }
         //Create the usage record
-        usageDesc += "Id:" + storageId + " Size:" + size;
+        usageDesc += "Id:" + storageId + " Size:" + toHumanReadableSize(size);
         if (type != StorageTypes.SNAPSHOT) {
-            usageDesc += " VirtualSize:" + virtualSize;
+            usageDesc += " VirtualSize: " + toHumanReadableSize(virtualSize);
         }
 
         //ToDo: get zone id
diff --git a/usage/src/main/java/com/cloud/usage/parser/VMSanpshotOnPrimaryParser.java b/usage/src/main/java/com/cloud/usage/parser/VMSanpshotOnPrimaryParser.java
index d8daad1..7bafcde 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VMSanpshotOnPrimaryParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VMSanpshotOnPrimaryParser.java
@@ -36,6 +36,8 @@
 import com.cloud.usage.dao.UsageVMSnapshotOnPrimaryDao;
 import com.cloud.user.AccountVO;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class VMSanpshotOnPrimaryParser {
     public static final Logger s_logger = Logger.getLogger(VMSanpshotOnPrimaryParser.class.getName());
@@ -119,7 +121,7 @@
 
         // Create the usage record
         String usageDesc = "VMSnapshot Id: " + vmSnapshotId + " On Primary Usage: VM Id: " + vmId;
-        usageDesc += " Size: " + virtualSize;
+        usageDesc += " Size: " + toHumanReadableSize(virtualSize);
 
         UsageVO usageRecord = new UsageVO(zoneId, account.getId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", usageType, new Double(usage), vmId, name, null, null,
                 vmSnapshotId, physicalSize, virtualSize, startDate, endDate);
diff --git a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
index 4dbfd2e..434bfa6 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VMSnapshotUsageParser.java
@@ -36,6 +36,8 @@
 import com.cloud.usage.dao.UsageVMSnapshotDao;
 import com.cloud.user.AccountVO;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class VMSnapshotUsageParser {
     public static final Logger s_logger = Logger.getLogger(VMSnapshotUsageParser.class.getName());
@@ -143,7 +145,7 @@
             usageDesc += " DiskOffering: " + doId;
         }
 
-        usageDesc += " Size: " + size;
+        usageDesc += " Size: " + toHumanReadableSize(size);
 
         UsageVO usageRecord =
             new UsageVO(zoneId, account.getId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", type, new Double(usage), vmId, null, doId, null, vmSnapshotId, size,
diff --git a/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java b/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
index 6022a3e..d3c8394 100644
--- a/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
+++ b/usage/src/main/java/com/cloud/usage/parser/VmDiskUsageParser.java
@@ -37,6 +37,8 @@
 import com.cloud.user.AccountVO;
 import com.cloud.utils.db.SearchCriteria;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 @Component
 public class VmDiskUsageParser {
     public static final Logger s_logger = Logger.getLogger(VmDiskUsageParser.class.getName());
@@ -106,8 +108,8 @@
 
             if ((ioRead > 0L) || (ioWrite > 0L) || (bytesRead > 0L) || (bytesWrite > 0L)) {
                 if (s_logger.isDebugEnabled()) {
-                    s_logger.debug("Creating vm disk usage record, io read:" + ioRead + ", io write: " + ioWrite + "bytes read:" + bytesRead + ", bytes write: " +
-                        bytesWrite + "for account: " + account.getId() + " in availability zone " + vmDiskInfo.getZoneId() + ", start: " + startDate + ", end: " +
+                    s_logger.debug("Creating vm disk usage record, io read:" + toHumanReadableSize(ioRead) + ", io write: " + toHumanReadableSize(ioWrite) + ", bytes read:" + toHumanReadableSize(bytesRead) + ", bytes write: " +
+                            toHumanReadableSize(bytesWrite) + " for account: " + account.getId() + " in availability zone " + vmDiskInfo.getZoneId() + ", start: " + startDate + ", end: " +
                         endDate);
                 }
 
diff --git a/usage/src/test/java/com/cloud/usage/UsageManagerImplTest.java b/usage/src/test/java/com/cloud/usage/UsageManagerImplTest.java
new file mode 100644
index 0000000..ab067b4
--- /dev/null
+++ b/usage/src/test/java/com/cloud/usage/UsageManagerImplTest.java
@@ -0,0 +1,246 @@
+// 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.usage;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.cloud.event.dao.UsageEventDetailsDao;
+import com.cloud.usage.dao.UsageVMSnapshotDao;
+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 com.cloud.event.EventTypes;
+import com.cloud.event.UsageEventVO;
+import com.cloud.usage.dao.UsageVPNUserDao;
+import com.cloud.user.AccountVO;
+import com.cloud.user.dao.AccountDao;
+import org.mockito.junit.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class UsageManagerImplTest {
+
+    @Spy
+    @InjectMocks
+    private UsageManagerImpl usageManagerImpl;
+
+    @Mock
+    private UsageEventDetailsDao usageEventDetailsDao;
+
+    @Mock
+    private UsageEventVO usageEventVOMock;
+
+    @Mock
+    private UsageVPNUserDao usageVPNUserDaoMock;
+
+    @Mock
+    private UsageVMSnapshotDao usageVMSnapshotDaoMock;
+
+    @Mock
+    private AccountDao accountDaoMock;
+
+    @Mock
+    private UsageVPNUserVO vpnUserMock;
+
+    @Mock
+    private UsageVMSnapshotVO vmSnapshotMock;
+
+    @Mock
+    private AccountVO accountMock;
+
+    private long accountMockId = 1l;
+    private long acountDomainIdMock = 2l;
+
+    @Before
+    public void before() {
+        Mockito.when(accountMock.getId()).thenReturn(accountMockId);
+        Mockito.when(accountMock.getDomainId()).thenReturn(acountDomainIdMock);
+
+        Mockito.doReturn(accountMock).when(accountDaoMock).findByIdIncludingRemoved(Mockito.anyLong());
+
+    }
+
+    @Test
+    public void createUsageVpnUserTestUserExits() {
+        List<UsageVPNUserVO> vpnUsersMock = new ArrayList<UsageVPNUserVO>();
+        vpnUsersMock.add(vpnUserMock);
+
+        Mockito.doReturn(vpnUsersMock).when(usageManagerImpl).findUsageVpnUsers(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+
+        usageManagerImpl.createUsageVpnUser(usageEventVOMock, accountMock);
+
+        Mockito.verify(usageVPNUserDaoMock, Mockito.never()).persist(Mockito.any(UsageVPNUserVO.class));
+
+    }
+
+    @Test
+    public void createUsageVpnUserTestUserDoesNotExits() {
+        List<UsageVPNUserVO> vpnUsersMock = new ArrayList<UsageVPNUserVO>();
+
+        Mockito.doReturn(vpnUsersMock).when(usageManagerImpl).findUsageVpnUsers(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+        Mockito.doReturn(vpnUserMock).when(usageVPNUserDaoMock).persist(Mockito.any(UsageVPNUserVO.class));
+
+        usageManagerImpl.createUsageVpnUser(usageEventVOMock, accountMock);
+
+        Mockito.verify(usageVPNUserDaoMock, Mockito.times(1)).persist(Mockito.any(UsageVPNUserVO.class));
+
+    }
+
+    @Test
+    public void deleteUsageVpnUserNoUserFound() {
+        List<UsageVPNUserVO> vpnUsersMock = new ArrayList<UsageVPNUserVO>();
+
+        Mockito.doReturn(vpnUsersMock).when(usageManagerImpl).findUsageVpnUsers(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+
+        usageManagerImpl.deleteUsageVpnUser(usageEventVOMock, accountMock);
+
+        Mockito.verify(usageVPNUserDaoMock, Mockito.never()).update(Mockito.any(UsageVPNUserVO.class));
+    }
+
+    @Test
+    public void deleteUsageVpnUserOneUserFound() {
+        List<UsageVPNUserVO> vpnUsersMock = new ArrayList<UsageVPNUserVO>();
+        vpnUsersMock.add(vpnUserMock);
+
+        Mockito.doReturn(vpnUsersMock).when(usageManagerImpl).findUsageVpnUsers(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+        Mockito.doNothing().when(usageVPNUserDaoMock).update(Mockito.any(UsageVPNUserVO.class));
+
+        usageManagerImpl.deleteUsageVpnUser(usageEventVOMock, accountMock);
+
+        Mockito.verify(usageVPNUserDaoMock, Mockito.times(1)).update(Mockito.any(UsageVPNUserVO.class));
+    }
+
+    @Test
+    public void deleteUsageVpnUserMultipleUsersFound() {
+        List<UsageVPNUserVO> vpnUsersMock = new ArrayList<UsageVPNUserVO>();
+        vpnUsersMock.add(vpnUserMock);
+        vpnUsersMock.add(Mockito.mock(UsageVPNUserVO.class));
+        vpnUsersMock.add(Mockito.mock(UsageVPNUserVO.class));
+
+        Mockito.doReturn(vpnUsersMock).when(usageManagerImpl).findUsageVpnUsers(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+        Mockito.doNothing().when(usageVPNUserDaoMock).update(Mockito.any(UsageVPNUserVO.class));
+
+        usageManagerImpl.deleteUsageVpnUser(usageEventVOMock, accountMock);
+
+        Mockito.verify(usageVPNUserDaoMock, Mockito.times(3)).update(Mockito.any(UsageVPNUserVO.class));
+    }
+
+    @Test
+    public void handleVpnUserEventTestAddUser() {
+        Mockito.when(this.usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VPN_USER_ADD);
+        Mockito.doNothing().when(this.usageManagerImpl).createUsageVpnUser(usageEventVOMock, accountMock);
+
+        this.usageManagerImpl.handleVpnUserEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl).createUsageVpnUser(usageEventVOMock, accountMock);
+        Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock);
+    }
+
+    @Test
+    public void handleVpnUserEventTestRemoveUser() {
+        Mockito.when(this.usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VPN_USER_REMOVE);
+        Mockito.doNothing().when(this.usageManagerImpl).deleteUsageVpnUser(usageEventVOMock, accountMock);
+
+        this.usageManagerImpl.handleVpnUserEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock, accountMock);
+        Mockito.verify(usageManagerImpl).deleteUsageVpnUser(usageEventVOMock, accountMock);
+    }
+
+    @Test
+    public void handleVpnUserEventTestEventIsNeitherAddNorRemove() {
+        Mockito.when(this.usageEventVOMock.getType()).thenReturn("VPN.USER.UPDATE");
+
+        this.usageManagerImpl.handleVpnUserEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock);
+        Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock);
+    }
+
+    @Test
+    public void createUsageVMSnapshotTest() {
+        Mockito.doReturn(vmSnapshotMock).when(usageVMSnapshotDaoMock).persist(Mockito.any(UsageVMSnapshotVO.class));
+        usageManagerImpl.createUsageVMSnapshot(Mockito.mock(UsageEventVO.class));
+        Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(1)).persist(Mockito.any(UsageVMSnapshotVO.class));
+    }
+
+    @Test
+    public void deleteUsageVMSnapshotTest() {
+        List<UsageVMSnapshotVO> vmSnapshotsMock = new ArrayList<UsageVMSnapshotVO>();
+        vmSnapshotsMock.add(vmSnapshotMock);
+
+        Mockito.doReturn(vmSnapshotsMock).when(usageManagerImpl).findUsageVMSnapshots(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+        Mockito.doNothing().when(usageVMSnapshotDaoMock).update(Mockito.any(UsageVMSnapshotVO.class));
+
+        usageManagerImpl.deleteUsageVMSnapshot(usageEventVOMock);
+
+        Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(1)).update(Mockito.any(UsageVMSnapshotVO.class));
+    }
+
+    @Test
+    public void deleteUsageVMSnapshotMultipleSnapshotsFoundTest() {
+        List<UsageVMSnapshotVO> vmSnapshotsMock = new ArrayList<UsageVMSnapshotVO>();
+        vmSnapshotsMock.add(vmSnapshotMock);
+        vmSnapshotsMock.add(Mockito.mock(UsageVMSnapshotVO.class));
+        vmSnapshotsMock.add(Mockito.mock(UsageVMSnapshotVO.class));
+
+
+        Mockito.doReturn(vmSnapshotsMock).when(usageManagerImpl).findUsageVMSnapshots(Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong(), Mockito.anyLong());
+        Mockito.doNothing().when(usageVMSnapshotDaoMock).update(Mockito.any(UsageVMSnapshotVO.class));
+
+        usageManagerImpl.deleteUsageVMSnapshot(usageEventVOMock);
+
+        Mockito.verify(usageVMSnapshotDaoMock, Mockito.times(3)).update(Mockito.any(UsageVMSnapshotVO.class));
+    }
+
+    @Test
+    public void handleVMSnapshotEventTestCreateVMSnapshot() {
+        Mockito.when(usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VM_SNAPSHOT_CREATE);
+        Mockito.doNothing().when(this.usageManagerImpl).createUsageVMSnapshot(usageEventVOMock);
+
+        this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl).createUsageVMSnapshot(usageEventVOMock);
+        Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVMSnapshot(usageEventVOMock);
+    }
+
+    @Test
+    public void handleVMSnapshotEventTestDeleteVMSnapshot() {
+        Mockito.when(usageEventVOMock.getType()).thenReturn(EventTypes.EVENT_VM_SNAPSHOT_DELETE);
+        Mockito.doNothing().when(this.usageManagerImpl).deleteUsageVMSnapshot(usageEventVOMock);
+
+        this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl).deleteUsageVMSnapshot(usageEventVOMock);
+        Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVMSnapshot(usageEventVOMock);
+    }
+
+    @Test
+    public void handleVMSnapshotEventTestEventIsNeitherAddNorRemove() {
+        Mockito.when(this.usageEventVOMock.getType()).thenReturn("VPN.USER.UPDATE");
+
+        this.usageManagerImpl.handleVMSnapshotEvent(usageEventVOMock);
+
+        Mockito.verify(usageManagerImpl, Mockito.never()).createUsageVpnUser(usageEventVOMock,accountMock);
+        Mockito.verify(usageManagerImpl, Mockito.never()).deleteUsageVpnUser(usageEventVOMock, accountMock);
+    }
+}
\ No newline at end of file
diff --git a/usage/src/test/java/com/cloud/usage/UsageManagerTest.java b/usage/src/test/java/com/cloud/usage/UsageManagerTest.java
deleted file mode 100644
index 139b65d..0000000
--- a/usage/src/test/java/com/cloud/usage/UsageManagerTest.java
+++ /dev/null
@@ -1,113 +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.
-package com.cloud.usage;
-
-import java.util.Date;
-
-import javax.inject.Inject;
-import javax.naming.ConfigurationException;
-
-import junit.framework.TestCase;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.cloud.usage.parser.IPAddressUsageParser;
-import com.cloud.usage.parser.LoadBalancerUsageParser;
-import com.cloud.usage.parser.NetworkOfferingUsageParser;
-import com.cloud.usage.parser.NetworkUsageParser;
-import com.cloud.usage.parser.PortForwardingUsageParser;
-import com.cloud.usage.parser.SecurityGroupUsageParser;
-import com.cloud.usage.parser.StorageUsageParser;
-import com.cloud.usage.parser.VMInstanceUsageParser;
-import com.cloud.usage.parser.VPNUserUsageParser;
-import com.cloud.usage.parser.VmDiskUsageParser;
-import com.cloud.usage.parser.VolumeUsageParser;
-import com.cloud.user.AccountVO;
-import com.cloud.utils.component.ComponentContext;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = "classpath:/UsageManagerTestContext.xml")
-public class UsageManagerTest extends TestCase {
-    @Inject
-    UsageManagerImpl _usageMgr = null;
-    @Inject
-    VMInstanceUsageParser vmParser = null;
-    @Inject
-    IPAddressUsageParser ipParser = null;
-    @Inject
-    LoadBalancerUsageParser lbParser = null;
-    @Inject
-    NetworkOfferingUsageParser noParser = null;
-    @Inject
-    NetworkUsageParser netParser = null;
-    @Inject
-    VmDiskUsageParser vmdiskParser = null;
-    @Inject
-    PortForwardingUsageParser pfParser = null;
-    @Inject
-    SecurityGroupUsageParser sgParser = null;
-    @Inject
-    StorageUsageParser stParser = null;
-    @Inject
-    VolumeUsageParser volParser = null;
-    @Inject
-    VPNUserUsageParser vpnParser = null;
-
-    Date startDate = null;
-    Date endDate = null;
-
-    @Before
-    public void setup() throws Exception {
-        System.setProperty("pid", "5678");
-        ComponentContext.initComponentsLifeCycle();
-        startDate = new Date();
-        endDate = new Date(100000L + System.currentTimeMillis());
-    }
-
-    @Test
-    public void testParse() throws ConfigurationException {
-        UsageJobVO job = new UsageJobVO();
-        _usageMgr.parse(job, System.currentTimeMillis(), 100000L + System.currentTimeMillis());
-    }
-
-    @Test
-    public void testSchedule() throws ConfigurationException {
-        _usageMgr.scheduleParse();
-    }
-
-    @Test
-    public void testParsers() throws ConfigurationException {
-        AccountVO account = new AccountVO();
-        account.setId(2L);
-        VMInstanceUsageParser.parse(account, startDate, endDate);
-        IPAddressUsageParser.parse(account, startDate, endDate);
-        LoadBalancerUsageParser.parse(account, startDate, endDate);
-        NetworkOfferingUsageParser.parse(account, startDate, endDate);
-        NetworkUsageParser.parse(account, startDate, endDate);
-        VmDiskUsageParser.parse(account, startDate, endDate);
-        PortForwardingUsageParser.parse(account, startDate, endDate);
-        SecurityGroupUsageParser.parse(account, startDate, endDate);
-        StorageUsageParser.parse(account, startDate, endDate);
-        VolumeUsageParser.parse(account, startDate, endDate);
-        VPNUserUsageParser.parse(account, startDate, endDate);
-    }
-
-}
diff --git a/utils/conf/db.properties b/utils/conf/db.properties
index 3ed7039..6cf00d5 100644
--- a/utils/conf/db.properties
+++ b/utils/conf/db.properties
@@ -44,7 +44,7 @@
 db.cloud.timeBetweenEvictionRunsMillis=40000
 db.cloud.minEvictableIdleTimeMillis=240000
 db.cloud.poolPreparedStatements=false
-db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&serverTimezone=UTC
+db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'&serverTimezone=UTC
 
 # usage database settings
 db.usage.username=cloud
diff --git a/utils/pom.xml b/utils/pom.xml
index 93aa20c..8612e8a 100755
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.cloudstack</groupId>
         <artifactId>cloudstack</artifactId>
-        <version>4.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <dependencies>
@@ -51,14 +51,6 @@
             <artifactId>log4j</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-        </dependency>
-        <dependency>
             <groupId>cglib</groupId>
             <artifactId>cglib-nodep</artifactId>
         </dependency>
@@ -186,6 +178,10 @@
             <artifactId>jackson-databind</artifactId>
             <version>${cs.jackson.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/utils/src/main/java/com/cloud/utils/HumanReadableJson.java b/utils/src/main/java/com/cloud/utils/HumanReadableJson.java
new file mode 100644
index 0000000..eeb1a70
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/HumanReadableJson.java
@@ -0,0 +1,109 @@
+//
+// 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.utils;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
+
+public class HumanReadableJson {
+
+    private boolean changeValue;
+    private StringBuilder output = new StringBuilder();
+    private boolean firstElement = true;
+
+    private final String[] elementsToMatch = {
+            "bytesSent","bytesReceived","BytesWrite","BytesRead","bytesReadRate","bytesWriteRate","iopsReadRate",
+            "iopsWriteRate","ioRead","ioWrite","bytesWrite","bytesRead","networkkbsread","networkkbswrite",
+            "diskkbsread","diskkbswrite","minRam","maxRam","volumeSize", "size","newSize","memorykbs",
+            "memoryintfreekbs","memorytargetkbs","diskioread","diskiowrite","totalSize","capacityBytes",
+            "availableBytes","maxDownloadSizeInBytes","templateSize","templatePhySicalSize"
+    };
+
+    public static String getHumanReadableBytesJson(String json){
+        HumanReadableJson humanReadableJson = new HumanReadableJson();
+        humanReadableJson.addElement(json);
+        return humanReadableJson.output.toString();
+    }
+
+    private void addElement(String content) {
+        JsonParser parser = new JsonParser();
+        JsonElement jsonElement = parser.parse(content);
+        if (jsonElement.isJsonArray()) {
+            output.append("[");
+            addArray(jsonElement.toString());
+            output.append("]");
+            firstElement = false;
+        }
+        if (jsonElement.isJsonObject()) {
+            output.append("{");
+            firstElement = true;
+            addObject(jsonElement.getAsJsonObject().toString());
+            output.append("}");
+            firstElement = false;
+        }
+        if (jsonElement.isJsonPrimitive()) {
+            if (changeValue) {
+                output.append("\"" + toHumanReadableSize(jsonElement.getAsLong()) + "\"");
+            } else {
+                output.append("\"" + jsonElement.getAsString() + "\"");
+            }
+            firstElement = false;
+        }
+    }
+
+    private void addObject(String content) {
+        JsonParser parser = new JsonParser();
+        JsonElement el1 = parser.parse(content);
+        el1.getAsJsonObject().entrySet();
+        Iterator<Entry<String, JsonElement>> it = el1.getAsJsonObject().entrySet().iterator();
+        while(it.hasNext()) {
+            Entry<String, JsonElement> value = it.next();
+            String key = value.getKey();
+            if (!firstElement){
+                output.append(",");
+            }
+            output.append("\"" + key + "\":");
+            for (int i = 0; i < elementsToMatch.length; i++){
+                if (key.equals(elementsToMatch[i])) {
+                    changeValue = true;
+                    break;
+                }
+            }
+            addElement(value.getValue().toString());
+            changeValue = false;
+        }
+    }
+
+    private void addArray(String content) {
+        JsonParser parser = new JsonParser();
+        JsonArray ar1 = parser.parse(content).getAsJsonArray();
+        for (int count = 0; count < ar1.size(); count++) {
+            if (count > 0) {
+                output.append(",");
+            }
+            addElement(ar1.get(count).toString());
+        }
+    }
+}
diff --git a/utils/src/main/java/com/cloud/utils/NumbersUtil.java b/utils/src/main/java/com/cloud/utils/NumbersUtil.java
index 8b93a40..3d48344 100644
--- a/utils/src/main/java/com/cloud/utils/NumbersUtil.java
+++ b/utils/src/main/java/com/cloud/utils/NumbersUtil.java
@@ -43,6 +43,8 @@
         return NumberUtils.toFloat(s, defaultValue);
     }
 
+    public static Boolean enableHumanReadableSizes = true;
+
     /**
      * Converts bytes to long on input.
      */
@@ -74,7 +76,12 @@
     protected static final long GB = 1024 * MB;
     protected static final long TB = 1024 * GB;
 
-    public static String toReadableSize(long bytes) {
+    public static String toReadableSize(Long bytes) {
+
+        if (bytes == null){
+            return "null";
+        }
+
         if (bytes < KB && bytes >= 0) {
             return Long.toString(bytes) + " bytes";
         }
@@ -93,6 +100,13 @@
         return builder.toString();
     }
 
+    public static String toHumanReadableSize(long size) {
+        if (enableHumanReadableSizes){
+            return "(" + toReadableSize(size) + ") " + ((Long)size).toString();
+        }
+        return ((Long)size).toString();
+    }
+
     /**
      * Converts a string of the format 'yy-MM-dd'T'HH:mm:ss.SSS" into ms.
      *
diff --git a/utils/src/main/java/com/cloud/utils/UriUtils.java b/utils/src/main/java/com/cloud/utils/UriUtils.java
index 3796296..d2022c1 100644
--- a/utils/src/main/java/com/cloud/utils/UriUtils.java
+++ b/utils/src/main/java/com/cloud/utils/UriUtils.java
@@ -512,7 +512,7 @@
             ImmutableMap.<String, Set<String>>builder()
                         .put("vhd", buildExtensionSet(false, "vhd"))
                         .put("vhdx", buildExtensionSet(false, "vhdx"))
-                        .put("qcow2", buildExtensionSet(true, "qcow2"))
+                        .put("qcow2", buildExtensionSet(true, "qcow2", "img"))
                         .put("ova", buildExtensionSet(true, "ova"))
                         .put("tar", buildExtensionSet(false, "tar"))
                         .put("raw", buildExtensionSet(false, "img", "raw"))
@@ -630,7 +630,7 @@
         if (Strings.isNullOrEmpty(pvlanRange)) {
             return expandedVlans;
         }
-        String[] parts = pvlanRange.split("-i");
+        String[] parts = pvlanRange.split("-\\w");
         expandedVlans.add(Integer.parseInt(parts[0]));
         expandedVlans.add(Integer.parseInt(parts[1]));
         return expandedVlans;
diff --git a/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java b/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
index ace3b44..c48f446 100644
--- a/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
+++ b/utils/src/main/java/com/cloud/utils/backoff/impl/ConstantTimeBackoff.java
@@ -23,13 +23,10 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.backoff.BackoffAlgorithm;
 import com.cloud.utils.component.AdapterBase;
+import org.apache.log4j.Logger;
 
 /**
  * An implementation of BackoffAlgorithm that waits for some seconds.
@@ -44,7 +41,7 @@
 public class ConstantTimeBackoff extends AdapterBase implements BackoffAlgorithm, ConstantTimeBackoffMBean {
     long _time;
     private final Map<String, Thread> _asleep = new ConcurrentHashMap<String, Thread>();
-    private final static Log LOG = LogFactory.getLog(ConstantTimeBackoff.class);
+    private static final Logger LOG = Logger.getLogger(ConstantTimeBackoff.class.getName());
 
     @Override
     public void waitBeforeRetry() {
diff --git a/utils/src/main/java/com/cloud/utils/compression/CompressionUtil.java b/utils/src/main/java/com/cloud/utils/compression/CompressionUtil.java
new file mode 100644
index 0000000..20f0bc8
--- /dev/null
+++ b/utils/src/main/java/com/cloud/utils/compression/CompressionUtil.java
@@ -0,0 +1,58 @@
+//
+// 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.utils.compression;
+
+import org.apache.log4j.Logger;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class CompressionUtil {
+
+    private static final Logger s_logger = Logger.getLogger(CompressionUtil.class);
+
+    public byte[] compressString(String inputStr) throws IOException {
+        ByteArrayOutputStream obj = new ByteArrayOutputStream();
+        GZIPOutputStream gzip = new GZIPOutputStream(obj);
+        gzip.write(inputStr.getBytes(StandardCharsets.UTF_8));
+        gzip.close();
+        return obj.toByteArray();
+    }
+
+    public String decompressByteArary(byte[] compressed) throws IOException {
+        GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(compressed));
+        BufferedReader bf = new BufferedReader(new InputStreamReader(gis, StandardCharsets.UTF_8));
+        String line = bf.readLine();
+        StringBuilder builder = new StringBuilder();
+        while (line != null) {
+            builder.append(line);
+            line = bf.readLine();
+            if (line != null) {
+                builder.append("\n");
+            }
+        }
+        return builder.toString();
+    }
+}
diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
index 0fb055f..c60eac1 100644
--- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java
+++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java
@@ -1471,6 +1471,24 @@
         return URI.create("pvlan://" + primaryVlan + "-i" + isolatedPvlan);
     }
 
+    public static URI generateUriForPvlan(final String primaryVlan, final String isolatedPvlan, final String isolatedPvlanType) {
+        // Defaulting to isolated for backward compatibility
+        if (isolatedPvlan.length() < 1) {
+            return generateUriForPvlan(primaryVlan, isolatedPvlan);
+        }
+        char type = isolatedPvlanType.charAt(0);
+        switch(type) {
+            case 'c':
+            case 'C':
+                return URI.create("pvlan://" + primaryVlan + "-c" + isolatedPvlan);
+            case 'p':
+            case 'P':
+                return URI.create("pvlan://" + primaryVlan + "-p" + primaryVlan);
+            default :
+                return generateUriForPvlan(primaryVlan, isolatedPvlan);
+        }
+    }
+
     public static String getPrimaryPvlanFromUri(final URI uri) {
         final String[] vlans = uri.getHost().split("-");
         if (vlans.length < 1) {
@@ -1488,6 +1506,31 @@
             if (vlan.startsWith("i")) {
                 return vlan.replace("i", " ").trim();
             }
+            if (vlan.startsWith("p")) {
+                return vlan.replace("p", " ").trim();
+            }
+            if (vlan.startsWith("c")) {
+                return vlan.replace("c", " ").trim();
+            }
+        }
+        return null;
+    }
+
+    public static String getPvlanTypeFromUri(final URI uri) {
+        final String[] vlans = uri.getHost().split("-");
+        if (vlans.length < 2) {
+            return null;
+        }
+        for (final String vlan : vlans) {
+            if (vlan.startsWith("i")) {
+                return "I";
+            }
+            if (vlan.startsWith("p")) {
+                return "P";
+            }
+            if (vlan.startsWith("c")) {
+                return "C";
+            }
         }
         return null;
     }
diff --git a/utils/src/main/java/com/cloud/utils/xmlobject/XmlObject.java b/utils/src/main/java/com/cloud/utils/xmlobject/XmlObject.java
index 42af945..b3b5bd1 100644
--- a/utils/src/main/java/com/cloud/utils/xmlobject/XmlObject.java
+++ b/utils/src/main/java/com/cloud/utils/xmlobject/XmlObject.java
@@ -27,7 +27,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
+import org.apache.log4j.Logger;
 
 import com.cloud.utils.exception.CloudRuntimeException;
 
diff --git a/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishClient.java b/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishClient.java
new file mode 100644
index 0000000..8b211c0
--- /dev/null
+++ b/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishClient.java
@@ -0,0 +1,414 @@
+//
+// 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.utils.redfish;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.concurrent.TimeUnit;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+
+import com.cloud.utils.nio.TrustAllManager;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.protocol.HTTP;
+import org.apache.log4j.Logger;
+
+import com.cloud.utils.net.NetUtils;
+import com.google.common.net.InternetDomainName;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+/**
+ * Provides support to a set of REST requests that can be sent to a Redfish Server. </br>
+ * RedfishClient allows to gather the server Power State, and execute Reset
+ * actions such as 'On', 'ForceOff', 'GracefulShutdown', 'GracefulRestart' etc.
+ */
+public class RedfishClient {
+
+    private static final Logger LOGGER = Logger.getLogger(RedfishClient.class);
+
+    private String username;
+    private String password;
+    private boolean useHttps;
+    private boolean ignoreSsl;
+    private int redfishRequestMaxRetries;
+
+    private final static String SYSTEMS_URL_PATH = "redfish/v1/Systems/";
+    private final static String COMPUTER_SYSTEM_RESET_URL_PATH = "/Actions/ComputerSystem.Reset";
+    private final static String REDFISH_RESET_TYPE = "ResetType";
+    private final static String POWER_STATE = "PowerState";
+    private final static String APPLICATION_JSON = "application/json";
+    private final static String ACCEPT = "accept";
+    private final static String ODATA_ID = "@odata.id";
+    private final static String MEMBERS = "Members";
+    private final static String EXPECTED_HTTP_STATUS = "2XX";
+    private final static int WAIT_FOR_REQUEST_RETRY = 2;
+
+
+    /**
+     * Redfish Command type: </br>
+     * <b>ComputerSystemReset:</b> execute Redfish reset commands ({@link RedfishResetCmd}). </br>
+     * <b>GetSystemId:</b> get the system ID. </br>
+     * <b>GetPowerState:</b> used for get the system power state. </br>
+     */
+    public enum
+    RedfishCmdType {
+        ComputerSystemReset, GetSystemId, GetPowerState
+    }
+
+    /**
+     * Redfish System Power State: </br>
+     * <b>Off:</b> The state is powered Off. </br>
+     * <b>On:</b> The state is powered On. </br>
+     * <b>PoweringOff:</b> A temporary state between On and Off. </br>
+     * <b>PoweringOn:</b> A temporary state between Off and On.
+     */
+    public enum RedfishPowerState {
+        On, Off, PoweringOn, PoweringOff
+    }
+
+    /**
+     * <ul>
+     * <li><b>ForceOff:</b> Turn the unit off immediately (non-graceful shutdown).
+     * <li><b>ForceOn:</b> Turn the unit on immediately.
+     * <li><b>ForceRestart:</b> Perform an immediate (non-graceful) shutdown,
+     * followed by a restart.
+     * <li><b>GracefulRestart:</b> Perform a graceful shutdown followed by a restart
+     * of the system.
+     * <li><b>GracefulShutdown:</b> Perform a graceful shutdown and power off.
+     * <li><b>Nmi:</b> Generate a Diagnostic Interrupt (usually an NMI on x86
+     * systems) to cease normal operations, perform diagnostic actions and typically
+     * halt the system.
+     * <li><b>On:</b> Turn the unit on.
+     * <li><b>PowerCycle:</b> Perform a power cycle of the unit.
+     * <li><b>PushPowerButton:</b> Simulate the pressing of the physical power
+     * button on this unit.
+     * </ul>
+     */
+    public enum RedfishResetCmd {
+        ForceOff, ForceOn, ForceRestart, GracefulRestart, GracefulShutdown, Nmi, On, PowerCycle, PushPowerButton
+    }
+
+    public RedfishClient(String username, String password, boolean useHttps, boolean ignoreSsl, int redfishRequestRetries) {
+        this.username = username;
+        this.password = password;
+        this.useHttps = useHttps;
+        this.ignoreSsl = ignoreSsl;
+        this.redfishRequestMaxRetries = redfishRequestRetries;
+    }
+
+    protected String buildRequestUrl(String hostAddress, RedfishCmdType cmd, String resourceId) {
+        String urlHostAddress = validateAddressAndPrepareForUrl(hostAddress);
+        String requestPath = getRequestPathForCommand(cmd, resourceId);
+
+        if (useHttps) {
+            return String.format("https://%s/%s", urlHostAddress, requestPath);
+        } else {
+            return String.format("http://%s/%s", urlHostAddress, requestPath);
+        }
+    }
+
+    /**
+     * Executes a GET request for the given URL address.
+     */
+    protected HttpResponse executeGetRequest(String url) {
+        URIBuilder builder = null;
+        HttpGet httpReq = null;
+        try {
+            builder = new URIBuilder(url);
+            httpReq = new HttpGet(builder.build());
+        } catch (URISyntaxException e) {
+            throw new RedfishException(String.format("Failed to create URI for GET request [URL: %s] due to exception.", url), e);
+        }
+
+        prepareHttpRequestBasicAuth(httpReq);
+        return executeHttpRequest(url, httpReq);
+    }
+
+    /**
+     * Executes a POST request for the given URL address and Json object.
+     */
+    private HttpResponse executePostRequest(String url, JsonObject jsonToSend) {
+        HttpPost httpReq = null;
+        try {
+            URIBuilder builder = new URIBuilder(url);
+            httpReq = new HttpPost(builder.build());
+            httpReq.addHeader(HTTP.CONTENT_TYPE, APPLICATION_JSON);
+            httpReq.setEntity(new StringEntity(jsonToSend.toString()));
+        } catch (URISyntaxException | UnsupportedEncodingException e) {
+            throw new RedfishException(String.format("Failed to create URI for POST request [URL: %s] due to exception.", url), e);
+        }
+
+        prepareHttpRequestBasicAuth(httpReq);
+        return executeHttpRequest(url, httpReq);
+    }
+
+    /**
+     * Prepare http request to accept JSON and basic authentication
+     */
+    private void prepareHttpRequestBasicAuth(HttpRequestBase httpReq) {
+        httpReq.addHeader(ACCEPT, APPLICATION_JSON);
+        String encoding = basicAuth(username, password);
+        httpReq.addHeader("Authorization", encoding);
+    }
+
+    /**
+     * Encodes 'username:password' into 64-base encoded String
+     */
+    private static String basicAuth(String username, String password) {
+        return "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes());
+    }
+
+    /**
+     * Executes Http request according to URL and HttpRequestBase (e.g. HttpGet, HttpPost)
+     */
+    private HttpResponse executeHttpRequest(String url, HttpRequestBase httpReq) {
+        HttpClient client = null;
+        if (ignoreSsl) {
+            try {
+                client = ignoreSSLCertValidator();
+            } catch (NoSuchAlgorithmException | KeyManagementException e) {
+                throw new RedfishException(String.format("Failed to handle SSL Cert validator on POST request [URL: %s] due to exception.", url), e);
+            }
+        } else {
+            client = HttpClientBuilder.create().build();
+        }
+
+        try {
+            return client.execute(httpReq);
+        } catch (IOException e) {
+            if (redfishRequestMaxRetries == 0) {
+                throw new RedfishException(String.format("Failed to execute HTTP %s request [URL: %s] due to exception %s.", httpReq.getMethod(), url, e), e);
+            }
+            return retryHttpRequest(url, httpReq, client);
+        }
+    }
+
+    protected HttpResponse retryHttpRequest(String url, HttpRequestBase httpReq, HttpClient client) {
+        LOGGER.warn(String.format("Failed to execute HTTP %s request [URL: %s]. Executing the request again.", httpReq.getMethod(), url));
+        HttpResponse response = null;
+        for (int attempt = 1; attempt < redfishRequestMaxRetries + 1; attempt++) {
+            try {
+                TimeUnit.SECONDS.sleep(WAIT_FOR_REQUEST_RETRY);
+                LOGGER.debug(String.format("Retry HTTP %s request [URL: %s], attempt %d/%d.", httpReq.getMethod(), url, attempt, redfishRequestMaxRetries));
+                response = client.execute(httpReq);
+            } catch (IOException | InterruptedException e) {
+                if (attempt == redfishRequestMaxRetries) {
+                    throw new RedfishException(String.format("Failed to execute HTTP %s request retry attempt %d/%d [URL: %s] due to exception %s", httpReq.getMethod(), attempt, redfishRequestMaxRetries,url, e));
+                } else {
+                    LOGGER.warn(
+                            String.format("Failed to execute HTTP %s request retry attempt %d/%d [URL: %s] due to exception %s", httpReq.getMethod(), attempt, redfishRequestMaxRetries,
+                                    url, e));
+                }
+            }
+        }
+
+        if (response == null) {
+            throw new RedfishException(String.format("Failed to execute HTTP %s request [URL: %s].", httpReq.getMethod(), url));
+        }
+
+        LOGGER.debug(String.format("Successfully executed HTTP %s request [URL: %s].", httpReq.getMethod(), url));
+        return response;
+    }
+
+    /**
+     *  Returns the proper URL path for the given Redfish command ({@link RedfishCmdType}).
+     */
+    private String getRequestPathForCommand(RedfishCmdType cmd, String resourceId) {
+        switch (cmd) {
+        case GetSystemId:
+            return SYSTEMS_URL_PATH;
+        case GetPowerState:
+            if (StringUtils.isBlank(resourceId)) {
+                throw new RedfishException(String.format("Command '%s' requires a valid resource ID '%s'.", cmd, resourceId));
+            }
+            return String.format("%s%s", SYSTEMS_URL_PATH, resourceId);
+        case ComputerSystemReset:
+            if (StringUtils.isBlank(resourceId)) {
+                throw new RedfishException(String.format("Command '%s' requires a valid resource ID '%s'.", cmd, resourceId));
+            }
+            return String.format("%s%s%s", SYSTEMS_URL_PATH, resourceId, COMPUTER_SYSTEM_RESET_URL_PATH);
+        default:
+            throw new RedfishException(String.format("Redfish client does not support command '%s'.", cmd));
+        }
+    }
+
+    /**
+     * Validates the host address. It needs to be either a valid host domain name, or a valid IP address (IPv6 or IPv4).
+     */
+    protected String validateAddressAndPrepareForUrl(String hostAddress) {
+        if (NetUtils.isValidIp6(hostAddress)) {
+            return String.format("[%s]", hostAddress);
+        } else if (NetUtils.isValidIp4(hostAddress)) {
+            return hostAddress;
+        } else if (InternetDomainName.isValid(hostAddress)) {
+            return hostAddress;
+        } else {
+            throw new RedfishException(String.format("Redfish host address '%s' is not a valid IPv4/IPv6 address nor a valid domain name.", hostAddress));
+        }
+    }
+
+    /**
+     * Sends a POST request for a ComputerSystem with the Reset command ({@link RedfishResetCmd}, e.g. RedfishResetCmd.GracefulShutdown). </br> </br>
+     * <b>URL example:</b> https://[host address]/redfish/v1/Systems/[System ID]/Actions/ComputerSystem.Reset
+     */
+    public void executeComputerSystemReset(String hostAddress, RedfishResetCmd resetCommand) {
+        String systemId = getSystemId(hostAddress);
+        String url = buildRequestUrl(hostAddress, RedfishCmdType.ComputerSystemReset, systemId);
+        JsonObject resetType = new JsonObject();
+        resetType.addProperty(REDFISH_RESET_TYPE, resetCommand.toString());
+
+        CloseableHttpResponse response = (CloseableHttpResponse)executePostRequest(url, resetType);
+
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (statusCode < HttpStatus.SC_OK || statusCode >= HttpStatus.SC_MULTIPLE_CHOICES) {
+            throw new RedfishException(String.format("Failed to get System power state for host '%s' with request '%s: %s'. The expected HTTP status code is '%s' but it got '%s'.",
+                    HttpGet.METHOD_NAME, url, hostAddress, EXPECTED_HTTP_STATUS, statusCode));
+        }
+        LOGGER.debug(String.format("Sending ComputerSystem.Reset Command '%s' to host '%s' with request '%s %s'", resetCommand, hostAddress, HttpPost.METHOD_NAME, url));
+    }
+
+    /**
+     *  Returns the System ID. Used when sending Computer System requests (e.g. ComputerSystem.Reset request).
+     */
+    public String getSystemId(String hostAddress) {
+        String url = buildRequestUrl(hostAddress, RedfishCmdType.GetSystemId, null);
+        CloseableHttpResponse response = (CloseableHttpResponse)executeGetRequest(url);
+
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (statusCode != HttpStatus.SC_OK) {
+            throw new RedfishException(String.format("Failed to get System ID for host '%s' with request '%s: %s'. HTTP status code expected '%s' but it got '%s'.", hostAddress,
+                    HttpGet.METHOD_NAME, url, HttpStatus.SC_OK, statusCode));
+        }
+
+        String systemId = processGetSystemIdResponse(response);
+
+        LOGGER.debug(String.format("Retrieved System ID '%s' with request '%s: %s'", systemId, HttpGet.METHOD_NAME, url));
+
+        return systemId;
+    }
+
+    /**
+     * Processes the response of request GET System ID as a JSON object.
+     */
+    protected String processGetSystemIdResponse(CloseableHttpResponse response) {
+        InputStream in;
+        String jsonString;
+        try {
+            in = response.getEntity().getContent();
+            BufferedReader streamReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
+            jsonString = streamReader.readLine();
+        } catch (UnsupportedOperationException | IOException e) {
+            throw new RedfishException("Failed to process system Response", e);
+        }
+
+        // retrieving the system ID (e.g. 'System.Embedded.1') via JsonParser:
+        // (...) Members":[{"@odata.id":"/redfish/v1/Systems/System.Embedded.1"}] (...)
+        JsonArray jArray = new JsonParser().parse(jsonString).getAsJsonObject().get(MEMBERS).getAsJsonArray();
+        JsonObject jsonnObject = jArray.get(0).getAsJsonObject();
+        String jsonObjectAsString = jsonnObject.get(ODATA_ID).getAsString();
+        String[] arrayOfStrings = StringUtils.split(jsonObjectAsString, '/');
+
+        return arrayOfStrings[arrayOfStrings.length - 1];
+    }
+
+    /**
+     * Returns the Redfish system Power State ({@link RedfishPowerState}).
+     */
+    public RedfishPowerState getSystemPowerState(String hostAddress) {
+        String systemId = getSystemId(hostAddress);
+
+        String url = buildRequestUrl(hostAddress, RedfishCmdType.GetPowerState, systemId);
+        CloseableHttpResponse response = (CloseableHttpResponse)executeGetRequest(url);
+
+        int statusCode = response.getStatusLine().getStatusCode();
+        if (statusCode != HttpStatus.SC_OK) {
+            throw new RedfishException(String.format("Failed to get System power state for host '%s' with request '%s: %s'. The expected HTTP status code is '%s' but it got '%s'.",
+                    HttpGet.METHOD_NAME, url, hostAddress, HttpStatus.SC_OK, statusCode));
+        }
+
+        RedfishPowerState powerState = processGetSystemRequestResponse(response);
+        LOGGER.debug(String.format("Retrieved System power state '%s' with request '%s: %s'", powerState, HttpGet.METHOD_NAME, url));
+        return powerState;
+    }
+
+    /**
+     * Process 'ComputerSystem' GET request response and return as a RedfishPowerState
+     */
+    protected RedfishPowerState processGetSystemRequestResponse(CloseableHttpResponse response) {
+        InputStream in;
+        String jsonString = null;
+        try {
+            in = response.getEntity().getContent();
+            BufferedReader streamReader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
+
+            jsonString = streamReader.readLine();
+            String powerState = new JsonParser().parse(jsonString).getAsJsonObject().get(POWER_STATE).getAsString();
+            return RedfishPowerState.valueOf(powerState);
+        } catch (UnsupportedOperationException | IOException e) {
+            throw new RedfishException("Failed to process system response due to exception", e);
+        }
+    }
+
+    /**
+     * Ignores SSL certififcation validator.
+     */
+    private CloseableHttpClient ignoreSSLCertValidator() throws NoSuchAlgorithmException, KeyManagementException {
+        TrustManager[] trustAllCerts = new TrustManager[]{new TrustAllManager()};
+
+        SSLContext sslContext = SSLContext.getInstance("SSL");
+        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
+        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
+
+        HostnameVerifier allHostsValid = new HostnameVerifier() {
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+
+        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
+        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, allHostsValid);
+        return HttpClientBuilder.create().setSSLSocketFactory(socketFactory).build();
+    }
+}
diff --git a/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishException.java b/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishException.java
new file mode 100644
index 0000000..0ff6fc4
--- /dev/null
+++ b/utils/src/main/java/org/apache/cloudstack/utils/redfish/RedfishException.java
@@ -0,0 +1,31 @@
+//
+// 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.utils.redfish;
+
+public class RedfishException extends RuntimeException {
+
+    public RedfishException(String message) {
+        super(message);
+    }
+
+    public RedfishException(String message, Exception e) {
+        super(message, e);
+    }
+
+}
diff --git a/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java b/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java
index 5ff5819..9a4a695 100644
--- a/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java
+++ b/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasySSLProtocolSocketFactory.java
@@ -24,8 +24,7 @@
 import org.apache.commons.httpclient.HttpClientError;
 import org.apache.commons.httpclient.params.HttpConnectionParams;
 import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.Logger;
 
 import javax.net.SocketFactory;
 import javax.net.ssl.SSLContext;
@@ -88,7 +87,7 @@
 public class EasySSLProtocolSocketFactory implements ProtocolSocketFactory {
 
     /** Log object for this class. */
-    private static final Log LOG = LogFactory.getLog(EasySSLProtocolSocketFactory.class);
+    private static final Logger LOG = Logger.getLogger(EasySSLProtocolSocketFactory.class.getName());
 
     private SSLContext sslcontext = null;
 
diff --git a/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasyX509TrustManager.java b/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasyX509TrustManager.java
index eb23eb2..321d287 100644
--- a/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasyX509TrustManager.java
+++ b/utils/src/main/java/org/apache/commons/httpclient/contrib/ssl/EasyX509TrustManager.java
@@ -29,8 +29,7 @@
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.X509TrustManager;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.Logger;
 
 /**
  * <p>
@@ -58,7 +57,7 @@
     private X509TrustManager standardTrustManager = null;
 
     /** Log object for this class. */
-    private static final Log LOG = LogFactory.getLog(EasyX509TrustManager.class);
+    private static final Logger LOG = Logger.getLogger(EasyX509TrustManager.class.getName());
 
     /**
      * Constructor for EasyX509TrustManager.
@@ -83,7 +82,7 @@
     }
 
     /**
-     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],String authType)
+     * @see X509TrustManager#checkServerTrusted(X509Certificate[],String authType)
      */
     @Override
     public void checkServerTrusted(X509Certificate[] certificates, String authType) throws CertificateException {
diff --git a/utils/src/main/resources/cloud.keystore b/utils/src/main/resources/cloud.keystore
index 33d7777..d029ebc 100644
--- a/utils/src/main/resources/cloud.keystore
+++ b/utils/src/main/resources/cloud.keystore
Binary files differ
diff --git a/utils/src/test/java/com/cloud/utils/HumanReadableJsonTest.java b/utils/src/test/java/com/cloud/utils/HumanReadableJsonTest.java
new file mode 100644
index 0000000..de96756
--- /dev/null
+++ b/utils/src/test/java/com/cloud/utils/HumanReadableJsonTest.java
@@ -0,0 +1,66 @@
+//
+// 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.utils;
+
+import org.junit.Test;
+
+import java.util.Locale;
+import static org.junit.Assert.assertEquals;
+import static com.cloud.utils.HumanReadableJson.getHumanReadableBytesJson;
+
+public class HumanReadableJsonTest {
+
+    @Test
+    public void parseJsonObjectTest() {
+        assertEquals("{}", getHumanReadableBytesJson("{}"));
+    }
+    @Test
+    public void parseJsonArrayTest() {
+        assertEquals("[]", getHumanReadableBytesJson("[]"));
+        assertEquals("[[],[]]", getHumanReadableBytesJson("[[],[]]"));
+        assertEquals("[{},{}]", getHumanReadableBytesJson("[{},{}]"));
+    }
+    @Test
+    public void parseSimpleJsonTest() {
+        assertEquals("[{\"object\":{}}]", getHumanReadableBytesJson("[{\"object\":{}}]"));
+    }
+    @Test
+    public void parseComplexJsonTest() {
+        assertEquals("[{\"object\":[],\"object2\":[]},{}]", getHumanReadableBytesJson("[{\"object\":[],\"object2\":[]},{}]"));
+        assertEquals("[{\"object\":{},\"object2\":{}}]", getHumanReadableBytesJson("[{\"object\":{},\"object2\":{}}]"));
+        assertEquals("[{\"object\":[{},{}]}]", getHumanReadableBytesJson("[{\"object\":[{},{}]}]"));
+        assertEquals("[{\"object\":[]},{\"object\":[]}]", getHumanReadableBytesJson("[{\"object\":[]},{\"object\":[]}]"));
+        assertEquals("[{\"object\":[{\"object\":[]}]},{\"object\":[]}]", getHumanReadableBytesJson("[{\"object\":[{\"object\":[]}]},{\"object\":[]}]"));
+    }
+    @Test
+    public void parseMatchJsonTest() {
+        assertEquals("[{\"size\":\"(0 bytes) 0\"}]", getHumanReadableBytesJson("[{\"size\": \"0\"}]"));
+        assertEquals("[{\"size\":\"(0 bytes) 0\",\"bytesSent\":\"(0 bytes) 0\"}]", getHumanReadableBytesJson("[{\"size\": \"0\", \"bytesSent\": \"0\"}]"));
+    }
+
+    @Test
+    public void localeTest() {
+        Locale.setDefault(Locale.UK); // UK test
+        assertEquals("[{\"size\":\"(100.05 KB) 102456\"}]", getHumanReadableBytesJson("[{\"size\": \"102456\"}]"));
+        Locale.setDefault(Locale.US); // US test
+        assertEquals("[{\"size\":\"(100.05 KB) 102456\"}]", getHumanReadableBytesJson("[{\"size\": \"102456\"}]"));
+        Locale.setDefault(Locale.forLanguageTag("en-ZA")); // Other region test
+        assertEquals("[{\"size\":\"(100,05 KB) 102456\"}]", getHumanReadableBytesJson("[{\"size\": \"102456\"}]"));
+    }
+}
diff --git a/utils/src/test/java/com/cloud/utils/NumbersUtilTest.java b/utils/src/test/java/com/cloud/utils/NumbersUtilTest.java
index 82b2305..55dfaab 100644
--- a/utils/src/test/java/com/cloud/utils/NumbersUtilTest.java
+++ b/utils/src/test/java/com/cloud/utils/NumbersUtilTest.java
@@ -31,10 +31,10 @@
     public void toReadableSize() {
         Locale.setDefault(Locale.US); // Fixed locale for the test
         assertEquals("1.0000 TB", NumbersUtil.toReadableSize((1024l * 1024l * 1024l * 1024l)));
-        assertEquals("1.00 GB", NumbersUtil.toReadableSize(1024 * 1024 * 1024));
-        assertEquals("1.00 MB", NumbersUtil.toReadableSize(1024 * 1024));
-        assertEquals("1.00 KB", NumbersUtil.toReadableSize((1024)));
-        assertEquals("1023 bytes", NumbersUtil.toReadableSize((1023)));
+        assertEquals("1.00 GB", NumbersUtil.toReadableSize(1024L * 1024 * 1024));
+        assertEquals("1.00 MB", NumbersUtil.toReadableSize(1024L * 1024));
+        assertEquals("1.00 KB", NumbersUtil.toReadableSize((1024L)));
+        assertEquals("1023 bytes", NumbersUtil.toReadableSize((1023L)));
     }
 
     @Test
@@ -44,4 +44,9 @@
         assertEquals(257, NumbersUtil.bytesToLong(new byte[] {0, 0, 0, 0, 0, 0, 1, 1}));
     }
 
+    @Test
+    public void nullToLong() {
+        assertEquals("null", NumbersUtil.toReadableSize(null));
+    }
+
 }
diff --git a/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java b/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java
index 9b29c86..6f104f4 100644
--- a/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java
+++ b/utils/src/test/java/com/cloud/utils/UriUtilsParametrizedTest.java
@@ -102,7 +102,10 @@
             final String realFormat = format;
 
             for (String extension : FORMATS) {
-                final boolean expectSuccess = format.equals(extension.replace("img", "raw"));
+                boolean expectSuccess = format.equals(extension.replace("img", "raw"));
+                if (format.equals("qcow2") && extension.equals("img")) {
+                    expectSuccess = true;
+                }
 
                 for (String commpressionFormat : COMMPRESSION_FORMATS) {
                     final String url = validBaseUri + extension + commpressionFormat;
diff --git a/utils/src/test/java/com/cloud/utils/backoff/impl/ConstantTimeBackoffTest.java b/utils/src/test/java/com/cloud/utils/backoff/impl/ConstantTimeBackoffTest.java
index d397511..e1b029e 100644
--- a/utils/src/test/java/com/cloud/utils/backoff/impl/ConstantTimeBackoffTest.java
+++ b/utils/src/test/java/com/cloud/utils/backoff/impl/ConstantTimeBackoffTest.java
@@ -21,13 +21,12 @@
 
 import java.util.HashMap;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.Logger;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class ConstantTimeBackoffTest {
-    final static private Log LOG = LogFactory.getLog(ConstantTimeBackoffTest.class);
+    private static final Logger LOG = Logger.getLogger(ConstantTimeBackoffTest.class.getName());
 
     @Test
     public void waitBeforeRetryWithInterrupt() throws InterruptedException {
diff --git a/utils/src/test/java/com/cloud/utils/compression/CompressionUtilTest.java b/utils/src/test/java/com/cloud/utils/compression/CompressionUtilTest.java
new file mode 100644
index 0000000..e247d6c
--- /dev/null
+++ b/utils/src/test/java/com/cloud/utils/compression/CompressionUtilTest.java
@@ -0,0 +1,128 @@
+//
+// 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.utils.compression;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class CompressionUtilTest {
+
+    private CompressionUtil util = new CompressionUtil();
+
+    private String testEula = "END USER LICENSE AGREEMENT\n" +
+            "\n" +
+            "IMPORTANT: PLEASE READ THIS END USER LICENSE AGREEMENT CAREFULLY. IT IS VERY IMPORTANT THAT YOU CHECK THAT YOU ARE PURCHASING CISCO SOFTWARE OR EQUIPMENT FROM AN APPROVED SOURCE AND THAT YOU, OR THE ENTITY YOU REPRESENT (COLLECTIVELY, THE \"CUSTOMER\") HAVE BEEN REGISTERED AS THE END USER FOR THE PURPOSES OF THIS CISCO END USER LICENSE AGREEMENT. IF YOU ARE NOT REGISTERED AS THE END USER YOU HAVE NO LICENSE TO USE THE SOFTWARE AND THE LIMITED WARRANTY IN THIS END USER LICENSE AGREEMENT DOES NOT APPLY. ASSUMING YOU HAVE PURCHASED FROM AN APPROVED SOURCE, DOWNLOADING, INSTALLING OR USING CISCO OR CISCO-SUPPLIED SOFTWARE CONSTITUTES ACCEPTANCE OF THIS AGREEMENT.\n" +
+            "\n" +
+            "CISCO SYSTEMS, INC. OR ITS AFFILIATE LICENSING THE SOFTWARE (\"CISCO\") IS WILLING TO LICENSE THIS SOFTWARE TO YOU ONLY UPON THE CONDITION THAT YOU PURCHASED THE SOFTWARE FROM AN APPROVED SOURCE AND THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS END USER LICENSE AGREEMENT PLUS ANY ADDITIONAL LIMITATIONS ON THE LICENSE SET FORTH IN A SUPPLEMENTAL LICENSE AGREEMENT ACCOMPANYING THE PRODUCT, MADE AVAILABLE AT THE TIME OF YOUR ORDER, OR POSTED ON THE CISCO WEBSITE AT www.cisco.com/go/terms (COLLECTIVELY THE \"AGREEMENT\"). TO THE EXTENT OF ANY CONFLICT BETWEEN THE TERMS OF THIS END USER LICENSE AGREEMENT AND ANY SUPPLEMENTAL LICENSE AGREEMENT, THE SUPPLEMENTAL " +
+            "LICENSE AGREEMENT SHALL APPLY. BY DOWNLOADING, INSTALLING, OR USING THE SOFTWARE, YOU ARE REPRESENTING THAT YOU PURCHASED THE SOFTWARE FROM AN APPROVED SOURCE AND BINDING YOURSELF TO THE AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THE TERMS OF THE AGREEMENT, THEN CISCO IS UNWILLING TO LICENSE THE SOFTWARE TO YOU AND (A) YOU MAY NOT DOWNLOAD, INSTALL OR USE THE SOFTWARE, AND (B) YOU MAY RETURN THE SOFTWARE (INCLUDING ANY UNOPENED CD PACKAGE AND ANY WRITTEN MATERIALS) FOR A FULL REFUND, OR, IF THE SOFTWARE AND WRITTEN MATERIALS ARE SUPPLIED AS PART OF ANOTHER PRODUCT, YOU MAY RETURN THE ENTIRE PRODUCT FOR A FULL REFUND. YOUR RIGHT TO RETURN AND REFUND EXPIRES 30 " +
+            "DAYS AFTER PURCHASE FROM AN APPROVED SOURCE, AND APPLIES ONLY IF YOU ARE THE ORIGINAL AND REGISTERED END USER PURCHASER. FOR THE PURPOSES OF THIS END USER LICENSE AGREEMENT, AN \"APPROVED SOURCE\" MEANS (A) CISCO; OR (B) A DISTRIBUTOR OR SYSTEMS INTEGRATOR AUTHORIZED BY CISCO TO DISTRIBUTE / SELL CISCO EQUIPMENT, SOFTWARE AND SERVICES WITHIN YOUR TERRITORY TO END USERS; OR (C) A RESELLER AUTHORIZED BY ANY SUCH DISTRIBUTOR OR SYSTEMS INTEGRATOR IN ACCORDANCE WITH THE TERMS OF THE DISTRIBUTOR'S AGREEMENT WITH CISCO TO DISTRIBUTE / SELL THE CISCO EQUIPMENT, SOFTWARE AND SERVICES WITHIN YOUR TERRITORY TO END USERS.\n" +
+            "\n" +
+            "THE FOLLOWING TERMS OF THE AGREEMENT GOVERN CUSTOMER'S USE OF THE SOFTWARE (DEFINED BELOW), EXCEPT TO THE EXTENT: (A) THERE IS A SEPARATE SIGNED CONTRACT BETWEEN CUSTOMER AND CISCO GOVERNING CUSTOMER'S USE OF THE SOFTWARE, OR (B) THE SOFTWARE INCLUDES A SEPARATE \"CLICK-ACCEPT\" LICENSE AGREEMENT OR THIRD PARTY LICENSE AGREEMENT AS PART OF THE INSTALLATION OR DOWNLOAD PROCESS GOVERNING CUSTOMER'S USE OF THE SOFTWARE. TO THE EXTENT OF A CONFLICT BETWEEN THE PROVISIONS OF THE FOREGOING DOCUMENTS, THE ORDER OF PRECEDENCE SHALL BE (1)THE SIGNED CONTRACT, (2) THE CLICK-ACCEPT AGREEMENT OR THIRD PARTY LICENSE AGREEMENT, AND (3) THE AGREEMENT. FOR PURPOSES OF THE " +
+            "AGREEMENT, \"SOFTWARE\" SHALL MEAN COMPUTER PROGRAMS, INCLUDING FIRMWARE AND COMPUTER PROGRAMS EMBEDDED IN CISCO EQUIPMENT, AS PROVIDED TO CUSTOMER BY AN APPROVED SOURCE, AND ANY UPGRADES, UPDATES, BUG FIXES OR MODIFIED VERSIONS THERETO (COLLECTIVELY, \"UPGRADES\"), ANY OF THE SAME WHICH HAS BEEN RELICENSED UNDER THE CISCO SOFTWARE TRANSFER AND RE-LICENSING POLICY (AS MAY BE AMENDED BY CISCO FROM TIME TO TIME) OR BACKUP COPIES OF ANY OF THE FOREGOING.\n" +
+            "\n" +
+            "License. Conditioned upon compliance with the terms and conditions of the Agreement, Cisco grants to Customer a nonexclusive and nontransferable license to use for Customer's internal business purposes the Software and the Documentation for which Customer has paid the required license fees to an Approved Source. \"Documentation\" means written information (whether contained in user or technical manuals, training materials, specifications or otherwise) pertaining to the Software and made available by an Approved Source with the Software in any manner (including on CD-Rom, or on-line). In order to use the Software, Customer may be required to input a registration number or product authorization key and register Customer's copy of the Software online at Cisco's website to obtain the necessary license key or license file.\n" +
+            "\n" +
+            "Customer's license to use the Software shall be limited to, and Customer shall not use the Software in excess of, a single hardware chassis or card or such other limitations as are set forth in the applicable Supplemental License Agreement or in the applicable purchase order which has been accepted by an Approved Source and for which Customer has paid to an Approved Source the required license fee (the \"Purchase Order\").\n" +
+            "\n" +
+            "Unless otherwise expressly provided in the Documentation or any applicable Supplemental License Agreement, Customer shall use the Software solely as embedded in, for execution on, or (where the applicable Documentation permits installation on non-Cisco equipment) for communication with Cisco equipment owned or leased by Customer and used for Customer's internal business purposes. No other licenses are granted by implication, estoppel or otherwise.\n" +
+            "\n" +
+            "For evaluation or beta copies for which Cisco does not charge a license fee, the above requirement to pay license fees does not apply.\n" +
+            "\n" +
+            "General Limitations. This is a license, not a transfer of title, to the Software and Documentation, and Cisco retains ownership of all copies of the Software and Documentation. Customer acknowledges that the Software and Documentation contain trade secrets of Cisco or its suppliers or licensors, including but not limited to the specific internal design and structure of individual programs and associated interface information. Except as otherwise expressly provided under the Agreement, Customer shall only use the Software in connection with the use of Cisco equipment purchased by the Customer from an Approved Source and Customer shall have no right, and Customer specifically agrees not to:\n" +
+            "\n" +
+            "(i) transfer, assign or sublicense its license rights to any other person or entity (other than in compliance with any Cisco relicensing/transfer policy then in force), or use the Software on Cisco equipment not purchased by the Customer from an Approved Source or on secondhand Cisco equipment, and Customer acknowledges that any attempted transfer, assignment, sublicense or use shall be void;\n" +
+            "\n" +
+            "(ii) make error corrections to or otherwise modify or adapt the Software or create derivative works based upon the Software, or permit third parties to do the same;\n" +
+            "\n" +
+            "(iii) reverse engineer or decompile, decrypt, disassemble or otherwise reduce the Software to human-readable form, except to the extent otherwise expressly permitted under applicable law notwithstanding this restriction or except to the extent that Cisco is legally required to permit such specific activity pursuant to any applicable open source license;\n" +
+            "\n" +
+            "(iv) publish any results of benchmark tests run on the Software;\n" +
+            "\n" +
+            "(v) use or permit the Software to be used to perform services for third parties, whether on a service bureau or time sharing basis or otherwise, without the express written authorization of Cisco; or\n" +
+            "\n" +
+            "(vi) disclose, provide, or otherwise make available trade secrets contained within the Software and Documentation in any form to any third party without the prior written consent of Cisco. Customer shall implement reasonable security measures to protect such trade secrets.\n" +
+            "\n" +
+            "To the extent required by applicable law, and at Customer's written request, Cisco shall provide Customer with the interface information needed to achieve interoperability between the Software and another independently created program, on payment of Cisco's applicable fee, if any. Customer shall observe strict obligations of confidentiality with respect to such information and shall use such information in compliance with any applicable terms and conditions upon which Cisco makes such information available.\n" +
+            "\n" +
+            "Software, Upgrades and Additional Copies. NOTWITHSTANDING ANY OTHER PROVISION OF THE AGREEMENT: (1) CUSTOMER HAS NO LICENSE OR RIGHT TO MAKE OR USE ANY ADDITIONAL COPIES OR UPGRADES UNLESS CUSTOMER, AT THE TIME OF MAKING OR ACQUIRING SUCH COPY OR UPGRADE, ALREADY HOLDS A VALID LICENSE TO THE ORIGINAL SOFTWARE AND HAS PAID THE APPLICABLE FEE TO AN APPROVED SOURCE FOR THE UPGRADE OR ADDITIONAL COPIES; (2) USE OF UPGRADES IS LIMITED TO CISCO EQUIPMENT SUPPLIED BY AN APPROVED SOURCE FOR WHICH CUSTOMER IS THE ORIGINAL END USER PURCHASER OR LESSEE OR OTHERWISE HOLDS A VALID LICENSE TO USE THE SOFTWARE WHICH IS BEING UPGRADED; AND (3) THE MAKING AND USE OF ADDITIONAL COPIES IS LIMITED TO NECESSARY BACKUP PURPOSES ONLY.\n" +
+            "\n" +
+            "Proprietary Notices. Customer agrees to maintain and reproduce all copyright, proprietary, and other notices on all copies, in any form, of the Software in the same form and manner that such copyright and other proprietary notices are included on the Software. Except as expressly authorized in the Agreement, Customer shall not make any copies or duplicates of any Software without the prior written permission of Cisco.\n" +
+            "\n" +
+            "Term and Termination. The Agreement and the license granted herein shall remain effective until terminated. Customer may terminate the Agreement and the license at any time by destroying all copies of Software and any Documentation. Customer's rights under the Agreement will terminate immediately without notice from Cisco if Customer fails to comply with any provision of the Agreement. Upon termination, Customer shall destroy all copies of Software and Documentation in its possession or control. All confidentiality obligations of Customer, " +
+            "all restrictions and limitations imposed on the Customer under the section titled \"General Limitations\" and all limitations of liability and disclaimers and restrictions of warranty shall survive termination of this Agreement. In addition, the provisions of the sections titled \"U.S. Government End User Purchasers\" and \"General Terms Applicable to the Limited Warranty Statement and End User License Agreement\" shall survive termination of the Agreement.\n" +
+            "\n" +
+            "Customer Records. Customer grants to Cisco and its independent accountants the right to examine Customer's books, records and accounts during Customer's normal business hours to verify compliance with this Agreement. In the event such audit discloses non-compliance with this Agreement, Customer shall promptly pay to Cisco the appropriate license fees, plus the reasonable cost of conducting the audit.\n" +
+            "\n" +
+            "Export, Re-Export, Transfer and Use Controls. The Software, Documentation and technology or direct products thereof (hereafter referred to as Software and Technology), supplied by Cisco under the Agreement are subject to export controls under the laws and regulations of the United States (\"U.S.\") and any other applicable countries' laws and regulations. Customer shall comply with such laws and regulations governing export, re-export, import, transfer and use of Cisco Software and Technology and will obtain all required U.S. and local authorizations, permits, or licenses. Cisco and Customer each agree to provide the other information, support documents, and assistance as may reasonably be required by the other in connection with securing authorizations or licenses. Information regarding compliance with export, re-export, transfer and use may be located at the following URL: www.cisco.com/web/about/doing_business/legal/global_export_trade/general_export/contract_compliance.html\n" +
+            "\n" +
+            "U.S. Government End User Purchasers. The Software and Documentation qualify as \"commercial items,\" as that term is defined at Federal Acquisition Regulation (\"FAR\") (48 C.F.R.) 2.101, consisting of \"commercial computer software\" and \"commercial computer software documentation\" as such terms are used in FAR 12.212. Consistent with FAR 12.212 and DoD FAR Supp. 227.7202-1 through 227.7202-4, and notwithstanding any other FAR or other contractual clause to the contrary in any agreement into which the Agreement may be incorporated, Customer may provide to Government end user or, if the Agreement is direct, Government end user will acquire, the Software and Documentation with only those rights set forth in the Agreement. Use of either the Software or Documentation or both constitutes agreement by the Government that the Software and Documentation are \"commercial computer software\" and \"commercial " +
+            "computer software documentation,\" and constitutes acceptance of the rights and restrictions herein.\n" +
+            "\n" +
+            "Identified Components; Additional Terms. The Software may contain or be delivered with one or more components, which may include third-party components, identified by Cisco in the Documentation, readme.txt file, third-party click-accept or elsewhere (e.g. on www.cisco.com) (the \"Identified Component(s)\") as being subject to different license agreement terms, disclaimers of warranties, limited warranties or other terms and conditions (collectively, \"Additional Terms\") than those set forth herein. You agree to the applicable Additional Terms for any such Identified Component(s).\n" +
+            "\n" +
+            "Limited Warranty\n" +
+            "\n" +
+            "Subject to the limitations and conditions set forth herein, Cisco warrants that commencing from the date of shipment to Customer (but in case of resale by an Approved Source other than Cisco, commencing not more than ninety (90) days after original shipment by Cisco), and continuing for a period of the longer of (a) ninety (90) days or (b) the warranty period (if any) expressly set forth as applicable specifically to software in the warranty card accompanying the product of which the Software is a part (the \"Product\") (if any): (a) the media on which the Software is furnished will be free of defects in materials and workmanship under normal use; and (b) the Software substantially conforms to the Documentation. The date of shipment of a Product by Cisco is set forth " +
+            "on the packaging material in which the Product is shipped. Except for the foregoing, the Software is provided \"AS IS\". This limited warranty extends only to the Software purchased from an Approved Source by a Customer who is the first registered end user. Customer's sole and exclusive remedy and the entire liability of Cisco and its suppliers under this limited warranty will be (i) replacement of defective media and/or (ii) at Cisco's option, repair, replacement, or refund of the purchase price of the Software, in both cases subject to the condition that any error or defect constituting a breach of this limited warranty is reported to the Approved Source supplying the Software to Customer, within the warranty period. Cisco or the Approved Source supplying the Software to Customer may, at its option, require return of the Software and/or Documentation as a condition to the remedy. " +
+            "In no event does Cisco warrant that the Software is error free or that Customer will be able to operate the Software without problems or interruptions. In addition, due to the continual development of new techniques for intruding upon and attacking networks, Cisco does not warrant that the Software or any equipment, system or network on which the Software is used will be free of vulnerability to intrusion or attack.\n" +
+            "\n" +
+            "Restrictions. This warranty does not apply if the Software, Product or any other equipment upon which the Software is authorized to be used (a) has been altered, except by Cisco or its authorized representative, (b) has not been installed, operated, repaired, or maintained in accordance with instructions supplied by Cisco, (c) has been subjected to abnormal physical or electrical stress, abnormal environmental conditions, misuse, negligence, or accident; or (d) is licensed for beta, evaluation, testing or demonstration purposes. The Software warranty also does not apply to (e) any temporary Software modules; (f) any Software not posted on Cisco's Software Center; (g) any Software that Cisco expressly provides on an \"AS IS\" basis on Cisco's Software Center; (h) any Software for which an Approved Source does not receive a license fee; and (i) Software supplied by any third party which is not an Approved Source.\n" +
+            "\n" +
+            "DISCLAIMER OF WARRANTY\n" +
+            "\n" +
+            "EXCEPT AS SPECIFIED IN THIS WARRANTY SECTION, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS, AND WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OR CONDITION OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, SATISFACTORY QUALITY, NON-INTERFERENCE, ACCURACY OF INFORMATIONAL CONTENT, OR ARISING FROM A COURSE OF DEALING, LAW, USAGE, OR TRADE PRACTICE, ARE HEREBY EXCLUDED TO THE EXTENT ALLOWED BY APPLICABLE LAW AND ARE EXPRESSLY DISCLAIMED BY CISCO, ITS SUPPLIERS AND LICENSORS. TO THE EXTENT THAT ANY OF THE SAME CANNOT BE EXCLUDED, SUCH IMPLIED CONDITION, REPRESENTATION AND/OR WARRANTY IS LIMITED IN DURATION TO THE EXPRESS WARRANTY PERIOD REFERRED TO IN THE \"LIMITED WARRANTY\" SECTION ABOVE. BECAUSE SOME STATES OR JURISDICTIONS " +
+            "DO NOT ALLOW LIMITATIONS ON HOW LONG AN IMPLIED WARRANTY LASTS, THE ABOVE LIMITATION MAY NOT APPLY IN SUCH STATES. THIS WARRANTY GIVES CUSTOMER SPECIFIC LEGAL RIGHTS, AND CUSTOMER MAY ALSO HAVE OTHER RIGHTS WHICH VARY FROM JURISDICTION TO JURISDICTION. This disclaimer and exclusion shall apply even if the express warranty set forth above fails of its essential purpose.\n" +
+            "\n" +
+            "Disclaimer of Liabilities-Limitation of Liability. IF YOU ACQUIRED THE SOFTWARE IN THE UNITED STATES, LATIN AMERICA, CANADA, JAPAN OR THE CARIBBEAN, NOTWITHSTANDING ANYTHING ELSE IN THE AGREEMENT TO THE CONTRARY, ALL LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS COLLECTIVELY, TO CUSTOMER, WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF WARRANTY OR OTHERWISE, SHALL NOT EXCEED THE PRICE PAID BY CUSTOMER TO ANY APPROVED SOURCE FOR THE SOFTWARE THAT GAVE RISE TO THE CLAIM OR IF THE SOFTWARE IS PART OF ANOTHER PRODUCT, THE PRICE PAID FOR SUCH OTHER PRODUCT. THIS LIMITATION OF LIABILITY FOR SOFTWARE IS CUMULATIVE AND NOT PER INCIDENT (I.E. THE EXISTENCE OF TWO OR MORE CLAIMS WILL NOT ENLARGE THIS LIMIT).\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN EUROPE, THE MIDDLE EAST, AFRICA, ASIA OR OCEANIA, NOTWITHSTANDING ANYTHING ELSE IN THE AGREEMENT TO THE CONTRARY, ALL LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS COLLECTIVELY, TO CUSTOMER, WHETHER IN CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF WARRANTY OR OTHERWISE, SHALL NOT EXCEED THE PRICE PAID BY CUSTOMER TO CISCO FOR THE SOFTWARE THAT GAVE RISE TO THE CLAIM OR IF THE SOFTWARE IS PART OF ANOTHER PRODUCT, THE PRICE PAID FOR SUCH OTHER PRODUCT. THIS LIMITATION OF LIABILITY FOR SOFTWARE IS CUMULATIVE AND NOT PER INCIDENT (I.E. THE EXISTENCE OF TWO OR MORE CLAIMS WILL NOT ENLARGE THIS LIMIT). NOTHING IN THE AGREEMENT SHALL LIMIT (I) THE LIABILITY OF CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS TO CUSTOMER FOR PERSONAL " +
+            "INJURY OR DEATH CAUSED BY THEIR NEGLIGENCE, (II) CISCO'S LIABILITY FOR FRAUDULENT MISREPRESENTATION, OR (III) ANY LIABILITY OF CISCO WHICH CANNOT BE EXCLUDED UNDER APPLICABLE LAW.\n" +
+            "\n" +
+            "Disclaimer of Liabilities-Waiver of Consequential Damages and Other Losses. IF YOU ACQUIRED THE SOFTWARE IN THE UNITED STATES, LATIN AMERICA, THE CARIBBEAN OR CANADA, REGARDLESS OF WHETHER ANY REMEDY SET FORTH HEREIN FAILS OF ITS ESSENTIAL PURPOSE OR OTHERWISE, IN NO EVENT WILL CISCO OR ITS SUPPLIERS BE LIABLE FOR ANY LOST REVENUE, PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE OR OTHERWISE AND EVEN IF CISCO OR ITS SUPPLIERS OR LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN JAPAN, EXCEPT FOR LIABILITY ARISING OUT OF OR IN CONNECTION WITH DEATH OR PERSONAL INJURY, FRAUDULENT MISREPRESENTATION, AND REGARDLESS OF WHETHER ANY REMEDY SET FORTH HEREIN FAILS OF ITS ESSENTIAL PURPOSE OR OTHERWISE, IN NO EVENT WILL CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE OR OTHERWISE AND EVEN IF CISCO OR ANY APPROVED SOURCE OR THEIR SUPPLIERS OR LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n" +
+            "\n" +
+            "IF YOU ACQUIRED THE SOFTWARE IN EUROPE, THE MIDDLE EAST, AFRICA, ASIA OR OCEANIA, IN NO EVENT WILL CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS, BE LIABLE FOR ANY LOST REVENUE, LOST PROFIT, OR LOST OR DAMAGED DATA, BUSINESS INTERRUPTION, LOSS OF CAPITAL, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR PUNITIVE DAMAGES, HOWSOEVER ARISING, INCLUDING, WITHOUT LIMITATION, IN CONTRACT, TORT (INCLUDING NEGLIGENCE) OR WHETHER ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF, IN EACH CASE, CISCO, ITS AFFILIATES, OFFICERS, DIRECTORS, EMPLOYEES, AGENTS, SUPPLIERS AND LICENSORS, HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BECAUSE SOME STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL OR INCIDENTAL" +
+            " DAMAGES, THE ABOVE LIMITATION MAY NOT FULLY APPLY TO YOU. THE FOREGOING EXCLUSION SHALL NOT APPLY TO ANY LIABILITY ARISING OUT OF OR IN CONNECTION WITH: (I) DEATH OR PERSONAL INJURY, (II) FRAUDULENT MISREPRESENTATION, OR (III) CISCO'S LIABILITY IN CONNECTION WITH ANY TERMS THAT CANNOT BE EXCLUDED UNDER APPLICABLE LAW.\n" +
+            "\n" +
+            "Customer acknowledges and agrees that Cisco has set its prices and entered into the Agreement in reliance upon the disclaimers of warranty and the limitations of liability set forth herein, that the same reflect an allocation of risk between the parties (including the risk that a contract remedy may fail of its essential purpose and cause consequential loss), and that the same form an essential basis of the bargain between the parties.\n" +
+            "\n" +
+            "Controlling Law, Jurisdiction. If you acquired, by reference to the address on the purchase order accepted by the Approved Source, the Software in the United States, Latin America, or the Caribbean, the Agreement and warranties (\"Warranties\") are controlled by and construed under the laws of the State of California, United States of America, notwithstanding any conflicts of law provisions; and the state and federal courts of California shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in Canada, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the Province of Ontario, Canada, notwithstanding any conflicts of law provisions; and the courts of the " +
+            "Province of Ontario shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in Europe, the Middle East, Africa, Asia or Oceania (excluding Australia), unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of England, notwithstanding any conflicts of law provisions; and the English courts shall have exclusive jurisdiction over any " +
+            "claim arising under the Agreement or Warranties. In addition, if the Agreement is controlled by the laws of England, no person who is not a party to the Agreement shall be entitled to enforce or take the benefit of any of its terms under the Contracts (Rights of Third Parties) Act 1999. If you acquired the Software in Japan, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of Japan, notwithstanding any conflicts of law provisions; and the Tokyo District Court of Japan shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in Australia, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the " +
+            "State of New South Wales, Australia, notwithstanding any conflicts of law provisions; and the State and federal courts of New South Wales shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties. If you acquired the Software in any other country, unless expressly prohibited by local law, the Agreement and Warranties are controlled by and construed under the laws of the State of California, United States of America, " +
+            "notwithstanding any conflicts of law provisions; and the state and federal courts of California shall have exclusive jurisdiction over any claim arising under the Agreement or Warranties.\n" +
+            "\n" +
+            "For all countries referred to above, the parties specifically disclaim the application of the UN Convention on Contracts for the International Sale of Goods. Notwithstanding the foregoing, either party may seek interim injunctive relief in any court of appropriate jurisdiction with respect to any alleged breach of such party's intellectual property or proprietary rights. If any portion hereof is found to be void or unenforceable, the remaining provisions of the Agreement and Warranties shall remain in full force and effect. Except as expressly provided herein, the Agreement constitutes the entire agreement between the parties with respect to the license of the Software and Documentation and supersedes any conflicting or additional terms contained in any Purchase Order or elsewhere, all of which terms are excluded. The Agreement has been written in the English language, and the parties agree that the English version will govern.\n" +
+            "\n" +
+            "Product warranty terms and other information applicable to Cisco products are available at the following URL: www.cisco.com/go/warranty\n" +
+            "\n" +
+            "Cisco and the Cisco logo are trademarks or registered trademarks of Cisco and/or its affiliates in the U.S. and other countries. To view a list of Cisco trademarks, go to this URL: www.cisco.com/go/trademarks. Third-party trademarks mentioned are the property of their respective owners. The use of the word partner does not imply a partnership relationship between Cisco and any other company. (1110R)\n" +
+            "\n" +
+            "© 1998, 2001, 2003, 2008-2014 Cisco Systems, Inc. All rights reserved.";
+
+    @Test
+    public void testCompressDecompressString() throws IOException {
+        byte[] compressed = util.compressString(testEula);
+        String decompressed = util.decompressByteArary(compressed);
+        Assert.assertEquals(decompressed, testEula);
+    }
+}
diff --git a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java
index 0ac1032..1eff484 100644
--- a/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java
+++ b/utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java
@@ -249,11 +249,21 @@
     }
 
     @Test
-    public void testGenerateUriForPvlan() {
+    public void testGenerateUriForIsolatedPvlan() {
         assertEquals("pvlan://123-i456", NetUtils.generateUriForPvlan("123", "456").toString());
     }
 
     @Test
+    public void testGenerateUriForCommunityPvlan() {
+        assertEquals("pvlan://123-c456", NetUtils.generateUriForPvlan("123", "456", "Community").toString());
+    }
+
+    @Test
+    public void testGenerateUriForPromiscuousPvlan() {
+        assertEquals("pvlan://123-p123", NetUtils.generateUriForPvlan("123", "123", "promiscuous").toString());
+    }
+
+    @Test
     public void testGetPrimaryPvlanFromUri() {
         assertEquals("123", NetUtils.getPrimaryPvlanFromUri(NetUtils.generateUriForPvlan("123", "456")));
     }
diff --git a/utils/src/test/java/org/apache/cloudstack/utils/redfish/RedfishClientTest.java b/utils/src/test/java/org/apache/cloudstack/utils/redfish/RedfishClientTest.java
new file mode 100644
index 0000000..15a75ba
--- /dev/null
+++ b/utils/src/test/java/org/apache/cloudstack/utils/redfish/RedfishClientTest.java
@@ -0,0 +1,210 @@
+//
+// 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.utils.redfish;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.io.IOException;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RedfishClientTest {
+
+    private static final String USERNAME = "user";
+    private static final String PASSWORD = "password";
+    private static final String oobAddress = "oob.host.address";
+    private static final String systemId = "SystemID.1";
+    private final static String COMPUTER_SYSTEM_RESET_URL_PATH = "/Actions/ComputerSystem.Reset";
+    private final static Integer REDFISHT_REQUEST_RETRIES = Integer.valueOf(2);
+    private static final String url = "https://address.system.net/redfish/v1/Systems/";
+    private static final HttpRequestBase httpReq = new HttpGet(url);
+
+    @Mock
+    HttpClient client;
+
+    @Mock
+    HttpResponse httpResponse;
+
+    RedfishClient redfishClientspy = Mockito.spy(new RedfishClient(USERNAME, PASSWORD, true, true, REDFISHT_REQUEST_RETRIES));
+
+    @Test(expected = RedfishException.class)
+    public void validateAddressAndPrepareForUrlTestExpect() {
+        redfishClientspy.validateAddressAndPrepareForUrl("1:1:2:3:1");
+        redfishClientspy.validateAddressAndPrepareForUrl("1");
+        redfishClientspy.validateAddressAndPrepareForUrl("hostname");
+        redfishClientspy.validateAddressAndPrepareForUrl(oobAddress);
+    }
+
+    @Test
+    public void validateAddressAndPrepareForUrlTestDomainName() {
+        String result = redfishClientspy.validateAddressAndPrepareForUrl(oobAddress);
+        Assert.assertEquals(oobAddress, result);
+    }
+
+    @Test
+    public void validateAddressAndPrepareForUrlTestIpv4() {
+        String ipv4 = "192.168.0.123";
+        String result = redfishClientspy.validateAddressAndPrepareForUrl(ipv4);
+        Assert.assertEquals(ipv4, result);
+    }
+
+    @Test
+    public void validateAddressAndPrepareForUrlTestIpv6() {
+        String ipv6 = "100::ffff:ffff:ffff:ffff";
+        String expected = "[" + ipv6 + "]";
+        String result = redfishClientspy.validateAddressAndPrepareForUrl(ipv6);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestHttpsGetSystemId() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, true, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.GetSystemId, systemId);
+        String expected = String.format("https://%s/redfish/v1/Systems/", oobAddress, systemId);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestGetSystemId() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, false, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.GetSystemId, systemId);
+        String expected = String.format("http://%s/redfish/v1/Systems/", oobAddress, systemId);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestHttpsComputerSystemReset() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, true, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.ComputerSystemReset, systemId);
+        String expected = String.format("https://%s/redfish/v1/Systems/%s%s", oobAddress, systemId, COMPUTER_SYSTEM_RESET_URL_PATH);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestComputerSystemReset() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, false, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.ComputerSystemReset, systemId);
+        String expected = String.format("http://%s/redfish/v1/Systems/%s%s", oobAddress, systemId, COMPUTER_SYSTEM_RESET_URL_PATH);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestHttpsGetPowerState() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, true, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.GetPowerState, systemId);
+        String expected = String.format("https://%s/redfish/v1/Systems/%s", oobAddress, systemId);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void buildRequestUrlTestGetPowerState() {
+        RedfishClient redfishclient = new RedfishClient(USERNAME, PASSWORD, false, false, REDFISHT_REQUEST_RETRIES);
+        String result = redfishclient.buildRequestUrl(oobAddress, RedfishClient.RedfishCmdType.GetPowerState, systemId);
+        String expected = String.format("http://%s/redfish/v1/Systems/%s", oobAddress, systemId);
+        Assert.assertEquals(expected, result);
+    }
+
+    @Test
+    public void getSystemPowerStateTest() {
+        Mockito.doReturn(systemId).when(redfishClientspy).getSystemId(Mockito.anyString());
+        mockResponse(HttpStatus.SC_OK);
+        RedfishClient.RedfishPowerState expectedState = RedfishClient.RedfishPowerState.On;
+        Mockito.doReturn(expectedState).when(redfishClientspy).processGetSystemRequestResponse(Mockito.any(CloseableHttpResponse.class));
+
+        RedfishClient.RedfishPowerState result = redfishClientspy.getSystemPowerState(oobAddress);
+
+        Assert.assertEquals(expectedState, result);
+    }
+
+    @Test(expected = RedfishException.class)
+    public void getSystemPowerStateTestHttpStatusNotOk() {
+        Mockito.doReturn(systemId).when(redfishClientspy).getSystemId(Mockito.anyString());
+        mockResponse(HttpStatus.SC_BAD_REQUEST);
+        redfishClientspy.getSystemPowerState(oobAddress);
+    }
+
+    private CloseableHttpResponse mockResponse(int httpStatusCode) {
+        StatusLine statusLine = Mockito.mock(StatusLine.class);
+        Mockito.doReturn(httpStatusCode).when(statusLine).getStatusCode();
+        CloseableHttpResponse response = Mockito.mock(CloseableHttpResponse.class);
+        Mockito.doReturn(statusLine).when(response).getStatusLine();
+        Mockito.doReturn(response).when(redfishClientspy).executeGetRequest(Mockito.anyString());
+        return response;
+    }
+
+    @Test
+    public void getSystemIdTest() {
+        CloseableHttpResponse mockedResponse = mockResponse(HttpStatus.SC_OK);
+        Mockito.doReturn(mockedResponse).when(redfishClientspy).executeGetRequest(Mockito.anyString());
+        Mockito.doReturn(systemId).when(redfishClientspy).processGetSystemIdResponse(Mockito.any(CloseableHttpResponse.class));
+
+        String result = redfishClientspy.getSystemId(oobAddress);
+
+        Assert.assertEquals(systemId, result);
+    }
+
+    @Test(expected = RedfishException.class)
+    public void getSystemIdTestHttpStatusNotOk() {
+        CloseableHttpResponse mockedResponse = mockResponse(HttpStatus.SC_UNAUTHORIZED);
+        Mockito.doReturn(mockedResponse).when(redfishClientspy).executeGetRequest(Mockito.anyString());
+        redfishClientspy.getSystemId(oobAddress);
+    }
+
+    @Test(expected = RedfishException.class)
+    public void retryHttpRequestNoRetries() throws IOException {
+        RedfishClient newRedfishClientspy = Mockito.spy(new RedfishClient(USERNAME, PASSWORD, true, true, Integer.valueOf(0)));
+        newRedfishClientspy.retryHttpRequest(url, httpReq, client);
+
+        Mockito.verify(newRedfishClientspy, Mockito.never()).retryHttpRequest(Mockito.anyString(), Mockito.any(), Mockito.any());
+        Mockito.verify(client, Mockito.never()).execute(Mockito.any());
+    }
+
+    @Test(expected = RedfishException.class)
+    public void retryHttpRequestExceptionAfterOneRetry() throws IOException {
+        Mockito.when(client.execute(httpReq)).thenThrow(IOException.class).thenReturn(httpResponse);
+
+        RedfishClient newRedfishClientspy = Mockito.spy(new RedfishClient(USERNAME, PASSWORD, true, true, Integer.valueOf(1)));
+        newRedfishClientspy.retryHttpRequest(url, httpReq, client);
+
+        Mockito.verify(newRedfishClientspy, Mockito.never()).retryHttpRequest(Mockito.anyString(), Mockito.any(), Mockito.any());
+        Mockito.verify(client, Mockito.never()).execute(Mockito.any());
+    }
+
+    @Test
+    public void retryHttpRequestNoException() throws IOException {
+        Mockito.when(client.execute(httpReq)).thenThrow(IOException.class).thenThrow(IOException.class).thenReturn(httpResponse);
+
+        RedfishClient newRedfishClientspy = Mockito.spy(new RedfishClient(USERNAME, PASSWORD, true, true, Integer.valueOf(3)));
+        newRedfishClientspy.retryHttpRequest(url, httpReq, client);
+
+        Mockito.verify(newRedfishClientspy, Mockito.times(1)).retryHttpRequest(Mockito.anyString(), Mockito.any(), Mockito.any());
+        Mockito.verify(client, Mockito.times(3)).execute(Mockito.any());
+    }
+}
diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml
index d770f48..8cc7272 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.14.2.0-SNAPSHOT</version>
+        <version>4.15.1.0-SNAPSHOT</version>
     </parent>
     <dependencies>
         <dependency>
@@ -75,5 +75,11 @@
             <version>${cs.jaxws.version}</version>
             <type>pom</type>
         </dependency>
+        <dependency>
+            <groupId>com.cloud.com.vmware</groupId>
+            <artifactId>vmware-pbm</artifactId>
+            <version>${cs.vmware.api.version}</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java
index 000affe3..1bcebc9 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/ClusterMO.java
@@ -95,7 +95,7 @@
         return null;
     }
 
-    private ClusterConfigInfoEx getClusterConfigInfo() throws Exception {
+    public ClusterConfigInfoEx getClusterConfigInfo() throws Exception {
         ClusterConfigInfoEx configInfo = (ClusterConfigInfoEx)_context.getVimClient().getDynamicProperty(_mor, "configurationEx");
         return configInfo;
     }
@@ -386,7 +386,7 @@
     }
 
     @Override
-    public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception {
+    public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, String configurationId) throws Exception {
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName +
                     ", datastore: " + dsMo.getMor().getValue() + ", diskOption: " + diskOption);
@@ -397,7 +397,7 @@
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - importVmFromOVF(). resource pool: " + morRp.getValue());
 
-        HypervisorHostHelper.importVmFromOVF(this, ovfFilePath, vmName, dsMo, diskOption, morRp, null);
+        HypervisorHostHelper.importVmFromOVF(this, ovfFilePath, vmName, dsMo, diskOption, morRp, null, configurationId);
 
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - importVmFromOVF() done");
@@ -423,7 +423,7 @@
     }
 
     @Override
-    public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid) throws Exception {
+    public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid, boolean createBaseFolder) throws Exception {
 
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress +
@@ -435,7 +435,7 @@
         if (hosts != null && hosts.size() > 0) {
             for (ManagedObjectReference morHost : hosts) {
                 HostMO hostMo = new HostMO(_context, morHost);
-                morDs = hostMo.mountDatastore(vmfsDatastore, poolHostAddress, poolHostPort, poolPath, poolUuid);
+                morDs = hostMo.mountDatastore(vmfsDatastore, poolHostAddress, poolHostPort, poolPath, poolUuid, true);
                 if (morDsFirst == null)
                     morDsFirst = morDs;
 
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
index 38b1565..af89757 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java
@@ -24,6 +24,7 @@
 import org.apache.log4j.Logger;
 
 import com.vmware.vim25.CustomFieldStringValue;
+import com.vmware.vim25.DatacenterConfigInfo;
 import com.vmware.vim25.DVPortgroupConfigInfo;
 import com.vmware.vim25.DistributedVirtualSwitchPortConnection;
 import com.vmware.vim25.DynamicProperty;
@@ -185,6 +186,20 @@
         return null;
     }
 
+    public ManagedObjectReference listDatastore(String name) throws Exception {
+        assert (name != null);
+
+        List<ObjectContent> ocs = getDatastorePropertiesOnDatacenter(new String[] {"name"});
+        if (ocs != null) {
+            for (ObjectContent oc : ocs) {
+                if (oc.getPropSet().get(0).getVal().toString().equals(name)) {
+                    return oc.getObj();
+                }
+            }
+        }
+        return null;
+    }
+
     public ManagedObjectReference findHost(String name) throws Exception {
         List<ObjectContent> ocs = getHostPropertiesOnDatacenterHostFolder(new String[] {"name"});
 
@@ -508,4 +523,9 @@
         CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager());
         return cfmMo.ensureCustomFieldDef("Datacenter", fieldName) > 0;
     }
+
+    public DatacenterConfigInfo getDatacenterConfigInfo() throws Exception {
+        DatacenterConfigInfo configInfo = (DatacenterConfigInfo)_context.getVimClient().getDynamicProperty(_mor, "configuration");
+        return configInfo;
+    }
 }
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 fd9a374..804af62 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,11 +16,10 @@
 // under the License.
 package com.cloud.hypervisor.vmware.mo;
 
-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;
+import com.vmware.pbm.PbmProfile;
 import com.vmware.vim25.DatastoreHostMount;
 import com.vmware.vim25.DatastoreSummary;
 import com.vmware.vim25.FileInfo;
@@ -35,10 +34,12 @@
 import com.vmware.vim25.PropertySpec;
 import com.vmware.vim25.SelectionSpec;
 import com.vmware.vim25.TraversalSpec;
+import org.apache.log4j.Logger;
 
-import com.cloud.exception.CloudException;
-import com.cloud.hypervisor.vmware.util.VmwareContext;
-import com.cloud.utils.Pair;
+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);
@@ -62,7 +63,7 @@
         return _name;
     }
 
-    public DatastoreSummary getSummary() throws Exception {
+    public DatastoreSummary getDatastoreSummary() throws Exception {
         return (DatastoreSummary)_context.getVimClient().getDynamicProperty(_mor, "summary");
     }
 
@@ -135,6 +136,16 @@
             fullPath = String.format("[%s] %s", datastoreName, path);
 
         _context.getService().makeDirectory(morFileManager, fullPath, morDc, true);
+
+        int retry = 2;
+        for (int i = 0; i < retry; i++) {
+            DatastoreFile datastoreFile = new DatastoreFile(fullPath);
+            if (!folderExists(String.format("[%s]", datastoreName), datastoreFile.getFileName())) {
+                _context.getService().makeDirectory(morFileManager, fullPath, morDc, true);
+            } else {
+                return;
+            }
+        }
     }
 
     String getDatastoreRootPath() throws Exception {
@@ -258,6 +269,17 @@
         if (!DatastoreFile.isFullDatastorePath(destFullPath))
             destFullPath = String.format("[%s] %s", destDsName, destFilePath);
 
+        DatastoreMO srcDsMo = new DatastoreMO(_context, morDestDs);
+        try {
+            if (!srcDsMo.fileExists(srcFullPath)) {
+                s_logger.error(String.format("Cannot move file to destination datastore due to file %s does not exists", srcFullPath));
+                return false;
+            }
+        } catch (Exception e) {
+            s_logger.error(String.format("Cannot move file to destination datastore due to file %s due to exeception %s", srcFullPath, e.getMessage()));
+            return false;
+        }
+
         ManagedObjectReference morTask = _context.getService().moveDatastoreFileTask(morFileManager, srcFullPath, morSrcDc, destFullPath, morDestDc, forceOverwrite);
 
         boolean result = _context.getVimClient().waitForTask(morTask);
@@ -265,52 +287,11 @@
             _context.waitForTaskProgressDone(morTask);
             return true;
         } else {
-            s_logger.error("VMware moveDatgastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+            s_logger.error("VMware moveDatastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
         }
         return false;
     }
 
-    public String[] getVmdkFileChain(String rootVmdkDatastoreFullPath) throws Exception {
-        Pair<DatacenterMO, String> dcPair = getOwnerDatacenter();
-
-        List<String> files = new ArrayList<>();
-        files.add(rootVmdkDatastoreFullPath);
-
-        String currentVmdkFullPath = rootVmdkDatastoreFullPath;
-        while (true) {
-            String url = getContext().composeDatastoreBrowseUrl(dcPair.second(), currentVmdkFullPath);
-            byte[] content = getContext().getResourceContent(url);
-            if (content == null || content.length == 0)
-                break;
-
-            VmdkFileDescriptor descriptor = new VmdkFileDescriptor();
-            descriptor.parse(content);
-
-            String parentFileName = descriptor.getParentFileName();
-            if (parentFileName == null)
-                break;
-
-            if (parentFileName.startsWith("/")) {
-                // when parent file is not at the same directory as it is, assume it is at parent directory
-                // this is only valid in Apache CloudStack primary storage deployment
-                DatastoreFile dsFile = new DatastoreFile(currentVmdkFullPath);
-                String dir = dsFile.getDir();
-                if (dir != null && dir.lastIndexOf('/') > 0)
-                    dir = dir.substring(0, dir.lastIndexOf('/'));
-                else
-                    dir = "";
-
-                currentVmdkFullPath = new DatastoreFile(dsFile.getDatastoreName(), dir, parentFileName.substring(parentFileName.lastIndexOf('/') + 1)).getPath();
-                files.add(currentVmdkFullPath);
-            } else {
-                currentVmdkFullPath = DatastoreFile.getCompanionDatastorePath(currentVmdkFullPath, parentFileName);
-                files.add(currentVmdkFullPath);
-            }
-        }
-
-        return files.toArray(new String[0]);
-    }
-
     @Deprecated
     public String[] listDirContent(String path) throws Exception {
         String fullPath = path;
@@ -367,7 +348,7 @@
             List<FileInfo> info = result.getFile();
             for (FileInfo fi : info) {
                 if (file.getFileName().equals(fi.getPath())) {
-                    s_logger.debug("File found = " + fi.getPath() + ", size=" + fi.getFileSize());
+                    s_logger.debug("File found = " + fi.getPath() + ", size=" + toHumanReadableSize(fi.getFileSize()));
                     return fi.getFileSize();
                 }
             }
@@ -425,6 +406,8 @@
                     s_logger.info("Found file " + fileName + " in datastore at " + absoluteFileName);
                     if (parentFolderPath.endsWith("]"))
                         absoluteFileName += " ";
+                    else if (!parentFolderPath.endsWith("/"))
+                        absoluteFileName +="/";
                     absoluteFileName += fi.getPath();
                     if(isValidCloudStackFolderPath(parentFolderPath, searchExcludedFolders)) {
                         return absoluteFileName;
@@ -463,4 +446,19 @@
         }
         return isAccessible;
     }
+
+    public boolean isDatastoreStoragePolicyComplaint(String storagePolicyId) throws Exception {
+        PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(_context);
+        PbmProfile profile = profMgrMo.getStorageProfile(storagePolicyId);
+
+        PbmPlacementSolverMO placementSolverMo = new PbmPlacementSolverMO(_context);
+        boolean isDatastoreCompatible = placementSolverMo.isDatastoreCompatibleWithStorageProfile(_mor, profile);
+
+        return isDatastoreCompatible;
+    }
+
+    public String getDatastoreType() throws Exception {
+        DatastoreSummary summary = _context.getVimClient().getDynamicProperty(getMor(), "summary");
+        return summary.getType();
+    }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
index f38f610..30798e3 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostDatastoreSystemMO.java
@@ -16,11 +16,7 @@
 // under the License.
 package com.cloud.hypervisor.vmware.mo;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
+import com.cloud.hypervisor.vmware.util.VmwareContext;
 import com.vmware.vim25.CustomFieldStringValue;
 import com.vmware.vim25.DatastoreInfo;
 import com.vmware.vim25.DynamicProperty;
@@ -35,12 +31,18 @@
 import com.vmware.vim25.ObjectSpec;
 import com.vmware.vim25.PropertyFilterSpec;
 import com.vmware.vim25.PropertySpec;
+import com.vmware.vim25.RetrieveOptions;
+import com.vmware.vim25.RetrieveResult;
+import com.vmware.vim25.SelectionSpec;
 import com.vmware.vim25.TraversalSpec;
 import com.vmware.vim25.VmfsDatastoreCreateSpec;
 import com.vmware.vim25.VmfsDatastoreExpandSpec;
 import com.vmware.vim25.VmfsDatastoreOption;
 
-import com.cloud.hypervisor.vmware.util.VmwareContext;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 public class HostDatastoreSystemMO extends BaseMO {
 
@@ -53,6 +55,14 @@
     }
 
     public ManagedObjectReference findDatastore(String name) throws Exception {
+        ManagedObjectReference morDatastore = findSpecificDatastore(name);
+        if (morDatastore == null) {
+            morDatastore = findDatastoreCluster(name);
+        }
+        return morDatastore;
+    }
+
+    public ManagedObjectReference findSpecificDatastore(String name) throws Exception {
         // added Apache CloudStack specific name convention, we will use custom field "cloud.uuid" as datastore name as well
         CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager());
         int key = cfmMo.getCustomFieldKey("Datastore", CustomFieldConstants.CLOUD_UUID);
@@ -79,6 +89,33 @@
         return null;
     }
 
+    public ManagedObjectReference findDatastoreCluster(String name) throws Exception {
+        // added Apache CloudStack specific name convention, we will use custom field "cloud.uuid" as datastore name as well
+        CustomFieldsManagerMO cfmMo = new CustomFieldsManagerMO(_context, _context.getServiceContent().getCustomFieldsManager());
+        int key = cfmMo.getCustomFieldKey("StoragePod", CustomFieldConstants.CLOUD_UUID);
+        assert (key != 0);
+
+        List<ObjectContent> ocs = getDatastoreClusterPropertiesOnHostDatastoreSystem(new String[] {"name", String.format("value[%d]", key)});
+        if (ocs != null) {
+            for (ObjectContent oc : ocs) {
+                if (oc.getPropSet().get(0).getVal().equals(name))
+                    return oc.getObj();
+
+                if (oc.getPropSet().size() > 1) {
+                    DynamicProperty prop = oc.getPropSet().get(1);
+                    if (prop != null && prop.getVal() != null) {
+                        if (prop.getVal() instanceof CustomFieldStringValue) {
+                            String val = ((CustomFieldStringValue)prop.getVal()).getValue();
+                            if (val.equalsIgnoreCase(name))
+                                return oc.getObj();
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
     public List<HostUnresolvedVmfsVolume> queryUnresolvedVmfsVolumes() throws Exception {
         return _context.getService().queryUnresolvedVmfsVolumes(_mor);
     }
@@ -251,4 +288,90 @@
 
         return _context.getService().retrieveProperties(_context.getPropertyCollector(), pfSpecArr);
     }
+
+    public List<ObjectContent> getDatastoreClusterPropertiesOnHostDatastoreSystem(String[] propertyPaths) throws Exception {
+        ManagedObjectReference retVal = null;
+        // Create Property Spec
+        PropertySpec propertySpec = new PropertySpec();
+        propertySpec.setAll(Boolean.FALSE);
+        propertySpec.setType("StoragePod");
+        propertySpec.getPathSet().addAll(Arrays.asList(propertyPaths));
+
+        // Now create Object Spec
+        ObjectSpec objectSpec = new ObjectSpec();
+        objectSpec.setObj(getContext().getRootFolder());
+        objectSpec.setSkip(Boolean.TRUE);
+        objectSpec.getSelectSet().addAll(
+                Arrays.asList(getStorageTraversalSpec()));
+
+        // Create PropertyFilterSpec using the PropertySpec and ObjectPec
+        // created above.
+        PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
+        propertyFilterSpec.getPropSet().add(propertySpec);
+        propertyFilterSpec.getObjectSet().add(objectSpec);
+
+        List<PropertyFilterSpec> listpfs = new ArrayList<PropertyFilterSpec>();
+        listpfs.add(propertyFilterSpec);
+        return retrievePropertiesAllObjects(listpfs);
+    }
+
+    private SelectionSpec[] getStorageTraversalSpec() {
+        // create a traversal spec that start from root folder
+
+        SelectionSpec ssFolders = new SelectionSpec();
+        ssFolders.setName("visitFolders");
+
+        TraversalSpec datacenterSpec = new TraversalSpec();
+        datacenterSpec.setName("dcTodf");
+        datacenterSpec.setType("Datacenter");
+        datacenterSpec.setPath("datastoreFolder");
+        datacenterSpec.setSkip(Boolean.FALSE);
+        datacenterSpec.getSelectSet().add(ssFolders);
+
+        TraversalSpec visitFolder = new TraversalSpec();
+        visitFolder.setType("Folder");
+        visitFolder.setName("visitFolders");
+        visitFolder.setPath("childEntity");
+        visitFolder.setSkip(Boolean.FALSE);
+
+        List<SelectionSpec> ssSpecList = new ArrayList<SelectionSpec>();
+        ssSpecList.add(datacenterSpec);
+        ssSpecList.add(ssFolders);
+
+        visitFolder.getSelectSet().addAll(ssSpecList);
+        return (new SelectionSpec[]{visitFolder});
+    }
+
+    private List<ObjectContent> retrievePropertiesAllObjects(
+            List<PropertyFilterSpec> listpfs) throws Exception {
+
+        RetrieveOptions propObjectRetrieveOpts = new RetrieveOptions();
+
+        List<ObjectContent> listobjcontent = new ArrayList<ObjectContent>();
+
+        RetrieveResult rslts =
+                getContext().getService().retrievePropertiesEx(getContext().getServiceContent().getPropertyCollector(), listpfs,
+                        propObjectRetrieveOpts);
+        if (rslts != null && rslts.getObjects() != null
+                && !rslts.getObjects().isEmpty()) {
+            listobjcontent.addAll(rslts.getObjects());
+        }
+        String token = null;
+        if (rslts != null && rslts.getToken() != null) {
+            token = rslts.getToken();
+        }
+        while (token != null && !token.isEmpty()) {
+            rslts =
+                    getContext().getService().continueRetrievePropertiesEx(getContext().getServiceContent().getPropertyCollector(), token);
+            token = null;
+            if (rslts != null) {
+                token = rslts.getToken();
+                if (rslts.getObjects() != null && !rslts.getObjects().isEmpty()) {
+                    listobjcontent.addAll(rslts.getObjects());
+                }
+            }
+        }
+        return listobjcontent;
+    }
+
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java
index c248f7a..0457039 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java
@@ -760,7 +760,7 @@
         return dsList;
     }
 
-    public void importVmFromOVF(String ovfFilePath, String vmName, String datastoreName, String diskOption) throws Exception {
+    public void importVmFromOVF(String ovfFilePath, String vmName, String datastoreName, String diskOption, String configurationId) throws Exception {
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - importVmFromOVF(). target MOR: " + _mor.getValue() + ", ovfFilePath: " + ovfFilePath + ", vmName: " + vmName +
                     ",datastoreName: " + datastoreName + ", diskOption: " + diskOption);
@@ -769,19 +769,19 @@
         if (dsMo == null)
             throw new Exception("Invalid datastore name: " + datastoreName);
 
-        importVmFromOVF(ovfFilePath, vmName, dsMo, diskOption);
+        importVmFromOVF(ovfFilePath, vmName, dsMo, diskOption, configurationId);
 
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - importVmFromOVF() done");
     }
 
     @Override
-    public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception {
+    public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, String configurationId) throws Exception {
 
         ManagedObjectReference morRp = getHyperHostOwnerResourcePool();
         assert (morRp != null);
 
-        HypervisorHostHelper.importVmFromOVF(this, ovfFilePath, vmName, dsMo, diskOption, morRp, _mor);
+        HypervisorHostHelper.importVmFromOVF(this, ovfFilePath, vmName, dsMo, diskOption, morRp, _mor, configurationId);
     }
 
     @Override
@@ -836,12 +836,13 @@
     }
 
     @Override
-    public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid) throws Exception {
+    public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid, boolean createBaseFolder) throws Exception {
 
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress +
                     ", poolHostPort: " + poolHostPort + ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
 
+        DatastoreMO dsMo = null;
         HostDatastoreSystemMO hostDatastoreSystemMo = getHostDatastoreSystemMO();
         ManagedObjectReference morDatastore = hostDatastoreSystemMo.findDatastore(poolUuid);
         if (morDatastore == null) {
@@ -868,22 +869,30 @@
                         s_logger.trace("vCenter API trace - mountDatastore() done(failed)");
                     throw new Exception(msg);
                 }
+                dsMo = new DatastoreMO(_context, morDatastore);
             } else {
                 morDatastore = _context.getDatastoreMorByPath(poolPath);
                 if (morDatastore == null) {
-                    String msg = "Unable to create VMFS datastore. host: " + poolHostAddress + ", port: " + poolHostPort + ", path: " + poolPath + ", uuid: " + poolUuid;
-                    s_logger.error(msg);
+                    morDatastore = findDatastore(_context.getDatastoreNameFromPath(poolPath));
+                    if (morDatastore == null) {
+                        String msg = "Unable to create VMFS datastore. host: " + poolHostAddress + ", port: " + poolHostPort + ", path: " + poolPath + ", uuid: " + poolUuid;
+                        s_logger.error(msg);
 
-                    if (s_logger.isTraceEnabled())
-                        s_logger.trace("vCenter API trace - mountDatastore() done(failed)");
-                    throw new Exception(msg);
+                        if (s_logger.isTraceEnabled())
+                            s_logger.trace("vCenter API trace - mountDatastore() done(failed)");
+                        throw new Exception(msg);
+                    }
                 }
 
-                DatastoreMO dsMo = new DatastoreMO(_context, morDatastore);
+                dsMo = new DatastoreMO(_context, morDatastore);
                 dsMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, poolUuid);
             }
         }
 
+        if (dsMo != null && !"StoragePod".equals(morDatastore.getType()) && createBaseFolder) {
+            HypervisorHostHelper.createBaseFolderInDatastore(dsMo, this);
+        }
+
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - mountDatastore() done(successfully)");
 
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 c43395d..1b94ca8 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
@@ -37,6 +37,17 @@
 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;
@@ -54,6 +65,7 @@
 import com.cloud.hypervisor.vmware.util.VmwareHelper;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.ActionDelegate;
 import com.cloud.utils.NumbersUtil;
 import com.cloud.utils.Pair;
@@ -73,6 +85,8 @@
 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.DVPortSetting;
 import com.vmware.vim25.DVPortgroupConfigInfo;
 import com.vmware.vim25.DVPortgroupConfigSpec;
@@ -136,6 +150,8 @@
     private static final String UNTAGGED_VLAN_NAME = "untagged";
     private static final String VMDK_PACK_DIR = "ova";
     private static final String OVA_OPTION_KEY_BOOTDISK = "cloud.ova.bootdisk";
+    public static final String VSPHERE_DATASTORE_BASE_FOLDER = "fcd";
+    public static final String VSPHERE_DATASTORE_HIDDEN_FOLDER = ".hidden";
 
     public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) {
 
@@ -196,7 +212,7 @@
         if (UNTAGGED_VLAN_NAME.equalsIgnoreCase(vlanId)) {
             return "cloud.public.untagged";
         } else {
-            return "cloud.public." + vlanId;
+            return "cloud.public." + vlanId + ".";
         }
     }
 
@@ -1467,7 +1483,7 @@
         if (vmInternalCSName == null)
             vmInternalCSName = vmName;
 
-        VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse);
+        VmwareHelper.setBasicVmConfig(vmConfig, cpuCount, cpuSpeedMHz, cpuReservedMHz, memoryMB, memoryReserveMB, guestOsIdentifier, limitCpuUse, false);
 
         String recommendedController = host.getRecommendedDiskController(guestOsIdentifier);
         String newRootDiskController = controllerInfo.first();
@@ -1524,6 +1540,10 @@
 
         vmConfig.getDeviceChange().add(videoDeviceSpec);
 
+        ClusterMO clusterMo = new ClusterMO(host.getContext(), host.getHyperHostCluster());
+        DatacenterMO dataCenterMo = new DatacenterMO(host.getContext(), host.getHyperHostDatacenter());
+        setVMHardwareVersion(vmConfig, clusterMo, dataCenterMo);
+
         if (host.createVm(vmConfig)) {
             // Here, when attempting to find the VM, we need to use the name
             // with which we created it. This is the only such place where
@@ -1552,6 +1572,43 @@
         return false;
     }
 
+    /**
+     * Set the VM hardware version based on the information retrieved by the cluster and datacenter:
+     * - If the cluster hardware version is set, then it is set to this hardware version on vmConfig
+     * - If the cluster hardware version is not set, check datacenter hardware version. If it is set, then it is set to vmConfig
+     * - In case both cluster and datacenter hardware version are not set, hardware version is not set to vmConfig
+     */
+    public static void setVMHardwareVersion(VirtualMachineConfigSpec vmConfig, ClusterMO clusterMO, DatacenterMO datacenterMO) throws Exception {
+        String version = getNewVMHardwareVersion(clusterMO, datacenterMO);
+        if (StringUtils.isNotBlank(version)) {
+            vmConfig.setVersion(version);
+        }
+    }
+
+    /**
+     * Return the VM hardware version based on the information retrieved by the cluster and datacenter:
+     * - If the cluster hardware version is set, then return this hardware version
+     * - If the cluster hardware version is not set, check datacenter hardware version. If it is set, then return it
+     * - In case both cluster and datacenter hardware version are not set, return null
+     */
+    public static String getNewVMHardwareVersion(ClusterMO clusterMO, DatacenterMO datacenterMO) throws Exception {
+        String version = null;
+        ClusterConfigInfoEx clusterConfigInfo = clusterMO != null ? clusterMO.getClusterConfigInfo() : null;
+        String clusterHardwareVersion = clusterConfigInfo != null ? clusterConfigInfo.getDefaultHardwareVersionKey() : null;
+        if (StringUtils.isNotBlank(clusterHardwareVersion)) {
+            s_logger.debug("Cluster hardware version found: " + clusterHardwareVersion + ". Creating VM with this hardware version");
+            version = clusterHardwareVersion;
+        } else {
+            DatacenterConfigInfo datacenterConfigInfo = datacenterMO != null ? datacenterMO.getDatacenterConfigInfo() : null;
+            String datacenterHardwareVersion = datacenterConfigInfo != null ? datacenterConfigInfo.getDefaultHardwareVersionKey() : null;
+            if (StringUtils.isNotBlank(datacenterHardwareVersion)) {
+                s_logger.debug("Datacenter hardware version found: " + datacenterHardwareVersion + ". Creating VM with this hardware version");
+                version = datacenterHardwareVersion;
+            }
+        }
+        return version;
+    }
+
     private static VirtualDeviceConfigSpec getControllerSpec(String diskController, int busNum) {
         VirtualDeviceConfigSpec controllerSpec = new VirtualDeviceConfigSpec();
         VirtualController controller = null;
@@ -1580,7 +1637,7 @@
 
         return controllerSpec;
     }
-    public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName) throws Exception {
+    public static VirtualMachineMO createWorkerVM(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName, String hardwareVersion) throws Exception {
 
         // Allow worker VM to float within cluster so that we will have better chance to
         // create it successfully
@@ -1588,9 +1645,19 @@
         if (morCluster != null)
             hyperHost = new ClusterMO(hyperHost.getContext(), morCluster);
 
+        if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL") && !vmName.startsWith(CustomFieldConstants.CLOUD_UUID)) {
+            vmName = CustomFieldConstants.CLOUD_UUID + "-" + vmName;
+        }
         VirtualMachineMO workingVM = null;
         VirtualMachineConfigSpec vmConfig = new VirtualMachineConfigSpec();
         vmConfig.setName(vmName);
+        if (hardwareVersion != null){
+            vmConfig.setVersion(("vmx-" + hardwareVersion));
+        }  else {
+            ClusterMO clusterMo = new ClusterMO(hyperHost.getContext(), hyperHost.getHyperHostCluster());
+            DatacenterMO dataCenterMo = new DatacenterMO(hyperHost.getContext(), hyperHost.getHyperHostDatacenter());
+            setVMHardwareVersion(vmConfig, clusterMo, dataCenterMo);
+        }
         vmConfig.setMemoryMB((long)4);
         vmConfig.setNumCPUs(1);
         vmConfig.setGuestId(VirtualMachineGuestOsIdentifier.OTHER_GUEST.value());
@@ -1680,6 +1747,11 @@
         return url;
     }
 
+    /**
+     * removes the NetworkSection element from the {ovfString} if it is an ovf xml file
+     * @param ovfString input string
+     * @return like the input string but if xml elements by name {NetworkSection} removed
+     */
     public static String removeOVFNetwork(final String ovfString)  {
         if (ovfString == null || ovfString.isEmpty()) {
             return ovfString;
@@ -1714,8 +1786,12 @@
         return ovfString;
     }
 
+    /**
+     * deploys a new VM from a ovf spec. It ignores network, defaults locale to 'US'
+     * @throws Exception shoud be a VmwareResourceException
+     */
     public static void importVmFromOVF(VmwareHypervisorHost host, String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, ManagedObjectReference morRp,
-            ManagedObjectReference morHost) throws Exception {
+                                       ManagedObjectReference morHost, String configurationId) throws CloudRuntimeException, IOException {
 
         assert (morRp != null);
 
@@ -1723,24 +1799,34 @@
         importSpecParams.setHostSystem(morHost);
         importSpecParams.setLocale("US");
         importSpecParams.setEntityName(vmName);
-        importSpecParams.setDeploymentOption("");
+        String deploymentOption = StringUtils.isNotBlank(configurationId) ? configurationId : "";
+        importSpecParams.setDeploymentOption(deploymentOption);
         importSpecParams.setDiskProvisioning(diskOption); // diskOption: thin, thick, etc
 
         String ovfDescriptor = removeOVFNetwork(HttpNfcLeaseMO.readOvfContent(ovfFilePath));
         VmwareContext context = host.getContext();
-        OvfCreateImportSpecResult ovfImportResult =
-                context.getService().createImportSpec(context.getServiceContent().getOvfManager(), ovfDescriptor, morRp, dsMo.getMor(), importSpecParams);
-
+        OvfCreateImportSpecResult ovfImportResult = null;
+        try {
+            ovfImportResult = context.getService().createImportSpec(context.getServiceContent().getOvfManager(), ovfDescriptor, morRp, dsMo.getMor(), importSpecParams);
+        } catch (ConcurrentAccessFaultMsg
+                | FileFaultFaultMsg
+                | InvalidDatastoreFaultMsg
+                | InvalidStateFaultMsg
+                | RuntimeFaultFaultMsg
+                | TaskInProgressFaultMsg
+                | VmConfigFaultFaultMsg error) {
+            throw new CloudRuntimeException("ImportSpec creation failed", error);
+        }
         if (ovfImportResult == null) {
             String msg = "createImportSpec() failed. ovfFilePath: " + ovfFilePath + ", vmName: " + vmName + ", diskOption: " + diskOption;
             s_logger.error(msg);
-            throw new Exception(msg);
+            throw new CloudRuntimeException(msg);
         }
         if(!ovfImportResult.getError().isEmpty()) {
             for (LocalizedMethodFault fault : ovfImportResult.getError()) {
                 s_logger.error("createImportSpec error: " + fault.getLocalizedMessage());
             }
-            throw new CloudException("Failed to create an import spec from " + ovfFilePath + ". Check log for details.");
+            throw new CloudRuntimeException("Failed to create an import spec from " + ovfFilePath + ". Check log for details.");
         }
 
         if (!ovfImportResult.getWarning().isEmpty()) {
@@ -1749,22 +1835,55 @@
             }
         }
 
-        DatacenterMO dcMo = new DatacenterMO(context, host.getHyperHostDatacenter());
-        ManagedObjectReference morLease = context.getService().importVApp(morRp, ovfImportResult.getImportSpec(), dcMo.getVmFolder(), morHost);
+        DatacenterMO dcMo = null;
+        try {
+            dcMo = new DatacenterMO(context, host.getHyperHostDatacenter());
+        } catch (Exception e) {
+            throw new CloudRuntimeException(String.format("no datacenter for host '%s' available in context", context.getServerAddress()), e);
+        }
+        ManagedObjectReference folderMO = null;
+        try {
+            folderMO = dcMo.getVmFolder();
+        } catch (Exception e) {
+            throw new CloudRuntimeException("no management handle for VmFolder", e);
+        }
+        ManagedObjectReference morLease = null;
+        try {
+            morLease = context.getService().importVApp(morRp, ovfImportResult.getImportSpec(), folderMO, morHost);
+        } catch (DuplicateNameFaultMsg
+                | FileFaultFaultMsg
+                | InsufficientResourcesFaultFaultMsg
+                | InvalidDatastoreFaultMsg
+                | InvalidNameFaultMsg
+                | OutOfBoundsFaultMsg
+                | RuntimeFaultFaultMsg
+                | VmConfigFaultFaultMsg fault) {
+            throw new CloudRuntimeException("import vApp failed",fault);
+        }
         if (morLease == null) {
             String msg = "importVApp() failed. ovfFilePath: " + ovfFilePath + ", vmName: " + vmName + ", diskOption: " + diskOption;
             s_logger.error(msg);
-            throw new Exception(msg);
+            throw new CloudRuntimeException(msg);
         }
         boolean importSuccess = true;
         final HttpNfcLeaseMO leaseMo = new HttpNfcLeaseMO(context, morLease);
-        HttpNfcLeaseState state = leaseMo.waitState(new HttpNfcLeaseState[] {HttpNfcLeaseState.READY, HttpNfcLeaseState.ERROR});
+        HttpNfcLeaseState state = null;
+        try {
+            state = leaseMo.waitState(new HttpNfcLeaseState[] {HttpNfcLeaseState.READY, HttpNfcLeaseState.ERROR});
+        } catch (Exception e) {
+            throw new CloudRuntimeException("exception while waiting for leaseMO", e);
+        }
         try {
             if (state == HttpNfcLeaseState.READY) {
                 final long totalBytes = HttpNfcLeaseMO.calcTotalBytes(ovfImportResult);
                 File ovfFile = new File(ovfFilePath);
 
-                HttpNfcLeaseInfo httpNfcLeaseInfo = leaseMo.getLeaseInfo();
+                HttpNfcLeaseInfo httpNfcLeaseInfo = null;
+                try {
+                    httpNfcLeaseInfo = leaseMo.getLeaseInfo();
+                } catch (Exception e) {
+                    throw new CloudRuntimeException("error waiting for lease info", e);
+                }
                 List<HttpNfcLeaseDeviceUrl> deviceUrls = httpNfcLeaseInfo.getDeviceUrl();
                 long bytesAlreadyWritten = 0;
 
@@ -1775,6 +1894,7 @@
                         for (OvfFileItem ovfFileItem : ovfImportResult.getFileItem()) {
                             if (deviceKey.equals(ovfFileItem.getDeviceId())) {
                                 String absoluteFile = ovfFile.getParent() + File.separator + ovfFileItem.getPath();
+                                s_logger.info("Uploading file: " + absoluteFile);
                                 File f = new File(absoluteFile);
                                 if (f.exists()){
                                     String urlToPost = deviceUrl.getUrl();
@@ -1794,31 +1914,44 @@
                     String erroMsg = "File upload task failed to complete due to: " + e.getMessage();
                     s_logger.error(erroMsg);
                     importSuccess = false; // Set flag to cleanup the stale template left due to failed import operation, if any
-                    throw new Exception(erroMsg, e);
+                    throw new CloudRuntimeException(erroMsg, e);
                 } catch (Throwable th) {
                     String errorMsg = "throwable caught during file upload task: " + th.getMessage();
                     s_logger.error(errorMsg);
                     importSuccess = false; // Set flag to cleanup the stale template left due to failed import operation, if any
-                    throw new Exception(errorMsg, th);
+                    throw new CloudRuntimeException(errorMsg, th);
                 } finally {
                     progressReporter.close();
                 }
                 if (bytesAlreadyWritten == totalBytes) {
-                    leaseMo.updateLeaseProgress(100);
+                    try {
+                        leaseMo.updateLeaseProgress(100);
+                    } catch (Exception e) {
+                        throw new CloudRuntimeException("error while waiting for lease update", e);
+                    }
                 }
             } else if (state == HttpNfcLeaseState.ERROR) {
-                LocalizedMethodFault error = leaseMo.getLeaseError();
+                LocalizedMethodFault error = null;
+                try {
+                    error = leaseMo.getLeaseError();
+                } catch (Exception e) {
+                    throw new CloudRuntimeException("error getting lease error", e);
+                }
                 MethodFault fault = error.getFault();
                 String erroMsg = "Object creation on vCenter failed due to: Exception: " + fault.getClass().getName() + ", message: " + error.getLocalizedMessage();
                 s_logger.error(erroMsg);
-                throw new Exception(erroMsg);
+                throw new CloudRuntimeException(erroMsg);
             }
         } finally {
-            if (!importSuccess) {
-                s_logger.error("Aborting the lease on " + vmName + " after import operation failed.");
-                leaseMo.abortLease();
-            } else {
-                leaseMo.completeLease();
+            try {
+                if (!importSuccess) {
+                    s_logger.error("Aborting the lease on " + vmName + " after import operation failed.");
+                    leaseMo.abortLease();
+                } else {
+                    leaseMo.completeLease();
+                }
+            } catch (Exception e) {
+                throw new CloudRuntimeException("error completing lease", e);
             }
         }
     }
@@ -1909,7 +2042,7 @@
             ManagedObjectReference morDs) throws Exception {
         VmwareContext context = host.getContext();
         ManagedObjectReference morOvf = context.getServiceContent().getOvfManager();
-        VirtualMachineMO workerVmMo = HypervisorHostHelper.createWorkerVM(host, new DatastoreMO(context, morDs), ovfName);
+        VirtualMachineMO workerVmMo = HypervisorHostHelper.createWorkerVM(host, new DatastoreMO(context, morDs), ovfName, null);
         if (workerVmMo == null)
             throw new Exception("Unable to find just-created worker VM");
 
@@ -2053,4 +2186,29 @@
         return DiskControllerType.getType(controller) == DiskControllerType.ide;
     }
 
+    public static void createBaseFolder(DatastoreMO dsMo, VmwareHypervisorHost hyperHost, StoragePoolType poolType) throws Exception {
+        if (poolType != null && poolType == StoragePoolType.DatastoreCluster) {
+            StoragepodMO storagepodMO = new StoragepodMO(hyperHost.getContext(), dsMo.getMor());
+            List<ManagedObjectReference> datastoresInCluster = storagepodMO.getDatastoresInDatastoreCluster();
+            for (ManagedObjectReference datastore : datastoresInCluster) {
+                DatastoreMO childDsMo = new DatastoreMO(hyperHost.getContext(), datastore);
+                createBaseFolderInDatastore(childDsMo, hyperHost);
+            }
+        } else {
+            createBaseFolderInDatastore(dsMo, hyperHost);
+        }
+    }
+
+    public static void createBaseFolderInDatastore(DatastoreMO dsMo, VmwareHypervisorHost hyperHost) throws Exception {
+        String dsPath = String.format("[%s]", dsMo.getName());
+        String folderPath = String.format("[%s] %s", dsMo.getName(), VSPHERE_DATASTORE_BASE_FOLDER);
+        String hiddenFolderPath = String.format("%s/%s", folderPath, VSPHERE_DATASTORE_HIDDEN_FOLDER);
+
+        if (!dsMo.folderExists(dsPath, VSPHERE_DATASTORE_BASE_FOLDER)) {
+            s_logger.info(String.format("vSphere datastore base folder: %s does not exist, now creating on datastore: %s", VSPHERE_DATASTORE_BASE_FOLDER, dsMo.getName()));
+            dsMo.makeDirectory(folderPath, hyperHost.getHyperHostDatacenter());
+            // Adding another directory so vCentre doesn't remove the fcd directory when it's empty
+            dsMo.makeDirectory(hiddenFolderPath, hyperHost.getHyperHostDatacenter());
+        }
+    }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmPlacementSolverMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmPlacementSolverMO.java
new file mode 100644
index 0000000..3eb909f
--- /dev/null
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmPlacementSolverMO.java
@@ -0,0 +1,68 @@
+// 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.vmware.mo;
+
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+import com.vmware.pbm.PbmPlacementCompatibilityResult;
+import com.vmware.pbm.PbmPlacementHub;
+import com.vmware.pbm.PbmProfile;
+import com.vmware.pbm.PbmProfileId;
+import com.vmware.vim25.ManagedObjectReference;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PbmPlacementSolverMO extends BaseMO {
+
+    private static final Logger LOGGER = Logger.getLogger(PbmPlacementSolverMO.class);
+
+    public PbmPlacementSolverMO (VmwareContext context) {
+        super(context, context.getPbmServiceContent().getPlacementSolver());
+    }
+
+    public PbmPlacementSolverMO(VmwareContext context, ManagedObjectReference morPlacementSolver) {
+        super(context, morPlacementSolver);
+    }
+
+    public PbmPlacementSolverMO(VmwareContext context, String morType, String morValue) {
+        super(context, morType, morValue);
+    }
+
+    public boolean isDatastoreCompatibleWithStorageProfile(ManagedObjectReference dsMor, PbmProfile profile) throws Exception {
+        boolean isDatastoreCompatibleWithStorageProfile = false;
+
+        PbmPlacementHub placementHub = new PbmPlacementHub();
+        placementHub.setHubId(dsMor.getValue());
+        placementHub.setHubType(dsMor.getType());
+
+        List<PbmPlacementHub> placementHubList = new ArrayList<PbmPlacementHub>();
+        placementHubList.add(placementHub);
+        PbmProfileId profileId = profile.getProfileId();
+        List<PbmPlacementCompatibilityResult> placementCompatibilityResultList = _context.getPbmService().pbmCheckCompatibility(_mor, placementHubList, profileId);
+        if (CollectionUtils.isNotEmpty(placementCompatibilityResultList)) {
+            for (PbmPlacementCompatibilityResult placementResult : placementCompatibilityResultList) {
+                // Check for error and warning
+                if (CollectionUtils.isEmpty(placementResult.getError()) && CollectionUtils.isEmpty(placementResult.getWarning())) {
+                    isDatastoreCompatibleWithStorageProfile = true;
+                }
+            }
+        }
+        return isDatastoreCompatibleWithStorageProfile;
+    }
+}
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmProfileManagerMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmProfileManagerMO.java
new file mode 100644
index 0000000..38f18d7
--- /dev/null
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/PbmProfileManagerMO.java
@@ -0,0 +1,104 @@
+// 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.vmware.mo;
+
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.vmware.pbm.PbmCapabilityProfile;
+import com.vmware.pbm.PbmProfile;
+import com.vmware.pbm.PbmProfileCategoryEnum;
+import com.vmware.pbm.PbmProfileId;
+import com.vmware.pbm.PbmProfileResourceType;
+import com.vmware.pbm.PbmProfileResourceTypeEnum;
+import com.vmware.vim25.ManagedObjectReference;
+
+import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
+import org.apache.log4j.Logger;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PbmProfileManagerMO extends BaseMO {
+
+    private static final Logger LOGGER = Logger.getLogger(PbmProfileManagerMO.class);
+
+    public PbmProfileManagerMO (VmwareContext context) {
+        super(context, context.getPbmServiceContent().getProfileManager());
+    }
+
+    public PbmProfileManagerMO (VmwareContext context, ManagedObjectReference morProfileMgr) {
+        super(context, morProfileMgr);
+    }
+
+    public PbmProfileManagerMO (VmwareContext context, String morType, String morValue) {
+        super(context, morType, morValue);
+    }
+
+    public List<PbmProfileId> getStorageProfileIds() throws Exception {
+        if (LOGGER.isDebugEnabled()) {
+            LOGGER.debug("Querying vCenter " + _context.getServerAddress() + " for profiles");
+        }
+        List<PbmProfileId> profileIds = _context.getPbmService().pbmQueryProfile(_mor, getStorageResourceType(), null);
+        return profileIds;
+    }
+
+    public List<PbmProfile> getStorageProfiles() throws Exception {
+        List<PbmProfileId> profileIds = getStorageProfileIds();
+        List<PbmProfile> profiles = _context.getPbmService().pbmRetrieveContent(_mor, profileIds);
+
+        List<PbmProfile> requirementCategoryProfiles = profiles.stream()
+                .filter(x -> ((PbmCapabilityProfile)x).getProfileCategory().equals(PbmProfileCategoryEnum.REQUIREMENT.toString()))
+                .collect(Collectors.toList());
+        return requirementCategoryProfiles;
+    }
+
+    public PbmProfile getStorageProfile(String storageProfileId) throws Exception {
+        List<PbmProfileId> profileIds = getStorageProfileIds();
+
+        PbmProfileId profileId = profileIds.stream()
+                .filter(x -> x.getUniqueId().equals(storageProfileId))
+                .findFirst().orElse(null);
+
+        if (profileId == null) {
+            String errMsg = String.format("Storage profile with id %s not found", storageProfileId);
+            LOGGER.debug(errMsg);
+            throw new CloudRuntimeException(errMsg);
+        }
+
+        List<PbmProfile> profile = _context.getPbmService().pbmRetrieveContent(_mor, Collections.singletonList(profileId));
+        return profile.get(0);
+    }
+
+    private PbmProfileResourceType getStorageResourceType() {
+        PbmProfileResourceType resourceType = new PbmProfileResourceType();
+        resourceType.setResourceType(PbmProfileResourceTypeEnum.STORAGE.value());
+        return resourceType;
+    }
+
+
+    public VirtualMachineDefinedProfileSpec getProfileSpec(String profileId) throws Exception {
+        VirtualMachineDefinedProfileSpec profileSpec = new VirtualMachineDefinedProfileSpec();
+        PbmProfile profile = getStorageProfile(profileId);
+        profileSpec.setProfileId(profile.getProfileId().getUniqueId());
+        return profileSpec;
+    }
+
+}
+
+
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/StoragepodMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/StoragepodMO.java
new file mode 100644
index 0000000..afa3a02
--- /dev/null
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/StoragepodMO.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 com.cloud.hypervisor.vmware.mo;
+
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+import com.vmware.vim25.ManagedObjectReference;
+import com.vmware.vim25.StoragePodSummary;
+import org.apache.log4j.Logger;
+
+import java.util.List;
+
+public class StoragepodMO extends BaseMO {
+
+    private static final Logger LOGGER = Logger.getLogger(StoragepodMO.class);
+
+    public StoragepodMO(VmwareContext context, ManagedObjectReference mor) {
+        super(context, mor);
+    }
+
+    public StoragepodMO(VmwareContext context, String morType, String morValue) {
+        super(context, morType, morValue);
+    }
+
+    public StoragePodSummary getDatastoreClusterSummary() throws Exception {
+        return (StoragePodSummary)_context.getVimClient().getDynamicProperty(_mor, "summary");
+    }
+
+    public List<ManagedObjectReference> getDatastoresInDatastoreCluster() throws Exception {
+        List<ManagedObjectReference> datastoresInCluster = _context.getVimClient().getDynamicProperty(_mor, "childEntity");
+        return datastoresInCluster;
+    }
+
+}
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/TaskMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/TaskMO.java
index 65c6a6b..9cf9d95 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/TaskMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/TaskMO.java
@@ -77,4 +77,8 @@
 
         return sb.toString();
     }
+
+    public static TaskInfo getTaskInfo(VmwareContext context, ManagedObjectReference morTask) throws Exception {
+        return (TaskInfo)context.getVimClient().getDynamicProperty(morTask, "info");
+    }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index d5df4b9..5f61b31 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -35,6 +35,7 @@
 import java.util.concurrent.Future;
 
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 
 import com.google.gson.Gson;
@@ -104,6 +105,7 @@
 import com.vmware.vim25.VirtualMachineSnapshotTree;
 import com.vmware.vim25.VirtualSCSIController;
 import com.vmware.vim25.VirtualSCSISharing;
+import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
 
 import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo;
 import com.cloud.hypervisor.vmware.util.VmwareContext;
@@ -114,6 +116,8 @@
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.script.Script;
 
+import static com.cloud.utils.NumbersUtil.toHumanReadableSize;
+
 public class VirtualMachineMO extends BaseMO {
     private static final Logger s_logger = Logger.getLogger(VirtualMachineMO.class);
     private static final ExecutorService MonitorServiceExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("VM-Question-Monitor"));
@@ -224,11 +228,15 @@
                                         s_logger.info("msg id: " + msg.getId());
                                         s_logger.info("msg text: " + msg.getText());
                                     }
+                                    String logMsg = "Found that VM has a pending question that we need to answer programmatically, question id: " + msg.getId();
                                     if ("msg.uuid.altered".equalsIgnoreCase(msg.getId())) {
-                                        s_logger.info("Found that VM has a pending question that we need to answer programmatically, question id: " + msg.getId()
-                                                + ", we will automatically answer as 'moved it' to address out of band HA for the VM");
+                                        s_logger.info(logMsg + ", we will automatically answer as 'moved it' to address out of band HA for the VM");
                                         vmMo.answerVM(question.getId(), "1");
                                         break;
+                                    } else if (msg.getId().equalsIgnoreCase("msg.cpuid.noVHVQuestion")) {
+                                        s_logger.info(logMsg + ", automatically answering 'yes'");
+                                        vmMo.answerVM(question.getId(), "0");
+                                        break;
                                     }
                                 }
                             }
@@ -298,7 +306,7 @@
                     try {
                         Thread.sleep(1000);
                     } catch (InterruptedException e) {
-                        s_logger.debug("[ignored] interupted while powering of vm.");
+                        s_logger.debug("[ignored] interrupted while powering of vm.");
                     }
                 }
 
@@ -331,7 +339,7 @@
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
-                    s_logger.debug("[ignored] interupted while powering of vm unconditionaly.");
+                    s_logger.debug("[ignored] interrupted while powering of vm unconditionally.");
                 }
             }
             return true;
@@ -365,7 +373,7 @@
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
-                    s_logger.debug("[ignored] interupted while pausing after power off.");
+                    s_logger.debug("[ignored] interrupted while pausing after power off.");
                 }
             } else {
                 break;
@@ -404,6 +412,10 @@
         _context.getService().markAsTemplate(_mor);
     }
 
+    public void markAsVirtualMachine(ManagedObjectReference resourcePool, ManagedObjectReference host) throws Exception {
+        _context.getService().markAsVirtualMachine(_mor, resourcePool, host);
+    }
+
     public boolean isTemplate() throws Exception {
         VirtualMachineConfigInfo configInfo = getConfigInfo();
         return configInfo.isTemplate();
@@ -720,6 +732,44 @@
         return false;
     }
 
+    public boolean createFullCloneWithSpecificDisk(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs, Pair<VirtualDisk, String> volumeDeviceInfo)
+            throws Exception {
+
+        assert (morFolder != null);
+        assert (morResourcePool != null);
+        assert (morDs != null);
+        VirtualDisk requiredDisk = volumeDeviceInfo.first();
+
+        VirtualMachineRelocateSpec rSpec = new VirtualMachineRelocateSpec();
+        List<VirtualMachineRelocateSpecDiskLocator> diskLocator = new ArrayList<VirtualMachineRelocateSpecDiskLocator>(1);
+        VirtualMachineRelocateSpecDiskLocator loc = new VirtualMachineRelocateSpecDiskLocator();
+        loc.setDatastore(morDs);
+        loc.setDiskId(requiredDisk.getKey());
+        loc.setDiskMoveType(VirtualMachineRelocateDiskMoveOptions.MOVE_ALL_DISK_BACKINGS_AND_DISALLOW_SHARING.value());
+        diskLocator.add(loc);
+
+        rSpec.setDiskMoveType(VirtualMachineRelocateDiskMoveOptions.MOVE_ALL_DISK_BACKINGS_AND_DISALLOW_SHARING.value());
+        rSpec.getDisk().addAll(diskLocator);
+        rSpec.setPool(morResourcePool);
+
+        VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
+        cloneSpec.setPowerOn(false);
+        cloneSpec.setTemplate(false);
+        cloneSpec.setLocation(rSpec);
+
+        ManagedObjectReference morTask = _context.getService().cloneVMTask(_mor, morFolder, cloneName, cloneSpec);
+
+        boolean result = _context.getVimClient().waitForTask(morTask);
+        if (result) {
+            _context.waitForTaskProgressDone(morTask);
+            return true;
+        } else {
+            s_logger.error("VMware cloneVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+        }
+
+        return false;
+    }
+
     public boolean createFullClone(String cloneName, ManagedObjectReference morFolder, ManagedObjectReference morResourcePool, ManagedObjectReference morDs)
             throws Exception {
 
@@ -1098,13 +1148,13 @@
     }
 
     // vmdkDatastorePath: [datastore name] vmdkFilePath
-    public void createDisk(String vmdkDatastorePath, long sizeInMb, ManagedObjectReference morDs, int controllerKey) throws Exception {
-        createDisk(vmdkDatastorePath, VirtualDiskType.THIN, VirtualDiskMode.PERSISTENT, null, sizeInMb, morDs, controllerKey);
+    public void createDisk(String vmdkDatastorePath, long sizeInMb, ManagedObjectReference morDs, int controllerKey, String vSphereStoragePolicyId) throws Exception {
+        createDisk(vmdkDatastorePath, VirtualDiskType.THIN, VirtualDiskMode.PERSISTENT, null, sizeInMb, morDs, controllerKey, vSphereStoragePolicyId);
     }
 
     // vmdkDatastorePath: [datastore name] vmdkFilePath
     public void createDisk(String vmdkDatastorePath, VirtualDiskType diskType, VirtualDiskMode diskMode, String rdmDeviceName, long sizeInMb,
-                           ManagedObjectReference morDs, int controllerKey) throws Exception {
+                           ManagedObjectReference morDs, int controllerKey, String vSphereStoragePolicyId) throws Exception {
 
         if (s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - createDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + vmdkDatastorePath + ", sizeInMb: " + sizeInMb +
@@ -1169,7 +1219,14 @@
         deviceConfigSpec.setDevice(newDisk);
         deviceConfigSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.CREATE);
         deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
+        if (!StringUtils.isEmpty(vSphereStoragePolicyId)) {
+            PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(getContext());
+            VirtualMachineDefinedProfileSpec diskProfileSpec = profMgrMo.getProfileSpec(vSphereStoragePolicyId);
+            deviceConfigSpec.getProfile().add(diskProfileSpec);
+            if (s_logger.isDebugEnabled()) {
+                s_logger.debug(String.format("Adding vSphere storage profile: %s to volume [%s]", vSphereStoragePolicyId, vmdkDatastorePath));
+            }
+        }
         reConfigSpec.getDeviceChange().add(deviceConfigSpec);
 
         ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);
@@ -1187,7 +1244,18 @@
             s_logger.trace("vCenter API trace - createDisk() done(successfully)");
     }
 
-    public void updateVmdkAdapter(String vmdkFileName, String newAdapterType) throws Exception {
+    public void updateVmdkAdapter(String vmdkFileName, String diskController) throws Exception {
+
+        DiskControllerType diskControllerType = DiskControllerType.getType(diskController);
+        VmdkAdapterType vmdkAdapterType = VmdkAdapterType.getAdapterType(diskControllerType);
+        if (vmdkAdapterType == VmdkAdapterType.none) {
+            String message = "Failed to attach disk due to invalid vmdk adapter type for vmdk file [" +
+                    vmdkFileName + "] with controller : " + diskControllerType;
+            s_logger.debug(message);
+            throw new Exception(message);
+        }
+
+        String newAdapterType = vmdkAdapterType.toString();
         Pair<VmdkFileDescriptor, byte[]> vmdkInfo = getVmdkFileInfo(vmdkFileName);
         VmdkFileDescriptor vmdkFileDescriptor = vmdkInfo.first();
         boolean isVmfsSparseFile = vmdkFileDescriptor.isVmfsSparseFile();
@@ -1232,7 +1300,11 @@
         }
     }
 
-    public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs, String diskController) throws Exception {
+    public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs) throws Exception {
+        attachDisk(vmdkDatastorePathChain, morDs, null, null);
+    }
+
+    public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs, String diskController, String vSphereStoragePolicyId) throws Exception {
 
         if(s_logger.isTraceEnabled())
             s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: "
@@ -1254,30 +1326,33 @@
             controllerKey = getIDEControllerKey(ideDeviceCount);
             unitNumber = getFreeUnitNumberOnIDEController(controllerKey);
         } else {
-            controllerKey = getScsiDiskControllerKey(diskController);
+            if (StringUtils.isNotBlank(diskController)) {
+                controllerKey = getScsiDiskControllerKey(diskController);
+            } else {
+                controllerKey = getScsiDeviceControllerKey();
+            }
             unitNumber = -1;
         }
+
         synchronized (_mor.getValue().intern()) {
             VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, controllerKey, vmdkDatastorePathChain, morDs, unitNumber, 1);
-            controllerKey = newDisk.getControllerKey();
-            unitNumber = newDisk.getUnitNumber();
-            VirtualDiskFlatVer2BackingInfo backingInfo = (VirtualDiskFlatVer2BackingInfo)newDisk.getBacking();
-            String vmdkFileName = backingInfo.getFileName();
-            DiskControllerType diskControllerType = DiskControllerType.getType(diskController);
-            VmdkAdapterType vmdkAdapterType = VmdkAdapterType.getAdapterType(diskControllerType);
-            if (vmdkAdapterType == VmdkAdapterType.none) {
-                String message = "Failed to attach disk due to invalid vmdk adapter type for vmdk file [" +
-                    vmdkFileName + "] with controller : " + diskControllerType;
-                s_logger.debug(message);
-                throw new Exception(message);
+            if (StringUtils.isNotBlank(diskController)) {
+                String vmdkFileName = vmdkDatastorePathChain[0];
+                updateVmdkAdapter(vmdkFileName, diskController);
             }
-            updateVmdkAdapter(vmdkFileName, vmdkAdapterType.toString());
             VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec();
             VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec();
 
             deviceConfigSpec.setDevice(newDisk);
             deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
+            if (!StringUtils.isEmpty(vSphereStoragePolicyId)) {
+                PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(getContext());
+                VirtualMachineDefinedProfileSpec diskProfileSpec = profMgrMo.getProfileSpec(vSphereStoragePolicyId);
+                deviceConfigSpec.getProfile().add(diskProfileSpec);
+                if (s_logger.isDebugEnabled()) {
+                    s_logger.debug(String.format("Adding vSphere storage profile: %s to volume [%s]", vSphereStoragePolicyId, vmdkDatastorePathChain[0]));
+                }
+            }
             reConfigSpec.getDeviceChange().add(deviceConfigSpec);
 
             ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);
@@ -1311,69 +1386,6 @@
 
     }
 
-    public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs) throws Exception {
-
-        if (s_logger.isTraceEnabled())
-            s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain) +
-                    ", datastore: " + morDs.getValue());
-
-        synchronized (_mor.getValue().intern()) {
-            VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, null, getScsiDeviceControllerKey(), vmdkDatastorePathChain, morDs, -1, 1);
-            VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec();
-            VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec();
-
-            deviceConfigSpec.setDevice(newDisk);
-            deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
-            reConfigSpec.getDeviceChange().add(deviceConfigSpec);
-
-            ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);
-            boolean result = _context.getVimClient().waitForTask(morTask);
-
-            if (!result) {
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("vCenter API trace - attachDisk() done(failed)");
-                throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask));
-            }
-
-            _context.waitForTaskProgressDone(morTask);
-        }
-
-        if (s_logger.isTraceEnabled())
-            s_logger.trace("vCenter API trace - attachDisk() done(successfully)");
-    }
-
-    public void attachDisk(Pair<String, ManagedObjectReference>[] vmdkDatastorePathChain, int controllerKey) throws Exception {
-
-        if (s_logger.isTraceEnabled())
-            s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " + new Gson().toJson(vmdkDatastorePathChain));
-
-        synchronized (_mor.getValue().intern()) {
-            VirtualDevice newDisk = VmwareHelper.prepareDiskDevice(this, controllerKey, vmdkDatastorePathChain, -1, 1);
-            VirtualMachineConfigSpec reConfigSpec = new VirtualMachineConfigSpec();
-            VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec();
-
-            deviceConfigSpec.setDevice(newDisk);
-            deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
-
-            reConfigSpec.getDeviceChange().add(deviceConfigSpec);
-
-            ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);
-            boolean result = _context.getVimClient().waitForTask(morTask);
-
-            if (!result) {
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("vCenter API trace - attachDisk() done(failed)");
-                throw new Exception("Failed to attach disk due to " + TaskMO.getTaskFailureInfo(_context, morTask));
-            }
-
-            _context.waitForTaskProgressDone(morTask);
-        }
-
-        if (s_logger.isTraceEnabled())
-            s_logger.trace("vCenter API trace - attachDisk() done(successfully)");
-    }
-
     // vmdkDatastorePath: [datastore name] vmdkFilePath
     public List<Pair<String, ManagedObjectReference>> detachDisk(String vmdkDatastorePath, boolean deleteBackingFile) throws Exception {
 
@@ -1744,7 +1756,7 @@
                                 @Override
                                 public void action(Long param) {
                                     if (s_logger.isTraceEnabled()) {
-                                        s_logger.trace("Download progress " + param + "/" + totalBytes);
+                                        s_logger.trace("Download progress " + param + "/" + toHumanReadableSize(totalBytes));
                                     }
                                     progressReporter.reportProgress((int)(param * 100 / totalBytes));
                                 }
@@ -1785,7 +1797,7 @@
                                 command.add((new File(name).getName()));
                             }
 
-                            s_logger.info("Package OVA with commmand: " + command.toString());
+                            s_logger.info("Package OVA with command: " + command.toString());
                             command.execute();
 
                             // to be safe, physically test existence of the target OVA file
@@ -1798,7 +1810,7 @@
                             success = true;
                         }
                     }
-                    s_logger.info("volss: copy vmdk and ovf file finishes " + System.currentTimeMillis());
+                    s_logger.info("volss: copy vmdk and ovf file finished " + System.currentTimeMillis());
                 } catch (Throwable e) {
                     s_logger.error("Unexpected exception ", e);
                 } finally {
@@ -1957,21 +1969,21 @@
     }
 
     // return the disk chain (VMDK datastore paths) for cloned snapshot
-    public Pair<VirtualMachineMO, String[]> cloneFromCurrentSnapshot(String clonedVmName, int cpuSpeedMHz, int memoryMb, String diskDevice, ManagedObjectReference morDs)
+    public Pair<VirtualMachineMO, String[]> cloneFromCurrentSnapshot(String clonedVmName, int cpuSpeedMHz, int memoryMb, String diskDevice, ManagedObjectReference morDs, String virtualHardwareVersion)
             throws Exception {
         assert (morDs != null);
         String[] disks = getCurrentSnapshotDiskChainDatastorePaths(diskDevice);
-        VirtualMachineMO clonedVm = cloneFromDiskChain(clonedVmName, cpuSpeedMHz, memoryMb, disks, morDs);
+        VirtualMachineMO clonedVm = cloneFromDiskChain(clonedVmName, cpuSpeedMHz, memoryMb, disks, morDs, virtualHardwareVersion);
         return new Pair<VirtualMachineMO, String[]>(clonedVm, disks);
     }
 
-    public VirtualMachineMO cloneFromDiskChain(String clonedVmName, int cpuSpeedMHz, int memoryMb, String[] disks, ManagedObjectReference morDs) throws Exception {
+    public VirtualMachineMO cloneFromDiskChain(String clonedVmName, int cpuSpeedMHz, int memoryMb, String[] disks, ManagedObjectReference morDs, String cloneHardwareVersion) throws Exception {
         assert (disks != null);
         assert (disks.length >= 1);
 
         HostMO hostMo = getRunningHost();
 
-        VirtualMachineMO clonedVmMo = HypervisorHostHelper.createWorkerVM(hostMo, new DatastoreMO(hostMo.getContext(), morDs), clonedVmName);
+        VirtualMachineMO clonedVmMo = HypervisorHostHelper.createWorkerVM(hostMo, new DatastoreMO(hostMo.getContext(), morDs), clonedVmName, cloneHardwareVersion);
         if (clonedVmMo == null)
             throw new Exception("Unable to find just-created blank VM");
 
@@ -2224,22 +2236,22 @@
 
     // Would be useful if there exists multiple sub types of SCSI controllers per VM are supported in CloudStack f
     public int getScsiDiskControllerKey(String diskController) throws Exception {
-        List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().
-                getDynamicProperty(_mor, "config.hardware.device");
+        List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().getDynamicProperty(_mor, "config.hardware.device");
 
-        if (devices != null && devices.size() > 0) {
+        if (CollectionUtils.isNotEmpty(devices)) {
+            DiskControllerType diskControllerType = DiskControllerType.getType(diskController);
             for (VirtualDevice device : devices) {
-                if ((DiskControllerType.getType(diskController) == DiskControllerType.lsilogic || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualLsiLogicController) {
+                if ((diskControllerType == DiskControllerType.lsilogic || diskControllerType == DiskControllerType.scsi)
+                        && device instanceof VirtualLsiLogicController && isValidScsiDiskController((VirtualLsiLogicController)device)) {
                     return ((VirtualLsiLogicController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.lsisas1068 || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualLsiLogicSASController) {
+                } else if ((diskControllerType == DiskControllerType.lsisas1068 || diskControllerType == DiskControllerType.scsi)
+                        && device instanceof VirtualLsiLogicSASController && isValidScsiDiskController((VirtualLsiLogicSASController)device)) {
                     return ((VirtualLsiLogicSASController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.pvscsi || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof ParaVirtualSCSIController) {
+                } else if ((diskControllerType == DiskControllerType.pvscsi || diskControllerType == DiskControllerType.scsi)
+                        && device instanceof ParaVirtualSCSIController && isValidScsiDiskController((ParaVirtualSCSIController)device)) {
                     return ((ParaVirtualSCSIController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.buslogic || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualBusLogicController) {
+                } else if ((diskControllerType == DiskControllerType.buslogic || diskControllerType == DiskControllerType.scsi)
+                        && device instanceof VirtualBusLogicController && isValidScsiDiskController((VirtualBusLogicController)device)) {
                     return ((VirtualBusLogicController)device).getKey();
                 }
             }
@@ -2249,24 +2261,46 @@
         throw new IllegalStateException("Scsi disk controller of type " + diskController + " not found among configured devices.");
     }
 
-    public int getScsiDiskControllerKeyNoException(String diskController) throws Exception {
-        List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().
-                getDynamicProperty(_mor, "config.hardware.device");
+    public int getScsiDiskControllerKeyNoException(String diskController, int scsiUnitNumber) throws Exception {
+        List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().getDynamicProperty(_mor, "config.hardware.device");
 
-        if (devices != null && devices.size() > 0) {
+        if (CollectionUtils.isNotEmpty(devices) && scsiUnitNumber >= 0) {
+            int requiredScsiController = scsiUnitNumber / VmwareHelper.MAX_ALLOWED_DEVICES_SCSI_CONTROLLER;
+            int scsiControllerDeviceCount = 0;
+            DiskControllerType diskControllerType = DiskControllerType.getType(diskController);
             for (VirtualDevice device : devices) {
-                if ((DiskControllerType.getType(diskController) == DiskControllerType.lsilogic || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualLsiLogicController) {
-                    return ((VirtualLsiLogicController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.lsisas1068 || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualLsiLogicSASController) {
-                    return ((VirtualLsiLogicSASController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.pvscsi || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof ParaVirtualSCSIController) {
-                    return ((ParaVirtualSCSIController)device).getKey();
-                } else if ((DiskControllerType.getType(diskController) == DiskControllerType.buslogic || DiskControllerType.getType(diskController) == DiskControllerType.scsi)
-                        && device instanceof VirtualBusLogicController) {
-                    return ((VirtualBusLogicController)device).getKey();
+                if ((diskControllerType == DiskControllerType.lsilogic || diskControllerType == DiskControllerType.scsi) && device instanceof VirtualLsiLogicController) {
+                    if (scsiControllerDeviceCount == requiredScsiController) {
+                        if (isValidScsiDiskController((VirtualLsiLogicController)device)) {
+                            return ((VirtualLsiLogicController)device).getKey();
+                        }
+                        break;
+                    }
+                    scsiControllerDeviceCount++;
+                } else if ((diskControllerType == DiskControllerType.lsisas1068 || diskControllerType == DiskControllerType.scsi) && device instanceof VirtualLsiLogicSASController) {
+                    if (scsiControllerDeviceCount == requiredScsiController) {
+                        if (isValidScsiDiskController((VirtualLsiLogicSASController)device)) {
+                            return ((VirtualLsiLogicSASController)device).getKey();
+                        }
+                        break;
+                    }
+                    scsiControllerDeviceCount++;
+                } else if ((diskControllerType == DiskControllerType.pvscsi || diskControllerType == DiskControllerType.scsi) && device instanceof ParaVirtualSCSIController) {
+                    if (scsiControllerDeviceCount == requiredScsiController) {
+                        if (isValidScsiDiskController((ParaVirtualSCSIController)device)) {
+                            return ((ParaVirtualSCSIController)device).getKey();
+                        }
+                        break;
+                    }
+                    scsiControllerDeviceCount++;
+                } else if ((diskControllerType == DiskControllerType.buslogic || diskControllerType == DiskControllerType.scsi) && device instanceof VirtualBusLogicController) {
+                    if (scsiControllerDeviceCount == requiredScsiController) {
+                        if (isValidScsiDiskController((VirtualBusLogicController)device)) {
+                            return ((VirtualBusLogicController)device).getKey();
+                        }
+                        break;
+                    }
+                    scsiControllerDeviceCount++;
                 }
             }
         }
@@ -2285,7 +2319,7 @@
 
         if (devices != null && devices.size() > 0) {
             for (VirtualDevice device : devices) {
-                if (device instanceof VirtualSCSIController) {
+                if (device instanceof VirtualSCSIController && isValidScsiDiskController((VirtualSCSIController)device)) {
                     return device.getKey();
                 }
             }
@@ -2295,27 +2329,12 @@
         throw new Exception("SCSI Controller Not Found");
     }
 
-    public int getGenericScsiDeviceControllerKeyNoException() throws Exception {
+    public int getScsiDeviceControllerKeyNoException() throws Exception {
         List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor, "config.hardware.device");
 
         if (devices != null && devices.size() > 0) {
             for (VirtualDevice device : devices) {
-                if (device instanceof VirtualSCSIController) {
-                    return device.getKey();
-                }
-            }
-        }
-
-        return -1;
-    }
-
-    public int getScsiDeviceControllerKeyNoException() throws Exception {
-        List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().
-            getDynamicProperty(_mor, "config.hardware.device");
-
-        if(devices != null && devices.size() > 0) {
-            for(VirtualDevice device : devices) {
-                if(device instanceof VirtualSCSIController) {
+                if (device instanceof VirtualSCSIController && isValidScsiDiskController((VirtualSCSIController)device)) {
                     return device.getKey();
                 }
             }
@@ -2412,6 +2431,23 @@
         }
     }
 
+    private boolean isValidScsiDiskController(VirtualSCSIController scsiDiskController) {
+        if (scsiDiskController == null) {
+            return false;
+        }
+
+        List<Integer> scsiDiskDevicesOnController = scsiDiskController.getDevice();
+        if (scsiDiskDevicesOnController == null || scsiDiskDevicesOnController.size() >= (VmwareHelper.MAX_SUPPORTED_DEVICES_SCSI_CONTROLLER)) {
+            return false;
+        }
+
+        if (scsiDiskController.getBusNumber() >= VmwareHelper.MAX_SCSI_CONTROLLER_COUNT) {
+            return false;
+        }
+
+        return true;
+    }
+
     // return pair of VirtualDisk and disk device bus name(ide0:0, etc)
     public Pair<VirtualDisk, String> getDiskDevice(String vmdkDatastorePath) throws Exception {
         final String zeroLengthString = "";
@@ -2455,7 +2491,6 @@
                                     String deviceNumbering = getDeviceBusName(devices, device);
 
                                     s_logger.info("Disk backing : " + diskBackingInfo.getFileName() + " matches ==> " + deviceNumbering);
-
                                     return new Pair<>((VirtualDisk)device, deviceNumbering);
                                 }
 
@@ -2526,15 +2561,15 @@
                             if (matchExactly) {
                                 if (backingBaseName.equalsIgnoreCase(srcBaseName)) {
                                     String deviceNumbering = getDeviceBusName(devices, device);
-
                                     s_logger.info("Disk backing : " + diskBackingInfo.getFileName() + " matches ==> " + deviceNumbering);
+
                                     return new Pair<VirtualDisk, String>((VirtualDisk)device, deviceNumbering);
                                 }
                             } else {
                                 if (backingBaseName.contains(trimmedSrcBaseName)) {
                                     String deviceNumbering = getDeviceBusName(devices, device);
-
                                     s_logger.info("Disk backing : " + diskBackingInfo.getFileName() + " matches ==> " + deviceNumbering);
+
                                     return new Pair<VirtualDisk, String>((VirtualDisk)device, deviceNumbering);
                                 }
                             }
@@ -2598,7 +2633,6 @@
                     VirtualDeviceBackingInfo backingInfo = ((VirtualDisk)device).getBacking();
                     if (backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
                         VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
-
                         while (diskBackingInfo != null) {
                             String deviceBusName = getDeviceBusName(devices, device);
                             builder.addDisk(deviceBusName, diskBackingInfo.getFileName());
@@ -2985,7 +3019,7 @@
 
         List<Integer> existingUnitNumbers = new ArrayList<Integer>();
         int deviceNumber = 0;
-        int scsiControllerKey = getGenericScsiDeviceControllerKeyNoException();
+        int scsiControllerKey = getScsiDeviceControllerKeyNoException();
         if (devices != null && devices.size() > 0) {
             for (VirtualDevice device : devices) {
                 if (device.getControllerKey() != null && device.getControllerKey().intValue() == controllerKey) {
@@ -3034,6 +3068,10 @@
         return nics;
     }
 
+    public VirtualDevice[] getSortedNicDevices() throws Exception {
+        return getNicDevices(true).toArray(new VirtualDevice[0]);
+    }
+
     public VirtualDevice[] getNicDevices() throws Exception {
         return getNicDevices(false).toArray(new VirtualDevice[0]);
     }
@@ -3455,4 +3493,29 @@
         }
         return false;
     }
+
+    /**
+     * Upgrades this virtual machine's virtual hardware to the latest revision that is supported by the virtual machine's current host.
+     * @param version If specified, upgrade to that specified version. If not specified, upgrade to the most current virtual hardware supported on the host.
+     * @return true if success, false if not
+     */
+    public boolean upgradeVirtualHardwareVersion(String version) {
+        try {
+            String targetHwVersion = StringUtils.isNotBlank(version) ? version : "the highest available";
+            s_logger.info("Upgrading the VM hardware version to " + targetHwVersion);
+            ManagedObjectReference morTask = _context.getService().upgradeVMTask(_mor, version);
+            boolean result = _context.getVimClient().waitForTask(morTask);
+            if (result) {
+                _context.waitForTaskProgressDone(morTask);
+            } else {
+                s_logger.error("VMware upgradeVMTask failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+                return false;
+            }
+            return true;
+        } catch (Exception e) {
+            String msg = "Attempted to upgrade VM hardware version failed: " + e.getMessage();
+            s_logger.error(msg, e);
+            return false;
+        }
+    }
 }
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualStorageObjectManagerMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualStorageObjectManagerMO.java
new file mode 100644
index 0000000..d5f4eb3
--- /dev/null
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualStorageObjectManagerMO.java
@@ -0,0 +1,94 @@
+// 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.vmware.mo;
+
+import com.vmware.vim25.ID;
+import com.vmware.vim25.TaskInfo;
+import com.vmware.vim25.VStorageObject;
+import com.vmware.vim25.VirtualDiskType;
+import com.vmware.vim25.VslmCreateSpec;
+import com.vmware.vim25.VslmCreateSpecDiskFileBackingSpec;
+import org.apache.log4j.Logger;
+
+import com.vmware.vim25.ManagedObjectReference;
+
+import com.cloud.hypervisor.vmware.util.VmwareContext;
+
+public class VirtualStorageObjectManagerMO extends BaseMO {
+    @SuppressWarnings("unused")
+    private static final Logger LOGGER = Logger.getLogger(VirtualStorageObjectManagerMO.class);
+
+    public VirtualStorageObjectManagerMO(VmwareContext context) {
+        super(context, context.getServiceContent().getVStorageObjectManager());
+    }
+
+    public VirtualStorageObjectManagerMO(VmwareContext context, ManagedObjectReference morDiskMgr) {
+        super(context, morDiskMgr);
+    }
+
+    public VirtualStorageObjectManagerMO(VmwareContext context, String morType, String morValue) {
+        super(context, morType, morValue);
+    }
+
+    public VStorageObject registerVirtualDisk(DatastoreFile datastoreFile, String name, String dcName) throws Exception {
+        StringBuilder sb = new StringBuilder();
+        //https://10.2.2.254/folder/i-2-4-VM/89e3756d9b7444dc92388eb36ddd026b.vmdk?dcPath=datacenter-21&dsName=c84e4af9b6ac33e887a25d9242650091
+        sb.append("https://").append(_context.getServerAddress()).append("/folder/");
+        sb.append(datastoreFile.getRelativePath());
+        sb.append("?dcPath=");
+        sb.append(dcName);
+        sb.append("&dsName=");
+        sb.append(datastoreFile.getDatastoreName());
+        return _context.getService().registerDisk(_mor, sb.toString(), name);
+    }
+
+    public VStorageObject retrieveVirtualDisk (ID id, ManagedObjectReference morDS) throws Exception {
+        return _context.getService().retrieveVStorageObject(_mor, id, morDS);
+    }
+
+    public VStorageObject createDisk(ManagedObjectReference morDS, VirtualDiskType diskType, long currentSizeInBytes, String datastoreFilepath, String filename) throws Exception {
+        long currentSizeInMB = currentSizeInBytes/(1024*1024);
+
+        VslmCreateSpecDiskFileBackingSpec diskFileBackingSpec = new VslmCreateSpecDiskFileBackingSpec();
+        diskFileBackingSpec.setDatastore(morDS);
+        diskFileBackingSpec.setProvisioningType(diskType.value());
+        // path should be just the folder name. For example, instead of '[datastore1] folder1/filename.vmdk' you would just do 'folder1'.
+        // path is introduced from 6.7. In 6.5 disk will be created in the default folder "fcd"
+        diskFileBackingSpec.setPath(null);
+
+        VslmCreateSpec vslmCreateSpec = new VslmCreateSpec();
+        vslmCreateSpec.setBackingSpec(diskFileBackingSpec);
+        vslmCreateSpec.setCapacityInMB(currentSizeInMB);
+        vslmCreateSpec.setName(filename);
+
+        ManagedObjectReference morTask = _context.getService().createDiskTask(_mor, vslmCreateSpec);
+        boolean result = _context.getVimClient().waitForTask(morTask);
+
+        VStorageObject vStorageObject = null;
+        if (result) {
+            _context.waitForTaskProgressDone(morTask);
+            //_context.getService().reconcileDatastoreInventoryTask(_mor, morDS);
+            TaskInfo taskInfo = TaskMO.getTaskInfo(_context, morTask);
+            vStorageObject = (VStorageObject)taskInfo.getResult();
+
+        } else {
+            LOGGER.error("VMware CreateDisk_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+        }
+
+        return vStorageObject;
+    }
+}
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkAdapterType.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkAdapterType.java
index f602c46..ff0a7d3 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkAdapterType.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkAdapterType.java
@@ -35,6 +35,8 @@
     }
 
     public static VmdkAdapterType getType(String vmdkAdapterType) {
+        if (vmdkAdapterType == null)
+            return VmdkAdapterType.none;
         if (vmdkAdapterType.equalsIgnoreCase("ide")) {
             return VmdkAdapterType.ide;
         } else if (vmdkAdapterType.equalsIgnoreCase("lsilogic")) {
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkFileDescriptor.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkFileDescriptor.java
index 556efd7..7ede78f 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkFileDescriptor.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmdkFileDescriptor.java
@@ -31,6 +31,7 @@
     private static final Logger s_logger = Logger.getLogger(VmdkFileDescriptor.class);
     private static final String VMDK_PROPERTY_CREATE_TYPE = "createType";
     private static final String VMDK_CREATE_TYPE_VMFSSPARSE = "vmfsSparse";
+    private static final String VMDK_CREATE_TYPE_SESPARSE = "SEsparse";
     private static final String VMDK_PROPERTY_ADAPTER_TYPE = "ddb.adapterType";
 
     private Properties _properties = new Properties();
@@ -89,7 +90,7 @@
 
     public boolean isVmfsSparseFile() {
         String vmdkCreateType = _properties.getProperty(VMDK_PROPERTY_CREATE_TYPE);
-        if (vmdkCreateType.equalsIgnoreCase(VMDK_CREATE_TYPE_VMFSSPARSE)) {
+        if (vmdkCreateType.equalsIgnoreCase(VMDK_CREATE_TYPE_VMFSSPARSE) || vmdkCreateType.equalsIgnoreCase(VMDK_CREATE_TYPE_SESPARSE)) {
             return true;
         }
         return false;
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java
index f99384a..ce2f178 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VmwareHypervisorHost.java
@@ -65,13 +65,13 @@
                           int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent,
                           Pair<String, String> controllerInfo, Boolean systemVm) throws Exception;
 
-    void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption) throws Exception;
+    void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, String configurationId) throws Exception;
 
     ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception;
 
     ObjectContent[] getDatastorePropertiesOnHyperHost(String[] propertyPaths) throws Exception;
 
-    ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid) throws Exception;
+    ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolHostAddress, int poolHostPort, String poolPath, String poolUuid, boolean createBaseFolder) throws Exception;
 
     void unmountDatastore(String poolUuid) throws Exception;
 
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VcenterSessionHandler.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VcenterSessionHandler.java
new file mode 100644
index 0000000..9efab7b
--- /dev/null
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VcenterSessionHandler.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 com.cloud.hypervisor.vmware.util;
+
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.soap.SOAPHandler;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.DOMException;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class VcenterSessionHandler implements SOAPHandler<SOAPMessageContext> {
+    public static final Logger s_logger = Logger.getLogger(VcenterSessionHandler.class);
+    private final String vcSessionCookie;
+
+    public VcenterSessionHandler(String vcSessionCookie) {
+        this.vcSessionCookie = vcSessionCookie;
+    }
+
+    @Override
+    public boolean handleMessage(SOAPMessageContext smc) {
+        if (isOutgoingMessage(smc)) {
+            try {
+                SOAPHeader header = getSOAPHeader(smc);
+
+                SOAPElement vcsessionHeader = header.addChildElement(new javax.xml.namespace.QName("#",
+                        "vcSessionCookie"));
+                vcsessionHeader.setValue(vcSessionCookie);
+
+            } catch (DOMException e) {
+                s_logger.debug(e);
+                throw new CloudRuntimeException(e);
+            } catch (SOAPException e) {
+                s_logger.debug(e);
+                throw new CloudRuntimeException(e);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public void close(MessageContext arg0) {
+    }
+
+    @Override
+    public boolean handleFault(SOAPMessageContext arg0) {
+        return false;
+    }
+
+    @Override
+    public Set<QName> getHeaders() {
+        return null;
+    }
+
+    SOAPHeader getSOAPHeader(SOAPMessageContext smc) throws SOAPException {
+        return smc.getMessage().getSOAPPart().getEnvelope().getHeader() == null ? smc
+                .getMessage().getSOAPPart().getEnvelope().addHeader()
+                : smc.getMessage().getSOAPPart().getEnvelope().getHeader();
+    }
+
+    boolean isOutgoingMessage(SOAPMessageContext smc) {
+        Boolean outboundProperty = (Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
+        return outboundProperty;
+    }
+
+}
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareClient.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareClient.java
index 3d80ffd..2395ccf 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareClient.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareClient.java
@@ -17,8 +17,11 @@
 package com.cloud.hypervisor.vmware.util;
 
 import java.lang.reflect.Method;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -29,9 +32,16 @@
 import javax.xml.ws.BindingProvider;
 import javax.xml.ws.WebServiceException;
 import javax.xml.ws.handler.MessageContext;
+import javax.xml.ws.handler.Handler;
+import javax.xml.ws.handler.HandlerResolver;
+import javax.xml.ws.handler.PortInfo;
+
 
 import org.apache.cloudstack.utils.security.SSLUtils;
 import org.apache.cloudstack.utils.security.SecureSSLSocketFactory;
+import com.vmware.pbm.PbmPortType;
+import com.vmware.pbm.PbmService;
+import com.vmware.pbm.PbmServiceInstanceContent;
 import org.apache.log4j.Logger;
 import org.w3c.dom.Element;
 
@@ -101,6 +111,7 @@
             HttpsURLConnection.setDefaultHostnameVerifier(hv);
 
             vimService = new VimService();
+            pbmService = new PbmService();
         } catch (Exception e) {
             s_logger.info("[ignored]"
                     + "failed to trust all certificates blindly: ", e);
@@ -120,8 +131,16 @@
     }
 
     private final ManagedObjectReference svcInstRef = new ManagedObjectReference();
+    private final ManagedObjectReference pbmSvcInstRef = new ManagedObjectReference();
+
     private static VimService vimService;
+    private static PbmService pbmService;
+    private PbmServiceInstanceContent pbmServiceContent;
     private VimPortType vimPort;
+    private PbmPortType pbmPort;
+    private static final String PBM_SERVICE_INSTANCE_TYPE = "PbmServiceInstance";
+    private static final String PBM_SERVICE_INSTANCE_VALUE = "ServiceInstance";
+
     private String serviceCookie;
     private final static String SVC_INST_NAME = "ServiceInstance";
     private int vCenterSessionTimeout = 1200000; // Timeout in milliseconds
@@ -176,10 +195,38 @@
         cookieValue = tokenizer.nextToken();
         String pathData = "$" + tokenizer.nextToken();
         serviceCookie = "$Version=\"1\"; " + cookieValue + "; " + pathData;
-
+        Map<String, List<String>> map = new HashMap<String, List<String>>();
+        map.put("Cookie", Collections.singletonList(serviceCookie));
+        ((BindingProvider)vimPort).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, map);
+        pbmConnect(url, cookieValue);
         isConnected = true;
     }
 
+    private void pbmConnect(String url, String cookieValue) throws Exception {
+        URI uri = new URI(url);
+        String pbmurl = "https://" + uri.getHost() + "/pbm";
+        String[] tokens = cookieValue.split("=");
+        String extractedCookie = tokens[1];
+
+        HandlerResolver soapHandlerResolver = new HandlerResolver() {
+            @Override
+            public List<Handler> getHandlerChain(PortInfo portInfo) {
+                VcenterSessionHandler VcSessionHandler = new VcenterSessionHandler(extractedCookie);
+                List<Handler> handlerChain = new ArrayList<Handler>();
+                handlerChain.add((Handler)VcSessionHandler);
+                return handlerChain;
+            }
+        };
+        pbmService.setHandlerResolver(soapHandlerResolver);
+
+        pbmSvcInstRef.setType(PBM_SERVICE_INSTANCE_TYPE);
+        pbmSvcInstRef.setValue(PBM_SERVICE_INSTANCE_VALUE);
+        pbmPort = pbmService.getPbmPort();
+        Map<String, Object> pbmCtxt = ((BindingProvider)pbmPort).getRequestContext();
+        pbmCtxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
+        pbmCtxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, pbmurl);
+    }
+
     /**
      * Disconnects the user session.
      *
@@ -212,6 +259,24 @@
     }
 
     /**
+     * @return PBM service instance
+     */
+    public PbmPortType getPbmService() {
+        return pbmPort;
+    }
+
+    /**
+     * @return Service instance content
+     */
+    public PbmServiceInstanceContent getPbmServiceContent() {
+        try {
+            return pbmPort.pbmRetrieveServiceContent(pbmSvcInstRef);
+        } catch (com.vmware.pbm.RuntimeFaultFaultMsg e) {
+        }
+        return null;
+    }
+
+    /**
      * @return cookie used in service connection
      */
     public String getServiceCookie() {
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareContext.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareContext.java
index 9b477ae..af44962 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareContext.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareContext.java
@@ -20,6 +20,8 @@
 import com.cloud.hypervisor.vmware.mo.DatastoreFile;
 import com.cloud.utils.ActionDelegate;
 import com.cloud.utils.StringUtils;
+import com.vmware.pbm.PbmPortType;
+import com.vmware.pbm.PbmServiceInstanceContent;
 import com.vmware.vim25.ManagedObjectReference;
 import com.vmware.vim25.ObjectContent;
 import com.vmware.vim25.ObjectSpec;
@@ -148,6 +150,14 @@
         return _vimClient.getServiceContent();
     }
 
+    public PbmPortType getPbmService() {
+        return _vimClient.getPbmService();
+    }
+
+    public PbmServiceInstanceContent getPbmServiceContent() {
+        return _vimClient.getPbmServiceContent();
+    }
+
     public ManagedObjectReference getPropertyCollector() {
         return _vimClient.getPropCol();
     }
@@ -311,6 +321,24 @@
         return dcMo.findDatastore(tokens[1]);
     }
 
+    // path in format of <datacenter name>/<datastore name>
+    public String getDatastoreNameFromPath(String inventoryPath) throws Exception {
+        assert (inventoryPath != null);
+
+        String[] tokens;
+        if (inventoryPath.startsWith("/"))
+            tokens = inventoryPath.substring(1).split("/");
+        else
+            tokens = inventoryPath.split("/");
+
+        if (tokens == null || tokens.length != 2) {
+            s_logger.error("Invalid datastore inventory path. path: " + inventoryPath);
+            return null;
+        }
+
+        return tokens[1];
+    }
+
     public void waitForTaskProgressDone(ManagedObjectReference morTask) throws Exception {
         while (true) {
             TaskInfo tinfo = (TaskInfo)_vimClient.getDynamicProperty(morTask, "info");
@@ -339,32 +367,32 @@
         out.close();
     }
 
-    public void uploadFile(String urlString, String localFileFullName) throws Exception {
-        uploadFile(urlString, new File(localFileFullName));
-    }
+    public void uploadFile(String httpMethod, String urlString, String localFileName) throws Exception {
+        HttpURLConnection conn = getRawHTTPConnection(urlString);
 
-    public void uploadFile(String urlString, File localFile) throws Exception {
-        HttpURLConnection conn = getHTTPConnection(urlString, "PUT");
+        conn.setDoOutput(true);
+        conn.setUseCaches(false);
+
+        conn.setChunkedStreamingMode(ChunkSize);
+        conn.setRequestMethod(httpMethod);
+        conn.setRequestProperty("Connection", "Keep-Alive");
+        String contentType = "application/octet-stream";
+        conn.setRequestProperty("Content-Type", contentType);
+        conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length()));
+        connectWithRetry(conn);
         OutputStream out = null;
         InputStream in = null;
         BufferedReader br = null;
 
         try {
             out = conn.getOutputStream();
-            in = new FileInputStream(localFile);
+            in = new FileInputStream(localFileName);
             byte[] buf = new byte[ChunkSize];
             int len = 0;
             while ((len = in.read(buf)) > 0) {
                 out.write(buf, 0, len);
             }
             out.flush();
-
-            br = new BufferedReader(new InputStreamReader(conn.getInputStream(), getCharSetFromConnection(conn)));
-            String line;
-            while ((line = br.readLine()) != null) {
-                if (s_logger.isTraceEnabled())
-                    s_logger.trace("Upload " + urlString + " response: " + line);
-            }
         } finally {
             if (in != null)
                 in.close();
@@ -374,6 +402,7 @@
 
             if (br != null)
                 br.close();
+            conn.disconnect();
         }
     }
 
@@ -398,8 +427,14 @@
 
         conn.setChunkedStreamingMode(ChunkSize);
         conn.setRequestMethod(httpMethod);
+        if (urlString.endsWith(".iso")) {
+            conn.setRequestProperty("Overwrite", "t");
+        }
         conn.setRequestProperty("Connection", "Keep-Alive");
-        conn.setRequestProperty("Content-Type", "application/x-vnd.vmware-streamVmdk");
+        String contentType = urlString.endsWith(".iso") ?
+                "application/octet-stream" :
+                "application/x-vnd.vmware-streamVmdk";
+        conn.setRequestProperty("Content-Type", contentType);
         conn.setRequestProperty("Content-Length", Long.toString(new File(localFileName).length()));
         connectWithRetry(conn);
 
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 3d209fb..424027b 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
@@ -25,6 +25,7 @@
 import java.io.StringWriter;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.List;
@@ -75,7 +76,9 @@
 import com.vmware.vim25.VirtualVmxnet3;
 
 import com.cloud.hypervisor.vmware.mo.DiskControllerType;
+import com.cloud.hypervisor.vmware.mo.DatastoreMO;
 import com.cloud.hypervisor.vmware.mo.HostMO;
+import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
 import com.cloud.hypervisor.vmware.mo.LicenseAssignmentManagerMO;
 import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
 import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
@@ -91,11 +94,14 @@
     public static final int MAX_SCSI_CONTROLLER_COUNT = 4;
     public static final int MAX_IDE_CONTROLLER_COUNT = 2;
     public static final int MAX_ALLOWED_DEVICES_IDE_CONTROLLER = 2;
-    public static final int MAX_ALLOWED_DEVICES_SCSI_CONTROLLER = 15;
+    public static final int MAX_ALLOWED_DEVICES_SCSI_CONTROLLER = 16;
+    public static final int MAX_SUPPORTED_DEVICES_SCSI_CONTROLLER = MAX_ALLOWED_DEVICES_SCSI_CONTROLLER - 1; // One device node is unavailable for hard disks or SCSI devices
+    public static final int MAX_USABLE_SCSI_CONTROLLERS = 2;
     public static final String MIN_VERSION_UEFI_LEGACY = "5.5";
 
     public static boolean isReservedScsiDeviceNumber(int deviceNumber) {
-        return deviceNumber == 7;
+        // The SCSI controller is assigned to virtual device node (z:7), so that device node is unavailable for hard disks or SCSI devices.
+        return (deviceNumber % VmwareHelper.MAX_ALLOWED_DEVICES_SCSI_CONTROLLER) == 7;
     }
 
     @Nonnull
@@ -209,35 +215,46 @@
     }
 
     // vmdkDatastorePath: [datastore name] vmdkFilePath
-    public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, String vmdkDatastorePath, int sizeInMb, ManagedObjectReference morDs,
-            int deviceNumber, int contextNumber) throws Exception {
+    public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, VirtualDisk device, int controllerKey, String vmdkDatastorePathChain[],
+                                                  ManagedObjectReference morDs, int deviceNumber, int contextNumber) throws Exception {
 
-        VirtualDisk disk = new VirtualDisk();
+        assert (vmdkDatastorePathChain != null);
+        assert (vmdkDatastorePathChain.length >= 1);
 
-        VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo();
-        backingInfo.setDiskMode(VirtualDiskMode.PERSISTENT.value());
-        backingInfo.setThinProvisioned(true);
-        backingInfo.setEagerlyScrub(false);
-        backingInfo.setDatastore(morDs);
-        backingInfo.setFileName(vmdkDatastorePath);
-        disk.setBacking(backingInfo);
+        VirtualDisk disk;
+        VirtualDiskFlatVer2BackingInfo backingInfo;
+        if (device != null) {
+            disk = device;
+            backingInfo = (VirtualDiskFlatVer2BackingInfo)disk.getBacking();
+        } else {
+            disk = new VirtualDisk();
+            backingInfo = new VirtualDiskFlatVer2BackingInfo();
+            backingInfo.setDatastore(morDs);
+            backingInfo.setDiskMode(VirtualDiskMode.PERSISTENT.value());
+            disk.setBacking(backingInfo);
 
-        int ideControllerKey = vmMo.getIDEDeviceControllerKey();
-        if (controllerKey < 0)
-            controllerKey = ideControllerKey;
-        if (deviceNumber < 0) {
-            deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
+            int ideControllerKey = vmMo.getIDEDeviceControllerKey();
+            if (controllerKey < 0)
+                controllerKey = ideControllerKey;
+            if (deviceNumber < 0) {
+                deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
+            }
+
+            disk.setControllerKey(controllerKey);
+            disk.setKey(-contextNumber);
+            disk.setUnitNumber(deviceNumber);
+
+            VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
+            connectInfo.setConnected(true);
+            connectInfo.setStartConnected(true);
+            disk.setConnectable(connectInfo);
         }
-        disk.setControllerKey(controllerKey);
 
-        disk.setKey(-contextNumber);
-        disk.setUnitNumber(deviceNumber);
-        disk.setCapacityInKB(sizeInMb * 1024);
-
-        VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
-        connectInfo.setConnected(true);
-        connectInfo.setStartConnected(true);
-        disk.setConnectable(connectInfo);
+        backingInfo.setFileName(vmdkDatastorePathChain[0]);
+        if (vmdkDatastorePathChain.length > 1) {
+            String[] parentDisks = Arrays.copyOfRange(vmdkDatastorePathChain, 1, vmdkDatastorePathChain.length);
+            setParentBackingInfo(backingInfo, morDs, parentDisks);
+        }
 
         return disk;
     }
@@ -311,96 +328,6 @@
         return disk;
     }
 
-    // vmdkDatastorePath: [datastore name] vmdkFilePath
-    public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, VirtualDisk device, int controllerKey, String vmdkDatastorePathChain[],
-            ManagedObjectReference morDs, int deviceNumber, int contextNumber) throws Exception {
-
-        assert (vmdkDatastorePathChain != null);
-        assert (vmdkDatastorePathChain.length >= 1);
-
-        VirtualDisk disk;
-        VirtualDiskFlatVer2BackingInfo backingInfo;
-        if (device != null) {
-            disk = device;
-            backingInfo = (VirtualDiskFlatVer2BackingInfo)disk.getBacking();
-        } else {
-            disk = new VirtualDisk();
-            backingInfo = new VirtualDiskFlatVer2BackingInfo();
-            backingInfo.setDatastore(morDs);
-            backingInfo.setDiskMode(VirtualDiskMode.PERSISTENT.value());
-            disk.setBacking(backingInfo);
-
-            int ideControllerKey = vmMo.getIDEDeviceControllerKey();
-            if (controllerKey < 0)
-                controllerKey = ideControllerKey;
-            if (deviceNumber < 0) {
-                deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
-            }
-
-            disk.setControllerKey(controllerKey);
-            disk.setKey(-contextNumber);
-            disk.setUnitNumber(deviceNumber);
-
-            VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
-            connectInfo.setConnected(true);
-            connectInfo.setStartConnected(true);
-            disk.setConnectable(connectInfo);
-        }
-
-        backingInfo.setFileName(vmdkDatastorePathChain[0]);
-        if (vmdkDatastorePathChain.length > 1) {
-            String[] parentDisks = new String[vmdkDatastorePathChain.length - 1];
-            for (int i = 0; i < vmdkDatastorePathChain.length - 1; i++)
-                parentDisks[i] = vmdkDatastorePathChain[i + 1];
-
-            setParentBackingInfo(backingInfo, morDs, parentDisks);
-        }
-
-        return disk;
-    }
-
-    @SuppressWarnings("unchecked")
-    public static VirtualDevice prepareDiskDevice(VirtualMachineMO vmMo, int controllerKey, Pair<String, ManagedObjectReference>[] vmdkDatastorePathChain,
-            int deviceNumber, int contextNumber) throws Exception {
-
-        assert (vmdkDatastorePathChain != null);
-        assert (vmdkDatastorePathChain.length >= 1);
-
-        VirtualDisk disk = new VirtualDisk();
-
-        VirtualDiskFlatVer2BackingInfo backingInfo = new VirtualDiskFlatVer2BackingInfo();
-        backingInfo.setDatastore(vmdkDatastorePathChain[0].second());
-        backingInfo.setFileName(vmdkDatastorePathChain[0].first());
-        backingInfo.setDiskMode(VirtualDiskMode.PERSISTENT.value());
-        if (vmdkDatastorePathChain.length > 1) {
-            Pair<String, ManagedObjectReference>[] parentDisks = new Pair[vmdkDatastorePathChain.length - 1];
-            for (int i = 0; i < vmdkDatastorePathChain.length - 1; i++)
-                parentDisks[i] = vmdkDatastorePathChain[i + 1];
-
-            setParentBackingInfo(backingInfo, parentDisks);
-        }
-
-        disk.setBacking(backingInfo);
-
-        int ideControllerKey = vmMo.getIDEDeviceControllerKey();
-        if (controllerKey < 0)
-            controllerKey = ideControllerKey;
-        if (deviceNumber < 0) {
-            deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
-        }
-
-        disk.setControllerKey(controllerKey);
-        disk.setKey(-contextNumber);
-        disk.setUnitNumber(deviceNumber);
-
-        VirtualDeviceConnectInfo connectInfo = new VirtualDeviceConnectInfo();
-        connectInfo.setConnected(true);
-        connectInfo.setStartConnected(true);
-        disk.setConnectable(connectInfo);
-
-        return disk;
-    }
-
     private static void setParentBackingInfo(VirtualDiskFlatVer2BackingInfo backingInfo, ManagedObjectReference morDs, String[] parentDatastorePathList) {
 
         VirtualDiskFlatVer2BackingInfo parentBacking = new VirtualDiskFlatVer2BackingInfo();
@@ -607,7 +534,7 @@
     }
 
     public static void setBasicVmConfig(VirtualMachineConfigSpec vmConfig, int cpuCount, int cpuSpeedMHz, int cpuReservedMhz, int memoryMB, int memoryReserveMB,
-            String guestOsIdentifier, boolean limitCpuUse) {
+                                        String guestOsIdentifier, boolean limitCpuUse, boolean deployAsIs) {
 
         // VM config basics
         vmConfig.setMemoryMB((long)memoryMB);
@@ -633,7 +560,11 @@
         memInfo.setReservation((long)memoryReserveMB);
         vmConfig.setMemoryAllocation(memInfo);
 
-        vmConfig.setGuestId(guestOsIdentifier);
+        if (!deployAsIs) {
+            // Deploy as-is uses the cloned VM guest OS
+            vmConfig.setGuestId(guestOsIdentifier);
+        }
+
     }
 
     public static VirtualDevice prepareUSBControllerDevice() {
@@ -767,9 +698,13 @@
         return hotplugSupportedByLicense;
     }
 
-    public static String getVCenterSafeUuid() {
+    public static String getVCenterSafeUuid(DatastoreMO dsMo) throws Exception{
         // Object name that is greater than 32 is not safe in vCenter
-        return UUID.randomUUID().toString().replaceAll("-", "");
+        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+        if (dsMo.getDatastoreType().equalsIgnoreCase("VVOL")) {
+            return CustomFieldConstants.CLOUD_UUID + "-" + uuid;
+        }
+        return uuid;
     }
 
     public static String getRecommendedDiskControllerFromDescriptor(GuestOsDescriptor guestOsDescriptor) throws Exception {
diff --git a/vmware-base/src/test/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelperTest.java b/vmware-base/src/test/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelperTest.java
index 545104d..9fd31ec 100644
--- a/vmware-base/src/test/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelperTest.java
+++ b/vmware-base/src/test/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelperTest.java
@@ -23,6 +23,8 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.never;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -39,6 +41,9 @@
 import com.cloud.offering.NetworkOffering;
 import com.vmware.vim25.AboutInfo;
 import com.vmware.vim25.BoolPolicy;
+import com.vmware.vim25.ClusterConfigInfoEx;
+import com.vmware.vim25.DatacenterConfigInfo;
+import com.vmware.vim25.VirtualMachineConfigSpec;
 import com.vmware.vim25.DVPortgroupConfigInfo;
 import com.vmware.vim25.DVPortgroupConfigSpec;
 import com.vmware.vim25.DVSSecurityPolicy;
@@ -62,6 +67,16 @@
     ServiceContent serviceContent;
     @Mock
     AboutInfo aboutInfo;
+    @Mock
+    private VirtualMachineConfigSpec vmSpec;
+    @Mock
+    private ClusterMO clusterMO;
+    @Mock
+    private DatacenterMO datacenterMO;
+    @Mock
+    private ClusterConfigInfoEx clusterConfigInfo;
+    @Mock
+    private DatacenterConfigInfo datacenterConfigInfo;
 
     String vSwitchName;
     Integer networkRateMbps;
@@ -70,10 +85,12 @@
     String svlanId = null;
 
     @Before
-    public void setup() {
+    public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
         when(context.getServiceContent()).thenReturn(serviceContent);
         when(serviceContent.getAbout()).thenReturn(aboutInfo);
+        when(clusterMO.getClusterConfigInfo()).thenReturn(clusterConfigInfo);
+        when(datacenterMO.getDatacenterConfigInfo()).thenReturn(datacenterConfigInfo);
     }
 
     @BeforeClass
@@ -531,7 +548,7 @@
     public void testGetPublicNetworkNamePrefixTaggedVlan() throws Exception {
         vlanId = "1234";
         String publicNetworkPrefix = HypervisorHostHelper.getPublicNetworkNamePrefix(vlanId);
-        assertEquals("cloud.public.1234", publicNetworkPrefix);
+        assertEquals("cloud.public.1234.", publicNetworkPrefix);
     }
 
     @Test
@@ -883,4 +900,29 @@
         assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getStart() == 0);
         assertTrue(((VmwareDistributedVirtualSwitchTrunkVlanSpec) spec).getVlanId().get(0).getEnd() == 0);
     }
+
+    @Test
+    public void testSetVMHardwareVersionClusterLevel() throws Exception {
+        when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-11");
+        when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-9");
+        HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
+        verify(vmSpec).setVersion("vmx-11");
+        verify(vmSpec, never()).setVersion("vmx-9");
+    }
+
+    @Test
+    public void testSetVMHardwareVersionDatacenterLevel() throws Exception {
+        when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
+        when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn("vmx-9");
+        HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
+        verify(vmSpec).setVersion("vmx-9");
+    }
+
+    @Test
+    public void testSetVMHardwareVersionUnset() throws Exception {
+        when(clusterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
+        when(datacenterConfigInfo.getDefaultHardwareVersionKey()).thenReturn(null);
+        HypervisorHostHelper.setVMHardwareVersion(vmSpec, clusterMO, datacenterMO);
+        verify(vmSpec, never()).setVersion(any());
+    }
 }